Ethers.js

以太坊标准JS API库——浅谈Web3.js与Ethers.js 以太坊标准JavaScript API库——Web3.js、Ethers.js入门介绍 阅读详情

原文作者:PaperMoon团队

介绍

Ethers.js 是一个轻量级 JavaScript 库,用于与 以太坊虚拟机(EVM)兼容的区块链进行交互。Ethers.js 被广泛用作建立连接、读取和写入区块链数据的工具包。

本文将演示如何使用 Ethers.js 与 Polkadot Hub 交互,并在其上部署智能合约。

本指南适用于 熟悉 JavaScript、并希望通过 Ethers.js 与 Polkadot Hub 进行交互的开发者。

前置条件

在开始之前,请确保你已安装以下工具:
    •    Node.js:v22.13.1 或更高版本(可参考 Node.js 官方安装指南)
    •    npm:v6.13.4 或更高版本(通常随 Node.js 一起安装)
    •    Solidity:本指南使用 ^0.8.9 版本进行智能合约开发

项目结构

该项目将合约、脚本和编译产物进行清晰组织,方便开发和部署。

ethers-project
├── contracts
│   ├── Storage.sol
├── scripts
│   ├── connectToProvider.js
│   ├── fetchLastBlock.js
│   ├── compile.js
│   ├── deploy.js
│   ├── checkStorage.js
├── abis
│   ├── Storage.json
├── artifacts
│   ├── Storage.bin
├── contract-address.json
├── node_modules/
├── package.json
├── package-lock.json
└── README.md

初始化项目

创建新文件夹并初始化项目:

mkdir ethers-project
cd ethers-project
npm init -y

安装依赖

安装 Ethers.js:

npm install ethers

安装 Solidity 编译器(用于生成标准 EVM 字节码):

npm install --save-dev solc

本指南使用 solc 0.8.33。

提示

示例脚本使用 ECMAScript modules(ESM)。
请在 package.json 中添加:

"type": "module"

或者将脚本文件重命名为 .mjs,以便 Node.js 正确解析 import 语句。

设置 Ethers.js Provider

Provider 是对以太坊网络连接的抽象,允许你查询区块链数据并发送交易。它是应用程序与区块链之间的桥梁。

要与 Polkadot Hub 交互,你需要创建一个 Ethers.js Provider。

创建 Provider

在项目根目录下创建文件:

scripts/connectToProvider.js
const { JsonRpcProvider } = require('ethers');

const createProvider = (rpcUrl, chainId, chainName) => {
  const provider = new JsonRpcProvider(rpcUrl, {
    chainId: chainId,
    name: chainName,
  });
  return provider;
};

const PROVIDER_RPC = {
  rpc: 'INSERT_RPC_URL',
  chainId: 'INSERT_CHAIN_ID',
  name: 'INSERT_CHAIN_NAME',
};

createProvider(PROVIDER_RPC.rpc, PROVIDER_RPC.chainId, PROVIDER_RPC.name);

注意

请将 INSERT_RPC_URL、INSERT_CHAIN_ID 和 INSERT_CHAIN_NAME 替换为实际值。

例如,连接到 Polkadot Hub TestNet 的 Ethereum RPC:

const PROVIDER_RPC = {
  rpc: 'https://services.polkadothub-rpc.com/testnet',
  chainId: 420420417,
  name: 'polkadot-hub-testnet'
};

运行:

node scripts/connectToProvider.js

查询区块信息(示例)

获取最新区块高度:

scripts/fetchLastBlock.js
const { JsonRpcProvider } = require('ethers');

const createProvider = (rpcUrl, chainId, chainName) => {
  return new JsonRpcProvider(rpcUrl, { chainId, name: chainName });
};

const PROVIDER_RPC = {
  rpc: 'https://services.polkadothub-rpc.com/testnet',
  chainId: 420420417,
  name: 'polkadot-hub-testnet',
};

const main = async () => {
  try {
    const provider = createProvider(
      PROVIDER_RPC.rpc,
      PROVIDER_RPC.chainId,
      PROVIDER_RPC.name,
    );
    const latestBlock = await provider.getBlockNumber();
    console.log(`最新区块高度: ${latestBlock}`);
  } catch (error) {
    console.error('连接 Polkadot Hub TestNet 失败: ' + error.message);
  }
};

main();

编译智能合约

Polkadot Hub 提供 Ethereum JSON-RPC 接口,因此你可以使用原生的 solc 编译 Solidity 合约,生成标准 EVM 字节码,并通过 Ethers.js 部署。

示例合约:Storage.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

contract Storage {
    uint256 public storedNumber;

    function setNumber(uint256 _newNumber) public {
        storedNumber = _newNumber;
    }
}

该合约用于存储一个数字,并允许任何用户更新它。
编译脚本

scripts/compile.js

(逻辑保持原样:读取 Solidity → 编译 → 输出 ABI 和 Bytecode)

运行:

node scripts/compile.js

编译结果说明


    •    ABI 文件:abis/Storage.json
    •    字节码文件:artifacts/Storage.bin

ABI(应用二进制接口)定义了合约函数、事件及参数,是 JavaScript 与合约交互的桥梁。

部署合约到 Polkadot Hub

部署合约需要一个 钱包助记词(mnemonic) 来签名交易。

部署脚本:scripts/deploy.js

(完整代码与你提供的保持一致)

关键步骤包括:
    1.    创建 Provider
    2.    从助记词生成 Wallet
    3.    使用 ContractFactory 部署合约
    4.    保存部署后的合约地址到 contract-address.json

运行:

node scripts/deploy.js

⚠️ 请务必妥善保管助记词,切勿公开

与合约交互

部署完成后,可通过脚本调用合约函数。

示例:读取并更新 Storage 合约

scripts/checkStorage.js

该脚本将:
    1.    设置初始值
    2.    读取存储的数值
    3.    将其翻倍并重新写入
    4.    再次读取验证结果

运行:

node scripts/checkStorage.js

请确保已替换:
    •    INSERT_MNEMONIC
    •    INSERT_CONTRACT_ADDRESS

接下来可以做什么?

掌握 Ethers.js 与 Polkadot Hub 的基础用法后,你可以进一步:
    •    深入了解 Ethers.js 高级功能(钱包管理、消息签名等)
    •    实现 批量交易(batch transactions)
    •    结合 Next.js / Node.js 构建完整的全栈去中心化应用(dApp)

原文链接:https://docs.polkadot.com/smart-contracts/libraries/ethers-js/

自学Vue开发Dapp去中心化钱包(四) Vue,MetaMask,ethers.js 阅读详情

相关推荐

使用 React+ethers.js 开发智能钱包

Web3 中的各类 DApp,都需要与智能合约进行交互。如果用原生 JS 来做这些事会很麻烦。这时就需要使用专属的 SDK。目前 JS 环境中有两个主流的库可以用来和智能合约进行交互,一个是 web3.js,另一个是 ethers.js。由于在本地部署一个区块链节点的成本并不低,很少会有人真的部署一个节点,而是选择使用节点即服务。这类服务有很多,比如老牌的 Alchemy、Infura、Moralis 以及今年估值 102 亿美金的新秀 Tenderly。

军火库 3308

ether.js的基本使用

Ethers是什么? ethers.js 库旨在成为一个完整而紧凑的库,用于与以太坊区块链及其生态系统进行交互。它最初是为与ethers.io一起使用而设计的,后来扩展为一个更通用的库。 ether.js初体验 安装 Ethers 的各种类和函数可以从 @ethersproject 组织下的子包中手动导入,但对于大多数项目来说,伞形包(umbrella package)是最简单的入门方式。 npm install --save ethers 默认下载最新版本包。 引入依赖 Node

CamphorBlossom的博客 2万+

Ethers.js vs Wagmi 的差异

Ethers.js与Wagmi对比摘要 Ethers.js需手动管理signer、provider和错误处理,代码量较多;而Wagmi作为现代库,自动处理钱包连接、签名和网络切换,内置缓存与重试机制。技术层面,Wagmi提供强类型支持、响应式数据和多链RPC故障转移,开发体验更优。安全性上,Wagmi内置地址验证和交易确认,错误处理结构化。整体而言,Wagmi通过封装复杂逻辑,显著减少代码量(从20行缩减至5行),提升开发效率与可靠性。

Bruce__taotao的博客 634

ethers.js1:ethers的安装和使用

ethers.js是一个完整而紧凑的开源库,用于与以太坊区块链及其生态系统进行交互。如果你要写Dapp的前端,你就需要用到ethers.js。与更早出现的web3.jsethers.js大小为116.5 kB,而web3.js为590.6 kB。Web3.js认为用户会在本地部署以太坊节点,私钥和网络连接状态由这个节点管理(实际并不是这样);ethers.js中,Provider提供器类管理网络连接状态,Wallet钱包类管理密钥,安全且灵活。原生支持ENS。

fdbright的博客 2988

Web3.js 与 Ethers.js 对比实战:如何优雅调用智能合约方法?

本文对比了Web3.js和Ethers.js两种主流JavaScript库在调用智能合约方法时的差异。Web3.js功能全面但体积较大,API较复杂,适合需要全面支持的开发者;Ethers.js则更轻量简洁,设计现代化,适合前端DApp开发。通过Storage合约示例,文章展示了两种库的安装、节点连接、合约调用方法(get读取和set写入),并对比了它们的优缺点。总体而言,Web3.js更适合传统复杂项目,而Ethers.js凭借其高效简洁正成为开发者的新选择。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 752

55、使用 Vue.js 和 Ethers.js 实现 DApp 前端

本文详细介绍了如何使用 Vue.js 和 Ethers.js 构建 DApp 前端,涵盖项目搭建、ethers.js 集成、组件实现、事件处理与本地测试全流程。通过 App.vue 和 Vote.vue 的开发,展示了与智能合约交互的完整逻辑,并提供了代码复用优化方案与常见问题解决方案,帮助开发者高效构建去中心化应用前端。

java5的博客 105

web3.js 和 ethers.js 的区别

由第三方开发者(Richard Moore)主导开发,设计理念是 “轻量、模块化、安全”,专注于核心功能的简洁实现,避免冗余,API 更符合现代 JavaScript 开发习惯。作为以太坊官方早期推出的库,设计上更偏向 “全面覆盖”,试图包含所有可能的区块链交互功能,API 风格相对冗余,更像是对以太坊 JSON-RPC 接口的直接封装。体积较大(v1.x 压缩后约 400KB+),依赖较多,引入后可能增加前端项目的打包体积,对性能敏感的场景(如移动端)不够友好。,适合追求开发效率和安全性的新项目。

jialiang808的博客 825

ARM的CI-700和Arteris的NoC对比

设计理念:CI-700注重于为移动和客户端SoC提供定制化的互连解决方案,而Arteris的NoC更侧重于提供灵活、可配置的网络互连技术,适用于多种应用场景。性能与功耗:CI-700通过系统级缓存和网状拓扑结构优化性能和功耗,而Arteris的NoC通过物理感知和多协议支持来提升性能和降低功耗。功能安全:Arteris的NoC提供了功能安全支持,这对于汽车和工业应用尤为重要,而CI-700虽然也关注安全性,但未明确提及功能安全支持。互操作性。

ygyglg的专栏 2623

Web3.js和Ethers.js的区别

选择Web3.js还是Ethers.js,取决于你的具体需求和开发偏好。如果你是初学者或希望快速上手,Ethers.js是一个不错的选择。如果你需要高度定制化的功能或对底层原理有深入了解,Web3.js是一个更合适的选择。如果你的项目需要高性能,Ethers.js可能是一个更好的选择。总的来说,Ethers.js在易用性和性能方面具有优势,而Web3.js则在功能全面性和社区支持方面更胜一筹。

dt_dev的博客 644

IntelliJ IDEA 2025.1 + Gradle 镜像配置避坑指南:解决依赖下载慢的终极方案

本文针对IntelliJ IDEA 2025.1开发环境中Gradle依赖下载缓慢的问题,提供了详细的镜像配置避坑指南。通过解析Gradle依赖解析机制,重点指导如何正确配置阿里云等国内镜像仓库,并分享验证配置生效、排查常见错误及高级优化技巧,旨在彻底解决依赖下载难题,提升开发效率。

weixin_28835551的博客 532

LangFuse部署与实践

LangFuse的原理主要是基于可观察性和分析技术来监控和优化低延迟消息(LLM)应用。它提供了一套完整的解决方案,通过收集、处理和分析LLM应用在运行过程中产生的各种数据,来生成实时的、深入的、可操作的见解。通过提供实时的、深入的见解和可视化的跟踪功能,LangFuse使得识别和解决应用性能问题变得更加简单和高效。总的来说,LangFuse的原理是通过综合运用可观察性和分析技术,来提供对LLM应用的全面监控和优化能力。这使得开发者和运维团队能够更加高效地管理和维护他们的应用,从而提升用户体验和业务效益。

pumpkin84514的博客 7945

Ethers.js 的讲解

Ethers.js是以太坊区块链开发的JavaScript工具包,充当开发者与区块链之间的"翻译官"。它提供四大核心功能:连接钱包网络、查询链上数据、发送交易、监听智能合约事件。通过模块化设计,开发者能轻松实现账户交互、合约调用等操作。相比web3.js,Ethers.js具有更清晰的API设计、更好的TypeScript支持和更小的包体积。使用时应遵循安全规范:避免前端暴露私钥、合理设置Gas费用、充分测试交易逻辑。作为现代区块链开发的首选工具之一,Ethers.js显著降低了Web3

leohu0723的博客 694

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5500

js移除某个样式_以太坊 JavaScript 库:web3.js 与 ethers.js 比较(第一部分)

Web3.js 和 ethers.js 都是 JavaScript 库,其作用是使开发者可以与以太坊区块链交互。这两个库都很实用,都能满足大多数以太坊开发者的需求。本文将重点围绕 web3.js 和 ethers.js 的相同点和不同点来对它们进行比较,以便你能更好地理解它们的细微区别。本文的目的是帮助开发者理解两个库的优缺点,以便能够决定哪个库适合其具体用例。本文中提供了一些资源,可能...

weixin_42433737的博客 592

E2000 RGMII0通讯异常问题总结

飞腾E2000 RGMII接YT8521,RGMII0路不通问题。

乌拉大喵喵 1630

Replay音频转换时samplerate缺失的解决方案指南

Replay音频转换时提示"No module named 'samplerate' This error is lazily reported, having originally occured in File"的解决方案

weixin_47445543的博客 2134

javascript 三个点_以太坊 JavaScript 库:web3.js 与 ethers.js 比较(第一部分)

Web3.js 和 ethers.js 都是 JavaScript 库,其作用是使开发者可以与以太坊区块链交互。这两个库都很实用,都能满足大多数以太坊开发者的需求。本文将重点围绕 web3.js 和 ethers.js 的相同点和不同点来对它们进行比较,以便你能更好地理解它们的细微区别。本文的目的是帮助开发者理解两个库的优缺点,以便能够决定哪个库适合其具体用例。本文中提供了一些资源,可能...

weixin_36256707的博客 3182

【Qt图书管理系统】5.完整版源码及下载地址

Qt图书管理系统完整源码下载。

小鱼酱的博客 7001

一文看懂 ethers.js:区块链开发

ethers.js 就是一个 JavaScript 库(可以理解为一堆写好的工具函数),专门用来帮你和以太坊(以及类似的区块链,比如 BSC、Polygon 这些)打交道。

u010130947的专栏 852

RK3568笔记六十一:MIPI摄像头应用程序编写

V4L2设备驱动框架向应用层提供了一套统一、标准的接口规范,应用程序按照该接口规范来进行应用编程,从而使用摄像头。对于摄像头设备来说,其编程模式如下所示:1.首先是打开摄像头设备;2.查询设备的属性或功能;3.设置设备的参数,譬如像素格式、帧大小、帧率;4.申请帧缓冲、内存映射;5.帧缓冲入队;6.开启视频采集;7.帧缓冲出队、对采集的数据进行处理;8.处理完后,再次将帧缓冲入队,往复;9.结束采集。

1004

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Web3.js 和 Ethers.js 的主要区别

选择哪个库取决于你的项目需求和个人偏好。一般来说,Ethers.js 是一个更现代化、更易于使用的选择。如果你对 Web3.js 已经比较熟悉,也可以继续使用它。建议:根据你的项目规模、复杂度和时间限制,选择合适的库。如果你的团队成员对 TypeScript 更熟悉,那么 Ethers.js 可能是一个更好的选择。可以尝试使用这两个库,看看哪个更适合你的开发风格。无论你选择哪个库,掌握以太坊开发的基础知识都是非常重要的。这包括 Solidity 智能合约编程、区块链原理等。

weixin_47467357的博客 719

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Ethers.js-BigInt和单位转换

Ethers.js-BigInt和单位转换

Geoffrey_Zhu的博客 623

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ethers.js-5–和solidity的关系

ethers.js 用的是 Solidity 编译出来的 bytecode + ABI,来在链上部署(deploy)或调用(call / sendTransaction)合约。它们好像都能做一样的事?• 如果你在 Solidity 合约里根本没写 mint,那么 ethers.js 就算想 mint(),链上也不会有这个函数可调用。• 例如:你的前端写的 mint() 就依赖 Solidity 里有 mint 函数。• 它可以发起 mint,但只是调用 Solidity 合约里写好的 mint()。

wdy00000的博客 915

ethers.js学习笔记

ethers.js是一个现代化的用于以太坊的js库,用于替代老旧的web3.js。

多看多听多总结 112

ethers.js - 读取链上某个ERC20合约相关信息

本文介绍了如何使用ethers.js读取链上ERC20合约信息。主要内容包括:1) ethers.js官方文档参考;2) ERC20标准API说明;3) 示例ERC20合约地址;4) 测试验证过程;5) 完整JavaScript源码。代码演示了如何连接以太坊节点、调用ERC20合约的标准方法(name、symbol、decimals、totalSupply)以及查询特定地址的代币余额。文章提供了完整的代码实现,适合开发者快速上手与ERC20合约交互。

杨杨杨~~的博客 308

ethers.js读取合约信息

如果你只需要读取特定功能(例如代币余额),可以使用(人类可读 ABI),这比复杂的 JSON 格式要简洁得多。// 合约地址。

weixin_45825917的博客 466
上一篇: XCM 预编译(XCM Precompile)
下一篇: 如何使用 Web3.py 与 Polkadot Hub 进行交互
devmoon
博客等级 码龄1年 9粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值