我正在浏览uniswap代码,试图理解这些代码,其中大部分都很清楚,但我确实有几个问题。
在这项职能中:
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);这是装配线。根据solidity,这将部署一个新的契约,但我不明白它是如何工作的,它从哪里获得代码等等。
那么,是否有可能以某种方式将其“转化”为“坚实”呢?非常感谢!
发布于 2022-02-15 09:15:52
它使用create2操作码,允许您将契约部署到可由字节码和salt确定的地址。
Uniswap V2是在Solity0.5中编写的,它没有办法直接从语言中生成create2操作码。所以你必须使用低水平的密码才能真正使用这个操作码。
当前版本0.8允许传递salt参数,生成create2 (而不是常规create)操作码。
pragma solidity ^0.8;
contract UniswapV2Pair {
}
contract MyContract {
function createPair() external {
bytes32 salt = 0x1234567890123456789012345678901234567890123456789012345678901234;
address pair = address(
new UniswapV2Pair{salt: salt}()
);
}
}Uniswap使用对令牌地址的组合作为salt,字节码始终是相同的。这实际上允许为每个唯一的对组合部署一个契约。
示例:
0xabc.
0x123和0x456协议地址UniswapV2Pair,一旦您更改了salt,它就会更改已部署的契约地址。因此,令牌0x123和0x789总是会产生UniswapV2Pair契约地址UniswapV2Pairhttps://stackoverflow.com/questions/71121396
复制相似问题