Flutter区块链交互插件cosmos_sdk的使用
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
更多关于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'),
),
],
),
),
),
);
}
}
注意:
- 示例代码中的私钥、密码、收款地址等敏感信息应在实际应用中妥善管理,避免硬编码。
accountNumber
和sequence
在真实交易中需要从账户信息中获取,这里为了简化示例而省略。- 交易费用(
fee
)和气体限制(gas
)应根据实际情况调整。 cosmos_sdk
插件的具体API可能会随着版本更新而变化,请参考最新的官方文档进行调整。
这个示例提供了一个基本的框架,展示了如何通过cosmos_sdk
插件与Cosmos区块链进行交互。根据具体需求,你可以进一步扩展和修改代码。