生成助记词钱包

刚开始对助记词有一个误解一直认为是助记词是从私钥生成的,私钥生成它导出助记词,助记词然后反向回去生成私钥。

今天单拿出来研究,才发现正确的流程应该是这样的

image

(图片来《自精通比特币(第二版)》)

  1. 随机生成一个128位的熵,然后把熵转为12个单词(参考BIP39)
byte[] random = new byte[128/8];
new SecureRandom().nextBytes(random);
MnemonicCode mnemonicCode = new MnemonicCode();
List<String> strings = mnemonicCode.toMnemonic(random);

image

  1. 然后通过助记词生成一个种子(参考BIP39)
byte[] seed = MnemonicCode.toSeed(strings, "");
  1. 将种子生成一个公钥私钥(参考BIP32,BIP44)
AddressIndex address = BIP44.m().purpose44()
        .coinType(60)
        .account(0)
        .external()
        .address(0);
CoinPairDerive coinKeyPair = new CoinPairDerive(extendedKey);
ExtendedKey child = coinKeyPair.deriveByExtendedKey(address);
byte[] privateKey = child.getMaster().getPrivate();

既然有了公钥私钥。那么钱包生成不就是简单一下钱包的构造方法不就出来了吗?(参考Web3j)

ECKeyPair  ecKeyPair = ECKeyPair.create(privateKey);
Credentials credentials = Credentials.create(ecKeyPair);
Log.e("私钥",Numeric.toHexStringWithPrefix(credentials.getEcKeyPair().getPrivateKey()));
Log.e("地址",credentials.getAddress());

查看结果并导入imtoken对比

image

image