Flutter数字签名插件flutter_algosigner的使用
Flutter数字签名插件flutter_algosigner的使用
AlgoSigner 是一个区块链钱包,使得在网页上使用基于 Algorand 的应用变得简单。只需创建或导入您的 Algorand 账户,访问兼容的 dApp,并批准或拒绝交易——这一切都可以在浏览器内完成。
AlgoSigner 为开发者提供了安全的方式来添加交易功能,从而可以构建 DeFi 应用。这使得开发者可以轻松地发起交易并接收 ALGO,而不会危及用户密钥的安全性。
dApp 用户可以信任 AlgoSigner:
- 安全存储和加密账户密钥
- 在不直接向 dApp 提供密钥的情况下授权交易
- 使用 dApp 签名和批准交易
该插件由 RootSoft 开发,与 PureStake 或 AlgoSigner 无关。更多信息可查看官方的 AlgoSigner 文档。
引言
AlgoSigner 向每个浏览器用户访问的网页注入一个 JavaScript 库,允许网站与扩展程序交互。dApp 可以使用注入的库连接到用户的钱包,发现其持有的账户地址,查询网络(调用 AlgoD v2 或 Indexer),并请求 AlgoSigner 请求用户签署由应用程序发起的交易。所有注入库的方法都需要由 dApp 处理返回的 Future。
flutter-algosigner
插件紧密遵循 AlgoSigner API,并且所有方法都可用。该插件与 algorand_dart
SDK 集成得非常好,因此交易可以轻松地被签名和批准。
安装后,您可以轻松地签名交易并开始发送付款:
await AlgoSigner.connect();
/// 签署交易
final txs = await AlgoSigner.signTransaction(
{
'txn': transaction.toBase64(),
},
);
// 发送交易
final txId = await AlgoSigner.send(
ledger: 'TestNet',
transaction: blob,
);
开始使用
安装
您可以通过 pub.dev 安装包:
flutter pub add flutter_algosigner
这将在您的包的 pubspec.yaml 文件中添加一行(并运行隐式的 dart pub get):
dependencies:
flutter_algosigner: ^latest-version
或者,您的编辑器可能支持 flutter pub get。请查阅您的编辑器文档以了解更多信息。
方法
flutter-algosigner
网页插件封装了 JavaScript API 并向 Flutter 开发者暴露了方法。这样,Flutter 网页开发人员可以受益并使用相同的 API 创建 web3 dApplication。
connect()
请求对钱包的访问权限,可能会被拒绝或批准。每次访问扩展程序都从连接请求开始,如果得到用户的批准,则允许 dApp 进行其他请求。
await AlgoSigner.connect();
accounts()
返回给定网络中存在的账户数组。
final accounts = await AlgoSigner.accounts(ledger: 'TestNet');
algod()
将请求的路径代理到 Algod v2 API。仅限 API 服务器提供的端点。默认情况下,对 AlgoSigner.algod 方法的所有调用都是 GET。
await AlgoSigner.algod(
ledger: 'TestNet',
path: '/v2/transactions/params',
);
要进行 POST 请求,需要在输入中包含更多详细信息。
await AlgoSigner.algod(
ledger: 'TestNet',
path: '/v2/teal/compile',
body: 'int 0',
method: 'POST',
contentType: 'text/plain',
);
indexer()
将请求的路径代理到 Indexer v2 API。仅限 API 服务器提供的端点。API 后端可能由高级用户配置,并不能保证响应符合预期。更多信息可在此处找到。
await AlgoSigner.indexer(
ledger: 'TestNet',
path: '/v2/assets/150821',
);
signTransaction()
将符合 Algorand JS SDK 的交易对象发送到 AlgoSigner 进行批准。网络由 ‘genesis-id’ 属性确定。如果批准,响应是一个包含 base64 编码二进制 blob 的已签名交易对象数组。
交易要求
交易对象需要以下结构:
{
txn: Base64-encoded string of a transaction binary,
signers?: [optional] array of addresses to sign with (defaults to the sender),
multisig?: [optional] extra metadata needed for multisig transactions,
};
有关更多信息,请参阅交易要求文档。
请求
await AlgoSigner.signTransactions(
[
{
'txn': transaction.toBase64(),
},
],
);
示例
以下展示了如何使用 algorand-dart SDK 使用 AlgoSigner 签名交易的一个示例。
await AlgoSigner.connect();
// 获取建议的交易参数
final params = await algorand.getSuggestedTransactionParams();
// 构建交易
final transaction = await (PaymentTransactionBuilder()
..sender = address
..note = 'Hi from Flutter'
..amount = Algo.toMicroAlgos(0.1)
..receiver = address
..suggestedParams = params)
.build();
final txs = await AlgoSigner.signTransactions(
[
{
'txn': transaction.toBase64(),
},
],
);
final blob = txs[0]['blob'];
send()
发送 base64 编码的已签名交易 blob 到 AlgoSigner 以传输到网络。
final txId = await AlgoSigner.send(
ledger: 'TestNet',
transaction: blob,
);
final tx = await algorand.waitForConfirmation(txId);
更改日志
请参阅 CHANGELOG 了解更多最近的更改信息。
贡献与拉取请求
请随意发送拉取请求。
详情请参阅 CONTRIBUTING 文件。
致谢
- Tomas Verhelst
- 所有贡献者
许可证
MIT 许可证。更多信息请参阅许可证文件。
示例代码
以下是 flutter_algosigner
插件的完整示例代码:
import 'package:algorand_dart/algorand_dart.dart';
import 'package:flutter/material.dart';
import 'package:flutter_algosigner/algosigner.dart';
import 'package:flutter_algosigner/algosigner_web.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
final algorand = Algorand(
algodClient: AlgodClient(apiUrl: AlgoExplorer.TESTNET_ALGOD_API_URL),
indexerClient: IndexerClient(apiUrl: AlgoExplorer.TESTNET_INDEXER_API_URL),
);
class _MyAppState extends State<MyApp> {
final String _platformVersion = 'Unknown';
[@override](/user/override)
void initState() {
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Text('Running on: $_platformVersion\n'),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
try {
final address = Address.fromAlgorandAddress(
address:
// ignore: lines_longer_than_80_chars
'KTFZ5SQU3AQ6UFYI2QOWF5X5XJTAFRHACWHXAZV6CPLNKS2KSGQWPT4ACE',
);
// 获取建议的交易参数
final params = await algorand.getSuggestedTransactionParams();
// 构建交易
final transaction = await (PaymentTransactionBuilder()
..sender = address
..note = 'Hi from Flutter'
..amount = Algo.toMicroAlgos(0.1)
..receiver = address
..suggestedParams = params)
.build();
await AlgoSigner.connect();
final txs = await AlgoSigner.signTransactions(
[
{
'txn': transaction.toBase64(),
},
],
);
final blob = txs[0]['blob'];
print(blob);
print('Sending tx');
// 发送交易
final txId = await AlgoSigner.send(
ledger: 'TestNet',
transaction: blob,
);
final tx = await algorand.waitForConfirmation(txId);
print('Confirmed tx id in round: ${tx.confirmedRound}');
} on AlgoSignerException catch (ex) {
print('Unable to connect ${ex.message}');
} on AlgorandException catch (ex) {
print('Unable to send transaction ${ex.message}');
} catch (ex) {
print('Unable to send transaction $ex');
}
},
child: const Icon(Icons.add),
),
),
);
}
}
更多关于Flutter数字签名插件flutter_algosigner的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数字签名插件flutter_algosigner的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_algosigner
插件来进行数字签名的代码示例。flutter_algosigner
是一个用于与Algorand区块链交互的Flutter插件,支持钱包连接和数字签名等操作。
首先,确保你的Flutter项目已经创建并配置好了基本的依赖。接下来,按照以下步骤操作:
-
添加依赖: 在
pubspec.yaml
文件中添加flutter_algosigner
依赖:dependencies: flutter: sdk: flutter flutter_algosigner: ^最新版本号 # 请替换为最新版本号
然后运行
flutter pub get
来安装依赖。 -
导入包: 在你需要使用数字签名功能的Dart文件中导入
flutter_algosigner
包:import 'package:flutter_algosigner/flutter_algosigner.dart';
-
初始化并连接到AlgoSigner: 使用
AlgoSigner
类来初始化连接。通常,你会在一个按钮点击事件中触发连接流程。void _connectToAlgoSigner() async { try { // 初始化AlgoSigner实例 final algoSigner = await AlgoSigner.init(); // 检查是否已经连接 final isConnected = await algoSigner.isConnected(); if (!isConnected) { // 请求用户连接 final result = await algoSigner.connect(); if (result == ConnectionStatus.connected) { print("Successfully connected to AlgoSigner"); // 在这里可以继续进行签名等操作 } else { print("Failed to connect to AlgoSigner"); } } else { print("Already connected to AlgoSigner"); } } catch (e) { print("Error connecting to AlgoSigner: $e"); } }
-
进行数字签名: 一旦连接到AlgoSigner,你可以使用
signTransaction
方法进行签名。以下是一个简单的示例,展示如何签名一个交易(注意:这只是一个示例,实际交易数据需要根据Algorand的要求构建):void _signTransaction() async { try { final algoSigner = await AlgoSigner.init(); // 检查是否已经连接 final isConnected = await algoSigner.isConnected(); if (isConnected) { // 假设你已经构建了一个交易对象(这里仅为示例) final transaction = { // 交易字段,根据Algorand SDK的要求填充 "txn": { "fee": 1000, "firstRound": 1234567, "lastRound": 1234577, "from": "你的钱包地址", "to": "收款地址", "amount": 1000000, // 其他必要的字段... }, "genesisID": "你的网络genesisID", "genesisHash": "你的网络genesisHash" }; // 请求用户签名交易 final signedTxn = await algoSigner.signTransaction(transaction); print("Signed Transaction: $signedTxn"); // 你可以将signedTxn发送到Algorand网络进行广播 } else { print("Not connected to AlgoSigner"); } } catch (e) { print("Error signing transaction: $e"); } }
-
UI按钮触发: 在你的Flutter UI中添加按钮来触发上述函数:
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('AlgoSigner Demo'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ ElevatedButton( onPressed: _connectToAlgoSigner, child: Text('Connect to AlgoSigner'), ), SizedBox(height: 20), ElevatedButton( onPressed: _signTransaction, child: Text('Sign Transaction'), ), ], ), ), ), ); } }
以上代码展示了如何在Flutter项目中使用flutter_algosigner
插件进行数字签名。请确保你了解Algorand交易的构建和广播流程,并根据实际需要进行适当的调整。