EthereumにPHPから接続してみた(追記あり)
こんにちは、Denen Blogへようこそ。
株式会社電縁で主にデジタルサイネージ業務を担当している吉田です。
弊社では去年から、ブロックチェーン(Blockchain)事業に取り組んでいます。
直近では Ethereum を使い PHP と連携しましたので、そこら辺のお話をしようかなと思います。
※補足を書きましたのでそちらもご覧下さい。
denen.hatenablog.com
<前提>
- Blockchain がなんとなくどんなものか理解している
- プログラミング言語を何かしら理解している
<トピック>
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との連携も意外と簡単に感じていただけたのではないでしょうか?
スマートコントラクトが絡んでくると少し複雑になってくるのですが、それはまた改めて記事に出来ればと思います。
それでは次の方、よろしくお願いします!
書いた人:デジタルサイネージチーム 吉田