Flutter区块链交互插件web3dart_macaron的使用
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
更多关于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;
}
}
注意事项:
- 替换URL和密钥:确保将
YOUR_PROJECT_ID
、YOUR_ETHEREUM_ADDRESS
和YOUR_PRIVATE_KEY
替换为实际的值。 - 安全性:不要在生产应用中硬编码私钥。考虑使用安全的密钥管理方式,如Keystore文件或环境变量。
- 网络选择:此示例使用的是Infura的主网节点。如果你在使用测试网,请相应地更改URL。
这个示例展示了如何连接到以太坊区块链并查询某个账户的余额。web3dart_macaron
还支持更多高级功能,如交易签名和发送交易,你可以根据官方文档进行进一步的学习和探索。