进阶 docs.web3js.org 2026-10-19 02:32:29 · 11 阅读

第3章 web3.js 术语表

GlossaryProvider​ 在 web3.js 中,provider(提供者)是一个负责以不同方式连接以太坊网络的组件。它让 Web 应用能够连接到以太坊节点。web3.js 提供了多种类型的 provider,包括 HTTP、WebSocket 和 IPC,每种都有其特定的特性和使用场景。需要注意的是,provider 本身仅提供链的只读访问权限,它不使用任何私钥或账户进行交互。这种只读功能特别适合在不需私钥授权的情况下查询数据或调用链。 Accounts​ 在 web3.js 中,account(账户)允许你在链上执行操作,例如发送交易、签署数据以及与合约交互。它是直接使用私钥执行各种链操作的必要组成部分。在其他库中,这一概念通常被称为 signer(签名者)。术语的不同并不改变其根本目的,即提供一种安全且直接的方式来管理以太坊相关操作。 Wallet​ web3.js 中的 wallet(钱包)可以存储多个账户。此功能允许你管理用于不同操作的各种私钥。当使用诸如 web3.eth.sendTransaction() 或 web3.eth.contract.methods.doSomething().send({}) 等方法时,web3.js 底层会通过钱包账户来处理这些交易。本质上,钱包使协调多个账户以便更顺畅地进行以太坊操作变得更加容易。 Contract​ Contract 类是 web3-eth-contract 包中的一个重要类,在 web3 包中也可用。它作为对以太坊网络上特定合约连接的抽象表示,使应用程序能够将其像典型的 JavaScript 对象一样进行交互。通过 Contract 类,你可以执行与智能合约相关的函数并监听事件(例如 contract.methods.doSomething().call())。 JSON Interface (ABI)​ JSON 接口是一个描述以太坊智能合约应用二进制接口(ABI)的 JSON 对象。 使用此 JSON 接口,web3.js 能够通过 web3.eth.Contract 对象创建代表智能合约的 JavaScript 对象,包含其方法和事件。 Functions​ type: "function","constructor"(可省略,默认为 "function";"fallback" 也有可能,但在 web3.js 中不相关); name: 函数的名称(仅函数类型中存在); constant: 如果指定函数不修改链状态,则为 true; payable: 如果函数接受 ether,则为 true,默认为 false; stateMutability: 一个字符串,取以下值之一:"pure"(指定不读链状态)、"view"(同上)、"non-payable" 和 "payable"(同上); inputs: 一个对象数组,每个对象包含: -- name: 参数名称; -- type: 参数的规范类型。 outputs: 一个对象数组,与 inputs 相同,如果没有输出则可省略。 Events​ type: 总是 "event" name: 事件名称; inputs: 一个对象数组,每个对象包含: name: 参数名称; type: 参数的规范类型。 indexed: 如果字段是日志主题(topics)的一部分,则为 true;如果是日志数据段(data segment)的一部分,则为 false。 anonymous: 如果事件被声明为匿名,则为 true。 Example​ Solidity 合约pragma solidity ^0.8.4;

contract Test {
uint256 a;
address d = 0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF;

constructor(uint256 testInt) {
a = testInt;
}

event Event(uint256 indexed b, bytes32 c);

event Event2(uint256 indexed b, bytes32 c);

function foo(uint256 b, bytes32 c) public returns (address) {
emit Event(b, c);
return d;
}
}

生成的 JSON ABI[
{
"type": "constructor",
"stateMutability": "nonpayable",
"inputs": [{ "internalType": "uint256", "name": "testInt", "type": "uint256" }]
},
{
"type": "event",
"name": "Event",
"inputs": [
{ "indexed": true, "internalType": "uint256", "name": "b", "type": "uint256" },
{ "indexed": false, "internalType": "bytes32", "name": "c", "type": "bytes32" }
],
"anonymous": false
},
{
"type": "event",
"name": "Event2",
"inputs": [
{ "indexed": true, "internalType": "uint256", "name": "b", "type": "uint256" },
{ "indexed": false, "internalType": "bytes32", "name": "c", "type": "bytes32" }
],
"anonymous": false
},
{
"type": "function",
"name": "foo",
"stateMutability": "nonpayable",
"inputs": [
{ "internalType": "uint256", "name": "b", "type": "uint256" },
{ "internalType": "bytes32", "name": "c", "type": "bytes32" }
],
"outputs": [{ "internalType": "address", "name": "", "type": "address" }]
}
]
Proxy(代理)​ Web3.js 中的 proxy 是应用与 Ethereum 节点之间的中间层,通过转发请求和响应来实现通信。配置 proxy 有助于突破网络限制、增强安全性并改善负载均衡。在 Web3.js 中,可以通过 HttpProvider 或 WebSocketProvider 来设置 proxy。 HttpProvider​ Web3.js 的 HttpProvider 通过 HTTP 将应用连接到 Ethereum 节点,可用于发送交易、读取区块链数据以及与智能合约交互。只需用节点的 URL 创建一个 Web3 实例即可建立连接。对于需要与区块链交互的 DApp 来说它是必不可少的,但它可能会阻塞事件循环,因此在需要实时通信的场景下,可以改用 WebSocketProvider 等方案以获得更好的性能。 import { Web3 } from 'web3';
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));
WebSocketProvider Web3.js 中的 WebSocketProvider 通过 WebSocket 协议将应用连接至以太坊节点,支持实时及异步通信。它是需要实时监控新块或智能合约事件等更新的应用的理想选择。相较于 HttpProvider,该 Provider 在高吞吐量场景下性能更优。对于暴露的端点,务必使用 wss:// 确保连接安全,并妥善实现重连逻辑以保障系统稳定运行。 WebSocketProvider 示例 import { Web3 } from 'web3';
const web3 = new Web3(new Web3.providers.WebsocketProvider('ws://localhost:8546'));
Events Web3.js 中的 Events 类是库的核心组件,使开发者能够与以太坊网络中智能合约发出的事件进行交互并监听它们。智能合约中的事件类似于日志或消息,合约通过它们向外通知特定操作或状态变更。Web3.js 提供了一套完备的工具来处理这些事件,从而支持构建响应迅速且交互性强的去中心化应用(dApps)。 示例 Solidity 中的事件 contract MyContract {
event Transfer(address indexed from, address indexed to, uint256 value);

function transfer(address recipient, uint256 amount) public {
// ... transfer logic ...
emit Transfer(msg.sender, recipient, amount);
}
}

Web3.js 中的事件 import { Web3 } from 'web3';
const MyContract = require('./MyContract.json'); // Assuming ABI is loaded

const web3 = new Web3('wss://mainnet.infura.io/v3/YOUR_INFURA_ID'); // Replace with your provider URL
const contractAddress = '0x...'; // Replace with your contract address

const myContract = new web3.eth.Contract(MyContract.abi, contractAddress);

const transferEvent = myContract.events.Transfer(); // Access the Transfer event

transferEvent.on('data', event => {
console.log('Transfer Event:', event);
// Process the event data (from, to, value)
});
Event logs Web3.js 中的日志(Logs)是以太坊交易的一部分,记录了智能合约内部触发的事件信息。它为区块链上的关键事件提供了记录与检索机制。事件日志在追踪状态变更及调试方面尤为实用。 示例 import { Web3 } from 'web3';
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID');

const options = {
fromBlock: 0,
toBlock: 'latest',
address: '0xYourContractAddress',
topics: [
web3.utils.sha3('Transfer(address,address,uint256)')
]
};

web3.eth.getPastLogs(options)
.then((logs) => {
console.log(logs);
})
.catch((error) => {
console.error('Error retrieving logs:', error);
});
`

评论 (0)