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; // 返回签名结果
}
}
使用说明
-
初始化:
TezosSigner signer = TezosSigner(provider); await signer.init();
在这个步骤中,你需要创建一个
TezosSigner
实例,并调用init()
方法来初始化它。这一步骤会从钱包提供商那里获取公钥和公钥哈希。 -
签名操作:
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
更多关于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'),
);
}
}
代码解释:
- 依赖安装:在
pubspec.yaml
中添加blockchain_signer
依赖。 - UI设计:创建一个简单的Flutter应用,包含一个按钮。
- 私钥和消息:在
_SignTransactionButtonState
类中定义私钥和要签名的消息。 - 签名过程:
- 使用私钥创建
ECKeyPair
对象。 - 将消息转换为
Uint8List
。 - 使用
ECKeyPair
对象的sign
方法对消息进行签名。 - 将签名结果转换为十六进制字符串以便于显示。
- 使用私钥创建
- 辅助函数:包含两个辅助函数,用于在十六进制字符串和字节数组之间进行转换。
注意事项:
- 确保你的私钥安全存储,不要硬编码在代码中。
- 在实际使用中,你可能需要处理更复杂的消息格式和签名验证逻辑。
- 此示例仅用于演示目的,实际应用中应考虑错误处理和安全性最佳实践。
希望这个示例能帮助你理解如何在Flutter项目中使用blockchain_signer
插件进行区块链签名。