Понимание результатов "eth_estimateGas" при оценке газа

Я играл с вызовом паритета «eth_estimateGas», чтобы определить различные требования к газу для токенов. Как правило, используя этот код:

 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
    }]);

Я получаю разные результаты в зависимости от адреса отправителя. Если этот адрес выполнил тысячи транзакций (например, биржа), количество используемого газа значительно выше, чем адрес, который выполнил только 10 транзакций. Ничего не изменилось, кроме адреса from.

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

Что мне не хватает?

РЕДАКТИРОВАТЬ: Вот пример данных. Жетон: FunFair

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

При подключении этих значений к вызову четности результаты оценки имеют примерно одинаковую дисперсию.

Чтобы отладить это, не просто угадывая, нам нужно увидеть адрес контракта, адрес назначения и адреса, которые fromвы сравниваете. Количество транзакций, ранее совершенных по счету, не имеет прямого влияния.
спасибо @smarx, я обновил вопрос конкретным примером.

Ответы (1)

Мне лень подтверждать на 100%, но я почти уверен, что в приведенном вами примере ключевое отличие состоит в том, что более дешевая транзакция была для полного баланса токенов отправителя. Это означает, что они закончили с нулевым балансом. Установка значения в хранилище с ненулевого значения на нулевое значение дает вам возмещение газа, снижая стоимость транзакции. (Это стимулирует очистку хранилища.)

Интересный! Я собираюсь покопаться в этом немного больше ... если это действительно то, что происходит, я отмечу как решенное!
Происходят две вещи. Как указывает smarx, в более дешевой транзакции отправитель переводит все свои токены (возврат 15к), а у получателя уже ненулевой баланс. В более дорогих отправитель не отправляет полный баланс, а получатель ранее не имел токенов и должен платить за новое хранилище слотов (около 20 000). Первый использует + 15 000 газа, чем «обычный» перевод, а второй имеет возврат газа -15 000, общая разница близка к 30 000 между обоими вызовами.