Web3jsを使ってEthereumのブロックチェーンにアクセスする方法




Web3jsとは

Web3jsとはEthereumブロックチェーン上のデータを扱えるようにしたライブラリでJavascriptやPythonで実装されたものがあります。Javascripで実装されているのでブラウザからでもブロックチェーンの情報にアクセスできるのが特徴です。githubはこちら

現時点だとv1.0系が最新なのですがまだ正式版ではないです。今回は安定版のv0.20系での使い方を説明します。

インストール

Node.jsを使うのでnpmでインストールします。–saveをつけておくとpackage.jsonに追加してくれます。

$ npm install --save web3@0.20.5

rpcモードでgethを起動

Web3jsで読み取るブロックチェーンをローカル環境に立ち上げます。gethの基本的な使い方やインストールは下記を参考にしてください。

参考記事:Macのローカル環境でEthereumの送金を行う

gethをインストールした前提で進めます。Web3jsからアクセスするにはgeth起動時のオプションに注意しなければいけません。一個ずつ説明していきます。

$ geth --rpc --rpcapi="db,eth,net,web3,personal" --rpccorsdomain=* --networkid 10 --nodiscover --datadir ./eth_private_net console
  • –rpc:gethをrpcモードで立ち上げ、gethとhttpで通信することができるようになります。
  • –rpcapi:gethで使えるapiを指定します。
  • –rpccorsdomain:クロスドメインを許可する設定ですね。ローカルでは*にしとけばいいです。
  • –networkid:0,1,2,3以外の数字を指定してください。
  • –nodiscover:他のノードを探し必要がない場合につけます。
  • –datadir:ジェネシスブロックやブロックチェーン情報を保存するディレクトリです。

自分は–rpcapiオプションにweb3しか設定せずにAPIを呼び出すとエラーになる原因がわからずかなりの時間を浪費してしまいました。ここで指定しているのはweb3経由で使えるeth、personal、db、netというgethのAPIで使えるものを指定していることになります。なのでアカウントを作成することができるpersonalのAPIを使わせたくない場合はpersonalを省けばいいです。

Node.jsを使ってWeb3jsから呼び出す

まずはweb3というモジュールをrequireしてrpcが立ち上がっているドメインを指定するだけです。これでできたweb3インスタンスを今後使用します。

const Web3 = require('web3');
const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

アカウント情報

ブロックチェーン上のアカウントアドレスを配列で返します。

web3.eth.getAccounts((error, result) => {
	console.log(result)
});
// [ '0xdc373f368024b5d0332436c4ce76f318bf96ddbb','0xb412662ddcd7adc0bb6ccd5ab79e23fe5f7e021b' ]

 ブロック情報

web3.eth.getBlock(0, (error, result) => {
    console.log(result);
});


{ difficulty: { [String: '1048576'] s: 1, e: 6, c: [ 1048576 ] },
 extraData: '0x3535353535353535353535353535353535353535353535353535353535353535',
 gasLimit: 16777216,
 gasUsed: 0,
 hash: '0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d',
 logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
 miner: '0x0000000000000000000000000000000000000000',
 mixHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
 nonce: '0x0000000000000042',
 number: 0,
 parentHash: '0x0000000000000000000000000000000000000000000000000000000000000000',
 receiptsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
 sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
 size: 540,
 stateRoot: '0x217b0bbcfb72e2d57e28f33cb361b9983513177755dc3f33ce3e7022ed62b77b',
 timestamp: 0,
 totalDifficulty: { [String: '1048576'] s: 1, e: 6, c: [ 1048576 ] },
 transactions: [],
 transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
 uncles: [] }

残高情報

アカウント2つぶんの残高を表示しときます。

web3.eth.getBalance('0xdc373f368024b5d0332436c4ce76f318bf96ddbb', (error, result) => {
    console.log(result);
});web3.eth.getBalance('0xdc373f368024b5d0332436c4ce76f318bf96ddbb', (error, result) => { console.log(result); });

web3.eth.getBalance('0xb412662ddcd7adc0bb6ccd5ab79e23fe5f7e021b', (error, result) => {
 console.log(result);
});

{ [String: '875000000000000000000'] s: 1, e: 20, c: [ 8840000 ] }
{ [String: '10000000000000000000'] s: 1, e: 19, c: [ 110000 ] }

送金

送金する際は送金側のアカウントロックを先に解除しておきます。解除はgethコンソール状で行います。アカウント作成時に入力したパスフレーズを入力して解除できたらtrueと表示されます。

> personal.unlockAccount(eth.accounts[0])
Unlock account 0xdc373f368024b5d0332436c4ce76f318bf96ddbb
Passphrase:
true

sendTransaction()メソッドで送金できます。デフォルトの単位はweiです。

var _sendTransaction = web3.eth.sendTransaction({from: "0xdc373f368024b5d0332436c4ce76f318bf96ddbb", to: "0xb412662ddcd7adc0bb6ccd5ab79e23fe5f7e021b", value: 1000000000000000000});
console.log(_sendTransaction)

// 0x5dbe313130cc61f4e230323f374b4f4c97240b71a5341b7602e752ef5280e7f0

ここでメソッドを実行しただけでは送金は完了しません。gethからマイニングを実行しなければいけません。

> miner.start()
INFO [03-04|15:51:20] Updated mining threads                   threads=0
INFO [03-04|15:51:20] Transaction pool price threshold updated price=18000000000
INFO [03-04|15:51:20] Starting mining operation
null
> INFO [03-04|15:51:20] Commit new mining work                   number=178 txs=1 uncles=0 elapsed=1.934ms
INFO [03-04|15:51:24] Successfully sealed new block            number=178 hash=419c2f…419d40
INFO [03-04|15:51:24] 🔨 mined potential block                  number=178 hash=419c2f…419d40
INFO [03-04|15:51:24] Commit new mining work                   number=179 txs=0 uncles=0 elapsed=194.89µs
INFO [03-04|15:51:26] Successfully sealed new block            number=179 hash=d1c7b5…ab28e4
INFO [03-04|15:51:26] 🔨 mined potential block                  number=179 hash=d1c7b5…ab28e4
INFO [03-04|15:51:26] Commit new mining work                   number=180 txs=0 uncles=0 elapsed=182.476µs
> miner.stop()
true

一回でもマイニングができたらトランザクションが承認されて残高に反映されます。

web3.eth.getBalance('0xdc373f368024b5d0332436c4ce76f318bf96ddbb', (error, result) => {
    console.log(result);
});

web3.eth.getBalance('0xb412662ddcd7adc0bb6ccd5ab79e23fe5f7e021b', (error, result) => {
    console.log(result);
});

{ [String: '884000000000000000000'] s: 1, e: 20, c: [ 8840000 ] }
{ [String: '11000000000000000000'] s: 1, e: 19, c: [ 110000 ] }

account[0]の方はマイニング報酬が付与されているのでもとより増えていますが、account[1]の方は1ETHだけ増えているのが確認できました。

まとめ

Web3jsを使うとgethのコマンドをNode.jsから使えるようになりました。これでサーバーとブラウザの両方からブロックチェーン上のデータにアクセスできるしトランザクションを発行することができます。

分散アプリケーションを作成する上でWeb3jsはマストのツールになるのでぜひ使ってみてください。

おすすめ書籍

Ethereumを使ったDApps開発を学びたいなら今だとこの1冊が1番良いです!開発環境の構築から使うべきツール、フレームワーク、実装方法・注意点まで網羅的に解説されている書籍なのでおすすめです。出版も2018年1月ということでかなり新しい本で、DMM Bitcoinを作っているネクストカレンシー所属の方が書いているので信頼できます。

ビットコインとブロックチェーンの詳細をしっかりと学びたい方にはこちらの書籍が非常におすすめです。ウォレットの仕組み、楕円曲線暗号、P2Pプロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です