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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_algosigner插件来进行数字签名的代码示例。flutter_algosigner是一个用于与Algorand区块链交互的Flutter插件,支持钱包连接和数字签名等操作。

首先,确保你的Flutter项目已经创建并配置好了基本的依赖。接下来,按照以下步骤操作:

  1. 添加依赖: 在pubspec.yaml文件中添加flutter_algosigner依赖:

    dependencies:
      flutter:
        sdk: flutter
      flutter_algosigner: ^最新版本号  # 请替换为最新版本号
    

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

  2. 导入包: 在你需要使用数字签名功能的Dart文件中导入flutter_algosigner包:

    import 'package:flutter_algosigner/flutter_algosigner.dart';
    
  3. 初始化并连接到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");
      }
    }
    
  4. 进行数字签名: 一旦连接到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");
      }
    }
    
  5. 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交易的构建和广播流程,并根据实际需要进行适当的调整。

回到顶部