Flutter插件zagmi的介绍与使用方法详解

Flutter插件zagmi的介绍与使用方法详解

zagmi介绍

一个用于连接以太坊区块链并与其交互的Dart库。它通过连接到以太坊节点来发送交易、与智能合约交互等。


Flutter插件zagmi的功能

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

TODO

  • 支持所有Solidity类型编码,但目前未支持不常用的(u)fixed类型。

Flutter插件zagmi的使用

凭证和钱包

在以太坊网络上发送交易需要一些凭证。该库支持原始私钥和版本3的钱包文件。

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

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

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

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

另一种获取Credentials的方式是使用钱包文件。钱包文件安全地存储私钥,并需要密码解锁。该库对由其他以太坊客户端生成的版本3钱包有实验性支持:

import 'dart:io';
import 'package:zagmi/zagmi.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打开。

自定义凭证

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


连接到RPC服务器

该库本身不会直接向矿工发送已签名的交易。相反,它依赖于RPC客户端完成此操作。你可以使用公共RPC API如Infura,设置自己的RPC服务器使用Geth,或者如果只是想测试,可以使用TruffleGanache的私有测试网。所有这些选项都会为你提供一个RPC端点,库可以连接到该端点。

import 'package:http/http.dart'; // 也可以导入浏览器版本
import 'package:zagmi/zagmi.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:zagmi/zagmi.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价格、发送者和交易编号,将在未明确指定时从连接的节点获取。如果你只需要已签名的交易而不打算发送它,可以使用client.signTransaction


智能合约

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


Dart代码生成器

通过使用Dart的构建系统,zagmi可以生成Dart代码,以便更轻松地访问智能合约。

为了使用此功能,请将智能合约的ABI JSON文件放置在lib/目录中,文件名必须以.abi.json结尾。然后添加build_runner包作为dev_dependency,运行以下命令:

pub run build_runner build

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

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

如果导入的合约ABI具有不符合Dart命名约定的函数名称,则Dart分析器会默认对此发出警告。可以通过排除所有生成的文件来缓解此问题。
注意,这可能会抑制严重错误,如果有任何错误存在。(通常这些文件是自动生成的。)

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

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

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


特性请求和错误报告

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


示例代码

以下是完整的示例代码:

import 'package:http/http.dart';
import 'package:zagmi/zagmi.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插件zagmi的介绍与使用方法详解的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件zagmi的介绍与使用方法详解的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用未知功能插件 zagmi 可能会有些挑战,尤其是当插件的文档或功能描述不明确时。以下是一些步骤和建议,帮助你更好地理解和使用 zagmi 插件。

1. 查找插件的来源

  • Pub.dev: 首先,检查 zagmi 是否在 pub.dev 上发布。即使描述为 “undefined”,也可能有一些基本信息或示例代码。
  • GitHub: 如果 zagmi 是开源项目,尝试在 GitHub 上找到它的仓库。查看 README 文件、代码示例和 issue 讨论可能会提供一些线索。

2. 查看插件的源代码

  • 如果插件是开源的,直接查看其源代码是理解其功能的最佳方式。特别是查看 lib 目录下的 Dart 文件,了解它提供了哪些类、方法和功能。
  • 查看 example 文件夹(如果有的话),通常这里面会有插件的使用示例。

3. 尝试导入和使用

  • 在你的 pubspec.yaml 文件中添加 zagmi 插件的依赖:
    dependencies:
      zagmi: ^<version>
    
  • 运行 flutter pub get 来获取插件。
  • 在 Dart 文件中导入插件并尝试使用它提供的类和函数:
    import 'package:zagmi/zagmi.dart';
    

4. 使用插件的 API

  • 如果插件提供了类和方法,尝试创建一个实例并调用其方法。例如:
    var zagmiInstance = Zagmi();
    zagmiInstance.someMethod();
    
  • 如果插件提供了 Widget,尝试在 UI 中使用它:
    class MyHomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Zagmi Example'),
          ),
          body: ZagmiWidget(),
        );
      }
    }
回到顶部