• 链码示例一:信息公证
    • 简介
    • 主要函数
    • 代码运行分析
    • 通过 REST API 操作智能合约

    链码示例一:信息公证

    简介

    chaincode_example01.go 主要实现如下的功能:

    • 初始化,以键值形式存放信息;
    • 允许读取和修改键值。

    代码中,首先初始化了 hello_world 的值,并根据请求中的参数创建修改查询链上 key 中的值,本质上实现了一个简单的可修改的键值数据库。

    主要函数

    • read:读取key args[0] 的 value;
    • write:创建或修改 key args[0] 的 value;
    • init:初始化 key hello_world 的 value;
    • invoke:根据传递参数类型调用执行相应的 initwrite 函数;
    • query:调用 read 函数查询 args[0] 的 value。

    代码运行分析

    main 函数作为程序的入口,调用 shim 包的 start 函数,启动 chaincode 引导程序的入口节点。如果报错,则返回。

    1. func main() {
    2. err := shim.Start(new(SimpleChaincode))
    3. if err != nil {
    4. fmt.Printf("Error starting Simple chaincode: %s", err)
    5. }
    6. }

    当智能合约部署在区块链上,可以通过 rest api 进行交互。

    三个主要的函数是 initinvokequery。在三个函数中,通过 stub.PutStatestub.GetState 存储访问 ledger 上的键值对。

    通过 REST API 操作智能合约

    假设以 jim 身份登录 pbft 集群,请求部署该 chaincode 的 json 请求格式为:

    1. {
    2. "jsonrpc": "2.0",
    3. "method": "deploy",
    4. "params": {
    5. "type": 1,
    6. "chaincodeID": {
    7. "path": "https://github.com/ibm-blockchain/learn-chaincode/finished"
    8. },
    9. "ctorMsg": {
    10. "function": "init",
    11. "args": [
    12. "hi there"
    13. ]
    14. },
    15. "secureContext": "jim"
    16. },
    17. "id": 1
    18. }

    目前 path 仅支持 github 上的目录,ctorMsg 中为函数 init 的传参。

    调用 invoke 函数的 json 格式为:

    1. {
    2. "jsonrpc": "2.0",
    3. "method": "invoke",
    4. "params": {
    5. "type": 1,
    6. "chaincodeID": {
    7. "name": "4251b5512bad70bcd0947809b163bbc8398924b29d4a37554f2dc2b033617c19cc0611365eb4322cf309b9a5a78a5dba8a5a09baa110ed2d8aeee186c6e94431"
    8. },
    9. "ctorMsg": {
    10. "function": "init",
    11. "args": [
    12. "swb"
    13. ]
    14. },
    15. "secureContext": "jim"
    16. },
    17. "id": 2
    18. }

    其中 name 字段为 deploy 后返回的 message 字段中的字符串。

    query 的接口也是类似的。