diff --git a/ticc.js b/ticc.js index 73e9524..0ad478e 100644 --- a/ticc.js +++ b/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?.()