{"content":{"title":"Solidity 面试问题汇总","body":">- 原文链接：https://www.rareskills.io/post/solidity-interview-questions\r\n>- 译文出自：[登链翻译计划](https://github.com/lbc-team/Pioneer)\r\n>- 译者：[翻译小组](https://learnblockchain.cn/people/412) ，校对：[Tiny 熊](https://learnblockchain.cn/people/15)\r\n>- 本文永久链接：[learnblockchain.cn/article…](https://learnblockchain.cn/article/7076)\r\n\r\n\r\n这些是以太坊开发人员最常用到的面试问题。大部分问题仅需两三句就可以回答。\r\n\r\n## 简单题\r\n\r\n1. 私有、内部、公共和外部函数之间的区别？\r\n2. 智能合约大小大约可以有多大？\r\n3. create 和 create2 之间有什么区别？\r\n4. [ Solidity 0.8.0 ](https://learnblockchain.cn/docs/solidity/)版本对算术运算有什么重大变化？\r\n5. 代理需要哪种特殊的 CALL 才能工作？\r\n6. 在 EIP-1559 之前，如何计算以太坊交易的美元成本？\r\n7. 在区块链上创建随机数的挑战是什么？\r\n8. 荷兰式拍卖和英式拍卖之间有什么区别？\r\n9. [ERC20](https://learnblockchain.cn/tags/ERC20) 中的 transfer 和 transferFrom 之间有什么区别？\r\n10. 对于地址 allowlist，使用映射还是数组更好？为什么？\r\n11. 为什么不应该使用 tx.origin 进行身份验证？\r\n12. 以太坊主要使用什么哈希函数？\r\n13. 1 个Ether 相当于 多少个 gwei ？\r\n14. 1 个Ether 相当于 多少个 wei ？\r\n15. assert 和 require 之间有什么区别？\r\n16. 什么是闪电贷？\r\n17. 什么是检查效果（ check-effects ）模式？\r\n18. 运行独立验证节点所需的最小以太数量是多少？\r\n19. fallback 和 receive 之间有什么区别？\r\n20. 什么是重入？\r\n21. 上海升级后，每个区块的 gas 限制是多少？\r\n22. 什么阻止无限循环永远运行？\r\n23. tx.origin 和 msg.sender 之间有什么区别？\r\n24. 如何向没有payable 函数、receive 或回退的合约发送以太？\r\n25. view 和 pure 之间有什么区别？\r\n26. [ERC721](https://learnblockchain.cn/tags/ERC721) 中的 transferFrom 和 safeTransferFrom 之间有什么区别？\r\n27. 如何将 [ERC1155](https://learnblockchain.cn/tags/1155) 代币转换为非同质化代币？\r\n28. 访问控制是什么，为什么重要？\r\n29. 修饰符（modifier）的作用是什么？\r\n30. uint256 可以存储的最大值是多少？\r\n31. 什么是浮动利率和固定利率？\r\n\r\n## 中等难度\r\n\r\n1. transfer 和 send 之间有什么区别？为什么不应该使用它们？\r\n2. 如何在 Solidity 中编写高效的 gas 循环？\r\n3. 代理合约中的存储冲突是什么？\r\n4. abi.encode 和 abi.encodePacked 之间有什么区别？\r\n5. uint8、uint32、uint64、uint128、uint256 都是有效的 uint 大小。还有其他的吗？\r\n6. 在权益证明之前后，block.timestamp 发生了什么变化？\r\n7. 什么是抢跑（frontrunning）？\r\n8. 什么是提交-揭示方案，何时使用它？\r\n9. 在什么情况下，abi.encodePacked 可能会产生漏洞？\r\n10. 以太坊如何确定 [EIP-1559](https://learnblockchain.cn/tags/EIP1559) 中的 BASEFEE？\r\n11. 冷读（cold read）和热读（warm read）之间有什么区别？\r\n12. AMM 如何定价资产？\r\n13. 代理中的函数选择器冲突是什么，它是如何发生的？\r\n14. payable 函数对 gas 的影响是什么？\r\n15. 什么是签名重放攻击？\r\n16. 什么是 gas griefing ？\r\n17. 如何设计一个石头-剪刀-布的智能合约游戏，使玩家无法作弊？\r\n18. 自由内存指针是什么，它存储在哪里？\r\n19. 接口中有效的函数修饰符有哪些？\r\n20. 函数参数中的 memory 和 calldata 有什么区别？\r\n21. 描述三种存储 gas 成本类型。\r\n22. 为什么可升级合约不应该使用构造函数？\r\n23. UUPS 和 Transparent Upgradeable Proxy 模式之间有什么区别？\r\n24. 如果合约通过 delegatecall 调用一个空地址或之前已自毁的实现，会发生什么？如果是常规调用而不是 delegatecall 呢？\r\n25. [ERC777](https://learnblockchain.cn/tags/ERC777) 代币存在什么危险？\r\n26. 根据 [Solidity 风格指南](https://learnblockchain.cn/docs/solidity/style-guide.html)，函数应该如何排序？\r\n27. 根据 Solidity 风格指南，函数修饰符应该如何排序？\r\n28. 什么是债券曲线(bonding curve)？\r\n29. OpenZeppelin ERC721 实现中的 safeMint 与 mint 有何不同？\r\n30. Solidity 提供哪些关键字来测量时间？\r\n31. 什么是三明治(sandwich)攻击？\r\n32. 如果向一个会回滚的函数进行 delegatecall，delegatecall 会怎么做？\r\n33. 乘以和除以二的倍数的 gas 高效替代方法是什么？\r\n34. 多大 uint 可以与一个地址在一个槽中？\r\n35. 哪些操作会部分退还 gas？\r\n36. ERC165 作用于什么？\r\n37. 如果代理对 A 进行 delegatecall，而 A 执行 address(this).balance，返回的是代理的余额还是 A 的余额？\r\n38. 滑点参数有什么用？\r\n39. [ERC721A](https://learnblockchain.cn/article/3539) 如何减少铸造成本？有什么权衡？\r\n40. 为什么 Solidity 不支持浮点数运算？\r\n41. 什么是 TWAP？\r\n42. Compound Finance 如何计算利用率？\r\n\r\n## 有难度题\r\n\r\n1. 定点算术如何表示数字？\r\n2. 什么是 ERC20 授权抢跑攻击？\r\n3. 什么操作码可以实现 address(this).balance？\r\n4. 一个 Solidity 事件可以有多少个参数？\r\n5. 什么是匿名 Solidity 事件？\r\n6. 在什么情况下，函数可以接收映射作为参数？\r\n7. ERC4626 中的通胀攻击是什么？\r\n8. 一个 Solidity 函数可以有多少个参数？\r\n9. `uint64[] x = [1,2,3,4,5]` 使用了多少个存储槽？与内存有何不同？\r\n10. 上海升级之前，在什么情况下，returndatasize() 比 push zero 更有效？\r\n11. 为什么编译器会在 Solidity 合约中插入 INVALID 操作码？\r\n12. 自定义错误和带错误字符串的 require 在 EVM 层面编码有什么区别？\r\n13. Compound DeFi 公式中的 kink 参数是什么？\r\n14. 函数名称如何影响 gas 成本，如果有的话？\r\n15. ecrecover 存在什么常见漏洞？\r\n16. 乐观 [Rollup](https://learnblockchain.cn/tags/Rollup) 和 zk-rollup 之间有什么区别？\r\n17. EIP1967 如何选择存储槽，有多少个存储槽，它们代表什么？\r\n18. 1 个 Sazbo 价值多少？\r\n19. delegatecall 除了在代理中使用之外还可以用于什么？\r\n20. 在什么情况下，一个在以太坊上运行的智能合约在 Polygon 或 Optimism 上无法运行？（假设没有依赖于外部合约）\r\n21. 智能合约如何在不更改地址的情况下改变其字节码？\r\n22. 在循环中将 msg.value 放入有什么危险？\r\n23. 描述一个函数 calldata，该函数接受一个动态长度的 uint128 数组作为参数，当传递 `uint128[1,2,3,4]` 作为参数时会发生什么\r\n24. 为什么严格的不相等比较比 ≤ 或 ≥ 更节省 gas？额外的操作码是什么？\r\n25. 如果代理调用一个实现，并且在被调用的函数中实现自毁，会发生什么？\r\n26. 变量作用域和堆栈深度之间有什么关系？\r\n27. 访问列表交易是什么？\r\n28. 如何使用 mload 操作码终止执行？\r\n29. 在代理的上下文中，什么是信标（beacon）？\r\n30. 为什么在进行治理投票之前需要对余额进行快照？\r\n31. 如何执行一个不需要用户支付 gas 的交易？\r\n32. 在 Solidity 中，不使用汇编，如何获取 calldata 的函数选择器？\r\n33. 以太坊地址是如何派生的？\r\n34. 什么是元代理标准？\r\n35. 如果 try catch 调用一个不会回滚的合约，但在 try 块内发生回滚，会发生什么？\r\n36. 如果用户调用代理并使代理进行 delegatecall 到 A，A 从其角度来看，msg.sender 是谁？从 B 的角度来看，msg.sender 是谁？从代理的角度来看，msg.sender 是谁？\r\n37. 为什么大量合约字节码以 `6080604052` 开头？这个字节码序列是做什么的？\r\n38. [Uniswap V3](https://learnblockchain.cn/tags/Uniswap%20V3)  如何确定流动性区间的边界？\r\n39. 什么是无风险利率？\r\n40. 当一个合约通过 call、delegatecall 或 staticcall 调用另一个合约时，它们之间如何传递信息？\r\n41. 内存中的 bytes 和 bytes1[] 之间有什么区别？\r\n\r\n\r\n\r\n## 高难度题\r\n\r\n1. 以太坊预编译合约的地址是什么？\r\n2. 当函数数量超过 4 个时，Solidity 如何管理函数选择器？\r\n3. 如果对一个合约进行委托调用，而该合约又对另一个合约进行委托调用，那么在代理合约、第一个合约和第二个合约中，msg.sender 是谁？\r\n4. 如果有的话，ABI 编码在 calldata 和 memory 之间有何不同？\r\n5. uint64 和 uint256 在 calldata 中的 ABI 编码有何不同？\r\n6. 什么是只读重入？\r\n7. 从不受信任的智能合约调用中读取（内存）字节数组的安全考虑是什么？\r\n8. 如果部署一个空的 Solidity 合约，在区块链上会有什么字节码，如果有的话？\r\n9. 以太虚拟机如何定价内存使用？\r\n10. 智能合约的元数据部分存储了什么？\r\n11. 从 MEV 的角度来看，什么是叔块攻击？\r\n12. 如何进行签名篡改攻击（malleability attack）？\r\n13. 在什么情况下，具有前导零的地址可以节省 gas，以及为什么？\r\n14. `payable(msg.sender).call{value: value}(\"\")`和 `msg.sender.call{value: value}(\"\")`之间有什么区别？\r\n15. 一个字符串占用多少个存储槽？\r\n16. Solidity 编译器中的--via-ir 功能是如何工作的？\r\n17. 函数修饰符是从右到左调用还是从左到右调用，还是不确定的？\r\n18. 如果对一个合约进行委托调用，而执行了指令 CODESIZE，将返回哪个合约的大小？\r\n19. 为什么 ECDSA 对哈希而不是任意 bytes32 进行签名很重要\r\n20. 描述符号操作测试( symbolic manipulation testing)是如何工作的。\r\n21. 复制内存区域的最有效方式是什么？\r\n22. 如何在链上验证另一个智能合约是否触发了一个事件，而不使用预言机？\r\n23. 当调用 selfdestruct 时，以太何时转移？智能合约的字节码何时被擦除？\r\n24. 在什么条件下，Openzeppelin 的 Proxy.sol 会覆盖自由内存指针？为什么这样做是安全的？\r\n25. 为什么 Solidity 废弃了\"years\"关键字？\r\n26. verbatim 关键字的作用是什么，以及它可以在哪里使用？\r\n27. 在调用另一个智能合约时可以转发多少 gas？\r\n28. 存储 -1 的 int256 变量在十六进制中是什么样子的？\r\n29. signextend 操作码有什么用？\r\n30. 为什么 calldata 中的负数会消耗更多的 gas？\r\n31. 什么是 zk-friendly 哈希函数，它与非 zk-friendly 哈希函数有何不同？\r\n32. 在零知识的背景下，什么是 nullifier，它的用途是什么？\r\n\r\n## 加入集训营\r\n\r\n参加 [区块链技术及英语集训营](https://learnblockchain.cn/openspace/1)，不仅可深入了解以太坊智能合约开发，还可提升英语海外远程就业。"},"author":{"user":"https://learnblockchain.cn/people/412","address":"0x9e64a306aB319811C5a1270F2CA9f6E1e4857c84"},"history":"bafkreiaqgaxvdqo6v2he3od67fcvabd5zihq46f4asjw2ufyftx66drpju","timestamp":1711505946,"version":1}