隔离验证地址生成

以bitcoin 为例:

P2WPKH / P2WSH (hash不同,P2WPKH 是 160(sha256),P2WSH是 sha256(sha256))

1、bip142地址格式:

version 主网 06 ,测试 10

version + witnessVersion(0) + 填充(0) + hash + 校验位 , Base58 编译

// 公钥hash,P2WSH 类似(Script)

byte[] test1 = ecKey1.getPubKeyHash();
int n = 3 + test1.length;
byte[] array = new byte[n + 4];
int version = 6;
array[0] = (byte) (version & 255);

System.arraycopy(test1, 0, array, 3, test1.length);
System.arraycopy(Sha256Hash.hashTwice(array, 0, n), 0, array, n, 4);
String addressSegWit = Base58.encode(array);

 

测试数据: 

公钥: 

0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

地址: 

p2xtZoXeX5X8BP8JfFhQK2nD3emtjch7UeFm

2、bech32地址格式:

hrp 主网 “bc”  , 测试 “tb”

hrp + "1" + witnessVersion + hash , Bech32 编译

// 必须为压缩公钥

byte[] hash = Utils.sha256hash160(ecKey.getPubKey());
// 转换
byte[] convert = BitcoinCashBitArrayConverter.convertBits(hash, 8, 5, false);
// 增加witnessVersion
byte[] addWitVer = new byte[convert.length + 1];
addWitVer[0] = 0;// version 默认0
// 编译
String address = Bech32.encode("bc", addWitVer);

 

测试数据:

公钥: 025dabd7507f8b1c4041daaabe90111065dc9c05fa63597296cd8895016692e932

地址: bc1qah6ww9skphh8tfccrykwmc63d0cs3cpvlzmeu6

你可能感兴趣的:(区块链钱包)