web3.jsでEthereumのwallet作成 (with Nuxt.js)
はじめに
web3.jsを使ってEthereumの送金処理を作成してみました。 フレームワークには、Nuxt.jsを使いました。
GitHub
今回作成したサンプルはこちらから
ひとまず、実装したのは以下の基本的な機能のみ。 web3.jsからプライベートネットのAPIを叩いていきます。
- nodeの状態確認
- addressの新規作成
- addressの一覧(及びbalance)
- 送金機能
事前準備 PrivateNet
前提として、EthereumのPrivateNetを起動する必要があります。
以下のようなコマンドになりますが、この部分の詳しい説明はここでは省きます。
PrivateNetを起動する事によりweb3.js
から利用できるAPIが用意されます。
geth --networkid "10" \ --nodiscover \ --datadir `pwd` \ --rpc \ --rpcaddr "localhost" \ --rpcport "8545" \ --rpccorsdomain "*" \ --rpcapi "eth,net,web3,personal,accounts" \ console 2>> `pwd`/geth_err.log
--rpcapi "eth,net,web3,personal,accounts"
rpcapi
のオプションで、web3
を許可しておく必要があります。
rpcapi
はAPIで受け付けるHTTP-RPCインターフェースの種類の指定になります。
アカウント新規作成
personal.newAccount("password")
coinbaseの設定
miner.setEtherbase(eth.accounts[0])
マイニングを開始
> miner.start()
マイニングを開始する事で、送金時のトランザクションが処理されます。
web3.js (Ethereum JavaScript API)
Generic JSON RPC仕様を実装したEthereum互換のJavaScript APIとの事。 https://github.com/ethereum/web3.js
npm install web3
web3.jsを経由してNuxt内部でEthereumのAPIを利用していきます。
CoinBase
bakanceを取得する簡単な例。
import Web3 from 'web3'; const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); const address = "0x5d8cd11ab2867895a3ce1b38f04569716ccec273" web3.eth.getBalance(address).then( balance => { console.log(balance) }); => 27638999999998999999700
JSON-RPC
web3.jsのAPIは、JSON-RPCから取得する方法もあります。 以下、初歩的な呼び出し方法。
curl -H "Content-type: application/json" -H "Accept: application/json" -X POST http://localhost:8545 --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":1}' => {"jsonrpc":"2.0","id":1,"result":"Geth/v1.8.3-stable/darwin-amd64/go1.10.1"}
Node情報の取得
web3.jsから情報を取得して、Vue.jsのdataに格納しています。
this.Host = web3.currentProvider.host; web3.eth.isMining().then(val=>this.IsMining=val); web3.eth.getHashrate().then(val=>this.HashRate=val); web3.eth.getGasPrice().then(val=>this.GasPrice=val); web3.eth.getBlockNumber().then(val=>this.BlockNumber=val); web3.eth.net.getId().then(val=>this.NetId=val); web3.eth.net.getPeerCount().then(val=>this.PeerCount=val);
Addressの新規作成
web3.eth.personal.newAccount(this.Password).then(()=>{ this.Password = ""; web3.eth.getAccounts().then(val=>this.Accounts=val); });
Addressの一覧の取得
web3.eth.getAccounts().then(val=>this.Accounts=val);
送金処理
web3.eth.personal.unlockAccount(this.CoinBase, this.PassWord).then(()=> { web3.eth.sendTransaction({ from: this.CoinBase, to: this.To, value: this.SendValue }, (error, txHash) => { console.log("Transaction Hash:", txHash, error); this.TransactionHash = txHash; this.SendValue = 0; this.To = this.Accounts[0]; if (!error) { web3.eth.getBalance(this.CoinBase).then(val => this.Balance = val); } else { alert("Ether Transfer Failed"); } });
Command
web3.jsを利用せずに直接ethを送金するコマンド
eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[0], value: web3.toWei(3, "ether")})
バランスの確認
eth.getBalance(eth.accounts[0])
ブロックナンバーの確認
eth.blockNumber
ハッシュレートの確認
eth.hashrate
coinBase指定
miner.setEtherbase(eth.accounts[1])
現在のcoinBase確認
eth.coinbase =>"0x4338f1861bca03160caa6986fe6b816411c74807"
参考サイト
Web3.js document https://web3js.readthedocs.io/en/1.0/index.html