artifact.require() 继承中的语句?

artifact.require() statement in inheritance?

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

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);
    };
    

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

When a contract inherits from multiple contracts, only a single contract is created on the blockchain, and the code from all the base contracts is copied into the created contract.

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

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())。