想知道是否有人可以解释这一点。我正在学习 freeCodeCamp.org 的“Solidity、区块链和智能合约课程 - 从初学者到专家的 Python 教程”。
在第二课中,我们创建一个合约工厂,在其中存储合约数组,然后创建一个函数来按索引检索合约并调用其上的函数。
他是这样做的:
SimpleStorage(address(simpleStorages[_simpleStorageIndex])).store(_simpleStorageNumber)
我不明白 SimpleStorage(address(...)) 部分。我了解索引到数组并获取存储,但我测试了它,效果是一样的:
simpleStorages[_simpleStorageIndex].store(_simpleStorageNumber)
这个地址函数是什么?我假设它获取了合约实例的地址。那为什么我们要把它传递给SimpleStorage的构造函数(?)呢?为什么在调用实例本身上的 store 而不通过地址时要执行所有这些操作。
谢谢!!
编辑:整个合同:
// 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()
函数,实际上是一种更直接的方法,可以达到与讲师的代码相同的结果。
所以回答你的问题:
这个地址功能是什么?我假设它获取了合约实例的地址。
正确。即使
simpleStorages[_simpleStorageIndex]
不存储实际的 SimpleStorage
实例。在你的合约中,它只存储一个辅助对象,其中包含指向外部合约地址的指针,以及 SimpleStorage
的接口定义(但不是外部合约的实际实例)。
将辅助对象类型转换为
address
返回外部合约的地址。
那我们为什么要把它传递给SimpleStorage的构造函数(?)
您不会将其传递给
SimpleStorage
构造函数 - 这将是带有 new SimpleStorage(<constructor_params>)
关键字的 new
(有效地将 SimpleStorage
合约部署到新地址)。您正在实例化上述帮助器对象,并向其传递外部合约地址。
为什么在实例本身上调用 store 而不通过地址时会执行所有这些操作。
我不知道讲师这段代码背后的意图。也许他们稍后会在课程中使用它来描述一些优化或作为展示其他主题的桥梁。但这两种方法都有效。