web3dart 是一个 Dart 库,可实现与以太坊兼容的区块链网络(包括 Celo)的集成。它允许开发者连接到以太坊客户端,从 Flutter 应用程序中直接发送交易并交互智能合约。该库支持通过 Celo 的 `feeCurrencies` 功能使用多种货币支付费用,为用户提供了更高的灵活性。专为跨平台使用设计,可在 Android、iOS、Web、macOS、Windows 和 Linux 上无缝运行。非常适合构建具有区块链功能的去中心化应用(dApps)。
适合场景
使用 Celo 集成构建去中心化应用
从 Flutter 应用发送交易
与以太坊智能合约交互
在移动/网页应用中启用钱包连接
支持多货币交易费用
主要特点
Celo 兼容性
跨平台支持
智能合约交互
多币种费用支付
以太坊客户端连接
适合对象
Flutter 开发人员构建区块链应用
需要 Celo 网络访问权限的项目
需要交易签名的 dApps
具有加密功能的移动和网页应用
面向多平台的开发者
使用建议
需要了解区块链概念
需要对私钥进行安全处理
依赖外部以太坊节点
可能需要为测试网进行额外设置
与成熟库相比,文档有限
原始 README
以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。
A Celo compatible Dart library to connect to Ethereum clients. Send transactions and interact with smart contracts! Pay transaction fees using feeCurrencies on Celo.
Features
Celo compatible
Connect to an Ethereum node with the rpc-api, call common methods
Send signed Ethereum transactions
Generate private keys, setup new Ethereum addresses
Call functions on smart contracts and listen for contract events
Code generation based on smart contract ABI for easier interaction
TODO
Encode all supported solidity types, although only (u)fixed,
which are not commonly used, are not supported at the moment.
Usage
Credentials and Wallets
In order to send transactions on the Ethereum network, some credentials
are required. The library supports raw private keys and v3 wallet files.
import'dart:math'; //used for the random number generatorimport'package:web3dart/web3dart.dart';
// You can create Credentials from private keysCredentials fromHex = EthPrivateKey.fromHex("c87509a[...]dc0d3");
// Or generate a new key randomlyvar 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 = credentials.address;
print(address.hex);
Another way to obtain Credentials which the library uses to sign
transactions is the usage of a wallet file. Wallets store a private
key securely and require a password to unlock. The library has experimental
support for version 3 wallets commonly generated by other Ethereum clients:
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
You can also create Wallet files with this library. To do so, you first need
the private key you want to encrypt and a desired password. Then, create
your wallet with
You can also write wallet.toJson() into a file which you can later open
with MyEtherWallet
(select Keystore / JSON File) or other Ethereum clients like geth.
Custom credentials
If you want to integrate web3dart with other wallet providers, you can implement
Credentials and override the appropriate methods.
Connecting to an RPC server
The library won't send signed transactions to miners itself. Instead,
it relies on an RPC client to do that. You can use a public RPC API like
infura, setup your own using geth
or, if you just want to test things out, use a private testnet with
truffle and ganache. All these options will give you
an RPC endpoint to which the library can connect.
import'package:http/http.dart'; //You can also import the browser versionimport'package:web3dart/web3dart.dart';
var apiUrl = "http://localhost:7545"; //Replace with your APIvar httpClient = Client();
var ethClient = Web3Client(apiUrl, httpClient);
var credentials = EthPrivateKey.fromHex("0x...");
var address = credentials.address;
// You can now call rpc methods. This one will query the amount of Ether you ownEtherAmount balance = ethClient.getBalance(address);
print(balance.getValueInUnit(EtherUnit.ether));
Sending transactions
Of course, this library supports creating, signing and sending Ethereum
transactions:
import'package:web3dart/web3dart.dart';
/// [...], you need to specify the url and your client, see example abovevar ethClient = Web3Client(apiUrl, httpClient);
var credentials = EthPrivateKey.fromHex("0x...");
await client.sendTransaction(
credentials,
Transaction(
to: EthereumAddress.fromHex('0xC91...3706'),
gasPrice: EtherAmount.inWei(BigInt.one),
maxGas: 100000,
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1),
),
);
Missing data, like the gas price, the sender and a transaction nonce will be
obtained from the connected node when not explicitly specified. If you only need
the signed transaction but don't intend to send it, you can use
client.signTransaction.
Smart contracts
The library can parse the abi of a smart contract and send data to it. It can also
listen for events emitted by smart contracts. See this file
for an example.
Dart Code Generator
By using Dart's build system, web3dart can
generate Dart code to easily access smart contracts.
Install web3dart_builders package
pub add web3dart_builders --dev
To use this feature, put a contract abi json somewhere into lib/.
The filename has to end with .abi.json.
Then, add a dev_dependency on the build_runner package and run
pub run build_runner build
You'll now find a .g.dart file containing code to interact with the contract.
Optional: Ignore naming suggestions for generated files
If importing contract ABIs with function names that don't follow dart's naming conventions, the dart analyzer will (by default) be unhappy about it, and show warnings.
This can be mitigated by excluding all the generated files from being analyzed.
Note that this has the side effect of suppressing serious errors as well, should there exist any. (There shouldn't as these files are automatically generated).
Create a file named analysis_options.yaml in the root directory of your project: