Hyperledger Fabric in Amazon Managed Blockchain Part 2~プレビュー版~

Yuya Sugano
30 min readFeb 3, 2019

--

昨年リリースされたブロックチェーンサービスであるAmazon Managed Blockchainお試し記事の続編。いま現在はプレビュー版としてHyperledger Fabric 1.2のみ利用可能となっています。Ethereumを本当は試したいのですが、正式リリースを待つしかなさそうなのでHyperledger Fabricで遊びます。

Amazon Managed Blockchain

Part 2ではメンバーのエンロールからHyperledger Fabric上でチェーンコードを実行するところまで書いています。

  • AWS Managed Blockchain概要
  • Docker-composeでFabric CLIを起動
  • メンバーのエンロール
  • ピアノードの作成
  • チャネルの作成
  • チェーンコードの実行

AWS Managed Blockchain概要

Hyperledger FabricもしくはEthereumのマネージドネットワークサービスで、AWS CLIやマネージドコンソールから簡単にブロックチェーンが作成できるサービスです。

Amazon Managed Blockchain is a fully managed service for creating and managing blockchain networks usingHyperledger Fabric and Ethereum open source frameworks (only Hyperledger Fabric is available during preview). Blockchain allows you to build applications where multiple parties can securely and transparently run transactions and share data without the need for a trusted, central authority.

数百万のトランザクションを処理する数千のアプリケーションまでスケールアウト可能なブロックチェーンをデプロイし、メトリックやネットワークトランザクションの情報をイミュータブルなAmazon QLDBに保存することで様々な分析も提供可能だそうです。以下、公式サイトにある利用の流れ通りにテストしてみました。[1]

Amazon Managed Blockchain is a fully managed service that allows you to set up and manage a scalable blockchain network with just a few clicks. Amazon Managed Blockchain eliminates the overhead required to create the network, and automatically scales to meet the demands of thousands of applications running millions of transactions.

Amazon Managed Blokchain How it works

参考までに公式サイトに掲載されている価格情報です。[2]

Amazon Managed Blockchain pricing

最小のbc.t3.smallでメンバー2人、20GiBのストレージに時間あたり9MBのデータ書き込みのトランザクションがある状況で1時間 $0.676になります。

Docker-composeでFabric CLIを起動

前回はFabric CLIを起動して確認するところまででした。同じようにDockerのサービスを起動してDocker-composeでFabric CLIを起動しておきます。

[ec2-user@ip-X-X-X-X ~]$ service docker start
Redirecting to /bin/systemctl start docker.service
[ec2-user@ip-X-X-X-X ~]$ docker-compose -f docker-compose-cli.yaml up -d
Creating network "ec2user_default" with the default driver
Pulling cli (hyperledger/fabric-tools:1.2.0)...
1.2.0: Pulling from hyperledger/fabric-tools
b234f539f7a1: Pull complete
55172d420b43: Pull complete
5ba5bbeb6b91: Pull complete
43ae2841ad7a: Pull complete
f6c9c6de4190: Pull complete
c6af77e36488: Pull complete
964f7f4f22f3: Pull complete
13cd31405e09: Pull complete
e03b35c19d96: Pull complete
96c2920985e3: Pull complete
e91461be8304: Pull complete
314928def9dd: Pull complete
d5b68ae13f8d: Pull complete
dde25187799d: Pull complete
Digest: sha256:24cca44a2f2ab6325c6ccc1c91a10bd3e0e71764037a85a473f7e9621b3a0f91
Status: Downloaded newer image for hyperledger/fabric-tools:1.2.0
Creating cli ... done
...
[ec2-user@ip-X-X-X-X ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb9ac0c8ea3c hyperledger/fabric-tools:1.2.0 "/bin/bash" 12 minutes ago Up 12 minutes cli
[ec2-user@ip-X-X-X-X- ~]$ docker exec -it bb9ac0c8ea3c /bin/bash
root@bb9ac0c8ea3c:/opt/gopath/src/github.com/hyperledger/fabric/peer#
root@bb9ac0c8ea3c:/opt/gopath/src/github.com/hyperledger/fabric/peer# go version
go version go1.10 linux/amd64

メンバーのエンロール

作成したメンバー(ここではtestという名前)のadministratorをメンバのCAへエンロールする必要があります。証明書を以下のようにS3からコピーして準備してください。

[ec2-user@ip-X-X-X-X ~]$ aws s3 cp s3://us-east-1.managedblockchain-preview/etc/managedblockchain-tls-chain.pem /home/ec2-user/managedblockchain-tls-chain.pem
download: s3://us-east-1.managedblockchain-preview/etc/managedblockchain-tls-chain.pem to ./managedblockchain-tls-chain.pem
[ec2-user@ip-X-X-X-X ~]$ openssl x509 -noout -text -in /home/ec2-user/managedblockchain-tls-chain.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
...
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=WA, L=Seattle, O=Amazon Web Services, Inc., OU=Amazon Managed Blockchain, CN=Amazon Managed Blockchain US-East-1 Root CA
Validity
Not Before: Nov 24 02:16:08 2018 GMT
Not After : Nov 19 02:16:08 2033 GMT
Subject: C=US, ST=WA, L=Seattle, O=Amazon Web Services, Inc., OU=Amazon Managed Blockchain, CN=Amazon Managed Blockchain US-East-1 Intermediate CA
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus: ...

Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Subject Key Identifier:
...
Signature Algorithm: sha256WithRSAEncryption
...

準備した証明書を使用してメンバーのエンロールができます。最初に作成したadminユーザの名前とパスワードが必要です。再度CA Endpointを確認しておきます。

[ec2-user@ip-X-X-X-X ~]$ aws managedblockchain get-member --network-id <YOUR NETWORK ID> --member-id <YOUR MEMBER ID>
...
{
"Member": {
"NetworkId": "<YOUR NETWORK ID>",
"Status": "ACTIVE",
"Name": "test",
"FrameworkAttributes": {
"Fabric": {
"AdminUsername": "admin",
"CaEndpoint": "ca.<YOUR MEMBER ID>.<YOUR NETWORK ID>.managedblockchain.us-east-1.amazonaws.com:30002"
}
},
"StatusReason": "Network member created successfully",
"CreationDate": 1547271800.67,
"Id": "<YOUR MEMBER ID>"
}
}

fabric-ca-clientコマンドを使用して以下のようにエンロールします。

[ec2-user@ip-X-X-X-X ~]$ fabric-ca-client enroll -u https://admin:<PASSWORD>@ca.<YOUR MEMBER ID>.<YOUR NETWORK ID>.managedblockchain.us-east-1.amazonaws.com:30002 --tls.certfiles /home/ec2-user/managedblockchain-tls-chain.pem -M /home/ec2-user/admin-msp
...
2019/02/03 01:30:49 [INFO] TLS Enabled
2019/02/03 01:30:49 [INFO] generating key: &{A:ecdsa S:256}
2019/02/03 01:30:49 [INFO] encoded CSR
2019/02/03 01:30:50 [INFO] Stored client certificate at /home/ec2-user/admin-msp/signcerts/cert.pem
2019/02/03 01:30:50 [INFO] Stored root CA certificate at /home/ec2-user/admin-msp/cacerts/ca-<YOUR MEMBER ID>-<YOUR NETWORK ID>-managedblockchain-us-east-1-amazonaws-com-30002.pem

cert.pemをsigncertsからadmincertsへコピーしておきます。ここでadmin-mspはメンバシップ・サービス・プロバイダ(MSP)として機能します。 MSP はHyperledger Fabricのメンバーのアイデンティティーと役割を認証するために使用される証明書を管理する認証局で、ユーザの権限が不明な場合 、Hyperledger Fabric ネットワーク上でトランザクションを発行することができません。 MSP がユーザー ID を管理して、ネットワーク上のすべての参加者を認証することで許可制(パーミッション型)のブロックチェーンが構築できるようになっています。

[ec2-user@ip-X-X-X-X ~]$ cp -r admin-msp/signcerts admin-msp/admincerts

ピアノードの作成

ここまでの手順でメンバーがCAにエンロールできました。メンバのピアノードは他のメンバのピアノードとやり取りしてレジャーの更新などトランザクションの処理を行います。ピアノードを作成してみます。

[ec2-user@ip-X-X-X-X ~]$ aws managedblockchain create-node --network-id <YOUR NETWORK ID> --member-id <YOUR MEMBER ID> --node-configuration InstanceType=bc.t3.small,AvailabilityZone=us-east-1a,DataVolumeSize=10
...
{
"NodeId": "nd-3DLMSLTNXZBCLPTQTT6PYDTATU"
}

— node-configuration オプションで作成するノードのインスタンスタイプ、アベイラビリティゾーンおよびデータボリュームサイズを指定可能です。作成したノードを確認してみます。

[ec2-user@ip-172-31-14-2 ~]$ aws managedblockchain get-node --network-id <YOUR NETWORD ID> --member-id <YOUR MEMBER ID> --node-id nd-3DLMSLTNXZBCLPTQTT6PYDTATU
{
"Node": {
"NetworkId": "<YOUR NETWORK ID>",
"Status": "HEALTHY",
"Endpoint": "nd-3DLMSLTNXZBCLPTQTT6PYDTATU.<YOUR MEMBER ID>.<YOUR NETWORD ID>.managedblockchain.us-east-1.amazonaws.com:30003",
"FrameworkAttributes": {
"Fabric": {
"PeerEventPort": "30004"
}
},
"MemberId": "<YOUR MEMBER ID>",
"StatusReason": "Node created successfully",
"Id": "nd-3DLMSLTNXZBCLPTQTT6PYDTATU",
"AvailabilityZone": "us-east-1a",
"CreationDate": 1549159183.733,
"InstanceType": "bc.t3.small"
}
}

チャネルの作成

Hyperledger Fabricにおいてピアノードの集合を論理的に定義したものがチャネルです。メンバーが対象のチャネルに参加することで許可されたレジャーのトランザクションの処理がネットワーク上で可能となります。Amazon Managed Blockchainでは自アカウントだけでなく、他のアカウントのメンバーをチャネルへ招待することも可能です。[3]

チャネル設定を記述した以下のようなファイルをconfigtx.yamlとして保存しておきます。

Organizations:
- &Org1
Name: <YOUR MEMBER ID>
ID: <YOUR MEMBER ID>
MSPDir: /opt/home/admin-msp
AnchorPeers:
- Host:
Port:
Application: &ApplicationDefaults
Organizations:
Profiles:
OneOrgChannel:
Consortium: AWSSystemConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1

チャネル作成のコマンドで使う環境変数を事前設定します。<ORDER SERVICE ENDPOINT>はaws managedblockchain get-networkコマンドで、<PEER NODE ENDPOINT>はaws managedblockchain get-nodeコマンドでそれぞれ確認可能です。

[ec2-user@ip-X-X-X-X ~]$ export MSP_PATH=/opt/home/admin-msp 
[ec2-user@ip-X-X-X-X ~]$ export MSP=<YOUR MEMBER ID>
[ec2-user@ip-X-X-X-X ~]$ export ORDERER=<ORDER SERVICE ENDPOINT>
[ec2-user@ip-X-X-X-X ~]$ export PEER=<PEER NODE ENDPOINT>

チャネルを作成。

[ec2-user@ip-X-X-X-X ~]$ docker exec cli configtxgen -outputCreateChannelTx /opt/home/mychannel.pb -profile OneOrgChannel -channelID mychannel --configPath /opt/home/
2019-02-03 02:19:18.250 UTC [common/tools/configtxgen] main -> INFO 001 Loading configuration
2019-02-03 02:19:18.255 UTC [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2019-02-03 02:19:18.255 UTC [common/tools/configtxgen/encoder] NewApplicationGroup -> WARN 003 Default policy emission is deprecated, please include policy specificiations for the application group in configtx.yaml
2019-02-03 02:19:18.256 UTC [common/tools/configtxgen/encoder] NewApplicationOrgGroup -> WARN 004 Default policy emission is deprecated, please include policy specificiations for the application org group m-JY5ZRMJ45FCHZMUSBTERSKVW7Y in configtx.yaml
2019-02-03 02:19:18.257 UTC [common/tools/configtxgen] doOutputChannelCreateTx -> INFO 005 Writing new channel tx
...
[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_ADDRESS=$PEER" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" cli peer channel create -c mychannel -f /opt/home/mychannel.pb -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls2019-02-03 02:37:06.329 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-02-03 02:37:06.426 UTC [cli/common] readBlock -> INFO 002 Got status: &{NOT_FOUND}
2019-02-03 02:37:06.439 UTC [channelCmd] InitCmdFactory -> INFO 003 Endorser and orderer connections initialized
2019-02-03 02:37:06.641 UTC [cli/common] readBlock -> INFO 004 Got status: &{NOT_FOUND}
2019-02-03 02:37:06.652 UTC [channelCmd] InitCmdFactory -> INFO 005 Endorser and orderer connections initialized
2019-02-03 02:37:06.855 UTC [cli/common] readBlock -> INFO 006 Got status: &{NOT_FOUND}
2019-02-03 02:37:06.865 UTC [channelCmd] InitCmdFactory -> INFO 007 Endorser and orderer connections initialized
2019-02-03 02:37:07.068 UTC [cli/common] readBlock -> INFO 008 Got status: &{NOT_FOUND}
2019-02-03 02:37:07.081 UTC [channelCmd] InitCmdFactory -> INFO 009 Endorser and orderer connections initialized
2019-02-03 02:37:07.283 UTC [cli/common] readBlock -> INFO 00a Got status: &{NOT_FOUND}
2019-02-03 02:37:07.292 UTC [channelCmd] InitCmdFactory -> INFO 00b Endorser and orderer connections initialized
2019-02-03 02:37:07.494 UTC [cli/common] readBlock -> INFO 00c Got status: &{NOT_FOUND}
2019-02-03 02:37:07.504 UTC [channelCmd] InitCmdFactory -> INFO 00d Endorser and orderer connections initialized
2019-02-03 02:37:07.706 UTC [cli/common] readBlock -> INFO 00e Got status: &{NOT_FOUND}
2019-02-03 02:37:07.717 UTC [channelCmd] InitCmdFactory -> INFO 00f Endorser and orderer connections initialized
2019-02-03 02:37:07.919 UTC [cli/common] readBlock -> INFO 010 Got status: &{NOT_FOUND}
2019-02-03 02:37:07.929 UTC [channelCmd] InitCmdFactory -> INFO 011 Endorser and orderer connections initialized
2019-02-03 02:37:08.131 UTC [cli/common] readBlock -> INFO 012 Got status: &{NOT_FOUND}
2019-02-03 02:37:08.142 UTC [channelCmd] InitCmdFactory -> INFO 013 Endorser and orderer connections initialized
2019-02-03 02:37:08.344 UTC [cli/common] readBlock -> INFO 014 Got status: &{NOT_FOUND}
2019-02-03 02:37:08.355 UTC [channelCmd] InitCmdFactory -> INFO 015 Endorser and orderer connections initialized
2019-02-03 02:37:08.558 UTC [cli/common] readBlock -> INFO 016 Got status: &{NOT_FOUND}
2019-02-03 02:37:08.567 UTC [channelCmd] InitCmdFactory -> INFO 017 Endorser and orderer connections initialized
2019-02-03 02:37:08.782 UTC [cli/common] readBlock -> INFO 018 Received block: 0

ピアノードを作成したチャネルへ参加させます。Successfully submitted proposal to join channelというログが出れば成功です。

[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_ADDRESS=$PEER" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" cli peer channel join -b mychannel.block -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls
...
2019-02-03 02:39:28.289 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
2019-02-03 02:39:28.327 UTC [channelCmd] executeJoin -> INFO 002 Successfully submitted proposal to join channel

チェーンコードの実行

作成したピアノードおよびチャネルにおいてサンプルのチェーンコードを実行してみます。最初にピアにチェーンコードをインストールします。ステータスコード200であればOKです。

[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" -e "CORE_PEER_ADDRESS=$PEER" cli peer chaincode install -n mycc -v v0 -p github.com/chaincode_example02/go
...
2019-02-03 02:47:07.640 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-02-03 02:47:07.640 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2019-02-03 02:47:08.406 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >

インストールしたチェーンコードを使ってみます。サンプルのchaincode_example02は2つの変数名(ここではaとb)とその値を記録して、Invoke関数でaからbへ値の移動ができるコードのようです。aに100、bに200を投入して初期化します。[4]

[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" -e "CORE_PEER_ADDRESS=$PEER" cli peer chaincode instantiate -o $ORDERER -C mychannel -n mycc -v v0 -c '{"Args":["init","a","100","b","200"]}' --cafile /opt/home/managedblockchain-tls-chain.pem --tls
...
2019-02-03 02:56:47.908 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-02-03 02:56:47.908 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc

Queryを使用すると保持されている値を確認できます。aの値を確認してみます。以下のように投入した100が表示されるはずです。

[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_ADDRESS=$PEER" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" cli peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
...
100

Invoke関数を使用してaからbへ10移動してみます。ステータスコード200であれば成功です。

[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_ADDRESS=$PEER"  -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" cli peer chaincode invoke -C mychannel -n mycc -c  '{"Args":["invoke","a","b","10"]}' -o $ORDERER --cafile /opt/home/managedblockchain-tls-chain.pem --tls
...
2019-02-03 03:05:43.495 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200

aおよびb双方にQueryを呼んで値が変更されていることを確認してみます。aは90にbが210になっているはずです。

[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_ADDRESS=$PEER" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" cli peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
90
...
[ec2-user@ip-X-X-X-X ~]$ docker exec -e "CORE_PEER_TLS_ENABLED=true" -e "CORE_PEER_TLS_ROOTCERT_FILE=/opt/home/managedblockchain-tls-chain.pem" -e "CORE_PEER_ADDRESS=$PEER" -e "CORE_PEER_LOCALMSPID=$MSP" -e "CORE_PEER_MSPCONFIGPATH=$MSP_PATH" cli peer chaincode query -C mychannel -n mycc -c '{"Args":["query","b"]}'
210

サンプルのチェーンコードをチャネルにインストールして実行することができました。

まとめ

  • Amazon Managed BlockchainではHyperledger FabricおよびEthereumのブロックチェーンを作成することができるようになる
  • プレビュー版ではHyperledger Fabricのみの提供である
  • ピアノードの作成、チャネルの作成を行いサンプルのチェーンコード(chaincode_example02)を実行できた

References

--

--

Yuya Sugano
Yuya Sugano

Written by Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。

Responses (2)