区块链开发工程师面试题及答题要点
这个岗位通常2-4轮:技术面重点考智能合约安全、EVM原理和项目真实度,行为面偏少但会验证你对行业的理解是否长期。最容易挂的地方是项目深挖——说不清合约设计取舍和安全考虑的候选人,基本过不了二面。
专业基础
讲一下你对EVM的理解,智能合约从部署到执行的完整流程是什么?
考察点:考察是否理解底层机制,还是只会调库写代码。
- 按流程讲:源码编译成字节码、交易部署到链上获得合约地址、调用时EVM读取字节码逐条执行、状态变更写入存储。
- 点出关键概念:gas机制限制每步执行成本、存储槽(storage slot)决定状态变量的布局和读取成本。
- 可以补充一句你实际踩过的坑,比如某个操作gas超预期,说明不是背概念。
- 如果面的是非EVM链,主动说明你了解该链与EVM的差异点。
别踩:只背「EVM是以太坊虚拟机」这种定义,没有执行流程和gas细节,会被判定为只写过demo。
Solidity里msg.sender和tx.origin有什么区别?为什么不能用tx.origin做权限校验?
考察点:经典安全题,考察重入和钓鱼类攻击的基础认知。
- 先讲清定义:msg.sender是直接调用者,可能是用户也可能是中间合约;tx.origin是交易的最初发起人。
- 给出攻击场景:用户被诱导调用恶意合约,恶意合约再调用目标合约,目标合约若用tx.origin校验就会误以为是用户本人。
- 结论明确:权限校验一律用msg.sender,tx.origin几乎没有正当使用场景。
- 能延伸到「合约调用合约」的调用链模型会加分。
别踩:知道区别但讲不出具体攻击场景,或者含糊说「不安全」,暴露理解不深。
ERC20和ERC721在实现上的核心区别是什么?
考察点:考察代币标准的基本功,是否亲手实现过而非只会用OpenZeppelin。
- 核心区别:ERC20是同质化余额模型(一个mapping存地址到数量),ERC721是非同质化的tokenId模型。
- 讲清ERC721多出的关键功能:每个tokenId独立的所有权记录、approve按tokenId授权、transferFrom需要校验tokenId归属。
- 可以提ERC1155作为两者的泛化方案,说明你对标准演进有了解。
- 如果自己写过或审计过某个标准的实现,主动提一句细节。
别踩:只答「一个同质一个非同质」,说不出存储结构和授权逻辑的差异。
gas优化你一般怎么做?举几个你实际用过的手段。
考察点:考察实战经验和成本意识,链上成本直接关系产品可行性。
- 存储层面:减少storage写入、用calldata代替memory传参、合理排列状态变量类型减少存储槽占用。
- 逻辑层面:短路求值、循环里避免重复读取storage、用不可变量(immutable)和常量。
- 打包数据:比如把多个uint256打包进一个slot,或用位运算压缩存储。
- 强调验证方式:用工具对比优化前后的gas消耗,用数据说话。
别踩:罗列网上抄来的技巧但说不出原理,或没实际对比过gas数据。
智能合约安全
重入攻击的原理是什么?怎么防?
考察点:安全题必考第一名,考察攻击模型和防御思维。
- 原理讲清:合约在状态更新前对外转账,外部合约的fallback回调再次进入原函数,反复提取资金。
- 防御三板斧:先改状态再转账(checks-effects-interactions模式)、用可重入锁、尽量用transfer类不会触发回调的方式。
- 举真实案例说明后果,比如历史上著名的DAO事件导致链分叉。
- 补充一句你会用工具或审计流程验证这类问题,体现工程习惯。
别踩:只会说「加个锁」,讲不清为什么外部调用会触发回调、状态更新顺序为什么关键。
除了重入,你还知道哪些常见的智能合约漏洞?
考察点:考察安全知识的广度,是否有系统性认知。
- 挑3-4个你最有把握的讲透:整数溢出(老版本Solidity)、权限控制缺失、预言机价格操纵、前端跑偏(front-running)。
- 每个漏洞用一句话说清成因加一句话说清防御,不要展开成论文。
- 提一下依赖库版本和已知漏洞的关系,说明你关注安全公告。
- 如果做过审计或看过审计报告,举一个你发现的实际问题最有说服力。
别踩:一口气报十个漏洞名但每个都讲不深,反而暴露是背清单。
合约上线后发现漏洞,你会怎么处理?
考察点:考察应急思维和工程成熟度,没有标准答案但看思路。
- 先评估影响:漏洞是否可被利用、涉及多少资金、是否有紧急暂停机制可用。
- 分情况:有暂停功能先止损;无暂停则评估能否通过部署修复合约迁移资金。
- 强调流程:及时披露、通知用户、复盘根因,而不是掩盖问题。
- 落到预防:说明你平时如何设计升级机制和应急开关,把话题拉回工程实践。
别踩:只答「马上修复」,忽略链上代码不可篡改这个基本前提。
项目经历深挖
挑一个你做过的链上项目,讲讲合约架构是怎么设计的。
考察点:验证项目真实度和设计能力,这是二面挂人最多的题。
- 用两分钟讲清业务目标、合约拆分方式(哪些逻辑放链上、哪些放链下)和关键取舍。
- 重点讲「为什么这么设计」:比如为什么用代理合约模式、为什么某个数据放链下,说出备选方案和放弃原因。
- 给出具体数字:合约数量、大致代码量、gas成本、测试覆盖情况。
- 主动暴露一个当时的设计缺陷和后来的改进,真实项目一定有不完美。
别踩:只描述做了什么功能,讲不出设计取舍;或项目细节经不起追问,被识破是照教程做的。
你这个项目里最难的一个技术问题是什么,怎么解决的?
考察点:考察问题定位能力和深度,区分主力开发和参与者。
- 选真实且具体的问题:比如某个交易莫名revert、gas超限、链下数据与链上状态不一致。
- 讲清排查路径:怎么缩小范围、用了什么工具或日志、最终定位到哪一行。
- 给出解决方案和验证方式,最好有前后对比数据。
- 总结一条可迁移的经验,说明这个问题改变了你后来的做法。
别踩:编造一个「很难」的问题但排查过程空洞,或把别人的工作说成自己的,追问两句就露馅。
链上和链下数据你是怎么划分的?什么数据该上链?
考察点:考察架构判断力,区分只会写合约和懂系统设计的人。
- 给出判断标准:需要去中心化共识和防篡改的数据才上链,其余放链下。
- 举具体例子:资产所有权和资金结算上链,用户资料、订单明细、高频日志放链下。
- 讲链下数据如何与链上关联:比如哈希上链做存证、预言机喂价格。
- 提成本视角:存储和计算在链上贵几个数量级,产品要考虑用户gas负担。
别踩:回答「区块链就是去中心化所以都上链」,暴露没有成本和架构意识。
情景应变与开放题
让你从零设计一个质押挖矿的合约,你会怎么开始?
考察点:现场设计题,考察结构化思维和边界条件意识。
- 先问清需求再动手:质押什么资产、奖励怎么算、有没有锁定期、谁来管理参数。
- 给出模块划分:质押仓、奖励计算、权限管理、紧急控制,说明各模块职责。
- 主动提边界情况:奖励池耗尽、用户中途退出、精度问题导致的舍入误差。
- 说明测试和审计计划:先写测试用例再写实现,上线前做审计。
别踩:上来就写代码结构,不确认需求也不考虑边界条件,被追问就卡住。
用户反馈他的交易一直pending,你怎么排查?
考察点:考察链下问题的排查能力,实际工作中大量问题在前端和交易层。
- 先看交易本身:gas price是否低于当前市场水平、nonce是否卡住(前一笔交易未上链)。
- 再查链的状态:网络是否拥堵、合约地址和调用参数是否正确。
- 给用户侧方案:提高gas费重发、用相同nonce替换卡住的交易。
- 说明你会怎么和用户沟通确认信息,体现协作意识。
别踩:只从合约代码找问题,忽略gas和nonce这些最常见的链下原因。
你怎么看现在公链和Layer2的格局?做开发选哪条链重要吗?
考察点:考察行业认知和选型判断,看你是写代码的还是懂业务的。
- 给出你的判断框架:安全性、成本、生态成熟度、用户规模,而不是直接站队某条链。
- 讲一个具体选型例子:什么场景下你会选Layer2而不是主链,理由是什么。
- 承认不确定性:格局变化快,保持对多链的兼容能力比押注单链更稳。
- 落到自己:说明你当前最熟的链和迁移到其他链的成本估计。
别踩:变成喊单式吹捧某条链,或表现出对其他生态的明显偏见,显得不专业。
行为面试与反问环节
你为什么想进入区块链/Web3行业?打算长期做吗?
考察点:行业波动大,公司担心候选人把这里当跳板或投机心态。
- 给出具体触发点:某个让你决定投入的项目或技术问题,而不是「看好前景」。
- 展示持续性:学习路径、参与的开源项目或社区、持续输出的内容。
- 对行业风险有清醒认知,说明你想清楚了才来的。
- 和岗位挂钩:这份工作如何延续你的积累。
别踩:大谈行业风口和财富效应,或回答空洞的「热爱技术」,都显得动机不实。
和产品或运营对需求时有分歧,比如对方要的功能gas成本极高,你怎么办?
考察点:考察跨职能协作和沟通能力,技术人常挂在这类题。
- 先翻译问题:把gas成本换算成用户实际支付的费用,让对方理解代价。
- 给替代方案而不是直接说不行:调整功能形态、部分逻辑放链下、分阶段实现。
- 举一个真实例子说明你这么处理过并达成了共识。
- 保留升级路径:先上可行版本,后续优化。
别踩:表现成「技术说了算」或完全妥协,两个极端都减分。
你有什么想问我们的?
考察点:考察你关注什么,也给你收集判断信息的机会。
- 问技术:合约的测试和上线流程是怎样的、有没有审计习惯、代码review机制。
- 问业务:产品当前阶段、用户规模量级、主要技术挑战是什么。
- 问团队:区块链开发在团队里的占比、和链下系统的协作方式。
- 避免一上来只问薪资福利和加班,这些留给HR环节。
别踩:说「没什么想问的」,直接被解读为意愿低或没思考。
面试准备清单
| 什么时候 | 要做什么 |
|---|---|
| 面试前 3 天 | 把自己简历上的每个项目按「架构—取舍—难点—数据」四要素过一遍,每个项目准备一个能讲两分钟的版本,确保经得起三层追问。 |
| 面试前 3 天 | 重刷安全基础:重入、权限、预言机操纵、front-running这几个高频漏洞,每个准备「原理+攻击场景+防御」三段式回答。 |
| 面试前 1 天 | 查目标公司的产品和技术栈:他们部署在哪条链、合约开源的话读一遍核心合约,面试时能引用对方代码细节会明显加分。 |
| 面试前 1 天 | 准备一个现场设计题的答题模板:确认需求→模块划分→边界条件→测试审计,对着一道练习题完整走一遍。 |
| 面试当天 | 准备纸笔,遇到设计题先画结构再讲;远程面试提前测试环境和代码编辑器,部分公司会现场写Solidity片段。 |
| 面试当天 | 准备好3个反问问题(技术流程、业务阶段、团队构成),根据面试中听到的信息临场调整提问。 |