让 secword_to_keypair 的默认结果和 ethers.Wallet.fromMnemonic保持一致
This commit is contained in:
parent
cdeb44f43f
commit
c0e237984a
21
ticc.js
21
ticc.js
@ -472,24 +472,22 @@ class TicCrypto {
|
||||
}
|
||||
} else {
|
||||
// 用 bip39 算法从 secword 到种子,再用 bip32 算法从种子到根私钥。这是比特币、以太坊的标准方式,结果一致。
|
||||
let hdmaster = hdkey.fromMasterSeed(Buffer.from(this.secword_to_seed({ secword, pass }), 'hex')) // 和 new BitcoreMnemonic(secword).toHDPrivateKey 求出的公私钥一样!
|
||||
// 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 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 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"
|
||||
key = hdmaster.derive(path)
|
||||
} else if (pathSeed) {
|
||||
// 指定了 pathSeed 则调用 root_to_path() 来获取路径
|
||||
} else {
|
||||
// 指定了 pathSeed 则调用 root_to_path() 来获取路径。如果都没有 path/pathSeed/pathIndex,就返回标准默认路径,和 ethers.Wallet.fromMnemonic(...) 结果保持一致
|
||||
path = this.root_to_path({ pathSeed, pathIndex, coin })
|
||||
key = hdmaster.derive(path)
|
||||
} else {
|
||||
// 没有指定 path 或 pathRoot,则返回主钥
|
||||
path = ''
|
||||
key = hdmaster
|
||||
}
|
||||
return {
|
||||
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'),
|
||||
}
|
||||
}
|
||||
@ -523,7 +521,8 @@ class TicCrypto {
|
||||
// 本方法也可用来生成默认的第0个路径,例如 "m/44'/0'/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}`
|
||||
}
|
||||
coin = coin?.toUpperCase?.()
|
||||
|
Loading…
Reference in New Issue
Block a user