为啥两个 Uni V3 池有不同的字节码?
Posted
技术标签:
【中文标题】为啥两个 Uni V3 池有不同的字节码?【英文标题】:Why two Uni V3 pools have different bytecodes?为什么两个 Uni V3 池有不同的字节码? 【发布时间】:2021-11-14 09:36:04 【问题描述】:我正在尝试评估两个智能合约(address_1 和 address_2)是否都是使用 web3 的 Uni V3 池。
我的想法是请求每个合约的运行时字节码如下:
sc_i_bytecode = w3.eth.getCode(w3.toChecksumAddress(address_i))
然后将它们与另一个我知道代表 Uni V3 池的智能合约的字节码进行比较。我确实知道 address_1 和 address_2 的两个联系人都是 Uni V3 池,但是当我得到他们上面的字节码时它们不匹配(即sc_1_bytecode != sc_2_bytecode
,尽管它们都是由同一个 Uni 实现的V3工厂?)。它们似乎也不匹配我的 Uni V3 参考字节码的字节码。我只是想知道我是否遗漏了什么,而那些确实有不同的字节码?
谢谢
【问题讨论】:
可以链接两个矿池合约的地址吗? 例如0x6c6Bc977E13Df9b0de53b251522280BB72383700 (DAI-USDC) 和 0xcbcdf9626bc03e24f779434178a73a0b4bad62ed (WBTC) 【参考方案1】:你可以调用智能合约的 factory() 方法
https://etherscan.io/address/0xcbcdf9626bc03e24f779434178a73a0b4bad62ed#readContract
并验证它是否与 v3 工厂合约的地址匹配: https://etherscan.io/address/0x1f98431c8ad98523631ae4a59f267346ea31f984
在您的两个示例池中, factory() 方法返回相同的 v3 工厂合约地址: 0x6c6Bc977E13Df9b0de53b251522280BB72383700 0xcbcdf9626bc03e24f779434178a73a0b4bad62ed
etherscan 上合约代码中的方法:
interface IUniswapV3PoolImmutables
/// @notice The contract that deployed the pool, which must adhere to the IUniswapV3Factory interface
/// @return The contract address
function factory() external view returns (address);
关于你为什么他们有不同的字节码的问题 - 我不是 100% 确定。可能与设置有关? (也从 etherscan 中提取)
"optimizer":
"enabled": true,
"runs": 800
,
"metadata":
"bytecodeHash": "none"
,
"outputSelection":
"*":
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
,
"libraries":
【讨论】:
是的,您可以简单地调用工厂方法来评估一个地址是否是 Uni V3 池,但与仅将其 ABI 与标准 Uni V3 存储的 ABI 进行比较相比,这将涉及一些额外的步骤ABI。所以,再次,只是试图理解为什么两个不同的 Liq 池可能有不同的 ABI。对于上下文,Uni V2 并非如此,所有池都具有相同的 ABI。 @AdamB。您发布的两个 V3 合约在 etherscan 上具有相同的 ABI 从此处复制 etherscan.io/address/… etherscan.io/address/… 在此处进行比较 text-compare.com 这两个 V2 合约具有匹配的 ABI:etherscan.io/address/… etherscan.io/address/… V2 ABI 与 V3 ABI 不匹配,因为预计 @AdamB。 etherscan 上列出的 2 个 v3 合约的合约创建代码也匹配 抱歉,我在上一条评论中指的是字节码而不是 ABI - 就像问题所说的那样。以上是关于为啥两个 Uni V3 池有不同的字节码?的主要内容,如果未能解决你的问题,请参考以下文章