在 Web3 世界中,“发送请求”是一个比传统 Web2 更复杂的过程——它不仅涉及前端与后端的交互,更需要与区块链节点、智能合约、去中心化网络(如 IPFS)等底层设施协作,无论是用户发起交易、查询链上数据,还是与 dApp(去中心化应用)交互,本质上都是通过特定的协议和工具,将“请求”转化为链上可识别的指令,并最终达成状态变更或数据获取,本文将从核心逻辑、技术实现、工具链和实际场景四个维度,拆解 Web3 中“发送请求”的全流程。
Web3 请求的核心逻辑:从“中心化”到“去中心化”的范式转变
传统 Web2 中,用户请求(如登录、获取数据)通常发送到中心化服务器,服务器处理后返回结果,整个流程依赖单一可信方,但在 Web3 中,“请求”的本质是对区块链状态的操作或查询,而区块链的“去中心化”特性决定了其请求逻辑需满足三个核心前提:
-
身份验证:通过钱包证明“你是谁”
Web3 中没有传统账户体系,用户的身份由“钱包地址”(如以太坊的 0x 开头地址)和对应的私钥决定,任何需要用户授权的操作(如转账、调用智能合约),都必须通过钱包(如 MetaMask)对请求进行签名,以证明操作者是该地址的合法控制者。 -
节点交互:连接区块链的“入口”
区块链作为分布式账本,数据存储在全球成千上万的“节点”中,Web3 应用需要通过“节点”与区块链网络通信——无论是查询交易状态、发送交易,还是调用智能合约,都需先连接到一个节点(可以是全节点、轻节点或第三方服务节点)。 -
状态变更:交易上链与共识
若请求涉及“修改链上状态”(如转账、调用写入函数),则需打包成“交易”广播到网络,由矿工/验证者打包并经过共识机制确认后,状态才真正变更;若请求仅“查询链上数据”(如读取账户余额、调用智能合约只读函数),则可直接通过节点获取,无需上链。
Web3 请求的技术实现:从用户操作到链上确认的完整链路
请求起点:用户交互与钱包授权
Web3 应用的入口通常是前端界面(如 React + Ether.js/VIem),用户点击“连接钱包”“转账”“调用合约”等按钮时,会触发钱包的授权流程,以最常见的前端钱包交互为例:
- 当用户点击“连接钱包”时,前端通过
window.ethereum.request({ method: 'eth_requestAccounts' })向浏览器扩展钱包(如 MetaMask)发起请求,钱包会弹出窗口提示用户授权,若用户同意,则返回钱包地址和签名公钥,前端完成身份绑定。 - 若用户发起的是交易(如发送 ETH),前端需调用钱包的
eth_sendTransaction方法,并传入接收地址、金额、Gas 等参数,钱包会对交易内容进行签名(用私钥对交易哈希签名),然后将签名后的交易广播到区块链网络。
传输层:节点协议与数据格式
前端与区块链节点的通信依赖特定协议,目前主流的是 JSON-RPC(以太坊及兼容链的标准)和 GraphQL(部分链如 Celestia 用于查询数据)。
-
JSON-RPC:一种轻量级的远程过程调用协议,通过 HTTP 或 WebSocket 传输,Web3 应用向节点发送 JSON 格式的请求,节点处理后返回 JSON 响应,常见方法包括:
eth_blockNumber:获取最新区块号;eth_getBalance:查询账户余额;eth_sendRawTransaction:发送已签名的原始交易;eth_call:静态调用智能合约(只读,不产生交易)。
查询地址
0x123...的余额,前端可通过节点发送如下请求:{ "jsonrpc": "2.0", "method": "eth_getBalance", "params": ["0x123...", "latest"], "id": 1 }节点返回:
{"jsonrpc":"2.0","id":1,"result":"0x1a05..."}(十六进制余额)。 -
GraphQL:适用于复杂查询场景,支持按需获取数据,避免传统 RESTful 的“过度获取”问题,Subgraph(The Graph 协议)通过 GraphQL 让前端高效查询链上索引数据(如某 NFT 的转移历史)。
核心执行:智能合约交互与 Gas 机制
若请求涉及链上状态变更(如调用智能合约的 transfer 函数),核心流程包括:
- 构建交易:前端需确定目标合约地址、函数签名、参数(如转账金额)、Gas 限制(Gas Limit,预计交易消耗的 Gas 量)和 Gas 价格(Gas Price,单位 Gas 的费用,决定交易优先级)。
- 签名交易:钱包用私钥对交易数据进行签名(确保交易不可篡改),生成原始交易(Raw Transaction)。
- 广播交易:通过
eth_sendRawTransaction将交易广播到 P2P 网络,节点验证交易签名后,将其放入内存池(Mempool)等待打包。 - 交易确认:矿工/验证者从 Mempool 中选取交易打包进区块,并通过共识机制(如以太坊的 PoS)确认,最终交易上链,状态变更完成。
Gas 机制是关键:用户需支付 Gas 费以补偿节点打包交易的算力成本,Gas 费由 Gas Limit × Gas Price 决定,若 Gas Limit 不足,交易会失败;若 Gas Limit 过高,剩余 Gas 会退还。
数据获取:链上状态与链下存储
Web3 请求的另一类是“获取数据”,包括:
- 链上数据:直接通过节点或浏览器(如 Etherscan)查询,如交易记录、合约状态、账户余额等,数据由区块链共识保证不可篡改。
- 链下数据:部分数据(如 NFT 图片、dApp 前端资源)存储在去中心化存储网络(如 IPFS、Arweave)或中心化服务器(需信任第三方),前端通过链上存储的“指针”(如 IPFS 的 CID)获取链下数据,ERC721 NFT 的
tokenURI返回的是 IPFS 地址,前端通过网关(如 ipfs.io)读取图片。
Web3 请求的工具链:从开发到用户的“基础设施”
实现 Web3 请求离不开成熟的工具链,它们简化了与区块链交互的复杂度:
前端库:封装节点交互与钱包调用
- Ether.js:老牌以太坊库,提供
Provider(连接节点)、Signer(签名账户)、Contract(合约实例)等核心对象,支持简洁的 API 发送交易、查询数据。import { ethers } from "ethers"; const provider = new ethers.BrowserProvider(window.ethereum); // 通过钱包连接节点 const signer = await provider.getSigner(); // 获取签名账户 const contract = new ethers.Contract(contractAddress, abi, signer); // 合约实例 const tx = await contract.transfer(receiverAddress, amount); // 调用合约函数 await tx.wait(); // 等待交易确认 - VIem:新兴以太坊库,以轻量、高性能著称,支持 TypeScript,API 设计更现代化,是 Ether.js 的有力竞争者。
- Web3.js:以太坊官方库,功能全面但 API 较为冗余,逐渐被 Ether.js/VIem 替代。
钱包:用户身份与请求入口
- 浏览器扩展钱包:MetaMask(最主流)、Trust Wallet、Brave Wallet,提供浏览器注入的
window.ethereum对象,让前端调用钱包 API。
- 硬件钱包:Ledger、Trezor,私钥离线存储,需通过 USB/蓝牙连接电脑,安全性更高,适合大额交易。
- 移动端钱包:MetaMask App、Trust Wallet,支持手机扫码签名,适配移动端 dApp。
节点服务:连接区块链的“桥梁”
开发者无需自己运行节点,可通过第三方服务快速接入:
- Infura:以太坊官方推荐节点服务商,提供 HTTP、WebSocket、WebSocket (Auth) 等接口,支持以太坊、Polygon、Arbitrum 等多链。
- Alchemy:高性能节点服务,提供强大的数据监控、交易追踪等功能,开发者友好。
- QuickNode:支持多链,提供低延迟