在合约构造函数中使用地址函数?
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.
我不知道讲师这段代码背后的意图。也许他们在课程的后面使用它来描述一些优化或作为展示其他主题的桥梁。但两种方式都有效。
想知道是否有人可以解释一下。我正在学习 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.
我不知道讲师这段代码背后的意图。也许他们在课程的后面使用它来描述一些优化或作为展示其他主题的桥梁。但两种方式都有效。