Blockchain

EthereumJS:如何從私鑰獲取公鑰

  • December 27, 2021

我正在嘗試使用 EthereumJS 庫創建一個私鑰及其相應的公鑰。到目前為止,我已經能夠使用 keythereum.create() 方法創建私鑰。不過,我發現自己在處理公鑰時陷入了困境。

我聽說使用橢圓曲線數字簽名算法 (ECDSA) 可以從其私鑰中獲取乙太坊公鑰(64 字節長)。問題是如何使用 EthereumJS 庫對這個過程進行編碼。也許有一些簡單的方法可以導出公鑰,但我找不到。任何幫助將不勝感激。

我在以前的 StackExchange 問題上發現了一些有限的資訊,但我更喜歡專注於 EthereumJS 的答案:

乙太坊地址是如何產生的?

從私鑰創建密鑰文件和地址

謝謝!

ethereumjs-wallet可用於從私鑰獲取公鑰:

> const hdkey = require('ethereumjs-wallet/hdkey')
> const privateKey = hdkey.fromMasterSeed('random')._hdkey._privateKey
> const Wallet = require('ethereumjs-wallet')
> const wallet = Wallet.fromPrivateKey(privateKey)
> wallet.getPublicKeyString()
'0x11f2b30c9479ccaa639962e943ca7cfd3498705258ddb49dfe25bba00a555e48cb35a79f3d084ce26dbac0e6bb887463774817cb80e89b20c0990bc47f9075d5'
> wallet.getPublicKey()
<Buffer 11 f2 b3 0c 94 79 cc aa 63 99 62 e9 43 ca 7c fd 34 98 70 52 58 dd b4 9d fe 25 bb a0 0a 55 5e 48 cb 35 a7 9f 3d 08 4c e2 6d ba c0 e6 bb 88 74 63 77 48 ... >

另一種選擇是使用ethereumjs-util(由 ethereumjs-wallet 內部使用):

> const util = require('ethereumjs-util')
> util.privateToPublic(privateKey)
<Buffer 11 f2 b3 0c 94 79 cc aa 63 99 62 e9 43 ca 7c fd 34 98 70 52 58 dd b4 9d fe 25 bb a0 0a 55 5e 48 cb 35 a7 9f 3d 08 4c e2 6d ba c0 e6 bb 88 74 63 77 48 ... >

另一個選項是secp256k1

> const secp256k1 = require('secp256k1')
> secp256k1.publicKeyCreate(privateKey, false).slice(1)
<Buffer 11 f2 b3 0c 94 79 cc aa 63 99 62 e9 43 ca 7c fd 34 98 70 52 58 dd b4 9d fe 25 bb a0 0a 55 5e 48 cb 35 a7 9f 3d 08 4c e2 6d ba c0 e6 bb 88 74 63 77 48 ... >

slice(1)是刪除硬編碼為04乙太坊的類型字節。

這是正確的答案。你必須使用 const wallet = Wallet['default'].fromPrivateKey(privateKeyBuffer);

使用現有私鑰生成乙太坊錢包

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