【问题标题】:artifact.require() statement in inheritance?继承中的 artifact.require() 语句?
【发布时间】:2018-01-12 12:04:57
【问题描述】:
大家好,我的问题很简单。
我有这份合同:
B.sol
...
contract A {
...
}
contract B is A {
...
}
当我迁移到我的 B.sol 区块链时,我需要在里面部署每一个合同吗?
请选择其中一个答案并解释原因。
var B = artifacts.require("B");
module.exports = function(deployer) {
deployer.deploy(B);
};
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())。