假设我通过调用父合同中的函数来创建另一个合同,创建新合同所需的气体是否包含在运行创建新合同的函数中?
pragma solidity ^0.4.15;
contract Test {
bool public active = true;
address public owner;
address public contract_address;
uint public amountReceived;
address[] public activeContracts;
uint256 public gasLeft;
function () payable {
amountReceived = msg.value;
gasLeft = msg.gas;
}
function Test() {
owner = msg.sender;
contract_address = this;
gasLeft = msg.gas;
}
function updateStatus() {
active = false;
}
function kill() {
selfdestruct(owner);
gasLeft = msg.gas;
}
function createSubContract() {
address newContractAddress = new SubTest();
activeContracts.push(newContractAddress);
gasLeft = msg.gas;
}
}
contract SubTest {
address public owner;
address public contract_address;
uint256 public amountReceived;
uint256 public gasLeft;
function () payable {
amountReceived = msg.value;
gasLeft = msg.gas;
}
function SubTest() {
owner = msg.sender;
contract_address = this;
gasLeft = msg.gas;
}
function kill() {
selfdestruct(owner);
gasLeft = msg.gas;
}
}这是我正在测试的合同样本。为了创建一个分包合同,我称之为createSubContract函数,调用该函数所需的gas是否包括创建契约所需的gas?
发布于 2017-09-30 09:23:12
是。您必须为您的createSubContract()函数调用分配足够的gas,以便能够覆盖来自createSubContract()的所有后续调用的所有气体使用情况。
尽管对子调用的这种气体分配可以以更精细的方式完成,即您不必将事务的所有气体转发给子调用,因为它解释了这里:
合同可以决定其剩余天然气中的多少应与内部消息调用一起发送,以及它希望保留多少。如果在内部调用(或任何其他异常)中发生异常,这将由放置在堆栈上的错误值发出信号。在这种情况下,只有与呼叫一起发送的气体被耗尽。在稳固性中,在这种情况下,调用契约默认会导致手动异常,从而导致异常“冒泡”调用堆栈。
在未来,大都会硬叉将允许合同支付天然气。检查它的这里,EIP 86 (帐户安全抽象)段。
https://ethereum.stackexchange.com/questions/27495
复制相似问题