В чем разница между транзакцией и вызовом?

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

112 голосов | спросил mKoeppelmann 30 Jpm1000000pmSat, 30 Jan 2016 22:32:34 +030016 2016, 22:32:34

2 ответа


146

Вызов

Вызов является локальным вызовом контрактной функции, которая не транслирует и не публикует что-либо на блочной цепочке.

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

Это синхронно, и возвращаемое значение контрактной функции возвращается немедленно.

Его web3.js API - это web3.eth.call и это то, что используется для Сопротивление view, pure, pure .

Его базовый JSON-RPC eth_call

Транзакция

Транзакция транслируется в сеть, обрабатывается шахтерами, и, если она действительна, публикуется в блочной цепочке.

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

Это асинхронно, потому что возможно, что ни один майнер не включит транзакцию в блок (например, цена на газ для транзакции может быть слишком низкой). Поскольку он является асинхронным, немедленное возвращаемое значение транзакции всегда является хешей транзакции. Чтобы получить« возвращаемое значение »транзакции для функции, События должны использоваться (если это не обсуждается в Case4 ниже).

Его web3.js API - это web3.eth.sendTransaction и используется, если функция Solidity не отмечена constant.

Его базовый JSON-RPC eth_sendTransaction

sendTransaction будет использоваться, когда требуется глагол, поскольку он яснее, чем просто транзакция.

Рекомендация для вызова сначала, затем sendTransaction

Так как sendTransaction стоит Эфир, это хорошая практика, чтобы «проверить воды», вызывая вызов , прежде чем sendTransaction. Это бесплатный способ отладки и оценки, если будут проблемы с sendTransaction, например, если будет обнаружено исключение из газа.

Этот «сухой ход» обычно работает хорошо, но в некоторых случаях следует понимать, что вызов call является оценкой, например, контрактной функцией, которая возвращает предыдущий blockhash, будет возвращать разные результаты на основе того, когда был выполнен вызов , и когда транзакция фактически была добыта.

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

Case4: могут ли контракты создавать транзакции?

Существует 4 случая, когда можно вызвать контрактную функцию.

Вот 4 случая, а первые 3 были рассмотрены выше :

  1. прямой вызов контрактной функции, созданный с помощью call

  2. прямое обращение к контрактной функции, инициированное sendTransaction

  3. Контрактный вызов контрактной функции, инициированный с помощью call

4. вызов контракта контрактной функции, возникший с помощью sendTransaction

Хотя Case4 звучит так, как контракт может «также делать транзакции», потому что он находится в транзакции, определение транзакции - это данные, подписанные внешним актером. Таким образом, Case4 не является транзакцией.

Из Желтая бумага :

  

Транзакция : фрагмент данных, подписанный внешним актером. Это   представляет либо сообщение, либо новый автономный объект. операции   записываются в каждый блок блочной цепи.

Ранее выше было указано, что события должны были использоваться для получения возвращаемого значения контрактной функции, возникшей с помощью sendTransaction. Это относится и справедливо для Case2. Для Case4 контракт получает прямое значение контрактной функции и может использовать ее. Вот как Желтая бумага говорит это жирным шрифтом:

  

Вызов сообщения .акт передачи сообщения с одной учетной записи на   другой. Если целевая учетная запись связана с непустым EVM   Код, то виртуальная машина будет запущена с состоянием указанного объекта и   в Послании. Если отправитель сообщения является автономным объектом,   то вызов передает любые данные, возвращаемые с работы виртуальной машины

В этих определениях из Желтой страницы видно, что Case4 - это Message Call внутри транзакции (при этом изменения состояния), нет вложенности транзакций , и что единица активности в блок-цепочке Ethereum находится в пределах одной транзакции, которая может содержать несколько Message Calls .

Обновление: поскольку вызов функция может быть неоднозначной (это eth_call или eth_sendTransaction?), есть предложение для eth_simulateTransaction .

ответил eth 31 Jam1000000amSun, 31 Jan 2016 01:20:16 +030016 2016, 01:20:16
29

Разница между вызовом и транзакцией заключается в следующем:

  • транзакции создаются вашим клиентом, подписываются и транслируются в сеть. Они, в конечном счете, изменят состояние блочной цепи, например, манипулируя балансами или значениями в интеллектуальных контрактах.

  • вызовы - это транзакции, выполняемые локально на локальной машине пользователя, которая сама оценивает результат. Они доступны только для чтения и быстро. Они никак не могут изменить блокировку, потому что они никогда не отправляются в сеть. Некоторые примеры «только для чтения /сухой ход /практика».

Вызовы полезны для отладки интеллектуальных контрактов, поскольку они не требуют комиссионных сборов или газа.

ответил Afri 31 Jam1000000amSun, 31 Jan 2016 00:24:06 +030016 2016, 00:24:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132