5月29日 01:09
Web3 前端如何与后端服务协作?有哪些典型场景?
Web3 前端与后端的协作围绕链上和链下两条数据通路展开。链上交互通过钱包连接(window.ethereum)直接调用智能合约的 view/pure 方法读取状态、通过用户签名发送交易;链下交互则走传统 REST/GraphQL API,由后端代理聚合数据、管理会话、处理敏感逻辑。典型场景有五个:一是钱包身份验证——前端获取钱包地址并签名消息,后端验证签名后签发 JWT;二是读取合约状态——前端直接调用 view 函数或通过后端缓存聚合;三是发送交易——前端构造交易参数由用户在钱包确认签名,后端监听链上事件确认结果;四是事件监听——后端订阅合约事件(Transfer、Approval 等)通过 WebSocket 推送前端;五是链上数据索引——使用 The Graph 等索引服务将链上事件转为可查询的 GraphQL API,避免前端直接扫描区块。
追问
- 前端直接调用合约 view 函数和通过后端代理读取各有什么优劣?何时选哪种?
- 用户签名消息的 EIP-712 标准是什么?比普通个人签名好在哪里?
- The Graph 的工作原理是什么?subgraph 如何定义和部署?
- 如何处理后端服务宕机时前端的降级策略?能否直接切换到 RPC 节点?
- 多链 DApp 中如何管理不同链的 provider 和合约实例?
写段代码
javascript// 前端连接钱包并签名验证 const accounts = await window.ethereum .request({ method: 'eth_requestAccounts' }); const signer = new ethers.BrowserProvider( window.ethereum ).getSigner(); const signature = await signer .signMessage('login-nonce-123'); // 将 address + signature 发给后端验证