В чем разница между .call.value() и .call.value()()

contract Test {

    function Test(){
        msg.sender.call.value(0);
        msg.sender.call.value(0)();
    }

}

В чем разница между первым и вторым звонком? Я предполагаю, что первый на самом деле ничего не делает, однако он действительно компилируется.

Ответы (2)

Первый не должен ничего делать, потому что функция вызова не вызывается. Вы просто устанавливаете значение, которое хотите отправить, callно не вызываете его. Это объясняется здесь :

Каждый вызов внешней функции в Solidity можно изменить двумя способами:

  1. Вы можете добавить Эфир вместе со звонком
  2. Вы можете ограничить количество газа, доступного для вызова

От: https://solidity.readthedocs.io/en/v0.4.11/frequently-asked-questions.html#what-does-p-recipient-call-value-p-amount-p-data-do

Что делает p.recipient.call.value(p.amount)(p.data)? Каждый вызов внешней функции в Solidity можно изменить двумя способами:

Вы можете добавить Ether вместе со звонком. Вы можете ограничить количество газа, доступного для звонка. Это делается «вызовом функции на функции»:

f.gas(2).value(20)()вызывает измененную функцию fи тем самым отправляет 20 Wei и ограничивает газ до 2 (так что этот вызов функции, скорее всего, выйдет из газа и вернет ваши 20 Wei).

В приведенном выше примере низкоуровневая функция callиспользуется для вызова другого контракта с p.dataполезной нагрузкой, и p.amountWei отправляется с этим вызовом.