contract Test {
function Test(){
msg.sender.call.value(0);
msg.sender.call.value(0)();
}
}
В чем разница между первым и вторым звонком? Я предполагаю, что первый на самом деле ничего не делает, однако он действительно компилируется.
Первый не должен ничего делать, потому что функция вызова не вызывается. Вы просто устанавливаете значение, которое хотите отправить, call
но не вызываете его. Это объясняется здесь :
Каждый вызов внешней функции в Solidity можно изменить двумя способами:
- Вы можете добавить Эфир вместе со звонком
- Вы можете ограничить количество газа, доступного для вызова
Что делает
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.amount
Wei отправляется с этим вызовом.