Flutter加密货币选择插件dart_coinselect的使用

Flutter加密货币选择插件dart_coinselect的使用

dart_coinselect 是一个用于比特币未花费交易输出(UTXO)选择的模块。需要注意的是,值单位以 satoshi 表示,而不是比特币。

安装

pubspec.yaml 文件中添加以下依赖项:

dependencies:
  dart_coinselect: ^版本号

然后运行:

dart pub get

算法

dart_coinselect 提供了几种不同的算法来处理输入和输出的选择。这些算法包括:

模块 算法 是否重新排序UTXOs
null Blackjack,带累积性回退 按降序排列
AlgorithmsEnum.accumulative 累积 - 累积输入直到达到目标值(+手续费),跳过有害输入
AlgorithmsEnum.blackjack 黑杰克 - 累积输入直到匹配目标值,不累积超过目标值的输入(在阈值内)
AlgorithmsEnum.breakAlgo 打破 - 将输入值分成等分的输出(如所提供)
AlgorithmsEnum.split 分割 - 在所有输出之间均匀分配输入值,任何提供的输出 .value 保持不变

注意:每个算法都会在 input - output - fee 的值差超过尘埃阈值时添加一个找零输出。这由 utils.finalize 独立计算,无论选择哪种算法,都是为了安全考虑。

技巧:如果你想将所有输入发送到一个输出地址,可以使用 AlgorithmsEnum.split 并设置部分输出(.address 已定义,但没有 .value)来发送所有内容,同时为手续费保留适当的金额。

示例

以下是一个简单的示例,展示了如何使用 dart_coinselect 插件:

import 'package:dart_coinselect/coinselect.dart';

const feeRate = 55;

void main() {
  // 输入模型列表
  List<InputModel> utxos = [
    InputModel(
      i: 0,
      txid: 
        '61d520ccb74288c96bc1a2b20ea1c0d5a704776dd0164a396efec3ea7040349d',
      value: 10000,
    ),
  ];

  // 输出模型列表
  List<OutputModel> outputs = [
    OutputModel(address: '1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm', value: 5000)
  ];

  // 调用 coinSelect 方法进行选择
  final selection = coinSelect(utxos, outputs, feeRate);

  // 打印选择结果
  print(selection);
  // 输出结果是 'Instance of 'SelectionModel': {"fee": "10560}'
  // 因为输入值低于输出值 + 手续费
  // 找零金额总是返回用于分析

  // 如果找不到解决方案,则 .inputs 和 .outputs 为 null
  if (selection.inputs == null || selection.outputs == null) return;

  // 创建原始交易并签名...
}

更多关于Flutter加密货币选择插件dart_coinselect的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加密货币选择插件dart_coinselect的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


dart_coinselect 是一个用于选择加密货币 UTXO(未使用的交易输出)的 Dart 库,它可以帮助你在构建加密货币交易时选择最优的 UTXO 组合,以达到特定的目标金额。这个库是 Bitcoin Core 中 coin selection 算法的 Dart 实现。

安装

首先,你需要在 pubspec.yaml 文件中添加 dart_coinselect 依赖:

dependencies:
  dart_coinselect: ^1.0.0

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

基本用法

以下是一个简单的例子,展示了如何使用 dart_coinselect 来选择 UTXO。

import 'package:dart_coinselect/dart_coinselect.dart';

void main() {
  // 定义一组 UTXO
  List<Input> utxos = [
    Input(value: 10000), // 1.0 BTC in satoshis
    Input(value: 20000), // 2.0 BTC in satoshis
    Input(value: 30000), // 3.0 BTC in satoshis
  ];

  // 定义目标金额(以 satoshis 为单位)
  int targetValue = 25000; // 2.5 BTC in satoshis

  // 执行 coin selection 算法
  SelectionResult result = select(utxos, targetValue);

  // 输出结果
  print('Selected UTXOs:');
  result.inputs.forEach((input) {
    print('Value: ${input.value}');
  });

  print('Total Selected Value: ${result.fee}');
  print('Change: ${result.change}');
}

参数说明

  • utxos: 一个包含 Input 对象的列表,每个 Input 对象代表一个 UTXO,包含 value 属性,表示该 UTXO 的价值(以 satoshis 为单位)。

  • targetValue: 你想要达到的目标金额(以 satoshis 为单位)。

输出结果

select 函数返回一个 SelectionResult 对象,包含以下属性:

  • inputs: 被选中的 UTXO 列表。

  • fee: 总的手续费(以 satoshis 为单位)。

  • change: 找零金额(以 satoshis 为单位)。如果没有找零,则为 0

高级用法

dart_coinselect 还支持更高级的配置,比如设置手续费率、选择不同的算法等。你可以通过传递额外的参数来定制 select 函数的行为。

import 'package:dart_coinselect/dart_coinselect.dart';

void main() {
  List<Input> utxos = [
    Input(value: 10000),
    Input(value: 20000),
    Input(value: 30000),
  ];

  int targetValue = 25000;

  // 高级配置
  SelectionOptions options = SelectionOptions(
    feeRate: 10, // 手续费率(每字节的 satoshis)
    changeType: ChangeType.P2WPKH, // 找零地址类型
    dustThreshold: 546, // 最小找零金额
  );

  SelectionResult result = select(utxos, targetValue, options: options);

  print('Selected UTXOs:');
  result.inputs.forEach((input) {
    print('Value: ${input.value}');
  });

  print('Total Selected Value: ${result.fee}');
  print('Change: ${result.change}');
}
回到顶部