2018年12月24日月曜日

Hyperledger Fabric 暗号化機能を使ってみる

チェーンコードがワールドステートにKVS情報を登録する際、デフォルトでは平文で登録される。
Fabricが提供するチェーンコード関数(shim)において、暗号化・復号化関数を使ってKVS情報を暗号化・復号化してみる。

➀最初に、必要なパッケージをgovendorでインストールする。

# cd /opt/src/github.com/hyperledger/fabric-samples/chaincode/enccc_example
# go get github.com/kardianos/govendor
# govendor init
# govendor add +external
#  ls -l vendor/
合計 44
drwxr-xr-x. 22 root root  4096 12月 24 16:06 github.com
drwxr-xr-x.  5 root root    47 12月 24 16:06 go.uber.org
drwxr-xr-x.  3 root root    15 12月 24 16:06 golang.org
drwxr-xr-x.  4 root root    34 12月 24 16:06 google.golang.org
drwxr-xr-x.  3 root root    21 12月 24 16:06 gopkg.in
-rw-r--r--.  1 root root 39682 12月 24 16:06 vendor.json

②チェーンコードをインストールする。ここでは、Fabric付属のサンプルソースを利用する。

#peer chaincode install -n bushido -v 1.0 -l golang -p github.com/chaincode/enccc_example
#
# peer chaincode instantiate -o orderer.example.com:7050 -C bushido -n bushido -l golang -v 1.0 -c '{"Args":[]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem

③共通鍵を作成する。サポートしてる暗号アルゴリズムはAES 256bit。

# ENCKEY=`openssl rand 32 -base64` && DECKEY=$ENCKEY
#  echo $ENCKEY
hVhA7CxStLauw9/aLBnieoC9dM237fQHPvU8ibS1MyY=
#
# IV=`openssl rand 16 -base64`

➃データを暗号化してワールドステートに登録する。
transientオプションに暗号化鍵を指定する。暗号化鍵はワールドステートには登録されない。

# peer chaincode invoke -n bushido -C bushido -c '{"Args":["ENCRYPT","key2","value2"]}' --transient "{\"ENCKEY\":\"$ENCKEY\",\"IV\":\"$IV\"}" --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem

⑤復号化してワールドステートから値を取得する。
transientオプションに復号化鍵(=暗号化鍵)を指定する。

#  peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"$DECKEY\"}"
value2

ためしに、復号化鍵(DECKEY)に誤った値を指定した場合、以下のエラーが発生する。

・hogeとした場合
#  peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"hoge\"}"
failed: Failed importing key with opts [&{true}]: Invalid Key Length [3]. Must be 32 bytes"

・32バイトの適用な値を指定した場合
# peer chaincode query -n bushido -C bushido -c '{"Args":["DECRYPT","key2"]}' --transient "{\"DECKEY\":\"111222xStLauw9/aLBnieoC9dM237fQHPvU8ibS1MyY=\"}"

Error: endorsement failure during query. response: status:500 message:"getStateAndDecrypt failed, err Invalid pkcs7 padding (unpadding > aes.BlockSize || unpadding == 0)\nFailed decrypting with opts [&{[] <nil>}]\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/bccsp/sw.(*CSP).Decrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/bccsp/sw/impl.go:303\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/ext/entities.(*BCCSPEncrypterEntity).Decrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/ext/entities/entities.go:246\nmain.getStateAndDecrypt\n\t/chaincode/input/src/github.com/chaincode/enccc_example/utils.go:40\nmain.(*EncCC).Decrypter\n\t/chaincode/input/src/github.com/chaincode/enccc_example/enccc_example.go:76\nmain.(*EncCC).Invoke\n\t/chaincode/input/src/github.com/chaincode/enccc_example/enccc_example.go:182\ngithub.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim.(*Handler).handleTransaction.func1\n\t/chaincode/input/src/github.com/chaincode/enccc_example/vendor/github.com/hyperledger/fabric/core/chaincode/shim/handler.go:273\nruntime.goexit\n\t/opt/go/src/runtime/asm_amd64.s:1333"



2018年12月9日日曜日

Fabric Javaチェーンコードをつかってみる

Hyperledger Fabric 1.3から、Java版チェーンコードが正式サポートされた。
Java版チェーンコードを使ってみる。

Javaチェーンコードを利用する際の前提条件は以下のとおり。
・JDK 1.8がインストール済みであること。
・gradle 2.12以上がインストール済みであること。

➀各PeerにJavaチェーンコードをインストールする。
※Fabricでは、Javaチェーンコードのサンプルが提供されており、今回はそれを利用する。

# peer chaincode install -n bushido -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/
#
# CORE_PEER_ADDRESS="peer0.org2.example.com:7051"
# CORE_PEER_LOCALMSPID="Org2MSP"
# CORE_PEER_MSPCONFIGPATH="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp"
# CORE_PEER_TLS_CERT_FILE="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.crt"
# CORE_PEER_TLS_KEY_FILE="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/server.key"
# CORE_PEER_TLS_ROOTCERT_FILE="/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"
# peer chaincode install -n bushido -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/

②チェーンコードのinstantiateを行う。

# peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt  -C bushido -n bushido -l java -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"

③Javaチェーンコードのコンテナが作成されていることを確認する。

# docker ps | grep bushido
84bb5c2aa994        dev-peer0.org1.example.com-bushido-1.0-92aca216667084484fba82d74149bf26ec36672612d5608a67bb2b0694ade7d7   "/root/chaincode-jav…"   5 minutes ago       Up 5 minutes                                                           dev-peer0.org1.example.com-bushido-1.0

➃QUERYやINVOKEを行うことができることを確認する。
# peer chaincode query -C bushido -n bushido -c '{"Args":["query","a"]}'
100
# peer chaincode query -C bushido -n bushido -c '{"Args":["query","b"]}'
200

<補足>
Javaチェーンコードのログを閲覧すると、以下のようなログが出力される。

[root@localhost first-network]# docker logs -f --tail 30 dev-peer0.org1.example.com-bushido-1.0
Dec 09, 2018 3:43:12 AM org.hyperledger.fabric.shim.ChaincodeBase newChannelBuilder
INFO: Configuring channel connection to peer.
Dec 09, 2018 3:43:14 AM org.hyperledger.fabric.example.SimpleChaincode init
INFO: Init java simple chaincode
Dec 09, 2018 3:43:14 AM org.hyperledger.fabric.example.SimpleChaincode init
INFO: account a, value = 100; account b, value 200
Dec 09, 2018 3:45:52 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:45:52 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: a, Amount: 100

Dec 09, 2018 3:45:57 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:45:57 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: a, Amount: 100

Dec 09, 2018 3:46:03 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:46:03 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: a, Amount: 100

Dec 09, 2018 3:46:52 AM org.hyperledger.fabric.example.SimpleChaincode invoke
INFO: Invoke java simple chaincode
Dec 09, 2018 3:46:52 AM org.hyperledger.fabric.example.SimpleChaincode query
INFO: Query Response:
Name: b, Amount: 200

Linux gradleインストール手順

CentOS上にgradleをインストールする。

➀以下のサイトからgradleのインストール媒体をダウンロードする。

https://gradle.org/next-steps/?version=4.10.3&format=bin

②gradle用のフォルダを作成する。

# mkdir /opt/gradle
# mv /tmp/gradle-4.10.3-bin.zip  /opt/gradle
# cd /opt/gradle

③インストール媒体を解凍する。

# unzip -d /opt/gradle gradle-4.10.3-bin.zip

➃ 解凍後、中身を確認する。

# ls -l /opt/gradle/gradle-4.10.3
合計 216
-rw-rw-r--. 1 root root  55261 11月 29 01:04 LICENSE
-rw-rw-r--. 1 root root    802 11月 29 01:04 NOTICE
drwxr-xr-x. 2 root root     38 12月  5 01:54 bin
-rw-rw-r--. 1 root root 151483 12月  5 01:53 getting-started.html
drwxrwxr-x. 2 root root     24 11月 29 01:04 init.d
drwxr-xr-x. 3 root root   4096 12月  5 01:54 lib
drwxrwxr-x. 2 root root    263 11月 29 01:04 media

⑤gradleのパスを通す。

# export PATH=$PATH:/opt/gradle/gradle-4.10.3/bin

⑥gradleのバージョンを確認する。

# gradle -v

Welcome to Gradle 4.10.3!

Here are the highlights of this release:
 - Incremental Java compilation by default
 - Periodic Gradle caches cleanup
 - Gradle Kotlin DSL 1.0-RC6
 - Nested included builds
 - SNAPSHOT plugin versions in the `plugins {}` block

For more details see https://docs.gradle.org/4.10.3/release-notes.html


------------------------------------------------------------
Gradle 4.10.3
------------------------------------------------------------

Build time:   2018-12-05 00:50:54 UTC
Revision:     e76905e3a1034e6f724566aeb985621347ff43bc

Kotlin DSL:   1.0-rc-6
Kotlin:       1.2.61
Groovy:       2.4.15
Ant:          Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM:          1.8.0_191 (Oracle Corporation 25.191-b12)
OS:           Linux 3.10.0-862.el7.x86_64 amd64

Hyperledger Fabric バッチサイズ変更手順

FabricのOrdererがブロックを生成する際、デフォルト設定では、以下のタイミングでブロックが作られる。

  タイムアウト時間:2秒
      または
      トランザクション数:10個

ブロックチェーンコンソーシアムを構築した後、運用中にトランザクション数を変更する手順を説明する。

➀CONFIGブロックを取得する。

# docker exec -it cli bash
# peer channel fetch config config.bc -o orderer.example.com:7050 -c bushido --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt 

②CONFIGブロック(バイナリ)をJSON形式にデコードする。このとき、Envelopeメッセージ等は除外する。

# configtxlator proto_decode --input config.bc --type common.Block | jq .data.data[0].payload.data.config > config.json

③今回はトランザクション数を10→5に変更することにする。

# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count" "config.json"
10
# jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count = 5"  "config.json" > "update_config.json"
jq ".channel_group.groups.Orderer.values.BatchSize.value.max_message_count" "update_config.json"
5

➃「config.json」と「update_config.json」の差分値をシミレーションする。

#configtxlator proto_encode --input config.json --type common.Config > config.bc
#configtxlator proto_encode --input update_config.json --type common.Config > update_config.bc

#configtxlator compute_update --channel_id bushido --original config.bc --updated update_config.bc --output update_config_2.bc

⑤シミレーション結果で生成された「update_config_2.bc」をJSON形式にデコードする。

#configtxlator proto_decode --input update_config_2.bc --type common.ConfigUpdate | jq . > update_config_2.json

⑥Envelopeメッセージをラッピングする。


#echo '{"payload":{"header":{"channel_header":{"channel_id":"bushido", "type":2}},"data":{"config_update":'$(cat update_config_2.json)'}}}' | jq . > update_config_2_envelope.json

⑦「update_config_2_envelope.json」をバイナリ形式にエンコードする。

#configtxlator proto_encode --input update_config_2_envelope.json --type common.Envelope --output update_config_2_envelope.bc

⑧「update_config_2_envelope.bc」に対して、PEERの署名を行う。
(Endorsing Policyを満たす分、署名を付与する必要あり)

# peer channel signconfigtx -f update_config_2_envelope.bc

⑨チャネルを更新する。

# peer channel update -f update_config_2_envelope.bc -c bushido -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt




2018年8月19日日曜日

Hyperledger Fabric 1.2.0 Release版 インストール

インストールの流れは、1.1.0 Release版とほぼ同じである。
v1.1.0 Release版の手順は以下を参照。

http://memoyasu.blogspot.com/2018/04/hyperledger-fabric-110relase.html


1.1.0と1.2.0の手順の差分は以下。

①Fabaricソース一式をクローンする際、ブランチ名を変更すること。

# git clone -b v1.2.0 https://github.com/hyperledger/fabric.git
# git clone -b v1.2.0  https://github.com/hyperledger/fabric-ca.git

②サードパーティDockerイメージをダウンロードする必要がある。
コマンドは以下を実行する。

make docker-thirdparty

なお、make dockerコマンドで作成されるDockerイメージは以下。



<補足>
・Goのバージョンは1.10.Xを利用すること。
・環境変数には以下を設定すること。
GOROOT=/usr/local/go/bin (GOのビルドパス)
GOPATH=/opt                        (Fabricのソースパス)

2018年7月8日日曜日

Hyperledger FabricのCapability機能

Hyperledger Fabric では、大規模なブロックチェーンネットワークを構成することを想定し、異なるバージョンのPEERとORDERERが混在できるように、プロトコルの互換性を確保している (Capability機能という)。
Fabric Java SDKはv1.1を利用し、PEER/ORDERER/CAはv1.2を利用するブロックチェーン環境において、ユーザのenroll、チェーンコードをINVOKE/QUERYできるかを実機検証してみる。



実機確認結果
全てのインターフェースで、互換性を確認できた。

PEERに対するINVOKE:OK
Fabric SDKからPEERへのプロポーザル送信
DEBUG Channel - Channel mychannel got back from peer peer0.org1.example.com status: 200, message: 

Fabric SDKからOrdererへのトランザクション送信
DEBUG OrdererClient - resp status value: 200, resp: SUCCESS

PEERからFabric SDKへのブロック通知
DEBUG EventHub - EventHub eventhub01 got  event type: BLOCK

PEERに対するQUERY:OK
INFO  HFJavaSDKBasicExample - [{"Key":"CAR0", "Record":{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR12", "Record":{"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR13", "Record":{"colour":"Black","make":"Honda","model":"Accord","owner":"Tom"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

CAでのユーザ認証: OK
DEBUG HFClient - Setting user context to MSPID: Org1MSP user: admin










Ubuntu 16.04にGo 1.10.1 をインストール

# sudo apt-get update
# sudo apt-get -y upgrade

★apt-get update実行中に以下のエラーが発生したら、PGPキーをインストールする

E: コマンドラインオプション 'y' [-y から] は、ほかのオプションとの組み合わせで理解できません。
root@bushidoyasu-VirtualBox:/opt/fabric/src/github.com/hyperledger/fabric/examples/e2e_cli# upgradeapt-key adv --keyserver keyserver.ubuntu.com --r
ecv-keys 308C15A29AD198E9

# apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 308C15A29AD198E9
Executing: /tmp/tmp.W5FVqzn8iJ/gpg.1.sh --keyserver
keyserver.ubuntu.com
--recv-keys
308C15A29AD198E9
gpg: 鍵9AD198E9をhkpからサーバkeyserver.ubuntu.comに要求
gpg: 鍵9AD198E9: 公開鍵"Launchpad PPA for The Go Language Gophers"をインポートしました
gpg: 処理数の合計: 1
gpg:               インポート: 1  (RSA: 1)



# sudo curl -O https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz
# sudo tar -xvf go1.10.1.linux-amd64.tar.gz
# sudo mv go /usr/local
# vi  ~/.profile
★以下のパスを追加する
export PATH=$PATH:/usr/local/go/bin
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
# source ~/.profile

# go version
go version go1.10.1 linux/amd64

Hyperledger Fabric 1.1以降で追加されたPEERコマンド

Hyperledger Fabric 1.1以降では、PEERコマンドの機能が大幅に強化された。
新規に追加されたPEERコマンドを使ってみる。

ピアにInstalledされたチェーンコード一覧の取得

# peer chaincode list --installed -C mychannel
Get installed chaincodes on peer:
Name: fabcar, Version: 1.0, Path: github.com/fabcar/go, Id: 4846dcee8e67da7d20eac366587b897cf3906c5fc90a2357f4849aec01fc5358

<解説>
対象のPEERに、以下のチェーンコード名、バージョン、パス、チェーンコードIDがインストールされている

チェーンコード名:fabcar
バージョン:1.0
パス:github.com/fabcar/go
チェーンコードID:4846dcee8e67da7d20eac366587b897cf3906c5fc90a2357f4849aec01fc5358

ピアにInstantiatedされたチェーンコード一覧の取得

# peer chaincode list --instantiated -C mychannel
Get instantiated chaincodes on channel mychannel:
Name: fabcar, Version: 1.0, Path: github.com/fabcar/go, Escc: escc, Vscc: vscc

<解説>
対象のPEERに、以下のチェーンコード名、バージョン、パス、ESCC名、VSCC名がinstantiateされている。

チェーンコード名:fabcar
バージョン:1.0
パス:github.com/fabcar/go
ESCC名:escc  (デフォルトのシステムチェーンコード)
VSCC名:vscc(デフォルトのシステムチェーンコード)

PEERが所属するチャネル名一覧の取得

# peer channel list
2018-07-08 05:59:01.746 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Channels peers has joined:
mychanne
#

ブロックチェーン情報の取得

# peer channel getinfo -c mychannel
2018-07-08 06:01:37.432 UTC [channelCmd] InitCmdFactory -> INFO 001 Endorser and orderer connections initialized
Blockchain info: {"height":3,"currentBlockHash":"01gwIBF3LEjesqG/FPAx43jtFFLZv0isOXYXqvbZTPY=","previousBlockHash":"PpP80dqWT2gS8Cwalw8JtIkD0eP5YkxuEih9syr9fSE="}
#

PEERの起動状況の確認

#peer node status
status:STARTED

PEERの起動

# peer node start


そのほか


  • チェーンコードをアンインストールするコマンドは現時点では提供されていない。
  • PEERを停止するコマンドは現時点では提供されていない。
  • 2つ以上のEndorsing Peerの署名が必要なINVOKEは、PEERコマンドでは実行できない(1つのEndorsing Peerしかプロポーザルをなげることができないため)。





Node.jsとnpmを最新バージョンにアップグレード

現状のバージョン


# npm -v
3.5.2

# node --version
v4.2.6

nのインストール

#npm install -g n

nodeの安定版と最新版のバージョン確認

# n --stable
10.6.0

#n --latest
10.6.0

最新バージョンのnodeへアップグレード

# n latest

     install : node-v10.6.0
       mkdir : /usr/local/n/versions/node/10.6.0
       fetch : https://nodejs.org/dist/v10.6.0/node-v10.6.0-linux-x64.tar.gz
######################################################################## 100.0%
   installed : v10.6.0
#

最新バージョンのnpmへアップグレード

#npm update -g npm
# npm -v
3.5.6



2018年4月1日日曜日

Hyperledger Fabric 1.1.0 Relase版 インストール

2018/3/20に公開されたHyperledger Fabric 1.1.0 Release版を、ソースからビルドする。

<前提>
・DockerおよびGOがインストール済みであること。

①FabricとFabric-caのソース一式をクローンする。

# git clone -b v1.1.0 https://github.com/hyperledger/fabric.git
# git clone -b v1.1.0  https://github.com/hyperledger/fabric-ca.git
# mkdir -p /opt/fabric/src/github.com/hyperledger/
# cp -rf fabric /opt/fabric/src/github.com/hyperledger
# cp -rf fabric-ca /opt/fabric/src/github.com/hyperledger

②環境変数を設定する。

# export GOPATH=/opt/fabric
# export GOHOME=/opt/fabric

③Fabricのdockerイメージを作成する

# cd $GOHOME/src/github.com/hyperledger/fabric/
# make docker

以下のエラーが発生した場合は、
protoc-gen-goを手動でダウンロードする。

------
cp build/docker/gotools/bin/protoc-gen-go build/bin/chaintool build/goshim.tar.bz2 build/image/ccenv/payload
cp: cannot stat `build/docker/gotools/bin/protoc-gen-go': そのようなファイルやディレクトリはありません
make: *** [build/image/ccenv/payload] エラー 1
------

# go get -u github.com/golang/protobuf/protoc-gen-go
# cp $GOPATH/bin/protoc-gen-go build/docker/gotools/bin/

➃Fabric-caのdockerイメージを作成する

# cd $GOHOME/src/github.com/hyperledger/fabric-ca/
# make docker

⑤Dockerイメージが作成されていることを確認する。




2017年11月14日火曜日

最新のOpenSSL 1.1.0シリーズにアップデート

最新のOpenSSL 1.1.0シリーズにアップデートする手順を説明する。

# cd /usr/local/src/
#  wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz
# tar xvzf openssl-1.1.0g.tar.gz
#  cd openssl-1.1.0g/
# ./config -fPIC shared --prefix=/usr
# make
# make install
# openssl version
OpenSSL 1.1.0g  2 Nov 2017

2017年11月12日日曜日

KeycloakをPostgreSQLに対応させる

KeycloakはデフォルトではH2が利用される。
今回は、PostgreSQLを利用するように環境設定を変更する。

前提
・「http://memoyasu.blogspot.jp/2017/11/ssoosskeycloak.html」の手順でKeycloakが動作していること。
・PostgreSQLが動作していること。
・PostgreSQLのログインユーザを作成済みであること。

postgres=# CREATE USER loginuser WITH PASSWORD 'password' CREATEDB;
CREATE ROLE

・「keycloak」というデータベースを作成済みであること。

postgres=# CREATE DATABASE keycloak OWNER loginuser;
CREATE DATABASE
postgres=#

手順
①PostgreSQL用のJDBCドライバをダウンロードする。
今回は「postgresql-9.4.1212.jar」を利用する。

https://jdbc.postgresql.org/download.html

②ドライバJARをモジュールにパッケージ化し、このモジュールをサーバーにインストールする。
「modules\system\layers\keycloak」ディレクトリ配下に「org\postgresql\main」ディレクトリを作成する。

> mkdir modules\system\layers\keycloak\org\postgresql\main
> copy postgresql-9.4.1212.jar modules\system\layers\keycloak\org\postgresql\main

③サーバの設定プロファイルでJDBCドライバを利用するようにする。
「modules\system\layers\keycloak\org\postgresql\main」ディレクトリ配下にmodule.xmlを作成する。

<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.3" name="org.postgresql">

    <resources>
        <resource-root path="postgresql-9.4.1212.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>


➃PostgreSQLのJDBCドライバを使用するようにデータソース設定を変更する。
standaloneモードで動作している場合は「​standalone/configuration/standalone.xml」を修正する。

・・・
            <datasources>
                ・・・
                <drivers>
                    <driver name="postgresql" module="org.postgresql">                                 ★追加
                        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>    ★追加
                    </driver>                                                                          ★追加
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
・・・

⑤PostgreSQLへの接続パラメータを定義するようにデータソース設定を変更する。

        <subsystem xmlns="urn:jboss:domain:datasources:5.0">
            <datasources>
・・・
                <!-- ★コメントアウト
                <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:h2:${jboss.server.data.dir}/keycloak;AUTO_SERVER=TRUE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
                -->
                <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true">
            <connection-url>jdbc:postgresql://localhost:5432/keycloak</connection-url>
            <driver>postgresql</driver>
            <pool>
                <max-pool-size>20</max-pool-size>
            </pool>
            <security>
                <user-name>loginuser</user-name>
                <password>XXX</password>
            </security>
        </datasource>
                <drivers>
                    <driver name="postgresql" module="org.postgresql">
                        <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
                    </driver>
                    <driver name="h2" module="com.h2database.h2">
                        <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
                    </driver>
                </drivers>
            </datasources>
        </subsystem>

⑥Keycloakを再起動する。

⑦以下のURLにアクセスし、ユーザを作成した後、ログインできることを確認する。


http://localhost:8080/auth/




<補足>
・PostgreSQLのテーブルを参照し、作成したユーザが表示されることを確認してみる。

keycloak=>
keycloak=> select * from user_entity;
                  id                  | email |           email_constraint           | email_verified | enabled | federation_link | first_name | last_name | realm_id | username | created_timestamp | service_account_client_link | not_before --------------------------------------+-------+--------------------------------------+----------------+---------+-----------------+------------+-----------+----------+----------+-------------------+-----------------------------+------------ 721569fb-860e-4343-98a6-7da4e1810c5e |       | 273582fe-df93-4c92-a80d-1dead0c0b192 | f              | t       |                 |            |           | master   | test     |     1510489536041 |                             |          0
(1 行)


SSOのOSSである「Keycloak」を動かしてみる 

要件
・Java 8 JDK
・RAM: 512MB以上
・ディスク容量: 1GB以上
・データベース:Postgres, MySql, Oracle, etc
★クラスターで運用したい場合はRDBの冗長化が必須。
・Linux OSでインストールする場合、十分なエントロピーを確保するため、/dev/urandomを利用すること。

・Keycloackでは、standaloneモードとクラスターモードをサポートしている。今回はstandaloneモードで起動する。
・standaloneモードで起動すると、バンドルしているWildFlyが起動する。
・デフォルトのDBは、バンドルしているH2が利用される。

インストール手順
①以下のサイトからKeyclockの資材をダウンロードする。
  (3.4.0が最新版)

https://downloads.jboss.org/keycloak/3.4.0.Final/keycloak-3.4.0.Final.zip

②「keycloak-3.4.0.Final.zip 」を解凍する。

③keycloakを起動する。

> cd C:\Users\bushidoyasu\Downloads\keycloak-3.4.0.Final\keycloak-3.4.0.Final\bin
> standalone.bat

上記のバッチを実行すると、デフォルトではポート9990で起動する。

➃管理ユーザを作成する。

C:\Users\bushidoyasu\Downloads\keycloak-3.4.0.Final\keycloak-3.4.0.Final\bin>add-user.bat

What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a): a

Enter the details of the new user to add.
Using realm 'ManagementRealm' as discovered from the existing property files.
Username : keycloakadmin
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
 - The password should be different from the username
 - The password should not be one of the following restricted values {root, admin, administrator}
 - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
Password :
Re-enter Password :
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[  ]:
About to add user 'keycloakadmin' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'keycloakadmin' to file 'C:\Users\bushidoyasu\Downloads\keycloak-3.4.0.Final\keycloak-3.4.0.Final\standalone\configuration\mgmt-users.properties'
Added user 'keycloakadmin' to file 'C:\Users\bushidoyasu\Downloads\keycloak-3.4.0.Final\keycloak-3.4.0.Final\domain\configuration\mgmt-users.properties'
Added user 'keycloakadmin' with groups  to file 'C:\Users\bushidoyasu\Downloads\keycloak-3.4.0.Final\keycloak-3.4.0.Final\standalone\configuration\mgmt-groups.properties'
Added user 'keycloakadmin' with groups  to file 'C:\Users\bushidoyasu\Downloads\keycloak-3.4.0.Final\keycloak-3.4.0.Final\domain\configuration\mgmt-groups.properties'
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value="XXX" />
続行するには何かキーを押してください . . .

⑤以下のURLにアクセスすると、BASIC認証が求められる。

http://localhost:9990/console/App.html

BASIC認証に成功すると、以下の管理画面が表示される。



⑥Keycloak用の管理ユーザを作成する。

>add-user-keycloak.bat -u test -p password
Added 'test' to 'C:\Users\bushidoyasu\Downloads\keycloak-3.4.0.Final\keycloak-3.4.0.Final\standalone\configuration\keycloak-add-user.json', restart server to load user

⑦Keycloakを再起動する。

⑧以下のURLにアクセスし、ログインできることを確認する。




<補足>
H2コンソールを起動し、データベースの中身をみてみる。

> java -cp ..\modules\system\layers\base\com\h2database\h2\main\h2-1.4.193.jar org.h2.tools.Server -webAllowOthers

keycloakというデータベースをのぞいてみても、何もテーブルが作られていない。。。




Hyperledger Fabric v1.1.0-preview ソースからdockerイメージをビルドする。

Fabric  v1.1.0-previewをソースからdockerイメージをビルドする手順。

①FabricとFabric-caのソース一式をクローンする。

# git clone -b v1.1.0-preview https://github.com/hyperledger/fabric.git
# git clone -b v1.1.0-preview https://github.com/hyperledger/fabric-ca.git
# mkdir -p /opt/fabric/src/github.com/hyperledger/
# cp -rf fabric /opt/fabric/src/github.com/hyperledger
# cp -rf fabric-ca /opt/fabric/src/github.com/hyperledger

②環境変数を設定する。

# export GOPATH=/opt/fabric
# export GOHONE=/opt/fabric

③Fabricのdockerイメージを作成する。

# cd $GOHOME/src/github.com/hyperledger/fabric/
# make docker

以下のエラーが発生した。。。
・・・
+ wget -q http://www.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
The command '/bin/sh -c set -x     && cd /     && wget -q "http://www.apache.org/dist/zookeeper/$DISTRO_NAME/$DISTRO_NAME.tar.gz"     && tar -xzf "$DISTRO_NAME.tar.gz"     && mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR"     && rm -r "$DISTRO_NAME.tar.gz"' returned a non-zero code: 8
Makefile:205: recipe for target 'build/image/zookeeper/.dummy-x86_64-0.7.0-snapshot-c7b3fe0' failed

http://www.apache.org/dist/zookeeper にアクセスしてみると
zookeeper-3.4.9.tar.gzがなく、バージョンが3.4.10以降しかなかった。。。

とりあえず、3.4.10でダウンロードするようにDockerfileを修正する。

# vi build/image/zookeeper/Dockerfile
★以下を変更。
ARG DISTRO_NAME=zookeeper-3.4.10

# make docker
# docker images
REPOSITORY                     TAG                    IMAGE ID            CREATED              SIZE
hyperledger/fabric-tools       latest                 fdd9c70d1af3        27 seconds ago       1.42GB
hyperledger/fabric-tools       x86_64-1.1.0-preview   fdd9c70d1af3        27 seconds ago       1.42GB
hyperledger/fabric-couchdb     latest                 866f7fc6e93e        35 seconds ago       1.58GB
hyperledger/fabric-couchdb     x86_64-1.1.0-preview   866f7fc6e93e        35 seconds ago       1.58GB
hyperledger/fabric-kafka       latest                 e9f5f8d5f1d4        About a minute ago   1.37GB
hyperledger/fabric-kafka       x86_64-1.1.0-preview   e9f5f8d5f1d4        About a minute ago   1.37GB
hyperledger/fabric-zookeeper   latest                 f9fe6dffc638        2 minutes ago        1.39GB
hyperledger/fabric-zookeeper   x86_64-1.1.0-preview   f9fe6dffc638        2 minutes ago        1.39GB
<none>                         <none>                 d72c30ec06cb        3 minutes ago        1.33GB
hyperledger/fabric-testenv     latest                 6bf3e40d7f08        3 minutes ago        1.52GB
hyperledger/fabric-testenv     x86_64-1.1.0-preview   6bf3e40d7f08        3 minutes ago        1.52GB
hyperledger/fabric-buildenv    latest                 0824a7249f44        3 minutes ago        1.41GB
hyperledger/fabric-buildenv    x86_64-1.1.0-preview   0824a7249f44        3 minutes ago        1.41GB
hyperledger/fabric-orderer     latest                 76603b1f0f3e        4 minutes ago        159MB
hyperledger/fabric-orderer     x86_64-1.1.0-preview   76603b1f0f3e        4 minutes ago        159MB
hyperledger/fabric-peer        latest                 fcc5a0e8ea59        4 minutes ago        165MB
hyperledger/fabric-peer        x86_64-1.1.0-preview   fcc5a0e8ea59        4 minutes ago        165MB
hyperledger/fabric-javaenv     latest                 fb70e2629d32        4 minutes ago        1.49GB
hyperledger/fabric-javaenv     x86_64-1.1.0-preview   fb70e2629d32        4 minutes ago        1.49GB
hyperledger/fabric-ccenv       latest                 9203193f9935        5 minutes ago        1.35GB
hyperledger/fabric-ccenv       x86_64-1.1.0-preview   9203193f9935        5 minutes ago        1.35GB
hyperledger/fabric-baseimage   x86_64-0.4.2           76daf60aeff4        6 weeks ago          1.33GB
hyperledger/fabric-baseos      x86_64-0.4.2           6be1916d236d        6 weeks ago          130MB

➃Fabric-caのdockerイメージを作成する。

# cd $GOHOME/src/github.com/hyperledger/fabric-ca/
# make docker
# docker images | grep fabric-ca
hyperledger/fabric-ca-tools     latest                 6164429ffed0        2 hours ago         1.5GB
hyperledger/fabric-ca-tools     x86_64-1.1.0-preview   6164429ffed0        2 hours ago         1.5GB
hyperledger/fabric-ca-peer      latest                 13e583a4648b        2 hours ago         206MB
hyperledger/fabric-ca-peer      x86_64-1.1.0-preview   13e583a4648b        2 hours ago         206MB
hyperledger/fabric-ca-orderer   latest                 a88ff1f89153        2 hours ago         200MB
hyperledger/fabric-ca-orderer   x86_64-1.1.0-preview   a88ff1f89153        2 hours ago         200MB
hyperledger/fabric-ca           latest                 0a056a6cbdc1        2 hours ago         218MB
hyperledger/fabric-ca           x86_64-1.1.0-preview   0a056a6cbdc1        2 hours ago         218MB

<補足>
チェーンコードのコンテナ作成時に利用されるfabric-ccenvにおいて、shimのソースが解凍されていない問題が発生した。
fabric-ccenvコンテナを作成してログインし、確認してみてみる。

root@7c26bd340479:/opt/gopath# ls -l $GOPATH/src/
total 0
-rw-r--r-- 1 root root 0 Nov 12 14:36 goshim.tar.bz2

解凍されないまま、tar.bz2ファイルがある。
しかも、0バイトになっている。。。。

上記の事象が発生した場合は、make peerでコンパイルしてgoshim.tar.bz2を作成した後、所定の位置にコピーする。
その後、make docker-clean&make dockerを実行する。

# apt-get install libltdl-dev
# make peer
# cp build/goshim.tar.bz2 build/image/ccenv/payload/
# make docker-clean
# make docker

Docker 便利コマンドメモ


  • dockerイメージ 全削除

# docker rmi -f $(docker images -q)
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
#


  • dockerコンテナ 全削除

# docker rm -f $(docker ps -aq)
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
#

2017年11月3日金曜日

Hyperledger Fabric Exploreを動かしてみる

Hyperledger Fabric ExploreがFabric 1.0.0に対応したということなので動かしてみる。

1.要件
・nodejs 6.9.x
・mysql 5.7 以上

2.インストール手順

①blockchain-explore資材のダウンロード
# git clone https://github.com/hyperledger/blockchain-explorer.git
# cd blockchain-explorer

②MySQLのインストール
# sudo apt install mysql-server
※インストール中にrootのパスワードを設定する。

③MySQLにrootでログインできることを確認する。
# mysql -u root -p
Enter password: XXX
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

➃MySQL用のデータベースを作成する。「fabricexplorer」というExplore専用のデータベースが作成される。
# mysql -u root  -p < db/fabricexplorer.sql
Enter password: XXX

ue'
Password: eiMiKcDTWwyJ
⑤Fabric向けの環境情報を設定する。
# vi config.json
★Fabricの環境にあわせて設定する
{
   "host":"localhost",
   "port":"8080",                           ★外部に公開するポート
   "channelsList": ["mychannel"], ★チャネルのリストを設定
   "GOPATH":"/usr/bin/go",
   "keyValueStore":"/tmp/fabric-client-kvs",
   "eventWaitTime":"30000",
   "enableTls":false,
   "users":[
      {
         "username":"admin",          ★CA管理ユーザ
         "secret":"XXX"
      }
   ],
   "mysql":{                                 ★MySQLの環境設定
      "host":"127.0.0.1",
      "port":"3306",
      "database":"fabricexplorer",
      "username":"root",
      "passwd":"XXX"
   }
}

#  vi ./app/network-config.json
★以下を環境に合わせて修正する。
★TLS通信を利用する場合は「network-config-tls.json」を修正する。
{
     "network-config": {
      "orderer": [{
        "url": "grpc://127.0.0.1:7050",
        "server-hostname": "orderer0.example.com"
      },{
        "url": "grpc://127.0.0.1:8050",
        "server-hostname": "orderer1.example.com"
      },{
        "url": "grpc://127.0.0.1:9050",
        "server-hostname": "orderer2.example.com"
      }],
      "org1": {
        "name": "peerOrg1",
        "mspid": "Org1MSP",
        "ca": "http://127.0.0.1:7054",
        "peer1": {
            "requests": "grpc://127.0.0.1:7051",
            "events": "grpc://127.0.0.1:7053",
            "server-hostname": "peer0.org1.example.com"
        },
        "peer2": {
            "requests": "grpc://127.0.0.1:8051",
            "events": "grpc://127.0.0.1:8053",
            "server-hostname": "peer1.org1.example.com"
        },
        "admin": {
            "key": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore",
            "cert": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts"
        }
      },
      "org2": {
        "name": "peerOrg2",
        "mspid": "Org2MSP",
        "ca": "http://127.0.0.1:8054",
        "peer1": {
            "requests": "grpc://127.0.0.1:9051",
            "events": "grpc://127.0.0.1:9053",
            "server-hostname": "peer0.org2.example.com"
        },
        "peer2": {
            "requests": "grpc://127.0.0.1:10051",
            "events": "grpc://127.0.0.1:10053",
            "server-hostname": "peer1.org2.example.com"
        },
        "admin": {
            "key": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore",
            "cert": "/fabric-docker-compose-svt/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts"
        }
      }
     }
}

⑥ npmパッケージをインストールする。
# npm install

★失敗するときは、npm rebuild コマンドを実行し、全てリビルド。

⑦ 起動コマンドを実行する。
# ./start.sh

★ポート8080でnodeプロセスが起動する。
★停止したい場合は、pkill node コマンドを実行する。
★ログは同フォルダ配下のlog.logに出力される。

⑧ http://XXX.XXX.XXX.XXX:8080 にアクセスすると以下のようなダッシュボード画面が表示される。
★現状、認証機能はないため、だれでも閲覧可能である。
★PEERLISTに正しいPEER情報が表示されない。
★2つチャネルを作成しているのに、1つしかチャネルが表示されない。










2017年11月2日木曜日

Hyperledger Fabric CAのDBの中身をみてみる

Fabric CAは、デフォルトではSqlite3にユーザ情報や証明書情報が格納される。
Sqlite3のテーブルには実際にどんな情報が格納されているかを確認してみる。

①(事前準備)ホストOS側でsqlite3コマンドをインストールする。

# sudo apt-get install sqlite3 libsqlite3-dev

②CAコンテナからホストOSにsqlite3のdbファイルをコピーする

# sudo docker cp ca_peerOrg2:/etc/hyperledger/fabric-ca-server/fabric-ca-server.db  ./fabric-ca-server.db

③sqlite3コマンドでテーブルを参照する。
★「users」、「certificates」、「affiliations」という3つのテーブルが存在している。

# sqlite3 fabric-ca-server.db
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
sqlite>.table
affiliations  certificates  users

➃テーブルのスキーマ情報を参照する。

sqlite> .schema
CREATE TABLE users (id VARCHAR(64), token bytea, type VARCHAR(64), affiliation VARCHAR(64), attributes VARCHAR(256), state INTEGER,  max_enrollments INTEGER);
CREATE TABLE affiliations (name VARCHAR(64) NOT NULL UNIQUE, prekey VARCHAR(64));
CREATE TABLE certificates (id VARCHAR(64), serial_number blob NOT NULL, authority_key_identifier blob NOT NULL, ca_label blob, status blob NOT NULL, reason int, expiry timestamp, revoked_at timestamp, pem blob NOT NULL, PRIMARY KEY(serial_number, authority_key_identifier));


■usersテーブル

id VARCHAR(64):ユーザID
token bytea:パスワード(暗号化されているっぽい)
type VARCHAR(64):ユーザ種別
affiliation VARCHAR(64):アフィリエーション情報
attributes VARCHAR(256):属性情報
state INTEGER:ステータス
max_enrollments INTEGER:最大ENROLLMENT数。デフォルトは-1(無制限)

■affiationsテーブル
name VARCHAR(64):アフィリエーション名
prekey VARCHAR(64):上位階層のアフィリエーション名

■certificatesテーブル
id VARCHAR(64):ユーザID
serial_number blob:証明書シリアル番号
authority_key_identifier blob:認証局鍵識別子(CA公開鍵のハッシュ値)
ca_label blob:CAの名前
status blob:証明書のステータス
reason int:証明書失効の理由
expiry timestamp:証明書有効期限
revoked_at timestamp:証明書失効日時
pem blob:証明書情報(PEM形式)

<実際の値>

■usersテーブル
sqlite> SELECT * FROM users;
admin|$2a$10$C5UFCN0iFS9PnMkhohevYu3uJPc9pGgY9rb1M77ZWM07gOUKnQ8z6|client||[{"name":"hf.Registrar.Roles","value":"client,user,peer,validator,auditor"},{"name":"hf.Registrar.DelegateRoles","value":"client,user,validator,auditor"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"}]|0|-1

■affiationsテーブル
sqlite> SELECT * FROM affiliations;
org2|
org2.department1|org2
org1|
org1.department1|org1
org1.department2|org1

■certificatesテーブル

2017年9月18日月曜日

Hyperledger Fabric v1.0.0 monitoring blockchainを使ってみる

EPCPノードの監視ツールであるmonitoring blockchainを使ってみる。
ざっとソースを眺めると以下のことが分かった。

・ダッシュボードはOSS Grafanaを利用している模様。
・WebサーバはOSS Spring Bootを利用している模様。
・Grafanaが利用するDBはOSS InfuxDBを利用している模様。
・EPCPノードやCAへの接続処理は、Fabric SDK for Javaは利用している模様。

以下の手順では、EPCPノード、OS、CAは構築済みの 前提。
  1. monitoring blockchainのDockerコンテナをPULLする。

    # docker pull blockchainmonitoring/blockchain-monitoring:latest
  2. Dockerコンテナがダウンロードされたことを確認する。

    # docker images | grep monitoring
    blockchainmonitoring/blockchain-monitoring   latest                          f44f980e709e        35 hours ago        1.1GB
  3. docker-compose.yamlを準備する。
  4. Fabric向けのネットワーク設定ファイル(net-config.yaml)を準備する。
    MSPの設定やCAやEPCPノードのURLを設定する。また、管理ユーザであるadminのprivkeyには秘密鍵、certには公開鍵証明書を指定する。
  5. FABRIC_NET_CONFIGとCERTS_ADMIN環境変数のパスを設定する。
    # export FABRIC_NET_CONFIG=/root/monitoring/net-config.yaml
    # export CERTS_ADMIN=/root/monitoring/certs
  6. docker-composeコマンドでコンテナを作成する。
    # docker-compose up
  7. 以下のURLにアクセスする(XXXは環境に合わせて指定する)。
    http://XXX.XXX.XXX.XXX:3000
  8. ダッシュボード画面が表示されることを確認する。
    EPCPのステータス(UP/DOWN)、チャネル情報、配備されたチェーンコードを確認することができる。INVOKE/QUERYの実行履歴等も表示されるはずだがされていない。。。時間があったらしらべてみよう。

2017年7月23日日曜日

Spring Tool Suite (STS)をつかってみる

統合開発環境に Spring Tool Suite(STS)を利用し、 Spring MVC + Spring Boot のWebアプリケーションを動かしてみます。
WebサーバはTomcatを使います(Tomcatがインストール済みであることが前提)

<Tomcatのダウンロード先>
http://tomcat.apache.org/download-80.cgi
  1. 以下のサイトからSTSをダウンロードする。
    https://spring.io/tools/sts/all
  2. ZIPファイルを解凍する。「STS.exe」を実行し、STSを起動する。
  3. File メニュー > New > Spring Legacy Project をクリックする。
    Project nameは「WebApp」、Templates:は「Simple Spring Web Maven」を選択。「Finish」ボタンを押下する。
  4. 作成したプロジェクト「WebApp」を右クリックし、Maven > Update Project… をクリックする。
  5. 作成したプロジェクト「WebApp」を右クリックし、Run As > 9 Maven install をクリックする。
  6. Helpメニュー>Eclipse MarketPlaceを選択する。Eclipse Tomcatで検索し、Tomcatプラグラインをインストールする。
  7. Windowメニュー>Preferenceを選択し、Tomcat環境情報を設定する。
  8. 「http://127.0.0.1:8080/WebApp/」にアクセスし、以下の画面が表示されることを確認する。



Hyperdeger Fabric 1.0.0付属のサンプルコードを動かしてみる

Hyperdeger Fabric 1.0.0付属のサンプルコードを動かしてみます。

サンプルコードのイメージ図
(https://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.htmlより抜粋)




  • ブロックチェーンネットワークの分散台帳に書き込むには、スマートコントラクトが必要。
  • 業務側のアプリケーションは、Fabricのネットワークエンドポイントにアクセスし、スマートコンストラクトを実行する
  • サンプルでは、台帳として車情報を管理し、アプリケーションに返す
  • 言語はJavaScriptを利用
  1. サンプルのダウンロード
    # git clone https://github.com/hyperledger/fabric-samples.git
    # cd fabric-samples/fabcar
    # ls
    creds  invoke.js  package.json  query.js  startFabric.sh
  2. startFabric.shの実行
    #./startFabric.sh
    このシェルを実行すると、サンプルを動かす環境を自動的に構築してくれる。
    シェルの中身をみてみると、だいたい以下のことを実行している。
    ・まず最初に、必要なDockerイメージのダウンロード
    ・Docker-composeでDockerコンテナの立ち上げ。以下の4つのコンテナを作成している。
        Creating orderer.example.com
        Creating ca.example.com
        Creating couchdb
        Creating peer0.org1.example.com
    ・ブロックチェーンネットワークを構成するチャネルの作成
    ・「peer0.org1.example.com」というノードをチャネルへ追加
    ・CLIコンテナの作成
    ・サンプルチェーンコードのインストール
    ・サンプルチェーンコードのイニシエト
    ・サンプルチェーンコードの実行
    docker psで確認してみると、以下のコンテナが起動されている。
  3. fabric-samples/fabcar配下で以下のコマンドを実行し、必要なパッケージをダウンロード
    # npm install
  4. クエリーから実行してみる。10データ分の車情報を取得できる。

query.jsソースをのぞいてみると、だいたい以下のことを実行している。

ユーザID'PeerAdmin’を利用する。チャネル名'mychannel'を指定する。また、チェーンコードID'fabcar'を指定して、7051ポートにアクセスする

var options = {
    wallet_path: path.join(__dirname, './creds'),
    user_id: 'PeerAdmin',
    channel_id: 'mychannel',
    chaincode_id: 'fabcar',
    network_url: 'grpc://localhost:7051',

};

Fabric Client SDKを呼び出し、認証に必要なKeyValueStoreを作成する。
client = new hfc();
return hfc.newDefaultKeyValueStore({ path: options.wallet_path });


チャネルを作成し、Peerノードに追加する。

channel = client.newChannel(options.channel_id);

channel.addPeer(client.newPeer(options.network_url));

トランザクションIDを生成し、'queryAllCars'という関数を呼び出す。

var transaction_id = client.newTransactionID();
console.log("Assigning transaction_id: ", transaction_id._transaction_id);

 // queryCar - requires 1 argument, ex: args: ['CAR4'],
 // queryAllCars - requires no arguments , ex: args: [''],
 const request = {
        chaincodeId: options.chaincode_id,
        txId: transaction_id,
        fcn: 'queryAllCars',
        args: ['']
 };

 return channel.queryByChaincode(request);