链码示例一:信息公证

简介

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 的接口也是类似的。