P2PKH 中使用的哈希值和P2SH 輸出通常編碼為 Dash地址. 這是對這些哈希進行編碼和對地址進行解碼的過程北苟。
轉換過程
首先顺饮,獲取一個Hash值
- P2PKH
RIPEMD-160(SHA256(你的公鑰))
獲取結果哈希:
-
添加一個版本字節(jié)在公鑰哈希前面湿硝。Dash 常用的版本字節(jié)有:
0x4c 為P2PKH 地址在 Dash 主網(wǎng)絡上(主網(wǎng))
0x8c 為P2PKH 地址在 Dash 測試網(wǎng)絡上 (測試網(wǎng))
0x10 為P2SH 地址上主網(wǎng)
0x13 為P2SH 地址上測試網(wǎng)
創(chuàng)建版本和哈希的副本递宅;然后用 SHA256 哈希兩次:
SHA256(SHA256(version . hash))
從雙哈希副本中提取前四個字節(jié),用作校驗和盈包。
將校驗和附加到版本和哈希代乃,并對其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());
// 第五步搁吓,在上一步結果之間加入地址版本號(如比特幣主網(wǎng)版本號"0x00")測試網(wǎng)版本號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個字節(jié)(8位十六進制數(shù))D61967F6擂橘,把這4個字節(jié)加在第五步結果的后面,作為校驗(這就是比特幣地址的16進制形態(tài))
step5.addAll(step7.sublist(0, 4));
Uint8List step8 = Uint8List.fromList(step5);
// 第九步摩骨,用base58表示法變換一下地址(這就是最常見的比特幣地址形態(tài))
String address = Base58Encode(step8);
return address;
Refrences
https://dashcore.readme.io/docs/core-ref-transactions-address-conversion