Как вызов сообщения посылает газ?

contract Sample{

    event Data(uint test) ; 

    function test2() {
        Data(msg.gas) ;
    }
}


contract Sample2{
    function try(address addr){
       Sample(addr).test2() ;
       addr.call(bytes4(keccak256("test2()"))) ;
    }
}

Как вызов метода отправляет газ? Если весь оставшийся газ был отправлен в цель, когда я использую callили просто Sample(address).test2()?

Ответы (1)

Газ отправляется с подписанными транзакциями. Он приходит к функции, скажем Sample2(addressSample2).try().

Поскольку вы не указали количество газа в своем call, весь оставшийся газ отправляется в Sample(addressSample).test2(). Когда он закончен, управление возвращается Sample2(addressSample2).try()вместе с любым неизрасходованным/оставшимся газом. В нем не остается газа Sample(addressSample).

Так как Sample2(addressSample2).try()тоже делается, оставшийся газ возвращается отправителю. Ни в одном контракте не остается избыточного газа, что тоже хорошо, потому что в настоящее время они не могут платить за свой газ.

Sample(address).test2()испускает событие с оставшимся в этот момент газом , но обработка продолжится, как описано выше. Таким образом, некоторый дополнительный газ будет сожжен до завершения транзакции.

В случае, если это неясно, существуют OPCODES на уровне сборки, которые все еще необходимо запустить, прежде чем все будет завершено, как описано выше. Вероятно, достаточно знать, что все еще есть хозяйственные работы, потому что функция (технически) еще не завершена. Если вы так склонны, вы можете перешагнуть OPCODES в Remix, чтобы изучить, что он делает ближе к концу.

Надеюсь, поможет.