Closed7
Hyperledger Fabricのチュートリアルをやってみる
参考ページ
※ 日本語と英語の内容が異なり日本語のほうだとうまくいかない箇所がある(2022/04/09時点)ため、英語のほうをやっていく。
事前準備
以下ページを参考に、必要なソフトを事前にインストールする。
Macの場合
- Homebrew(入ってた)
- Git(入ってた)
- cURL(入ってた)
- Docker
- Go
- JQ(入ってた)
必要リソースのダウンロード
$HOME/go/src/github.com/<your_github_userid>
にサンプルやバイナリ、Dockerイメージなどを一括でダウンロードする。
ディレクトリの指定はGo Communityのおすすめらしい。
mkdir -p $HOME/go/src/github.com/<your_github_userid>
cd $HOME/go/src/github.com/<your_github_userid>
curl -sSL https://bit.ly/2ysbOFE | bash -s
~~~
docker.io/hyperledger/fabric-ca:1.5.2
===> List out hyperledger docker images
hyperledger/fabric-tools 2.4 eb40f70b1174 2 months ago 473MB
hyperledger/fabric-tools 2.4.2 eb40f70b1174 2 months ago 473MB
hyperledger/fabric-tools latest eb40f70b1174 2 months ago 473MB
hyperledger/fabric-peer 2.4 43b970f84604 2 months ago 62.3MB
~~~
バージョン指定したい場合
# curl -sSL https://bit.ly/2ysbOFE | bash -s -- <fabric_version> <fabric-ca_version>
curl -sSL https://bit.ly/2ysbOFE | bash -s -- 2.4.2 1.5.2
テストネットワークの立ち上げ
ダウンロードした資材の中(fabric-samples/test-network
)にテストネットワーク構築用のスクリプトなどがある。
cd fabric-samples/test-network
# ヘルプの表示
./network.sh -h
# 以前立ち上げたコンテナを削除する
./network.sh down
# テストネットワークの立ち上げ
./network.sh up
2つのPeerと1つのOrdererが立ち上がる。
チャンネルを作る
Org1
とOrg2
が参加するmychannel
というチャンネルが作成される。
./network.sh createChannel
チャンネル名を指定する
-c
フラグにチャンネル名を指定することでチャンネル名を指定できる。
./network.sh createChannel -c channel1
ネットワーク立ち上げと同時にチャンネルを作成する
./network.sh up createChannel
チャンネル上でチェーンコードを動かす
- Hyperledger Fabricではスマートコントラクトのことを
chaincode
と呼ぶ。 - ブロックチェーンのデータ(台帳)にアクセスするために
chaincode
を実行する。 - トランザクションを実際に台帳に書き込む前に、参加メンバーの署名が必要(Endorsement)。
- 上記ルールは Endorsement Policy と呼ばれ、
chaincode
ごとに設定されている。 -
chaincode
をデプロイする(チャンネル内で有効にする?)ためにも複数組織からの承認が必要。
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
ネットワークを操作する
-
peer
CLI を使ってネットワークを操作できる。 -
peer
CLI によって以下ができる。- デプロイ済みのchaincodeを実行する
- チャンネルをアップデートする
- 新しいchaincodeをインストール・デプロイする
peer
バイナリや設定ファイルへのパスを通す。
export PATH=${PWD}/../bin:$PATH
export FABRIC_CFG_PATH=$PWD/../config/
Org1
のPeerへアクセスするための環境変数を設定する。
証明書やアドレスなどだと思われる。
# Environment variables for Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
chaincodeを実行
1コマンドが長すぎて何やってるかわからんw
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
改行してみた。けどよくわからない。
InitLedger
という関数を実行しているっぽい。
peer chaincode invoke \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--tls \
--cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \
-C mychannel \
-n basic \
--peerAddresses localhost:7051 \
--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \
--peerAddresses localhost:9051 \
--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \
-c '{"function":"InitLedger","Args":[]}'
query
(台帳に記録されない)でGetAllAssets
関数を実行。Assetを参照している。
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}' | jq
[
{
"AppraisedValue": 300,
"Color": "blue",
"ID": "asset1",
"Owner": "Tomoko",
"Size": 5
},
{
"AppraisedValue": 400,
"Color": "red",
"ID": "asset2",
"Owner": "Brad",
"Size": 5
},
{
"AppraisedValue": 500,
"Color": "green",
"ID": "asset3",
"Owner": "Jin Soo",
"Size": 10
},
{
"AppraisedValue": 600,
"Color": "yellow",
"ID": "asset4",
"Owner": "Max",
"Size": 10
},
{
"AppraisedValue": 700,
"Color": "black",
"ID": "asset5",
"Owner": "Adriana",
"Size": 15
},
{
"AppraisedValue": 800,
"Color": "white",
"ID": "asset6",
"Owner": "Michel",
"Size": 15
}
]
Assetの所有者を変更するchaincodeを実行する
peer chaincode invoke \
-o localhost:7050 \
--ordererTLSHostnameOverride orderer.example.com \
--tls \
--cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" \
-C mychannel -n basic \
--peerAddresses localhost:7051 \
--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" \
--peerAddresses localhost:9051 \
--tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" \
-c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
一番最後の行を見ると、asset6
をChristopher
にTransfer
しているっぽい。(もともとは"Owner": "Michel"
)。
今度はOrg2
のPeerでクエリを実行してみるっぽい。
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
Owner
がChristopher
に変わっていることがわかる。
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}' | jq
{
"AppraisedValue": 800,
"Color": "white",
"ID": "asset6",
"Owner": "Christopher",
"Size": 15
}
以上でこのチュートリアルは終了。お片付けしていく。
./network.sh down
このスクラップは2022/04/10にクローズされました