让 secword_to_keypair 的默认结果和 ethers.Wallet.fromMnemonic保持一致

This commit is contained in:
陆柯 2023-01-01 17:08:57 +08:00
parent cdeb44f43f
commit c0e237984a

21
ticc.js
View File

@ -472,24 +472,22 @@ class TicCrypto {
} }
} else { } else {
// 用 bip39 算法从 secword 到种子,再用 bip32 算法从种子到根私钥。这是比特币、以太坊的标准方式,结果一致。 // 用 bip39 算法从 secword 到种子,再用 bip32 算法从种子到根私钥。这是比特币、以太坊的标准方式,结果一致。
let hdmaster = hdkey.fromMasterSeed(Buffer.from(this.secword_to_seed({ secword, pass }), 'hex')) // 和 new BitcoreMnemonic(secword).toHDPrivateKey 求出的公私钥一样! let hdmaster = hdkey.fromMasterSeed(Buffer.from(this.secword_to_seed({ secword, pass }), 'hex')) // == new BitcoreMnemonic(secword).toHDPrivateKey(pass) 返回公私钥 == ethers.utils.HDNode.fromMnemonic(secword) 返回地址/密语/公私钥。而进一步 hdkey.fromMasterSeed(...).derive("m/44'/60'/0'/0/0") == ethers.utils.HDNode.fromMnemonic(secword).derivePath("m/44'/60'/0'/0/0") == ethers.Wallet.fromMnemonic(secword [,"m/44'/60'/0'/0/0"]) (注意,不是完全等价,数据结构有所不同,但是代表的公私钥或地址的本质是相等的)
// let hdmaster=new BitcoreMnemonic(secword).toHDPrivateKey(pass) // 和 ethers.HDNode.fromMnemonic(secword)的公私钥一样。而 ethers.HDNode.fromMnemonic(secword).derivePath("m/44'/60'/0'/0/0")的公私钥===ethers.Wallet.fromMnemonic(secword [,"m/44'/60'/0'/0/0"])
let key = hdmaster let key = hdmaster
if (path) { if (path === 'master') {
// 不建议使用主钥,因此强制必须指定 master 才返回主钥。
key = hdmaster
} else if (path) {
// 指定了path 例如 "m/0/2147483647'/1" 则用 path 例如 不存在 pathSeed 时获取的是根路径 "m/44'/0'/0'/0/0" 或 "m/44'/60'/0'/0/0" // 指定了path 例如 "m/0/2147483647'/1" 则用 path 例如 不存在 pathSeed 时获取的是根路径 "m/44'/0'/0'/0/0" 或 "m/44'/60'/0'/0/0"
key = hdmaster.derive(path) key = hdmaster.derive(path)
} else if (pathSeed) { } else {
// 指定了 pathSeed 则调用 root_to_path() 来获取路径 // 指定了 pathSeed 则调用 root_to_path() 来获取路径。如果都没有 path/pathSeed/pathIndex就返回标准默认路径和 ethers.Wallet.fromMnemonic(...) 结果保持一致
path = this.root_to_path({ pathSeed, pathIndex, coin }) path = this.root_to_path({ pathSeed, pathIndex, coin })
key = hdmaster.derive(path) key = hdmaster.derive(path)
} else {
// 没有指定 path 或 pathRoot则返回主钥
path = ''
key = hdmaster
} }
return { return {
path, path,
prikey: key.privateKey.toString('hex'), // 或者 key.toJSON().privateKey。或者 key.privateKey.slice(2) 删除开头的'0x'如果是ethers.HDNode.fromMnemonic(secword)的结果 prikey: key.privateKey.toString('hex'), // 或者 key.toJSON().privateKey 如果来自 BitcoreMnemonic。或者 key.privateKey.slice(2) 删除开头的'0x'如果来自ethers.utils.HDNode.fromMnemonic(secword)
pubkey: key.publicKey.toString('hex'), pubkey: key.publicKey.toString('hex'),
} }
} }
@ -523,7 +521,8 @@ class TicCrypto {
// 本方法也可用来生成默认的第0个路径例如 "m/44'/0'/0'/0/0" // 本方法也可用来生成默认的第0个路径例如 "m/44'/0'/0'/0/0"
path = "0'/0/0" path = "0'/0/0"
} }
if (Number.isInteger(pathIndex) && 0 <= pathIndex && pathIndex <= 0x7fffffff) { // 注意,如果 pathIndex 为 undefinded得出的 path 是不同的!
if (parseInt(pathIndex) && 0 <= pathIndex && pathIndex <= 0x7fffffff) {
path += `/${pathIndex}` path += `/${pathIndex}`
} }
coin = coin?.toUpperCase?.() coin = coin?.toUpperCase?.()