Мне было интересно, является ли функция «transfer ()» вызовом или транзакцией.
Мы знаем, что контракты отправляют только сообщения, а не транзакции.
Если контракт, подобный DAO, имеет переменную и порог, когда переменная достигает порога, контракт автоматически переводит некоторое количество эфира на счет.
Вопрос : Является ли эта передача эфира (выполненная с помощью Transfer()) сообщением или транзакцией?
В общем, я хотел бы знать, как перевод Эфира с контрактного счета кому-либо описывается с точки зрения транзакции/сообщения.
Транзакции Ethereum также являются сообщениями. Разница в том, что транзакции являются подписанными сообщениями, потому что они были подписаны человеком с закрытым ключом.
Контракты Ethereum создают «неподписанные сообщения», а люди создают «подписанные сообщения».
Когда контракт вызывает .send()
или .transfer()
, он может перевести некоторое количество эфира. Это неподписанное сообщение, но его также называют «внутренней транзакцией». Пример:
https://etherscan.io/tx/0x3f50e8b755fdefceb2dad2854424211c3c1f8a8b085160c5be5c46d57c2ec183#internal
В этой транзакции человек-владелец 0xc459...
вызвал функцию по контракту 0xe70b...
, создав подписанное сообщение. Затем контракт призвал .send()
создать неподписанное сообщение для передачи некоторого количества эфира в 0xc459...
.
Подписанные сообщения физически хранятся в блокчейне, на жестких дисках узлов Ethereum. Неподписанные сообщения не обязательно сохраняются, они подразумеваются потоком выполнения вызова функции контракта.
В заключении:
Подписанные сообщения являются «транзакциями» и создаются людьми.
Неподписанные сообщения являются «внутренними транзакциями» и создаются контрактами с использованием вызова функции.
Да, внутренняя транзакция (вызов сообщения) определенно может изменить состояние контракта. вы также можете указать лимит газа, добавив .gas() после имени функции.
Ай.
Иесбус
Ай.
Ай.
CJ42