(九)web3面试题第二弹

(九)web3面试题第二弹

viEcho Lv5

1.erc20、erc721、erc1155还有其他哪些类型的合约 它们有啥区别?应用场景是啥?

ERC20–同质化代币,稳定币;项目方发行的token,gameFi游戏货币,治理代币,奖励代币挖矿空投等

ERC721(含 721A,批量铸造节省90%gas费)–数藏,链上凭证,游戏装备(非同质化)

ERC1155–游戏道具,可批量铸造和转账,半同质化资产(例如门票,同场次id不同座位不同id)

ERC165–接口检测,NFT 市场判断是否支持 721/1155,合约间安全检查,插件式合约设计

EIP-2612(Permit)–用户免手续费批准 token,Walletless onboarding(无钱包注册),Gasless 授权

ERC-2981(NFT版税)–NFT 创作者抽成,音乐 NFT 收益分配,内容 NFT 创作者收益

ERC-4626(Vault 金库)–DeFi 存款收益池,自动化收益策略,质押凭证代币,稳定币收益池(一句话总结: “把钱存进池子→拿 share” 的模式都是 4626。)

ERC-4337(Account Abstraction)–社交恢复钱包;不需要助记词的账户(World App(Worldcoin 钱包);Gas 代付,策略型钱包(自动化)
自动扣款、自动 DCA 买币;多签 / 权限控制钱包(企业钱包、DAO 多签)

⚡ 进阶(看方向)
ERC-4907(租赁 NFT)–游戏角色租赁(租别人帐号/角色一段时间);NFT 会员卡按天出租(类似「健身卡」的临时授权);共享资源(链上房间/设备使用权)

ERC-5234/5791(动态 NFT)–游戏角色升级(等级、装备、经验动态变更);活动徽章逐步进化(POAP → 达成条件 → 升级版 NFT);身份徽章(DID)(链上信用逐步提高);实时反映链上状态(清算、负债、抵押状态变化)

ERC-721C(受控可转移 NFT)–限制 NFT 在市场转卖(防倒卖);游戏内 NFT 只能留在游戏生态(游戏内 NFT 只能留在游戏生态);遵守监管要求(可冻结、可限制特定区域交易)

协议 一句话用途
ERC20 同质化代币
ERC721 独特 NFT
ERC721A 低 gas NFT mint
ERC1155 游戏多资产
ERC165 接口检测
EIP-2612 离线授权 approve
ERC-2981 NFT 版税
ERC-4626 DeFi 金库
ERC-4337 智能钱包(AA)
ERC-4907 NFT 出租
ERC-5234/5791 动态 NFT
ERC-721C 可控转移 NFT

RC721 和 ERC721A 最大区别是什么?为什么 721A Gas 更低?

ERC721A 优化了批量 mint:多个 token 同时 mint 只更新一次 owner 数据。

通过 bitpacking、startTokenId 映射、减少存储操作降低 gas。

ERC1155 为什么比 ERC721 更适合 GameFi?

支持批量 mint 和 batch transfer(节省 80% Gas)。

一个合约支持多资产 ID(武器/皮肤/材料)。

可同时支持同质化、半同质化、非同质化资产

FT (ERC20) 和NFT(ERC721) 的区别?

FT是”商品货币” → 重在数量和流通

NFT是”数字产权” → 重在所有权和唯一性

混合型标准:ERC1155

1
2
3
4
5
6
7
8
9
10
contract GameAssets is ERC1155 {
// ID 1: 治疗药水 (FT性质)
// ID 2: 传说武器 (NFT性质)

function tradeAssets() public {
// 可以用1个传说武器换50个治疗药水
_safeTransferFrom(playerA, playerB, 1, 50, ""); // 转移药水
_safeTransferFrom(playerB, playerA, 2, 1, ""); // 转移武器
}
}

2.自动做市商原理

AMM 不是在计算“真实价格”,而是用资金池的比例反映供需变化, 价格由数学公式(like x*y=k)自动调节。不依赖订单簿,而是让用户与合约交易,实现持续报价和流动性。

其本质是利用恒定乘积公式做市商,x*y=k

无常损失

承担的核心风险叫 无常损失(Impermanent Loss)。如果你提供了 ETH + USDC,当 ETH 涨价时:池子会自动卖 ETH(因为别人买)
你回收的 ETH 会比单纯持有 ETH 还少,损失相对价值就是无常损失;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//初始价格:1 ETH = 100 USDC
//k=x0 * ​y0​=1×100=100
// ETH涨价两倍 即1ETH = 200USDC
// 涨价后 x1 y1的关系是 y1 = x1 * 200

x1*(200x1)=100
x1^2 = 0.5
x1​≈0.70710678 ETH
y1 = 200 * x1 ≈141.421356 USDC

//无常损失
//本来是1ETH + 100USDC 涨价后值 300USDC
//做市商后,0.70710678 ETH * 200 + 141.421356 = 282.842712 USD
//那么做市商的无常损失就是 IL=282.842712/300​−1≈−0.057193≈−5.72%

UniswapV2 和UniswapV3(区间做市)的区别?

Uniswap V2 是恒定乘积 AMM,流动性平均分布在全部价格区间,简单但资金效率低。

Uniswap V3 最大的创新是“集中流动性”,LP 可以选择一个价格区间提供流动性,从而大大提升资金利用率和交易深度。

此外,V3 提供多个手续费档位,LP 头寸是 NFT,不再是 ERC20,同样 V3 的预言机更高精度也更省 Gas。

简单来说,V2 易用但低效,V3 更复杂但效率极高,也更符合专业做市的需求

3.LaunchPad项目前期投资和获得收益的。这个份额是怎么计算的

Launchpad 的投资份额按比例分配:你占总池子多少,就给你多少项目代币。而收益取决于上线后的市场价格,而不是你投的金额本身

4.eip191 简单的扩容和算法

EIP-191 定义了一种对任意消息进行签名的格式,用来避免“把普通字符串当成交易签名”的安全问题

算法为任意消息体进行签名时,先讲消息转为字节,然后在前面拼上魔方字节(0x19)+版本号version(0x00或0x45),然后再对整个拼接的消息做keccak256,再用secp256k1私钥签名

1
2
3
4
5
6
7
8
9
10
//假设有人要签 hello:
//先把消息转为 bytes:"hello"

//加上前缀:
0x19 0x00 hello

//做哈希:
msg_hash = keccak256(0x19 0x00 hello)
//使用私钥对 msg_hash 做 ECDSA 签名:
signature = ECDSA_sign(msg_hash)

一句话总结
EIP-191 定义了签名消息的基本格式:0x19 + version + data。
算法就是先拼接前缀,再 keccak,再 secp256k1 签名。
version 字节让它具备扩容能力,比如 EIP-712 就是 version = 0x45 的扩展版

eth_sign为何不安全?

eth_sign 没有把以下信息纳入签名:

  • 链 ID
  • 合约地址
  • 协议版本
  • 用户操作类型

导致:

  • 同一签名可被在 另一个合约 / 链 使用
  • 或者被重放在其他场景执行危险操作

例如:你在某个DApp登录时签的消息,在另一个完全不同的DApp也能用!

作用域隔离Domain Separator的作用

Domain Separator 是 EIP-712 里用来做签名“作用域隔离”的哈希,包含协议名、版本、链 ID、验证合约等信息。它能确保用户的签名与一个特定的 DApp 和链绑定,避免签名被攻击者拿到其他链或其他合约重放,因此是结构化签名最核心的安全保障机制

5.常见的docker命令及dockerfile脚本

Docker Compose:从零基础到实战应用的全面指南

6.现价委托,市价委托,计价委托,OCO?;

Lbank行情

  • 限价委托:指定价格,只有市场价格碰到你这个价位,才会成交
  • 市价委托:没有指定价格,会以当前价格成交
  • 计划委托:先别成交,等价格到了某个点,再自动帮我下单(你需要设置3个东西:触发价(Trigger)、委托方式(限价or市价)、委托价格(如果是限价))
  • OCO 单(One Cancels the Other)——“止盈 + 止损 二合一”
    ✅ 一个止盈单 + 一个止损单
    ✅ 一个成交,另一个自动失效
    tips: 还有行情这里不同分钟的分钟线,会有不同纬度的表和定时任务 需要看看行情对应的接口文档
类型 你控制什么 是否立即成交 主要用途
限价委托 ✅ 价格 ❌ 不一定 挂单、埋伏、吃回调
市价委托 ✅ 速度 ✅ 立刻 追涨杀跌、紧急平仓;价格到了 → 自动帮我下单(市价或限价)
计划委托 ✅ 触发条件 ❌ 先不成交 突破追单、自动开仓
OCO ✅ 风控 取决于行情 止盈 + 止损 双保险

7.订单类型

单向止盈/止损(条件单)– 价格到了某个点 → 只触发一个方向的平仓(单边的计划委托(只止盈或只止损其一)

OCO(双向止盈止损)– 一个止盈 + 一个止损,成交一个自动取消另一个

chase(追逐限价委托,仅交割/永续)– 限价单会自动追着盘口跑(例如买入时自动追着卖1价格成交)

1
2
3
4
系统逻辑是:
当前卖一 = 100,010 → 你的买单自动改成 100,010
如果卖一变成 100,020 → 你的买单自动跟随改为 100,020,直到成交为止
好处:比市价滑点小,比限价更容易成交

trigger —— 计划委托(条件触发),价格到了 → 自动帮我下单(市价或限价)

move_order_stop —— 移动止盈止损(跟踪止损)【行情往有利方向走 → 止损点自动往上抬】
例如:

1
2
3
4
5
6
7
8
9
10
// 真实例子(经典跟踪止损)
// 你 100,000 做多 BTC
// 你设置:✅ 回撤 3% 自动止损

// 过程:
// 价格涨到 110,000 → 止损自动上移到 106,700
// 再涨到 120,000 → 止损自动上移到 116,400

//突然暴跌 → 在 116,400 触发止损平仓
// 一句话总结:✅ “让盈利奔跑,让亏损可控”

TWAP(Time Weighted Average Price) —— 时间加权委托(算法拆单),大单拆成小单,按时间慢慢成交 [降低冲击成本,避免砸盘或拉盘]

类型 中文 核心作用 主要用途
conditional 单向止盈止损 单边风控 防爆仓
OCO 双向止盈止损 完整风控 开仓后必用
chase 追逐限价 快速成交 + 控价 追涨杀跌
trigger 计划委托 触发后下单 突破 / 跌破
move_order_stop 移动止损 锁利润 趋势单
TWAP 时间加权 拆单不冲击市场 机构出货

7.撮合的流程需要熟悉;欧意的api文档,了解对应的一些交易策略.网格和信号交易

欧易API文档
冰山策略:
网格交易:
信号量交易:

8.交易所8大核心系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ 客户端 / API ] - app

[ API 网关层 ] - gateway

[ 风控层 Risk ] - risk

[ 委托管理 OMS ] - 订单管理系统

[ 策略 & 算法交易引擎 ] - 订单路由

[ 撮合引擎 Matching Engine ] - 订单撮合

[ 清算结算 Clearing ] - 订单结算

[ 资产系统 Wallet / Ledger ] - 钱包

[ 行情系统 Market Data ] - 行情,盘口

8.撮合交易为啥会用disruptor技术

核心技术特性
1.无锁环形缓冲区(环形缓冲区)
中断器采用预分配的环形内存结构,通过消除锁竞争与回收压力,实现微秒级延迟的订单处理能力。在智能合约交易撮合引擎中,该技术可将订单匹配效率提升至百万级TPS,适用于高频交易场景。
2.事件驱动架构
基于发布-订阅模式,Disruptor将交易事件广播至多个并行消费者(如清算、风控模块)确保原子性与事务一致性,避免传统队列的阻塞问题。
例如,区块链交易平台可将链上事件异步推送至链下处理模块,实现混合架构的高效协同。
3.内存计算优化
通过对象复用与缓存行填充技术,中断器减少CPU伪共享现象,在虚拟货币合约交易中实现每秒600万笔订单的吞吐量(参考LMAX)外汇交易平台历史数据)

9.websocket通信的数据格式;Trade-server里面的业务渠道,订单和实时成交binaryMessage. 需要需要查一下对应的含义

Lbank
f12看下对应的心跳:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"SERVER": "V3", // 服务器版本
"tick": { // 行情
"a": "873939265.2500", // 市场交易总额(amount,一般是24小时成交额)
"tu": "1.00", // 行情序号 tick update id
"vol": "9634.1205", //24h 成交量(BTC)
"c": "639803.31", // 最新成交价 last price,当前最新成交价
"lp": "89526.74", // 24h 最低价 lowest price
"t": "1765267493458",//毫秒时间戳(tick 时间)
"ch": "-1.13", // 24h 涨跌幅 % [(ch) = (最新价 - 昨日收盘价) / 昨日收盘价 × 100%]
"u": "90482.72", // 24h 涨跌额(change absolute)[24h 最高价 or 最新价 与 昨日收盘价的绝对差额]
"hp": "92287.09", // 24小时最高价
"dir": "sell", // 方向
"cp": "90482.72", // 昨日收盘价 close price
"tc": "7.07" // 24h 成交次数 trade count[tc = 24h 成交次数(trade count)/ 千笔统计]
},
"type": "tickV2", //tickV2 行情推送
"pair": "btc_usdt", //交易币对儿
"TS": "2025-12-09T16:04:53.458" //推送时间
}

对应返回的Binary Message为压缩为字节的bytes {“pong”: 1733728193000},你发出去的是字符串({“ping”: 1733728193000}),但 服务器推送回来时选择了“二进制帧” (binary frame),所以收到的是 bytes压缩后的二进制帧
好处:压缩后能节省70–90%带宽,TPS更高

10.撮合的策略

1.价格优先
2.时间优先
3.成交量有限
4.按比例分配
5.最优五档/十档成交(Advanced Market Order)
一些 CEX 会把市价单限制为:
最优五档成交(best 5)
最优十档成交(best 10)
6.Iceberg(冰山单)【大单拆成多个小单显示,避免被吃单机器人盯上】

11.多线程问题,需要了解对应的线程阻塞问题以及如何解决多线程cpu爆满问题的排查处理

解决阻塞问题:减少等待、降低竞争、缩小范围、避免死锁、增加资源、加上超时
CPU爆满排查

12.了解nft对应的一些玩法以及相关实现

盲盒–1.上架盲盒;2.售卖倒计时;3.用户支付 USDT 或平台币购买;4.等待开放时间;5.“开盒”→后端给出随机NFT;6.NFT 进入用户账户,可交易/收藏
申购 – 用户提前报名参与 NFT 发行,最终按比例分配给参与者

空投
① 条件空投
满足条件即可领取:持有某 token;做任务(关注、转推、交易等);CEX 用户等级、交易量达标

② 治理空投 / 项目空投:项目方为了扩大影响力,将 NFT 直接发到用户账户。

③ 钩子空投(Retention Airdrop)
平台用来留住活跃用户:
如连续登录 7 天赠 NFT 节日卡

转赠 – 用户可以转给朋友;社群运营常使用(奖品发放);可以二级市场交易前,先“私下赠送”

预约 – 常用于 盲盒、空投、申购的预报名

13.ETCD热更新的原理

ETCD热更新本质是通过Watch机制监听Key/目录,当内容变化时实时推送事件,客户端收到后本地更新并刷新内存配置,无需重启

ETCD热更新原理 = Watch推送 → 内存更新配置 → 本地业务即时生效
核心3点:
Watch(长连接监听)
Revision(有序事件)
本地缓存(避免反复读 etcd)

14.状态机加乐观锁在订单支付在关单下的冲突场景,以及如何起作用的

15.常见的签名算法

16.合约怎么升级,如何监听线上事件?

  • Title: (九)web3面试题第二弹
  • Author: viEcho
  • Created at : 2025-12-03 00:00:00
  • Updated at : 2025-12-09 17:51:01
  • Link: https://viecho.github.io/2025/1203/web3-interview2.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments