Solidity

創建新的 Uniswap V2 對時,代幣排序的邏輯是什麼?

  • June 29, 2021

通過UniswapV2Factory合約創建新的pair合約時,呼叫者不能任意設置token在儲存中分配的順序(即thetoken0token1vars) :

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

Solidity 有什麼作用tokenA < tokenB?變數是address類型。

使用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的第一個數字的值大於token0的數字(0xA0x2),因此比較產生true

讓我們看另一個例子來說明這一點:

  • 令牌0 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
  • 令牌1 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

這一次,函式返回false

混音截圖 #2

您可能會猜到原因:0xC大於0xA.

Uniswap 很可能這樣做是為了降低集成成本。如果每個人都知道代幣在 Uniswap v2 對中始終按其十六進制值排序,那麼只要客戶知道代幣地址,就不必查詢區塊鏈來找出池中代幣的順序。

引用自:https://ethereum.stackexchange.com/questions/102670