JavaScript 不可用。

我们检测到浏览器禁用了 JavaScript。请启用 JavaScript 或改用支持的浏览器来继续访问

常见的 Solidity 知识点记录

作者:Anban Chu

发表日期:2023年12月25日

所属目录:合约开发

标签:
  • 在 Uniswap V2 中,每个流动性池在初始化时会锁定 1000 最小数量的流动性代币(LP tokens),保留的 1000 代币有什么目的?
    • 当有人首次添加流动性时,Uniswap 会根据投入的资产数量 铸造一定数量的 LP 代币。如果不预留一些数量,首次添加者就会获得全部 LP 代币,理论上拥有 100% 的所有权,那么即使稍后其他人添加更多流动性,也会因为计算上的极限(如无限接近零的份额)导致不合理的结果。
    • _mint(address(0), MINIMUM_LIQUIDITY); 永久锁定
  • Solidity 中调用只读函数,返回的结果不同?
    • 依赖 block, timestamp, gasleft, msg.sender 等全局变量,如果是在同一个块内调用,返回值不同,则可能是依赖了 gasleft,这时候指定交易 gas 可以消除该值的影响。
  • Solidity 函数调用时,为什么第一次调用比后面调用的 gas 费用贵?
      1. Storage 写操作第一次比后续更贵(冷启动)
      • 第一次写入某个存储槽(storage slot):20,000 gas
      • 从非零变成另一个非零:5,000 gas
      • 清除存储(变为零):可返还 15,000 gas
      1. 首次调用一个合约函数时,EVM 需要加载合约字节码、建立内存/代码缓存等结构,开销可能会更大。(尤其 L2 上明显)
      1. SLOAD/SSTORE 操作有“冷/热访问”差别(EIP-2929)
      • 冷访问存储(首次访问某个槽位):贵
      • 热访问存储(在当前交易中已访问过):便宜
      • 所以第一次访问某些变量或合约地址,gas 成本更高。
      1. 合约逻辑中有初始化流程只在第一次触发
      1. 合约使用外部合约,首次调用触发部署或加载(如 proxy pattern)
  • 以太坊交易类型有哪些?
    • type: 0: 普通: 使用 gasPrice 直接指定手续费
    • type: 1: Access List 交易(EIP-2930): 指定提前访问的地址和存储槽,可以降低冷存储访问的 gas 成本(配合 EIP-2929),与类型 0 相比,gas 机制一样,但更优化对 storage 的访问
    • type: 2: EIP-1559 交易(动态手续费): 引入了 baseFee、maxFee、maxPriorityFee, baseFee 由区块头自动设定,用户无需填写,maxFeePerGas = baseFee + maxPriorityFee
类型编号 名称 来源 EIP 特点
0 Legacy 交易(传统交易) EIP-155 原始交易类型,使用固定 gasPrice,最简单
1 Access List 交易 EIP-2930 引入 Access List(访问列表),可降低访问成本
2 EIP-1559 动态手续费交易 EIP-1559 引入 baseFeemaxFee,实现更稳定和弹性的 gas 模型




以上就是本篇文章的全部内容了,希望对你有帮助。

>> 本站不提供评论服务,技术交流请在 Twitter 上找我