Base58编码和计算Hash时用到了pub.dev上的两个三方库hash和fast_base58
import 'package:fast_base58/fast_base58.dart';
import 'package:hash/hash.dart';
关于这个网上资料很多,流程很清晰,直接上代码看注释好了
class BTCUtils {
bool isMainNet;
BTCUtils({@required this.isMainNet});
String pubKeyToBTCAddress(Uint8List pubKeyByte) {
int addressVersion = isMainNet ? 0x00 : 0x6f;
// 第三步,计算公钥的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 (mainnet)
// 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);
print("Flutter生成的地址" + address);
return address;
}
Uint8List addressToPubkeyHash(String addr) {
List<int> addr_de = Base58Decode(addr);
//去除后四位和前一位
addr_de.removeAt(0);
addr_de.removeLast();
addr_de.removeLast();
addr_de.removeLast();
addr_de.removeLast();
return Uint8List.fromList(addr_de);
}
}
顺便上一个DASH的地址生成代码,DASH与BTC步骤相同,唯一不同的值就是网络码不同
String pubKeyToDASHAddress(Uint8List pubKeyByte) {
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 (mainnet)
// 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);
print("Flutter生成的地址" + address);
return address;
}
QQ群:653317062 (失踪的新华社)
网友评论