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

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

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

web3dart_macaron 是一个用于与以太坊区块链进行交互的Dart库。它连接到以太坊节点,发送交易,与智能合约互动等。

特性

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

TODO

  • 编码所有受支持的Solidity类型,虽然目前不支持(u)fixed,这些类型并不常用。

使用

凭证和钱包

为了在以太坊网络上发送交易,需要一些凭证。该库支持原始私钥和v3钱包文件。

import 'dart:math'; // 用于随机数生成器

import 'package:web3dart_macaron/web3dart.dart';

// 可以从私钥创建凭证
Credentials fromHex = EthPrivateKey.fromHex("c87509a[...]dc0d3");

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

// 不论哪种方式,库都可以从私钥派生出公钥和地址:
var address = await credentials.extractAddress();
print(address.hex);

另一种获得库使用的凭证(用于签名交易)的方法是使用钱包文件。钱包文件安全地存储私钥,并需要密码解锁。该库对版本3的钱包文件有实验性支持,这些钱包文件通常由其他以太坊客户端生成:

import 'dart:io';
import 'package:web3dart_macaron/web3dart.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());

你可以将wallet.toJson()写入文件,稍后可以用它打开 MyEtherWallet(选择Keystore / JSON文件)或其他以太坊客户端如geth。

自定义凭证

如果你想将web3dart与其它钱包提供商集成,可以实现Credentials并覆盖适当的方法。

连接到RPC服务器

该库不会自行将已签名的交易发送给矿工。相反,它依赖于RPC客户端来执行此操作。你可以使用公共RPC API如 Infura,或者设置自己的使用geth,如果你只是想测试,可以使用truffle和ganache的私人测试网。所有这些选项都会为你提供一个RPC端点,该库可以连接到该端点。

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

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

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

var credentials = ethClient.credentialsFromPrivateKey("0x...");

// 现在可以调用RPC方法。这将查询你拥有的以太币数量
EtherAmount balance = ethClient.getBalance(credentials.address);
print(balance.getValueInUnit(EtherUnit.ether));

发送交易

当然,该库支持创建、签名和发送以太坊交易:

import 'package:web3dart_macaron/web3dart.dart';

/// [...], 需要指定URL和客户端,见上面的例子
var ethClient = Web3Client(apiUrl, httpClient);

var credentials = ethClient.credentialsFromPrivateKey("0x...");

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

如果缺少数据,比如gas价格、发送方和事务nonce,当未明确指定时,将从连接的节点获取。

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

智能合约

该库可以解析智能合约的ABI并发送数据到它。它还可以监听智能合约发出的事件。有关示例,请参阅 this file

Dart代码生成器

通过使用Dart的构建系统,web3dart可以生成Dart代码以便于访问智能合约。

要使用此功能,请将合约ABI JSON放在lib/目录下的某个位置。文件名必须以.abi.json结尾。然后,添加对build_runner包的dev_dependency,并运行

pub run build_runner build

现在你会找到一个包含与合约交互的代码的.g.dart文件。

可选:忽略生成文件的命名建议

如果导入的合约ABIs具有不符合dart命名约定的函数名,dart分析器会默认对此显示警告。可以通过排除所有生成的文件来缓解这种情况。

创建一个名为analysis_options.yaml的文件放在项目的根目录下:

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

有关高级选项,请参阅自定义静态分析

功能请求和错误报告

请在问题跟踪器中提交功能请求和错误报告。如果您希望为该库做出贡献,请提交拉取请求。


完整示例代码

以下是完整的示例代码,演示如何使用 web3dart_macaron 插件进行基本的区块链交互。

import 'package:http/http.dart';
import 'package:web3dart_macaron/web3dart.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;

  print(address.hexEip55);
  print(await client.getBalance(address));

  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区块链交互插件web3dart_macaron的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是如何在Flutter项目中使用web3dart_macaron插件与区块链进行交互的代码示例。web3dart_macaron是一个用于与以太坊区块链进行交互的Dart库,适用于Flutter应用。

首先,确保你已经将web3dart_macaron添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  web3dart_macaron: ^x.y.z  # 请替换为最新版本号

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

以下是一个简单的Flutter应用示例,它使用web3dart_macaron连接到以太坊区块链,并查询某个账户的余额:

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

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

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

class _MyAppState extends State<MyApp> {
  String balance = "Loading...";

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

  Future<void> _fetchBalance() async {
    // 替换为你的以太坊节点URL
    final client = HttpProvider("https://mainnet.infura.io/v3/YOUR_PROJECT_ID");
    
    // 替换为你要查询的以太坊账户地址
    final address = EthereumAddress.fromHex("YOUR_ETHEREUM_ADDRESS");

    // 使用默认的Credentials对象(假设你有私钥)
    final credentials = Credentials.fromPrivateKey(
      Uint8List.fromList(hexStringToByteArray("YOUR_PRIVATE_KEY")),
    );

    try {
      final balanceInWei = await client.getBalance(address, credentials);
      // 将Wei转换为Ether
      final balanceInEther = Web3Dart.toEther(balanceInWei);
      setState(() {
        balance = balanceInEther.toStringAsFixed(18); // 保留18位小数
      });
    } catch (e) {
      setState(() {
        balance = "Error: ${e.toString()}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Blockchain Interaction'),
        ),
        body: Center(
          child: Text(
            balance,
            style: TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }

  // 辅助函数:将十六进制字符串转换为字节数组
  Uint8List hexStringToByteArray(String hex) {
    int len = hex.length;
    Uint8List byteArray = Uint8List(len / 2);
    for (int i = 0; i < len; i += 2) {
      byteArray[i / 2] = int.parse(hex.substring(i, i + 2), 16);
    }
    return byteArray;
  }
}

注意事项

  1. 替换URL和密钥:确保将YOUR_PROJECT_IDYOUR_ETHEREUM_ADDRESSYOUR_PRIVATE_KEY替换为实际的值。
  2. 安全性:不要在生产应用中硬编码私钥。考虑使用安全的密钥管理方式,如Keystore文件或环境变量。
  3. 网络选择:此示例使用的是Infura的主网节点。如果你在使用测试网,请相应地更改URL。

这个示例展示了如何连接到以太坊区块链并查询某个账户的余额。web3dart_macaron还支持更多高级功能,如交易签名和发送交易,你可以根据官方文档进行进一步的学习和探索。

回到顶部