與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,否則追究其法律責任

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章