Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Split lib w/bytecode reduction #688

Merged
merged 1 commit into from
May 3, 2023
Merged

Conversation

ryley-o
Copy link
Contributor

@ryley-o ryley-o commented May 3, 2023

Description of the change

PoC of V3 Engine Flex with bytecode size reduction.

It appears that Solidity doesn't do a great job of efficiently using bytecode space when doing the following for external libraries:

  • using syntax using X for Y
  • calling a public function (on an external library) in > 1 place

In this example, all calls to public function on bytecode storage reader library are performed in a single internal helper function, and the using X for Y syntax is removed for the external library.

Bytecode Impacts

The result is a net-change from 24.010 bytes (on splitLib) to 23.909 bytes on this branch, for GenArt721CoreV3_Engine_Flex.sol (possible to get down to 23.865 if we kept optimizer at 10 like it is on splitLib branch)

With respect to current main branch, the change is 23.878 bytes (on main) to 23.909 bytes on this branch, for GenArt721CoreV3_Engine_Flex.sol. (both have optimizer at 25)

Alternate options

Also note that if we don't like this change for readability reasons, there are other ways to reduce bytecode to <24 kb. For example, changing variables from constants to non-constants reduces bytecode size a lot (e.g. bytes32 constant FIELD_NEXT_PROJECT_ID = -> bytes32 FIELD_NEXT_PROJECT_ID =)

@ryley-o ryley-o self-assigned this May 3, 2023
@ryley-o ryley-o marked this pull request as ready for review May 3, 2023 23:50
@ryley-o ryley-o requested a review from a team as a code owner May 3, 2023 23:50
@jakerockland jakerockland merged commit fbb1791 into splitLib May 3, 2023
@jakerockland jakerockland deleted the splitLib-w/bytecode-fix branch May 3, 2023 23:53
jakerockland added a commit that referenced this pull request May 5, 2023
* basic MVP of split library (with tests)

* Adjusted tests for split library setup

* minor modifier adjustment

* Adjust optimizer runs

* optimizer order

* nit

* get interface from deployed contract

* get interface from deployed contract

* ensure libraries are linked

* library linkkinnnn

* More linking fixes in tests

* update Engine Flex as PoC (#688)

* fix the rest of the test bindingsgit diff

* OPTIMIZOOOOOR

* remove unnecessary using for

* Fixed comment

* public constants

* Update library naming convention

* DEPLOYOOOOOR

* DEPLOYOOOOOR

* format

* Address nits

---------

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>
jakerockland added a commit that referenced this pull request May 5, 2023
* Support basic semantic versioning – and ensure interop with backwards compatible reads (tests added)

* update the version string

* minor adjustment and a song: https://www.youtube.com/watch\?v\=vOreqez4v9Y

* Update to reflect better v1/v0/unknown versioning semantics

* Update documentation and code structuring

* Refactor size == 0 check

* clean up offset checks

* `STORE2`-compatible reads in `BytecodeStorage` (#681)

* Update BytecodeStorage library to provide backwards-compatible reads that are compatible with SSTORE2 as the fallback read option, in advance of plans to split off reads into a shared external public utility library, in-companion to the embedded internal library for writes.

* Whoops, forgot to add all the files yo

* add support for manual-offset reads

* SSTORE2 / explicit bytes reads restructure

* Comment fix

* Filename fix

* Filename fix

* Better typing for tests

* spelling fixes

* Split `BytecodeStorage` into public/internal libraries (#684)

* basic MVP of split library (with tests)

* Adjusted tests for split library setup

* minor modifier adjustment

* Adjust optimizer runs

* optimizer order

* nit

* get interface from deployed contract

* get interface from deployed contract

* ensure libraries are linked

* library linkkinnnn

* More linking fixes in tests

* update Engine Flex as PoC (#688)

* fix the rest of the test bindingsgit diff

* OPTIMIZOOOOOR

* remove unnecessary using for

* Fixed comment

* public constants

* Update library naming convention

* DEPLOYOOOOOR

* DEPLOYOOOOOR

* format

* Address nits

---------

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>

---------

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>
jakerockland added a commit that referenced this pull request May 5, 2023
* Remove all call-sites for purgeBytecode, before cleaning up library internals

* Remove purge logic from library entirely

* fix comment

* Update to reflect TWO VERSIONS (https://www.youtube.com/watch\?v\=diIFhc_Kzng)

* Update to reflect TWO VERSIONS (https://www.youtube.com/watch\?v\=diIFhc_Kzng)

* Update contracts/libs/0.8.x/BytecodeStorageV1.sol

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>

* Update contracts/libs/0.8.x/BytecodeStorageV1.sol

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>

* Update contracts/libs/0.8.x/BytecodeStorageV1.sol

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>

* Add basic form of `BytecodeStorage` library versioning (#670)

* Support basic semantic versioning – and ensure interop with backwards compatible reads (tests added)

* update the version string

* minor adjustment and a song: https://www.youtube.com/watch\?v\=vOreqez4v9Y

* Update to reflect better v1/v0/unknown versioning semantics

* Update documentation and code structuring

* Refactor size == 0 check

* clean up offset checks

* `STORE2`-compatible reads in `BytecodeStorage` (#681)

* Update BytecodeStorage library to provide backwards-compatible reads that are compatible with SSTORE2 as the fallback read option, in advance of plans to split off reads into a shared external public utility library, in-companion to the embedded internal library for writes.

* Whoops, forgot to add all the files yo

* add support for manual-offset reads

* SSTORE2 / explicit bytes reads restructure

* Comment fix

* Filename fix

* Filename fix

* Better typing for tests

* spelling fixes

* Split `BytecodeStorage` into public/internal libraries (#684)

* basic MVP of split library (with tests)

* Adjusted tests for split library setup

* minor modifier adjustment

* Adjust optimizer runs

* optimizer order

* nit

* get interface from deployed contract

* get interface from deployed contract

* ensure libraries are linked

* library linkkinnnn

* More linking fixes in tests

* update Engine Flex as PoC (#688)

* fix the rest of the test bindingsgit diff

* OPTIMIZOOOOOR

* remove unnecessary using for

* Fixed comment

* public constants

* Update library naming convention

* DEPLOYOOOOOR

* DEPLOYOOOOOR

* format

* Address nits

---------

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>

---------

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>

---------

Co-authored-by: ryley-o <30364988+ryley-o@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants