Flutter Solana区块链交互插件solana的使用

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

Flutter Solana区块链交互插件solana的使用

概述

solana 是一个用于与 Solana 区块链进行交互的 Dart 库。它实现了 Solana 的 JSON RPC API、订阅客户端以及多个核心程序(如 System Program、Token Program 等)。此外,它还支持密钥生成、导入和交易处理等功能。

主要功能

  • JSON RPC API 完整实现:支持所有 Solana JSON RPC 方法。
  • 订阅客户端:使用 JSON RPC 订阅变体的 API 实现。
  • 核心程序实现
    • System Program
    • Token Program
    • Memo Program
    • Stake Program
    • Associated Token Account Program
  • 密钥生成和导入
    • 使用 Hierarchical Deterministic (HD) 衍生路径生成密钥。
    • 使用 BIP39 种子短语导入密钥。
    • 使用原始私钥字节导入密钥。
  • 交易处理
    • 交易编码和签名。
    • 构建和签署离线交易。
    • 提供方便的方法来签署和发送交易。
    • 监听给定签名的状态变化,等待交易确认或最终化。
  • Metaplex NFT 元数据解码

添加其他程序

如果需要添加其他程序,可以通过实现其指令和有时需要的额外方法来完成。通常的做法是在 programs 目录下创建一个子目录,并包含两个文件:

  • ${program_name}_program.dart:包含构建消息的工厂构造函数。
  • ${program_name}_instructions.dart:包含单个指令的工厂构造函数。

如果有需要,可以包含额外的文件来分离代码。

更新 RPC 客户端

如果发现 RPC 客户端缺少某些方法或方法已过时,可以提交一个 Pull Request 来更新它。对于删除操作,直接删除即可。对于添加操作,需要在 client.dart 中添加方法定义并重建包。参数和响应类型可以在 dto 目录中定义。

贡献

欢迎所有贡献,无论大小。如果您想帮助,请提交一个 Pull Request。

进一步的帮助和文档

测试

运行测试需要安装 Solana 工具套件,并启动测试验证器:

solana-test-validator

也可以使用 solanalabs/solana Docker 镜像。

发布新版本(维护者)

  • 使用 常规提交
  • 运行 melos version 创建新的提交和自动更改日志。通过 PR 将提交和标签推送到仓库。

示例代码

以下是一个简单的示例,展示如何使用 solana 插件与 Solana 区块链进行交互。

1. 添加依赖

pubspec.yaml 文件中添加 solana 依赖:

dependencies:
  flutter:
    sdk: flutter
  solana: ^1.0.0

2. 导入库

在 Dart 文件中导入 solana 库:

import 'package:solana/solana.dart';

3. 创建 Solana 客户端

void main() async {
  // 创建 Solana 客户端
  final client = SolanaClient(
    rpcUrl: 'https://api.mainnet-beta.solana.com',
    websocketUrl: 'wss://api.mainnet-beta.solana.com/',
  );

  // 获取最新区块高度
  final latestBlockHeight = await client.rpcClient.getBlockHeight();
  print('Latest Block Height: $latestBlockHeight');
}

4. 生成和导入密钥

void main() async {
  // 创建 Solana 客户端
  final client = SolanaClient(
    rpcUrl: 'https://api.mainnet-beta.solana.com',
    websocketUrl: 'wss://api.mainnet-beta.solana.com/',
  );

  // 生成新密钥对
  final keyPair = Ed25519HDKeyPair.random();
  print('Public Key: ${keyPair.publicKey}');
  print('Private Key: ${keyPair.secretKey}');

  // 使用 BIP39 种子短语导入密钥
  final mnemonic = 'your bip39 mnemonic phrase';
  final seed = Bip39.encodeToSeed(mnemonic);
  final importedKeyPair = Ed25519HDKeyPair.fromSeed(seed);
  print('Imported Public Key: ${importedKeyPair.publicKey}');
}

5. 发送交易

void main() async {
  // 创建 Solana 客户端
  final client = SolanaClient(
    rpcUrl: 'https://api.mainnet-beta.solana.com',
    websocketUrl: 'wss://api.mainnet-beta.solana.com/',
  );

  // 生成新密钥对
  final keyPair = Ed25519HDKeyPair.random();

  // 创建交易
  final transaction = Transaction(
    recentBlockhash: (await client.rpcClient.getRecentBlockhash()).value.blockhash,
    feePayer: keyPair.publicKey,
    instructions: [
      SystemProgram.transfer(
        from: keyPair.publicKey,
        to: PublicKey.fromBase58('recipientPublicKey'),
        lamports: 1000000, // 1 SOL = 1,000,000,000 lamports
      ),
    ],
  );

  // 签署交易
  final signedTransaction = transaction.sign([keyPair]);

  // 发送交易
  final signature = await client.rpcClient.sendTransaction(signedTransaction);
  print('Transaction Signature: $signature');

  // 等待交易确认
  await client.websocketClient.waitForSignatureStatusChanges(
    signature: signature,
    status: const ConfirmedSignatureStatus(confirmed: true),
  );
  print('Transaction Confirmed');
}

以上示例展示了如何使用 solana 插件与 Solana 区块链进行基本的交互,包括创建客户端、生成和导入密钥、创建和发送交易等。希望这些示例能帮助你更好地理解和使用 solana 插件。


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

1 回复

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


当然,以下是一个关于如何在Flutter应用中与Solana区块链交互的示例代码。这个示例将展示如何使用solana-flutter-sdk插件来进行基本的区块链操作,比如获取Solana钱包地址和签名交易。

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

dependencies:
  flutter:
    sdk: flutter
  solana_flutter_sdk: ^最新版本号  # 请替换为实际的最新版本号

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

接下来,是一个简单的Flutter应用示例,它展示了如何使用Solana插件:

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

void main() {
  runApp(MyApp());
}

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

class _MyAppState extends State<MyApp> {
  String? walletAddress;

  @override
  void initState() {
    super.initState();
    // 初始化Solana客户端(这里以测试网为例)
    final solanaClient = SolanaClient(
      rpcUrl: 'https://api.devnet.solana.com',
      wsUrl: 'wss://api.devnet.solana.com/ws',
    );

    // 生成一个新的钱包地址(这里仅作为示例,实际应用中应从安全的密钥管理中获取私钥)
    final keypair = Keypair.random();
    setState(() {
      walletAddress = keypair.publicKey.toBase58();
    });

    // 示例:签名交易(这里仅作为展示,实际交易需要更多的步骤和安全性考虑)
    Future.delayed(Duration.zero, () async {
      try {
        // 假设我们要向某个地址发送SOL,这里需要构建一个交易
        final recipientPublicKey = PublicKey.fromBase58('目标地址的Base58编码');
        final lamports = Solana.lamportsFromSol(0.001); // 发送0.001 SOL

        // 创建交易指令
        final transactionInstruction = TransactionInstruction.systemTransfer(
          fromPubkey: keypair.publicKey,
          toPubkey: recipientPublicKey,
          lamports: lamports,
        );

        // 创建交易
        final transaction = Transaction.builder(feePayer: keypair.publicKey)
          ..addSignature(keypair.sign(transactionInstruction.hash))
          ..addInstruction(transactionInstruction);

        // 序列化交易并发送到网络(这里省略了实际发送步骤,仅展示签名)
        final serializedTransaction = transaction.serialize();
        print('Serialized Transaction: $serializedTransaction');

        // 签名交易
        final signedTransaction = await solanaClient.signTransaction(
          transaction: serializedTransaction,
          keypair: keypair,
        );

        print('Signed Transaction: $signedTransaction');
        // 注意:这里signedTransaction需要通过网络发送以完成交易,这通常涉及更多步骤,如广播交易到区块链网络。

      } catch (e) {
        print('Error: $e');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Solana Flutter Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Your Wallet Address:'),
              Text(walletAddress ?? 'Loading...'),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 安全性:在实际应用中,私钥的管理和存储是非常重要的。上述示例中,私钥是在客户端生成的,这是不安全的。实际应用中,私钥应该在安全的密钥管理服务中生成和管理。

  2. 交易构建:上述示例中仅展示了如何构建和签名一个系统转账交易指令。在实际应用中,交易构建会更加复杂,可能涉及多个指令、多个签名者等。

  3. 发送交易:示例中省略了将签名后的交易发送到Solana网络的步骤。在实际应用中,你需要使用Solana客户端的API将交易广播到网络。

  4. 错误处理:示例中的错误处理非常基础。在实际应用中,你需要更完善的错误处理和用户反馈机制。

  5. 依赖版本:确保你使用的是solana_flutter_sdk的最新稳定版本。

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

回到顶部