Solidity
創建新的 Uniswap V2 對時,代幣排序的邏輯是什麼?
通過UniswapV2Factory合約創建新的pair合約時,呼叫者不能任意設置token在儲存中分配的順序(即the
token0
和token1
vars) :(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
:看起來 Solidity 比較了地址的數值(即它們的十六進制值)。由於
token1
的第一個數字的值大於token0
的數字(0xA
與0x2
),因此比較產生true
。讓我們看另一個例子來說明這一點:
- 令牌0 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
- 令牌1 = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
這一次,函式返回
false
:您可能會猜到原因:
0xC
大於0xA
.Uniswap 很可能這樣做是為了降低集成成本。如果每個人都知道代幣在 Uniswap v2 對中始終按其十六進制值排序,那麼只要客戶知道代幣地址,就不必查詢區塊鏈來找出池中代幣的順序。