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?
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.
usuario19510
transfer
llamada 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.usuario19510
Enrique Alcázar
usuario19510