以前試した、AWS Blockchain TemplatesでHyperledger Fabric基盤を構築するから新しいブロックチェーンサービスが出たので試してみた。
(参考)
Get Started Creating a Hyperledger Fabric Blockchain Network Using Amazon Managed Blockchain
Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた
概要
Amazon Managed Blockchainとは
- Amazon Managed Blockchainはブロックチェーン基盤を構築するサービスである
- ブロックチェーン基盤の1つであるHyperledger Fabricをサポートしている
- Hyperledger Fabricはブロックチェーンを利用したDLT(分散型台帳技術)の1つである
- Amazon Managed Blockchainはデータを台帳として分散して保持するネットワークをフルマネージドで構築できるサービス
(参考)Amazon QLDBとは
- 台帳データベースのサービスである
- 台帳データベースではデータの変更履歴がトレース可能な状態で保持される
- ブロックチェーンは利用していない
- QLDBはDLTを利用していないサービスである
環境構築
ネットワーク作成
「Network edition」は立てるノード数による
今回はお試しなので、「Starter」を選択
ネットワーク名、説明は任意の値
「Voting policy」は今回使わないのでデフォルト値
組織名と説明は任意の値
ネットワークの管理者のユーザー名とパスワードは任意の値
VPCエンドポイントの作成
ネットワーク作成後、「Create VPC endpoint」からエンドポイントを作成
指定するVPCは任意
指定するVPC内のインスタンスから管理者としてアクセスし、設定等を行う
管理者クライアント(EC2)の作成
さきほど指定したVPC内にインスタンスを立ち上げる
接続設定をシンプルにするために今回はSGはVPCエンドポイントと同じものを指定
VPCエンドポイント作成したサブネットを設定
SSMセッションマネージャーでログインするので、鍵は生成せずにインスタンス作成
パッケージインストール
管理者クライアントからコマンドを実行していく
ログイン
ログイン後に以下のコマンド実行
(参考)AWS Systems Manager のセッションマネージャで EC2 (Linux) にアクセスした際に気をつけたいこととその緩和策
sudo -iu ec2-user
pwd
script ./session001.log
w
dockerをインストール
sudo yum update -y
sudo yum install -y telnet
sudo yum -y install emacs
sudo yum install -y docker
sudo service docker start
sudo usermod -a -G docker ec2-user
docker composeをインストール
sudo curl -L \
https://github.com/docker/compose/releases/download/1.20.0/docker-compose-`uname \
-s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod a+x /usr/local/bin/docker-compose
sudo yum install libtool -y
goをインストール
wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
tar -xzf go1.10.3.linux-amd64.tar.gz
sudo mv go /usr/local
sudo yum install libtool-ltdl-devel -y
sudo yum install git -y
.bash__profileを更新
vim ./.bash_profile
.bash__profileがデフォルトであれば以下で上書き
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin:/home/ec2-user/go/bin
# GOROOT is the location where Go package is installed on your system
export GOROOT=/usr/local/go
# GOPATH is the location of your work directory
export GOPATH=$HOME/go
# Update PATH so that you can access the go binary system wide
export PATH=$GOROOT/bin:$PATH
export PATH=$PATH:/home/ec2-user/go/src/github.com/hyperledger/fabric-ca/bin
上書き後に再読み込み
source ~/.bash_profile
バージョン確認
以下であることを確認
- Docker–17.06.2-ce or later
- Docker-compose–1.14.0 or later
- Go–1.10.x
docker version
docker-compose version
go version
(参考)AWS CLIの更新
AWS CLIのバージョンが低い場合は、更新する
Amazon Linux2の場合、pipのインストールが必要
[ec2-user@ip-172-31-5-178 ~]$ aws --version
aws-cli/1.16.102 Python/2.7.16 Linux/4.14.123-86.109.amzn1.x86_64 botocore/1.12.92
sudo pip install -U awscli
[ec2-user@ip-172-31-5-178 ~]$ aws --version
aws-cli/1.16.198 Python/2.7.16 Linux/4.14.123-86.109.amzn1.x86_64 botocore/1.12.188
更新後、AWSコマンドが利用できない場合は以下コマンドでセットアップ
(参考)AWS CLI の設定
※「Default output format」で「json」ではなく「JSON」を指定すると動かない
aws configure
CAに接続
「network-id」と「member-id」はマネジメントコンソールで確認
レスポンスに含まれる「CaEndpoint」をメモ
aws managedblockchain get-member \
--network-id n-RBYM74VOSBG57LWTGAP5A4FJQE \
--member-id m-DNGBD4KRKVBTDKIFIU2MCBUMQ4
エンドポイントの有効化
メモした「CaEndpoint」を利用
curl https://ca.m-dngbd4krkvbtdkifiu2mcbumq4.n-rbym74vosbg57lwtgap5a4fjqe.managedblockchain.us-east-1.amazonaws.com:30002/cainfo -k
(参考)つながらない場合
- VPCエンドポイントとEC2のセキュリティグループが同一であることを確認
- SGのインバウンド設定にて、自身のSGからのアクセスを許可しているか確認
CA設定
go get -u github.com/hyperledger/fabric-ca/cmd/...
cd /home/ec2-user/go/src/github.com/hyperledger/fabric-ca
git fetch
git checkout release-1.2
make fabric-ca-client
サンプルリポジトリをクローン
cd /home/ec2-user
git clone https://github.com/hyperledger/fabric-samples.git
docker composeを起動
touch ./docker-compose-cli.yaml
vim ./docker-compose-cli.yaml
version: '2'
services:
cli:
container_name: cli
image: hyperledger/fabric-tools:1.2.0
tty: true
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=info # Set logging level to debug for more verbose logging
- CORE_PEER_ID=cli
- CORE_CHAINCODE_KEEPALIVE=10
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
command: /bin/bash
volumes:
- /var/run/:/host/var/run/
- /home/ec2-user/fabric-samples/chaincode:/opt/gopath/src/github.com/
- /home/ec2-user:/opt/home
docker-compose -f docker-compose-cli.yaml up -d
管理者を登録
証明書取得
aws s3 cp s3://us-east-1.managedblockchain/etc/managedblockchain-tls-chain.pem /home/ec2-user/managedblockchain-tls-chain.pem
管理者ユーザーの登録
ネットワークの管理者のユーザー名とパスワード、メモした「CaEndpoint」を指定
fabric-ca-client enroll \
-u https://Administrator:password@ca.m-DNGBD4KRKVBTDKIFIU2MCBUMQ4.n-RBYM74VOSBG57LWTGAP5A4FJQE.managedblockchain.us-east-1.amazonaws.com:30002 \
--tls.certfiles /home/ec2-user/managedblockchain-tls-chain.pem -M /home/ec2-user/admin-msp
MSP(Membership Service Providers)に必要な証明書をコピー
sudo cp -r admin-msp/signcerts admin-msp/admincerts
ノード作成
マネジメントコンソールにて作成可能
組織を指定し、「Create peer node」からノード作成
チャネル作成
設定ファイル作成、実行
「Name」と「ID」はmember-idを指定(マネジメントコンソールで確認)
cd ~
touch ./configtx.yaml
vim ./configtx.yaml
Organizations:
- &Org1
# DefaultOrg defines the organization which is used in the sampleconfig
# of the fabric.git development environment
Name: m-DNGBD4KRKVBTDKIFIU2MCBUMQ4
# ID to load the MSP definition as
ID: m-DNGBD4KRKVBTDKIFIU2MCBUMQ4
MSPDir: /opt/home/admin-msp
# AnchorPeers defines the location of peers which can be used
# for cross org gossip communication. Note, this value is only
# encoded in the genesis block in the Application section context
AnchorPeers:
- Host:
Port:
Application: &ApplicationDefaults
# Organizations is the list of orgs which are defined as participants on
# the application side of the network
Organizations:
Profiles:
OneOrgChannel:
Consortium: AWSSystemConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
docker exec cli configtxgen \
-outputCreateChannelTx /opt/home/mychannel.pb \
-profile OneOrgChannel -channelID mychannel \
--configPath /opt/home/
環境変数の設定
マネジメントコンソールから設定値を確認し、変数に追加
cat >> ~/.bash_profile << "EOF"
export MSP_PATH=/opt/home/admin-msp
export MSP=m-DNGBD4KRKVBTDKIFIU2MCBUMQ4
export ORDERER=orderer.n-rbym74vosbg57lwtgap5a4fjqe.managedblockchain.us-east-1.amazonaws.com:30001
export PEER=nd-xezvqn2klzcr5pl6j7zhqeyaje.m-dngbd4krkvbtdkifiu2mcbumq4.n-rbym74vosbg57lwtgap5a4fjqe.managedblockchain.us-east-1.amazonaws.com:30003
EOF
上書き後に再読み込み
source ~/.bash_profile
チャネル作成
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 --tls
チャネル参加
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
chaincode(cc)の実行
ccのインストール
a、bそれぞれ数値を持ち、値の移動を行うccをインストール
https://github.com/mcenatie/fabric/blob/master/examples/chaincode/go/chaincode_example02/chaincode_example02.go
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
ccのインスタンス化
初期値として、aに100、bに200を設定
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
(参考)コンソールログ
[ec2-user@ip-172-31-7-168 ~]$ 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-07-14 15:50:06.540 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-07-14 15:50:06.541 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
2019-07-14 15:50:07.225 UTC [chaincodeCmd] install -> INFO 003 Installed remotely response:<status:200 payload:"OK" >
[ec2-user@ip-172-31-7-168 ~]$ 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-07-14 15:51:12.286 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 001 Using default escc
2019-07-14 15:51:12.287 UTC [chaincodeCmd] checkChaincodeCmdParams -> INFO 002 Using default vscc
ccがインスタンス化、デプロイされたことを確認
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 list --instantiated \
-o $ORDERER -C mychannel \
--cafile /opt/home/managedblockchain-tls-chain.pem --tls
(参考)実行結果
[ec2-user@ip-172-31-7-168 ~]$ 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 list --instantiated \
> -o $ORDERER -C mychannel \
> --cafile /opt/home/managedblockchain-tls-chain.pem --tls
Get instantiated chaincodes on channel mychannel:
Name: mycc, Version: v0, Path: github.com/chaincode_example02/go, Escc: escc, Vscc: vscc
cc実行(Query)
aの値を確認するコマンド
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"]}'
cc実行(Invoke)
aからbに10移動
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
実行結果
[ec2-user@ip-172-31-7-168 ~]$ 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
[ec2-user@ip-172-31-7-168 ~]$ 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-172-31-7-168 ~]$ 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
AWS Blockchain Templatesと比較して
- Hyperledger Fabricのサポートバージョンが1.0から1.2になった
- 今回は試してないが、メンバーの追加で他AWSアカウントを参加させられる
- 組織ごとにもつAWSアカウントを利用できるのでより実用的になった
- 共有備品や会議室の予約等、部署をまたいで管理
- セキュアな情報を社外の組織と共有
- 組織ごとにもつAWSアカウントを利用できるのでより実用的になった
- ネットワークを構築するためのVPCをわざわざ作成する必要がなくなった
- ノードの作成がコンソールで可能
- より簡単にノードを立てられるようになった
- 専用のインスタンスタイプができた
- AZは6つから選択可能
- docker等のインストールはコマンドを実行してやらないといけない
- CAやチャネル、CCの設定に手間がかかる点は変わらず
- これらもマネジメントコンソールからやりたい