Flutter Cardano钱包管理插件cardano_wallet_sdk的使用

Flutter Cardano钱包管理插件cardano_wallet_sdk的使用

cardano_wallet_sdk

SDK用于在Flutter中使用Dart编程语言构建Cardano区块链移动应用程序。

状态

该项目最初作为Fund 5 Project Catalyst的概念验证原型,具有有限的用例。该原型SDK使用BlockFrost API服务实现了轻量级客户端库,支持加载钱包余额和提交简单交易。

目前,该库正在重构为生产质量的Cardano SDK,支持简单的智能合约、铸造、质押、密钥管理和编写dApp及其他类型的Cardano客户端所需的功能。预计此阶段将在2022年完成,使用Fund 7拨款。

这是一个雄心勃勃的项目,需要大量的维护、开发和社区支持。如果您希望看到该项目成功,请通过在Fund 8中投票支持Flutter SDK来帮助我们!这将有助于实现更高级的智能合约功能、后端改进、第三方依赖减少、架构改进、文档和教程。

如果您愿意直接贡献,Flutter SDK有一个专用的钱包:

addr1qx90lkpwhpwu42jnw00w483krjyfvhhpgk97hdfw9nz3xqaqg6dycrrc4qw0l5fsvfgx95gnqmrfxhgrfy8afsxxje5qgplx9r

测试

要查看SDK的实际运行情况,可以查看以下资源:

当前(Fund 5)特性

  • 创建钱包 - 使用staking地址、助记词或私钥创建和恢复只读和交易性钱包。
  • 交易历史 - 列出ADA和原生代币的交易、奖励和费用。
  • 地址 - 生成和管理Shelley密钥对和地址。
  • 交易 - 构建、签名并提交简单的ADA支付交易。
  • 区块链API - 通过BlockFrost API访问Cardano区块链。
  • 二进制编码 - 提供足够的CBOR支持以提交简单的支付交易。

使用方法

发布的版本和安装详情可以在pub.dev找到。

编码风格

尽管Dart是一种命令式语言,但框架尽可能地使用函数式编程范式。特别是,大多数类都是不可变的,并且而不是通过抛出异常来创建副作用,而是使用Result类。WalletBuilderbuild方法提供了具体示例,返回钱包实例或遇到问题时的错误消息:

Result<Wallet, String> result = walletBuilder.build();
result.when(
    ok: (wallet) => print("Success: ${wallet.walletName}"),
    err: (message) => print("Error: $message"),
);

钱包管理

使用BlockFrost密钥为测试网创建钱包构建器。

final walletBuilder = WalletBuilder()
    ..networkId = NetworkId.testnet
    ..testnetAdapterKey = blockfrostKey;

使用staking地址创建只读钱包。

var address = ShelleyAddress.fromBech32('stake_test1uqvwl7a...');
final walletBuilder = WalletBuilder()
    ..networkId = NetworkId.testnet
    ..testnetAdapterKey = blockfrostKey
    ..stakeAddress = address;
Result<ReadOnlyWallet, String> result = await walletBuilder.readOnlyBuildAndSync();
result.when(
    ok: (wallet) => print("${wallet.walletName}: ${wallet.balance}"),
    err: (message) => print("Error: $message"),
);

使用24字助记词恢复现有钱包。

List<String> mnemonic = 'rude stadium move gallery receive just...'.split(' ');
final walletBuilder = WalletBuilder()
    ..networkId = NetworkId.testnet
    ..testnetAdapterKey = blockfrostKey
    ..mnemonic = mnemonic;
Result<Wallet, String> result = await walletBuilder.buildAndSync();
if (result.isOk()) {
    var wallet = result.unwrap();
    print("${wallet.walletName}: ${wallet.balance}");
}

更新现有钱包。

final walletBuilder = WalletBuilder()
    ..networkId = NetworkId.testnet
    ..testnetAdapterKey = blockfrostKey
    ..mnemonic = mnemonic;
Result<Wallet, String> result = walletBuilder.build();
Wallet wallet = result.unwrap();
Coin oldBalance = wallet.balance;
var result2 = await wallet.update();
result2.when(
    ok: (_) => print("old:$oldBalance lovelace, new: ${wallet.balance} lovelace"),
    err: (message) => print("Error: $message"),
);

创建新的24字助记词。

List<String> mnemonic = WalletBuilder.generateNewMnemonic();
print("mnemonic: ${mnemonic.join(' ')}");

钱包详情

列出交易历史。

wallet.transactions.forEach((tx) => print(tx));

列出地址。

wallet.addresses.forEach((addr) => print(addr.toBech32()));

列出货币余额。

final formatter = AdaFormattter.compactCurrency();
wallet.currencies.forEach((assetId, balance) {
    final isAda = assetId == lovelaceHex;
    print("$assetId: ${isAda ? formatter.format(balance) : balance}");
});

列出staking奖励。

wallet.stakeAccounts.forEach((acct) {
    acct.rewards.forEach((reward) {
        print("epoch: ${reward.epoch}, ${reward.amount} ADA");
    });
});

钱包密钥和地址

访问根私钥和公钥对。

Bip32KeyPair pair = wallet.rootKeyPair;
print("${pair.signingKey}, ${pair.verifyKey}");

访问staking地址。

print(wallet.stakingAddress));

获取第一个未使用的change地址。

print(wallet.firstUnusedChangeAddress));

获取第一个未使用的spend地址。

print(wallet.firstUnusedSpendAddress));

提交交易

向Bob发送3个ADA。

var bobsAddress = ShelleyAddress.fromBech32('addr1qyy6...');
final Result<ShelleyTransaction, String> result = await wallet.sendAda(
    toAddress: bobsAddress,
    lovelace: 3 * 1000000,
);
if (result.isOk()) {
    final tx = result.unwrap();
    print("ADA sent. Fee: ${tx.body.fee} lovelace");
}

计划特性

  • 智能合约 - 2022年:包括示例和支持代码。
  • 原生代币/NFT - 2022年:提供铸造和销毁支持。
  • 质押 - 2022年:提供质押池排名和质押委托支持。
  • 安全存储 - 2022年:加密存储解决方案用于私钥和密码。
  • 替代地址 - 2022年:支持企业、指针和传统地址。
  • 多重签名 - 2023年:支持多方签名。
  • 区块链适配器 - 2023年:抽象层以允许多种区块链网关(如Blockfrost、GraphQL、Ogmios和Mithril)。

运行集成测试

一些集成测试(后缀为’_itest.dart’)需要BlockFrost密钥才能运行。安装步骤如下:

  • git clone git@github.com:reaster/cardano_wallet_sdk.git
  • 注册一个免费的BlockFrost测试网策略ID密钥。
  • 将策略ID密钥粘贴到名为blockfrost_project_id.txt的文本文件中,并放置在项目的父目录中。
echo "your-project-id" > ../blockfrost_project_id.txt

现在您可以包含集成测试:

dart test -P itest

更多关于Flutter Cardano钱包管理插件cardano_wallet_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Cardano钱包管理插件cardano_wallet_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,我可以为你提供一个关于如何在Flutter项目中使用cardano_wallet_sdk插件来管理Cardano钱包的示例代码。这个示例将展示如何初始化插件、创建钱包、获取钱包信息以及发送交易等基本操作。

首先,确保你已经在pubspec.yaml文件中添加了cardano_wallet_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  cardano_wallet_sdk: ^latest_version  # 请替换为实际的最新版本号

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

以下是一个简单的Flutter应用示例,展示了如何使用cardano_wallet_sdk

import 'package:flutter/material.dart';
import 'package:cardano_wallet_sdk/cardano_wallet_sdk.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late CardanoWalletSdk _cardanoWalletSdk;
  String? _walletId;
  String? _walletName;
  String? _walletBalance;

  @override
  void initState() {
    super.initState();
    // 初始化Cardano Wallet SDK
    _cardanoWalletSdk = CardanoWalletSdk(
      // 替换为你的Cardano节点URL和端口
      nodeUrl: 'https://your-cardano-node-url:port',
      // 替换为你的项目ID(在Cardano Wallet后端服务中配置)
      projectId: 'your-project-id',
    );

    // 你可以在这里添加其他初始化代码,比如检查用户是否已经登录等
  }

  Future<void> createWallet() async {
    try {
      // 创建新钱包
      var wallet = await _cardanoWalletSdk.createWallet(name: 'My New Wallet');
      setState(() {
        _walletId = wallet.id;
        _walletName = wallet.name;
        _walletBalance = 'Loading...'; // 初始状态设置为加载中
      });

      // 获取钱包余额(示例,实际应用中你可能需要在其他地方定期更新余额)
      var balance = await _cardanoWalletSdk.getWalletBalance(_walletId!);
      setState(() {
        _walletBalance = balance.toString();
      });
    } catch (e) {
      print('Error creating wallet: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Cardano Wallet Management'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Wallet ID: $_walletId'),
              SizedBox(height: 16),
              Text('Wallet Name: $_walletName'),
              SizedBox(height: 16),
              Text('Wallet Balance: $_walletBalance'),
              SizedBox(height: 32),
              ElevatedButton(
                onPressed: createWallet,
                child: Text('Create Wallet'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 节点URL和项目ID:在CardanoWalletSdk初始化时,你需要提供Cardano节点的URL和端口,以及你的项目ID。这些信息通常在你的Cardano Wallet后端服务配置中获取。

  2. 错误处理:示例代码中仅简单打印了错误。在实际应用中,你应该有适当的错误处理逻辑,比如显示错误消息给用户。

  3. 安全性:在实际应用中,处理私钥和交易时需要格外注意安全性。确保遵循最佳实践,比如使用安全的存储和传输机制。

  4. 更新余额:示例中仅在一次获取余额后显示。在实际应用中,你可能需要定期更新余额信息。

  5. 发送交易:示例中没有展示如何发送交易。发送交易通常涉及构建交易、签名交易和提交交易等多个步骤,这些步骤在cardano_wallet_sdk的文档中都有详细说明。

这个示例仅展示了基本的用法。根据你的需求,你可能需要查阅cardano_wallet_sdk的官方文档以了解更多高级功能和用法。

回到顶部