在上一节完成链码部署后,就可以与链码进行通信互动了。互动有多种方式,如通过SDK编程,也可以使用peer节点使用命令行操作完成。本节先使用后者实现
通过区块链服务网络开发者手册可知,BSN提供的预置链码包提供了五个方法,我们逐一来操作处理
输入参数说明
baseKey
:需要保存的唯一的主键标识baseValue
:保存的数据信息
例:{"baseKey":"str","baseValue":"this is string"}
其中 baseKey
是不能为空的字符串,baseValue 可以是任意类型的数据。如果 baseKey
已经存在,则直接返回已经存在,不能添加;如果不存在,则添加数据。
输入参数说明
baseKey
:需要获取的唯一的主键标识的值
例:str
其中 baseKey
的值不能为空,且必须存在,否则将无法获取到相应的信息。
输入参数说明
baseKey
:需要修改的唯一的主键标识baseValue
:保存的数据信息
例:{"baseKey":"str","baseValue":"this is string"}
其中 baseKey
是不能为空的字符串,baseValue
可以是任意类型的数据。如果 baseKey
不存在,则无法更新,如果已经存在,则修改数据。
输入参数说明
baseKey
:需要获取的唯一的主键标识的值
例:str
其中 baseKey
的值不能为空。响应结果:交易 Id(txId)、交易时间(txTime)、是否删除(isDelete)、交易信息(dataInfo)。
输入参数说明
baseKey
:需要删除的唯一的主键标识的值
例:str
其中 baseKey
的值不能为空,且必须存在,否则将无法删除。
按BSN官方给的手册,如果直接在命令里使用-c '{"Args":["set",{"baseKey":"str","baseValue":"this is string"}]}'
的话,系统会报这个错误:Error: chaincode argument error: json: cannot unmarshal object into Go struct field .Args of type string
,这是因为Fabric底层是使用golang语言开发,传的参数不能是对象,只能是字符串的格式,如'{"Args":["A","B","C"]}'
这样的方式传参数,因此需要把BSN要求的对象参数当作字符串传递。正确的格式如下:
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin --peerAddresses localhost:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses localhost:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"Args":["set","{\"baseKey\":\"test\",\"baseValue\":\"xiaowei\"}"]}'
由于我们的背书策略是需要两个组织的节点都同意才能执行invoke
,因此需要把两个组织的peer节点连接信息也加上。
上面命令是在测试网络中增加一个key值为test,值为xiaowei的键值对
我们来验证下上一步的设置是否成功,就需要使用get方法查询test这个key键值对应的值是否为xiaowei
peer chaincode query -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin -c '{"Args":["get","test"]}'
注意这里-c '{"Args":["get","test"]}'
,get方法是直接能参数名,不需要像set那样"{\"baseKey\":\"test\"}"
传参,这个也困扰了我蛮长时间
如果你也像我这样报以下错误
$ peer chaincode query -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin -c '{"Args":["get","{\"baseKey\":\"test\"}"]}'
Error: endorsement failure during query. response: status:500 message:"error in simulation: transaction returned with failure: \344\277\241\346\201\257\344\270\215\345\255\230\345\234\250"
等等,这\344\277\241\346\201\257\344\270\215\345\255\230\345\234\250
是什么鬼?网络上搜索得知它是八进制字符串,对应的中文要转换下。网上给的方案大多是执行git config --global core.quotepath false
这个命令让git bash支持中文输出,但我这里一直不行,其它设置方法也不行,只能自己写个页面,使用JS进行转换,网址是:
https://www.bctos.cn/home/index/tool
直接复制进去就可以看到中文,方便多了
命令基本同set方法,在这里我们把test的值由xiaowei修改为123456
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin --peerAddresses localhost:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses localhost:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"Args":["update","{\"baseKey\":\"test\",\"baseValue\":\"123456\"}"]}'
看到SUCCESS字样就代表修改成功了
查询看看更新的效果
peer chaincode query -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin -c '{"Args":["get","test"]}'
peer chaincode query -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin -c '{"Args":["getHistory","test"]}'
我们可以看到之前的增加修改记录都在
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls true --cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin --peerAddresses localhost:7051 --tlsRootCertFiles $PEER0_ORG1_CA --peerAddresses localhost:9051 --tlsRootCertFiles $PEER0_ORG2_CA -c '{"Args":["delete","test"]}'
删除数据后,通过getHistory还能看到全部的数据,但get方法就会得不到数据了
本文由小韦云原创,转载请注明出处:https://www.bctos.cn/doc/10/1846,否则追究其法律责任