超級賬本Fabric教程(一):超級賬本入門
是一個帶有可插入各種功能模組架構的區塊鏈實施方案,目標是打造成一個由全社會共同維護的開源超級賬本。由Linux 基金會的開源專案,全稱是Hyperledger Fabric)是區塊鏈的商用平臺。開源地址: ofollow,noindex">https://github.com/hyperledger。
二、為什麼用超級賬本?
-
會員眾多:包括Cisco、 IBM、 Intel、 J. P. Morgan、 荷蘭 銀行、 SWIFT 等。
-
擁抱監管和審查。
-
良好的擴充套件性,可插入各種功能模組。
-
成員管理
-
身份管理
-
網路隱私
-
保密和審查
-
智慧合約
-
J AVA
-
GO
-
NODEJS
-
其它
-
在fabric中成為鏈碼
-
在沙箱中執行
-
鏈碼語言
-
支援事件
-
適合企業級應用
傳統的業務模型很難做到跨機構的交易被一個互信的機構監督執行。每個交易方都有自己獨立的賬本。發生交易時各自更改,造成賬本同步的成本高昂且效率低下。僅有少數的中心繫統,所以商業網路比較脆弱。fabric提供了授權維護賬本的機制,因此相對保證了資料的私密,公司作為上市主體,以盈利為目的,不可能所有的資料都公開。那麼超級賬本作為聯盟鏈供企業使用比較合適。企業級區塊鏈四大平臺要素:1. 共享賬本 2. 共識 3. 隱私和保密 4. 智慧合約。 當前公鏈比如以太坊eos等其它三點都能滿足唯獨隱私沒法保證,另外效率普遍不高,沒有最終確定性,又是被極客們主導的,不符合商業主流趨勢,從而也限制了企業性質的應用。
企業級商用區塊鏈網路比較適合使用聯盟鏈和許可制。這樣在一個限定的範圍內,只有授權的節點和使用者才能參與到交易和智慧合約的執行中 來,而任何匿名節點或非授權使用者均被拒絕服務。從團體聯盟的角度 來看,這增加了區塊鏈網路的安全可靠。 當前,在歐美主流的區塊鏈應用大部分是行業鏈或者是聯盟 鏈,也就是某一個行業的上下游,或者核心企業聯合 起來,一起構建的半公開化的區塊 鏈。從這個角度講,超級賬本具備成為未來最主要商用區塊鏈技術平臺的 潛力,值得技術開發人員花時間和精力進行學習和研究。
-
商用場景
-
金融
對銀行、保險、清算、股權登記 交易、信用評級、公證等 領域,既需要絕對的 可信任,也需要隱私保密,所以特別適合區塊鏈 應用。比如可以模仿數字貨幣交易所做一套區塊鏈股權登記和交易 平臺。
-
產業網際網路
-
供應鏈
提供深度回溯、查詢等核心功能,實現資訊公開透明,出了問題可以依此來追 責。附加值較高的 食品、藥品和 疫苗、零部件生產檢測結果等都可以使用區塊鏈。 * 共享模式
-
傳統行業
三、特性
-
用go語言開發
-
更適合聯盟鏈
-
需要在容器裡執行
-
應用場景: 構建 商品 溯源、 貿易 融資、 信用證、 供應 鏈 以及企業貸款
-
是對傳統區塊鏈模型的革新
-
提供 一個 針對 身份 識別、 可 審計、 隱私 安全 和 健壯 的 模型
-
可插拔的共識演算法及共識模型
-
智慧合約
四、安裝和呼叫
Fabric依賴docker容器, 因此需要先安裝和配置docker.(請參考docker的章節)
下載超級賬本原始碼
1.如果沒有安裝git則執行
微軟雅黑, "Microsoft YaHei"; font-size: 14px;">sudo apt install git
2.通過git安裝
git clone https://github.com/hyperledger/fabric.git
部署呼叫
-
下載Docker映象檔案
-
進入目錄: cd fabric/ scripts
-
修改讀寫許可權 chmod +x bootstrap.sh
-
改寫.sh檔案
-
Mac:sed -i '' 's/ curl/# curl/ g' bootstrap.sh
-
其它: sed -i 's/ curl/# curl/ g' bootstrap.sh
-
執行下載: ./bootstrap.sh
-
體驗部署過程
-
下載一個簡單的例子
-
進入目錄並執行
-
cd fabric- samples/ basic-network docker-compose -f docker-compose.yml up -d
-
檢視啟動的容器
-
會輸出以下內容:
localhost: basic- network clarity$ docker ps CONTAINER ID IMAGE NAMES efddfbf4fc0a hyperledger/ fabric- peer: x86_ 64- 1. 0. 0 peer0. org1. example. com 606d13c1e7a2 hyperledger/ fabric- couchdb: x86_ 64- 1. 0. 0 couchdb d8c870db8634 hyperledger/ fabric- ca: x86_ 64- 1. 0. 0 ca. example. com c6f25a5e6fd6 hyperledger/ fabric- tools: x86_ 64- 1. 0. 0 cli a5f6331c5bc5 hyperledger/ fabric- orderer: x86_
-
建立通道,加入通道
-
加入 通道
peer channel join -b mychannel.block
-
建立通道
peer channel create -o orderer. example. com: 7050 -c mychannel -f /etc/ hyperledger/ configtx/ channel. tx
-
切換 環境 到 管理員 使用者 的 MSP, 進入 Peer 節點 容器 peer0. org1. example. com
docker exec -it -e "CORE_ PEER_ MSPCONFIGPATH=/ etc/ hyperledger/ msp/ users/ Admin@ org1. example. com/ msp" peer0. org1. example. com bash
-
退出 Peer 節點 容器
exit
-
進入 cli 容器 安裝 鏈 碼 和 例項 化
進入容器
docker exec -it cli/bin/bash
-
安裝鏈碼
peer chaincode install -n mycc -v v0 -p github.com/chaincode_example02
例項化鏈碼
peer chaincode instantiate -o orderer. example. com: 7050 -C mychannel -n mycc -v v0 -c '{"Args":["init","a","100","b","200"]}'
-
鏈碼呼叫和查詢
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","a"]}'
-
模擬轉賬
從“ a” 轉移 10 到“ b”:
peer chaincode invoke -C mychannel -n mycc -v v0 -c '{"Args":["invoke","a", "b"," 10"]}'
-
在分別查詢a和b的zhi
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":[" query"," a"]}' peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":[" query"," b"]}'
-
Fabric初體驗
-
配置bin目錄的path
為了讓系統能夠在任何地方識別bin裡的內容,需要配置path:
* 通過編輯器開啟這個檔案
~/.bash_profile
* 新增一行export PATH=<上一步下載的路徑>/bin:$PATH
* 再執行source ~/.bash_profile
讓配置生效 -
最後,該指令碼會將 Docker Hub
中的Hyperledger Fabric docker映像下載到本地Docker中,並將其標記為“最新”。
注意:
如果出現這種錯誤:
ERROR: for orderer.example.com Cannot create container for service orderer.example.com: b'Conflict. The container name "/orderer.example.com" is already in use by container
解決方案是:
輸入
docker ps -a
列出所有執行中的容器
如果能搜尋出容器,則執行
docker ps -qa | xargs docker rm
然後再執行docker-compose -f docker-compose.yaml up -d
如果出現這個資訊表示成功啟動了fabric網路
-
安裝示例檔案和images等
-
下載hyperledger / fabric-samples 簽出適當的版本標籤
將指定版本的Hyperledger Fabric二進位制檔案和配置檔案安裝到fabric-samples儲存庫的根目錄中
下載指定版本的Hyperledger Fabric docker映象 -
執行
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.3.0
命令解析: -
執行bootstrap.sh檔案
該指令碼將下載並提取設定網路所需的所有特定於平臺的二進位制檔案,並將它們放入您在上面建立的目錄中。
其中bin目錄它包含了以下檔案:
cryptogen,
configtxgen,
configtxlator,
peer,
orderer,
idemixgen, and
fabric-ca-client
-
部署網路
-
配置環境變數
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/[email protected]/msp
peer0.org1.example.com:7051 -
建立通道和創世區塊
根據之前生成的通道配置檔案,建立通道
export CHANNEL_NAME=superchannel peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
-
加入通道
peer channel join -b mychannel.block
-
更新錨點
peer channel update -o
orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -
安裝鏈碼
所有準備完成之後,開始安裝鏈碼。
分別支援三種語言:
Golang
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
peer chaincode install -n mycc -v 1.0 -l node -p /opt/gopath/src/github.com/chaincode/chaincode_example02/node/
peer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/
-
例項化鏈碼
Golang
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
Node.js
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -l node -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
Java
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -l java -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"
-
呼叫鏈碼的函式
先查詢一下有多少值
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
然後轉賬一部分
peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'
最後再次查詢
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
會發現數值已經發生了變化,表示轉賬成功 -
定義錨點
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
-
根據配置生成加密相關的材料
../bin/cryptogen generate --config=./crypto-config.yaml
-
進入目錄
cd crypto-config
-
生成的材料會放到crypto-config資料夾裡,把當前的路徑匯出成全域性變數
export FABRIC_CFG_PATH=$PWD
-
進入目錄
cd fabric-samples/first-network
-
生成網路元件
./byfn.sh generate
這時會建立目錄crypto-config併產生一些檔案, 包括公私鑰和證書等 -
構建網路
./byfn.sh up
如果想用node生態使用./byfn.sh up -l node
這一步是建立鏈碼語言對應的映象 -
加密生成器
我們將使用加密工具為我們的各種網路實體生成加密材料(x509證書和簽名金鑰)。
這些證書代表身份,它們允許在我們的實體進行通訊和交易時進行簽名/驗證身份驗證。 -
生成創世區塊檔案
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
-
生成通道配置檔案
export CHANNEL_NAME=superchannel && ../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
-
啟動網路
docker-compose -f docker-compose-cli.yaml up -d
-
進入客戶端
docker exec -it cli bash
-
開發應用
-
註冊之前先開啟日誌
docker logs -f ca.example.com
-
執行註冊指令碼
node enrollAdmin.js
-
應用開發模型