问题描述
我正在使用 ethers-rs 编写一个 defi 应用程序。我需要计算 Rust 中的 CREATE2 地址。我在 rust 中找不到 abi.encodePacked(token0,token1)
的等价物。
Uniswap 库中使用的代码(https://vomtom.at/how-to-use-uniswap-v2-as-a-developer):
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address factory,address tokenA,address tokenB) internal pure returns (address pair) {
(address token0,address token1) = sortTokens(tokenA,tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff',factory,keccak256(abi.encodePacked(token0,token1)),hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f' // init code hash
))));
}
不幸的是,我没有从互联网上得到太多帮助。
rust 中 abi.encodePacked 的等价物是什么。
问候。
解决方法
abi.encodePacked
简单地连接序列化参数的字节 - 在本例中为两个地址。
通常 EVM 将数据项填充到 uint256 字边界,但 encodePacked is special。
地址是 160 位(20 字节),所以 encodePacked
的结果应该是 40 字节,两个地址的字节连接起来。