Flutter恒星相关功能插件stellar_dart的使用
Flutter恒星相关功能插件stellar_dart的使用
Stellar Dart 是一个为与 Stellar 网络无缝集成而设计的强大包,特别适用于希望轻松创建、签名和发送交易的开发者。它提供了对 Stellar 交易模型的强大支持,包括原生资产转移和智能合约交互。
Stellar Dart 被设计用于与各种 Stellar 钱包类型和功能进行交互,确保在 Stellar 生态系统内高效通信和事务管理。它支持账户操作、资产管理,并且可以轻松实现多签名交易。
通过 Stellar Dart,开发者可以利用先进的加密能力来确保交易的签名和验证的安全性,从而增强其操作的完整性和安全性。无论是执行交易、查询账户余额还是与 Stellar 智能合约交互,Stellar Dart 提供了全面的工具包来高效处理多种数据格式和加密操作。
为了充分利用 Stellar Dart 的优势,建议对 Stellar 网络及其 API 交互有深入理解。Stellar Dart 简化了复杂的任务,使其成为探索 Stellar 生态系统的开发者的必备资源。
Futures
交易管理
- 创建、签名和验证交易(使用 ED25519)
提供者
- 与 Horizon 和 Soroban API 进行通信
操作
- 支持所有 Stellar 操作,包括支付、路径支付、创建账户和管理数据
合约
- 支持部署和与 Soroban 智能合约交互
示例
发送资产
/// 初始化 StellarProvider 使用指定的测试网 URL。
final rpc = StellarProvider(StellarHTTPProvider(
url: "https://horizon-testnet.stellar.org",
soroban: "https://soroban-testnet.stellar.org"));
/// 从十六进制字符串创建 StellarPrivateKey 实例。
final privateKey = StellarPrivateKey.fromHex(
"7dea550a78dd0f6afa98342a0e288e1d0b6bddd38d7a6fe17d9501a0524c3f23");
/// 将私钥转换为公钥,然后转换为地址。
final source = privateKey.toPublicKey().toAddress();
/// 请求 Stellar 网络中源地址的账户详情。
final account = await rpc.request(HorizonRequestAccount(source.baseAddress));
/// 从 base32 编码地址创建 StellarAddress 实例作为目标。
final destination = StellarAddress.fromBase32Addr(
"GCMQXZLBPVE76N2B6GVP6VWUWVD3P622EJPG3644PGO25AKYNK3H5IAM");
/// 设置交易的最大时间为现在起 30 秒后。
final maxTime =
DateTime.now().add(const Duration(seconds: 30)).millisecondsSinceEpoch ~/ 1000;
/// 创建用于交易的 PaymentOperation。
final operation = PaymentOperation(
asset: StellarAssetCreditAlphanum4(
issuer: StellarAddress.fromBase32Addr(
"GB726ND2YG4TR772WY4767M56RNSN3PHP4MV2ITQVCDM2LSMMVT7CD6O")
.toPublicKey(),
code: "MRT"),
amount: StellarHelper.toStroop("12"),
destination: destination.toMuxedAccount());
/// 创建 StellarTransactionV1 实例,指定参数。
StellarTransactionV1 transaction = StellarTransactionV1(
sourceAccount: source.toMuxedAccount(),
fee: StellarHelper.toStroop("0.001").toInt(),
seqNum: account.sequence + BigInt.one,
cond: PrecondTime(
TimeBounds(minTime: BigInt.zero, maxTime: BigInt.from(maxTime))),
operations: [Operation(body: operation)]);
/// 创建使用网络 ID 和交易的 TransactionSignaturePayload。
TransactionSignaturePayload payload = TransactionSignaturePayload(
networkId: StellarNetwork.testnet.passphraseHash,
taggedTransaction: transaction);
/// 使用私钥对交易进行签名。
final signature = privateKey.sign(payload.txHash());
/// 创建封装交易及其签名的 TransactionV1Envelope。
TransactionV1Envelope envelope =
TransactionV1Envelope(tx: transaction, signatures: [signature]);
/// 将交易提交到 Stellar 网络。
await rpc
.request(HorizonRequestSubmitTransaction(envelope.toVariantXDRBase64()));
Horizon 和 Soroban 提供者
class StellarHTTPProvider implements StellarServiceProvider {
@override
Future<HorizonServiceResponse> get(StellarRequestDetails params,
[Duration? timeout]) async {
/// see example file
}
@override
Future<HorizonServiceResponse> post(StellarRequestDetails params,
[Duration? timeout]) async {
/// see example file
}
}
final providr = StellarProvider(StellarHTTPProvider(
url: "https://horizon-testnet.stellar.org",
soroban: "https://soroban-testnet.stellar.org"));
final account = await providr.request(const HorizonRequestAccount(
"GCMQXZLBPVE76N2B6GVP6VWUWVD3P622EJPG3644PGO25AKYNK3H5IAM"));
final fee = await providr.request(const HorizonRequestFeeStats());
/// ...
/// Soroban 请求
final simulateTx =
await providr.request(const SorobanRequestSimulateTransaction(tx: tx));
//// ...
地址和密钥管理
/// 定义用于生成种子的助记词短语。
const String passphrase = "MRTNETWORK";
/// 使用 Bip39MnemonicGenerator 生成 12 个单词的助记词。
final mnemonic =
Bip39MnemonicGenerator().fromWordsNumber(Bip39WordsNum.wordsNum12);
/// 使用助记词和助记词短语生成种子。
final seed = Bip39SeedGenerator(mnemonic).generate(passphrase);
/// 使用 Bip44 从生成的种子派生主钱包,针对 Stellar 币种。
final masterWallet =
Bip44.fromSeed(seed, Bip44Coins.stellar).deriveDefaultPath;
/// 从主钱包提取私钥。
final privateKey = StellarPrivateKey.fromBytes(masterWallet.privateKey.raw);
/// 从私钥派生公钥。
final publicKey = privateKey.toPublicKey();
/// 将公钥转换为 Stellar 地址。
final address = publicKey.toAddress();
/// 将地址转换为具有 ID 10 的混杂地址。
final muxedAddress = address.toMuxedAddress(BigInt.from(10));
更多关于Flutter恒星相关功能插件stellar_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter恒星相关功能插件stellar_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于在Flutter中使用stellar_dart
库来实现与恒星(Stellar)区块链相关的功能,下面是一个简单的代码示例,展示了如何使用该库进行基本的账户创建、密钥对生成和签名交易。
首先,确保你已经在pubspec.yaml
文件中添加了stellar_dart
依赖:
dependencies:
flutter:
sdk: flutter
stellar_dart: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,我们可以编写一个Flutter应用来演示如何使用stellar_dart
。
import 'package:flutter/material.dart';
import 'package:stellar_dart/stellar_dart.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
KeyPair? _keyPair;
String _accountId = '';
@override
void initState() {
super.initState();
_generateKeyPair();
}
void _generateKeyPair() {
// 生成密钥对
_keyPair = KeyPair.random();
setState(() {
_accountId = _keyPair!.accountId;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Stellar Dart Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Account ID:', style: TextStyle(fontSize: 18)),
Text(_accountId, style: TextStyle(fontSize: 16)),
SizedBox(height: 20),
ElevatedButton(
onPressed: _createAndSignTransaction,
child: Text('Create and Sign Transaction'),
),
],
),
),
),
);
}
Future<void> _createAndSignTransaction() async {
if (_keyPair == null) return;
// 设置网络(公共网络或测试网络)
final network = Network.TESTNET;
// 创建客户端
final client = Client(network: network);
// 假设我们有一个目标账户接收XLM
final destinationAccountId = 'GAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
// 创建交易构建器
final transactionBuilder = TransactionBuilder(
fee: 100,
sequence: 0, // 注意:实际使用中需要从服务器获取当前sequence号
sourceAccount: Account(_keyPair!.accountId, _keyPair!.secretSeed),
)
.addOperation(
PaymentOperationBuilder(
destination: destinationAccountId,
asset: Asset.native(),
amount: '1000', // 发送1000 stroops (1 XLM = 1,000,000 stroops)
).build(),
);
// 构建交易
final transaction = transactionBuilder.build().sign(_keyPair!.secretSeed);
// 提交交易(这里仅展示构建和签名,实际提交需要处理响应和错误)
try {
final response = await client.submitTransaction(transaction);
print('Transaction successful: ${response.resultXDR}');
} catch (e) {
print('Transaction failed: $e');
}
}
}
注意事项:
- 密钥管理:在实际应用中,请确保安全地存储和管理密钥。上面的示例仅用于演示目的。
- Sequence号:在真实场景中,你需要从Stellar的Horizon服务器获取账户的当前sequence号。上面的示例中sequence号被硬编码为0,这在生产环境中会导致错误。
- 网络选择:根据你的需求选择使用公共网络(
Network.PUBLIC
)还是测试网络(Network.TESTNET
)。 - 错误处理:示例代码中的错误处理较为简单,实际应用中应更全面地处理各种可能的异常情况。
- 提交交易:上面的示例中仅展示了如何构建和签名交易,实际提交交易需要处理服务器的响应和可能的错误。
这个示例提供了一个基础框架,你可以根据需要进行扩展和修改,以适应你的具体应用场景。