Denen blog

株式会社電縁の社員によるブログです。

EthereumにPHPから接続してみた(追記あり)

f:id:yasuaki-sakai:20170405150908j:plain
こんにちは、Denen Blogへようこそ。
株式会社電縁で主にデジタルサイネージ業務を担当している吉田です。

弊社では去年から、ブロックチェーン(Blockchain)事業に取り組んでいます。
直近では Ethereum を使い PHP と連携しましたので、そこら辺のお話をしようかなと思います。

※補足を書きましたのでそちらもご覧下さい。
denen.hatenablog.com


<前提>

<トピック>

  1. 環境
  2. Ethereum の導入
  3. JSON-RPC 呼び出しの準備
  4. PHP からのアクセス

1. 環境

今回は Ubuntu 14.04 LTS を利用します。
OS をインストール後、お決まりのコマンドを叩きます。

$ sudo apt-get update
$ sudo apt-get upgrade

その後 SSH, iptables, ntp などのセットアップをしました。
続いて Apache + PHP です。
PHP のバージョンは 5.5 になります。

$ sudo apt-get install php5 libapache2-mod-php5 php5-curl

2. Ethereum の導入

今回は GO 言語製の Ethereum ノード、 go-ethereum 通称 geth を使用します。
導入にはこちら(http://techmedia-think.hatenablog.com/entry/2016/04/22/190810)を参考にさせていただきました。

まずはリポジトリを追加しましょう。

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo add-apt-repository -y ppa:ethereum/ethereum-dev

ここまで来たら後はインストールを行うだけです。

$ sudo apt-get update
$ sudo apt-get install ethereum

インストールが完了したら早速 geth を起動させてみましょう。
まずはデータディレクトリを作成し、最初のブロック(ジェネシスブロック)の設定を記述します。

$ mkdir ~/eth_private_net
$ vim ~/eth_private_net/my_genesis.json

{
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0xffffffff",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}

続いてジェネシスブロックを生成し、 geth を起動します。

$ geth --datadir "/home/yoshida/eth_private_net" init /home/yoshida/eth_private_net/my_genesis.json
$ geth --networkid 57598955 --port 8955 --nodiscover --datadir "/home/yoshida/eth_private_net" console 2>> /home/yoshida/eth_private_net/geth_err.log

これでコンソールモードになったら起動は成功です。
オプションがいくつか指定されていますが、説明は以下にまとめました。

--networkid
これが共通のノードしか接続されません
--port
待ち受けに使用するポートです。電話番号下4桁にしてみました。
--nodiscover
ノードを自動で探しに行かないようにする設定です。
--datadir
ブロック等のデータが格納されるディレクトリを指定します。
console
起動と同時にコンソールを立ち上げます。

さて、続いては PHP からの呼び出しですが、その前に geth 側でもうちょっと準備を整えましょう。

3. JSON-RPC 呼び出しの準備

PHP からは JSON-RPC を経由してアクセスします。
ここではそこら辺の設定を行っていきます。

まずは現在のアカウント情報を取得します。
※先ほど起動した geth のコンソールを使用します。

> eth.accounts
[]

まだアカウントが作成されていないので作成します。

> personal.newAccount("password")
"0xb83fa0d1c6b34a42f900cca5a32400c3b6f69f4b"
> eth.accounts
["0xb83fa0d1c6b34a42f900cca5a32400c3b6f69f4b"]

これでアカウントが作成されました。
せっかくなので、マイニングを行った時の報酬を受け取れるように設定しておきましょう。

> miner.setEtherbase(eth.accounts[0])

続いて、現在のノードは RPC 呼び出しを許可していないので、オプションを追加して起動しなおしましょう。
まずはいったん geth を終了させます。

> exit

それではオプションを追加して再度起動しましょう

$ geth --networkid 57598955 --port 8955 --nodiscover --rpc --rpcaddr "0.0.0.0" --rpcport "8956" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --datadir "/home/yoshida/eth_private_net" console 2>> /home/yoshida/eth_private_net/geth_err.log

頭に rpc と付いたオプションがいくつか付加されましたね。
説明は以下になります。

--rpc
RPC 待ち受けを許可する
--rpcaddr
RPC 待ち受けに使用するIPアドレス
--rpcport
RPC 待ち受けをするポート。FAX番号下4桁にしてみました。
--rpccorsdomain
RPC へのアクセスを許可するドメインです。"*"だと全て許可するのでノードを公開する際は注意してください。

これでノード側の準備は整いました。
次は PHP からの呼び出しになります。

4. PHP からのアクセス

いよいよ PHP からのアクセスを行うわけですが、ベタ書きするとなかなか大変なのでこちら(https://github.com/btelle/ethereum-php)を利用させてもらいます。
使い方は README にも書いてある通り、 require してクラスを生成するだけです。
今回はテスト用のスクリプトと同じディレクトリに配置して利用してみましょう。

$ cd /home/yoshida/php-eth/
$ ls -l
ethereum.php json-rpc.php
$ vim test.php
<?php

require_once 'ethereum.php';
$ethereum = new Ethereum('localhost', '8956');
print_r($ethereum->eth_accounts());

このスクリプトを実行してみると、以下のようにアカウントのリストが取得出来たかと思います。

$ php test.php
Array
(
[0] => 0xb83fa0d1c6b34a42f900cca5a32400c3b6f69f4b
)

もし接続できない場合はポートの設定などを確認してみましょう。

以上、駆け足で説明しましたが、PHPとの連携も意外と簡単に感じていただけたのではないでしょうか?
スマートコントラクトが絡んでくると少し複雑になってくるのですが、それはまた改めて記事に出来ればと思います。

それでは次の方、よろしくお願いします!

書いた人:デジタルサイネージチーム 吉田
f:id:yasuaki-sakai:20170405150919p:plain