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)
    }
}