Flutter以太坊交互插件ethers的使用

简介

test

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

1 回复

更多关于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  # 请检查最新版本
回到顶部