Entendiendo los resultados de "eth_estimateGas" estimando gas

He estado jugando con la llamada "eth_estimateGas" de parity para determinar los diferentes requisitos de gas de tokens. Generalmente usando este código:

 let transfer_data = contract.transfer.getData("<destinaton ETH address>", 1);
    let gas_limit = await rpcCall("eth_estimateGas",[{
        to: contractData.contractAddress,
        from: "<source ETH address>",
        data:transfer_data
    }]);

Obtengo resultados diferentes según la dirección de origen. Si esa dirección ha realizado miles de transacciones (como las de intercambio), la cantidad de gas utilizada es significativamente mayor que una dirección que solo ha realizado 10 transacciones. Nada más modificado además de la dirección de origen.

Mi única teoría es que si el nonce es bastante alto, el contrato o evm tiene que hacer más verificación de que, de hecho, tiene el saldo correcto para completar el envío.

¿Qué me estoy perdiendo?

EDITAR: Aquí hay un ejemplo de datos. Ficha: Feria de diversión

From address has high nonce Contract Address: 0x419d0d8bdd9af5e606ae2232ed285aff190e711b From Address: 0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98 To Adress: 0x6d8401b8ed8755bb4d01a89072860c98c236dc78 https://etherscan.io/tx/0xc407d8320f44745f88244400c3750875e1858e0ee6a1106bafbde424c289a6ef Gas Used: 58999

From address has low nonce Contract Address: 0x419d0d8bdd9af5e606ae2232ed285aff190e711b From Address: 0x8c301c986e6d23117f17394722272fcd16d43efd To Adress: 0x3f5ce5fbfe3e9af3971dd833d26ba9b5c936f0be https://etherscan.io/tx/0x708fb93a22f4ddd3d410f7280fb3800c8ff96deed5d4fafa12244d0f74e48045 Gas Used: 29127

Al conectar esos valores en la llamada de paridad, los resultados de la estimación tienen aproximadamente la misma varianza.

Para depurar esto sin solo adivinar, necesitaríamos ver la dirección del contrato, la dirección de destino y las fromdirecciones que está comparando. El número de transacciones realizadas anteriormente por la cuenta no tiene un impacto directo.
gracias @smarx, actualicé la pregunta con un ejemplo específico.

Respuestas (1)

Soy demasiado perezoso para confirmarlo al 100%, pero estoy bastante seguro de que en el ejemplo que diste, la diferencia clave es que la transacción más barata fue por el saldo total del token del remitente. Esto significa que terminaron con un saldo de cero. Establecer un valor en el almacenamiento de un valor distinto de cero a un valor cero le brinda un reembolso de gasolina, lo que reduce el costo de la transacción. (Esto incentiva la limpieza del almacenamiento).

¡Interesante! Voy a profundizar un poco más en eso ... si eso es lo que está sucediendo, ¡lo marcaré como resuelto!
Están sucediendo dos cosas. Como señaló Smarx, en la transacción más barata, el remitente transfiere todos sus tokens (reembolso de 15k) y el receptor ya tiene un saldo distinto de cero. En el más caro, el remitente no envía el saldo completo y el destinatario no tiene tokens previamente y tiene que pagar por un nuevo espacio de almacenamiento (alrededor de 20k). El primero usa +15k de gas que una transferencia 'normal', y el segundo tiene -15k de reembolso de gas, el total es cercano a la diferencia de 30k entre ambas llamadas.