foundry-rs / foundry

Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.
https://getfoundry.sh
Apache License 2.0
8.12k stars 1.68k forks source link

feat(`snapshots`): track internal gas usage #3766

Open PaulRBerg opened 1 year ago

PaulRBerg commented 1 year ago

Component

Forge

Describe the feature you would like

I would like to have gas reports for free functions, e.g.

function min(uint x, uint y) pure returns (uint) {
    return x < y ? x : y;
}

Passing --gas-report to Forge doesn't generate a report. The only solution as of now is to wrap my free functions in an intermediary mock contract used specifically for testing.

rkrasiuk commented 1 year ago

@paulrberg as described in the book, gas reporting traces the external contract calls. since free functions act as internal functions, we cannot correctly identify calls to them.

theoretically, we could record the jumps within each call, but 1) we wouldn't be able to decode them since free/internal functions are not a part of the artifacts 2) encountering a jump doesn't necessarily mean we've entered the internal function 3) that'd produce a lot of data which imo would dilute the value of gas reports

@mattsse @onbjerg @draganrakita @mds1 curious to hear your thoughts

PaulRBerg commented 1 year ago

Thanks for explaining the difficulties of implementing this, @rkrasiuk.

I wonder if the user could somehow help Forge identify the functions that should be metered? e.g. what if there was a field in the Foundry config like meter_free_functions or gas_reports_free_functions (or something along those lines)? Would that help in any way?

Btw, this is related to https://github.com/foundry-rs/foundry/issues/3723.

rkrasiuk commented 1 year ago

the config would still not solve the instruction to code reverse lookup, only the collected functions.

some thought dump: