Flutter Cardano区块链交互插件catalyst_cardano的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

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.dartpackage: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

1 回复

更多关于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'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. 插件方法:上面的代码示例中使用了CatalystCardano.connectCatalystCardano.sendTransaction这两个假设的方法。实际使用时,你需要根据插件提供的API文档来调整这些方法的调用。

  2. 错误处理:在实际应用中,你应该添加更详细的错误处理逻辑,以处理各种可能的异常情况。

  3. 安全性:在与区块链交互时,确保你的私钥和敏感信息得到妥善保护。

  4. 依赖管理:确保你的pubspec.lock文件是最新的,并且所有依赖都已正确安装。

  5. 测试:在将代码部署到生产环境之前,务必进行充分的测试。

由于catalyst_cardano可能是一个假设的插件名称,因此在实际项目中,你可能需要寻找或开发一个与Cardano区块链交互的Flutter插件。如果找不到合适的插件,你可以考虑使用现有的Cardano库(如cardano-wallet-jscardano-serialization-lib)并通过platform_channels在Flutter与原生代码之间进行通信。

回到顶部