Size: a a a

2020 December 03

MB

Max Block in Ethereum Russia
No snapshotting by default (#11814) — вот это возможно как-то сработало негативно. Но только где этот номер ишью, нет такого в их репе
источник

AZ

Alexey Zhdanov in Ethereum Russia
источник

S

Sergey Boogerwooger in Ethereum Russia
Sergey Mironov
В чем проблема вызовы к другим декс-контрактам генерить от имени кошелька?
flashloan работает в рамках одной транзы, т.е. все должно быть в одной функции контракта, цепочка транзакций не катит
источник

RK

Ruslan Kopylov in Ethereum Russia
Привет!

Есть функция на контракте, которая делает следующее:
Перебирает в цикле for переданный параметр (uint256[]), в этом же цикле вызывает CREATE2 с байткодом от этого контракта:

constructor(address erc20TokenAddress) public
{
   if (erc20TokenAddress != address(0))
     {
         ERC20 token = ERC20(erc20TokenAddress);
         token.safeTransfer(tx.origin, token.balanceOf(address(this)));
     }
     selfdestruct(tx.origin);
}


Перед вызовом функции моего смарт-контракта, я вызываю estimateGas, и использую просчитанный газ в качестве gas limit. Чаще всего это работает и выполнение завершается успешно, но в редких случаях происходит out of gas. Вопросы:

1. estimateGas возвращает на 50% газа больше чем действительно необходимо для выполнения смарта в большинстве случаев. Почему так?
2. почему иногда все же происходит out of gas? что именно может влиять на потребляемый газ после отправки транзы?
3. как можно иначе рассчитывать газ? может статьи какие есть?
источник

SB

Sam Becket in Ethereum Russia
Ruslan Kopylov
Привет!

Есть функция на контракте, которая делает следующее:
Перебирает в цикле for переданный параметр (uint256[]), в этом же цикле вызывает CREATE2 с байткодом от этого контракта:

constructor(address erc20TokenAddress) public
{
   if (erc20TokenAddress != address(0))
     {
         ERC20 token = ERC20(erc20TokenAddress);
         token.safeTransfer(tx.origin, token.balanceOf(address(this)));
     }
     selfdestruct(tx.origin);
}


Перед вызовом функции моего смарт-контракта, я вызываю estimateGas, и использую просчитанный газ в качестве gas limit. Чаще всего это работает и выполнение завершается успешно, но в редких случаях происходит out of gas. Вопросы:

1. estimateGas возвращает на 50% газа больше чем действительно необходимо для выполнения смарта в большинстве случаев. Почему так?
2. почему иногда все же происходит out of gas? что именно может влиять на потребляемый газ после отправки транзы?
3. как можно иначе рассчитывать газ? может статьи какие есть?
я вангую, что это связано с циклом for
источник

RK

Ruslan Kopylov in Ethereum Russia
Sam Becket
я вангую, что это связано с циклом for
почему? туда передается массив uint256, он ходит так:

for (uint i = 0; i<arrayLength; i++)
источник

RK

Ruslan Kopylov in Ethereum Russia
то есть известно сколько будет итераций при вызове функции
источник

S

Sergey in Ethereum Russia
состояние эфира  не меняется между estimate и sendTransaction?
источник

S

Sergey in Ethereum Russia
допустим вы посчитали что нужно отправить токены на адреса A, там было N токенов. Пока вы отправляли - их стало 0, => требуется выделить ячейку, что требует доп. газа.
источник

RK

Ruslan Kopylov in Ethereum Russia
пожалуй на отправку токенов и грешу. если передать в конструктор null, таких случаев (что out of gas) не происходило. то есть меняется только состояние токенов и теоритически возможно что оно требует доп.газа
источник

S

Sergey in Ethereum Russia
попробуйте записать номер блока в момент estimate и номер блока в который включена ваша транзакция. Затем в дебаггере проверьте что поменялось (состояние).
источник

S

Sergey in Ethereum Russia
Выставляйте состояние записанные блоки.
источник

RK

Ruslan Kopylov in Ethereum Russia
а количество пересылаемых токенов влияет на потребляемый газ? (там идет вызов balanceOf(), допустим на время эстимейта было 10 токенов, во время исполнения транзы стало 100, потребление газа будет больше?)
источник

S

Sergey in Ethereum Russia
нет, количество не влияет
источник

S

Sergey in Ethereum Russia
влияет: исполненный код, изменение памяти
источник

S

Sergey in Ethereum Russia
если в контракте есть if (volume > 10) то влияет количество :)))
источник

RK

Ruslan Kopylov in Ethereum Russia
ну это ERC20.safeTransfer , там вроде ничего такого нет. я так понял если что то и связано с токенами, то повлияет только то - что адрес получателя занулился, но такого в моей ситуации скорее всего не представляется возможным
источник

RK

Ruslan Kopylov in Ethereum Russia
Sergey
нет, количество не влияет
мне просто еще интересен момент: почему estimateGas стабильно возвращает на 50% больше газа, чем действительно требует транза? там какая-то константа зашита?
источник

RK

Ruslan Kopylov in Ethereum Russia
он либо блин переоценивает на 50%, либо недооценивает
источник

RK

Ruslan Kopylov in Ethereum Russia
и еще вопрос такой сумбурный: можно ли как-то узнать на упавшей транзе, сколько бы она съела газа, если бы не произошел out of gas?
источник