有遇到疑惑的可加QQ群交流:1057160243
比特币地址生成过程,如图所示
比特币的生成过程分为以下几步:
a. 产生一个随机数,作为私钥;
b. 由私钥生成公钥;
c. 将生成的公钥进行SHA256运算;
d. 将生成的256位哈希值进行RIPEMD160运算;
e. 将版本号和公钥哈希值进行双SHA256运算得到校验码;
f. 将版本号、公钥哈希和校验码连接并进行Base58转换。
public Object createAddress(HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> map = new LinkedHashMap<>();
String path = "m/44'/60'/0'/0/0";
String[] pathArray = path.split("/");
// 设置网络参数
NetworkParameters params = MainNetParams.get();
// 随机数
SecureRandom secureRandom = new SecureRandom();
// 生成助记词种子
DeterministicSeed ds = new DeterministicSeed(secureRandom, 128, "");
List<String> mnemonicCode = ds.getMnemonicCode();
StringBuilder sb = new StringBuilder();
mnemonicCode.stream().forEach(code -> {
sb.append(code).append(" ");
});
String mcCode = sb.toString();
// 助记词字符串
String mnemonicCodeStr = mcCode.substring(0, mcCode.length() - 1);
map.put("mnemonicCodeStr", mnemonicCodeStr);
//通过助记词生成种子
DeterministicSeed deterministicSeed = new DeterministicSeed(mnemonicCode, null, "", 0);
DeterministicKeyChain dk = DeterministicKeyChain.builder().seed(deterministicSeed).build();
// btc 普通地址bip44路径
List<ChildNumber> btcPath1 = ImmutableList.of(
new ChildNumber(44, true),
new ChildNumber(0, true),
new ChildNumber(0, true),
new ChildNumber(0, false),
new ChildNumber(0, false));
// 1开头的普通地址================
DeterministicKey keyByPath = dk.getKeyByPath(btcPath1, true);
BigInteger privkey = keyByPath.getPrivKey();
ECKey ecKey = ECKey.fromPrivate(privkey);
LegacyAddress legacyAddress = LegacyAddress.fromKey(params, ecKey);
String privateKeyBtc = ecKey.getPrivateKeyAsWiF(params);
map.put("address", legacyAddress.toBase58());
map.put("privateKey", privateKeyBtc);
return ResponseBuilder.custom().success("success", 0).data(map).build();
}
有遇到疑惑的可加QQ群交流:1057160243
扫描二维码关注公众号,回复:
12921555 查看本文章
![](/qrcode.jpg)