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
更多关于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}');
}