Flutter区块链交互插件dart_web3的使用
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
更多关于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'),
],
),
),
),
);
}
}
注意事项:
-
私钥和地址:在实际应用中,永远不要在客户端代码中硬编码私钥。这只是一个示例。在实际应用中,你应该使用安全的密钥管理方式,如硬件钱包或安全的密钥管理服务。
-
Infura节点:你需要注册一个Infura账户并获取一个项目ID来使用他们的以太坊节点服务。
-
交易费用:发送交易时,你需要确保有足够的以太币来支付交易费用(gas)。
-
安全性:在实际应用中,发送交易通常需要用户确认,并且应该在一个安全的环境中进行。
-
依赖版本:确保你使用的是
dart_web3
的最新版本,并查阅其文档以获取最新的API和用法。
这个示例代码展示了如何使用dart_web3
插件在Flutter应用中与以太坊区块链进行基本的交互。根据具体需求,你可能需要扩展和修改这个示例。