doroidpanic.com

Metamaskからエクスポートした秘密鍵をweb3jsとethereumjsでインポートしてみる

EthreumJS


var pk = "0f0ed71771c3cb767ce1eca984f....";// Metamaskからエクスポートした秘密鍵文字列
var pu = ethereumjs.Util.privateToPublic("0x" + pk );

console.log( pu.toString("hex") ); // アドレスがMetamaskと一致

// Metamaskからエクスポートしたまま、Prefixがないとダメ
var pu = ethereumjs.Util.privateToPublic("0x" + pk );
Uncaught RangeError: private key length is invalid
    at Object.exports.isBufferLength (assert.js:31)
    at Object.publicKeyCreate (index.js:61)
    at Object.exports.privateToPublic (index.js:356)
    at :1:25

Web3は秘密鍵のチェックがあまい?


web3  = new Web3();

var pk = "0f0ed71771c3cb767ce1eca984f....";// Metamaskからエクスポートした秘密鍵文字列

var account = web3.eth.accounts.privateKeyToAccount( pk );

console.log( accoun );
{address: "0x6C0(Metamaskと違う)", privateKey: "0f0ed71771c3cb767ce1eca984f....", signTransaction: ƒ, sign: ƒ, encrypt: ƒ}

// Metamaskからエクスポートしたまま、Prefixがないとダメ
var account = web3.eth.accounts.privateKeyToAccount( "0x" + pk );

console.log( accoun );
{address: "0xa43d0(Metamaskと一致)", privateKey: "0x0f0ed71771c3cb767ce1eca984f....", signTransaction: ƒ, sign: ƒ, encrypt: ƒ}

ファイルによって「 Invalid JSON RPC response」なんて言われるから
通信してるかと思ったけど、よく調べたらmetamaskが提供してくれるweb3.jsと
自分がローカルで使ってるweb3.jsが結構違ったのでメモ

https://github.com/MetaMask/metamask-extension/blob/develop/package.json
Metamaskの提供してくれるweb3ではaccounts系は提供されていません。


var account = web3.eth.accounts.privateKeyToAccount( "0x" + pk );
inpage.js:1 Uncaught Error: Invalid JSON RPC response: undefined
    at Object.InvalidResponse (inpage.js:1)
    at s.send (inpage.js:1)
    at n.accounts (inpage.js:1)
    at :1:15

web3-1.0系だとprivateKeyToAccountがあります。

https://raw.githubusercontent.com/ethereum/web3.js/v1.0.0-beta.35/dist/web3.js


Accounts.prototype.create = function create(entropy) {
    return this._addAccountFunctions(Account.create(entropy || utils.randomHex(32)));
};
Accounts.prototype.privateKeyToAccount = function privateKeyToAccount(privateKey) {
    return this._addAccountFunctions(Account.fromPrivate(privateKey));
};
Accounts.prototype.signTransaction = function signTransaction(tx, privateKey, callback) {