跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Dart大前端

Flutter web3dart 连接以太坊区块链构建 DApp 实战

介绍在 Flutter 和 OpenHarmony 环境下使用 web3dart 库连接以太坊区块链。内容涵盖 JSON-RPC 原理、账户管理、ETH 转账、ERC-20 合约读写交互以及私钥安全存储方案。通过实战代码示例,帮助开发者在移动端构建去中心化应用(DApp)。

疯疯癫癫发布于 2026/4/6更新于 2026/10/15121 浏览
Flutter web3dart 连接以太坊区块链构建 DApp 实战

在这里插入图片描述

前言

随着 Web3.0 概念的普及,区块链技术已从早期的极客玩具逐渐走向主流应用。无论是 DeFi(去中心化金融)、NFT(非同质化代币)还是 DAO(去中心化组织),都离不开与区块链网络的交互。

以太坊 (Ethereum) 作为目前最成熟的智能合约平台,其客户端通信协议 JSON-RPC 是行业标准。要在移动端(Flutter/OpenHarmony)与以太坊网络通信,我们不可能手动构造那些复杂的十六进制数据包。

web3dart 是 Dart 生态中唯一的、功能完备的 Web3 客户端库。它可以让你:

  1. 管理账户:生成私钥、助记词,导入 keystore。
  2. 发送交易:转账 ETH,部署合约。
  3. 调用合约:Read(查询状态)和 Write(改变状态)。
  4. 订阅事件:监听链上事件(如 Transfer)。

对于 OpenHarmony 开发者来说,web3dart 的纯 Dart 实现意味着你可以无视底层 OS 差异,直接在鸿蒙设备上开发冷钱包或 DApp。

一、核心原理与密码学基础

1.1 JSON-RPC 与 Infura

以太坊节点通过 JSON-RPC 接口暴露服务。但要在移动端运行全节点(Full Node,几百 GB 数据)是不现实的。 通常我们会连接 Infura 或 Alchemy 这样的远程节点服务商。web3dart 底层封装了 http 和 web_socket_channel 来与这些节点通信。

1.2 账户与签名 (ECDSA)

以太坊使用 椭圆曲线数字签名算法 (ECDSA, secp256k1)。

  • 私钥 (Private Key):256 位随机数,绝对不能泄露。
  • 公钥 (Public Key):由私钥生成。
  • 地址 (Address):公钥的哈希值(Keccak-256)的后 20 字节。

交易必须用私钥签名。web3dart 可能会在设备本地完成签名过程,只将签名后的数据(Raw Transaction)发送给节点,确保私钥永远不离开设备。

  1. 发起交易
  2. 构建交易对象
  3. 请求签名
  4. 返回签名数据 (Raw Tx)
  5. 发送 JSON-RPC 请求
  6. 广播交易
  7. 矿工打包
  8. 推送回执/事件

用户操作 → Flutter DApp → web3dart 客户端 → 本地钱包/私钥 → 远程节点 (Infura/Alchemy) → 以太坊网络 → 区块链

二、核心 API 详解

2.1 初始化客户端
import 'package:http/http.dart';
import 'package:web3dart/web3dart.dart';

void main() {
  final rpcUrl = "https://mainnet.infura.io/v3/YOUR_API_KEY";
  final httpClient = Client();
  final ethClient = Web3Client(rpcUrl, httpClient);
}

在这里插入图片描述

2.2 账户管理 (Wallet)
// 生成随机私钥
var rng = Random.secure();
var credentials = EthPrivateKey.createRandom(rng);

// 获取地址
var address = await credentials.extractAddress();
print(address.hex);

// 导入私钥
var privateKey = "0x...";
var credentials2 = EthPrivateKey.fromHex(privateKey);

在这里插入图片描述

2.3 发送 ETH (Native Token Transfer)
// 转账 0.1 ETH
// 注意:amount 的单位是 Wei (1 ETH = 10^18 Wei)
await ethClient.sendTransaction(
  credentials,
  Transaction(
    to: EthereumAddress.fromHex('0xReceiverAddress...'),
    gasPrice: EtherAmount.inWei(BigInt.from(10000000000)), // 10 Gwei
    maxGas: 21000, // 标准转账 Gas Limit
    value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1),
  ),
  chainId: 1, // Mainnet ID
);

在这里插入图片描述

三、OpenHarmony 平台适配实战:智能合约交互

在鸿蒙上开发 DApp,最常见的场景是调用合约。比如查询用户的 USDT 余额。

3.1 ABI (Application Binary Interface)

合约编译后会生成 ABI(JSON 格式),描述了合约的方法签名。

[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"type":"function"},...]
3.2 调用 ERC-20 合约 (Read)
import 'package:flutter/services.dart' show rootBundle;

// 1. 加载 ABI
String abi = await rootBundle.loadString("assets/erc20.abi.json");
final contractAddr = EthereumAddress.fromHex("0xdAC17F958D2ee523a2206206994597C13D831ec7"); // USDT Contract

// 2. 解析合约
final contract = DeployedContract(ContractAbi.fromJson(abi, "USDT"), contractAddr);
final balanceFunction = contract.function('balanceOf');

// 3. 调用 (call)
// call 是只读操作,不需要 gas,不需要私钥签名
final result = await ethClient.call(
  contract: contract,
  function: balanceFunction,
  params: [EthereumAddress.fromHex("0xUserAddress...")],
);

// 4. 解析结果 (BigInt)
final balance = result.first as BigInt;
print('USDT Balance: ${balance / BigInt.from(10).pow(6)}'); // USDT 精度是 6

在这里插入图片描述

3.3 写入合约 (Write / Transaction)
final transferFunction = contract.function('transfer');

// sendTransaction 需要 gas 和 私钥,会改变链上状态
final txHash = await ethClient.sendTransaction(
  credentials,
  Transaction.callContract(
    contract: contract,
    function: transferFunction,
    parameters: [
      EthereumAddress.fromHex("0xReceiver..."),
      BigInt.from(1000000) // 1 USDT
    ],
  ),
  chainId: 1,
);
print('TxHash: $txHash');

在这里插入图片描述

四、高级进阶:安全性与私钥存储

4.1 密钥库 (Keystore / JSON V3)

为了安全,私钥不应直接明文存储。标准做法是使用 Keystore 格式,结合用户密码进行加密。

// 创建 Wallet (生成 JSON V3 字符串)
// scryptN: CPU 消耗参数,越大越难爆破
Wallet wallet = await Wallet.createNew(credentials, "user_password", scryptN: 8192);
String json = wallet.toJson();

// 保存这个 json 到本地文件
File('wallet.json').writeAsStringSync(json);

// 读取时解密
Wallet wallet = Wallet.fromJson(json, "user_password");
credentials = wallet.privateKey;
4.2 鸿蒙安全存储 (HUKS / EL2)

在 OpenHarmony 上,我们有更安全的硬件级密钥管理服务 (HUKS)。 但在 Flutter 层,如果没有 HUKS 插件,我们至少要做到:

  1. 使用 flutter_secure_storage:在 Android 上对应 Keystore,在 iOS 上对应 Keychain。在鸿蒙上,目前需要自行适配或使用应用沙箱的 EL2 加密区。
  2. 不存储私钥:只存储 Keystore JSON 文件。解密私钥仅在内存中存在(Credentials 对象),用完即焚(设为 null 或让 GC 回收)。
4.3 助记词 (Mnemonic / BIP39/44)

现代钱包都支持助记词(12 个单词)。需配合 bip39 和 bip32 库使用。

// 生成助记词
String mnemonic = bip39.generateMnemonic();

// 推导私钥 (BIP44 路径 m/44'/60'/0'/0/0)
var seed = bip39.mnemonicToSeed(mnemonic);
var master = await ED25519_HD_KEY.getMasterKeyFromSeed(seed);
// 需要 ed25519_hd_key 库
// ... 复杂推导过程,web3dart 暂未内置,需组合其他库 ...

在这里插入图片描述

五、总结

web3dart 是 Flutter 连接区块链世界的桥梁。虽然它主要是底层的 JSON-RPC 包装,但结合 Dart 强大的异步能力和 UI 表现力,你可以轻松构建出体验优于 Web 端(MetaMask 插件)的原生 DApp。

对于 OpenHarmony 开发者,区块链应用(如数字人民币硬件钱包、供应链溯源终端)是鸿蒙生态的重要场景。掌握 web3dart,你就在这个领域占据了先机。

最佳实践:

  • 网络切换:支持主网 (Mainnet) 与测试网 (Sepolia/Goerli) 的动态切换。
  • Gas 估算:发送交易前务必调用 estimateGas,防止 Gas 不足交易失败。
  • 异常处理:RPC 节点经常超时或限流,必须实现重试机制。

目录

  1. 前言
  2. 一、核心原理与密码学基础
  3. 1.1 JSON-RPC 与 Infura
  4. 1.2 账户与签名 (ECDSA)
  5. 二、核心 API 详解
  6. 2.1 初始化客户端
  7. 2.2 账户管理 (Wallet)
  8. 2.3 发送 ETH (Native Token Transfer)
  9. 三、OpenHarmony 平台适配实战:智能合约交互
  10. 3.1 ABI (Application Binary Interface)
  11. 3.2 调用 ERC-20 合约 (Read)
  12. 3.3 写入合约 (Write / Transaction)
  13. 四、高级进阶:安全性与私钥存储
  14. 4.1 密钥库 (Keystore / JSON V3)
  15. 4.2 鸿蒙安全存储 (HUKS / EL2)
  16. 4.3 助记词 (Mnemonic / BIP39/44)
  17. 五、总结

更多推荐文章

查看全部
  • DeepSeek-R1 开源大模型推理优化实战方案
  • 基于 Spring Boot 的流浪动物救助与管理系统的设计与实现
  • Claude Code Router 与 cpolar 组合优化 AI 开发流程
  • Java 核心 API 与进阶知识总结
  • DeepSeek-R1 大模型基于 MS-Swift 框架部署与微调实践
  • 自主无人机硬件搭建及 EGOPlanner 实现
  • Mac 下使用 Homebrew 安装 NVM 管理 Node.js 版本及 zsh 配置
  • gpt-oss-20b 本地 WebUI 部署与网页推理服务配置
  • node-llama-cpp 错误处理与调试:解决本地 AI 开发问题
  • Rust 异步 Web 框架 Axum 的深入原理与高级用法
  • C++ 继承详解:面向对象代码复用的核心机制
  • C++ 多态底层实现机制深度解析
  • Linux 下安装 Claude Code 的常见问题与解决方案
  • OpenClaw vs Coze/Dify/n8n AI Agent 工具选型对比
  • Stable Diffusion 文生图功能详解与参数配置指南
  • Windows 平台 C/C++ 毫秒级定时器实现详解
  • 企业级农产品直卖平台:SpringBoot+Vue+MyBatis 架构
  • C++ 实现 LLaMA-3 推理加速:量化、算子融合与内存池优化
  • CATE 条件平均处理效应估计:五大方法原理详解与实战
  • 7 篇值得关注的大模型领域最新论文

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online