Flutter Cardano区块链交互插件catalyst_cardano的使用
Flutter Cardano区块链交互插件catalyst_cardano的使用
内容
特性
此包实现了CIP-30和CIP-95 API,允许Flutter Web应用与Cardano钱包扩展程序通信。
简而言之,该包暴露了window.{walletName} JS API,从而消除了使用js_interop的所有复杂性。
要求
- Dart: 3.5.0+
- Flutter: 3.24.1+
安装
在pubspec.yaml
文件中添加以下依赖:
dependencies:
catalyst_cardano_serialization: any # 或者使用最新版本
catalyst_cardano: any # 或者使用最新版本
catalyst_cardano_web: any # 或者使用最新版本
catalyst_key_derivation: any # 或者使用最新版本
Web设置
在web/index.html
文件的<head>
部分末尾添加以下脚本:
<script type="module" src="/assets/packages/catalyst_cardano_web/assets/js/catalyst_cardano.js"></script>
示例
导入package:catalyst_cardano_serialization/catalyst_cardano_serialization.dart
和package:catalyst_cardano/catalyst_cardano.dart
,实例化TransactionBuilder
,提供交易输入、输出,并添加找零地址以处理任何剩余的未花费UTXO并构建交易体。
通过调用api.signTx(transaction: unsignedTx)
来获取witnessSet
。最后,创建一个签名的交易并通过api.submitTx(transaction: signedTx)
将其提交到区块链。
import 'dart:async';
import 'package:catalyst_cardano/catalyst_cardano.dart';
import 'package:catalyst_cardano_serialization/catalyst_cardano_serialization.dart';
import 'package:catalyst_key_derivation/catalyst_key_derivation.dart';
Future<void> main() async {
await CatalystKeyDerivation.init();
final wallets = await CatalystCardano.instance.getWallets();
if (wallets.isEmpty) {
// 没有找到钱包扩展,请在浏览器中安装
return;
}
final wallet = wallets.first;
print(wallet.name);
print(wallet.icon);
print(wallet.apiVersion);
print(wallet.supportedExtensions);
final api = await wallet.enable();
assert(await wallet.isEnabled(), '钱包已启用');
print(await api.getBalance());
print(await api.getExtensions());
print(await api.getNetworkId());
print(await api.getRewardAddresses());
print(await api.getUnusedAddresses());
print(await api.getUsedAddresses());
final unsignedTx = _buildUnsignedTx(
utxos: await api.getUtxos(
amount: const Balance(
coin: Coin(1000000),
),
),
changeAddress: await api.getChangeAddress(),
);
final witnessSet = await api.signTx(transaction: unsignedTx);
final signedTx = Transaction(
body: unsignedTx.body,
isValid: true,
witnessSet: witnessSet,
);
await api.submitTx(transaction: signedTx);
}
Transaction _buildUnsignedTx({
required Set<TransactionUnspentOutput> utxos,
required ShelleyAddress changeAddress,
}) {
const txBuilderConfig = TransactionBuilderConfig(
feeAlgo: TieredFee(
constant: 155381,
coefficient: 44,
refScriptByteCost: 15,
),
maxTxSize: 16384,
maxValueSize: 5000,
coinsPerUtxoByte: Coin(4310),
);
/* cSpell:disable */
final preprodFaucetAddress = ShelleyAddress.fromBech32(
'addr_test1vzpwq95z3xyum8vqndgdd9mdnmafh3djcxnc6jemlgdmswcve6tkw',
);
/* cSpell:enable */
final txOutput = TransactionOutput(
address: preprodFaucetAddress,
amount: const Balance(coin: Coin(1000000)),
);
final txBuilder = TransactionBuilder(
config: txBuilderConfig,
inputs: utxos,
networkId: NetworkId.testnet,
);
final txBody = txBuilder
.withOutput(txOutput)
.withChangeAddressIfNeeded(changeAddress)
.buildBody();
return Transaction(
body: txBody,
isValid: true,
witnessSet: const TransactionWitnessSet(vkeyWitnesses: {}),
);
}
更多关于Flutter Cardano区块链交互插件catalyst_cardano的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Cardano区块链交互插件catalyst_cardano的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用catalyst_cardano
插件与Cardano区块链进行交互的示例代码。请注意,catalyst_cardano
插件可能是一个假设的插件名称,因为在Flutter社区中可能不存在一个直接名为catalyst_cardano
的官方插件。不过,这个示例将展示如何在Flutter中集成一个自定义的Cardano区块链交互插件。
首先,假设你已经创建了一个Flutter项目,并且已经添加了一个自定义的Cardano区块链交互插件(例如,通过git
或其他方式)。以下是如何在你的Flutter项目中设置和使用这个插件的示例。
1. 添加插件依赖
在你的pubspec.yaml
文件中添加插件依赖(这里假设插件名为catalyst_cardano
,实际使用时请替换为真实插件名称):
dependencies:
flutter:
sdk: flutter
catalyst_cardano:
git:
url: https://github.com/your-repo/catalyst_cardano.git # 替换为实际仓库URL
ref: main # 替换为实际分支名
2. 导入插件
在你的Dart文件中导入插件:
import 'package:catalyst_cardano/catalyst_cardano.dart';
3. 初始化插件
在你的MainActivity.kt
(对于Android)或AppDelegate.swift
(对于iOS)中初始化插件(如果需要原生代码支持)。不过,对于大多数Flutter插件,这一步通常不是必需的,因为插件会自动初始化。
4. 使用插件进行Cardano区块链交互
以下是一个使用插件与Cardano区块链交互的示例代码:
import 'package:flutter/material.dart';
import 'package:catalyst_cardano/catalyst_cardano.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Cardano Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String? result;
void connectToCardano() async {
try {
// 假设插件有一个connect方法用于连接到Cardano网络
var response = await CatalystCardano.connect("your-node-url", "your-wallet-address");
setState(() {
result = "Connected successfully: ${response.data}";
});
} catch (e) {
setState(() {
result = "Error connecting to Cardano: ${e.message}";
});
}
}
void sendTransaction() async {
try {
// 假设插件有一个sendTransaction方法用于发送交易
var transactionData = {
"recipient": "recipient-wallet-address",
"amount": "123456789", // Cardano Lovelace(最小单位)
};
var response = await CatalystCardano.sendTransaction(transactionData);
setState(() {
result = "Transaction sent successfully: ${response.data}";
});
} catch (e) {
setState(() {
result = "Error sending transaction: ${e.message}";
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Cardano Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Result:',
style: TextStyle(fontSize: 18),
),
if (result != null) Text(result!, style: TextStyle(fontSize: 16)),
SizedBox(height: 20),
ElevatedButton(
onPressed: connectToCardano,
child: Text('Connect to Cardano'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: sendTransaction,
child: Text('Send Transaction'),
),
],
),
),
);
}
}
注意事项
-
插件方法:上面的代码示例中使用了
CatalystCardano.connect
和CatalystCardano.sendTransaction
这两个假设的方法。实际使用时,你需要根据插件提供的API文档来调整这些方法的调用。 -
错误处理:在实际应用中,你应该添加更详细的错误处理逻辑,以处理各种可能的异常情况。
-
安全性:在与区块链交互时,确保你的私钥和敏感信息得到妥善保护。
-
依赖管理:确保你的
pubspec.lock
文件是最新的,并且所有依赖都已正确安装。 -
测试:在将代码部署到生产环境之前,务必进行充分的测试。
由于catalyst_cardano
可能是一个假设的插件名称,因此在实际项目中,你可能需要寻找或开发一个与Cardano区块链交互的Flutter插件。如果找不到合适的插件,你可以考虑使用现有的Cardano库(如cardano-wallet-js
或cardano-serialization-lib
)并通过platform_channels
在Flutter与原生代码之间进行通信。