Pruebas de costo de gas: ¿Enviar una transacción a una nueva dirección es más costoso?

Un amigo y yo estábamos pensando en los costos de transacción, ¿hay algún costo adicional para enviar una transferencia a una nueva dirección que no se haya almacenado en cadena antes? Así que empezamos a cavar.

En primer lugar, llamamos a transferir a una nueva dirección y otra que se ha utilizado antes, como era de esperar, el costo fue de 21000 para ambos.

Nueva dirección: https://ropsten.etherscan.io/tx/0xec05af75ec938aa1cc78612b13d8d2e3c8f4212f60173161450297c9a25ea5a3

Minero (usado antes) dirección: https://ropsten.etherscan.io/tx/0x7fe1c8c699901923d89e07a9b66e7d952c67064bcc9d86bf84bad07cac2391b1

Luego intentamos hacer la transferencia desde un SC, esta es la función que estamos usando:

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

Bastante simple, comenzamos a probar, llamamos a la función a una nueva dirección:

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

Lo primero que sorprendió fue el costo de ejecutar esta función, fue 55356 de gas, mucho más alto que los 21000 que vimos antes, lo llamamos de nuevo:

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

Para nuestra sorpresa, ahora los costos de gasolina eran 30356 mucho menores que antes, ¿por qué?

Intentamos llamar a la función en una dirección usada (que ya debería estar almacenada en la cadena) para ver si enviar a una nueva dirección era el factor diferencial, lo hicimos dos veces:

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

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

Y costó 30356 en ambos.

¿Por qué sucede esto, por qué enviar ether a una nueva dirección desde un SC cuesta más de un 50% más que enviar a una dirección usada?

Tendrías que compartir el código para el contrato inteligente. El costo del gas de una transferllamada no debería depender de si el destinatario ha sido destinatario de transferencias anteriores, pero es difícil darte una explicación sin ver el código.
(Para aclarar, veo la función que proporcionó, pero sin el código completo, es difícil asociarlo con el código de bytes y recorrerlo).
el resto del contrato no debería importar ¿verdad? De todos modos, MathematicalRain lo entendió, aprendí algo nuevo hoy :) Por cierto, soy fanático de tu juego cte, ¡gracias por eso!
En cuanto al costo del gas, no, el resto del contrato no debería importar. ¡Yo también aprendí algo nuevo!

Respuestas (1)

Sí, es cierto. Si lee el documento Ethereum Yellow, puede ver en el Apéndice H que tiene que pagar gasolina adicional si envía Ether a una nueva cuenta.

Esto es para desalentar a las direcciones que envían una gran cantidad de transacciones a nuevas direcciones, aumentando así el tamaño de la cadena.

tiene sentido, pero ¿por qué no se aplica con una dirección regular? transferencia (cantidad) siempre son 21000 sin importar si la dirección es nueva o no
FYI, encontré esto más accesible en el Apéndice G, la entrada para Gnewaccount. El costo del gas es de 25000 para una "operación de LLAMADA o SUICIDIO que crea una nueva cuenta".
@smarx Tiene razón, 25000 es la diferencia exacta y se ha creado una nueva cuenta. Excavando un poco más, encontré que este costo se estableció debido a un error de cálculo de gas explotado alrededor del bloque 2100000, todavía no sé por qué esto no se aplica a la dirección regular.