プライベート Ethereum ブロックチェーンを IBM Cloud Kubernetes Service にデプロイする

Ethereum というオープンソースのブロックチェーン・プラットフォームを使用すると、誰もがブロックチェーン上で稼動する分散アプリケーションを構築できます。Ethereum で提供している Ethereum Virtual Machine (EVM) という分散型の万能チューリング仮想マシンは、パブリック・ノードからなる国際ネットワークを使ってスクリプトを実行することができます。Ethereuem は適応性に優れ、柔軟に使用できるだけでなく、Solidity プログラミング言語を使ってスマート・コントラクトをブロックチェーンにデプロイする機能も備えています。

Docker と同じく、IBM Cloud Kubernetes Service はアプリケーションをパッケージ化して実行するために利用できるオープンソースの開発ツールです。このサービスを使用してパッケージ化したアプリケーションは、最小限の機能を備えた Linux マシンと、そのアプリケーションを実行するために必要な依存関係がすべて揃っている環境であれば、どの環境でも実行することができます。アプリケーションをコンテナー化するということは、そのアプリケーションが隔離されたコンテナー内で実行されることになります。コンテナーとは、明示的に定義され、再現可能かつ移植可能な環境であり、商品をコンテナーに収容して配送する貨物輸送に例えられています。このチュートリアルで取り上げるコンピューティングのシナリオでは、アプリの動作環境はアプリのコンテナーです。この動作環境を、Docker を使用してアプリケーションと併せて配送します。IBM Cloud Kubernetes Service を利用すれば、Docker コンテナーを使用してコンテナー化したアプリケーションを IBM Cloud 上で実行できます。

学習の目的

プライベート Ethereum ブロックチェーンを IBM Cloud 上にデプロイする簡単な方法を学びます。

前提条件

  • IBM Cloud CLI をインストールします。手順については、このリンク先の IBM Cloud 資料を参照してください。
  • Docker をインストールします。手順については、このリンク先の Docker ドキュメントを参照してください。
  • Kubectl をインストールします。手順については、このリンク先の Kubernetes ドキュメントを参照してください。
  • Geth (Go-Ethereum クライアント) をインストールします。手順については、このリンク先の Geth ドキュメントを参照してください。

所要時間

およそ 1 時間で、ブロックチェーン・ネットワークを IBM Cloud にデプロイします。

手順

Docker イメージをビルドする

  1. 新しいディレクトリーを作成して、カレント・ディレクトリーをそのディレクトリーに変更します。

     mkdir blockchain
     cd blockchain
    
  2. touch Dockerfile を使用して空の Docker ファイルを作成します。作成した Dockerfile 内に、以下のコードを貼り付けます。

     FROM ubuntu:latest
     # Get the Ethereum Stuffs
     RUN apt-get update
     RUN apt-get install -y software-properties-common
     RUN apt-get install -y build-essential git
     RUN add-apt-repository ppa:longsleep/golang-backports
     RUN apt-get update
     RUN apt-get install -y golang-go
     RUN git clone https://github.com/ethereum/go-ethereum
     WORKDIR /go-ethereum
     RUN make geth
     WORKDIR /
     # House the data here
     RUN mkdir /block-data
     # Pass in the genesis block.
     COPY GenesisBlock.json GenesisBlock.json
     RUN ln -sf /go-ethereum/build/bin/geth /bin/geth
     EXPOSE 22 8088 50070 8545
     ENTRYPOINT geth --datadir /block-data init /GenesisBlock.json; geth --port 3000 --networkid 58342 --nodiscover --datadir=./block-data --maxpeers=0  --rpc  --rpcaddr 0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,miner"
    
  3. touch GenesisBlock.json を使用して、ブロックチェーン・ネットワークを構成するための空のファイルを作成します。新しく作成した構成ファイル内に、以下のコードを貼り付けます。

     {
         "config": {
           "chainId": 456719,
           "homesteadBlock": 0,
           "eip155Block": 0,
           "eip158Block": 0
         },
         "nonce": "0x0000000000000042",
         "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
         "difficulty": "0x000",
         "coinbase": "0x3333333333333333333333333333333333333333",
         "timestamp": "0x0",
         "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
         "extraData": "0x",
         "gasLimit": "0x8888000",
         "alloc": {
         }
       }
    
  4. Docker イメージをビルドします。

     docker build -t myimage .
    

    alt

  5. docker images コマンドを実行して、イメージがビルドされたことを確認します。

Docker イメージを IBM Cloud Kubernetes Service にデプロイする

IBM Cloud 上でコンテナー・サービス・インスタンスを作成する

  1. IBM Cloud による Kubernetes ベースのコンテナー・サービスにアクセスして、新しいクラスターを作成します。クラスターに固有の名前を付けます。ここではとりあえず、ether と名付けます。

    1

  2. サービスが完全にデプロイされるまで待ちます。

    1

コンテナーをセットアップする

  1. 以下のコマンドを実行して、このコンテナー・サービス用の IBM Cloud CLI プラグインをインストールします。

     bx plugin install container-service -r Bluemix
    
  2. IBM Cloud CLI を使用して、IBM Cloud アカウントにログインします。

     bx login -a https://api.ng.bluemix.net
    
  3. ターミナルのコンテキストを、作成したクラスターに設定します。

     bx cs cluster-config <cluster_name_or_id>
    

    1

  4. 構成ファイルのダウンロードが完了すると、コマンドが表示されます。このコマンドを使用して、ローカル Kubernetes 構成ファイルのパスを環境変数として設定できます。例:

     export KUBECONFIG=/Users/saifrehman/.bluemix/plugins/container-service/clusters/ether/kube-config-dal10-ether.yml
    

マシンから IBM Cloud Private レジストリーにイメージをプッシュする

次は、IBM Cloud 上の Container Registry にイメージをプッシュします。それにはまず、このレジストリーを指すタグをイメージに設定します。その上で、ローカル・イメージを選択し、ターゲットとする名前空間とリポジトリーを指定します。

  1. 最初の名前空間に付ける名前を指定して、その名前空間を作成します。例:

     bx cr namespace-add etherprivate
    
  2. ローカル Docker デーモンを IBM Cloud Container Registry にログインさせます。

     bx cr login
    
  3. Docker イメージにタグを付けます。例:

     docker tag myimage registry.ng.bluemix.net/etherprivate/myimage
    
  4. イメージを IBM Cloud Private レジストリーにプッシュします。例:

     docker push registry.ng.bluemix.net/etherprivate/myimage
    

IBM Cloud 上の Kubernetes クラスターにイメージをデプロイする

  1. touch service.deployment.yml を使用して、Kubernetes デプロイメントを構成するための空のファイルを作成します。新しく作成した構成ファイル内に、以下のコードを貼り付けます。

     apiVersion: extensions/v1beta1
     kind: Deployment
     metadata:
      name: blockchain-server-test # give any name
     spec:
      replicas: 3
      template:
        metadata:
          name: blockchain-server-test
          labels:
            run: etherprivate
        spec:
          containers:
            - name: ether
              image: "registry.ng.bluemix.net/etherprivate/myimage" # your registery name
              imagePullPolicy: Always
     --
     apiVersion: v1
     kind: Service
     metadata:
      name: my-service-test-11 # give a service name
      labels:
        run: etherprivate
     spec:
      type: NodePort
      selector:
        run: etherprivate
      ports:
       - protocol: TCP
         port: 8545 # it shall be 8545 and no other port !!!!!
         nodePort: 30090 # Give a port to access the application publically
    

以下の設定を変更する必要があるかどうか確認してください。

  • アプリケーションに指定するメタデータ名
  • 作成するコンテナーの名前
  • IBM プライベート・レジストリー内に作成したイメージの名前
  • ポート (チュートリアルの例ではポート 8545 を使用しています)
  • ノード・ポート (30000 から 60000 までの任意のポート番号を指定できます)

  • Kubernetes クラスターの構成を保存して、以下のコマンドを実行します。

     kubectl create -f service-deployment.yml
    
  • クラスターがデプロイされると、ワーカー・ノードのパブリック IP を使用してアプリケーションにアクセスできるようになります。

    alt

プライベート Ethereum ブロックチェーンをテストする

  1. アプリケーションが稼動していることを確認するために、以下の curl コマンドを実行します(出力が表示されなくても心配しないでください。現時点では、このコマンドからは何も返されません)。

     curl http://169.47.252.115:30090
    
  2. geth を使用して、IBM Cloud Kubernetes Service 上で稼動しているプライベート Ethereum ブロックチェーンにアクセスします。

     geth attach http://169.47.252.115:30090
    

    モデルの追加

これで、IBM Cloud 上で稼動中の Ethereum ブロックチェーンを使用できます!

マイニングを開始するために一般的に使用するコマンド

  • 新しいアカウントの作成: personal.newAccount('password')
  • アカウントのロック解除: personal.unlockAccount(web3.eth.coinbase, "password", 15000)
  • マイニングの開始: miner.start()
  • マイニングの停止: miner.stop()

alt

まとめ

おめでとうございます!プライベート Ethereum ブロックチェーンを IBM Cloud 上にセットアップすることに成功しました。これで、ブロックチェーンにアクセスして Solidity スマート・コントラクトをデプロイし、IBM Cloud 上で分散アプリケーションを作成できます。