Flutter以太坊交互插件ethers的使用
简介
Ethers 是一个 Dart 库,用于与以太坊区块链进行交互,灵感来源于 ethers.js。
感谢 web3dart,该库已停止维护。
安装
在 pubspec.yaml
文件中添加 Ethers:
dependencies:
ethers:
在需要使用的文件中导入 Ethers:
import 'package:ethers/ethers.dart';
使用示例
以下是一个简单的示例,展示如何使用 Ethers 连接到以太坊网络并获取账户余额。
import 'package:ethers/ethers.dart';
void main() async {
// 创建一个 JSON RPC 提供者实例
const provider = JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
// 获取当前区块号
int blockNumber = await provider.getBlockNumber();
print('当前区块号: $blockNumber');
// 获取指定地址的余额
final balance = await provider.getBalance(
'0x0000000000000000000000000000000000000000', // 替换为实际的以太坊地址
);
// 将余额格式化为以太币(ETH)
String formattedBalance = ethers.utils.formatEther(balance);
print('余额: $formattedBalance ETH');
}
钱包操作
以下是如何创建和使用钱包的示例。
import 'package:ethers/signers/wallet.dart';
void main() {
// 使用助记词创建钱包
final mnemonic =
"announce room limb pattern dry unit scale effort smooth jazz weasel alcohol";
final walletMnemonic = Wallet.fromMnemonic(mnemonic);
// 使用私钥创建钱包
final walletPrivateKey = Wallet(walletMnemonic.privateKey);
// 验证两个钱包是否具有相同的地址
bool sameAddress = walletMnemonic.address == walletPrivateKey.address;
print('地址相同: $sameAddress');
// 获取钱包地址
print('钱包地址: ${walletMnemonic.address}');
// 获取私钥
print('私钥: ${walletMnemonic.privateKey}');
// 获取公钥
print('公钥: ${walletMnemonic.publicKey}');
// 获取助记词
print('助记词: ${walletMnemonic.mnemonic}');
}
完整示例代码
以下是一个完整的 Flutter 示例代码,展示如何使用 Ethers 获取余额和钱包信息。
import 'package:ethers/signers/wallet.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Ethers Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Ethers Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final mnemonic =
"announce room limb pattern dry unit scale effort smooth jazz weasel alcohol";
late Wallet walletMnemonic;
[@override](/user/override)
void initState() {
walletMnemonic = Wallet.fromMnemonic(mnemonic);
super.initState();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'助记词: $mnemonic',
textAlign: TextAlign.center,
),
Text(
'私钥: ${walletMnemonic.privateKey}',
textAlign: TextAlign.center,
),
Text(
'公钥: ${walletMnemonic.publicKey}',
textAlign: TextAlign.center,
),
Text(
'钱包地址: ${walletMnemonic.address}',
textAlign: TextAlign.center,
),
],
),
),
);
}
}
更多关于Flutter以太坊交互插件ethers的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter以太坊交互插件ethers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中与以太坊区块链进行交互,可以使用ethers
库的Flutter插件flutter_ethers
。这个插件允许你在Flutter应用中与以太坊网络进行交互,包括发送交易、调用智能合约、查询区块链数据等。
以下是如何在Flutter项目中使用flutter_ethers
插件的基本步骤:
1. 添加依赖
首先,在pubspec.yaml
文件中添加flutter_ethers
依赖:
dependencies:
flutter:
sdk: flutter
flutter_ethers: ^0.1.0 # 请检查最新版本
然后运行flutter pub get
来安装依赖。
2. 初始化Provider
Provider
是与以太坊网络进行交互的核心类。你可以使用JsonRpcProvider
来连接以太坊节点。
import 'package:flutter_ethers/flutter_ethers.dart';
void main() async {
// 初始化Provider
final provider = JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
// 获取当前区块号
final blockNumber = await provider.getBlockNumber();
print('Current block number: $blockNumber');
}
3. 创建钱包
Wallet
类用于管理以太坊账户。你可以使用私钥或助记词来创建钱包。
import 'package:flutter_ethers/flutter_ethers.dart';
void main() async {
// 使用私钥创建钱包
final privateKey = '0xYourPrivateKey';
final wallet = Wallet.fromPrivateKey(privateKey, provider);
// 获取钱包地址
final address = wallet.address;
print('Wallet address: $address');
}
4. 发送交易
你可以使用Wallet
类来发送以太币或调用智能合约。
import 'package:flutter_ethers/flutter_ethers.dart';
void main() async {
// 初始化Provider和Wallet
final provider = JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
final wallet = Wallet.fromPrivateKey('0xYourPrivateKey', provider);
// 创建交易
final transaction = Transaction(
to: '0xRecipientAddress',
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1), // 发送1 ETH
);
// 发送交易
final txResponse = await wallet.sendTransaction(transaction);
print('Transaction hash: ${txResponse.hash}');
}
5. 与智能合约交互
你可以使用Contract
类来与部署在以太坊上的智能合约进行交互。
import 'package:flutter_ethers/flutter_ethers.dart';
void main() async {
// 初始化Provider和Wallet
final provider = JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
final wallet = Wallet.fromPrivateKey('0xYourPrivateKey', provider);
// 定义合约ABI和地址
final abi = '''[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]''';
final contractAddress = '0xYourContractAddress';
// 创建合约实例
final contract = Contract(contractAddress, abi, wallet);
// 调用合约方法
final result = await contract.call('name');
print('Contract name: $result');
}
6. 监听事件
你可以使用Contract
类来监听智能合约的事件。
import 'package:flutter_ethers/flutter_ethers.dart';
void main() async {
// 初始化Provider和Wallet
final provider = JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
final wallet = Wallet.fromPrivateKey('0xYourPrivateKey', provider);
// 定义合约ABI和地址
final abi = '''[{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]''';
final contractAddress = '0xYourContractAddress';
// 创建合约实例
final contract = Contract(contractAddress, abi, wallet);
// 监听事件
contract.on('Transfer', (from, to, value) {
print('Transfer event: from $from to $to value $value');
});
}
7. 处理错误
在与以太坊网络交互时,可能会遇到各种错误,如网络错误、交易失败等。你可以使用try-catch
块来处理这些错误。
import 'package:flutter_ethers/flutter_ethers.dart';
void main() async {
try {
// 初始化Provider和Wallet
final provider = JsonRpcProvider('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');
final wallet = Wallet.fromPrivateKey('0xYourPrivateKey', provider);
// 创建交易
final transaction = Transaction(
to: '0xRecipientAddress',
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1), // 发送1 ETH
);
// 发送交易
final txResponse = await wallet.sendTransaction(transaction);
print('Transaction hash: ${txResponse.hash}');
} catch (e) {
print('Error: $e');
}
}
8. 使用Web3Modal(可选)
如果你想要在Flutter应用中集成Web3Modal(用于连接钱包),你可以使用web3modal_flutter
插件。
dependencies:
web3modal_flutter: ^0.1.0 # 请检查最新版本