Кто оплачивает транзакцию в рамках контракта?

Предположим, я выполняю транзакцию для функции контракта с моей внешней учетной записью, тогда я должен заплатить газ за эту транзакцию.

Если функция внутри контрактов сейчас сама совершает транзакцию, чтобы что-то записать в другие контракты, то кто тогда за это платит?

Я тестировал это в своей truffle developсреде, и похоже, что моя учетная запись только что заплатила за транзакцию по первому контракту, а не по второй транзакции.

Я также не отправлял Эфир на первые контракты раньше. Но вторая транзакция тоже сработала.

  • Бесплатны ли сделки с контрактами?
  • Или это просто специальное поведение в моей тестовой среде, чтобы упростить задачу?

редактировать:

Контракт делает простую транзакцию, примерно такую:

contract First {
    Second secondContract;
    uint test;

    function setSomething(uint _testValue) external {
        secondContract.set(_testValue); //also set a uint within contract 2
        test = _testValue;
    }
}

Если я добавлю следующую строку в свой тест, результат будет 0 Эфира, потому что я никогда не отправляю Эфир на этот контракт.

console.log(`Contract balance: ${web3.fromWei(web3.eth.getBalance(firstContact.address))}`);

Тест все еще работает, и если я прочитаю значение из второго контракта, я также верну правильное значение.

у вас может быть какой-то код в качестве примера? Когда вы запускаете транзакцию внутри контракта, она оплачивается самим контрактом. Транзакции никогда не бывают бесплатными.
Я добавил пример выше
В этом случае газ, использованный по контракту, рассчитывается при первом звонке!
Хорошо, просто для ясности: если я закрою этот первый контракт, я также заплачу со своей учетной записи за вторую транзакцию в рамках первого контракта?
Да именно так и происходит
Спасибо, это именно то, что я хотел знать. Можно один дополнительный вопрос. Могу ли я сравнить свои результаты в тестовой сети и в основной сети? Допустим, транзакция стоила 0,001 эфира в моей тестовой сети... будет ли она такой же в основной сети?
...по точно такому же контракту.
Да, для определенных оп-кодов есть фиксированная стоимость газа!

Ответы (1)

Газ, потребляемый вашей транзакцией, — это общий газ, использованный во время выполнения вашего вызова Contract A. Если A делает вызов (или делегирует вызов) другому контракту, газ, потребляемый этим контрактом, также добавляется к газу, потребляемому вашей транзакцией.

Если вы посмотрите на трассировку четности для одной из таких транзакций, вы увидите различные другие вызванные контракты и сколько газа было использовано при вызове. Окончательная стоимость сделки включает все это.