💡
原文英文,约2600词,阅读约需10分钟。
📝
内容提要
本文列出了45个关于Solidity的常见面试问题,涵盖基础、先进概念、安全性及最佳实践,帮助求职者深入理解智能合约的编写与优化。
🎯
关键要点
- Solidity是一种高层次、静态类型的编程语言,专为在以太坊和其他区块链上实现智能合约而设计。
- 智能合约的关键组件包括状态变量、函数、修饰符、事件和结构体。
- Solidity中的可见性分为公共、私有、内部和外部四种。
- 状态变量用于在区块链上永久存储数据。
- 事件是以太坊区块链上的日志,通知外部应用程序合约活动。
- view函数是只读的,不修改状态;pure函数既不修改也不读取状态。
- fallback函数在合约接收以太币但没有数据时被触发。
- Solidity支持单继承和多继承,允许合约从父合约继承属性和函数。
- 构造函数是初始化合约的特殊函数,仅在合约创建时执行一次。
- storage和memory关键字的区别在于,storage是持久的,存储在链上,而memory是临时的,仅在函数执行期间使用。
- Gas是衡量在以太坊上执行操作所需计算努力的单位。
- require、assert和revert语句用于验证输入和条件,确保合约的安全性。
- call和delegatecall的区别在于,call改变了上下文,而delegatecall保持调用合约的上下文。
- 修饰符用于改变函数的行为,允许在执行函数之前进行预条件检查。
- selfdestruct函数用于从区块链中删除合约,并将剩余的以太币发送到指定地址。
- Solidity允许函数重载,多个函数可以同名但参数不同。
- 库与合约类似,但不能存储状态,也不能接收以太币。
- 接口定义合约的外部函数,允许合约之间的互操作性。
- 结构体是自定义数据类型,用于将多个变量组合在一起。
- 重入攻击是恶意合约在初始执行完成前多次调用易受攻击合约的攻击方式。
- 检查-效果-交互模式是Solidity的最佳实践,先检查条件,再更新状态,最后与其他合约交互。
- 前置运行攻击是利用待处理交易的可见性,通过提交更高Gas费用的交易来优先处理。
- 整数溢出/下溢是算术操作超过变量存储限制的情况,可以通过使用安全数学库来防止。
- 为了防止拒绝服务(DoS)攻击,应避免Gas密集型循环,使用拉取模式进行资金提取。
- 确保Solidity智能合约安全的最佳实践包括使用已知库、实施适当的访问控制和进行彻底的审计。
- ERC-20是以太坊上可替代代币的标准,关键函数包括balanceOf、transfer等。
- ERC-20与ERC-721的区别在于,ERC-20是可替代代币标准,而ERC-721是非可替代代币标准。
- 使用Truffle、Hardhat或Brownie等框架进行Solidity智能合约测试。
- OpenZeppelin是一个提供安全、可重用库和合约的流行框架。
- CREATE2操作码允许合约部署到基于合约字节码、部署者地址和盐值的确定性地址。
- abi.encode、abi.encodePacked和abi.encodeWithSignature在编码数据时有不同的用途。
- keccak256是以太坊的主要哈希算法,而sha256是标准SHA-2哈希算法。
- 使用CREATE2操作码创建最小代理合约的步骤包括计算地址和部署代理合约。
- 固定大小数组和动态大小数组在Gas使用和存储方面的处理方式不同。
- extcodesize是EVM操作码,用于检查给定地址是否已部署合约。
- log操作码表示Solidity中的事件,生成的EVM日志存储在链上。
- 低级调用、delegatecall和staticcall在使用时有不同的场景。
- receive函数在合约接收以太币时触发,而fallback函数在调用不存在的函数时触发。
- 内联汇编(Yul)允许直接使用操作码进行低级操作,适用于优化和Gas节省。
- Gas优化包括减少存储写入、使用内存而非存储等,但过度优化可能导致代码难以维护。
- selfdestruct函数的使用挑战包括删除合约后留下孤立的合约调用。
- 存储碰撞攻击发生在代理合约和实现合约之间的存储布局不一致时。
- 时间锁机制限制对某些功能或资产的访问,可能导致意外延迟。
- Solidity的immutable关键字定义在合约部署期间设置的变量,不能更改。
- 多签合约要求多个方签署交易,增加安全性,但也带来协调挑战。
❓
延伸问答
Solidity是什么,它与其他编程语言有什么不同?
Solidity是一种高层次、静态类型的编程语言,专为在以太坊和其他区块链上实现智能合约而设计,受JavaScript、Python和C++的影响。
智能合约的关键组件有哪些?
智能合约的关键组件包括状态变量、函数、修饰符、事件和结构体。
什么是重入攻击,如何在Solidity中防止它?
重入攻击是恶意合约在初始执行完成前多次调用易受攻击合约的攻击方式,可以通过使用检查-效果-交互模式和OpenZeppelin的reentrancyGuard修饰符来防止。
ERC-20和ERC-721有什么区别?
ERC-20是可替代代币的标准,每个代币是相同的;而ERC-721是非可替代代币的标准,每个代币是独特的。
如何在Solidity中实现合约升级?
合约升级可以通过代理模式实现,代理合约将调用委托给实现合约,从而在不改变合约存储的情况下更改逻辑。
什么是Gas,它在Solidity中有什么作用?
Gas是衡量在以太坊上执行操作所需计算努力的单位,防止无限循环并激励高效编码。
➡️