MacにHyperledger Fabricでブロックチェーン環境を構築・送金

勉強中。開発者モードの動作確認。
執筆段階では仕組みを理解していないので、とりあえず動作方法だけ。

[amazonjs asin="4865940405″ locale="JP" title="ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術"]

事前準備

Mac上にインストールが必要なもの

  • git client
  • golang
  • Virtualbox
  • Vagrant

VagrantでVirtualbox上にVMを作成するため、VagrantとVirtualboxをインストールする必要がある。

Virtualboxをインストール

Virtualboxからダウンロードしてインストール。

Vagrantをインストール

brew tap phinze/cask
brew install brew-cask
brew cask install vagrant

golangをインストール

brew install go

git clientをインストール

brew install git

Vagrantを使ってHyperledger環境を構築

Githubからcloneしてくる

cd
mkdir -p hyperledger/src/github.com/hyperledger
cd hyperledger/src/github.com/hyperledger
git clone https://github.com/hyperledger-archives/fabric.git
cd fabric
git checkout origin/v0.5-developer-preview
git branch

dockerのバージョンを指定する

dockerが最新版だと動作しないため。VM上のUbuntuにインストールするdockerのバージョンを指定する。

cd ~/hyperledger/src/github.com/hyperledger
vi fabric/devenv/setup.sh
    # 70行目付近
#apt-get install -y linux-image-extra-$(uname -r) apparmor docker-engine
apt-get install -y linux-image-extra-$(uname -r) apparmor docker-engine=1.10.2-0~trusty

VMのメモリを設定する

自前のMacが8GBしかメモリがないため、デフォルトで指定してあるVMのメモリを4096->2048に指定する。
メモリに余裕がある場合は不要。

vi fabric/devenv/Vagrantfile
# 48行目付近
# 4096 -> 2048 に変更
vb.customize ['modifyvm': id, '--memory': '2048']

環境構築する

cd devenv
vagrant up

VMの設定

MacのターミナルからVMへsshでログインして扱えるようにする。
Virtualboxの画面上で操作する場合は不要。

ホストオンリーネットワークを作成する

Virtualboxを開くと hyperledger というVMが立ち上がっているため、一度停止する。

VirtualboxのPreferencesを開く。

Network->Hostonly Networksタブを開き、追加マークをクリックする。
するとvboxnet0が作成されるので、それをダブルクリックする。

IPv4 Addressを控える。
(以下の説明では192.168.56.1として説明する。)

OKを押してVirtualboxの画面を開き、hyperledgerを選択してSettingsを開く。

Networkを開き、Adapter2タブを開く。
Enable Network Adapterにチェックを入れ、Attached to: で Host-only Adapter を選択し、OKを押す。

hyperledgerを選択し、Startをクリックして起動する。

VMの画面を開き、ログインする

Virtualboxを開き、hyperledgerをクリックする。

キーを押すと画面上に「login:」が表示される。「vagrant」と入力し、Passwordにも「vagrant」と入力する。

キーボードが英語配列のため、日本語配列に直したい場合は以下を参考に。

キーボードレイアウト変更(ubuntu)

ネットワークを追加する

/etc/network/interfacesを編集する。
編集する際にvimがないと編集しづらいので、インストールする。

sudo apt-get install vim
sudo vi /etc/network/interfaces
# 以下を末尾に追記する。
auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0

ネットワークを再起動して、eth1が追加されていることを確認する。

sudo /etc/init.d/networking restart
sudo /etc/init.d/network restart

---省略---
eth1      Link encap:Ethernet  HWaddr 08:00:27:c1:08:e6
          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fec1:8e6/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:10332 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5465 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1084346 (1.0 MB)  TX bytes:810938 (810.9 KB)
---省略---

これでMacのターミナルからSSHでログインできるようになった。
試しにMacのターミナルからログインしてみる。

Hyperledger Fabricを起動する

各プロセスを起動する

tmuxで複数プロセスを起動する必要がある(別のターミナルを開いてもできる)。

### CAサーバ起動
# hyperledger環境上
cd /opt/gopath/src/github.com/hyperledger/
## git cloneがうまくいってなかったようなので一度fabricを削除してgit clone しなおす
rm -rf fabric
git clone https://github.com/hyperledger-archives/fabric.git
cd fabric
make membersrvc

# tmux上でCAサーバーを起動する
tmux
cd /opt/gopath/src/github.com/hyperledger/fabric
./build/bin/membersrvc

Control + B -> D で脱出

### tmux上でValidating Peerを起動
## Peerがビルドされていなかったため、ビルドする
cd /opt/gopath/src/github.com/hyperledger/fabric
make peer
tmux
cd /opt/gopath/src/github.com/hyperledger/fabric
CORE_SECURITY_ENABLED=True CORE_SECURITY_PRIVACY=True ./build/bin/peer node start --peer-chaincodedev

Control + B -> D で脱出


### tmux上でチェーンコードプロセスの起動
cd /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02/
go build

tmux
cd /opt/gopath/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:30303 ./chaincode_example02

トランザクションを試す

Hyperledgerのトランザクションは「deploy」「invoke」「query」の3つある。

チェーンコード呼ばれる各トランザクションを処理するプログラムがあり、「deploy」はチェーンコードとデプロイするトランザクション。
「invoke」は送金などの処理を行うトランザクション。
「query」は現在の残高などを確認するトランザクション。

今動かしている「chaincode_example02」というチェーンコードは上の説明どおりだが、実際にはもっと抽象的で、「deploy」と「invoke」はデータ(ワールドステートと呼ぶ)を作成、更新するトランザクションで、「query」は参照するのみのトランザクション、らしい。

とにかく人を作って、送金して、送金を確認してみる。
jimというサンプルユーザーがあるので、jimを使う。


### ログインして、deployトランザクションを実行してチェーンコードをdeployする
### umentuに100、umentaに0金額を設定する
peer network login jim -p 6avZQLwcUe9b
CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode deploy -u jim -l golang -n mycc -c '{"Function": "init", "Args": ["umentu", "100", "umenta": 0]}'


### invokeトランザクションを実行
### umentuからumentaに30送金する
CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode invoke -u jim -l golang -n mycc -c '{"Function": "invoke", "Args": ["umentu", "umenta", "30"]}'

### query トランザクションを実行する
### umentaとumentuの残高を確認する

CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u jim -l golang -n mycc -c '{"Function": "query", "Args": ["umenta"]}'
30
CORE_SECURITY_ENABLED=true CORE_SECURITY_PRIVACY=true peer chaincode query -u jim -l golang -n mycc -c '{"Function": "query", "Args": ["umentu"]}'
70

実際に送金できている。

まとめ

とりあえず動いたので、今後は理解に努める。理解できたら更新していく。

共有:

いいね:

いいね読み込み中...

Hyperledgerblockchain,Hyperledger,ブロックチェーン

Posted by umentu_blog