Flutter区块链交互插件cosmos_sdk的使用

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

Flutter区块链交互插件cosmos_sdk的使用

简介

dart-cosmos-sdk 插件让开发者能够轻松地与基于 Cosmos SDK 的网络进行交互,支持创建、签名和发送交易。请注意,当前版本为 Beta 版本,在实际应用前需要进行全面测试。

支持的 Protocol Buffer 包

该插件支持多种 Protocol Buffer 包,包括但不限于:

  • cosmos.auth.v1beta1
  • cosmos.bank.v1beta1
  • ibc.core.channel.v1
  • tendermint/tendermint

完整列表请参见文档开头部分。

示例代码

交易示例

下面是一个完整的示例,展示了如何使用 cosmos_sdk 创建并签署一笔交易。

import 'package:cosmos_sdk/cosmos_sdk.dart';

void main() async {
  // 生成 BIP39 种子
  final seedBytes = Bip39SeedGenerator(Mnemonic.fromString(
          "this dove indoor skin shed gap east welcome gift buffalo silent high"))
      .generate();

  // 使用 BIP44 派生路径
  final bip44 = Bip44.fromSeed(seedBytes, Bip44Coins.cosmos).deriveDefaultPath;
  final pubkey = CosmosSecp256K1PublicKey.fromBytes(bip44.publicKey.compressed);
  final privateKey = CosmosSecp256K1PrivateKey.fromBytes(bip44.privateKey.raw);

  // 初始化提供者以与 Theta 测试网 Tendermint 节点交互
  final provider = TendermintProvider(TendermintHTTPProvider(
      url: "https://rpc.sentry-02.theta-testnet.polypore.xyz"));

  // 查询账户信息
  final accountInfo = await provider.request(TendermintRequestAbciQuery(
      request: QueryAccountInfoRequest(pubkey.toAddress())));

  // 查询最新区块信息
  final latestBlock = await provider.request(
      TendermintRequestAbciQuery(request: const GetLatestBlockRequest()));

  // 创建认证信息
  final authInfo = AuthInfo(
      signerInfos: [
        SignerInfo(
            publicKey: pubkey,
            modeInfo: const ModeInfo(ModeInfoSignle(SignMode.signModeDirect)),
            sequence: accountInfo.info.sequence)
      ],
      fee: Fee(amount: [
        Coin(
          denom: "uatom",
          amount: BigInt.from(1000),
        )
      ], gasLimit: BigInt.from(200000)));

  // 创建交易消息
  final message = MsgSend(
      fromAddress: pubkey.toAddress(),
      toAddress: CosmosBaseAddress("cosmos1qhslf0sx2fegltfqq0p5j6etmdznjgfnm2j6nc"),
      amount: [Coin(denom: "uatom", amount: BigInt.from(1000000))]);

  // 创建交易体
  final txbody = TXBody(messages: [message]);

  // 创建签名文档
  final signDoc = SignDoc(
      bodyBytes: txbody.toBuffer(),
      authInfoBytes: authInfo.toBuffer(),
      chainId: latestBlock.block!.header.chainId!,
      accountNumber: accountInfo.info.accountNumber);

  // 签名
  final sign = privateKey.sign(signDoc.toBuffer());

  // 创建原始交易
  final txRaw = TxRaw(
      bodyBytes: txbody.toBuffer(),
      authInfoBytes: authInfo.toBuffer(),
      signatures: [sign]);

  // 广播交易
  await provider.request(TendermintRequestBroadcastTxCommit(
      BytesUtils.toHexString(txRaw.toBuffer(), prefix: "0x")));
}

地址和密钥管理

该插件还支持 Secp256k1、ED25519 和 NIST P-256 密钥的管理和操作。

// 生成种子字节
final seedBytes = Bip39SeedGenerator(Mnemonic.fromString(
        "this dove indoor skin shed gap east welcome gift buffalo silent high"))
    .generate();

// 派生 BIP44 路径
final bip44 = Bip44.fromSeed(seedBytes, Bip44Coins.cosmos).deriveDefaultPath;

// 创建私钥和公钥
final privateKey = CosmosSecp256K1PrivateKey.fromBytes(bip44.privateKey.raw);
final pubkey = CosmosSecp256K1PublicKey.fromBytes(bip44.publicKey.compressed);
final cosmosAddress = pubkey.toAddress(hrp: "cosmos");

JSON-RPC 支持

支持通过 HTTP 提供程序与 Tendermint RPC 进行交互。

final provider = TendermintProvider(TendermintHTTPProvider(
    url: "https://rpc.sentry-02.theta-testnet.polypore.xyz"));

final accountInfo = await provider.request(TendermintRequestAbciQuery(
    request: QueryAccountInfoRequest(pubkey.toAddress())));

更多关于Flutter区块链交互插件cosmos_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter区块链交互插件cosmos_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于在Flutter中使用cosmos_sdk插件与区块链进行交互,以下是一个简要的代码示例,展示如何通过该插件连接到Cosmos区块链并执行一些基本操作。

首先,确保你的Flutter项目已经添加了cosmos_sdk依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  cosmos_sdk: ^最新版本号  # 请替换为当前可用的最新版本号

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

接下来,是一个简单的示例代码,展示如何配置客户端、查询账户余额以及发送交易。

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

void main() => runApp(MyApp());

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

class _MyAppState extends State<MyApp> {
  final String rpcUrl = 'https://your-cosmos-node-rpc-url'; // 替换为你的Cosmos节点RPC URL
  late Client client;
  String accountAddress = '';
  String accountBalance = '';

  @override
  void initState() {
    super.initState();
    // 初始化客户端
    client = Client(rpcUrl: rpcUrl);
    // 这里假设你已经有一个账户,并且私钥存储在privateKey变量中
    final String privateKey = 'your_private_key_here'; // 请替换为你的私钥
    final Wallet wallet = Wallet.fromPrivateKey(privateKey);
    // 设置账户地址(用于显示和交易)
    accountAddress = wallet.bech32Address;
    // 查询账户余额
    _queryAccountBalance(wallet.bech32Address);
  }

  Future<void> _queryAccountBalance(String address) async {
    try {
      final AuthAccountResponse account = await client.auth.account(address);
      setState(() {
        accountBalance = account.value?.coins?.first?.amount ?? '0';
      });
    } catch (e) {
      print('Error querying account balance: $e');
    }
  }

  Future<void> _sendTransaction() async {
    // 这里假设你要发送一些代币到另一个地址
    final String recipientAddress = 'recipient_address_here'; // 请替换为收款地址
    final String amountToSend = '1000000uatom'; // 发送的数量,注意单位(这里是uatom)
    final String password = 'your_password_here'; // 用于签名交易的密码(如果你的私钥被加密了)
    final Wallet wallet = Wallet.fromPrivateKey('your_private_key_here', password: password); // 如果私钥被加密,需要提供密码

    // 构建交易
    final StdTx stdTx = StdTx(
      msg: [
        MsgSend(
          fromAddress: wallet.bech32Address,
          toAddress: recipientAddress,
          amount: [
            Coin(denom: 'uatom', amount: amountToSend),
          ],
        ),
      ],
      fee: StdFee(
        amount: [
          Coin(denom: 'uatom', amount: '500uatom'), // 交易费
        ],
        gas: '200000', // 气体限制
      ),
      signatures: [],
      memo: 'Test transaction',
    );

    // 签名交易
    final StdSignDoc signDoc = StdSignDoc.fromTx(
      client.config.chainId,
      accountAddress,
      stdTx,
      client.config.accountPrefix,
    );
    final Signature signature = await wallet.sign(signDoc.bytesToSign());
    stdTx.signatures = [StdSignature(
      pubKey: wallet.publicKey,
      signature: signature,
      accountNumber: 0, // 这里通常需要从账户信息中获取,但为了简化示例,我们假设为0
      sequence: 0, // 同上,需要从账户信息中获取
    )];

    // 广播交易
    final BroadcastTxResponse response = await client.tx.broadcastSync(stdTx);
    print('Transaction response: $response');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Cosmos SDK Flutter Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Account Address: $accountAddress'),
              SizedBox(height: 16),
              Text('Account Balance: $accountBalance uatom'),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: _sendTransaction,
                child: Text('Send Transaction'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 示例代码中的私钥、密码、收款地址等敏感信息应在实际应用中妥善管理,避免硬编码。
  2. accountNumbersequence在真实交易中需要从账户信息中获取,这里为了简化示例而省略。
  3. 交易费用(fee)和气体限制(gas)应根据实际情况调整。
  4. cosmos_sdk插件的具体API可能会随着版本更新而变化,请参考最新的官方文档进行调整。

这个示例提供了一个基本的框架,展示了如何通过cosmos_sdk插件与Cosmos区块链进行交互。根据具体需求,你可以进一步扩展和修改代码。

回到顶部