SIP-46: Address Resolver Gas Improvements
| Author | |
|---|---|
| Status | Implemented |
| Type | Governance |
| Network | Ethereum |
| Implementor | TBD |
| Release | TBD |
| Created | 2020-03-02 |
Simple Summary
Cache addresses from resolver inside contracts to reduce gas usage.
Abstract
Ensure that each contract relying on addresses from the AddressResolver caches its own copy of these addresses, thereby reducing the gas usage for users when executing regular transactions like issue, burn, claim and exchange. The cache however must be refreshed on each and every deployment.
Motivation
In our Achernar release (v2.19.8), we introduced SIP-43 - an address lookup contract into the FeePool, Synthetix, Exchanger, Issuer and all Synth contracts, among others. The impact to gas on common user functions like FeePool.claim, Synthetix.exchange and Synthetix.issueSynths was signficant.
Prior to Achernar
| Contract | Function | Gas Used |
|---|---|---|
| FeePool | claimFees | 322,641 |
| Synthetix | burnSynths | 352,748 |
| Synthetix | exchange | 226,041 |
| Synthetix | issueMaxSynths | 342,547 |
| Synthetix | issueSynths | 361,070 |
from https://github.com/Synthetixio/synthetix/runs/353850454
After Achernar
| Contract | Function | Gas Used | Diff | % |
|---|---|---|---|---|
| FeePool | claimFees | 497,550 | +174,909 | +54% |
| Synthetix | burnSynths | 547,257 | +193,145 | +55% |
| Synthetix | exchange | 565,260 | +339,218 | +150% |
| Synthetix | issueMaxSynths | 503,953 | +161,406 | +47% |
| Synthetix | issueSynths | 531,401 | +168,223 | +46% |
from https://github.com/Synthetixio/synthetix/runs/457383033
The biggest impact is to exchange() however that was primarily due to SIP-37 (Fee Reclamation) that was also released in Achernar.
By caching the various required addresses, we can reduce these down and not worry about having to write code in each function to limit how often we lookup the addresses required.
Specification
- Introduce a local
mapping(bytes32 => address)cache intoMixinResolver- the functionality included in all contracts that need to communicate via the address resolver - Ensure
MixinResolveris instantiated with a list ofbytes32addresses that the contract needs to know about - Expose a function in
MixinResolver.setResolverAndSyncCache()to sync the cache. This is to be called each deployment whenever any new contracts are added.
Preliminary investigations after Caching and other improvements (such as SIP-41):
| Contract | Function | Gas Used | Diff from pre-Achenar | % |
|---|---|---|---|---|
| FeePool | claimFees | 422,852 | +100,211 | +24% |
| Synthetix | burnSynths | 329,877 | -22,871 | -7% |
| Synthetix | exchange | 473,954 | +247,913 | +110% |
| Synthetix | issueMaxSynths | 437,013 | +94,466 | +28% |
| Synthetix | issueSynths | 394,636 | +33,566 | +9% |
from https://github.com/Synthetixio/synthetix/pull/434/checks?check_run_id=480906529
Rationale
- A local mapping in each
MixinResolverwill prevent unnecssary CALL opcodes from being used (approximately 1518 gas) - Having the list of required address names in each
MixinResolverwill allow automated checks each deployment to know what needs updating in the AddressResolver - After each deployment, determine which
MixinResolvercontracts need to be resynced based on the list in #2 above
Test Cases
Implementation
Copyright
Copyright and related rights waived via CC0.