zoukankan      html  css  js  c++  java
  • Bytom信息上链教程

    比原项目仓库:

    Github地址:https://github.com/Bytom/bytom

    Gitee地址:https://gitee.com/BytomBlockchain/bytom

    很多了解比原链的都知道,比原链是专注信息和数字资产在链上交互和流转的公链项目。那如何实现信息上链呢?请往下看,我用postman请求演示,然后用golang写了一个接口的demo, 在用golang代码实现之前,我们先要做一些准备工作。首先确保自己在本地已经搭建好了比原的节点,如果你还没有搭建好节点,请参考开发文档:https://github.com/Bytom/bytom/blob/master/README.md

    step1:确保自己账户是有足够BTM的,如果没有可以去比原链水龙头领取BTM,领取地址:
    http://test.blockmeta.com/faucet.php

    step2:发行自己的资产,参考:http://8btc.com/forum.php?mod=viewthread&tid=242940&extra=

    step3: 信息上链的本质就是其实就是创建并发送一笔交易,我们都知道通过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个步骤,我们就可以借助比原链实现信息上链。如果你有什么疑问或者不明白,请在我们的社区联系我们。

  • 相关阅读:
    雷林鹏分享:Lua 运算符
    雷林鹏分享:PHP JSON
    不要提交代码到HEAD上
    Mr Cao 的提问
    使用masory
    git 下载单个文件 已经添加多个远程服务器
    自动生产jason的工具
    简单的应用可以用storyBoard
    《创业维艰》
    造成死锁的各种情况
  • 原文地址:https://www.cnblogs.com/bytom/p/9950731.html
Copyright © 2011-2022 走看看