Develop with pleasure!

福岡でCloudとかBlockchainとか。

Openchain Serverのセットアップ

カラードコインの実装としてメジャーなOpen Assets Protocolを作ったCoinprismがリリースしたOpenchainのサーバをセットアップしてみた。

Openchainについては↓のブログで詳しく説明されてる。

coinandpeace.hatenablog.com

中身についてはまだ詳しく把握してないので、実際に使ってみた方が理解が進むのと、openassets-rubyと上手く連携できないかと思い、まずは開発環境をセットアップ。(いずれも環境はUbuntu 14.04LTS)

Docker使うパターン

ホントこういったアプリケーション含めた環境をお手軽に配布・実行できるコンテナは便利ね。

事前準備
  • Dockerのインストール
$ wget -qO- https://get.docker.com/ | sh
  • Docker Composeのインストール
$ sudo apt-get install python-pip
$ sudo pip install -U docker-compose
Openchain Serverのインストールと設定

インストールといってもDockerイメージ取得するだけ。

$ git clone https://github.com/openchain/docker.git openchain
$ cd openchain
$ cp templates/docker-compose-direct.yml docker-compose.yml
$ cp templates/project.json openchain/project.json
$ mkdir data
$ cp templates/config.json data/config.json

data/config.jsonのinstance_seedにランダム文字列を設定する。chain namespaceを生成するのに使われるみたい。

{
  // Websocketで受け付けるtransaction streamをこのインスタンスで有効にするかどうかの設定
  "enable_transaction_stream": true,

  "storage": {
    // 使用するストレージエンジンを指定。(SQLiteかMSSQLを指定可能)
    "provider": "SQLite",
    // SQLiteを選択した場合は、"path"でDBファイルのパスを指定。
    "path": "ledger.db"
  },

  // validatorとして起動するかobserverとして起動するかで下記設定をする(↓はvalidatorとして起動する設定)

  // validatorとして起動する際の設定パラメータ
  "validator_mode": {
    // このインスタンスを識別するための一意なランダム文字列。
    "instance_seed": "ランダムな文字列",
    "validator": {
      // トランザクションが登録された際にOpenchainサーバで実行される検証タイプ。(現在サポートされるのは"PermissionBased"のみ)
      "provider": "PermissionBased",
      // P2PKHアカウント(/p2pkh/<address>)を有効にするかどうか
      "allow_p2pkh_accounts": true,
      // 第三者が発行したアカウント(/asset/p2pkh/<address>/)を有効にするかどうか
      "allow_third_party_assets": true,
      // 管理者権限を持つアドレスのリスト
      "admin_addresses": [
      ],
      "version_byte": 76
    }
  },

  // observerとして起動する際の設定パラメータ
  // "observer_mode": {
  //   "upstream_url": ""
  // },

  "anchoring": {
    // アンカリングの際に使われるプロバイダで現状設定できるのは"Blockchain"のみ。
    "provider": "Blockchain",
    // WIF形式の秘密鍵で、Blockchainにトランザクションをパブリッシュする際の署名に使われる。
    "key": "",
    // CoinprismのAPIのエンドポイント。listunspentと署名したトランザクションをブロードキャストする際に利用する。(mainnetの場合は https://api.coinprism.com/v1/ )
    "bitcoin_api_url": "https://testnet.api.coinprism.com/v1/",
    // トランザクションを公開するネットワークのnetwork byte
    "network_byte": 111,
    // ドキュメントには記載ないけどアンカリングでブロードキャストするトランザクションの手数料?
    "fees": 5000,
    "storage": {
      // anchorのキャッシュ方法。現在サポートされてるのは"SQLite"のみ
      "provider": "SQLite",
      "path": "anchors.db"
    }
  }
}

Openchain Serverはデフォで8080ポートで起動するので、変更したい場合はdocker-compose.ymlのポート設定を変更する。

ちなみにOpenchainのDockerファイル↓見るとわかるけど、ベースとなってるイメージがMicrosoftASP.NET 5用のDocker ImageでLinuxベースのコンテナにdnx環境が構築される。
そうOpenchain ServerはC#で書かれていて、Linux上ではクロスプラットフォーム環境であるdnx上で動かすと。

FROM microsoft/aspnet:1.0.0-rc1-update1-coreclr

RUN mkdir /openchain
COPY project.json /openchain/project.json

WORKDIR /openchain

RUN cd /openchain \
&& dnu restore

EXPOSE 8080
ENTRYPOINT ["dnx", "start", "--server.urls", "http://0.0.0.0:8080"]

https://github.com/openchain/docker/blob/master/openchain/Dockerfile
Openchain Serverの起動

↓のコマンドでOpenchain serverがバックグラウンドで起動する。(フォアグラウンドで動かす場合は-dを省略)

$ sudo docker-compose up -d

docker logsで正常に起動しているか確認できる。

$ sudo docker logs openchain-server
info: General[0]
      [2016-01-09 08:36:12Z] Starting Openchain v0.5.0 (DNXCore,Version=v5.0)
info: General[0]
      [2016-01-09 08:36:12Z]  
info: General[0]
      [2016-01-09 08:36:12Z] Stream subscriber disabled
info: General[0]
      [2016-01-09 08:36:12Z] Anchoring disabled
Hosting environment: Production
Now listening on: http://0.0.0.0:8080
Application started. Press Ctrl+C to shut down.

再起動する場合は、

$ sudo docker-compose restart

停止する場合は、

$ sudo docker-compose stop

Docker使わずマシン上に構築するパターン

事前準備

Understanding package management on .NET | CoreCLR site をインストールする。

必要なパッケージをインストール。

$ sudo apt-get install libunwind8 libssl-dev unzip mono-devel libsqlite3-dev make automake libtool curl

libuvのインストール。
(ソースからビルドしないとUnable to find an entry point named uv_loop_sizeとか怒られる)

$ curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/src
$ cd /usr/local/src/libuv-1.4.2
$ sudo sh autogen.sh
$ sudo ./configure
$ sudo make
$ sudo make install 
$ sudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/
$ sudo ldconfig

ルート証明書を入手。

$ mozroots --import --sync

DNVMのインストール。(dnvmは.Net Coreのバージョン管理ツールでrvmやnvmみたいなもの)

$ curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh

.NET Core DNXのインストール。

$ dnvm install latest -r coreclr -u
プロジェクトファイルのダウンロード
$ wget https://raw.githubusercontent.com/openchain/openchain/master/src/Openchain/project.json
$ wget https://raw.githubusercontent.com/openchain/openchain/master/src/Openchain/Webroot/App_Data/config.json -P Webroot/App_Data
$ dnu restore

dnu restoreするとproject.jsonに記述された依存ライブラリを入手してくれるんだけど、↑でダウンロードしたproject.jsonに記載されているバージョン0.5.1-rc1は見つからないので↓のように0.5.0-rc1に書き換えた。

{
  "entryPoint": "Openchain.Server",

  "dependencies": {
    "Openchain.Server": "0.5.0-rc1",

    "Openchain.Sqlite": "0.5.0-rc1",
    "Openchain.Validation.PermissionBased": "0.5.0-rc1",
    "Openchain.Anchoring.Blockchain": "0.5.0-rc1"
  },

  "userSecretsId": "Openchain.Server",

  "commands": {
    "start": "Microsoft.AspNet.Hosting --webroot \"Webroot\" --server Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:8080"
  },

  "frameworks": {
    "dnxcore50": { },
    "dnx451": { }
  },

  "publishExclude": [
    "**.xproj",
    "**.user",
    "**.vspscc"
  ]
}

Webroot/App_Data/config.jsonは↑のconfig.jsonと同じものなので、適宜編集する。

Openchain Serverの起動
$ dnx start
info: General[0]
      [2016-01-09 10:04:47Z] Starting Openchain v1.0.0 (DNXCore,Version=v5.0)
info: General[0]
      [2016-01-09 10:04:47Z]  
warn: General[0]
      [2016-01-09 10:04:48Z] No root URL is configured, this instance is not able to validate transactions
info: General[0]
      [2016-01-09 10:04:48Z] Stream subscriber disabled
info: General[0]
      [2016-01-09 10:04:48Z] Anchoring disabled
Hosting environment: Production
Now listening on: http://localhost:8080
Application started. Press Ctrl+C to shut down.

と起動する。

マシン上に直接環境作るケースだと途中いろいろエラーが発生したので、お手軽に試すならDockerイメージ使うのがオススメ。