Addresses

從公鑰生成地址

  • August 21, 2019

一直在學習如何在乙太坊中生成錢包,事情一直很順利,直到我將公鑰變成了實際地址。

多個消息來源說使用 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')並且應該輸出相同的地址。

引用自:https://ethereum.stackexchange.com/questions/29476