web3ライブラリを使ったウォレット操作を確認する。
確認環境:nodejs(v1.0.0-beta.48)、npm(v6.9.0)、nvm(v8.12.0)
●残高取得(balance.js)
const Web3 = require("web3"); const provider = new Web3.providers.HttpProvider('https://mainnet.infura.io/W1ghsx*********'); ※ web3 = new Web3(provider); const address = "0x*****************(0xから始まる42桁)"; getBalance(address) .then((balance) => { console.log(balance); }) .catch((e) => { console.log(e); }); function getBalance(address) { return web3.eth.getBalance(address); };
▼ 1000000 (残高が表示される)
●トランザクション取得(transaction.js)
const Web3 = require("web3"); const provider = new Web3.providers.HttpProvider('https://mainnet.infura.io/W1ghsx*********'); ※ web3 = new Web3(provider); const transactionId = "0x***********************(0xから始まる66桁)"; getTransaction(transactionId) .then((balance) => { console.log(balance); }) .catch((e) => { console.log(e); }); function getTransaction(transactionId) { return web3.eth.getTransaction(transactionId); };
●送金処理
送金処理は主に、①燃料計算(GAS)、②nonceの取得、③署名、④送金からなる。
①燃料計算(GAS)
Ethereum.prototype.getGasPrice = function() { return new Promise((resolve, reject) => { web3.eth.getGasPrice((error, result) => { if (error) { reject(error); } const price1 = parseInt(new BN(result).dividedBy(1e9).toString(10)); const price2 = new BN(price1).plus(2).toString(10); const price3 = new BN(price2).multipliedBy(1e9).toString(10); resolve(price3); }); }); };
②nonce(NumberONCE)の取得
nonce:送金元アドレスの送金回数(トランザクション数)。二重送金を防ぐ目的で使用される。
Ethereum.prototype.getNonce = function(address) { return web3.eth.getTransactionCount(address); };
③署名
Ethereum.prototype.createSign = function(private_key, to_address, amount, gas_price, nonce) { try { const gas_limit = 21000; const send_amount = new BN(amount.toString()).multipliedBy(1e18).toString(10); const key = private_key.substr(0, 2) == "0x" ? private_key.substr(2) : private_key; const parameter = { nonce: nonce, to: to_address, value: "0x" + send_amount.toString(16), data: '', gasPrice: "0x" + gas_price.toString(16), gas: "0x" + gas_limit.toString(16) }; const tx = new EthereumTx(parameter); tx.sign(Buffer.from(key, 'hex')); const serializedTx = tx.serialize(); return '0x' + serializedTx.toString('hex'); } catch(e) { return (e); } };
④送金
Ethereum.prototype.send = function(signature) { return new Promise((resolve, reject) =>{ web3.eth.sendSignedTransaction(signature) .on('transactionHash', function(tx_hash){ resolve(tx_hash); }) .on('error', function(err) { reject(err) }); }); };
※ INFRAで取得したAPIを取得することで手軽にテストや運用ができる。
INFURA(https://infura.io/)は、Ethereumのノードをホスティングしてくれるサービス。
提供されている、すでに同期済みのノードを使うことで同期にかかる容量や時間を無駄にすることなくEthereumネットワークに参加することが出来る。
web3.js(Ethereum JavaScript API)を用いることで、WEB、またはアプリケーションから残高照会やトランザクションの取得、送金などの機能を実装することが可能となります。