最新の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月14日火曜日
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を利用するように環境設定を変更する。
前提
・「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というデータベースをのぞいてみても、何もテーブルが作られていない。。。
・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
①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
# 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つしかチャネルが表示されない。
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テーブル
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は構築済みの 前提。
ざっとソースを眺めると以下のことが分かった。
・ダッシュボードはOSS Grafanaを利用している模様。
・WebサーバはOSS Spring Bootを利用している模様。
・Grafanaが利用するDBはOSS InfuxDBを利用している模様。
・EPCPノードやCAへの接続処理は、Fabric SDK for Javaは利用している模様。
以下の手順では、EPCPノード、OS、CAは構築済みの 前提。
- monitoring blockchainのDockerコンテナをPULLする。
# docker pull blockchainmonitoring/blockchain-monitoring:latest - Dockerコンテナがダウンロードされたことを確認する。
# docker images | grep monitoring
blockchainmonitoring/blockchain-monitoring latest f44f980e709e 35 hours ago 1.1GB - docker-compose.yamlを準備する。
- Fabric向けのネットワーク設定ファイル(net-config.yaml)を準備する。
MSPの設定やCAやEPCPノードのURLを設定する。また、管理ユーザであるadminのprivkeyには秘密鍵、certには公開鍵証明書を指定する。 - FABRIC_NET_CONFIGとCERTS_ADMIN環境変数のパスを設定する。
# export FABRIC_NET_CONFIG=/root/monitoring/net-config.yaml
# export CERTS_ADMIN=/root/monitoring/certs - docker-composeコマンドでコンテナを作成する。
# docker-compose up - 以下のURLにアクセスする(XXXは環境に合わせて指定する)。
http://XXX.XXX.XXX.XXX:3000 - ダッシュボード画面が表示されることを確認する。
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
WebサーバはTomcatを使います(Tomcatがインストール済みであることが前提)
<Tomcatのダウンロード先>
http://tomcat.apache.org/download-80.cgi
- 以下のサイトからSTSをダウンロードする。
https://spring.io/tools/sts/all - ZIPファイルを解凍する。「STS.exe」を実行し、STSを起動する。
- File メニュー > New > Spring Legacy Project をクリックする。
Project nameは「WebApp」、Templates:は「Simple Spring Web Maven」を選択。「Finish」ボタンを押下する。 - 作成したプロジェクト「WebApp」を右クリックし、Maven > Update Project… をクリックする。
- 作成したプロジェクト「WebApp」を右クリックし、Run As > 9 Maven install をクリックする。
- Helpメニュー>Eclipse MarketPlaceを選択する。Eclipse Tomcatで検索し、Tomcatプラグラインをインストールする。
- Windowメニュー>Preferenceを選択し、Tomcat環境情報を設定する。
- 「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より抜粋)
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);
サンプルコードのイメージ図
(https://hyperledger-fabric.readthedocs.io/en/latest/write_first_app.htmlより抜粋)
- ブロックチェーンネットワークの分散台帳に書き込むには、スマートコントラクトが必要。
- 業務側のアプリケーションは、Fabricのネットワークエンドポイントにアクセスし、スマートコンストラクトを実行する
- サンプルでは、台帳として車情報を管理し、アプリケーションに返す
- 言語はJavaScriptを利用
- サンプルのダウンロード
# git clone https://github.com/hyperledger/fabric-samples.git
# cd fabric-samples/fabcar
# ls
creds invoke.js package.json query.js startFabric.sh - 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で確認してみると、以下のコンテナが起動されている。 - fabric-samples/fabcar配下で以下のコマンドを実行し、必要なパッケージをダウンロード
# npm install - クエリーから実行してみる。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年お試し無料を使いました)。
OSはUbuntu 16.04を利用します(Google Cloud Platformの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 - GOPATHの設定
export GOPATH=/usr/lib/go-1.8 - 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 - Dockerイメージが作成されていることを確認する
ちゃんと作成されてました。
(とおもってけど、バージョンが1.0.1になってます。。。とりあえず先に進みましょう)
次回は、ミニマム構成で動かしてみます。export GOPATH=/usr/lib/go-1.8
2017年6月29日木曜日
人工知能OSS TensorFlowをインストールしてみる
Googleが提供している人工知能OSSである「TensorFlow」をインストールする。
- pipとvirtualenvをインストールする。
$ apt-get install python-pip python-dev python-virtualenv - virtualenv環境を構築する。
$ mkdir /home/bushidoyasu/tensorflow
$ virtualenv --system-site-packages /home/bushidoyasu/tensorflow - virtualenv環境をアクティベートする。
$ source /home/bushidoyasu/tensorflow/bin/activate - virtualenv環境上でTensorFlowをインストールするために、以下のコマンドを実行する。
$ pip install --upgrade tensorflow - 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で独自のブロックチェーンネットワークを構築するための手順を説明する。
- 内部ネットワーク用のノード情報などを格納するディレクトリを作成する。
$ mkdir /home/bushidoyasu/test_e - ジェネシスブロックを定義したファイルを作成する。ファイル名は「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": { } }
- ブロックチェーン情報を初期化する。
$ geth --datadir /home/bushidoyasu/test_e init /home/bushidoyasu/test_e/genesis.json - Peerを起動する。
$ geth --datadir /home/bushidoyasu/test_e --networkid 15 console
あとは、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")})
■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を利用する。
- 最初に、必要なパッケージ一式をダウンロードする。
$ apt-get install software-properties-common - レポジトリにEtheruemを追加する。
$ add-apt-repository -y ppa:ethereum/ethereum
$ add-apt-repository -y ppa:ethereum/ethereum-dev - Etheruem資材一式をダウンロードする。
$ apt-get update
$ apt-get install ethereum - データディレクトリを作成する。
$ mkdir /home/bushidoyasu/etheruem_data - テストネットにつないでみる。デーモンではなく、コンソールモードで起動する。
$ 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
>
上記でノードが立ち上がった。 - アカウントの作成してみる。
> personal.newAccount("bushitya")
"0x9dff1a413f42870453f2d2bb9c105cdd0108897b"
INFO [06-23|21:14:19] New wallet appeared url=keystore:///home/bushidoyasu/et… status=Locked
>
> eth.accounts
["0x9dff1a413f42870453f2d2bb9c105cdd0108897b"] - さっそく、発掘してみる。
> 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
・・・ - しばらく放置して、自分のアカウントにEtheコインがふえているかを確認する。
> eth.getBalance("0x9dff1a413f42870453f2d2bb9c105cdd0108897b")
0
0コイン。。。テストネットといえど、発掘の道は厳しい。。。。。。
2017年6月18日日曜日
Dashingをつかってみた
簡単にダッシュボード画面を作成できるフレームワーク「Dashing」を使ってみる。
Rubyで実装されている。
Rubyで実装されている。
- Rubyをインストールする。
$ apt-get install ruby ruby-dev ruby-bundler - gemコマンドを実行し、Dashingをインストールする。
$ gem install dashing - サンプルプロジェクト「sample-dashboard」を作成する。
$ dashing new sample-dashboard - bundleコマンドを実行する。
$ cd sample-dashboard/
$ bundle - dashingサービスを起動する。
$ dashing start
http://localhost:3030 にアクセスし、以下のサンプルのダッシュボード画面が表示されることを確認する。10分ぐらいで動かせた。
2017年6月17日土曜日
FTPサーバを立ち上げる
vsftpdというOSSを使ってFTPサーバを立ち上げる。
- vsftpdをインストールする。
$ apt-get update
$ apt-get install vsftpd - /etc/vsftpd.confを開き、以下を変更する。
listen=NO
↓
listen=YES
write_enable=NO
↓
write_enable=YES
listen_ipv6=YESをコメントアウトする。 - vsftpdサービスを再起動する。
$ service vsftpd restart - 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で簡単にダッシュボードを作ってみる。
以上でインストールは完了。
- 必要なパッケージをダウンロードする。
$ 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 - 「/etc/apt/sources.list」に以下を追記する。
deb https://packagecloud.io/grafana/stable/debian/ jessie main
- Package Could Keyをインストールする。
curl https://packagecloud.io/gpg.key | sudo apt-key add -
- Grafanaをインストールする。
sudo apt-get update sudo apt-get install grafana
- 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 -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のサンプルを提供している。さっそく使ってみる。
■jimというユーザでログイン
- 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 - β版のソース一式をダウンロードする。
$ git clone -b v1.0.0-beta https://github.com/hyperledger/fabric-sdk-node.git - 必要なパッケージをインストールする。
$ cd fabric-sdk-node/examples/balance-transfer/
$ sudo npm install - 付属のDocker-compose.yamlを使って、必要なDockerイメージをダウンロードする。
$ docker-compose -f artifacts/docker-compose.yaml pull - 別のターミナル端末を起動し、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を呼び出してみる。
$ 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]}}]},[]]}}
{"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
Ubuntu OSには、Dockcer及びDocker-composeをインストール済みであること。
(参照元URL)
https://hyperledger-fabric.readthedocs.io/en/latest/getting_started.html
- Ubuntu OSにTeratermでログインする。
- 以下のフォルダを作成する。
$ mkdir fabric-sample$ cd fabric-sample - 以下のコマンドを実行する。このコマンドを実行すると、インストールに必要なパッケージをダウンロードしてくれる。(結構時間がかかる)
$curl -sSL https://goo.gl/LQkuoh | bash - docker imagesコマンドでFabricイメージがダウンロードされていることを確認する。
- 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. - 次に、チャネルトランザクションを作成する。
$ 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 - 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 - 以下のコマンドを実行する。
$ ./generateArtifacts.sh mychannel - 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: - クライアントのDockerコンテナを起動する。
$ CHANNEL_NAME=mychannel TIMEOUT=60 docker-compose -f docker-compose-cli.yaml up -d - docker psコマンドを実行し、cliというコンテナが起動していることを確認する。
- cliコンテナにログインする。
$ docker exec -it cli bash - 「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 - 「mychannel」チャネルに「peer0.org1.example.com」を追加する。
$ peer channel join -b mychannel.block - Fabric付属のexample02というチェーンコードをインストールする。
$ peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 - チェーンコードをイニシエトする。
$ 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')" - aという値をクエリしてみる。
$peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
・・・
Query Result: 100
・・・ - チェーンコードを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
・・・
登録:
投稿 (Atom)