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

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

本项目是一个基于Flutter的插件包,它包含用于Android和/或iOS平台的特定平台实现代码。通过该插件包,你可以与区块链进行交互,特别是与Aleo网络进行交互。

开始使用

要开始使用此插件包,首先确保你已经设置好了Flutter开发环境。如果还没有设置,可以参考Flutter官方文档,那里提供了教程、示例、移动开发指导以及完整的API参考。

示例代码

以下是使用web3_rust_bridge_sdk的一个完整示例代码:

import 'dart:convert';

import 'package:convert/convert.dart';
import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:web3_rust_bridge_sdk/aleo/account.dart';
import 'package:web3_rust_bridge_sdk/aleo/delegate_transaction_data.dart';
import 'package:web3_rust_bridge_sdk/web3_rust_bridge_sdk.dart' as aleo;
import 'package:http/http.dart' as http;

import 'package:bip39_mnemonic/bip39_mnemonic.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await aleo.Web3RustBridgeSdk.initWeb3RustBridge();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final testMnemonic =
      "lesson maid remove boring swift floor produce crouch kangaroo action kick pole";
  String privateKey0 = "";
  String viewKey0 = "";
  String address0 = "";
  String recipient =
      "aleo1m8gqcxedmqfp2ylh8f96w6n3z7zw0ucahenq0symvxpqg0f8sugqd4we6f";

  String delegateDataText = "等待中";

  bool transferring = false;

  String error = "";

  [@override](/user/override)
  void initState() {
    genAddress(0);
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Aleo SDK'),
        ),
        body: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const Text(
                "助记词:",
                style: TextStyle(fontSize: 20),
              ),
              Text(
                testMnemonic,
                style: const TextStyle(fontSize: 20),
              ),
              const Divider(),
              titleContentRow('[私钥-0]', privateKey0),
              titleContentRow('[视图密钥-0]', viewKey0),
              titleContentRow('[地址-0]', address0),
              const Divider(),
              const Text(
                "公钥转账到",
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
              Text(
                recipient,
                style: const TextStyle(
                    fontWeight: FontWeight.bold, color: Colors.blue),
              ),
              const Divider(),
              const Text(
                "在转账过程中不要退出此屏幕,否则会导致转账失败,但你的资金将保持安全。",
                style: TextStyle(color: Colors.redAccent, fontSize: 12),
              ),
              FutureBuilder(
                  future: AleoAccount.getPublicAleoBalance(
                      "aleo19jjmsrusvuduyxgufd7ax24p2sp73eedx0agky7tzfa0su66wcgqlmqz4x"),
                  builder: (context, snapshot) {
                    return Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        if (snapshot.hasData)
                          Text(
                            "aleo19jjmsrusvuduyxgufd7ax24p2sp73eedx0agky7tzfa0su66wcgqlmqz4x的公共余额 = ${snapshot.data}",
                          ),
                      ],
                    );
                  }),
              Row(
                children: [
                  ElevatedButton(
                      onPressed: () {
                        generateDelegateData();
                      },
                      child: const Text("生成代理证明信息")),
                  const SizedBox(
                    width: 10,
                  ),
                  ElevatedButton(
                      onPressed: () {
                        sendDelegateProof();
                      },
                      child: const Text("提交代理转账")),
                ],
              ),
              if (transferring) const LinearProgressIndicator(),
              Text("日志 = $delegateDataText"),
              if (error.isNotEmpty) Text("错误 = $error"),
            ],
          ),
        ),
      ),
    );
  }

  void genAddress(int index) async {
    final seed0 = seedFromDerivePath(index);
    privateKey0 = aleo.privateKeyFromSeed(seed: seed0);
    viewKey0 = aleo.privateKeyToViewKey(privateKey: privateKey0);
    address0 = aleo.privateKeyToAddress(privateKey: privateKey0);
    setState(() {});
  }

  Uint8List seedFromDerivePath(int index) {
    /// aleo hd账户派生路径 m/44'/0'/<account_index>'/0' 且默认 account_index = 0

    final path = "m/44'/0'/$index'/0'";
    final m = Mnemonic.fromSentence(testMnemonic, Language.english);
    final seedHex = hex.encode(m.seed);
    final keys = aleo.deriveAleoPath(path, seedHex);
    return keys.key!;
  }

  Widget titleContentRow(String title, String content) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text("$title : "),
        Expanded(child: Text(content)),
      ],
    );
  }

  void generateDelegateData() async {
    setState(() {
      transferring = true;
      delegateDataText = "等待中";
    });

    await Future.delayed(const Duration(seconds: 1), () async {
      try {
        delegateDataText = (await aleo.AleoAccount.generatePublicTransfer(
          privateKey: privateKey0,
          recipient: recipient,
          amount: 0.10,
          fee: 0.28,
        ))
            .toString();
      } catch (e) {
        error = e.toString();
      }
    });

    setState(() {
      transferring = false;
    });
  }

  Future<void> sendDelegateProof() async {
    setState(() {
      delegateDataText = "广播中";
      transferring = true;
    });
    AleoDelegateTransferData data =
        await AleoAccount.generatePublicTransfer(
      privateKey: privateKey0,
      recipient:
          'aleo19jjmsrusvuduyxgufd7ax24p2sp73eedx0agky7tzfa0su66wcgqlmqz4x',
      amount: 0.01,
    );

    print("wtf data = ${data.authorization}");
    print("wtf data = ${data.feeAuthorization}");
    print("wtf data = ${data.program}");

    var url = Uri.https('testnet3.aleorpc.com');
    var response = await http.post(url,
        headers: {'Content-Type': 'application/json'},
        body: jsonEncode({
          'jsonrpc': '2.0',
          'id': 1,
          'method': 'generateTransaction',
          'function': "transfer_public",
          'broadcast': true,
          'imports': {},
          'params': {
            'authorization': data.authorization,
            'fee_authorization': data.feeAuthorization,
            'program': data.program,
          }
        }));
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');

    setState(() {
      delegateDataText = response.body.toString();
      transferring = false;
    });
  }
}

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

1 回复

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


web3_rust_bridge_sdk 是一个用于在 Flutter 应用中与区块链进行交互的插件。它通过 Rust 编写的高性能桥接代码与 Flutter 进行通信,提供了对以太坊区块链的操作能力。以下是如何使用 web3_rust_bridge_sdk 的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 web3_rust_bridge_sdk 依赖:

dependencies:
  flutter:
    sdk: flutter
  web3_rust_bridge_sdk: ^1.0.0  # 请使用最新版本

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

2. 初始化 SDK

在你的 Flutter 应用中,首先需要初始化 web3_rust_bridge_sdk。通常在 main.dart 中进行初始化:

import 'package:web3_rust_bridge_sdk/web3_rust_bridge_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SDK
  await Web3RustBridgeSdk.init();
  
  runApp(MyApp());
}

3. 连接到以太坊节点

你可以通过 web3_rust_bridge_sdk 连接到以太坊节点,例如 Infura 或本地节点:

import 'package:web3_rust_bridge_sdk/web3_rust_bridge_sdk.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Web3 Rust Bridge SDK Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 连接以太坊节点
              final web3 = Web3RustBridgeSdk.connect('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
              
              // 获取当前区块号
              final blockNumber = await web3.getBlockNumber();
              print('Current block number: $blockNumber');
            },
            child: Text('Connect to Ethereum'),
          ),
        ),
      ),
    );
  }
}

4. 与智能合约交互

你可以使用 web3_rust_bridge_sdk 与部署在以太坊上的智能合约进行交互。首先,你需要获取智能合约的 ABI 和地址,然后创建一个合约实例:

import 'package:web3_rust_bridge_sdk/web3_rust_bridge_sdk.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Web3 Rust Bridge SDK Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 连接以太坊节点
              final web3 = Web3RustBridgeSdk.connect('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
              
              // 智能合约地址和 ABI
              final contractAddress = '0xYourContractAddress';
              final contractAbi = '[{"constant":true,"inputs":[],"name":"getValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]';
              
              // 创建合约实例
              final contract = web3.getContract(contractAbi, contractAddress);
              
              // 调用智能合约方法
              final result = await contract.call('getValue');
              print('Contract value: $result');
            },
            child: Text('Interact with Smart Contract'),
          ),
        ),
      ),
    );
  }
}

5. 发送交易

你还可以使用 web3_rust_bridge_sdk 发送交易到以太坊网络。你需要提供发送者的私钥和目标地址:

import 'package:web3_rust_bridge_sdk/web3_rust_bridge_sdk.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Web3 Rust Bridge SDK Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 连接以太坊节点
              final web3 = Web3RustBridgeSdk.connect('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
              
              // 发送者的私钥和目标地址
              final privateKey = '0xYourPrivateKey';
              final toAddress = '0xRecipientAddress';
              
              // 创建交易
              final transaction = Transaction(
                to: toAddress,
                value: BigInt.from(1000000000000000000), // 1 ETH
                gasPrice: BigInt.from(20000000000),
                gasLimit: BigInt.from(21000),
                nonce: await web3.getTransactionCount('0xYourAddress'),
              );
              
              // 签名并发送交易
              final signedTx = await web3.signTransaction(transaction, privateKey);
              final txHash = await web3.sendRawTransaction(signedTx);
              print('Transaction hash: $txHash');
            },
            child: Text('Send Transaction'),
          ),
        ),
      ),
    );
  }
}

6. 处理错误和异常

在实际应用中,处理错误和异常是非常重要的。你可以使用 try-catch 块来捕获和处理可能发生的错误:

try {
  final result = await contract.call('getValue');
  print('Contract value: $result');
} catch (e) {
  print('Error: $e');
}
回到顶部