目錄node
一.鏈碼概念git
1.基本概念github
Fabric的智能合約稱爲鏈碼(chaincode),分爲系統鏈碼和用戶鏈碼。系統鏈碼用來實現系統層面的功能,用戶鏈碼實現用戶的應用功能。鏈碼被編譯成一個獨立的應用程序,運行於隔離的Docker容器中。 docker
和以太坊相比,Fabric鏈碼和底層帳本是分開的,升級鏈碼時並不須要遷移帳本數據到新鏈碼當中,真正實現了邏輯與數據的分離,同時,鏈碼採用Go、Java、Nodejs語言編寫。c#
2.數據流向bash
Fabric鏈碼經過gprc與peer節點交互網絡
(1)當peer節點收到客戶端請求的輸入(propsal)後,會經過發送一個鏈碼消息對象(帶輸入信息,調用者信息)給對應的鏈碼。併發
(2)鏈碼調用ChaincodeBase裏面的invoke方法,經過發送獲取數據(getState)和寫入數據(putState)消息,向peer節點獲取帳本狀態信息和發送預提交狀態。tcp
(3)鏈碼發送最終輸出結果給peer節點,節點對輸入(propsal)和 輸出(propsalreponse)進行背書籤名,完成第一段簽名提交。分佈式
(4)以後客戶端收集全部peer節點的第一段提交信息,組裝事務(transaction)並簽名,發送事務到orderer節點排隊,最終orderer產生區塊,併發送到各個peer節點,把輸入和輸出落到帳本上,完成第二段提交過程。
3.鏈碼類型
3.1 用戶鏈碼
由應用開發人員使用Go( Java/JS)語言編寫基於區塊鏈分佈式帳本的狀態及處理邏輯,運行在鏈碼容器中, 經過Fabric提供的接口與帳本平臺進行交互
3.2系統鏈碼
負責Fabric節點自身的處理邏輯, 包括系統配置、背書、校驗等工做
系統鏈碼僅支持Go語言, 在Peer節點啓動時會自動完成註冊和部署
系統鏈碼共有五種類型
配置系統鏈碼(CSCC) Configuration System Chaincode
-- 負責帳本和鏈的配置管理
背書管理系統鏈碼(ESCC) Endorsement System Chaincode
-- 負責背書(簽名)過程, 並能夠支持對背書策略進行管理
生命週期系統鏈碼(LSCC) Lifecycle System Chaincode
-- 負責對用戶鏈碼的生命週期進行管理
-- 鏈碼生命週期包括安裝、部署、升級、權限管理、獲取信息等環節.
查詢系統鏈碼(QSCC) Query System Chaincode
-- 負責提供帳本和鏈的信息查詢功能
驗證系統鏈碼(VSCC) Verification System Chaincode
交易提交前根據背書策略進行檢查 驗證過程:
(1) 首先解析出交易結構, 並對交易結構格式進行校驗
(2) 檢查交易的讀集合中元素版本跟本地帳本中版本一致
(3) 檢查帶有合法的背書信息(主要是檢查簽名信息)
(4) 經過則返回正確, 不然返回錯誤消息
二.鏈碼操做
管理Chaincode的生命週期四個命令
安裝 install
實例化 instantiate
升級 upgrade
打包 package
簽名 signpackage
將來還會支持 stop 和 start 命令, 來禁用和從新啓用鏈代碼
鏈代碼成功安裝和實例化後,鏈代碼處於活動狀態(正在運行),可經過 invoke 命令調用處理事務
鏈代碼能夠在安裝後隨時升級
1.啓動開發模式
(1) 下載鏈碼API
go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim
參數說明:
go get: 根據要求和實際狀況從互聯網上下載或更新指定的代碼包及其依賴包,並進行編譯和安裝
-u: 利用網絡來更新已有代碼包及其依賴包。默認狀況下,該命令只會從網絡上下 載本地不存在的代碼包,而不會更新已有的代碼包
go build: 加上可編譯的go源文件能夠獲得一個可執行文件
(2) 進入開發模式
正常狀況下chaincode由對等體啓動和維護。然而,在「開發模式」下,鏈碼由用戶構建並啓動 ,前提保證前期經過docker-compose -f docker-compose-cli.yaml up -d建立的網絡處於關閉狀態
cd /home/bruce/hyfa/fabric-samples/chaincode-docker-devmode $ docker-compose -f docker-compose-simple.yaml up -d //啓動開發環境
查看啓動的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1bf418435b45 hyperledger/fabric-ccenv "/bin/bash -c 'sleep…" 6 seconds ago Up 4 seconds chaincode 96aa47625135 hyperledger/fabric-tools "/bin/bash -c ./scri…" 6 seconds ago Up 4 seconds cli e88a7faa98bc hyperledger/fabric-peer "peer node start --p…" 7 seconds ago Up 6 seconds 0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp peer e946e0472e7b hyperledger/fabric-orderer "orderer" 8 seconds ago Up 7 seconds 0.0.0.0:7050->7050/tcp orderer
2.啓動鏈碼
docker exec -it chaincode bash #進入chaincode容器
編譯鏈碼
root@1bf418435b45:/opt/gopath/src/chaincode# cd sacc/
root@1bf418435b45:/opt/gopath/src/chaincode/sacc# go build //編譯sacc.go
運行鏈碼
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=devcc1:0 ./sacc
-- 鏈碼名稱:devcc1
-- 鏈碼初始版本號: 0
3.安裝並實例化
$ docker exec -it cli bash #進入cli容器
安裝鏈碼
$ peer chaincode install -p chaincodedev/chaincode/sacc -n devcc1 -v 0
鏈碼實例化
$ peer chaincode instantiate -n devcc1 -v 0 -c '{"Args":["brucefeng","100"]}' -C myc
查詢bruce帳戶的餘額
peer chaincode query -n devcc1 -c '{"Args":["query","brucefeng"]}' -C myc
命令返回
2018-07-13 09:22:12.753 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACB070A6308031A0C08C4DEA1DA0510...71756572790A09627275636566656E67 2018-07-13 09:22:12.753 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: 3DBE7633D80A2F903926D8A72CDFF8F88594434892B661B2D0999A67F11571ED 100
調用鏈碼,修改帳戶餘額
$ peer chaincode invoke -n devcc1 -c '{"Args":["set","brucefeng","200"]}' -C myc
命令返回
2018-07-13 09:24:18.538 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 0a8 Chaincode invoke successful. result: status:200 payload:"200"
查詢最新餘額
peer chaincode query -n devcc1 -c '{"Args":["query","brucefeng"]}' -C myc
命令返回
2018-07-13 09:25:40.418 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACB070A6308031A0C0894E0A1DA0510...71756572790A09627275636566656E67 2018-07-13 09:25:40.418 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: EE8F9C3A592373E9DACB9BD69C08C46343A49EA3EA49DDD26545221642323C94 200
4.鏈碼打包與簽名
經過將鏈碼相關數據進行封裝, 能夠實現對其進行打包和簽名操做
鏈碼打包
peer chaincode package -n devcc1 -p chaincodedev/chaincode/sacc -v 0 -s -S -i "AND('OrgA.admin')" devcc1.out
參數說明:
-s: 建立角色支持的CC部署規範包, 而不是原始的CC部署規範
-S: 若是建立CC部署規範方案角色支持,也與本地MSP簽名
-i: 指定實例化策略
命令返回
2018-07-13 09:28:07.353 UTC [msp/identity] Sign -> DEBU 040 Sign: plaintext: 0A2E080112280A1B636861696E636F64...455254494649434154452D2D2D2D2D0A 2018-07-13 09:28:07.353 UTC [msp/identity] Sign -> DEBU 041 Sign: digest: 337C515704E41942E87B914B8C06C5D7AC17A0FC9C4F9CD01D8A76602A6D1680 2018-07-13 09:28:07.353 UTC [chaincodeCmd] chaincodePackage -> DEBU 042 Packaged chaincode into deployment spec of size <2209>, with args = [devcc1.out]
文件查看
root@96aa47625135:/opt/gopath/src/chaincodedev# ls -l devcc1.out -rwx------ 1 root root 2209 Jul 13 09:28 devcc1.out
對一個打包文件進行簽名操做(添加當前MSP簽名到簽名列表中)
peer chaincode signpackage devcc1.out signeddevcc1.out
命令返回
2018-07-13 09:36:07.115 UTC [msp/identity] Sign -> DEBU 037 Sign: plaintext: 0A2E080112280A1B636861696E636F64...455254494649434154452D2D2D2D2D0A 2018-07-13 09:36:07.115 UTC [msp/identity] Sign -> DEBU 038 Sign: digest: 337C515704E41942E87B914B8C06C5D7AC17A0FC9C4F9CD01D8A76602A6D1680 Wrote signed package to signeddevcc1.out successfully
5.升級鏈碼
參考2.啓動鏈碼的編譯鏈碼與啓動鏈碼
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=devcc1:1 ./sacc
-- 鏈碼版本號修改成: 1
從新安裝鏈碼(容器:cli)
$ peer chaincode install -p chaincodedev/chaincode/sacc -n devcc1 -v 1
注意版本號必須一致
在對某鏈碼代碼升級前, 推薦先將全部該鏈碼的容器中止, 並從Peer上備份並移除舊 鏈碼部署文件. 以後先在個別Peer節點上部署新鏈碼, 對原有數據進行測試, 成功後再在其它節點上進行升級操做
升級鏈碼(容器:cli)
$ peer chaincode upgrade -n devcc1 -v 1 -c '{"Args":["bruce", "800"]}' -C myc
命令返回
2018-07-13 09:47:12.397 UTC [msp/identity] Sign -> DEBU 0aa Sign: digest: 4D430EB0D48AD5235F21F39D473B9C18C6B199F41289E9DBEA24E6BFF18A2CC1 2018-07-13 09:47:12.397 UTC [chaincodeCmd] upgrade -> DEBU 0ab Get Signed envelope 2018-07-13 09:47:12.397 UTC [chaincodeCmd] chaincodeUpgrade -> DEBU 0ac Send signed envelope to orderer
查詢用戶餘額
$ peer chaincode query -n devcc1 -c '{"Args":["query","bruce"]}' -C myc #新用戶bruce
命令返回
2018-07-13 09:49:53.445 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACB070A6308031A0C08C1EBA1DA0510...1A0E0A0571756572790A056272756365 2018-07-13 09:49:53.445 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: 229B5B1B788011E2C539D63122E2403E88432B9F8304018D607085EFFCF9188F 800 $peer chaincode query -n devcc1 -c '{"Args":["query","brucefeng"]}' -C myc #老用戶brucefeng
命令返回
2018-07-13 09:52:31.230 UTC [msp/identity] Sign -> DEBU 044 Sign: plaintext: 0ACA070A6208031A0B08DFECA1DA0510...71756572790A09627275636566656E67 2018-07-13 09:52:31.230 UTC [msp/identity] Sign -> DEBU 045 Sign: digest: F6D314D991E18ED26E8B62A1D9338FF37318951ABA777BC015FCFE6D53BB53E9 200