Bytom信息上链教程

比原项目仓库:

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏猛牛哥的博客

门罗币新挖矿软件的使用方法

2.1K8
来自专栏区块链技术专栏

EOS 权限管理之-权限的使用 (你绝对找不到的干货)

相信看这篇教程的人,对我之前的一些账户操作已经进行了了解,如果不了解的,可以移步 https://eosfans.io/topics/372.

8403
来自专栏逸鹏说道

SQL Server 2017 安装过程中的一点说明(有点意思)

偶尔冒个泡吧 会提到:“安装程序无法与下载服务器联系。请提供 Microsoft 机器学习服务器安装文件的位置,然后单击“下一步”。可从以下位置下载安装文件” ...

5246
来自专栏Python、Flask、Django

关于Git克隆项目时密码输入错误导致一系列坑的解决方法

2284
来自专栏区块链入门

第二十三课 如何部署TRUFFLE智能合约到以太坊主网(以宠物商店为例)1,摘要2, 操作内容3,常见问题和解决方法4, 参考

通过《第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)》 学习,大家掌握了一个DAPP的编程和以太坊私有测试环境调试,本文做进一步的技术深入学习...

2084
来自专栏葡萄城控件技术团队

Asp.Net MVC4入门指南(7):给电影表和模型添加新字段

在本节中,您将使用Entity Framework Code First来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。 默认情况下,就像您在...

19910
来自专栏申龙斌的程序人生

比特币白皮书发布10周年,才活跃着这么几个节点

2008年10月31日,中本聪在一个邮件列表中首次发布了著名的比特币白皮书,今天正好是10周年纪念日。比特币网络是一个去中心化的网络,任何人用一台普通的电脑就可...

1112
来自专栏FreeBuf

看看影音恶意挖矿行为分析

近日,部分用户出现电脑GPU占用率高,电脑温度升高,风扇噪声增大等问题。具体现象为电脑中C盘可使用空间骤降,且在C盘Ethash文件夹内,发现存在大量的1G左右...

2488
来自专栏区块链

在Office 文档的属性中隐藏攻击载荷

Microsoft Office中的文档属性通常包含与文档和各种其他元数据详细信息相关的信息。但是,此位置可用于存储并执行SMB或HTTP服务器上托管的有效载荷...

20310
来自专栏区块链入门

第5课 EOS环境搭建入门(私链节点-钱包-密钥-账号)

【本文目标】 通过本文实践,能在已编译的EOS V1.0.5版本环境上,完成私链节点启动,钱包创建,密钥导入和账号创建等内容。 【前置条件】 你已完成了E...

4103

扫码关注云+社区

领取腾讯云代金券