【问题标题】:artifact.require() statement in inheritance?继承中的 artifact.require() 语句?
【发布时间】:2018-01-12 12:04:57
【问题描述】:

大家好,我的问题很简单。 我有这份合同:

B.sol

...
contract A {
    ...
}
contract B is A {
    ...
}

当我迁移到我的 B.sol 区块链时,我需要在里面部署每一个合同吗? 请选择其中一个答案并解释原因。

  1. var B = artifacts.require("B");
    
    module.exports = function(deployer) {
        deployer.deploy(B);
    };
    
  2. var A= artifacts.require("A");
    var B= artifacts.require("B");
    
    module.exports = function(deployer) {
        deployer.deploy(A);
        deployer.deploy(B);
    };
    

【问题讨论】:

    标签: migration blockchain solidity truffle


    【解决方案1】:

    您正在寻找的答案很可能是#1。当合约从其他合约继承时,部署期间只创建一个合约。从概念上讲,它与其他面向对象的语言相同。来自Solidity docs

    当一个合约继承自多个合约时,只有一个 合约是在区块链上创建的,所有基础的代码 合约被复制到创建的合约中。

    从技术上讲,您可以拥有一个引用已部署父合同的子合同(见下文)。但是,我想不出这会是一个好的设计。

    pragma solidity ^0.4.18;
    
    contract A {
      uint256 public balance;
    
      function() public payable {
        balance = msg.value;
      }
    }
    
    contract B is A {
      uint256 i;
      A a;
    
      function B(address _a) public {
        a = A(_a);
      }
    
      function receiveForParent() public payable {
        a.transfer(msg.value);
      }
    
      function getParentBalance() public constant returns (uint256) {
        return a.balance();
      }
    }
    

    在这里,您可以部署 A,然后在部署 B 时传入该地址。在这种情况下,调用 B.balance() 或使用回退函数是有效的,因为您正在继承逻辑。但是,B.balance() != A.balance()。 (注意B.getParentBalance() == A.balance())。

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多