Flutter恒星相关功能插件stellar_dart的使用

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

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

1 回复

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

注意事项:

  1. 密钥管理:在实际应用中,请确保安全地存储和管理密钥。上面的示例仅用于演示目的。
  2. Sequence号:在真实场景中,你需要从Stellar的Horizon服务器获取账户的当前sequence号。上面的示例中sequence号被硬编码为0,这在生产环境中会导致错误。
  3. 网络选择:根据你的需求选择使用公共网络(Network.PUBLIC)还是测试网络(Network.TESTNET)。
  4. 错误处理:示例代码中的错误处理较为简单,实际应用中应更全面地处理各种可能的异常情况。
  5. 提交交易:上面的示例中仅展示了如何构建和签名交易,实际提交交易需要处理服务器的响应和可能的错误。

这个示例提供了一个基础框架,你可以根据需要进行扩展和修改,以适应你的具体应用场景。

回到顶部