Flutter比特币地址生成插件dart_bip32的使用

Flutter比特币地址生成插件dart_bip32的使用

概述

dart_bip32 是一个兼容 BIP32 的库,用于在 Flutter 中生成比特币地址。该库受到了 bitcoinjs 的启发。

示例代码

以下是一个完整的示例,展示了如何使用 dart_bip32 库来生成比特币地址。

import 'dart:typed_data';
import 'package:dart_bip32/dart_bip32.dart' as bip32;
import 'package:hex/hex.dart';

void main() {
  // 从 Base58 编码的字符串创建 BIP32 节点
  bip32.BIP32 node = bip32.BIP32.fromBase58(
      'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi');

  // 打印私钥
  print(HEX.encode(node.privateKey!));
  // => e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35

  // 创建一个不可变的公钥节点
  bip32.BIP32 nodeNeutered = node.neutered();
  print(nodeNeutered.isNeutered());
  // => true

  // 打印公钥
  print(HEX.encode(nodeNeutered.publicKey));
  // => 0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2

  // 打印 Base58 编码的公钥
  print(nodeNeutered.toBase58());
  // => xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8

  // 通过路径派生子节点
  bip32.BIP32 child = node.derivePath('m/0/0');
  print(child.toBase58());
  // => xprv9ww7sMFLzJMzur2oEQDB642fbsMS4q6JRraMVTrM9bTWBq7NDS8ZpmsKVB4YF3mZecqax1fjnsPF19xnsJNfRp4RSyexacULXMKowSACTRc

  // 打印子节点的私钥
  print(HEX.encode(child.privateKey!));
  // => f26cf12f89ab91aeeb8d7324a22e8ba080829db15c9245414b073a8c342322aa

  // 创建子节点的不可变公钥
  bip32.BIP32 childNeutered = child.neutered();
  print(childNeutered.isNeutered());
  // => true

  // 打印子节点的公钥
  print(HEX.encode(childNeutered.publicKey));
  // => 02756de182c5dd4b717ea87e693006da62dbb3cddaa4a5cad2ed1f5bbab755f0f5

  // 打印子节点的 Base58 编码公钥
  print(childNeutered.toBase58());
  // => xpub6AvUGrnEpfvJ8L7GLRkBTByQ9uBvUHp9o5VxHrFxhvzV4dSWkySpNaBoLR9FpbnwRmTa69yLHF3QfcaxbWT7gWdwws5k4dpmJvqpEuMWwnj

  // 从种子生成 BIP32 节点
  bip32.BIP32 nodeFromSeed = bip32.BIP32
      .fromSeed(HEX.decode("000102030405060708090a0b0c0d0e0f") as Uint8List);
  print(nodeFromSeed.toBase58());
  // => xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi

  // 从 Base58 编码的公钥字符串创建 BIP32 节点
  bip32.BIP32 nodeFromPub = bip32.BIP32.fromBase58(
      "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8");
  print(nodeFromPub.toBase58());
  // => xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8

  // 定义消息
  var message = HEX.decode(
          "0202020202020202020202020202020202020202020202020202020202020202")
      as Uint8List;

  // 签名消息
  var signature = nodeFromSeed.sign(message);
  print(signature);
  // => [63, 219, 20, 114, 95, 184, 192, 55, 216, 206, 126, 121, 17, 71, 64, 70, 163, 82, 247, 73, 243, 95, 30, 137, 177, 155, 100, 225, 177, 203, 217, 147, 122, 64, 208, 129, 54, 133, 113, 41, 216, 160, 191, 15, 136, 98, 235, 25, 219, 178, 70, 222, 127, 151, 135, 242, 25, 192, 161, 187, 187, 84, 81, 215]

  // 打印签名
  print(HEX.encode(signature));
  // => 3fdb14725fb8c037d8ce7e7911474046a352f749f35f1e89b19b64e1b1cbd9937a40d08136857129d8a0bf0f8862eb19dbb246de7f9787f219c0a1bbbb5451d7

  // 验证签名
  print(nodeFromSeed.verify(message, signature));
  // => true
}

更多关于Flutter比特币地址生成插件dart_bip32的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter比特币地址生成插件dart_bip32的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dart_bip32 是一个用于生成和管理比特币地址的 Dart 库,它支持 BIP32 标准的层级确定性钱包(HD Wallet)。你可以使用它来生成主私钥、主公钥、子私钥、子公钥,以及相应的比特币地址。

以下是如何在 Flutter 中使用 dart_bip32 插件生成比特币地址的基本步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 dart_bip32 依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_bip32: ^2.0.0

然后运行 flutter pub get 来安装依赖。

2. 导入库

在你的 Dart 文件中导入 dart_bip32 库:

import 'package:dart_bip32/dart_bip32.dart';

3. 生成主密钥

你可以从一个种子(seed)生成主密钥。种子通常是一个随机的字节数组。

import 'dart:typed_data';

void main() {
  // 假设你有一个种子
  Uint8List seed = Uint8List.fromList([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]);

  // 生成主密钥
  BIP32 masterNode = BIP32.fromSeed(seed);

  print('Master Private Key: ${masterNode.toBase58()}');
  print('Master Public Key: ${masterNode.neutered().toBase58()}');
}

4. 生成子密钥

你可以从主密钥生成子密钥。BIP32 使用路径来指定子密钥的层级,例如 m/0'/0

void main() {
  // 假设你有一个种子
  Uint8List seed = Uint8List.fromList([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]);

  // 生成主密钥
  BIP32 masterNode = BIP32.fromSeed(seed);

  // 生成子密钥
  BIP32 childNode = masterNode.derivePath("m/0'/0");

  print('Child Private Key: ${childNode.toBase58()}');
  print('Child Public Key: ${childNode.neutered().toBase58()}');
}

5. 生成比特币地址

你可以从公钥生成比特币地址。通常,比特币地址是通过对公钥进行哈希处理并添加校验和生成的。

import 'package:bs58check/bs58check.dart' as bs58check;
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart';

String getBitcoinAddress(Uint8List publicKey) {
  // SHA-256 哈希
  var sha256Hash = sha256.convert(publicKey).bytes;

  // RIPEMD-160 哈希
  var ripemd160Hash = ripemd160.convert(sha256Hash).bytes;

  // 添加版本字节 (0x00 for Bitcoin mainnet)
  var versionedPayload = Uint8List.fromList([0x00] + ripemd160Hash);

  // 计算校验和
  var checksum = sha256.convert(sha256.convert(versionedPayload).bytes).bytes.sublist(0, 4);

  // 生成最终地址
  var addressBytes = Uint8List.fromList(versionedPayload + checksum);

  // Base58Check 编码
  return bs58check.encode(addressBytes);
}

void main() {
  // 假设你有一个种子
  Uint8List seed = Uint8List.fromList([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]);

  // 生成主密钥
  BIP32 masterNode = BIP32.fromSeed(seed);

  // 生成子密钥
  BIP32 childNode = masterNode.derivePath("m/0'/0");

  // 获取公钥
  Uint8List publicKey = childNode.neutered().publicKey;

  // 生成比特币地址
  String bitcoinAddress = getBitcoinAddress(publicKey);

  print('Bitcoin Address: $bitcoinAddress');
}
回到顶部