JavaScript 应用编程接口库
页面最后更新: 2025年10月22日
为了让 Web 应用程序能与以太坊区块链交互(即读取区块链数据和/或向网络发送交易),它必须连接到一个以太坊节点。
为此,每个以太坊客户端都实现了 JSON-RPC 规范,因此有一套统一的方法可供应用程序依赖。
如果你想要用 JavaScript 连接到一个以太坊节点, 可以使用原生 JavaScript,不过生态系统中存在一些方便的库,使得这个事情变得更加容易。 借助这些程序库,开发者可以编写直观的单行方法来初始化与以太坊交互的 JSON-RPC 请求(在后台运行)。
请注意,自合并后,运行一个节点需要两个相互连接的以太坊软件:一个执行客户端和一个共识客户端。 请确保你的节点同时包含执行客户端和共识客户端。 如果你的节点不在本地计算机上(例如,你的节点在 AWS 实例上运行),请相应地更新教程中的 IP 地址。 欲了解更多信息,请参阅我们关于运行节点的页面。
前提条件
除了理解 JavaScript,了解以太坊技术栈和以太坊客户端也可能对您有帮助。
为什么要使用库?
这些库降低了与一个以太坊节点直接交互的复杂性。 它们还提供实用功能(例如,将 ETH 转换为 Gwei),这样,作为开发者,你就可以花更少的时间处理以太坊客户端的复杂性,而将更多时间专注于应用程序的独特功能。
库功能
连接到以太坊节点
使用提供程序,这些库允许你连接到以太坊并读取它的数据,不管是通过 JSON-RPC、INFURA、Etherscan、Alchemy 还是 Metamask。
**警告:**Web3.js 已于 2025 年 3 月 4 日归档。 阅读公告opens in a new tab。 对于新项目,请考虑使用 ethers.jsopens in a new tab 或 viemopens in a new tab 等替代库。
Ethers 示例
1// BrowserProvider 封装了一个标准的 Web3 提供程序,2// MetaMask 将其作为 window.ethereum 注入每个页面3const provider = new ethers.BrowserProvider(window.ethereum)45// MetaMask 插件还允许对交易进行签名,6// 以便发送以太币和支付费用来改变区块链内的状态。7// 为此,我们需要帐户签名者...8const signer = provider.getSigner()Web3js 示例
1var web3 = new Web3("http://localhost:8545")2// or3var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))45// change provider6web3.setProvider("ws://localhost:8546")7// or8web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546"))910// Using the IPC provider in node.js11var net = require("net")12var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // mac os path13// or14var web3 = new Web3(15 new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net)16) // mac os path17// on windows the path is: "\\\\.\\pipe\\geth.ipc"18// on linux the path is: "/users/myuser/.ethereum/geth.ipc"显示全部一旦设置,你将能够查询区块链的以下内容:
- 区块号
- 燃料估算
- 智能合约事件
- 网络 ID
- 以及更多...
钱包功能
这些库为你提供了创建钱包、管理密匙和签署交易的功能。
这里提供了 Ethers 中的一个示例
1// 从助记词创建钱包实例…2mnemonic =3 "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol"4walletMnemonic = Wallet.fromPhrase(mnemonic)56// ……或从私钥创建7walletPrivateKey = new Wallet(walletMnemonic.privateKey)89walletMnemonic.address === walletPrivateKey.address10// true1112// 根据签名者 API,地址是一个 Promise13walletMnemonic.getAddress()14// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' }1516// 钱包地址也可同步获得17walletMnemonic.address18// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1'1920// 内部加密组件21walletMnemonic.privateKey22// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db'23walletMnemonic.publicKey24// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64'2526// 钱包助记词27walletMnemonic.mnemonic28// {29// locale: 'en',30// path: 'm/44\'/60\'/0\'/0/0',31// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol'32// }3334// 注意:用私钥创建的钱包35// 没有助记词(派生过程阻止了它)36walletPrivateKey.mnemonic37// null3839// 签署消息40walletMnemonic.signMessage("Hello World")41// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' }4243tx = {44 to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72",45 value: utils.parseEther("1.0"),46}4748// 签署交易49walletMnemonic.signTransaction(tx)50// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' }5152// connect 方法返回连接到53// 提供者的新钱包实例54wallet = walletMnemonic.connect(provider)5556// 查询网络57wallet.getBalance()58// { Promise: { BigNumber: "42" } }59wallet.getTransactionCount()60// { Promise: 0 }6162// 发送以太币63wallet.sendTransaction(tx)显示全部一旦设置,你将能够:
- 创建帐户
- 发送交易
- 签署交易
- 以及更多...
与智能合约函数交互
JavaScript 客户端库允许你的应用程序通过读取已编译合约的应用程序二进制接口 (ABI) 来调用智能合约函数。
ABI 本质上是以 JSON 格式解释了合约的功能,并且允许你像普通 JavaScript 对象一样使用它。
以下 Solidity 合约:
1contract Test {2 uint a;3 address d = 0x12345678901234567890123456789012;45 constructor(uint testInt) { a = testInt;}67 event Event(uint indexed b, bytes32 c);89 event Event2(uint indexed b, bytes32 c);1011 function foo(uint b, bytes32 c) returns(address) {12 Event(b, c);13 return d;14 }15}显示全部将会产生以下 JSON 代码:
1[{2 "type":"constructor",3 "payable":false,4 "stateMutability":"nonpayable"5 "inputs":[{"name":"testInt","type":"uint256"}],6 },{7 "type":"function",8 "name":"foo",9 "constant":false,10 "payable":false,11 "stateMutability":"nonpayable",12 "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}],13 "outputs":[{"name":"","type":"address"}]14 },{15 "type":"event",16 "name":"Event",17 "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}],18 "anonymous":false19 },{20 "type":"event",21 "name":"Event2",22 "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}],23 "anonymous":false24}]显示全部这意味着你可以:
- 发送一笔交易到指定的智能合约上,并执行智能合约上的方法
- 调用方法去评估对燃料的需求量。这个方法的执行是在以太坊虚拟机中执行的。
- 部署一个合约
- 以及更多...
实用函数
这些实用功能为你提供了方便的快捷操作,让以太坊的构建变得更轻松一些。
以太币的默认价值单位是 Wei。 1 个以太币 = 1,000,000,000,000,000,000 WEI – 这意味着你需要处理很多的数字。 web3.utils.toWei 可将以太币转换为 Wei。
在 ethers 中,它看起来是这样的:
1// 获取帐户中的资产(通过地址或者 ENS 名)2balance = await provider.getBalance("ethers.eth")3// { BigNumber: "2337132817842795605" }45// 通常来说开发者可能会需要为用户格式化一下输出6// 用户更喜欢以 ether(而非 wei)表示的价值7ethers.utils.formatEther(balance)8// '2.337132817842795605'可用程序库
Web3.js - 以太坊 JavaScript API。
Ethers.js - 在 JavaScript 和 TypeScript 中完整的以太坊钱包实现和实用工具。
The Graph - 一种用于索引以太坊和 IPFS 数据并使用 GraphQL 查询的协议。
- The Graphopens in a new tab
- Graph浏览器opens in a new tab
- 文档opens in a new tab
- GitHubopens in a new tab
- Discordopens in a new tab
Alchemy SDK - 围绕 Ethers.js 构建的、具有增强版 API 的封装器。
viem - 以太坊的 TypeScript 接口。
Drift - 带有内置缓存、挂钩和测试模拟功能的 TypeScript 元库。
扩展阅读{#further-reading}
你还知道哪些对你有帮助的社区资源? 请编辑本页面并添加进来!
相关话题
相关教程
- 设置 Web3.js 以在 JavaScript 中使用以太坊区块链 – 在项目中设置 web3.js 的说明。
- 从 JavaScript 调用智能合约 – 使用 DAI 代币,了解如何用 JavaScript 调用合约函数。
- 使用 web3 和 Alchemy 发送交易 – 从后端发送交易的分步指南。