Flutter BIP66标准验证插件dart_bip66的使用

Flutter BIP66标准验证插件dart_bip66的使用

BIP66 是一种严格的DER签名编码/解码规范。更多详细信息可以查看 BIP66

说明

  • 该模块仅适用于二进制补码数字。
  • BIP66 不会检查 rs 是否完全有效。
    • check/decode 不会检查 rs 是否大于33字节或是否表示椭圆曲线上的有效点。
    • encode 不会检查 r/s 是否表示椭圆曲线上的有效点。

示例

import 'dart:typed_data';

import 'package:convert/convert.dart';
import 'package:dart_bip66/dart_bip66.dart';

void main() {
  // 示例r值
  Uint8List r = Uint8List.fromList(hex.decode(
      '1ea1fdff81b3a271659df4aad19bc4ef83def389131a36358fe64b245632e777'));
  // 示例s值
  Uint8List s = Uint8List.fromList(hex.decode(
      '29e164658be9ce810921bf81d6b86694785a79ea1e52dbfa5105148d1f0bc1'));
  
  // 对r和s进行编码
  var encodedSignature = der.encode(DER(r: r, s: s));
  // 打印编码后的结果
  print(encodedSignature);
  // 输出: [48, 67, 2, 32, 30, 161, 253, 255, 129, 179, 162, 113, 101, 157, 244, 170, 209, 155, 196, 239, 131, 222, 243, 137, 19, 26, 54, 53, 143, 230, 75, 36, 86, 50, 231, 119, 2, 31, 41, 225, 100, 101, 139, 233, 206, 129, 9, 33, 191, 129, 214, 184, 102, 148, 120, 90, 121, 234, 30, 82, 219, 250, 81, 5, 20, 141, 31, 11, 193]

  // 示例签名数据
  Uint8List signature = Uint8List.fromList(hex.decode(
      '304302201ea1fdff81b3a271659df4aad19bc4ef83def389131a36358fe64b245632e777021f29e164658be9ce810921bf81d6b86694785a79ea1e52dbfa5105148d1f0bc1'));

  // 解码签名数据
  DER decodedSignature = der.decode(signature);
  // 打印解码后的结果
  print(decodedSignature);
  // 输出: 304302201ea1fdff81b3a271659df4aad19bc4ef83def389131a36358fe64b245632e777021f29e164658be9ce810921bf81d6b86694785a79ea1e52dbfa5105148d1f0bc1
  
  // 对解码后的签名数据进行编码
  var reEncodedSignature = der.encode(decodedSignature);
  // 打印重新编码后的结果
  print(reEncodedSignature);
  // 输出: [48, 67, 2, 32, 30, 161, 253, 255, 129, 179, 162, 113, 101, 157, 244, 170, 209, 155, 196, 239, 131, 222, 243, 137, 19, 26, 54, 53, 143, 230, 75, 36, 86, 50, 231, 119, 2, 31, 41, 225, 100, 101, 139, 233, 206, 129, 9, 33, 191, 129, 214, 184, 102, 148, 120, 90, 121, 234, 30, 82, 219, 250, 81, 5, 20, 141, 31, 11, 193]
}

更多关于Flutter BIP66标准验证插件dart_bip66的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter BIP66标准验证插件dart_bip66的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter项目中使用dart_bip66插件来验证BIP66(严格派生序列规则)的示例代码。dart_bip66是一个Dart库,用于验证比特币交易签名是否符合BIP66标准。

首先,确保你的Flutter项目已经添加了dart_bip66依赖。你可以在pubspec.yaml文件中添加以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  dart_bip66: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter项目中,你可以创建一个Dart文件来演示如何使用dart_bip66进行验证。以下是一个简单的示例代码:

import 'package:dart_bip66/dart_bip66.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('BIP66 Validation Example'),
        ),
        body: Center(
          child: BIP66ValidationExample(),
        ),
      ),
    );
  }
}

class BIP66ValidationExample extends StatefulWidget {
  @override
  _BIP66ValidationExampleState createState() => _BIP66ValidationExampleState();
}

class _BIP66ValidationExampleState extends State<BIP66ValidationExample> {
  String _result = '';

  void _validateSignature() {
    // 示例签名(这是一个示例,实际使用中你应该使用真实的签名数据)
    final signatureHex = '3045022100f4d5c5539e6f8ba212c6ae9b0e4960'
        '74f7a30967706e64f498777ec4c0c66e49d043f20220763044022036'
        '2e3e1e5e5c5d488ac90e1122f475368e4046745150854d683479390'
        '3a1f8ee4a4339';

    // 将十六进制字符串转换为字节数组
    final signatureBytes = hexStringToByteArray(signatureHex);

    // 使用dart_bip66进行验证
    final isValid = bip66Valid(signatureBytes);

    // 更新UI显示结果
    setState(() {
      _result = isValid ? 'Signature is valid (BIP66 compliant)' : 'Signature is invalid (not BIP66 compliant)';
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('BIP66 Signature Validation Result:'),
        Text(_result, style: TextStyle(fontSize: 20)),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _validateSignature,
          child: Text('Validate Signature'),
        ),
      ],
    );
  }

  // 辅助函数:将十六进制字符串转换为字节数组
  Uint8List hexStringToByteArray(String hex) {
    final bytes = hex.length ~/ 2;
    final Uint8List result = Uint8List(bytes);
    for (int i = 0; i < bytes; i++) {
      result[i] = int.parse(hex.substring(i * 2, i * 2 + 2), radix: 16);
    }
    return result;
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,用于触发BIP66签名的验证过程。验证结果会显示在按钮下方的文本控件中。

请注意,示例中的签名数据是硬编码的,实际使用中你需要使用实际的签名数据。另外,hexStringToByteArray函数用于将十六进制字符串转换为字节数组,因为dart_bip66库需要字节数组作为输入。

确保你已经正确安装了dart_bip66库,并且导入了所需的包。然后运行你的Flutter应用,点击“Validate Signature”按钮,即可看到验证结果。

回到顶部