Go开发组件
Go版本Chain Connector使用说明
Git库地址:https://github.com/taiyi-io/chain-connector-go
用于访问和操作链平台的Go语言SDK,要求go 18以上版本。
项目
编译
$go build
运行测试用例
运行测试前,先将平台分配的私钥数据保存在"access_key.json"中,然后配置"test.json"的参数host和port设定好到网关的连接信息。
$go test
使用范例
连接链平台
首先使用平台分配的私钥数据构建Connector,然后连接链平台的gateway模块。
var access PrivateAccessPayload
//load access from file
//....
//create connector
var conn *ChainConnector
if conn, err = NewConnectorFromAccess(access.PrivateData); err != nil {
err = fmt.Errorf("create connector fail: %s", err.Error())
return
}
//connect to gateway
_, err = conn.Connect(gatewayHost, gatewayPort)
构建与管理数字资产
首先为数字资产定义数据范式(Schema),然后就能够基于该Schema添加、修改、删除和查询数字资产(Document)。所有变更痕迹自动使用区块链技术持久化存储,并且能够通过getSchemaLog和getDocumentLog接口查询。
//create new schema
var schemaName = "sample"
var properties = []DocumentProperty{
{
Name: "name",
Type: PropertyTypeString,
},
{
Name: "age",
Type: PropertyTypeInteger,
},
{
Name: "available",
Type: PropertyTypeBoolean,
},
}
err = conn.CreateSchema(schemaName, properties)
var schema DocumentSchema
schema, err = conn.GetSchema(schemaName)
//add a document
var content = "{\"name\": \"hello\", \"age\": 20, \"available\": true}"
var docID string
docID, err = conn.AddDocument(schemaName, "", content);
//check a document
var exists bool
exists, err = conn.HasDocument(schemaName, docID)
if (exists){
//update a existed document
var updatedContent = "{\"name\": \"alice\", \"age\": 18, \"available\": false}"
err = conn.UpdateDocument(schemaName, docID, updatedContent)
}
//get change trace of a document
var version uint64
var logs []TraceLog
version, logs, err = conn.GetDocumentLog(schemaName, docID)
//query documents
var condition = new(QueryCondition)
.AscendBy("name")
.MaxRecord(20)
.SetOffset(0)
var docs []Document
var limit, offset, total int
docs, limit, offset, total, err = conn.QueryDocuments(schemaName, *condition)
//remove document
err = conn.RemoveDocument(schemaName, docID)
部署和调用智能合约
部署智能合约时,需要设定合约名称和执行步骤。调用时,指定合约名称和调用参数就可以启动执行。系统允许打开追踪开关,查看合约执行计划和实际运行情况。
const contractName = "contract_create"
var contractDefine = ContractDefine{
steps: [
{
action: "create_doc",
params: ["$s", "@1", "@2"],
},
{
action: "set_property",
params: ["$s", "catalog", "@3"],
},
{
action: "set_property",
params: ["$s", "balance", "@4"],
},
{
action: "set_property",
params: ["$s", "number", "@5"],
},
{
action: "set_property",
params: ["$s", "available", "@6"],
},
{
action: "set_property",
params: ["$s", "weight", "@7"],
},
{
action: "update_doc",
params: ["@1", "$s"],
},
{
action: "submit",
},
],
}
//check existed contract
var exists bool
exists, err = conn.HasContract(contractName)
if (exists)) {
//withdraw existed contract
err = conn.WithdrawContract(contractName)
log.printf("previous contract %s removed\n", contractName)
}
//deploy contact
err = conn.DeployContract(contractName, contractDefine)
//enable trace option
var info ContractInfo
info, err = conn.GetContractInfo(createContractName)
if !info.Trace {
err = conn.EnableContractTrace(contractName)
}
var docID = "contract-doc"
var parameters = []string {
schemaName,
docID,
schemaName,
fmt.Sprintf("%f", r.Float64()),
fmt.Sprintf("%d", r.Int()),
fmt.Sprintf("%t", 1 == r.Intn(10)%2),
fmt.Sprintf("%f", r.Float64())
}
//call contract with parameters
err = conn.CallContract(contractName, parameters)
检查区块链与交易
通过SDK能够获取并检查链、区块、交易的全部详细信息,用于审计数据安全性和检查后台运行情况。
//check chain status
var world, height uint64
var previousBlock, genesisBlock, allocatedID string
world, heigh, previousBlock, genesisBlock, allocatedID, err = conn.GetStatus()
//query blocks from height 1 to 10
var idList []string
var currentHeight uint64
idList, currentHeight, err = conn.QueryBlocks(1, 10)
for _, blockID := range idList {
//get block data
var blockData BlockData
blockData, err = conn.GetBlock(blockID)
//query transactions in a block
var transList []string
var offset, limit, total int
transList, offset, limit, total, err = conn.QueryTransactions(blockID, 0, 20)
for _, transID := range transList {
//get transaction data
var transactionData TransactionData
transactionData, err = conn.GetTransaction(blockID, transID)
}
}