天天看點

fabric first-network執行個體解析交易流程

參考文章:http://hyperledger-fabric.readthedocs.io/en/latest/txflow.html

交易流程示意圖

交易流程

本檔案概述了在标準資産交換過程中發生的交易機制。該情景包括兩個買賣蘿蔔的客戶A和B。他們每個人都有網絡上的對等體,通過它們發送他們的交易并與分類帳進行互動。

fabric first-network執行個體解析交易流程

假設

此流程假設一個通道設定并運作。應用程式使用者已經注冊并注冊了組織的認證中心(CA),并收到了必要的加密資料,用于向網絡進行身份驗證。

鍊碼(包含表示蘿蔔市場初始狀态的一組鍵值對)安裝在對等體上并在通道上執行個體化。鍊碼包含定義一組交易指令和蘿蔔的商定價格的邏輯。還為此鍊碼設定了認可政策,并表示同意

peerA

peerB

必須準許任何交易。

fabric first-network執行個體解析交易流程
  1. 用戶端A啟動事務

發生了什麼? - 客戶A正在發送購買蘿蔔的請求。請求目标,

peerA

以及

peerB

誰分别代表客戶A和客戶B.代言政策規定,雙方必須準許任何交易,是以請求将轉到

peerA

peerB

接下來,建構交易提案。利用受支援的SDK(Node,Java,Python)的應用程式利用生成交易提案的可用API之一。該提案是調用鍊碼功能的請求,以便可以将資料讀取和/或寫入分類帳(即為資産寫入新的鍵值對)。SDK用作将交易提議打包成正确架構的格式(通過gRPC的協定緩沖區)的墊片,并采用使用者的加密憑據為此交易提案生成唯一簽名。

fabric first-network執行個體解析交易流程
  1. 支援對等體驗證簽名并執行事務

認可對等方驗證(1)交易方案是否形成良好,(2)以前沒有送出(重播攻擊保護),(3)簽名有效(使用MSP),(4)送出者(示例中的用戶端A)被正确地授權在該頻道上執行建議的操作(即,每個認可的對等方確定送出者滿足頻道的作者政策)。認可的對等體将事務提案輸入作為引用的鍊碼功能的參數。然後針對目前狀态資料庫執行鍊碼以産生包括響應值,讀取集合和寫入集合的事務結果。此時不對分類帳進行任何更新。這些值的集合以及支援的對等體的簽名作為“解答”應用程式消耗的有效載荷的SDK作為“提案響應”傳回。

{MSP是一個對等元件,允許他們驗證從用戶端到達的事務請求并簽署事務結果(簽注)。寫作政策在頻道建立時定義,并确定哪個使用者有權向該頻道送出交易。}

fabric first-network執行個體解析交易流程
  1. 提案回應被檢查

應用程式驗證認可的對等體簽名,并比較提案響應,以确定提案響應是否相同。如果鍊碼僅查詢分類帳,應用程式将檢查查詢響應,通常不會将交易送出給訂購服務。如果客戶應用程式打算将交易送出給訂購服務來更新分類帳,應用程式将在送出之前确定指定的認可政策是否已經滿足(即peerA和peerB都認可)。架構是這樣的,即使應用程式選擇不檢查響應或以其他方式轉發未經授權的交易,則認可政策仍将由同行執行并在送出驗證階段維護。

fabric first-network執行個體解析交易流程
  1. 客戶将配件裝配到事務中

應用程式将“交易消息”中的交易建議和響應“廣播”到訂購服務。交易将包含讀/寫集,支援對等體簽名和信道ID。訂單服務不需要檢查交易的整個内容以執行其操作,它隻是從網絡中的所有管道接收交易,按時間順序排列通道,并建立每個通道的交易塊。

fabric first-network執行個體解析交易流程
  1. 交易已驗證并送出

事務塊被“傳遞”到通道上的所有對等體。塊内的交易經過驗證,以確定認可政策得到履行,并確定由于事務執行生成了讀取集,讀取集變量對分類帳狀态沒有任何變化。塊中的事務被标記為有效或無效。

fabric first-network執行個體解析交易流程
  1. 分類帳更新

每個對等體将塊添加到通道的鍊,并且對于每個有效事務,寫集合被送出到目前狀态資料庫。發出一個事件,以通知用戶端應用程式,該事務(調用)已經不可變地附加到鍊中,以及通知該事務是否被驗證或無效。

搭建完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

繼續閱讀