所有这些问题都可以用三句话或更少的话来回答。
简单
private、internal、public和external函数之间有什么区别?- 智能合约大约可以有多大?
- create 和 create2 之间有什么区别?
- Solidity 0.8.0 中的算术运算发生了什么重大变化?
- 代理需要什么特殊的 CALL 才能工作?
- 你如何计算一笔 Ethereum 交易的美元成本?
- 在区块链上生成随机数面临哪些挑战?
- 荷兰式拍卖和英式拍卖之间有什么区别?
- ERC20 中的
transfer和transferFrom之间有什么区别? - 对于地址白名单,使用 mapping 还是 array 更好?为什么?
- 为什么不应该使用 tx.origin 进行身份验证?
- Ethereum 主要使用什么 hash 函数?
- 1 gwei 的 Ether 是多少?
- 1 wei 的 Ether 是多少?
assert和require之间有什么区别?- 什么是闪电贷?
- 什么是 check-effects-interaction 模式?
- 运行一个独立质押节点最少需要多少 Ether?
fallback和receive之间有什么区别?- 什么是重入?
- 是什么阻止了无限循环永远运行下去?
tx.origin和msg.sender之间有什么区别?- 如何将 Ether 发送到没有 payable 函数,也没有 receive 或 fallback 的合约?
view和pure之间有什么区别?- ERC721 中的
transferFrom和safeTransferFrom之间有什么区别? - 如何将 ERC1155 token 变成非同质化代币?
- 什么是访问控制,为什么它很重要?
- modifier 的作用是什么?
- uint256 可以存储的最大值是多少?
- 什么是可变利率和固定利率?
中等
- transfer 和 send 之间有什么区别?为什么不应该使用它们?
- 代理合约中的 storage 冲突是什么?
abi.encode和abi.encodePacked之间有什么区别?uint8、uint32、uint64、uint128、uint256都是有效的 uint 大小。还有其他的吗?
在 proof of stake 之前和之后,block.timestamp 发生了什么变化?- 什么是 frontrunning?
- 什么是 commit-reveal 方案,什么时候会使用它?
- 在什么情况下
abi.encodePacked会产生漏洞? - Ethereum 在 EIP-1559 中是如何决定 BASEFEE 的?
- cold read 和 warm read 之间有什么区别?
- AMM 是如何对资产定价的?
- 代理中的 function selector 冲突是什么,它是如何发生的?
- 将函数设为
payable对 gas 有什么影响? - 什么是签名重放攻击?
- 你将如何在智能合约中设计一个石头剪刀布游戏,使得玩家无法作弊?
- 什么是 free memory pointer,它存储在哪里?
- 哪些函数 modifiers 对接口是有效的?
在函数参数中,memory 和 calldata 之间有什么区别? - 描述写入操作的三种 storage gas 成本类型。
- 为什么可升级合约不应该使用 constructor?
- UUPS 和 Transparent Upgradeable Proxy 模式之间有什么区别?
- 如果一个合约通过 delegatecall 调用了一个空地址或一个之前已经 self-destructed 的实现,会发生什么?如果这是一个低级 call 而不是 delegatecall 呢?
- ERC777 代币会带来什么危险?
- 根据 Solidity 风格指南,函数应该如何排序?
- 根据 Solidity 风格指南,函数 modifiers 应该如何排序?
- 什么是 bonding curve?
- 在 OpenZeppelin 的 ERC721 实现中,
_safeMint和_mint有什么区别?
Solidity 中提供了哪些关键字来衡量时间?
什么是三明治攻击? - 如果对一个发生 revert 的函数进行 delegatecall,delegatecall 会做什么?
- 相比乘以和除以 2 的幂,什么替代方案更节省 gas?
- 在一个 slot 中,多大的 uint 可以和 address 打包在一起?
- 哪些操作会提供部分的 gas 退款?
ERC165 是用来做什么的? - 如果一个代理对 A 进行 delegatecall,并且 A 执行了 address(this).balance,返回的是谁的余额,代理的还是 A 的?
- slippage 参数有什么用?
- ERC721A 是如何降低 mint 成本的?需要做出的妥协是什么?
- 为什么 Solidity 不支持浮点算术?
- 什么是 TWAP?
- Compound Finance 是如何计算 utilization 的?
- 如果对一个读取 immutable 变量的函数进行 delegatecall,返回的值会是什么?
- 什么是 fee-on-transfer 代币?
- 什么是 rebasing 代币?
- 存储在
uint32中的 timestamp 会在哪一年发生溢出? - 在 DeFi 的语境下,什么是 LTV?
- 在 Compound Finance 和 AAVE 的语境下,aTokens 和 cTokens 是什么?
- 描述如何使用借贷协议对某项资产进行杠杆做多或杠杆做空。
- 什么是永续协议?
困难
- 定点算术是如何表示数字的?
- 什么是 ERC20 approval 抢跑攻击?
- 哪个 opcode 可以实现 address(this).balance?
- 一个 Solidity event 可以有多少个参数?
- 什么是匿名的 Solidity event?
- 在什么情况下,函数可以接收 mapping 作为参数?
- ERC4626 中的 inflation attack 是什么?
- 这使用了多少个 storage slot?
uint64[] x = [1,2,3,4,5]?它和 memory 有区别吗? - 在 Shanghai 升级之前,在什么情况下
returndatasize()比PUSH 0更高效? - 为什么编译器会将 INVALID opcode 插入到 Solidity 合约中?
- 在 EVM 级别上,custom error 的编码与带有错误字符串的 require 的编码之间有什么区别?
Compound DeFi 公式中的 kink 参数是什么?
如果函数名称会影响 gas 成本的话,它是如何影响的? - ecrecover 常见的漏洞是什么?
- optimistic rollup 和 zk-rollup 之间有什么区别?
- EIP1967 是如何挑选 storage slot 的?有多少个?它们分别代表什么?
- 1 Sazbo 的 ether 是多少?
- 除了在代理中使用之外,delegatecall 还可以用来做什么?
- 在什么情况下,在 Ethereum 上正常运行的智能合约无法在 Polygon 或 Optimism 上运行?(假设不依赖外部合约)
- 智能合约如何在不改变其地址的情况下更改其 bytecode?
- 将 msg.value 放在循环中有什么危险?
描述接收动态长度uint128数组的函数的 calldata,当传递uint128[1,2,3,4]作为参数时 - 为什么严格不等于比较比 ≤ 或 ≥ 更节省 gas?添加了哪些额外的 opcode?
- 如果一个代理调用了一个实现,而该实现在被调用的函数中 self-destructs 了,会发生什么?
- 变量作用域和栈深度之间有什么关系?
- 什么是 access list 交易?
- 如何通过 mload opcode 停止执行?
- 在代理的语境下,beacon 是什么?
- 为什么在进行治理投票之前必须对余额进行快照?
- 如何在用户不支付 gas 的情况下执行交易?
- 在 Solidity 中,在不使用 assembly 的情况下,如何获取 calldata 的 function selector?
- Ethereum 地址是如何推导出来的?
- 什么是 metaproxy 标准?
- 如果 try catch 对一个没有发生 revert 的合约发起了调用,但是 revert 发生在了 try 块内部,会发生什么?
- 如果一个用户调用代理,代理对 A 进行 delegatecall,然后 A 对 B 进行常规 call,从 A 的角度来看,谁是
msg.sender?从 B 的角度来看,谁是msg.sender?从代理的角度来看,谁是msg.sender? - 在什么情况下带有前导零的 vanity addresses 会节省 gas?
- 为什么大量合约的 bytecode 以 6080604052 开头?这个 bytecode 序列的作用是什么?
- Uniswap V3 是如何确定流动性区间边界的?
- 什么是无风险利率?
- 当一个合约通过 call、delegatecall 或 staticcall 调用另一个合约时,它们之间是如何传递信息的?
bytes和bytes1[]之间有什么区别?- 如果 LTV 是 75%,在 borrow-swap-supply-collateral 循环中能实现的最大杠杆是多少?其他的 LTV 限制呢?
- Curve StableSwap 是如何实现集中流动性的?
- Tether 稳定币合约有什么怪癖?
- 能够存储 100万、10亿、1万亿、1000万亿的最小 uint 分别是多少?
- 未初始化的 UUPS 逻辑合约带来了什么危险?
- 在 Solidity 中发生除以零和在 Yul 中发生除以零时,合约返回的内容之间有什么区别(如果有的话)?
- 为什么不能用
.push()追加到 memory 中的 array?
高级
- Ethereum precompiles 存在于哪些地址?
- 描述在 Uniswap V2 和 Uniswap V3 语境中的“流动性”。
- 如果对一个执行 delegatecall 到另一个合约的合约进行 delegatecall,在代理、第一个合约和第二个合约中,msg.sender 分别是谁?
uint64和uint256在 calldata 中进行 abi 编码的方式有什么区别?- 什么是 read-only reentrancy?
- 从不可信的智能合约调用中读取一个 (memory) bytes 数组的安全注意事项有哪些?
- 如果你部署一个空的 Solidity 合约,区块链上会出现什么样的 bytecode(如果有的话)?
- EVM 是如何为 memory 使用定价的?
- 智能合约的 metadata 部分存储了什么?
- 从 MEV 的角度来看,uncle-block 攻击是什么?
- 如何进行 signature malleability 攻击?
- 在什么情况下带有前导零的地址可以节省 gas?为什么?
payable(msg.sender).call{value: value}("")和msg.sender.call{value: value}("")之间有什么区别?
1一个 string 占用多少个 storage slot?- Solidity 编译器中的
--via-ir功能是如何工作的? - 函数 modifiers 是从右向左调用,还是从左向右调用,还是非确定性的?
- 如果你对一个合约执行 delegatecall 并且执行了 CODESIZE opcode,返回的会是哪个合约的大小?
- 为什么使用 ECDSA 对 hash 进行签名很重要,而不是对任意的 bytes32 签名?
- 描述 symbolic manipulation 测试是如何工作的。
- 复制 memory 区域最高效的方法是什么?
- 如何在不使用 oracle 的情况下,在链上验证另一个智能合约触发了某个 event?
- 当调用 selfdestruct 时,Ether 是在什么时候转移的?智能合约的 bytecode 是在什么时候被擦除的?
- 在什么条件下 Openzeppelin 的 Proxy.sol 会覆盖 free memory pointer?为什么这样做是安全的?
- 为什么 Solidity 弃用了 “years” 关键字?
- verbatim 关键字的作用是什么,它可以用在哪里?
- 在调用另一个智能合约时,可以转发多少 gas?
- 存储 -1 的 int256 变量在 hex 中是什么样的?
- signextend opcode 的用途是什么?
- 为什么 calldata 中的负数会消耗更多的 gas?
- 什么是 zk-friendly 的 hash 函数?它与非 zk-friendly 的 hash 函数有什么区别?
- metaproxy 是做什么的?
- 在 zero knowledge 的语境下,nullifier 是什么?它的用途是什么?
- 什么是 SECP256K1?
- 为什么不应该从 Uniswap V3 的
slot0中获取价格? - 描述如何在 Solidity 中在链上计算一个数字的 9 次方根。
- 在带有 modifier 的 Solidity 函数中,如果在 assembly 中使用 return 会有什么危险?
- 在不使用
%运算符的情况下,如何判断一个数是偶数还是奇数? - 如果在 constructor 内部调用
codesize(),它会返回什么?如果在 constructor 外部调用呢?
了解更多
参加我们的 Solidity Bootcamp 以加深您对 Ethereum 智能合约开发的了解。