美文网首页
【Dart/Flutter】生成BTC的Address,以及解码

【Dart/Flutter】生成BTC的Address,以及解码

作者: 坐了整个春夏秋冬 | 来源:发表于2022-06-17 15:34 被阅读0次

Base58编码和计算Hash时用到了pub.dev上的两个三方库hashfast_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 (失踪的新华社)

相关文章

网友评论

      本文标题:【Dart/Flutter】生成BTC的Address,以及解码

      本文链接:https://www.haomeiwen.com/subject/ilhhvrtx.html