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

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

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

dart_web3 是一个用于与以太坊区块链进行交互的Dart库。它可以通过连接到以太坊节点来发送交易、与智能合约互动等。以下是关于如何使用 dart_web3 的详细介绍和完整示例。

功能特性

  • 通过RPC API连接到以太坊节点并调用常用方法
  • 发送已签名的以太坊交易
  • 生成私钥,设置新的以太坊地址
  • 调用智能合约函数并监听合约事件
  • 基于智能合约ABI生成代码以简化交互

使用说明

1. 凭据和钱包 (Credentials and Wallets)

要发送以太坊网络上的交易,需要一些凭据。dart_web3 支持从私钥和V3钱包文件中获取凭据。

从私钥创建凭据
import 'dart:math'; // 用于随机数生成器
import 'package:dart_web3/dart_web3.dart';

// 从十六进制私钥创建凭据
Credentials fromHex = EthPrivateKey.fromHex("c87509a[...]dc0d3");

// 或者随机生成一个新的私钥
var rng = Random.secure();
Credentials random = EthPrivateKey.createRandom(rng);

// 无论哪种方式,都可以从私钥中派生出公钥和地址
var address = await credentials.extractAddress();
print(address.hex);
从钱包文件获取凭据
import 'dart:io';
import 'package:dart_web3/dart_web3.dart';

// 读取钱包文件内容
String content = File("wallet.json").readAsStringSync();
Wallet wallet = Wallet.fromJson(content, "testpassword");

// 解锁钱包并获取凭据
Credentials unlocked = wallet.privateKey;
// 现在可以使用这些凭据来签名交易或消息
创建新的钱包文件
// 创建新的钱包文件
Wallet wallet = Wallet.createNew(credentials, "password", random);
print(wallet.toJson());
2. 连接到RPC服务器 (Connecting to an RPC server)

dart_web3 不会自己将已签名的交易发送给矿工,而是依赖于RPC客户端来完成这一操作。你可以使用公共RPC API(如Infura),或者自己搭建一个RPC服务器(如Geth),也可以使用私有测试网(如Truffle和Ganache)。

import 'package:http/http.dart'; // 你也可以导入浏览器版本
import 'package:dart_web3/dart_web3.dart';

// 替换为你的API URL
var apiUrl = "http://localhost:7545"; 

var httpClient = Client();
var ethClient = Web3Client(apiUrl, httpClient);

// 从私钥中获取凭据
var credentials = ethClient.credentialsFromPrivateKey("0x...");

// 查询账户余额
EtherAmount balance = await ethClient.getBalance(credentials.address);
print(balance.getValueInUnit(EtherUnit.ether));
3. 发送交易 (Sending transactions)

dart_web3 支持创建、签名和发送以太坊交易。

import 'package:dart_web3/dart_web3.dart';

// 替换为你的API URL和客户端
var ethClient = Web3Client(apiUrl, httpClient);

// 从私钥中获取凭据
var credentials = ethClient.credentialsFromPrivateKey("0x...");

// 发送交易
await ethClient.sendTransaction(
  credentials,
  Transaction(
    to: EthereumAddress.fromHex('0xC91...3706'),
    gasPrice: EtherAmount.inWei(BigInt.one),
    maxGas: 100000,
    value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1),
  ),
);

如果只需要已签名的交易而不打算发送,可以使用 client.signTransaction

4. 智能合约 (Smart contracts)

dart_web3 可以解析智能合约的ABI,并与之交互。它还可以监听智能合约发出的事件。有关详细示例,请参阅 contracts.dart

5. Dart代码生成器 (Dart Code Generator)

通过使用Dart的构建系统,dart_web3 可以为智能合约生成Dart代码。将智能合约的ABI JSON文件放在 lib/ 目录下,文件名必须以 .abi.json 结尾。然后添加 build_runner 作为开发依赖,并运行以下命令:

pub run build_runner build

生成的代码将包含在 .g.dart 文件中,方便与合约交互。

6. 忽略生成文件的命名建议 (Optional: Ignore naming suggestions for generated files)

如果导入的智能合约ABI包含不符合Dart命名规范的函数名,Dart分析器会显示警告。可以通过排除所有生成的文件来避免这些问题。在项目根目录下创建一个 analysis_options.yaml 文件:

analyzer:
  exclude: 
    - '**/*.g.dart'

完整示例代码

以下是一个完整的示例代码,展示了如何使用 dart_web3 连接到本地Ganache节点,查询余额并发送交易。

import 'package:dart_web3/dart_web3.dart';
import 'package:http/http.dart';

const String privateKey =
    'a2fd51b96dc55aeb14b30d55a6b3121c7b9c599500c1beb92a389c3377adc86e';
const String rpcUrl = 'http://localhost:7545';

Future<void> main() async {
  // 创建一个客户端用于发送交易
  final client = Web3Client(rpcUrl, Client());

  // 从私钥中获取凭据
  final credentials = EthPrivateKey.fromHex(privateKey);
  final address = credentials.address;

  // 打印EIP-55格式的地址
  print(address.hexEip55);

  // 查询账户余额
  EtherAmount balance = await client.getBalance(address);
  print(await balance.getValueInUnit(EtherUnit.ether));

  // 发送交易
  await client.sendTransaction(
    credentials,
    Transaction(
      to: EthereumAddress.fromHex('0xC914Bb2ba888e3367bcecEb5C2d99DF7C7423706'),
      gasPrice: EtherAmount.inWei(BigInt.one),
      maxGas: 100000,
      value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1),
    ),
  );

  // 释放资源
  await client.dispose();
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用dart_web3插件与区块链进行交互的示例代码。这个示例将展示如何连接到以太坊区块链,获取账户余额,以及发送一个简单的交易。

首先,确保你已经在pubspec.yaml文件中添加了dart_web3依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_web3: ^0.x.x  # 请检查最新版本号并替换

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

接下来,创建一个Flutter项目,并在lib目录下创建一个新的Dart文件,例如main.dart。在这个文件中,我们将编写与区块链交互的代码。

import 'package:flutter/material.dart';
import 'package:dart_web3/dart_web3.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

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

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

class _MyAppState extends State<MyApp> {
  String accountBalance = 'Loading...';
  String transactionHash = '';

  @override
  void initState() {
    super.initState();
    _connectToBlockchain();
  }

  Future<void> _connectToBlockchain() async {
    // 使用Infura节点作为以太坊节点(你需要自己的Infura项目ID)
    String infuraUrl = 'https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID';

    // 创建一个Web3Client实例
    var client = Web3Client(infuraUrl, http.Client());

    // 假设你有一个私钥
    String privateKey = 'YOUR_PRIVATE_KEY';

    // 创建Credentials对象
    var credentials = EthPrivateKey.fromHex(privateKey);

    // 获取账户地址
    var address = credentials.address;

    // 获取账户余额
    var balance = await client.getBalance(address);
    setState(() {
      accountBalance = 'Balance: ${balance / 1e18} ETH';
    });

    // 发送交易(这里仅作为示例,实际发送交易需要更多的步骤和安全性考虑)
    // 假设你要向另一个地址发送0.01 ETH
    String toAddress = 'RECIPIENT_ADDRESS';
    BigInt amount = BigInt.from(1e16); // 0.01 ETH in Wei
    BigInt gasPrice = BigInt.from(50 * 1e9); // 50 Gwei
    BigInt gasLimit = BigInt.from(21000); // Basic gas limit for a simple transfer

    var transactionReceipt = await client.sendTransaction(
      credentials,
      Transaction(
        to: toAddress,
        value: amount,
        gasPrice: gasPrice,
        gasLimit: gasLimit,
      ),
    );

    setState(() {
      transactionHash = transactionReceipt.transactionHash;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Blockchain Interaction'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(accountBalance),
              SizedBox(height: 20),
              Text(transactionHash.isEmpty ? 'No transaction sent yet.' : 'Transaction Hash: $transactionHash'),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 私钥和地址:在实际应用中,永远不要在客户端代码中硬编码私钥。这只是一个示例。在实际应用中,你应该使用安全的密钥管理方式,如硬件钱包或安全的密钥管理服务。

  2. Infura节点:你需要注册一个Infura账户并获取一个项目ID来使用他们的以太坊节点服务。

  3. 交易费用:发送交易时,你需要确保有足够的以太币来支付交易费用(gas)。

  4. 安全性:在实际应用中,发送交易通常需要用户确认,并且应该在一个安全的环境中进行。

  5. 依赖版本:确保你使用的是dart_web3的最新版本,并查阅其文档以获取最新的API和用法。

这个示例代码展示了如何使用dart_web3插件在Flutter应用中与以太坊区块链进行基本的交互。根据具体需求,你可能需要扩展和修改这个示例。

回到顶部