我有一个以太坊游戏的过早实现。我将代码分为两个合同,将“游戏”功能与管理员调用的功能分开。
Admin.sol继承自Game.sol,如下所示。在Admin中创建了一个struct对象,但是Game无法看到它。 (Getter函数什么也不返回)
import "./Game.sol";
contract Admin is Game
即使没有分成两个合同,相同的代码也可以正常工作。
创建对象的Admin.sol中的函数头:
function createJob(string memory _jname, uint _reward, uint _application_period, uint _job_duration) public {
Game.sol中getter函数的标题:
function getJob(uint _jID) public view returns (string memory, uint, uint, uint, uint)
我从吸气剂中得到的是:
结果{'0':'','1':,'2':,'3':,'4':}
很明显,这只是在映射中向我显示了一个“空”点。
是否可以让Game.sol看到在Admin.sol中所做的数据更改?如果是,该怎么做?
感谢您的帮助。
答案 0 :(得分:1)
是的,有可能。您首先需要了解的几件事是SmartContract只能访问在EVM中分配的自己的存储,因此一个smartcontract不能访问另一个SmartContract的变量,直到它们被继承。在您的情况下,您可能要分别部署它们,并且在更新值时使用的是不同的实例。
您要做的是仅部署一个具有继承性的合同(在下面的示例中为ContractB)。您也可以在哪里使用父合同的功能。这是示例
<form action="/abcd" id="checkoutForm" name="checkoutForm" class="place-order-form col-xs-12" data-parsley-validate="parsley" data-parsley-excluded="input[type=button], input[type=submit], input[type=reset], :hidden">
<div class="card" id='section'>
<div aria-expanded="false" aria-labelledby="chk-header-0"
class="collapse show" id="chk-collapse-0">
<select id="selectedOption" name="selectedOption"
class="form-control form-control-lg">
<option value="B">select option B</option>
<option value="A">select Option a</option>
</select>
<div class="showContentB">
<input
aria-label="Company / Institution"
class="form-control form-control-lg
invalidStringCheck" id="company"
type="text" value=""
name="companyName"
data-parsley-required="true"
data-parsley-error-message='Error in field'
data-parsley-errors-container="#errorMsg">
</div>
<div class="showContentA">
text
</div>
</div>
</div>
<button type="submit">Submit</submit>
</form>
合同B就是这样
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,则可以访问合同A的功能,因此只需一个实例即可进行更改,并且它将存储在EVM的相同存储空间中,可以用正确的值进行访问。
您也可以通过部署ContractB在混音上对其进行检查,并且可以看到Contract A的功能。