Addresses
從公鑰生成地址
一直在學習如何在乙太坊中生成錢包,事情一直很順利,直到我將公鑰變成了實際地址。
多個消息來源說使用 Keccak 對公鑰進行散列(無第一個字節),然後將生成的散列的最後 20 個字節作為地址。
我正在使用的公鑰(從我希望正確執行此操作的工俱生成)是:
0x025f37d20e5b18909361e0ead7ed17c69b417bee70746c9e9c2bcb1394d921d4ae
並且生成的地址應該是:0xd09D3103CcABfb769eDc3e9B01500Ca7241D470A
但是 Keccak 的各種實現(是的,即使是真正的 Keccak 而不是 SHA3 的實現)都沒有給我類似於該地址的東西。
我得到的雜湊是
83453a8e57a0a2bb1277baea830983bd264e23140ef2cadd74b1e68c5c12f98f
這意味著地址將是最後 20 個字節,或者0x830983bd264e23140ef2cadd74b1e68c5c12f98f
我在這裡做錯了什麼?
該程序在給定公鑰的情況下計算您的地址。在您的情況下,它返回“0xd09d3103ccabfb769edc3e9b01500ca7241d470a”作為地址
const assert = require('assert'); const EC = require('elliptic').ec; const keccak256 = require('js-sha3').keccak256; async function main() { try { const ec = new EC('secp256k1'); // Decode public key const key = ec.keyFromPublic('025f37d20e5b18909361e0ead7ed17c69b417bee70746c9e9c2bcb1394d921d4ae', 'hex'); // Convert to uncompressed format const publicKey = key.getPublic().encode('hex').slice(2); // Now apply keccak const address = keccak256(Buffer.from(publicKey, 'hex')).slice(64 - 40); console.log(`Public Key: 0x${publicKey}`); console.log(`Address: 0x${address.toString()}`); } catch (err) { console.log(err); } } main();
如果您有私鑰,您可以替換
ec.keyFromPublic('025f...', 'hex')
為ec.keyFromPrivate('4444...', 'hex')
並且應該輸出相同的地址。