artifact.require() 继承中的语句?
artifact.require() statement in inheritance?
大家好,我的问题很简单。
我有这份合同:
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);
};
您要查找的答案很可能是#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()
)。
大家好,我的问题很简单。 我有这份合同:
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); };
您要查找的答案很可能是#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()
)。