以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