• Home
  • イーサリアムのウォレットをNode.jsで作る

イーサリアムのウォレットをNode.jsで作る

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*********'); <a href="#note">※</a>
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*********'); <a href="#note">※</a>
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、またはアプリケーションから残高照会やトランザクションの取得、送信などの機能を実装することが可能となります。

ご相談・お見積もり

03-5207-2689