在上一節完成鏈碼部署後,就可以與鏈碼進行通信互動了。互動有多種方式,如通過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,否則追究其法律責任