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 イメージをビルドする
新しいディレクトリーを作成して、カレント・ディレクトリーをそのディレクトリーに変更します。
mkdir blockchain cd blockchain
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"
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": { } }
Docker イメージをビルドします。
docker build -t myimage .
docker images
コマンドを実行して、イメージがビルドされたことを確認します。
Docker イメージを IBM Cloud Kubernetes Service にデプロイする
IBM Cloud 上でコンテナー・サービス・インスタンスを作成する
IBM Cloud による Kubernetes ベースのコンテナー・サービスにアクセスして、新しいクラスターを作成します。クラスターに固有の名前を付けます。ここではとりあえず、
ether
と名付けます。サービスが完全にデプロイされるまで待ちます。
コンテナーをセットアップする
以下のコマンドを実行して、このコンテナー・サービス用の IBM Cloud CLI プラグインをインストールします。
bx plugin install container-service -r Bluemix
IBM Cloud CLI を使用して、IBM Cloud アカウントにログインします。
bx login -a https://api.ng.bluemix.net
ターミナルのコンテキストを、作成したクラスターに設定します。
bx cs cluster-config <cluster_name_or_id>
構成ファイルのダウンロードが完了すると、コマンドが表示されます。このコマンドを使用して、ローカル Kubernetes 構成ファイルのパスを環境変数として設定できます。例:
export KUBECONFIG=/Users/saifrehman/.bluemix/plugins/container-service/clusters/ether/kube-config-dal10-ether.yml
マシンから IBM Cloud Private レジストリーにイメージをプッシュする
次は、IBM Cloud 上の Container Registry にイメージをプッシュします。それにはまず、このレジストリーを指すタグをイメージに設定します。その上で、ローカル・イメージを選択し、ターゲットとする名前空間とリポジトリーを指定します。
最初の名前空間に付ける名前を指定して、その名前空間を作成します。例:
bx cr namespace-add etherprivate
ローカル Docker デーモンを IBM Cloud Container Registry にログインさせます。
bx cr login
Docker イメージにタグを付けます。例:
docker tag myimage registry.ng.bluemix.net/etherprivate/myimage
イメージを IBM Cloud Private レジストリーにプッシュします。例:
docker push registry.ng.bluemix.net/etherprivate/myimage
IBM Cloud 上の Kubernetes クラスターにイメージをデプロイする
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 を使用してアプリケーションにアクセスできるようになります。
プライベート Ethereum ブロックチェーンをテストする
アプリケーションが稼動していることを確認するために、以下の
curl
コマンドを実行します(出力が表示されなくても心配しないでください。現時点では、このコマンドからは何も返されません)。curl http://169.47.252.115:30090
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()
まとめ
おめでとうございます!プライベート Ethereum ブロックチェーンを IBM Cloud 上にセットアップすることに成功しました。これで、ブロックチェーンにアクセスして Solidity スマート・コントラクトをデプロイし、IBM Cloud 上で分散アプリケーションを作成できます。