Solidity:Parent 合约能否看到来自 Child 合约的数据更新?
Solidity: Can a Parent contract see data updates from a Child contract?
我过早地实施了一款以太坊游戏。我将我的代码分成两个合同,将 "game" 函数与管理员调用的函数分开。
Admin.sol 继承自 Game.sol 如下所示。 Admin中创建了一个struct object,但Game看不到它。 (Getter 函数 returns 没有)
import "./Game.sol";
contract Admin is Game
相同的代码,如果不分成两个合同,可以完美运行。
Header Admin.sol 中创建 object:
的函数
function createJob(string memory _jname, uint _reward, uint _application_period, uint _job_duration) public {
Game.sol中getter函数的Header:
function getJob(uint _jID) public view returns (string memory, uint, uint, uint, uint)
我从 getter 得到的是:
Result { '0': '', '1': , '2': , '3': , '4': }
这很清楚,它只是向我展示了映射中的 "empty" 点。
是否可以让 Game.sol 看到 Admin.sol 中所做的数据更改?如果有,是怎么做到的?
感谢您的帮助。
是的,这是可能的。您首先需要了解的几件事是智能合约只能访问自己在 EVM 中分配的存储,因此一个智能合约在继承之前无法访问另一个智能合约的变量。在您的情况下,您可能会单独部署它们,并且在更新您使用不同实例的值时。
你只需要部署一个具有继承性的合约contract(在下面的例子中是ContractB)。您也可以在哪里使用父合同的功能。这是示例
pragma solidity >=0.4.22 <0.6.0;
contract ContractA {
int a;
function setA(int _a) public {
a = _a;
}
function getA() view public returns(int){
return a;
}
}
而合同B是这样的
pragma solidity >=0.4.22 <0.6.0;
import"./ContractA.sol";
contract ContractB is ContractA {
function getContractAvalue() pure public returns(int){
// For reference that you can also access the function of ContractA in ContractB
return ContractA.a;
}
}
因此,如果您仅部署合约 B,您可以访问合约 A 的功能,因此您可以使用一个实例进行更改,它将存储在 EVM 中相同的 space 存储空间中,这可以可以使用正确的值访问。
你也可以在remix上查看,只需部署ContractB,你就可以看到Contract A的功能。
我过早地实施了一款以太坊游戏。我将我的代码分成两个合同,将 "game" 函数与管理员调用的函数分开。
Admin.sol 继承自 Game.sol 如下所示。 Admin中创建了一个struct object,但Game看不到它。 (Getter 函数 returns 没有)
import "./Game.sol";
contract Admin is Game
相同的代码,如果不分成两个合同,可以完美运行。
Header Admin.sol 中创建 object:
的函数function createJob(string memory _jname, uint _reward, uint _application_period, uint _job_duration) public {
Game.sol中getter函数的Header:
function getJob(uint _jID) public view returns (string memory, uint, uint, uint, uint)
我从 getter 得到的是:
Result { '0': '', '1': , '2': , '3': , '4': }
这很清楚,它只是向我展示了映射中的 "empty" 点。
是否可以让 Game.sol 看到 Admin.sol 中所做的数据更改?如果有,是怎么做到的?
感谢您的帮助。
是的,这是可能的。您首先需要了解的几件事是智能合约只能访问自己在 EVM 中分配的存储,因此一个智能合约在继承之前无法访问另一个智能合约的变量。在您的情况下,您可能会单独部署它们,并且在更新您使用不同实例的值时。
你只需要部署一个具有继承性的合约contract(在下面的例子中是ContractB)。您也可以在哪里使用父合同的功能。这是示例
pragma solidity >=0.4.22 <0.6.0;
contract ContractA {
int a;
function setA(int _a) public {
a = _a;
}
function getA() view public returns(int){
return a;
}
}
而合同B是这样的
pragma solidity >=0.4.22 <0.6.0;
import"./ContractA.sol";
contract ContractB is ContractA {
function getContractAvalue() pure public returns(int){
// For reference that you can also access the function of ContractA in ContractB
return ContractA.a;
}
}
因此,如果您仅部署合约 B,您可以访问合约 A 的功能,因此您可以使用一个实例进行更改,它将存储在 EVM 中相同的 space 存储空间中,这可以可以使用正确的值访问。
你也可以在remix上查看,只需部署ContractB,你就可以看到Contract A的功能。