Какова логика упорядочения токенов при создании новой пары Uniswap V2?

При создании нового парного контракта с помощью контракта UniswapV2Factory порядок, в котором токены назначаются в хранилище (то есть переменные token0и token1) , не может быть произвольно установлен вызывающей стороной:

(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);

Что tokenA < tokenBделает в Solidity? Вары — это addressтипы.

Ответы (1)

Легко увидеть, что делает это сравнение при практическом подходе к Remix :

pragma solidity =0.5.16;

contract AddressComparison {
    function cmp(address token0, address token1) external pure returns (bool) {
        return token0 < token1;
    }
}

Скажем, вы передаете следующие два адреса в качестве входных данных:

  • токен0 = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
  • токен1 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

Функция возвращает true:

Ремикс Скриншот #1

Похоже, Solidity сравнивает числовое значение адресов (то есть их шестнадцатеричные значения). Поскольку token1первая цифра 's больше по значению, чем token0цифра 's ( 0xAпо сравнению с 0x2), сравнение дает true.

Давайте посмотрим на другой пример, чтобы донести мысль:

  • токен0 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
  • токен1 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

На этот раз функция возвращает false:

Ремикс Скриншот #2

Вы, наверное, догадались, почему: 0xCбольше, чем 0xA.

Скорее всего, Uniswap сделал это, чтобы удешевить интеграцию. Если все знают, что токены всегда упорядочены по их шестнадцатеричному значению в паре Uniswap v2, клиентам не нужно запрашивать блокчейн, чтобы узнать порядок токенов в пуле, если они знают адреса токенов.

Спасибо за этот отличный ответ, но я хочу добавить к этому. Не могли бы вы помочь проверить эту проблему, они вроде как связаны .. ethereum.stackexchange.com/questions/137654/…