内容简介:比原项目仓库:Github地址:Gitee地址:
比原项目仓库:
Github地址: https://github.com/Bytom/bytom
Gitee地址: https://gitee.com/BytomBlockchain/bytom
用比原链(Bytom)实现信息上链
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。
那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。
请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。
- 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档: https://docs.bytom.io/mydoc_build_environment.cn.html
- 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:
http://test.blockmeta.com/faucet.php
- 发行自己的资产,参考: http://8btc.com/forum.php?mod=viewthread&tid=242940&extra=
- 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:
请求build-transaction接口:
avatar
请求参数:
{ "base_transaction": null, "actions": [{ "account_id": "0KTCS3R5G0A02", "amount": 10000000, "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "type": "spend_account" }, { "account_id": "0KTCS3R5G0A02", "amount": 100, "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd", "type": "spend_account" }, { "account_id": "0KTCS3R5G0A02", "amount": 100, "asset_id": "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd", "arbitrary": "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c", "type": "retire" }], "ttl": 0, "time_range": 1521625823 }
请求sign-transaction接口:
avatar
请求参数:
{ "password": "huangxinglong123", "transaction": { "allow_additional_actions": false, "local": true, "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c0101000161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b010003013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00", "signing_instructions": [{ "position": 0, "witness_components": [{ "keys": [{ "derivation_path": [ "0000002c", "00000099", "0100000000000000", "0100000000000000", "4600000000000000" ], "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f" }], "quorum": 1, "signatures": null, "type": "raw_tx_signature" }, { "type": "data", "value": "4f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a" }] }, { "position": 1, "witness_components": [{ "keys": [{ "derivation_path": [ "0000002c", "00000099", "0100000000000000", "0100000000000000", "4700000000000000" ], "xpub": "1c03161a08a4dbb7df153815a28f733fec1ac7579f954c4834e5ce9f0ad8deb260ecb2066a8623b69aa936f5798f4dcb9572bc476f2c8171953ce054d58a759f" }], "quorum": 1, "signatures": null, "type": "raw_tx_signature" }, { "type": "data", "value": "67512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa" }] }] } }
请求submit-transaction接口:
avatar
请求参数:
{ "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00" }
响应参数:
{ "status": "success", "data": { "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc" } }
用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据
avatar
参考代码:
package main import ( "bytes" "encoding/json" "fmt" "io/ioutil" "net/http" ) //build-transaction params //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction type BytomAccount struct { AccountId string `json:"account_id"` Amount int `json:"amount"` AssetId string `json:"asset_id"` //Arbitrary string `json:"arbitrary"` Type string `json:"type"` } type BytomAccount1 struct { AccountId string `json:"account_id"` Amount int `json:"amount"` AssetId string `json:"asset_id"` Arbitrary string `json:"arbitrary"` Type string `json:"type"` } type BaseTransaction struct{} type TransactionParams struct { BaseTransaction *BaseTransaction `json:"base_transaction"` Actions []interface{} `json:"actions"` Ttl int `json:"ttl"` TimeRange int `json:"time_range"` } //sign-transaction params //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction type Transaction struct { } type SignParams struct { Password string `json:"password"` Transaction Transaction `json:"transaction"` } //submit-transaction //https://bytom.github.io/mydoc_RPC_call.cn.html#build-transaction type SubmitParams struct { RawTransaction string `json:"raw_transaction"` } type SubmitResponse struct { TxId string `json:"tx_id"` } func main() { account1, account2, account3 := BytomAccount{}, BytomAccount{}, BytomAccount1{} account1.AccountId = "0KTCS3R5G0A02" account1.Amount = 10000000 account1.AssetId = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" account1.Type = "spend_account" account2.AccountId = "0KTCS3R5G0A02" account2.Amount = 100 account2.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd" account2.Type = "spend_account" account3.AccountId = "0KTCS3R5G0A02" account3.Amount = 100 account3.AssetId = "608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd" account3.Arbitrary = "77656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c" account3.Type = "retire" //var array var actions []interface{} //append three params array_actions := append(actions, account1, account2, account3) transaction_params := &TransactionParams{} transaction_params.Actions = array_actions transaction_params.Ttl = 0 transaction_params.TimeRange = 1521625823 //本地测试网节点 //build-transaction port := "http://127.0.0.1:9888/build-transaction" value, err := SendTransactionRetire(transaction_params, port) if err != nil { fmt.Println("err:", err) } fmt.Println("build-transaction接口返回的参数:", value) //sign-transaction //........... //submit-transaction //........... } //send post request func SendTransactionRetire(params *TransactionParams, port string) (v interface{}, err error) { //以本地测试网节点连接 ParamsStr, err := json.Marshal(params) if err != nil { return nil, err } jsonStr := bytes.NewBuffer(ParamsStr) fmt.Println(jsonStr) req, err := http.NewRequest("POST", port, jsonStr) req.Header.Set("Content-Type", "application/json") req.Header.Add("Accept", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { panic(err) } defer resp.Body.Close() var bodyBytes []byte if resp.StatusCode == 200 { bodyBytes, err = ioutil.ReadAll(resp.Body) if err != nil { return nil, err } } return string(bodyBytes), nil }
上面的代码只是build-transaction一个步骤,另外sign-transaction和submit-transaction请求需要自己去组织参数进行请求。请求完submit-transaction 获得返回的交易hash,去区块链浏览器上查看自己的上链信息,区块链浏览器地址:http://52.82.46.157:8082/。
好了,通过以上的4个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们, https://github.com/Bytom/bytom 。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 资产上链:价值交换新时代 | 哈希未来
- 上链(SimpleChain)技术社区激励计划:Bug Bounty
- 打点 API 和 bitsv 对数据上链的不同处理
- 巴比特专栏 | 一个奇怪的角度解释什么叫做资产上链
- 立体字母建模教程【C4D教程】
- PS学习教程 PS制作字体发光效果教程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。