參考文章:http://hyperledger-fabric.readthedocs.io/en/latest/txflow.html
交易流程示意圖
交易流程
本檔案概述了在标準資産交換過程中發生的交易機制。該情景包括兩個買賣蘿蔔的客戶A和B。他們每個人都有網絡上的對等體,通過它們發送他們的交易并與分類帳進行互動。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CMwVGdz9CXzV2Zh1Waf9CX0NXZ0FGbvwlbl9CXvlmLzN2bkVGa0RWYlJnLjlmciFmZtIXZnRWZsJXZwlHavw1LcpDc0RHaiojIsJye.png)
假設
此流程假設一個通道設定并運作。應用程式使用者已經注冊并注冊了組織的認證中心(CA),并收到了必要的加密資料,用于向網絡進行身份驗證。
鍊碼(包含表示蘿蔔市場初始狀态的一組鍵值對)安裝在對等體上并在通道上執行個體化。鍊碼包含定義一組交易指令和蘿蔔的商定價格的邏輯。還為此鍊碼設定了認可政策,并表示同意
peerA
并
peerB
必須準許任何交易。
- 用戶端A啟動事務
發生了什麼? - 客戶A正在發送購買蘿蔔的請求。請求目标,
peerA
以及
peerB
誰分别代表客戶A和客戶B.代言政策規定,雙方必須準許任何交易,是以請求将轉到
peerA
和
peerB
。
接下來,建構交易提案。利用受支援的SDK(Node,Java,Python)的應用程式利用生成交易提案的可用API之一。該提案是調用鍊碼功能的請求,以便可以将資料讀取和/或寫入分類帳(即為資産寫入新的鍵值對)。SDK用作将交易提議打包成正确架構的格式(通過gRPC的協定緩沖區)的墊片,并采用使用者的加密憑據為此交易提案生成唯一簽名。
- 支援對等體驗證簽名并執行事務
認可對等方驗證(1)交易方案是否形成良好,(2)以前沒有送出(重播攻擊保護),(3)簽名有效(使用MSP),(4)送出者(示例中的用戶端A)被正确地授權在該頻道上執行建議的操作(即,每個認可的對等方確定送出者滿足頻道的作者政策)。認可的對等體将事務提案輸入作為引用的鍊碼功能的參數。然後針對目前狀态資料庫執行鍊碼以産生包括響應值,讀取集合和寫入集合的事務結果。此時不對分類帳進行任何更新。這些值的集合以及支援的對等體的簽名作為“解答”應用程式消耗的有效載荷的SDK作為“提案響應”傳回。
{MSP是一個對等元件,允許他們驗證從用戶端到達的事務請求并簽署事務結果(簽注)。寫作政策在頻道建立時定義,并确定哪個使用者有權向該頻道送出交易。}
- 提案回應被檢查
應用程式驗證認可的對等體簽名,并比較提案響應,以确定提案響應是否相同。如果鍊碼僅查詢分類帳,應用程式将檢查查詢響應,通常不會将交易送出給訂購服務。如果客戶應用程式打算将交易送出給訂購服務來更新分類帳,應用程式将在送出之前确定指定的認可政策是否已經滿足(即peerA和peerB都認可)。架構是這樣的,即使應用程式選擇不檢查響應或以其他方式轉發未經授權的交易,則認可政策仍将由同行執行并在送出驗證階段維護。
- 客戶将配件裝配到事務中
應用程式将“交易消息”中的交易建議和響應“廣播”到訂購服務。交易将包含讀/寫集,支援對等體簽名和信道ID。訂單服務不需要檢查交易的整個内容以執行其操作,它隻是從網絡中的所有管道接收交易,按時間順序排列通道,并建立每個通道的交易塊。
- 交易已驗證并送出
事務塊被“傳遞”到通道上的所有對等體。塊内的交易經過驗證,以確定認可政策得到履行,并確定由于事務執行生成了讀取集,讀取集變量對分類帳狀态沒有任何變化。塊中的事務被标記為有效或無效。
- 分類帳更新
每個對等體将塊添加到通道的鍊,并且對于每個有效事務,寫集合被送出到目前狀态資料庫。發出一個事件,以通知用戶端應用程式,該事務(調用)已經不可變地附加到鍊中,以及通知該事務是否被驗證或無效。
搭建完fabric環境後,一般情況會啟動first-network執行個體,測試環境是否ok,熟悉first-network執行個體可以幫助我們了解fabric原理
原文位址:http://hyperledger-fabric.readthedocs.io/en/latest/build_network.html
git clone https://github.com/hyperledger/fabric-samples.git
cd fabric-samples/first-network
./byfn.sh -m generate此第一步生成所有各種網絡實體的所有證書和密鑰,用于引導排序服務的起源塊,以及配置通道所需的配置事務集合。
./byfn.sh -m up 開啟網絡
./byfn.sh -m down 關閉網絡
工具的手動使用
cryptogen
我們将使用cryptogen工具為我們的各種網絡實體生成加密材料(x509證書)。這些證書是身份的代表,它們允許在我們的實體進行交流和交易時進行簽名/驗證身份驗證。
../bin/cryptogen generate --config=./crypto-config.yaml
運作cryptogen工具後,生成的證書和密鑰将被儲存到名為crypto-config的檔案夾中
configtxgen
使用文檔: http://hyperledger-fabric.readthedocs.io/en/latest/configtxgen.html
configtxgen工具用于建立四個配置工件:
orderer
genesis block
,
channel
channel configuration transaction
,
and two
anchor peer transactions
- one for each Peer Org.
1.建立創世區塊
首先設定環境變量告訴
configtxgen
工具去哪尋找
configtx.yaml
檔案
export FABRIC_CFG_PATH=$PWD
然後使用
configtxgen
建立orderer的創世區塊
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
2.建立管道配置
首先設定環境變量CHANNEL_NAME,設定管道名
export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
3.接下來,我們将在正在建構的通道上定義Org1、Org2的錨節點。
../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
開啟網絡
注釋掉docker-compose-cli.yaml中,command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME} ${DELAY}; sleep $TIMEOUT'
CHANNEL_NAME=$CHANNEL_NAME TIMEOUT=10000 docker-compose -f docker-compose-cli.yaml up -d
建立和加入通道
我們将使用docker exec指令進入CLI容器:
docker exec -it cli bash
接下來,我們将建立的通道配置(我們稱之為channel.tx)傳遞給orderer,作為建立通道請求的一部分。
export CHANNEL_NAME=mychannel
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
這個指令會生成一個
<channel-ID.block>
檔案,此例中為mychannel.block檔案
現在我們讓
peer0.org1.example.com
加入通道
peer channel join -bmychannel.block
安裝和執行個體化智能合約
應用程式通過智能合約與區塊鍊賬本互動。是以,我們需要在将執行和認可我們的交易的每個peer上安裝智能合約,然後在通道上執行個體化智能合約(跑起來)。
首先,将示例Go的智能合約安裝到四個peer之一上。該指令将智能合約放在peer的檔案系統上。
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
接下來,在通道上執行個體化智能合約。這将初始化通道上的智能合約,設定區塊鍊的認證政策,并在標明的peer開啟智能合約容器
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --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 "OR ('Org1MSP.member','Org2MSP.member')"
查詢
我們來查詢a的值,以確定智能合約被正确執行個體化,狀态DB被填充。
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
Query Result: 100
調用
我們讓a轉10給b
. 這個交易将産生一個新的區塊并且更新反應在狀态資料中。
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --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 -c '{"Args":["invoke","a","b","10"]}'
Chaincode invoke successful. result: status:200
再次查詢
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
Query Result: 90