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
    ・・・

2017年6月8日木曜日

Git bashプロンプト上でdockerコマンドが使えないときの対処

Git bashとDocker for windowsをインストール済みの状態。
Git bashプロンプトを起動し、docker ps コマンドを実行すると、以下のエラーが表示された。

$ docker ps
An error occurred trying to connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/images/json: open //./pipe/docker_engine: The system cannot find the file specified.

上記のエラーを解決する手順を説明する。


参考URL
https://github.com/moby/moby/issues/22338

2017年6月4日日曜日

簡単に個人間送金ができる Interledger

簡単に個人間送金ができるアプリとして、「Interledger」 なるものがあるらしい。



デモがあるということなので、さっそくアカウントを登録して(ウォレットを作成)、ログインしてみた。デザインが非常にシンプル。


わかったこと
  • Interledgerでは、Interledger Protocol(略してILP)というプロトコルを使って送金を実現しているらしい。このプロトコルは、 RFC 1122, RFC 1123 、RFC 1009といったRFC規約に強く準拠しているらしい。
  • 株、為替、債券などの異なる資産や台帳でも相互にやりとりできるらしい。この相互のやりとりを実現するために、W3Cが標準規約のAPIやプロトコルを策定中である。

    https://w3c.github.io/webpayments/proposals/interledger-payment-method.html
  • コアな処理はJava言語で実装されている。
  • Interledgerのモデルは下図を参照(Interledgerサイトより抜粋)。「Connector」というものが様々な台帳のつなぎ役になっている。また、Connector同士が情報を交換しやって、SenderからReceiverまでの最適なルートを決定するらしい(multi-hop paymentといわれる 。これが肝か)。


(執筆途中)


Dockerを使ってWindows OS上でUbuntu OSを動かしてみる

自宅のWindows OSにDocker for windowsをインストールした。ついでに、DockerリポジトリからUbuntu OSイメージをダウンロードして動かしてみる。


  1. Dockerプロンプトを起動する。
  2. dockerコマンドを実行してUbuntu OSをダウンロードする。docker pull <対象イメージ>でダウンロードできる。
  3. Ubuntuイメージがダウンロードされていることを確認する。docker imagesコマンドで確認できる。
  4. Ubuntuコンテナを作成する。docker runコマンドを実行する。-iオプションは対話形式、-tはTTY端末で起動する。
  5. Ubuntuのバージョンを確認する。Ubuntu 16.04.2 LTSがインストールされてますね。