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,或者如果只是想测试,可以使用Truffle和Ganache的私有测试网。所有这些选项都会为你提供一个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
更多关于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(), ); } }