Skip to main content

Solidity 高级面试题

1. 定点算术如何表示数字?​

2. 什么是 ERC20 授权抢跑攻击?​

3. 什么操作码可以实现 address(this).balance?​

4. 一个 Solidity 事件可以有多少个参数?​

5. 什么是匿名 Solidity 事件?​

6. 在什么情况下,函数可以接收映射作为参数?​

7. ERC4626 中的通胀攻击是什么?​

8. 一个 Solidity 函数可以有多少个参数?​

9. uint64[] x = [1,2,3,4,5] 使用了多少个存储槽?与内存有何不同?​

10. 上海升级之前,在什么情况下,returndatasize() 比 push zero 更有效?​

11. 为什么编译器会在 Solidity 合约中插入 INVALID 操作码?​

12. 自定义错误和带错误字符串的 require 在 EVM 层面编码有什么区别?​

13. Compound DeFi 公式中的 kink 参数是什么?​

14. 函数名称如何影响 gas 成本,如果有的话?​

15. ecrecover 存在什么常见漏洞?​

16. 乐观 Rollup 和 zk-rollup 之间有什么区别?​

17. EIP1967 如何选择存储槽,有多少个存储槽,它们代表什么?​

18. delegatecall 除了在代理中使用之外还可以用于什么?​

19. 在什么情况下,一个在以太坊上运行的智能合约在 Polygon 或 Optimism 上无法运行?(假设没有依赖于外部合约)​

20. 智能合约如何在不更改地址的情况下改变其字节码?​

21. 在循环中将 msg.value 放入有什么危险?​

22. 描述一个函数 calldata,该函数接受一个动态长度的 uint128 数组作为参数,当传递 uint128[1,2,3,4] 作为参数时会发生什么​

23. 如果代理调用一个实现,并且在被调用的函数中实现自毁,会发生什么?​

24. 变量作用域和堆栈深度之间有什么关系?​

25. 访问列表交易是什么?​

26. 如何使用 mload 操作码终止执行?​

27. 在代理的上下文中,什么是信标(beacon)?​

28. 为什么在进行治理投票之前需要对余额进行快照?​

29. 如何执行一个不需要用户支付 gas 的交易?​

30. 在 Solidity 中,不使用汇编,如何获取 calldata 的函数选择器?​

31. 以太坊地址是如何派生的?​

32. 什么是元代理标准?​

33. 如果 try catch 调用一个不会回滚的合约,但在 try 块内发生回滚,会发生什么?​

34. 如果用户调用代理并使代理进行 delegatecall 到 A,A 从其角度来看,msg.sender 是谁?从 B 的角度来看,msg.sender 是谁?从代理的角度来看,msg.sender 是谁?​

35. Uniswap V3 如何确定流动性区间的边界?​

36. 什么是无风险利率?​

37. 当一个合约通过 call、delegatecall 或 staticcall 调用另一个合约时,它们之间如何传递信息?​

38. 当函数数量超过 4 个时,Solidity 如何管理函数选择器?​

39. 如果对一个合约进行委托调用,而该合约又对另一个合约进行委托调用,那么在代理合约、第一个合约和第二个合约中,msg.sender 是谁?​

40. 如果有的话,ABI 编码在 calldata 和 memory 之间有何不同?​

41. 什么是只读重入?​

42. 从不受信任的智能合约调用中读取(内存)字节数组的安全考虑是什么?​

43. 如果部署一个空的 Solidity 合约,在区块链上会有什么字节码,如果有的话?​

44. 以太虚拟机如何定价内存使用?​

45. 智能合约的元数据部分存储了什么?​

46. 从 MEV 的角度来看,什么是叔块攻击?​

47. 如何进行签名篡改攻击(malleability attack)?​

48. 在什么情况下,具有前导零的地址可以节省 gas,以及为什么?​

49. payable(msg.sender).call{value: value}("")和 msg.sender.call{value: value}("")之间有什么区别?​

50. 一个字符串占用多少个存储槽?​

51. Solidity 编译器中的--via-ir 功能是如何工作的?​

52. 函数修饰符是从右到左调用还是从左到右调用,还是不确定的?​

53. 如果对一个合约进行委托调用,而执行了指令 CODESIZE,将返回哪个合约的大小?​

54. 为什么 ECDSA 对哈希而不是任意 bytes32 进行签名很重要​

55. 描述符号操作测试( symbolic manipulation testing)是如何工作的。​

56. 复制内存区域的最有效方式是什么?​

57. 如何在链上验证另一个智能合约是否触发了一个事件,而不使用预言机?​

58. 当调用 selfdestruct 时,以太何时转移?智能合约的字节码何时被擦除?​

59. 在什么条件下,Openzeppelin 的 Proxy.sol 会覆盖自由内存指针?为什么这样做是安全的?​

60. signextend 操作码有什么用?​

61. 什么是 zk-friendly 哈希函数,它与非 zk-friendly 哈希函数有何不同?​

62. 在零知识的背景下,什么是 nullifier,它的用途是什么?​