什么是映射点更新?

What Mapping dot update is?

试图理解 Uniswap v3-core 的含义,我遇到了一个我无法理解的意想不到的 Solidity 语法,所以我需要有人来解释它。

事情是关于 UniswapV3Pool.sol 合同的,可以在两个网站上找到 etherscan.io and github 的项目。

更重要的是,有以下几行:

406             flippedLower = ticks.update( 
407                 tickLower, 
408                 tick, 
409                 liquidityDelta, 
410                 _feeGrowthGlobal0X128, 
411                 _feeGrowthGlobal1X128, 
412                 secondsPerLiquidityCumulativeX128, 
413                 tickCumulative, 
414                 time, 
415                 false, 
416                 maxLiquidityPerTick 
417             );

但是 ticks 变量只是一个 mapping:

 93     mapping(int24 => Tick.Info) public override ticks;
  1. 所以我不明白。 update 那里叫什么?
  2. 还有一些类似的不解,比如
386         position = positions.get(owner, tickLower, tickUpper);

哪里

 97     mapping(bytes32 => Position.Info) public override positions;

mapping 上也没有 get。怎么回事?

UniswapV3Pool.sol 通过 Tick 库中定义的函数扩展特定的 mapping 类型:

using Tick for mapping(int24 => Tick.Info);

Tick 库然后定义了 update() 函数 (GitHub source)。


Position 库 (GitHub source) 扩展的 positions 映射以及其他一些映射也是如此。

using Position for mapping(bytes32 => Position.Info);

这是 using ... for 的 Solidity 文档:https://docs.soliditylang.org/en/v0.8.11/contracts.html#using-for