随着区块链技术的蓬勃发展,以太坊作为智能合约平台的领军者,吸引了大量开发者和从业者的目光,无论是初入区块链领域的新人,还是希望深入探索智能合约开发的工程师,面试中不可避免会遇到各种与以太坊相关的问题,

以太坊基础概念
这部分问题主要考察候选人对以太坊核心原理的理解程度。
-
问题:请简述以太坊和比特币的主要区别是什么?
- 考察点:对比特币和以太坊设计理念、核心功能差异的理解。
- 参考回答:
- 定位与目标:比特币主要是一种点对点的电子现金系统,专注于价值存储(数字黄金);以太坊则是一个去中心化的应用平台,旨在支持智能合约和去中心化应用(DApps)的运行。
- 脚本能力:比特币的脚本语言是图灵完备的,但功能受限,主要用于交易验证;以太坊的智能合约(Solidity语言)是图灵完备的,支持更复杂的逻辑运算和状态存储。
- 区块结构:比特币区块主要包含交易列表;以太坊区块包含交易列表、叔块(uncle blocks)引用以及状态根、交易根、收据根等默克尔树根,用于维护整个网络的状态。
- 共识机制:比特币主要使用工作量证明(PoW);以太坊已从PoW过渡到权益证明(PoS),通过质押ETH来验证区块和获得奖励,更加节能环保。
- 交易费用:比特币交易费基于交易大小和优先级;以太坊交易费(Gas Fee)基于Gas Limit和Gas Price,由智能合约执行的复杂程度决定。
-
问题:什么是Gas?为什么以太坊需要Gas?
- 考察点:对以太坊经济模型和资源约束机制的理解。
- 参考回答:
- 定义:Gas是以太坊网络上执行操作(交易、智能合约交互)时所需计算工作量的一种度量单位,每个操作(如存储数据、执行算术运算)都被分配一个特定的Gas消耗值。
- 作用:
- 防止无限循环:通过要求交易者预付Gas费,可以避免智能合约中出现无限循环或恶意消耗网络资源的代码。
- 资源定价:Gas费为网络计算资源提供了定价机制,使得用户可以根据任务的复杂程度支付相应的费用,激励矿工/验证者打包交易。
- 抑制滥用:一定的Gas成本可以有效防止垃圾交易和恶意攻击对网络造成拥堵。
- Gas Limit:用户愿意为单个交易支付的最大Gas量,如果实际Gas消耗超过Gas Limit,交易失败,但已消耗的Gas费不予退还。
- Gas Price:用户愿意为每单位Gas支付的价格(如Gwei),Gas Price越高,交易被矿工/验证者优先打包的可能性越大。
-
问题:请解释一下以太坊的状态、交易和区块的关系。
- 考察点:对以太坊数据模型和运行逻辑的理解。
- 参考回答:
- 状态:以太坊可以看作是一个巨大的分布式状态机,当前状态是一个全局数据结构,记录了网络中所有账户(外部账户和合约账户)的余额、代码、存储数据等,状态存储在链下(通过Merkle Patricia Trie实现高效存储和验证)。
- 交易:交易是对状态改变的指令,由外部账户发起,可以转移ETH(外部账户之间),或者调用智能合约函数(改变合约状态或触发其他交易)。
- 区块:区块是交易的容器,矿工/验证者收集多个交易,打包成一个区块,并通过共识机制添加到区块链上,每个区块的生成都会导致以太坊状态的一次更新。
- 关系:交易是驱动状态改变的引擎,区块是交易的有序打包和确认,新区块的诞生会基于前一个区块的状态,应用区块中的所有交易,生成新的状态,状态根(State Root)是当前状态的哈希值,被包含在每个区块头中,用于验证状态的完整性。
智能合约与Solidity
这部分是智能合约开发岗位的重中之重。
-
问题:什么是智能合约?它有什么优势和潜在风险?
- 考察点:对智能合约基本概念及其特性的理解。
- 参考回答:
- 定义:智能合约是在以太坊区块链上运行的一段代码,能够自动执行、控制或记录法律相关的事件和行动,满足某个或某些参与方的预设条件,它们一旦部署,就无法轻易修改或删除。
- 优势:
- 去中心化:无需可信第三方,由网络共识自动执行。
- 透明性:合约代码和数据对所有参与者公开可见。
- 不可篡改性:一旦部署,合约代码和结果难以被单方篡改。
- 自动化与高效性:自动执行,减少人工干预,提高效率。
- 安全性:基于密码学原理,降低了欺诈风险。
- 潜在风险:
- 代码漏洞:如重入攻击、整数溢出/下溢、逻辑漏洞等,可能导致资产损失。
- 升级困难:传统智能合约一旦部署,难以修改,除非有特殊设计(如代理模式)。
- 隐私问题:链上数据公开,敏感信息需谨慎处理。
- 法律不确定性:智能合约的法律效力仍在发展中。
- Gas成本:复杂合约执行Gas费高昂。
-
问题:Solidity中的storage, memory, calldata有什么区别?
- 考察点:对Solidity内存管理机制的理解,直接影响合约性能和安全。
- 参考回答:
- Storage:
- 位置:存储在区块链上,是持久化的,类似于硬盘。
- 生命周期:随合约存在而存在,修改Storage会消耗较多Gas。
- 访问:变量默认存储在Storage,访问速度较慢。
- 用途:需要长期保存的状态变量(如余额、所有者地址等)。
- Memory:
- 位置:存储在以太坊虚拟机(EVM)的内存中,是临时的,类似于RAM。
- 生命周期:在函数执行期间创建,函数执行结束后销毁。
- 访问:访问速度比Storage快,Gas消耗也较低。
- 用途:函数内部的临时变量,如函数参数的副本、计算过程中的中间结果,当调用外部合约时,传入的参数通常是Memory中的。
- Calldata:
- 位置:是一个只读的、不可修改的临时数据区域,专门用于存储函数调用的外部传入数据。
- 生命周期:函数执行期间存在。
- 访问:访问速度比Memory更快(对于大型数据),且Gas消耗更低(因为它不会被复制到Memory)。
- 用途:建议将外部函数的参数类型声明为
calldata,特别是对于大型数组或结构体,以节省Gas。
- Storage持久化但慢且贵,Memory临时可读写较快较便宜,Calldata只读且用于外部输入参数,最便宜。
- Storage:
-
问题:什么是重入攻击(Reentrancy Attack)?如何防范?
- 考察点:对常见智能合约漏洞及防御措施的理解。
- 参考回答:
- 定义:重入攻击是指攻击者合约在调用目标合约的函数时,利用目标合约在更新状态(如减少余额)之前调用外部合约(通常是攻击者自己的合约)的特性,再次进入目标合约的函数,从而多次执行,窃取资金或造成其他危害,The DAO事件就是典型的重入攻击。
- 攻击场景:目标合约函数A先调用外部合约B,然后在函数A的末尾才更新内部状态(如
balances[msg.sender] -= amount),如果合约B的回调函数再次调用合约A的函数A,就会在状态更新前再次执行。 - 防范措施:
- 检查-效果-交互模式(Checks-Effects-Interactions Pattern):
- Checks (检查):先执行所有条件检查(如余额是否足够)。
- Effects (效果):然后更新合约的内部状态(如减少发送方余额,增加接收方余额)。
- Interactions (交互):最后再进行外部调用(如调用其他合约或发送ETH)。
- 这样即使外部调用被重入,状态也已经更新,攻击者无法再次通过检查。
- 使用互斥锁(Reentrancy Guard):在合约中
- 检查-效果-交互模式(Checks-Effects-Interactions Pattern):