- 在 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 费用贵?
-
- Storage 写操作第一次比后续更贵(冷启动)
- 第一次写入某个存储槽(storage slot):20,000 gas
- 从非零变成另一个非零:5,000 gas
- 清除存储(变为零):可返还 15,000 gas
-
- 首次调用一个合约函数时,EVM 需要加载合约字节码、建立内存/代码缓存等结构,开销可能会更大。(尤其 L2 上明显)
-
SLOAD
/SSTORE
操作有“冷/热访问”差别(EIP-2929)
- 冷访问存储(首次访问某个槽位):贵
- 热访问存储(在当前交易中已访问过):便宜
- 所以第一次访问某些变量或合约地址,gas 成本更高。
-
- 合约逻辑中有初始化流程只在第一次触发
-
- 合约使用外部合约,首次调用触发部署或加载(如 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 | 引入 baseFee 和 maxFee ,实现更稳定和弹性的 gas 模型 |