Go-Ethereum
如何生成私鑰、公鑰和地址
除了this之外,我在網上找不到任何關於在 Javascript 中執行此操作的文件。
我想知道身份驗證在乙太坊 dApp 中是如何工作的。根據我的理解,使用者種子以某種方式生成為私鑰,然後使用該私鑰派生公鑰並從中派生地址。有關如何使用 javascript 實現這一點或這種設置的架構是什麼的任何進一步資訊.. 對理解它的任何幫助都會很棒。
我知道如何使用 js bip39 庫生成助記詞等,之後我有點卡住了。
到目前為止,這基本上是我正在嘗試的:
const mnemonic = "vacant element sleep harsh stick else salt great kitten clutch salad subway" const privateKey = new Buffer( mnemonic ) const publicKey = ethUtil.privateToPublic(privateKey).toString('hex') const address = ethUtil.privateToAddress(privateKey).toString('hex')
const bip39 = require('bip39'); const hdkey = require('ethereumjs-wallet/hdkey'); const mnemonic = '..'; const hdwallet = hdkey.fromMasterSeed(bip39.mnemonicToSeed(mnemonic)); const path = "m/44'/60'/0'/0/0"; const wallet = hdwallet.derivePath(path).getWallet(); const address = `0x${wallet.getAddress().toString('hex')}`; console.log(`Address: ${address}`);
如果您已經生成了一個等同於私鑰的種子,那麼您可能可以從乙太坊的 GitHub 儲存庫中獲得您想要的其餘內容。( BIP-39 JS 程式碼中可能提供了相同的功能。)
類似於以下內容:
var utils = require('ethereumjs-util') var privateKey = new Buffer(<from_seed>) var publicKey = utils.privateToPublic(privateKey).toString('hex') var address = utils.privateToAddress(privateKey).toString('hex')
編輯:
以上假設您已經從助記詞中生成了一些派生的私鑰。從原始的 BIP-39 助記符到上述內容有點複雜。(我可能沒有資格就 JS 程式碼給出一個體面的答案……有人可能有比下面更好的方法。正如@smarx 所說,你的最終目標是什麼也不清楚。)
簡而言之 - 從
index.js
BIP-39 JS 程式碼中 - 你需要:
- 獲取推導路徑 (
getDerivationPath()
)- 計算 BIP32 擴展密鑰 (
calcBip32ExtendedKey()
)- 獲取密鑰 (
bip32ExtendedKey.derive()
)- 由此,得到密鑰對 (
key.keyPair
)然後你可以直接得到你的價值觀:
var privKeyBuffer = keyPair.d.toBuffer(32); privkey = privKeyBuffer.toString('hex'); var addressBuffer = ethUtil.privateToAddress(privKeyBuffer); var hexAddress = addressBuffer.toString('hex'); var checksumAddress = ethUtil.toChecksumAddress(hexAddress); address = ethUtil.addHexPrefix(checksumAddress); privkey = ethUtil.addHexPrefix(privkey); pubkey = ethUtil.addHexPrefix(pubkey);
以上內容至少可以讓您了解在哪裡可以走得更遠。