在合约构造函数中使用地址函数?

Use of address function inside a contract constructor?

想知道是否有人可以解释一下。我正在学习 freeCodeCamp.org 的“Solidity、区块链和智能合约课程 - 初学者到专家 Python 教程”。

在第二课中,我们创建了一个合约工厂,我们在其中存储了一个合约数组,然后创建了一个函数来通过索引检索合约并对其调用函数。

这是他的做法:SimpleStorage(address(simpleStorages[_simpleStorageIndex])).store(_simpleStorageNumber)

我不明白 SimpleStorage(address(...)) 部分。我了解索引到数组并获取存储空间,但我对其进行了测试,效果相同:simpleStorages[_simpleStorageIndex].store(_simpleStorageNumber)

这个地址函数是什么?我假设它获取了合约实例的地址。那我们为什么要把它传递给 SimpleStorage 的构造函数(?)?为什么在不通过地址的情况下在实例本身上调用存储时要执行所有这些操作。

谢谢!!

编辑:整个合同:

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "./SimpleStorage.sol";

contract StorageFactory is SimpleStorage { // is SimpleStorgae = inheritance 

    SimpleStorage[] public simpleStorages;

    function createSimpleStorageContract() public {
        SimpleStorage simpleStorage = new SimpleStorage();
        simpleStorages.push(simpleStorage);
    }

    function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public {
        // Anytime you interact with a contract you need two things:
        // Address
        // ABI - Application Binary Interface
        return simpleStorages[_simpleStorageIndex].store(_simpleStorageNumber);
        //return SimpleStorage(address(simpleStorages[_simpleStorageIndex])).store(_simpleStorageNumber);
    }

    function sfGet(uint256 _simpleStorageIndex) public view returns(uint256) {
        return SimpleStorage(address(simpleStorages[_simpleStorageIndex])).retrieve();
    }
}

您的方法是直接在项目上调用 store() 函数,实际上是获得与讲师代码相同结果的更直接的方法。

所以回答你的问题:

What is this address function? I assume it gets the address of the contract instance.

正确。即使 simpleStorages[_simpleStorageIndex] 不存储实际的 SimpleStorage 实例。在您的合约中,它仅存储一个包含指向外部合约地址的指针的帮助对象,以及 SimpleStorage 的接口定义(但不是外部合约的实际实例)。

将助手对象类型转换为 address returns 外部合约的地址。

Then why do we pass it to a constructor(?) of SimpleStorage

您没有将它传递给 SimpleStorage 构造函数 - 那将是 new SimpleStorage(<constructor_params>)new 关键字(有效地将 SimpleStorage 合约部署到新地址).您正在实例化上述帮助对象,将外部合约地址传递给它。

Why do all this when calling store on the instance itself without going through addresses works.

我不知道讲师这段代码背后的意图。也许他们在课程的后面使用它来描述一些优化或作为展示其他主题的桥梁。但两种方式都有效。