Hi Guest

More contents, please log on!

Bitmere.com 区块链技术 Content

用比原链(Bytom)实现信息上链

wzls3146
25 0 0
很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目,信息上链不是比原链核心能力,所以并没有在钱包端做一个功能入口,但是比原链提供了相关的接口可以将一些信息写到链上去。
那如何实现信息上链呢?使用特殊的Retire操作,这个操作可以进行销毁资产的操作,但因为其可以附带信息,所以就可以实现信息上链的功能。
请往下看,也用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。
  • 首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://docs.bytom.io/mydoc_build_environment.cn.html
  • 确保自己账户是有足够BTM测试币,如果没有可以去比原链水龙头领取BTM测试币,领取地址:

    http://test.blockmeta.com/faucet.php
  • 发行自己的资产,参考:https://bbs.8btc.com/forum.php?mod=viewthread&tid=242940&extra=
  • 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过api发起交易主要有三个步骤,先 build → sign → submit,分别对应的api是 build-transaction、sign-transaction、submit-transaction。用postman请求过程如下:

    请求build-transaction接口:

    请求参数:
    {
    "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接口:

    请求参数:
    {
    "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接口:

    请求参数:
    {
    "raw_transaction": "0701dfd5c8d505020160015e560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0989fe3020001160014adb6632c5b10c6d5b6f97b8d1250f6e409e11c01630240c7004022db674ff2961b540d4edab846d550429ae9a92311ba375a4f452331422961fdcde3bf79631755dd12df409e24a849158d4aeab919cab81520fb7d1e02204f089176a5bca95ec9227b8a87dfec947c59453805bf46d3f5a18f8032255b5a0161015f560352e415b41be7648b2241ffdabf56259bc618525f62ac123dce32002110f0608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd9cc5b191f3190101160014dcfd9b78c24260823e318153665d511d6c4ecb1b6302406b75ef5a9decfa31d4f5ae06e0fb14ca507ba4a03715874d1d831516945121573b9b858e4d7527d209c1f89f74e0aa4c4e38afd098cbadaff31b9107167099012067512f9250f559699e32c72c8af29096b1556af145f6ecc0c306e6acc88bbfaa03013dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0ebbcde02011600147a9baebd37dba3f14960624ed8e6ca3cc9d5f73800013e608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cdb8c4b191f31901160014f0370fdf7a7bec7b34cc62fd5291071a3dc3d9b0000147608037f96e8d1613d900c67a0730cc90e2a03311fb7d091588f7eb551a6103cd6401246a2277656c636f6d65efbc8ce6aca2e8bf8ee69da5e588b0e58e9fe5ad90e4b896e7958c00"
      }
    响应参数:
    {
    "status": "success",
    "data": {
        "tx_id": "5ef27b930646d468bbb436d3406972ff201aa63702518f777e31dd6a2147dddc"
      }
    }

    用上面返回的tx_id去比原的浏览器中去查看交易详情,就可以查看到我们上传的数据

    参考代码:
    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。
  • BitMere.com is Information release platform,just provides information storage space services.
    The opinions expressed are solely those of the author,Does not constitute advice, please treat with caution.
    You have to log in before you can reply Login | 立即注册

    Points Rules

    Write the first review

    wzls3146 小学生
    • Follow

      0

    • Following

      0

    • Articles

      1

    Promoted