什麼是私鑰格式?
我不知道私鑰格式,但是許多 stackoverflow 文章暗示了某種格式
看看iancoleman/bip39 的網站,確實私鑰會隨著您更改硬幣而發生變化,這意味著至少有一種格式考慮到了版本字節。
但是,在 js 中使用hdkey我無法重現這種格式,甚至無法重現 Pieter Wuille 在上一個範例中描述的“32 字節 big-endian 秘密參數”。
var bip39 = require('bip39'); var hdkey = require('hdkey'); const mnemonic = 'thunder purchase pave tower lecture upgrade supreme half kid fitness tray shove' const seed = bip39.mnemonicToSeed(mnemonic); //creates seed buffer console.log('mnemonic: ' + mnemonic); const root = hdkey.fromMasterSeed(seed); const masterPrivateKey = root.privateKey.toString('hex'); const addrnode = root.derive("m/0'/0"); console.log('addrnodePublicKey: '+ addrnode._publicKey.toString('hex')) console.log('addernodePrivateKey: ' + addrnode._privateKey.toString('hex'))
詳細的私鑰格式是什麼?它由什麼組成,如何從標準私鑰派生出來?與未格式化的私鑰相比,它的用途是什麼?
您使用的格式取決於您需要如何使用私鑰。您的程式碼生成一個原始的十六進制私鑰,沒有格式化。
$ node index.js mnemonic: thunder purchase pave tower lecture upgrade supreme half kid fitness tray shove addrnodePublicKey: 02ceb48796223dc3777fe210a2034059b5e39b3743e59d62f75ef07a32f8440caf addernodePrivateKey: 310fe2e677a3ad28acb91d2645bb33882f015ab11e59dce9d2a72905979e3cb6
原始私鑰
私鑰(在比特幣中,即
ECDSA SECP256K1
)是一個 32 字節的數字,介於0x1
和之間0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140
。例如:
0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
錢包輸入格式 (WIF)
但是,錢包軟體通常使用**錢包輸入格式 (WIF)**以使其更容易複製。它使用
base58check
編碼,因此它避免了模棱兩可的字元(如 0 和 O),它更短,並且在拼寫錯誤的情況下包含校驗和。例如:
5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ
WIF 轉換
這裡概述了將原始私鑰轉換為 WIF 的過程:https ://en.bitcoin.it/wiki/Wallet_import_format :
- 獲取私鑰
0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
- 在它前面添加一個 0x80 字節用於主網地址或 0xef 用於測試網地址。如果私鑰對應於壓縮的公鑰,則還要在末尾添加一個 0x01 字節
800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D
- 對擴展密鑰執行 SHA-256 雜湊
8147786C4D15106333BF278D71DADAF1079EF2D2440A4DDE37D747DED5403592
- 對 SHA-256 雜湊的結果執行 SHA-256 雜湊
507A5B8DFED0FC6FE8801743720CEDEC06AA5C6FCA72B07C49964492FB98A714
- 取第二個 SHA-256 雜湊的前 4 個字節,這是校驗和
507A5B8D
- 在第 2 點的擴展密鑰末尾添加第 5 點的 4 個校驗和字節
800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D507A5B8D
- 使用 Base58Check 編碼將結果從字節字元串轉換為 base58 字元串。這是錢包導入格式
5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ
潛在的 node.js 資源:
- <https://github.com/bitcoinjs/bs58check>
- <https://www.npmjs.com/package/create-hash>