Допустим, я создаю контракт из другого контракта, вызывая функцию в родительском контракте. Требуется ли газ для создания нового контракта, включенного в запуск функции, которая создает новый контракт?
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. Включает ли газ, необходимый для вызова этой функции, газ, необходимый для создания контракта?
Да. Вы должны позаботиться о назначении достаточного количества газа для createSubContract()
вызова функции, чтобы иметь возможность покрыть все использование газа всеми последующими вызовами, исходящими из createSubContract()
.
Хотя это назначение газа для дополнительных вызовов может быть выполнено более точным способом, то есть вам не нужно перенаправлять весь газ вашей транзакции на дополнительный вызов, как это объясняется здесь :
Контракт может решить, сколько оставшегося газа должно быть отправлено с вызовом внутреннего сообщения и сколько он хочет сохранить. Если во внутреннем вызове (или любом другом исключении) произойдет исключение из-за отсутствия газа, об этом будет сигнализировано значением ошибки, помещенным в стек. При этом расходуется только газ, отправленный вместе со звонком. В Solidity вызывающий контракт по умолчанию вызывает вручную исключение в таких ситуациях, так что исключения «пузырятся» в стеке вызовов.
В будущем хардфорк Metropolis позволит контрактам оплачивать газ. Ознакомьтесь с параграфом EIP 86 (абстракция безопасности учетной записи) .