【问题标题】:What does this solidity smart contract function mean?这个solidity智能合约功能是什么意思?
【发布时间】:2021-12-28 13:15:23
【问题描述】:

我们正在尝试为自己修改一个可靠的智能合约代码,但无法弄清楚这个块的作用。

function isContract(address account) internal view returns (bool) {
    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. keccak256('')
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    // solhint-disable-next-line no-inline-assembly
    assembly { codehash := extcodehash(account) }
    return (codehash != accountHash && codehash != 0x0);
}

您能帮帮我们吗?这是合约的完整源代码

https://bscscan.com/address/0x1CCC22CC1658ea8581aDcE07E273c3c92B6065d0#code

【问题讨论】:

  • 请格式化您问题的代码部分,使其更具可读性

标签: solidity smartcontracts


【解决方案1】:

extcodehash 操作码(在EIP-1052 中引入)返回地址字节码的哈希值(而不是实际字节码)。

0x0 的哈希值存储在 accountHash 值中。因此,如果 extcodehash 返回 0xc5d2... 值,则意味着它是一个 EOA(代表“外部拥有的地址”,简称 - 一个没有合约的地址)。

另外,从未使用过的地址地址的extcodehash0x0。 “从未使用”的定义在从 1052 链接的 EIP-161 中。


所以isContract()函数返回true,如果两个条件都满足:

  1. 地址包含一个非零字节码,即它是一个智能合约 (codehash != accountHash)。

  2. 地址已被状态更改操作使用。 (codehash != 0x0)。这是一个多余的条件,因为合约部署总是一个状态改变的操作。

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 2023-02-09
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多