概要
Amazon Managed Blockchainを使ってHyperledger Fabricのネットワークをデプロイしてみる
料金
ここをみると予算が組める
https://aws.amazon.com/jp/managed-blockchain/pricing/
ネットワークの作成
上の記事の手順にしたがってネットワークの作成, メンバーの追加, VPCエンドポイントの作成を行います.
以上のように入力してNext
を押します
最初のメンバーとCAの管理者, パスワードを入力してNext
管理者の名前とパスワードはメモしておきましょう
確認してCreate network and member
を押します
StatusがActive
になるまで待ちます
VPCエンドポイントの作成
インターフェイスVPCエンドポイント(AWS PrivateLink)の作成
メンバー用にインターフェイスVPCエンドポイントを作成します。これによりHyperledger Fabricクライアントとして使用するEC2インスタンスがAmazon Managed Blockchainがメンバーおよびネットワークリソースに対して公開するHyperledger Fabricエンドポイントと対話することができます。
DetailsのCreate VPC endpoint
を押します
簡単化のためにここではAmazon Managed Blockchainのコンソールから作成します
ここで使うVPCとセキュリティグループはメモしておきましょう
Amazon EC2インスタンスを作成してHyperledger Fabric Clientをセットアップする
EC2インスタンスの作成
EC2インスタンスは次の要件を満たすようにします
・上で作成したVPCエンドポイントと同じセキュリティグループを使用する
・セキュリティグループのメンバー間の全てのインバウンドトラフィックとアウトバウンドトラフィックを許可する
・SSHを使用して接続できるようにする
- https://console.aws.amazon.com/ec2/ をクリックします
- ネットワーク&セキュリティのキーペアをクリックします
- キーペアの作成をクリックします(ここで作成するキーペアはEC2インスタンスと同じリージョンにしましょう)
- 作成された.pemファイルは~/.sshディレクトリに移動しておきましょう
- EC2ダッシュボードに戻ってインスタンスの作成をクリックします
VPCエンドポイントと同じセキュリティグループを選んで確認と作成をクリック
そして起動します
先程作成したキーペアを選択し、インスタンスを作成しましょう
インスタンが作成できたらSSH接続します、が、セキュリティグループを編集します
セキュリティグループをクリックし、インバウンドタブを選択、編集をクリックし以下のように編集します
これでSSH接続できるようになったので接続しましょう
$ ssh -i ~/.ssh/<pem file> ec2-user@<パブリックDNS>
パッケージのインストール
[ec2-user@ip-hoge ~]$ sudo yum update -y
[ec2-user@ip-hoge ~]$ sudo yum install -y telnet
[ec2-user@ip-hoge ~]$ sudo yum -y install emacs
[ec2-user@ip-hoge ~]$ sudo yum install -y docker
[ec2-user@ip-hoge ~]$ sudo service docker start
[ec2-user@ip-hoge ~]$ sudo usermod -a -G docker ec2-user
usermodコマンドを有効にするためにログアウトして再度ログインします
Docker Composeをインストールします
[ec2-user@ip-hoge ~]$ 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
[ec2-user@ip-hoge ~]$ sudo chmod a+x /usr/local/bin/docker-compose
[ec2-user@ip-hoge ~]$ sudo yum install libtool -y
golangをインストールします
[ec2-user@ip-hoge ~]$ wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
[ec2-user@ip-hoge ~]$ tar -xzf go1.10.3.linux-amd64.tar.gz
[ec2-user@ip-hoge ~]$ sudo mv go /usr/local
[ec2-user@ip-hoge ~]$ sudo yum install libtool-ltdl-devel -y
[ec2-user@ip-hoge ~]$ sudo yum install git -y
[ec2-user@ip-hoge ~]$ 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
# 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
更新したら変更を適用します
[ec2-user@ip-hoge ~]$ source ~/.bash_profile
正しいバージョンがインストールされているか確認しましょう
・Docker - 17.06.2-ce以降
・Docker-compose – 1.14.0以降
・Go 1.10.x
#Dockerバージョン確認
[ec2-user@ip-hoge ~]$ sudo docker version
#Docker Composeバージョン確認
[ec2-user@ip-hoge ~]$ sudo /usr/local/bin/docker-compose version
#goのバージョン確認
[ec2-user@ip-hoge ~]$ go version
Hyperledger Fabric CAクライアントを設定する
この手順では[VPCエンドポイントの作成]で作成したVPCエンドポイントを使用してHyperledger Fabric CAに接続できることを確認します。その後、Hyperledger Fabric CAクライアントをインストールします。
まずaws cliをアップデートします
[ec2-user@ip-hoge ~]$ sudo pip install awscli --upgrade
[参考]sudo pipができなかったのでpipをインストールした後に私はこれらを実行しました
[ec2-user@ip-hoge ~]$ pip install -U pip
[ec2-user@ip-hoge ~]$ sudo yum install python-pip
Hyperledger Fabric CAへの接続を確認するにはCAエンドポイントが必要です。次のようにしてCAエンドポイントを取得します。--network-id
と--menber-id
を[ネットワークの作成]で作った自分のものに置き換えます。
[ec2-user@ip-hoge ~]$ aws managedblockchain get-member \
--network-id n-BGGOTBDZBFGGJMXLFOQXBFJYRU \
--member-id m-PF4J2E3DLZBQBNPDLFGH552ZJA
こんな感じで返ってきます
{
"Member": {
"NetworkId": "n-BGGOTBDZBFGGJMXLFOQXBFJYRU",
"Status": "AVAILABLE",
"Description": "First Member",
"FrameworkAttributes": {
"Fabric": {
"AdminUsername": "root",
"CaEndpoint": "ca.m-pf4j2e3dlzbqbnpdlfgh552zja.n-bggotbdzbfggjmxlfoqxbfjyru.managedblockchain.us-east-1.amazonaws.com:30002"
}
},
"CreationDate": "2019-06-12T08:38:42.244Z",
"Id": "m-PF4J2E3DLZBQBNPDLFGH552ZJA",
"Name": "melon"
}
}
エンドポイントが解決されたことを確認します
[ec2-user@ip-hoge ~]$ curl https://CAEndpoint/cainfo -k
こんな感じで返ってきます
{"result":{"CAName":"m-PF4J2E3DLZBQBNPDLFGH552ZJA","CAChain":"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNwVENDQWt1Z0F3SUJBZ0lVRXpUYnIrS3.....
Hyperledger Fabric CAに接続できることを確認したので、次のコマンドを実行してCAクライアントを構成します
[ec2-user@ip-hoge ~]$ git clone https://github.com/hyperledger/fabric-ca.git
[ec2-user@ip-hoge ~]$ cd /home/ec2-user/go/src/github.com/hyperledger/fabric-ca
[ec2-user@ip-hoge ~]$ git fetch
[ec2-user@ip-hoge ~]$ git checkout release-1.2
[ec2-user@ip-hoge ~]$ make fabric-ca-client
サンプルレポジトリを複製する
[ec2-user@ip-hoge ~]$ cd /home/ec2-user
[ec2-user@ip-hoge ~]$ git clone https://github.com/hyperledger/fabric-samples.git
Hyperledger Fabric CLIを起動するためのDocker Composeの設定と実行
[ec2-user@ip-hoge ~]$ touch docker-compose-cli.yaml
[ec2-user@ip-hoge ~]$ 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
次のコマンドを実行してHyperledger Fabric peer CLIコンテナを起動します
[ec2-user@ip-hoge ~]$ docker-compose -f docker-compose-cli.yaml up -d
管理ユーザーを登録する
証明書を使用して、メンバーの認証局(CA)に対する管理権限をもつユーザーを登録する。
証明書ファイルの作成
次のコマンドでmanagedblockchain-tls-chain.pem
を/home/ec2-user
にコピーします
[ec2-user@ip-hoge ~]$ aws s3 cp s3://us-east-1.managedblockchain/etc/managedblockchain-tls-chain.pem /home/ec2-user/managedblockchain-tls-chain.pem
正しくコピーされたことをテストします
[ec2-user@ip-hoge ~]$ openssl x509 -noout -text -in /home/ec2-user/managedblockchain-tls-chain.pem
管理ユーザーを作成する
さっきも実行したこのコマンドを実行してCaEndpointを取得します
--network-id
と--member-id
は自分のものに置き換えてください
[ec2-user@ip-hoge ~]$ aws managedblockchain get-member \
--network-id n-BGGOTBDZBFGGJMXLFOQXBFJYRU \
--member-id m-PF4J2E3DLZBQBNPDLFGH552ZJA
CAEndpoint、管理者の名前とパスワード、および証明書ファイルを使用して管理者メンバーを登録します
[ec2-user@ip-hoge ~]$ fabric-ca-client enroll \
-u https://AdminUsername:AdminPassword@SampleCAEndpointAndPort \
--tls.certfiles /home/ec2-user/managedblockchain-tls-chain.pem -M /home/ec2-user/admin-msp
こんな感じで返ってきます
2019/06/13 09:02:06 [INFO] Created a default configuration file at /home/ec2-user/.fabric-ca-client/fabric-ca-client-config.yaml
2019/06/13 09:02:06 [INFO] TLS Enabled
2019/06/13 09:02:06 [INFO] generating key: &{A:ecdsa S:256}
2019/06/13 09:02:06 [INFO] encoded CSR
2019/06/13 09:02:07 [INFO] Stored client certificate at /home/ec2-user/admin-msp/signcerts/cert.pem
2019/06/13 09:02:07 [INFO] Stored root CA certificate at /home/ec2-user/admin-msp/cacerts/ca-m-pf4j2e3dlzbqbnpdlfgh552zja-n-bggotbdzbfggjmxlfoqxbfjyru-managedblockchain-us-east-1-amazonaws-com-30002.pem
MSPの証明書をコピーします
Hyperledger Fabricでは Membership Service Provider (MSP)がどのルートCAと中間CAが信頼ドメインのメンバーを定義するために信頼されているかを識別します。
このチュートリアルでは/home/ec2-user/admin-msp
に証明書があります。このMSPは管理者メンバー用なので次のようにadmincerts
にコピーします。
[ec2-user@ip-hoge ~]$ cp -r admin-msp/signcerts admin-msp/admincerts
メンバーシップにピアノードを作成する
- https://console.aws.amazon.com/managedblockchain/ でManaged Blockchainコンソールを開きます。
- ネットワークを選択した後にメンバーを選択して
Create peer node
をクリックします。
こんな感じで作ります
チャンネルの作成
Hyperledger Fabricでは元帳はチャネルの範囲内に存在します。すべてのメンバーが共通のチャネルで動作している場合は、元帳をネットワーク全体で共有できます。特定の参加者のセットのみを含めるようにチャネルを民営化することもできます。
ここでは基本のチャネルを設定します。
Hyperledgerファブリックチャネル作成用のconfigtxの作成
configtx.yamlファイルにはチャネル構成の詳細が含まれています。詳細についてはこちらをみてください。
[ec2-user@ip-hoge ~]$ touch configtx.yaml
[ec2-user@ip-hoge ~]$ vim configtx.yaml
以下のように編集します
MemberIDは自分のものに変えてください
################################################################################
#
# Section: Organizations
#
# - This section defines the different organizational identities which will
# be referenced later in the configuration.
#
################################################################################
Organizations:
- &Org1
# DefaultOrg defines the organization which is used in the sampleconfig
# of the fabric.git development environment
Name: MemberID
# ID to load the MSP definition as
ID: MemberId
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:
################################################################################
#
# SECTION: Application
#
# - This section defines the values to encode into a config transaction or
# genesis block for application related parameters
#
################################################################################
Application: &ApplicationDefaults
# Organizations is the list of orgs which are defined as participants on
# the application side of the network
Organizations:
################################################################################
#
# Profile
#
# - Different configuration profiles may be encoded here to be specified
# as parameters to the configtxgen tool
#
################################################################################
Profiles:
OneOrgChannel:
Consortium: AWSSystemConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
次のコマンドを実行してconfigtx peer blockを作成します
[ec2-user@ip-hoge ~]$ docker exec cli configtxgen \
-outputCreateChannelTx /opt/home/mychannel.pb \
-profile OneOrgChannel -channelID mychannel \
--configPath /opt/home/
環境変数の設定
MemberIDは自分のを入れましょう
OrdieringServiceEndpointはawsのコンソールでネットワークのDetailをみて確認します
PeerEndpointはawsのコンソールでPeer NodeのDetailsをみて確認します
[ec2-user@ip-hoge ~]$ export MSP_PATH=/opt/home/admin-msp
[ec2-user@ip-hoge ~]$ export MSP=MemberID
[ec2-user@ip-hoge ~]$ export ORDERER=OrderingServiceEndpoint
[ec2-user@ip-hoge ~]$ export PEER=PeerEndpoint
私の場合はこんな感じです
[ec2-user@ip-hoge ~]$ export MSP_PATH=/opt/home/admin-msp
[ec2-user@ip-hoge ~]$ export MSP=m-PF4J2E3DLZBQBNPDLFGH552ZJA
[ec2-user@ip-hoge ~]$ export ORDERER=orderer.n-bggotbdzbfggjmxlfoqxbfjyru.managedblockchain.us-east-1.amazonaws.com:30001
[ec2-user@ip-hoge ~]$ export PEER=nd-symdsmwzynbozjzsuyoqatcxla.m-pf4j2e3dlzbqbnpdlfgh552zja.n-bggotbdzbfggjmxlfoqxbfjyru.managedblockchain.us-east-1.amazonaws.com:30005
変更を反映します
[ec2-user@ip-hoge ~]$ source ~/.bash_profile
チャンネルを作成する
設定した環境変数と作成したconfigtx peer blockを使用してチャンネルを作成します
[ec2-user@ip-hoge ~]$ 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
あなたのピアノードをチャンネルに参加させる
[ec2-user@ip-hoge ~]$ 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をインストールして実行する
Chaincodeをインストールする
サンプルのチェーンコードをピアノードにインストールします
[ec2-user@ip-hoge ~]$ 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
チェーンコードのインスタンス化
チェーンコードをインスタンス化します
[ec2-user@ip-hoge ~]$ 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-hoge ~]$ 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
チェーンコードに問い合わせる
[ec2-user@ip-hoge ~]$ 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-hoge ~]$ 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
100から10を引きます
[ec2-user@ip-hoge ~]$ 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を返します
感想
フルマネージドと聞いていたのでブラウザ上でポチポチしたらできるのかと思っていましたが、現状はdockerでコマンド打ちまくらないといけないようです。
ブロックチェーンエクスプローラーっぽい奴も今は用意されていないよう?なのでそこらへんは不便だなと思いました。