让 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 {
|
} 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?.()
|
||||||
|
Loading…
Reference in New Issue
Block a user