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的实际运行情况,可以查看以下资源:
- 纯Dart示例:Dart示例
- 多平台Flutter示例:Flutter示例
- 在线演示钱包:Flutter演示钱包,托管于Google Cloud上。
当前(Fund 5)特性
- 创建钱包 - 使用staking地址、助记词或私钥创建和恢复只读和交易性钱包。
- 交易历史 - 列出ADA和原生代币的交易、奖励和费用。
- 地址 - 生成和管理Shelley密钥对和地址。
- 交易 - 构建、签名并提交简单的ADA支付交易。
- 区块链API - 通过BlockFrost API访问Cardano区块链。
- 二进制编码 - 提供足够的CBOR支持以提交简单的支付交易。
使用方法
发布的版本和安装详情可以在pub.dev找到。
编码风格
尽管Dart是一种命令式语言,但框架尽可能地使用函数式编程范式。特别是,大多数类都是不可变的,并且而不是通过抛出异常来创建副作用,而是使用Result
类。WalletBuilder
的build
方法提供了具体示例,返回钱包实例或遇到问题时的错误消息:
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
更多关于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'),
),
],
),
),
),
);
}
}
注意事项:
-
节点URL和项目ID:在
CardanoWalletSdk
初始化时,你需要提供Cardano节点的URL和端口,以及你的项目ID。这些信息通常在你的Cardano Wallet后端服务配置中获取。 -
错误处理:示例代码中仅简单打印了错误。在实际应用中,你应该有适当的错误处理逻辑,比如显示错误消息给用户。
-
安全性:在实际应用中,处理私钥和交易时需要格外注意安全性。确保遵循最佳实践,比如使用安全的存储和传输机制。
-
更新余额:示例中仅在一次获取余额后显示。在实际应用中,你可能需要定期更新余额信息。
-
发送交易:示例中没有展示如何发送交易。发送交易通常涉及构建交易、签名交易和提交交易等多个步骤,这些步骤在
cardano_wallet_sdk
的文档中都有详细说明。
这个示例仅展示了基本的用法。根据你的需求,你可能需要查阅cardano_wallet_sdk
的官方文档以了解更多高级功能和用法。