【问题标题】:Solidity default constructor with address parameter带有地址参数的 Solidity 默认构造函数
【发布时间】:2022-01-26 05:25:09
【问题描述】:

在学习 Solidity 时,我很难理解下面的 isApprovedForAll 函数是如何工作的。

我特别想了解使用address 参数调用默认ProxyRegistry 构造函数如何创建初始mapping,该初始映射是什么样的,以及为什么我应该期望if 语句返回真的。

代码取自官方 OpenSea api 示例。

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract SomeContract {

    address proxyRegistryAddress;

    constructor(
        address _proxyRegistryAddress
    ) {
        proxyRegistryAddress = _proxyRegistryAddress;
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        returns (bool)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return false;
    }
}

【问题讨论】:

    标签: mapping solidity


    【解决方案1】:
    ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
    

    此行不调用ProxyRegistry 构造函数。它创建了一个指向proxyRegistryAddress 地址的辅助对象(命名为proxyRegistry,并假设有一个合约实现了ProxyRegistry 合约中定义的函数。

    在这种情况下,只定义 interface ProxyRegistry { 而不是 contract ProxyRegistry { 可能会更容易混淆。

    但如果你想将ProxyRegistry 合约部署到新地址并调用其构造函数,则需要使用new 关键字:

    new ProxyRegistry(<constructor_params>);
    

    if (address(proxyRegistry.proxies(owner)) == operator) {
        return true;
    }
    

    这个 sn-p 调用远程合约上的autogenerated getter 函数proxies(address),通过其键检索映射值。如果远程映射值等于operator 值,则返回true

    【讨论】:

    • 谢谢,这非常清楚和有帮助。我不太明白的最后一件事是创建“帮助对象”。您能否指点我一份更详细地解释这一点的文档,或者将其与另一种更主流语言的内容进行比较?
    • documentation 似乎只涵盖两种情况的“外部函数调用”——对同一合约的调用和对远程合约的调用。这在低级方法中是有道理的(EVM 如何处理字节码指令),但对于没有事先了解 EVM 机制的情况下学习 Solidity 的人来说,这可能会有点令人困惑。这就是我提出“帮助对象”术语的原因之一(我也在其他几个答案中使用它)。
    • 与 Web/移动应用程序开发相比的示例:您可以将远程合约调用视为从您的应用程序对远程 API 的调用。您的本地 proxyRegistry 包含两种类型的信息 - API 基本 URL(外部合约地址)和端点列表,包括预期的输入和输出(ProxyRegistry 函数定义)。通过在您的应用程序中调用proxyRegistry.proxies(owner) sn-p,您可以调用外部 API 上的特定端点(在本例中为远程合约上的 proxies(address) 函数)并以预期格式返回输出数据。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2017-09-27
    • 2012-06-30
    • 2015-01-28
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多