Flutter区块链签名插件blockchain_signer的使用

Flutter区块链签名插件blockchain_signer的使用

简介

blockchain-mobile-signer 是一个通用的签名协议,允许第三方库启用Magic KMS。

完整示例Demo

以下是一个完整的示例代码,展示了如何在Flutter项目中使用 blockchain_signer 插件进行区块链签名操作。

// Copyright (c), Magic Labs
// All rights reserved. Use of this source code is governed by a
// MIT license that can be found in the LICENSE file.

import 'package:blockchain_signer/signer/remote/remote_signer.dart';
import 'package:blockchain_signer/signer/response/signed_result.dart';

///
/// 这是一个简单的示例,展示如何使用区块链签名接口对给定的有效负载进行签名。
/// 有效负载将发送到指定的钱包提供商以获取签名。
///
Future<void> main() async {
  // 初始化TezosSigner实例
  TezosSigner signer = TezosSigner(provider);

  // 初始化签名器
  await signer.init();

  // 操作内容(十六进制格式)
  const operationInHex = 'a356d122';
  // 水印内容(字节列表)
  const watermarkInBytes = Uint8List.fromList(crypto.hexDecode('03'));

  // 执行签名操作
  SignedResult res = await signer.sign(operationInHex, watermarkInBytes);

  // 输出签名结果
  print(res.sig);        // 签名对象
  print(res.sbytes);     // 签名字节
  print(res.bytes);      // 字节内容
  print(res.prefixSig);  // 前缀签名
}

///
/// 这是一个简单的示例,展示如何在钱包提供商端构建Tezos远程签名模块。
///
class TezosSigner extends BlockchainModule implements RemoteSigner {
  TezosSigner(RpcProvider provider)
      : super(provider);

  late String _pk;       // 公钥
  late String _pkh;      // 公钥哈希

  static TezosSigner? instance;

  @override
  String get address => _pkh; // 获取地址

  @override
  String get publicKey => _pk; // 获取公钥

  @override
  String get secretKey =>
      throw UnsupportedError('密钥不可用'); // 不支持获取私钥

  /// 发送未签名的操作给签名器并等待其签名
  ///
  /// @param [op] 要签名的操作
  /// @param [magicByte] 魔法字节 1 表示区块,2 表示授权,3 表示通用,5 表示Michelson的PACK格式
  Future<void> init() async {
    // 发送请求以获取公钥和哈希
    var response = await sendToProvider(method: TezosMethod.taquito_getPublicKeyAndHash, params: []);
    _pk = response.result.pk;   // 设置公钥
    _pkh = response.result.pkh; // 设置公钥哈希
  }

  @override
  Future<SignedResult> sign(String op, Uint8List magicByte) async {
    // 构建参数
    final params = {"bytes": op, "watermark": magicByte};

    // 发送请求以获取签名
    var response = await sendToProvider(method: TezosMethod.taquito_sign, params: [params]);
    return response; // 返回签名结果
  }
}

使用说明

  1. 初始化

    TezosSigner signer = TezosSigner(provider);
    await signer.init();
    

    在这个步骤中,你需要创建一个 TezosSigner 实例,并调用 init() 方法来初始化它。这一步骤会从钱包提供商那里获取公钥和公钥哈希。

  2. 签名操作

    const operationInHex = 'a356d122';
    const watermarkInBytes = Uint8List.fromList(crypto.hexDecode('03'));
    
    SignedResult res = await signer.sign(operationInHex, watermarkInBytes);
    

更多关于Flutter区块链签名插件blockchain_signer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter区块链签名插件blockchain_signer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用blockchain_signer插件进行区块链签名的代码示例。这个插件允许你使用私钥对交易进行签名,这在处理区块链交互时非常有用。

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

dependencies:
  flutter:
    sdk: flutter
  blockchain_signer: ^最新版本号  # 替换为当前最新版本号

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

接下来,我们编写一个示例代码来展示如何使用blockchain_signer进行签名。这个示例假设你已经有一个私钥和要签名的数据(例如一个交易哈希)。

import 'package:flutter/material.dart';
import 'package:blockchain_signer/blockchain_signer.dart';
import 'dart:convert';
import 'dart:typed_data';

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

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

class SignTransactionButton extends StatefulWidget {
  @override
  _SignTransactionButtonState createState() => _SignTransactionButtonState();
}

class _SignTransactionButtonState extends State<SignTransactionButton> {
  String privateKey = '你的私钥'; // 替换为你的私钥
  String messageToSign = '你的交易哈希'; // 替换为你要签名的交易哈希

  String signedMessage = '';

  void _signMessage() async {
    try {
      // 使用私钥创建ECKeyPair对象
      final ecKeyPair = ECKeyPair.fromPrivateKey(Uint8List.fromList(hexStringToByteArray(privateKey)));
      
      // 将消息转换为Uint8List
      final messageBytes = Uint8List.fromList(utf8.encode(messageToSign));
      
      // 对消息进行签名
      final signature = ecKeyPair.sign(messageBytes);
      
      // 将签名转换为十六进制字符串
      signedMessage = byteArrayToHexString(signature);
      
      // 更新UI
      setState(() {});
    } catch (e) {
      print('签名失败: $e');
    }
  }

  // 辅助函数:将十六进制字符串转换为字节数组
  Uint8List hexStringToByteArray(String hex) {
    return Uint8List.fromList(
      hex.split('').map((c) => int.parse(c * 2 + (c.toUpperCaseCodeUnits.first >= 65 ? 10 - 7 : 15 - 7), radix: 16)).toList(),
    );
  }

  // 辅助函数:将字节数组转换为十六进制字符串
  String byteArrayToHexString(Uint8List byteArray) {
    return byteArray.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join();
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _signMessage,
      child: Text('Sign Transaction'),
    );
  }
}

代码解释:

  1. 依赖安装:在pubspec.yaml中添加blockchain_signer依赖。
  2. UI设计:创建一个简单的Flutter应用,包含一个按钮。
  3. 私钥和消息:在_SignTransactionButtonState类中定义私钥和要签名的消息。
  4. 签名过程
    • 使用私钥创建ECKeyPair对象。
    • 将消息转换为Uint8List
    • 使用ECKeyPair对象的sign方法对消息进行签名。
    • 将签名结果转换为十六进制字符串以便于显示。
  5. 辅助函数:包含两个辅助函数,用于在十六进制字符串和字节数组之间进行转换。

注意事项:

  • 确保你的私钥安全存储,不要硬编码在代码中。
  • 在实际使用中,你可能需要处理更复杂的消息格式和签名验证逻辑。
  • 此示例仅用于演示目的,实际应用中应考虑错误处理和安全性最佳实践。

希望这个示例能帮助你理解如何在Flutter项目中使用blockchain_signer插件进行区块链签名。

回到顶部