はじめに
署名付きのトランザクションを作成するのに少しハマってしまったのでメモとして残します。
署名付きトランザクションを送信するために秘密鍵を使用し署名します。
署名の方法は色々と纏められている記事を目にしましたが、秘密鍵の取得方法まで纏められている記事を目にしなかったので残しておきます。
環境
- geth:1.8.27
- go:1.12.7
- web3:1.2.1
- ethereumjs-tx:1.3.7
- keythereum:1.0.4
実装
1.ライブラリの読み込み
sample.js
// Transactionの生成に使用する
const EthereumTx = require('ethereumjs-tx');
// Ethereumとの接続、トランザクションの送信に使用する
const Web3 = require('web3');
// 秘密鍵の取得に使用する
const keythereum = require("keythereum");
2.秘密鍵の取得
sample.js
// 第一引数:ユーザーアカウントのアドレス
// 第二引数:key-storeディレクトリのパス
var keyObject = keythereum.importFromFile("address","key-storeへのパス")
// 第一引数:↑で指定したユーザーアカウントのパスワード 第二引数:↑で作成したkeyObject
var privateKey = keythereum.recover('password', keyObject)
keythereum.importFromFile
第一引数には署名するユーザーアカウントのアドレスを設定すればよいです。
第二引数はアカウントを作成すると「UTC・・・」という名前のファイルが「key-store」ディレクトリに作成されます。
この「key-store」の上位ディレクトリを設定します。
/ethereum/data/key-store であれば /ethereum/data を設定します。
3.トランザクションの生成
sample.js
// 送信するトランザクションの内容
// sendTransactionと違い、TOのみの指定、Fromは署名したアカウントになる
const txData = {
nonce: '0x0100',
gasLimit:'0x20000000',
gas:'0x200000',
gasPrice: '0x10',
to: '0x9ee8bde2484bfa8c63fbd25e6059db0fd230a164',
value: '0x86f26fc10000', // 0.01
data: null,
chainId: '任意のchainId'
}
// Transactionを作成する
const tx = new EthereumTx(txData);
4.トランザクションに署名する
sample.js
// Transactionに署名する
Buffer.from(privateKey.toString('hex'), 'hex');
tx.sign(privateKey);
const serializedTx = tx.serialize();
const signedTx = '0x' + serializedTx.toString('hex');
console.log(signedTx);
0xf86a8201001083200000949ee8bde2484bfa8c63fbd25e6059db0fd230a1648686f26fc100008082aae8a023ae5379f1348492f2ba60644d4625147840ee410fc697c9f3821758ca5f5262a07439bcddebd87f688b9cd1dbb763db60d0264fa320e75d24dc4eabf1cc2ea6d2
5.トランザクションの送信
sample.js
const web3 = new Web3(Web3.givenProvider || 'ws://127.0.0.1:16458');
web3.eth.sendSignedTransaction(signedTx).on('transactionHash', function(hash){
console.log(hash);
})
0x756a43dc189da57e7e2d26eb491cff7fe09b7c32432b83e5ac9b2474d4aa536f
最後に
基本的なことなのかもしれませんが、調べるのにかなり時間がかかってしまいました。
英語の公式ドキュメントを読むのがしんどくて日本語の記事に逃げてしまいがちですが、頑張って公式ドキュメントを読むのが一番の近道ですね。