web3dart

pub package

一个与以太坊区块链交互的Dart库。它连接到以太坊节点以发送交易、与智能合约交互以及更多!

功能

  • 使用rpc-api连接以太坊节点,调用常用方法
  • 发送已签名的以太坊交易
  • 生成私钥,设置新的以太坊地址
  • 调用智能合约上的函数并监听合约事件
  • 基于智能合约ABI的代码生成,以便于交互

待办事项

  • 编码所有支持的solidity类型,尽管目前不支持不常用的(u)fixed类型。

用法

凭证和钱包

为了在以太坊网络上发送交易,需要一些凭证。该库支持原始私钥和v3钱包文件。

import 'dart:math'; //used for the random number generator

import 'package:web3dart/web3dart.dart';
// You can create Credentials from private keys
Credentials fromHex = EthPrivateKey.fromHex("c87509a[...]dc0d3");

// Or generate a new key randomly
var rng = Random.secure();
Credentials random = EthPrivateKey.createRandom(rng);

// In either way, the library can derive the public key and the address
// from a private key:
var address = await credentials.extractAddress();
print(address.hex);

获取库用于签名交易的Credentials的另一种方法是使用钱包文件。钱包安全地存储私钥,并需要密码才能解锁。该库对其他以太坊客户端通常生成的v3钱包提供实验性支持。

import 'dart:io';
import 'package:web3dart/web3dart.dart';

String content = File("wallet.json").readAsStringSync();
Wallet wallet = Wallet.fromJson(content, "testpassword");

Credentials unlocked = wallet.privateKey;
// You can now use these credentials to sign transactions or messages

您也可以使用此库创建钱包文件。为此,您首先需要想要加密的私钥和所需的密码。然后,使用以下命令创建您的钱包:

Wallet wallet = Wallet.createNew(credentials, "password", random);
print(wallet.toJson());

您还可以将wallet.toJson()写入文件,之后您可以使用MyEtherWallet(选择Keystore / JSON文件)或其他以太坊客户端(如geth)打开。

自定义凭证

如果您想将web3dart与任何其他钱包提供商集成,可以实现Credentials并覆盖适当的方法。

连接到RPC服务器

该库本身不会将签名交易发送给矿工。相反,它依赖于RPC客户端来完成。您可以使用公共RPC API,如infura,使用geth设置自己的RPC API,或者,如果您只想测试一些东西,可以使用truffleganache使用私有测试网。所有这些选项都将为您提供一个库可以连接的RPC端点。

import 'package:http/http.dart'; //You can also import the browser version
import 'package:web3dart/web3dart.dart';

var apiUrl = "https://:7545"; //Replace with your API

var httpClient = Client();
var ethClient = Web3Client(apiUrl, httpClient);

var credentials = ethClient.credentialsFromPrivateKey("0x...");

// You can now call rpc methods. This one will query the amount of Ether you own
EtherAmount balance = ethClient.getBalance(credentials.address);
print(balance.getValueInUnit(EtherUnit.ether));

发送交易

当然,该库支持创建、签名和发送以太坊交易

import 'package:web3dart/web3dart.dart';

/// [...], you need to specify the url and your client, see example above
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并向其发送数据。它还可以监听智能合约发出的事件。有关示例,请参阅此文件

Dart代码生成器

通过使用Dart的构建系统,web3dart可以生成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'

有关高级选项,请参阅自定义静态分析

功能请求和错误

请在问题跟踪器上提交功能请求和错误。如果您想为此库做出贡献,请提交一个Pull Request。

GitHub

查看 Github