Closed7

Hyperledger Fabricのチュートリアルをやってみる

popy1017popy1017

必要リソースのダウンロード

https://hyperledger-fabric.readthedocs.io/en/latest/install.html

$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
popy1017popy1017

テストネットワークの立ち上げ

https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html#bring-up-the-test-network

ダウンロードした資材の中(fabric-samples/test-network)にテストネットワーク構築用のスクリプトなどがある。

cd fabric-samples/test-network
# ヘルプの表示
./network.sh -h

# 以前立ち上げたコンテナを削除する
./network.sh down

# テストネットワークの立ち上げ
./network.sh up

2つのPeerと1つのOrdererが立ち上がる。

popy1017popy1017

チャンネルを作る

Org1Org2が参加するmychannelというチャンネルが作成される。

./network.sh createChannel

チャンネル名を指定する

-cフラグにチャンネル名を指定することでチャンネル名を指定できる。

./network.sh createChannel -c channel1

ネットワーク立ち上げと同時にチャンネルを作成する

./network.sh up createChannel
popy1017popy1017

チャンネル上でチェーンコードを動かす

  • 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
  }
]
popy1017popy1017

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"]}'

一番最後の行を見ると、asset6ChristopherTransferしているっぽい。(もともとは"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

OwnerChristopherに変わっていることがわかる。

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にクローズされました