您的位置 首页 golang

与BSN的链码进行通信互动

在上一节完成链码部署后,就可以与链码进行通信互动了。互动有多种方式,如通过SDK编程,也可以使用peer节点使用命令行操作完成。本节先使用后者实现

预置链码包介绍

通过区块链服务网络开发者手册可知,BSN提供的预置链码包提供了五个方法,我们逐一来操作处理

1、增加数据(set)

输入参数说明

baseKey:需要保存的唯一的主键标识

baseValue:保存的数据信息

例:{"baseKey":"str","baseValue":"this is string"}

其中 baseKey 是不能为空的字符串,baseValue 可以是任意类型的数据。如果 baseKey 已经存在,则直接返回已经存在,不能添加;如果不存在,则添加数据。

2、获取数据(get)

输入参数说明

baseKey:需要获取的唯一的主键标识的值

例:str

其中 baseKey 的值不能为空,且必须存在,否则将无法获取到相应的信息。

3、修改数据(update)

输入参数说明

baseKey:需要修改的唯一的主键标识

baseValue:保存的数据信息

例:{"baseKey":"str","baseValue":"this is string"}

其中 baseKey 是不能为空的字符串,baseValue 可以是任意类型的数据。如果 baseKey 不存在,则无法更新,如果已经存在,则修改数据。

4、获取历史记录数据(getHistory)

输入参数说明

baseKey:需要获取的唯一的主键标识的值

例:str

其中 baseKey 的值不能为空。响应结果:交易 Id(txId)、交易时间(txTime)、是否删除(isDelete)、交易信息(dataInfo)。

5、删除数据(delete)

输入参数说明

baseKey:需要删除的唯一的主键标识的值

例:str

其中 baseKey 的值不能为空,且必须存在,否则将无法删除。

实操入门

1、增加数据(set)

按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的键值对

2、获取数据(get)

我们来验证下上一步的设置是否成功,就需要使用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

直接复制进去就可以看到中文,方便多了

3、修改数据(update)

命令基本同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"]}'

4、获取历史记录数据(getHistory)

peer chaincode query -o localhost:7050 –ordererTLSHostnameOverride orderer.example.com –tls true –cafile $ORDERER_CA -C $CHANNEL_NAME -n clockin -c '{"Args":["getHistory","test"]}'

我们可以看到之前的增加修改记录都在

5、删除数据(delete)

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,否则追究其法律责任


文章来源:智云一二三科技

文章标题:与BSN的链码进行通信互动

文章地址:https://www.zhihuclub.com/1461.shtml

关于作者: 智云科技

热门文章

网站地图