P2PKH 中使用的哈希值和P2SH 输出通常编码为 Dash地址. 这是对这些哈希进行编码和对地址进行解码的过程。
转换过程
首先,获取一个Hash值
- P2PKH
RIPEMD-160(SHA256(你的公钥))
获取结果哈希:
-
添加一个版本字节在公钥哈希前面。Dash 常用的版本字节有:
-
0x4c 为P2PKH 地址在 Dash 主网络上(主网)
-
0x8c 为P2PKH 地址在 Dash 测试网络上 (测试网)
-
0x10 为P2SH 地址上主网
-
0x13 为P2SH 地址上测试网
-
-
创建版本和哈希的副本;然后用 SHA256 哈希两次:
SHA256(SHA256(version . hash))
-
从双哈希副本中提取前四个字节,用作校验和。
-
将校验和附加到版本和哈希,并对其base58编码:BASE58(version hash checksum)
代码示例(DART语言)
int addressVersion = isMainNet ? 0x4c : 0x8c;
// 第三步,计算公钥的SHA-256哈希值
Uint8List step3 = SHA256().update(pubKeyByte).digest();
// 第四步,计算上一步哈希值的RIPEMD-160哈希值
List<int> step4 = List.from(RIPEMD160().update(step3).digest());
// 第五步,在上一步结果之间加入地址版本号(如比特币主网版本号"0x00")测试网版本号0x6f
// 0x4c for P2PKH addresses on the main Dash network ()
// 0x8c for P2PKH addresses on the Dash testing network (testnet)
step4.insert(0, addressVersion);
List<int> step5 = step4;
// 第六步,计算上一步结果的SHA-256哈希值
Uint8List step6 = SHA256().update(step5).digest();
// 第七步,再次计算上一步结果的SHA-256哈希值
Uint8List step7 = SHA256().update(step6).digest();
// 第八步,取上一步结果的前4个字节(8位十六进制数)D61967F6,把这4个字节加在第五步结果的后面,作为校验(这就是比特币地址的16进制形态)
step5.addAll(step7.sublist(0, 4));
Uint8List step8 = Uint8List.fromList(step5);
// 第九步,用base58表示法变换一下地址(这就是最常见的比特币地址形态)
String address = Base58Encode(step8);
return address;
Refrences
https://dashcore.readme.io/docs/core-ref-transactions-address-conversion
网友评论