可靠性:父合同可以查看子合同的数据更新吗?

时间:2019-04-12 16:05:21

标签: inheritance ethereum solidity smartcontracts

我有一个以太坊游戏的过早实现。我将代码分为两个合同,将“游戏”功能与管理员调用的功能分开。

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中所做的数据更改?如果是,该怎么做?

感谢您的帮助。

1 个答案:

答案 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的功能。