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);

2017年7月17日月曜日

Hyperdeger Fabric 1.0.0 のソースからDockerイメージを作成してみる

Hyperdeger Fabric 1.0.0がリリースしたということで、ソースからDockerイメージを作成してみます。
OSはUbuntu 16.04を利用します(Google Cloud Platformの1年お試し無料を使いました)。


  1. 前提条件
    Git client
    Go - 1.7 or later (for releases before v1.0, 1.6 or later)
    Docker - 1.12 or later
    Docker Compose - 1.8.1 or later
    Pip
  2. GOPATHの設定
    export GOPATH=/usr/lib/go-1.8
  3. FafbricのDockerイメージを作成する
    mkdir -p $GOPATH/src/github.com/hyperledger
    cd $GOPATH/src/github.com/hyperledger
    git clone http://gerrit.hyperledger.org/r/fabric
    sudo ./fabric/devenv/setupUbuntuOnPPC64le.sh
    cd $GOPATH/src/github.com/hyperledger/fabric
    make dist-clean docker
  4. Dockerイメージが作成されていることを確認する


    ちゃんと作成されてました。
    (とおもってけど、バージョンが1.0.1になってます。。。とりあえず先に進みましょう)
    次回は、ミニマム構成で動かしてみます。


    export GOPATH=/usr/lib/go-1.8

2017年6月29日木曜日

人工知能OSS TensorFlowをインストールしてみる

Googleが提供している人工知能OSSである「TensorFlow」をインストールする。

  1. pipとvirtualenvをインストールする。

    $ apt-get install python-pip python-dev python-virtualenv
  2. virtualenv環境を構築する。

    $  mkdir /home/bushidoyasu/tensorflow
    $  virtualenv --system-site-packages  /home/bushidoyasu/tensorflow
  3. virtualenv環境をアクティベートする。

    $ source /home/bushidoyasu/tensorflow/bin/activate
  4. virtualenv環境上でTensorFlowをインストールするために、以下のコマンドを実行する。

    pip install --upgrade tensorflow
  5. Tensorflowが正常に動作することを確認する。

    $ python


    以下のプログラムを実行して、「
    Hello, TensorFlow!」と表示されることを確認する。
    # Python
    import tensorflow as tf
    hello = tf.constant('Hello, TensorFlow!')
    sess = tf.Session()
    print(sess.run(hello))

2017年6月27日火曜日

Ethereumで独自ネットワークをたちあげる

Ethereumで独自のブロックチェーンネットワークを構築するための手順を説明する。

  1. 内部ネットワーク用のノード情報などを格納するディレクトリを作成する。

     $ mkdir /home/bushidoyasu/test_e
  2. ジェネシスブロックを定義したファイルを作成する。ファイル名は「myjenesis.json」とする。
    { 
      "config": {
            "chainId": 15,
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        },
     "nonce": "0x00006d6f7264656e",
     "difficulty": "0x200",
     "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
     "coinbase": "0x0000000000000000000000000000000000000000",
     "timestamp": "0x00",
     "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
     "extraData": "0x",
     "gasLimit": "0x2FEFD8",
     "alloc": {
     }
    }
  3. ブロックチェーン情報を初期化する。

    $  geth --datadir /home/bushidoyasu/test_e init /home/bushidoyasu/test_e/genesis.json
  4. Peerを起動する。

    $ geth --datadir  /home/bushidoyasu/test_e --networkid 15 console
上記で独自ネットワークでPeerが起動した。
あとは、2人分のアカウントを作成して、送金してみる。

■1人目の作成
> personal.newAccount("bushitya")
INFO [06-26|22:39:33] New wallet appeared                      url=keystore:///home/bushidoyasu/te… status=Locked
"0xd550f995919d10ca17c40f0ea217038ee4df7580"

■2人目の作成
> personal.newAccount("masako")
"0xf7d4f230533737e67d4489f789b71dd89b784d93"
> INFO [06-26|22:43:49] New wallet appeared                      url=keystore:///home/bushidoyasu/te… status=Locked

■アカウントの確認
> eth.accounts
["0xd550f995919d10ca17c40f0ea217038ee4df7580", "0xf7d4f230533737e67d4489f789b71dd89b784d93"]

■発掘の開始
※1人目のユーザに報酬が蓄積されていく
> miner.start()

■アカウントのアンロック
※タイムアウト時間は300秒。
> personal.unlockAccount(eth.accounts[0])
Unlock account 0xd550f995919d10ca17c40f0ea217038ee4df7580
Passphrase:
true

■資産の確認
> eth.getBalance(eth.accounts[0])
5000000000000000000
> eth.getBalance(eth.accounts[1])
0

■送金
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})



2017年6月23日金曜日

Ethereumを動かしてみた

ブロックチェーン基盤の1つであるEtheruemを動かしてみる。

  • Etheruemの実行基盤として、GethとEthの2種類ある。GethはGO言語で記載されている。EthはC++言語で記載されている。今回はGethのほうを動かす。
  • 本番用ネットワークではなく、テスト用のネットワーク(通称:テストネット)につないでみる。
  • 構築環境はUbuntu OSを利用する。

  1. 最初に、必要なパッケージ一式をダウンロードする。

    $ apt-get install software-properties-common
  2. レポジトリにEtheruemを追加する。

    $ add-apt-repository -y ppa:ethereum/ethereum
    $ add-apt-repository -y ppa:ethereum/ethereum-dev
  3. Etheruem資材一式をダウンロードする。

    $ apt-get update
    $ apt-get install ethereum
  4. データディレクトリを作成する。

    $ mkdir /home/bushidoyasu/etheruem_data
  5. テストネットにつないでみる。デーモンではなく、コンソールモードで起動する。

    $  geth --networkid "10" --datadir "/home/bushidoyasu/etheruem_data"   console
    WARN [06-23|21:10:08] No etherbase set and no accounts found as default
    INFO [06-23|21:10:08] Starting peer-to-peer node               instance=Geth/v1.6.6-stable-10a45cb5/linux-amd64/go1.8.1
    INFO [06-23|21:10:08] Allocated cache and file handles         database=/home/bushidoyasu/etheruem_data/geth/chaindata cache=128 handles=1024
    INFO [06-23|21:10:08] Initialised chain configuration          config="{ChainID: 1 Homestead: 1150000 DAO: 1920000 DAOSupport: true EIP150: 2463000 EIP155: 2675000 EIP158: 2675000 Metropolis: 9223372036854775807 Engine: ethash}"
    INFO [06-23|21:10:08] Disk storage enabled for ethash caches   dir=/home/bushidoyasu/etheruem_data/geth/ethash count=3
    INFO [06-23|21:10:08] Disk storage enabled for ethash DAGs     dir=/root/.ethash                               count=2
    INFO [06-23|21:10:08] Initialising Ethereum protocol           versions="[63 62]" network=10
    INFO [06-23|21:10:08] Loaded most recent local header          number=0 hash=d4e567…cb8fa3 td=17179869184
    INFO [06-23|21:10:08] Loaded most recent local full block      number=0 hash=d4e567…cb8fa3 td=17179869184
    INFO [06-23|21:10:08] Loaded most recent local fast block      number=0 hash=d4e567…cb8fa3 td=17179869184
    INFO [06-23|21:10:08] Starting P2P networking
    INFO [06-23|21:10:11] UDP listener up                          self=enode://455d82dddebbb30f51d98cdddd674c4c7ea91a74e226f5a7b51f5dc38bc8b1266e33bd55771633f2f20f74fb1c159b0ca13e51bc5bb53e425231c24cd6836071@[::]:30303
    INFO [06-23|21:10:11] RLPx listener up                         self=enode://455d82dddebbb30f51d98cdddd674c4c7ea91a74e226f5a7b51f5dc38bc8b1266e33bd55771633f2f20f74fb1c159b0ca13e51bc5bb53e425231c24cd6836071@[::]:30303
    INFO [06-23|21:10:11] IPC endpoint opened: /home/bushidoyasu/etheruem_data/geth.ipc
    Welcome to the Geth JavaScript console!

    instance: Geth/v1.6.6-stable-10a45cb5/linux-amd64/go1.8.1
    modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0


    >
    上記でノードが立ち上がった。
  6. アカウントの作成してみる。
    > personal.newAccount("bushitya")
    "0x9dff1a413f42870453f2d2bb9c105cdd0108897b"
    INFO [06-23|21:14:19] New wallet appeared                      url=keystore:///home/bushidoyasu/et… status=Locked
    >
    > eth.accounts
    ["0x9dff1a413f42870453f2d2bb9c105cdd0108897b"]
  7. さっそく、発掘してみる。
    > miner.start()
    INFO [06-23|21:15:38] Updated mining threads                   threads=0
    INFO [06-23|21:15:38] Transaction pool price threshold updated price=18000000000
    ・・・
  8. しばらく放置して、自分のアカウントにEtheコインがふえているかを確認する。
    > eth.getBalance("0x9dff1a413f42870453f2d2bb9c105cdd0108897b")
    0

    0コイン。。。テストネットといえど、発掘の道は厳しい。。。。。。

2017年6月18日日曜日

Dashingをつかってみた

簡単にダッシュボード画面を作成できるフレームワーク「Dashing」を使ってみる。
Rubyで実装されている。

  1. Rubyをインストールする。

    $  apt-get install ruby ruby-dev ruby-bundler
  2. gemコマンドを実行し、Dashingをインストールする。

    $ gem install dashing
  3. サンプルプロジェクト「sample-dashboard」を作成する。

    $ dashing new sample-dashboard
  4. bundleコマンドを実行する。

    $ cd sample-dashboard/
    $ bundle
  5. dashingサービスを起動する。

    $ dashing start

http://localhost:3030 にアクセスし、以下のサンプルのダッシュボード画面が表示されることを確認する。10分ぐらいで動かせた。



2017年6月17日土曜日

FTPサーバを立ち上げる

vsftpdというOSSを使ってFTPサーバを立ち上げる。

  1. vsftpdをインストールする。

    $ apt-get update
    $ apt-get install vsftpd
  2. /etc/vsftpd.confを開き、以下を変更する。
    listen=NO

    listen=YES

    write_enable=NO

    write_enable=YES

    listen_ipv6=YESをコメントアウトする。
  3. vsftpdサービスを再起動する。

    $ service vsftpd restart
  4. ftpコマンドを実行できることを確認する。

    $ ftp localhost
    ftp: connect to address ::1: Connection refused
    Trying 127.0.0.1...
    Connected to localhost.
    220 (vsFTPd 3.0.3)
    Name (localhost:bushidoyasu): ftpuser
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp>

Grafanaを使ってみた

Grafanaで簡単にダッシュボードを作ってみる。

  1. 必要なパッケージをダウンロードする。

    $ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.3.1_amd64.deb
    $ sudo apt-get install -y adduser libfontconfig
    $ sudo dpkg -i grafana_4.3.1_amd64.deb
  2. 「/etc/apt/sources.list」に以下を追記する。
    deb https://packagecloud.io/grafana/stable/debian/ jessie main
  3. Package Could Keyをインストールする。
    curl https://packagecloud.io/gpg.key | sudo apt-key add -
  4. Grafanaをインストールする。
    sudo apt-get update
    sudo apt-get install grafana
  5. Grafanaサーバを起動する。
    sudo service grafana-server start

以上でインストールは完了。
以下のURLでアクセスし、ログイン画面が表示されることを確認する。
また、admin/adminでログインできることを確認する。

http://localhost:3000/login



Grafanaが利用するデータソースとしては「MySQL」を利用することにする。
以下の手順でMySQLをインストールする。

$ sudo apt install mysql-server mysql-client

mysql -u root -p でログインできることを確認する。

セキュリティ設定を行う場合は以下を実行する。

sudo mysql_secure_installation

アクセスするユーザをあらかじめ作成しておく。

mysql>CREATE USER loginuser2@localhost IDENTIFIED BY  '***';

Grafana用のDBを作成する。

mysql> create database grafanadb;

ユーザに対してDB操作の権限を付与する。

mysql> GRANT ALL ON grafanadb.* TO loginuser2@localhost IDENTIFIED BY '***';

Grafanaにログインしたら、「Add data source」を押す。
以下のように設定し、「Add」ボタンを押す。


「New dashbord」ボタンを押して、好きなコンテンツを追加していく。
あとはやりたい放題だ。


2017年6月16日金曜日

Hyperledger Fabric Client SDK ( node) が提供しているRESTを使ってみる

Hyperledger Fabric Client SDK ( node)  β版では、REST APIのサンプルを提供している。さっそく使ってみる。
  1. node、npm 、gulpをインストールする。

    $ apt-get install build-essential libssl-dev
    $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
    $ . ~/.profile
    $ nvm install 6.9.5
    $ node -v
    v6.9.5
    $ npm -v
    3.10.10
    $ npm install -g gulp
    $ gulp -v
    [00:52:30] CLI version 3.9.1
  2. β版のソース一式をダウンロードする。

    $ git clone -b v1.0.0-beta https://github.com/hyperledger/fabric-sdk-node.git
  3. 必要なパッケージをインストールする。

    $ cd fabric-sdk-node/examples/balance-transfer/
    $  sudo npm install
  4. 付属のDocker-compose.yamlを使って、必要なDockerイメージをダウンロードする。

    $  docker-compose -f artifacts/docker-compose.yaml pull
  5. 別のターミナル端末を起動し、RESTサービスを起動する。

    $ cd fabric-sdk-node/examples/balance-transfer
    $ sudo ./runApp.sh

    起動途中で以下のエラーが発生した。

    ■エラー内容①
    7357 verbose stack Error: grpc@1.2.4 install: `node-pre-gyp install --fallback-to-build`

    その場合は、以下のコマンドを実行してトライしてみる。

    $ sudo npm install -g @google-cloud/functions-emulator

    <参考>
    https://github.com/GoogleCloudPlatform/cloud-functions-emulator/issues/107

    ■エラー内容②
    Error: Cannot find module '/root/fabric-sdk-node/examples/balance-transfer/node_modules/grpc/src/node/extension_binary/grpc_node.node'

    上記のエラーがでた場合は、いったんリビルドをする。

    $ sudo npm rebuild

以上でセットアップは完了。

実際にREST APIを呼び出してみる。


■jimというユーザでログイン


$ curl -s -X POST http://localhost:4000/users -H "content-type: application/x-www-form-urlencoded" -d 'username=Jim&orgName=org1'
{"success":true,"secret":"WVjrlkvYHDnw","message":"Jim enrolled Successfully","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A"}

HTTP応答レスポンスにトークンが含まれる(赤色箇所)。
以降の操作では、このトークンをヘッダに含める。

■チャネルの作成
$ curl -s -X POST \
  http://localhost:4000/channels \
  -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTQ4NjU1OTEsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTQ4NjE5OTF9.yWaJhFDuTvMQRaZIqg20Is5t-JJ_1BP58yrNLOKxtNI" \
  -H "content-type: application/json" \
  -d '{
"channelName":"mychannel",
"channelConfigPath":"../artifacts/channel/mychannel.tx"
}'
{"success":true,"message":"Channel 'mychannel' created Successfully"}

■チャネルへのPeerの追加
$ curl -s -X POST   http://localhost:4000/channels/mychannel/peers -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A"   -H "content-type: application/json"   -d '{"peer
s": ["localhost:7051","localhost:7056"]}'
{"success":true,"message":"Successfully joined peers in organization org1 to the channel 'mychannel'"}

■チェーンコードのインストール
$curl -s -X POST \
http://localhost:4000/chaincodes \
-H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
-H "content-type: application/json" \
-d '{"peers": ["localhost:7051","localhost:7056"],"chaincodeName":"mycc","chaincodePath":"github.com/example_cc","chaincodeVersion":"v0"}'
Successfully Installed chaincode on organization org1root

■チェーンコードのイニシエイト
curl -s -X POST   http://localhost:4000/channels/mychannel/chaincodes   -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A"   -H "content-type: application/json"   -d '{"peers": ["localhost:7051"],"chaincodeName":"mycc","chaincodeVersion":"v0","functionName":"init","args":["a","100","b","200"]}'
Chaincode Instantiateion is SUCCESS'

■チェーンコードのINVOKE
$ curl -s -X POST \
  http://localhost:4000/channels/mychannel/chaincodes/mycc \
  -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
  -H "content-type: application/json" \
  -d '{"peers": ["localhost:7051", "localhost:7056"],"fcn":"invoke","args":["move","a","b","10"]}'
b3e514c0e13e55adcd32525a955dc684fae9857f177c6977164c0d6d24bd1d65

■チェーンコードのQuery
curl -s -X GET \
  "http://localhost:4000/channels/mychannel/chaincodes/mycc?peer=peer1&args=%5B%22query%22%2C%22a%22%5D" \
  -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
  -H "content-type: application/json"
User b now has 90 after the move

■ブロックチェーン情報の取得
 $ curl -s -X GET \
  "http://localhost:4000/channels/mychannel?peer=peer1" \
  -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
  -H "content-type: application/json"
  {"height":{"low":3,"high":0,"unsigned":true},"currentBlockHash":{"buffer":{"type":"Buffer","data":[8,3,18,32,238,74,52,185,78,207,197,24,251,103,242,39,149,43,68,78,203,29,98,6,212,199,91,181,66,242,181,26,41,251,254,183,26,32,103,135,106,238,68,1,243,164,59,180,96,123,114,148,65,25,148,216,71,229,31,37,60,207,244,85,206,92,237,33,53,8]},"offset":4,"markedOffset":-1,"limit":36,"littleEndian":true,"noAssert":false},"previousBlockHash":{"buffer":{"type":"Buffer","data":[8,3,18,32,238,74,52,185,78,207,197,24,251,103,242,39,149,43,68,78,203,29,98,6,212,199,91,181,66,242,181,26,41,251,254,183,26,32,103,135,106,238,68,1,243,164,59,180,96,123,114,148,65,25,148,216,71,229,31,37,60,207,244,85,206,92,237,33,53,8]},"offset":38,"markedOffset":-1,"limit":70,"littleEndian":true,"noAssert":false}}

■ブロック情報の取得
 $curl -s -X GET \
  "http://localhost:4000/channels/mychannel/blocks/2?peer=peer1" \
  -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTc2NTQzMzIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Im9yZzEiLCJpYXQiOjE0OTc2MTgzMzJ9.If05JN4VdqqcOU4rr_0FhuP6ppPcm7xRMJvFrQp9u1A" \
  -H "content-type: application/json" 
{"header":{"number":{"low":2,"high":0,"unsigned":true},"previous_hash":"67876aee4401f3a43bb4607b7294411994d847e51f253ccff455ce5ced213508","data_hash":"7f82a6cb269ffce48cf318a880a75afb2d85d41b4ef3ab9b7eab92c180c78465"},"data":{"data":[{"signature":{"type":"Buffer","data":[48,68,2,32,60,157,40,51,123,55,4,182,68,132,218,122,141,74,117,54,8,49,117,25,248,64,128,89,210,108,219,12,145,54,25,128,2,32,93,50,247,22,170,72,137,21,57,103,217,212,174,121,149,9,159,19,223,255,244,190,252,47,228,47,148,54,71,85,46,190]},"payload":{"header":{"channel_header":{"type":"ENDORSER_TRANSACTION","version":3,"timestamp":"Fri Jun 16 2017 22:27:22 GMT+0900 (JST)","channel_id":"mychannel","tx_id":"b3e514c0e13e55adcd32525a955dc684fae9857f177c6977164c0d6d24bd1d65","epoch":0,"extension":{"type":"Buffer","data":[18,6,18,4,109,121,99,99]}},"signature_header":{"creator":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN CERTIFICATE-----\nMIIB7zCCAZWgAwIBAgIUNLc4T4ZCmXhsM1Fgooi4FMSFNe4wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjE2MTMwMTAwWhcNMTgwNjE2MTMw\nMTAwWjAOMQwwCgYDVQQDEwNKaW0wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARg\nwqB1kG2Bn5yrMRqQN59KHOI2O1G8xSy14sRE6Ls2a6opRo7OE90jTESuvFge/TJq\nG3GzApIEDk7Sf/cVhwjgo2wwajAOBgNVHQ8BAf8EBAMCAgQwDAYDVR0TAQH/BAIw\nADAdBgNVHQ4EFgQUlF6Ndc38jvQfZqoiLKTRSsPZHIIwKwYDVR0jBCQwIoAgsKWn\nPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMwCgYIKoZIzj0EAwIDSAAwRQIh\nAMJilFPdkTsGYYXyRrqKqC69OIIrVdERhUm+DuJNKnGiAiASZWwVxHQCM+zniuKz\nfka8oLlP5qPeefBKW8CruV1Rzg==\n-----END CERTIFICATE-----\n"},"nonce":{"type":"Buffer","data":[162,94,185,37,84,27,79,1,97,219,219,180,254,64,132,36,90,229,28,126,139,36,11,14]}}},"data":{"actions":[{"header":{"creator":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN CERTIFICATE-----\nMIIB7zCCAZWgAwIBAgIUNLc4T4ZCmXhsM1Fgooi4FMSFNe4wCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjE2MTMwMTAwWhcNMTgwNjE2MTMw\nMTAwWjAOMQwwCgYDVQQDEwNKaW0wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARg\nwqB1kG2Bn5yrMRqQN59KHOI2O1G8xSy14sRE6Ls2a6opRo7OE90jTESuvFge/TJq\nG3GzApIEDk7Sf/cVhwjgo2wwajAOBgNVHQ8BAf8EBAMCAgQwDAYDVR0TAQH/BAIw\nADAdBgNVHQ4EFgQUlF6Ndc38jvQfZqoiLKTRSsPZHIIwKwYDVR0jBCQwIoAgsKWn\nPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMwCgYIKoZIzj0EAwIDSAAwRQIh\nAMJilFPdkTsGYYXyRrqKqC69OIIrVdERhUm+DuJNKnGiAiASZWwVxHQCM+zniuKz\nfka8oLlP5qPeefBKW8CruV1Rzg==\n-----END CERTIFICATE-----\n"},"nonce":{"type":"Buffer","data":[162,94,185,37,84,27,79,1,97,219,219,180,254,64,132,36,90,229,28,126,139,36,11,14]}},"payload":{"chaincode_proposal_payload":{"input":"\n$\b\u0001\u0012\u0006\u0012\u0004mycc\u001a\u0018\n\u0006invoke\n\u0004move\n\u0001a\n\u0001b\n\u000210"},"action":{"proposal_response_payload":{"proposal_hash":"b07d7721b74f5e0ad948648c514797e395b9cf53a9bc56d3dd5f397ec01fa1ed","extension":{"results":{"data_model":0,"ns_rwset":[{"namespace":"lscc","rwset":{"reads":[{"key":"mycc","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}}],"range_queries_info":[],"writes":[]}},{"namespace":"mycc","rwset":{"reads":[{"key":"a","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}},{"key":"b","version":{"block_num":{"low":1,"high":0,"unsigned":true},"tx_num":{"low":0,"high":0,"unsigned":true}}}],"range_queries_info":[],"writes":[{"key":"a","is_delete":false,"value":"90"},{"key":"b","is_delete":false,"value":"210"}]}}]},"events":{"chaincode_id":"","tx_id":"","event_name":"","payload":{"type":"Buffer","data":[]}},"response":{"status":200,"message":"","payload":""}}},"endorsements":[{"endorser":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN -----\nMIICWjCCAgGgAwIBAgIRAPGLVnARPOpXbAd4X38Sg60wCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjAxMTQxNzI2WhcNMjcwNTMwMTQxNzI2\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjAub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABP68ne3e/ND5mJbQBgD/uFJai+6pND7p\nsucoOuQh7onYKt7YGafxUPTleAIdtM0BXUpvfcG8T612Qe0wOz/+VbyjgY0wgYow\nDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQC\nMAAwKwYDVR0jBCQwIoAgsKWnPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMw\nKAYDVR0RBCEwH4IWcGVlcjAub3JnMS5leGFtcGxlLmNvbYIFcGVlcjAwCgYIKoZI\nzj0EAwIDRwAwRAIgbQiRzF3Y1NKEHOy809ZHLLj8KS535l4p5W9kWBUjr/0CICYs\ny2MGqiWbH8EV/J3viNR25QL8yniybnfdCGrJKZWy\n-----END -----\n"},"signature":{"type":"Buffer","data":[48,68,2,32,1,214,86,206,84,180,130,208,63,161,245,73,165,182,182,133,11,5,217,95,157,252,81,75,132,145,31,96,167,113,147,198,2,32,96,251,10,164,122,252,80,205,32,214,85,249,233,160,133,62,68,47,130,82,206,168,3,44,164,38,68,183,82,73,232,33]}},{"endorser":{"Mspid":"Org1MSP","IdBytes":"-----BEGIN -----\nMIICWjCCAgGgAwIBAgIRAPxYG1oPao/E8U8Lyvr5U3MwCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjAxMTQxNzI2WhcNMjcwNTMwMTQxNzI2\nWjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzEfMB0GA1UEAxMWcGVlcjEub3JnMS5leGFtcGxlLmNvbTBZ\nMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOtQO5PNelHBjyYXsP1J9r3d6qv/xMpX\n70w5g/wRFTzdDU78sVsOmiEShPIU7Klf3sv7nhwcqHapgly/n5AnjqqjgY0wgYow\nDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAwGA1UdEwEB/wQC\nMAAwKwYDVR0jBCQwIoAgsKWnPr7S1uLb8dUkIbthQy5Fp781jxKiscmD6EE0+kMw\nKAYDVR0RBCEwH4IWcGVlcjEub3JnMS5leGFtcGxlLmNvbYIFcGVlcjEwCgYIKoZI\nzj0EAwIDRwAwRAIgJ0/jdJFdQSHEG/mY1xhefSur0kOqomwT85Ngvxjk2UQCIBBF\ndjbzrCMPYOUHxLMJ94gXIpKgE3ReHec1fCBcsty7\n-----END -----\n"},"signature":{"type":"Buffer","data":[48,69,2,33,0,179,53,0,99,27,119,155,180,132,240,15,64,4,1,169,166,234,22,27,66,97,167,13,140,57,123,118,170,178,213,117,55,2,32,8,251,185,112,243,125,30,245,236,167,153,254,58,106,137,165,249,191,160,217,77,110,219,108,33,3,144,49,143,81,71,42]}}]}}}]}}}]},"metadata":{"metadata":[{"value":"","signatures":[{"signature_header":{"creator":{"Mspid":"OrdererMSP","IdBytes":"-----BEGIN -----\nMIICTTCCAfOgAwIBAgIRAPgOpt3+Nfk+01sMdz6kzN4wCgYIKoZIzj0EAwIwaTEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\ncGxlLmNvbTAeFw0xNzA2MDExNDE3MjZaFw0yNzA1MzAxNDE3MjZaMFgxCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\nc2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI\nKoZIzj0DAQcDQgAENf3ZkpKtXwTy9erYtMCBYeeSU/4u996yTkzYABFRjJUCPHJF\nLBZjSf2RSLZ8dlEN9FlP6amXuMy6ESmlJr/5eqOBjDCBiTAOBgNVHQ8BAf8EBAMC\nBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAi\ngCDKy+d5gMYuWR00XMdeft2au4DqZ8BUogACgPt3Vq5ihjAnBgNVHREEIDAeghNv\ncmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49BAMCA0gAMEUCIQD6\n5QcBFKKi6z8PTr4aXG+y0f6/xDS1MsG+iObnwGJntwIgROOBaIgOsYWqF4RAsTTk\n3UbaTPHBRgfC9n1ikfF4jHA=\n-----END -----\n"},"nonce":{"type":"Buffer","data":[55,114,35,43,55,236,240,19,29,148,206,31,37,186,133,193,185,113,21,111,220,13,245,114]}},"signature":{"type":"Buffer","data":[48,68,2,32,100,57,88,147,254,14,203,244,186,35,180,73,41,65,188,19,111,217,239,167,180,38,49,172,82,203,250,251,198,36,15,106,2,32,125,121,136,118,156,56,132,60,100,76,232,215,5,247,105,147,216,87,105,55,216,182,209,233,211,182,6,109,160,31,83,124]}}]},{"value":{"index":{"low":0,"high":0,"unsigned":true}},"signatures":[{"signature_header":{"creator":{"Mspid":"OrdererMSP","IdBytes":"-----BEGIN -----\nMIICTTCCAfOgAwIBAgIRAPgOpt3+Nfk+01sMdz6kzN4wCgYIKoZIzj0EAwIwaTEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRcwFQYDVQQDEw5jYS5leGFt\ncGxlLmNvbTAeFw0xNzA2MDExNDE3MjZaFw0yNzA1MzAxNDE3MjZaMFgxCzAJBgNV\nBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNp\nc2NvMRwwGgYDVQQDExNvcmRlcmVyLmV4YW1wbGUuY29tMFkwEwYHKoZIzj0CAQYI\nKoZIzj0DAQcDQgAENf3ZkpKtXwTy9erYtMCBYeeSU/4u996yTkzYABFRjJUCPHJF\nLBZjSf2RSLZ8dlEN9FlP6amXuMy6ESmlJr/5eqOBjDCBiTAOBgNVHQ8BAf8EBAMC\nBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDAYDVR0TAQH/BAIwADArBgNVHSMEJDAi\ngCDKy+d5gMYuWR00XMdeft2au4DqZ8BUogACgPt3Vq5ihjAnBgNVHREEIDAeghNv\ncmRlcmVyLmV4YW1wbGUuY29tggdvcmRlcmVyMAoGCCqGSM49BAMCA0gAMEUCIQD6\n5QcBFKKi6z8PTr4aXG+y0f6/xDS1MsG+iObnwGJntwIgROOBaIgOsYWqF4RAsTTk\n3UbaTPHBRgfC9n1ikfF4jHA=\n-----END -----\n"},"nonce":{"type":"Buffer","data":[232,75,153,152,127,237,61,253,104,27,97,201,8,10,69,39,25,105,48,228,9,145,186,76]}},"signature":{"type":"Buffer","data":[48,68,2,32,110,209,136,243,215,85,58,109,143,69,201,5,41,112,191,134,229,34,26,6,123,254,37,186,238,54,56,40,185,255,138,120,2,32,70,54,73,69,1,36,130,77,94,38,33,159,225,145,135,70,94,217,55,78,35,234,33,58,187,251,231,168,56,166,24,210]}}]},[]]}}

1トランザクションを含んだブロックのデータサイズが予想以上に大きい。。。



2017年6月15日木曜日

Hyperledger Fabric V1.0 β のインストール方法

ブロックチェーン基盤であるFabric V1.0 β のインストール方法について説明する。
Ubuntu OSには、Dockcer及びDocker-composeをインストール済みであること。

(参照元URL)
https://hyperledger-fabric.readthedocs.io/en/latest/getting_started.html
  1. Ubuntu OSにTeratermでログインする。
  2. 以下のフォルダを作成する。

    $ mkdir fabric-sample$ cd fabric-sample
  3. 以下のコマンドを実行する。このコマンドを実行すると、インストールに必要なパッケージをダウンロードしてくれる。(結構時間がかかる)

    $curl -sSL https://goo.gl/LQkuoh | bash

  4. docker imagesコマンドでFabricイメージがダウンロードされていることを確認する。


  5. configtxgentツールを使うと、Fabricを動かすために必要となる以下の4つの設定情報ファイルを自動的に作成してくれる。

    ・bootstrap block
    ・チャネルトランザクション
    ・2つのアンカーPeerトランザクション

    まず、bootstrap blockを作成するために、以下のコマンドを実行する。

    $ cd release/linux-amd64/
    $ ./bin/cryptogen generate --config=./crypto-config.yaml

    以下の警告が大量に出力されるが無視する。

    [bccsp] GetDefault -> WARN 001 Before using BCCSP, please call InitFactories(). Falling back to bootBCCSP.
  6. 次に、チャネルトランザクションを作成する。

    $ export FABRIC_CFG_PATH=$PWD
    $ ./bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
    $ ./bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel2017-06-15 23:31:19.449 JST [common/configtx/tool] main -> INFO 001 Loading configuration
    2017-06-15 23:31:19.460 JST [common/configtx/tool] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
    2017-06-15 23:31:19.461 JST [common/configtx/tool] doOutputChannelCreateTx -> INFO 003 Writing new channel tx
  7. Org1という組織にアンカーPeerを登録する。

    $ ./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
    2017-06-05 22:28:12.620 JST [common/configtx/tool] main -> INFO 001 Loading configuration
    2017-06-05 22:28:12.625 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
    2017-06-05 22:28:12.625 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update

    同様に、Org2という組織にアンカーPeerを登録する。

    $ ./bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychnnel -asOrg Org2MSP
    2017-06-05 22:30:01.798 JST [common/configtx/tool] main -> INFO 001 Loading configuration
    2017-06-05 22:30:01.805 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
    2017-06-05 22:30:01.805 JST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
  8. 以下のコマンドを実行する。

    $ ./generateArtifacts.sh mychannel
  9. docker-compose-cli.yamlをviで開いて、以下をbashコマンドをコマンドアウトする。

    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    # command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
        volumes:
  10. クライアントのDockerコンテナを起動する。

    $ CHANNEL_NAME=mychannel TIMEOUT=60 docker-compose -f docker-compose-cli.yaml up -d
  11. docker psコマンドを実行し、cliというコンテナが起動していることを確認する。

  12. cliコンテナにログインする。

    $ docker exec -it cli bash
  13. 「mychannel」というチャネルを作成する。

    $ CHANNEL_NAME=mychannel
    # peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem
  14. 「mychannel」チャネルに「peer0.org1.example.com」を追加する。

    $ peer channel join -b mychannel.block
  15. Fabric付属のexample02というチェーンコードをインストールする。

    $ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
  16. チェーンコードをイニシエトする。

    $ peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Args":["init","a", "100", "b","200"]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
  17. aという値をクエリしてみる。

    $peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
    ・・・
    Query Result: 100
    ・・・
  18. チェーンコードをinvokeして、aからbに10資産移動させる。

    $ peer chaincode invoke -o orderer.example.com:7050  --tls $CORE_PEER_TLS_ENABLED --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/cacerts/ca.example.com-cert.pem  -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}'

    aの資産が90になっていることを確認する。

    $peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
    ・・・
    Query Result: 90
    ・・・

    bの資産が110になっていることを確認する。

    $peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","b"]}'
    ・・・
    Query Result: 110
    ・・・