Solidity
三元運算符 Uniswap createPair 函式是做什麼的?
function createPair(address tokenA, address tokenB) external returns (address pair) { require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES'); (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient bytes memory bytecode = type(UniswapV2Pair).creationCode; bytes32 salt = keccak256(abi.encodePacked(token0, token1)); assembly { pair := create2(0, add(bytecode, 32), mload(bytecode), salt) } IUniswapV2Pair(pair).initialize(token0, token1); getPair[token0][token1] = pair; getPair[token1][token0] = pair; // populate mapping in the reverse direction allPairs.push(pair); emit PairCreated(token0, token1, pair, allPairs.length); }
我無法理解這行程式碼的作用。它正在將 tokenA 與地址類型的 tokenB 進行比較。任何更多的解釋都會非常有幫助。
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
提前致謝 !!!
如果您要詢問三元運算符的作用,它相當於以更緊湊(且不太明顯)形式的 if /else 語句。
condition ? do_that_if_condition_is_true : do_that_if_condition_is_false;
在您的特定程式碼段中,它用於在創建令牌對之前以特定方式對地址進行排序。排序確保第一個令牌地址的數字小於第二個令牌地址(您的地址只是本質上是整數的十六進製表示,您可以進行比較)。
例如:令牌A = 地址(100)和令牌B = 地址(50)
- 令牌0 = 令牌B
- 令牌1 = 令牌A
其中:pair 總是等於 (token1, token2)。
這基本上就是這條線的作用:
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
鑑於 :
- 地址是唯一的
- 令牌地址不能相等 (
require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES');
)保證排序為給定對提供唯一標識符。
最後,一個簡單的檢查就足以驗證該對是否已經存在:
require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient
如果沒有,則可以創建它。