Тесты стоимости газа: отправка транзакции на новый адрес дороже?

Мы с другом думали о транзакционных издержках, есть ли дополнительные расходы на отправку перевода на новый адрес, который раньше не хранился в цепочке? Итак, мы начали копать.

Первым делом позвонили с переводом на новый адрес и еще один, который уже использовался ранее, как и ожидалось, стоимость 21000 для обоих.

Новый адрес: https://ropsten.etherscan.io/tx/0xec05af75ec938aa1cc78612b13d8d2e3c8f4212f60173161450297c9a25ea5a3

Адрес майнера (использовался ранее): https://ropsten.etherscan.io/tx/0x7fe1c8c699901923d89e07a9b66e7d952c67064bcc9d86bf84bad07cac2391b1

Затем мы попытались сделать перевод из СЦ, вот эту функцию мы и используем:

function test (address receiver) public payable { receiver.transfer(msg.value); }

Достаточно просто, мы начали тестирование, вызвали функцию по новому адресу:

https://ropsten.etherscan.io/tx/0x38dabd569350fa985e11f892f7175ad09a32a0c067b993f68152f34d7ca4dcb3

Первым удивительным моментом была стоимость выполнения этой функции, она составила 55356 газа, что намного выше, чем 21000, которые мы видели раньше, мы снова назвали это:

https://ropsten.etherscan.io/tx/0xa2d23ea51102cc98f92b6ef89ed452a5be0e0ebbc26c136fc43f9a5a67a99a52

К нашему удивлению, теперь затраты на газ были 30356 намного меньше, чем раньше, почему??

Мы попытались вызвать функцию по используемому адресу (который уже должен быть сохранен в цепочке), чтобы увидеть, является ли отправка на новый адрес дифференциальным фактором, мы сделали это дважды:

https://ropsten.etherscan.io/tx/0xf9eb2e6536db2ec933ac21fb5bd8c422b6ae3b811f4bd72be4a55e02a6aec227

https://ropsten.etherscan.io/tx/0x4ef30764af81df4dc0dcc98bd4db5424c0c2bea99257df829b1c347a8764048f

И стоил 30356 в обоих.

Почему так происходит, почему отправка эфира на новый адрес из СЦ стоит более чем на 50% дороже, чем отправка на старый адрес?

Вам придется поделиться кодом смарт-контракта. Стоимость газа transferзвонка не должна зависеть от того, был ли получатель получателем более ранних переводов, но трудно дать вам объяснение, не видя кода.
(Чтобы уточнить, я вижу предоставленную вами функцию, но без полного кода ее трудно связать с байт-кодом и пройти через нее.)
остальная часть контракта не должна иметь значения, верно? в любом случае MathematicalRain понял, сегодня я узнал кое-что новое :) Кстати, я фанат вашей игры cte, спасибо за это!
Что касается стоимости газа, то нет, остальное в контракте не должно иметь значения. Я тоже узнал кое-что новое!

Ответы (1)

Да, это правда. Если вы читали желтую бумагу Ethereum, вы можете увидеть в Приложении H, что вам придется платить за дополнительный газ, если вы отправляете эфир на новую учетную запись.

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

имеет смысл, но почему это не применимо к обычному адресу?
К вашему сведению, я нашел это наиболее доступным в Приложении G, записи для Gnewaccount. Стоимость газа составляет 25000 за операцию «ЗВОНОК или САМОУБИЙСТВО, которая создает новую учетную запись».
@smarx Вы правы, 25000 - это точная разница, и была создана новая учетная запись. Копнув еще немного, я обнаружил, что эта стоимость была установлена ​​​​из-за ошибки расчета газа, используемой примерно в блоке 2100000, до сих пор не знаю, почему это не применяется к обычному адресу.