初めに
PS/SLの佐々木です。
今までWeb3チームではEthereumのようなパブリックチェーンを使用しての開発や技術検証を行ってきましたが、今年から新しい取り組みとしてコンソーシアム型のチェーンやプライベートチェーンを使用した開発を行っていこうと思っています。
コンソーシアムチェーンで最も有名なところで行くとHyperledger Fabricが候補に挙がってくるのでキャッチアップがてらチュートリアル(参考)を進めて使用感を見てみようと思っています。
Hyperledger Fabricの詳細な説明は別ブログで行いますので今後出る記事を参考にしてください。
今回はHyperledger fabricをドキュメント通りに動かしてみようと思います。
動作環境
windows 10 pro
wsl ubuntsu 20.04.3
事前準備
- Git
- cURL
- Docker
- Go
Hyperleger install
サンプルとバイナリとDockerイメージをインストールできる
curl -sSL https://bit.ly/2ysbOFE | bash -s
ka-sasaki@1020-00001:~/web3$ ls
fabric-samples
ka-sasaki@1020-00001:~/web3$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hyperledger/fabric-peer 2.5 2d02d49d3d1a 3 weeks ago 142MB
hyperledger/fabric-peer 2.5.8 2d02d49d3d1a 3 weeks ago 142MB
hyperledger/fabric-peer latest 2d02d49d3d1a 3 weeks ago 142MB
hyperledger/fabric-orderer 2.5 c833f32f9244 3 weeks ago 111MB
hyperledger/fabric-orderer 2.5.8 c833f32f9244 3 weeks ago 111MB
hyperledger/fabric-orderer latest c833f32f9244 3 weeks ago 111MB
hyperledger/fabric-ccenv 2.5 b4bf6fadf0c7 3 weeks ago 638MB
hyperledger/fabric-ccenv 2.5.8 b4bf6fadf0c7 3 weeks ago 638MB
hyperledger/fabric-ccenv latest b4bf6fadf0c7 3 weeks ago 638MB
hyperledger/fabric-baseos 2.5 6f1a89df96f3 3 weeks ago 129MB
hyperledger/fabric-baseos 2.5.8 6f1a89df96f3 3 weeks ago 129MB
hyperledger/fabric-baseos latest 6f1a89df96f3 3 weeks ago 129MB
hyperledger/fabric-ca 1.5 c2449e2873d5 3 weeks ago 209MB
hyperledger/fabric-ca 1.5.11 c2449e2873d5 3 weeks ago 209MB
hyperledger/fabric-ca latest c2449e2873d5 3 weeks ago 209MB
サンプルとイメージがダウンロードされていることを確認できます。
最後にbinファイルのパスを通す
export PATH=$PATH:$HOME/fabric-samples/bin
echo "export PATH=\\$PATH:\\$HOME/fabric-samples/bin" >> ~/.bashrc
source ~/.bashrc
テストネットワークの構築
Hyperledger Fabricの構築
ディレクトリは/test-network
- peer 2つ
- orderer 1つ
- CAはなし
test-networkディレクトリに移動し、network.sh
を使用してローカルマシン上のDockerからネットワークを構築する
以前の実行結果などあれば削除する
./network.sh down
ネットワーク起動
./network.sh up
起動するとPeer ノード二つとordererノード一つが起動していることが確認できる。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
f3bf9f73341c hyperledger/fabric-peer:latest "peer node start" 3 minutes ago Up 3 minutes 0.0.0.0:7051->7051/tcp, :::7051->7051/tcp, 0.0.0.0:9444->9444/tcp, :::9444->9444/tcp
peer0.org1.example.com
0c7fb71179d6 hyperledger/fabric-peer:latest "peer node start" 3 minutes ago Up 3 minutes 0.0.0.0:9051->9051/tcp, :::9051->9051/tcp, 7051/tcp, 0.0.0.0:9445->9445/tcp, :::9445->9445/tcp
peer0.org2.example.com
8d55459a26dd hyperledger/fabric-orderer:latest "orderer" 3 minutes ago Up 3 minutes 0.0.0.0:7050->7050/tcp, :::7050->7050/tcp, 0.0.0.0:7053->7053/tcp, :::7053->7053/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp orderer.example.com
Channelの作成
./network.sh createChannel
Channel 'mychannel' joined
Org1とOrg2がmychannelに参加できたことが確認できる
チェーンコードのデプロイ
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
goで作成されたchaincode(ethereumでいうところの smart contract)をデプロイし、channel上でチェーンコードを使用できるようにする
ネットワークとやり取り
export FABRIC_CFG_PATH=$PWD/../config/
// 以下はOrg1のPeerに対して実行するための環境変数
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
台帳の初期化
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":[]}'
// 以下のようなメッセージが出ればOK
-> 2024-06-17 18:48:11.035 JST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200
台帳に登録されているAssetの一覧を取得
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
// 以下のようなメッセージが出ればOK
-> [{"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の移動
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"]}'
// 以下のようなメッセージが出ればOK
-> 2024-06-17 18:51:02.629 JST 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"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
転送結果の確認
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
// 以下のようなメッセージが出ればOK
-> {"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Christopher","Size":15}