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プロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す