Является ли «перевод» транзакцией или звонком/сообщением?

Мне было интересно, является ли функция «transfer ()» вызовом или транзакцией.

Мы знаем, что контракты отправляют только сообщения, а не транзакции.

Если контракт, подобный DAO, имеет переменную и порог, когда переменная достигает порога, контракт автоматически переводит некоторое количество эфира на счет.

Вопрос : Является ли эта передача эфира (выполненная с помощью Transfer()) сообщением или транзакцией?

В общем, я хотел бы знать, как перевод Эфира с контрактного счета кому-либо описывается с точки зрения транзакции/сообщения.

Ответы (2)

Транзакции Ethereum также являются сообщениями. Разница в том, что транзакции являются подписанными сообщениями, потому что они были подписаны человеком с закрытым ключом.

Контракты Ethereum создают «неподписанные сообщения», а люди создают «подписанные сообщения».

Когда контракт вызывает .send()или .transfer(), он может перевести некоторое количество эфира. Это неподписанное сообщение, но его также называют «внутренней транзакцией». Пример:

https://etherscan.io/tx/0x3f50e8b755fdefceb2dad2854424211c3c1f8a8b085160c5be5c46d57c2ec183#internal

В этой транзакции человек-владелец 0xc459...вызвал функцию по контракту 0xe70b..., создав подписанное сообщение. Затем контракт призвал .send()создать неподписанное сообщение для передачи некоторого количества эфира в 0xc459....

Подписанные сообщения физически хранятся в блокчейне, на жестких дисках узлов Ethereum. Неподписанные сообщения не обязательно сохраняются, они подразумеваются потоком выполнения вызова функции контракта.

В заключении:

Подписанные сообщения являются «транзакциями» и создаются людьми.

Неподписанные сообщения являются «внутренними транзакциями» и создаются контрактами с использованием вызова функции.

Спасибо за ответ, но возникает другой вопрос: в моем примере, если внутренние транзакции не включены в блокчейн, то как будет уменьшаться баланс эфира контракта и увеличиваться баланс эфира получателя?
@AdrianAd, каждый узел Ethereum, который с самого начала следует за блокчейном, будет следовать потоку выполнения каждого вызова функции контракта. Все они придут к одному и тому же выводу: должна иметь место внутренняя транзакция, что баланс контракта должен быть уменьшен, а баланс получателя увеличен. После того, как балансы были обновлены, нет необходимости помнить, как они были обновлены.
Да, спасибо! Было бы здорово добавить что-нибудь к вашему ответу для других, кто его прочитал. Ваше здоровье!
Мне интересно, может ли внутренняя транзакция изменить состояние контракта?
@Jesbus Если контракт отправляет эфир другому контракту (или другому пользователю), каким будет поле полезной нагрузки данных? Пустой?

Да, внутренняя транзакция (вызов сообщения) определенно может изменить состояние контракта. вы также можете указать лимит газа, добавив .gas() после имени функции.