Flutter比特币Bech32地址生成与验证插件bitcoin_bech32_ng的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter比特币Bech32地址生成与验证插件bitcoin_bech32_ng的使用

Bech32

pub package

本库实现了BIP173和BIP350规范,用于Segwit Bech32地址格式。这是对原始库的改进,引入了BIP350,修复了转换问题并提供了更清晰的接口。

安装

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

dependencies:
  bitcoin_bech32_ng: any

示例

示例1:解码Segwit地址

import 'package:bitcoin_bech32_ng/bitcoin_bech32_ng.dart';

void main() {
  // 解码Segwit地址
  var address = segwit.decode(
      'bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx');
  print('scriptPubKey: ${address.scriptPubKey}');
  // 输出: scriptPubKey: 5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6
  print('version: ${address.version}');
  // 输出: version: 1
  print('program: ${address.program}');
  // 输出: program: [81, 40, 117, 232, 25, 145, 150, 212, 84, 65, 60, 208, 209, 179, 163, 51, 241, 67, 59, 102, 81, 40, 117, 232, 25, 145, 150, 212, 84, 65, 60, 208, 209, 179, 163, 51, 241, 67, 59, 102]
}

示例2:编码Segwit地址

import 'package:bitcoin_bech32_ng/bitcoin_bech32_ng.dart';

void main() {
  // 创建Segwit对象
  var otherAddress = Segwit('bc', 1, [0, 0]);
  // 编码Segwit对象为地址字符串
  print(segwit.encode(otherAddress));
  // 输出: bc1qzda0y5dpda78rg2lmuww6vha9j6m954j3q45e9
}

示例3:解码闪电网络支付请求

import 'package:bitcoin_bech32_ng/bitcoin_bech32_ng.dart';

void main() {
  // 解码闪电网络支付请求
  var paymentRequest =
      'lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w';
  var codec = Bech32Codec();
  var bech32 = codec.decode(
    paymentRequest,
    paymentRequest.length,
  );
  print('hrp: ${bech32.hrp}');
  // 输出: hrp: lnbc
  print('data: ${bech32.data}');
  // 输出: data: [1, 123, 80, 1, 0, 1, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用bitcoin_bech32_ng插件来生成和验证比特币Bech32地址的示例代码。这个插件提供了方便的API来处理Bech32编码的地址。

首先,确保你的Flutter项目已经创建,并且已经配置好了基本的依赖管理。然后,在你的pubspec.yaml文件中添加bitcoin_bech32_ng依赖:

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

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

接下来,我们编写一些Dart代码来演示如何生成和验证Bech32地址。

示例代码

main.dart

import 'package:flutter/material.dart';
import 'package:bitcoin_bech32_ng/bitcoin_bech32.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Bech32 Address Example'),
        ),
        body: Bech32Example(),
      ),
    );
  }
}

class Bech32Example extends StatefulWidget {
  @override
  _Bech32ExampleState createState() => _Bech32ExampleState();
}

class _Bech32ExampleState extends State<Bech32Example> {
  final TextEditingController _witverController = TextEditingController();
  final TextEditingController _payloadController = TextEditingController();
  String? _generatedAddress;
  bool? _isValidAddress;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          TextField(
            controller: _witverController,
            decoration: InputDecoration(labelText: 'Witness Version (1 for bc1)'),
          ),
          SizedBox(height: 16),
          TextField(
            controller: _payloadController,
            decoration: InputDecoration(labelText: 'Payload (hex string)'),
            keyboardType: TextInputType.text,
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: () {
              _generateAddress();
            },
            child: Text('Generate Address'),
          ),
          SizedBox(height: 16),
          if (_generatedAddress != null)
            Text(
              'Generated Address: $_generatedAddress',
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
            ),
          SizedBox(height: 16),
          TextField(
            decoration: InputDecoration(labelText: 'Enter Bech32 Address'),
            keyboardType: TextInputType.text,
            onEditingComplete: () {
              _validateAddress();
            },
          ),
          SizedBox(height: 16),
          if (_isValidAddress != null)
            Text(
              'Address Valid: $_isValidAddress',
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: _isValidAddress! ? Colors.green : Colors.red),
            ),
        ],
      ),
    );
  }

  void _generateAddress() {
    final witver = int.parse(_witverController.text, radix: 10);
    final payload = _payloadController.text;

    try {
      final address = Bech32.encode('bc', witver, payload);
      setState(() {
        _generatedAddress = address;
      });
    } catch (e) {
      print('Error generating address: $e');
    }
  }

  void _validateAddress() {
    final address = _textEditingController.text; // Assuming you have a TextField controller for address input
    try {
      final decoded = Bech32.decode(address);
      setState(() {
        _isValidAddress = decoded != null;
      });
    } catch (e) {
      setState(() {
        _isValidAddress = false;
      });
      print('Error validating address: $e');
    }
  }
}

注意

  1. _textEditingController.text用于获取用户输入的地址字符串,但在上述代码中,我们假设用户直接在另一个TextField中输入地址,因此应该替换为合适的TextEditingController(如新增一个)。
  2. Bech32.encodeBech32.decode 是插件提供的方法,用于编码和解码Bech32地址。
  3. 示例代码中的_generateAddress方法生成Bech32地址,而_validateAddress方法验证输入的Bech32地址是否有效。

希望这个示例代码能帮助你理解如何在Flutter项目中使用bitcoin_bech32_ng插件来生成和验证比特币Bech32地址。如果有任何进一步的问题,请随时提问。

回到顶部