[Ethereum] Enabling truffle compile optimizer does not change the deployment gas cost

optimizationtruffletruffle-compile

I am trying to deploy my contract by enabling the optimizer to see how much I can save from the gas costs.

I am using truffle for the deployment. In truffle I enable the optimizer by the following setting in truffle-config.js:

  compilers: {
    solc: {
      version: '^0.5.0',
      settings: {
        evmVersion: 'byzantium' // Default: "petersburg"
      },
      optimizer: {
        enabled: true,
        runs: 500
      }
    }
  }

To compile the contracts and deploy them again I execute:

truffle compile --all

and

truffle migrate --reset --network develop

However, both with optimizer enabled or disabled I get the exact same number gas used when deploying:

   > gas used:            2199134
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.04398268 ETH

So I thought, maybe there's nothing to optimize. But interestingly, if I try the optimizer in Remix I see changes. I use the default compiler 0.5.12+commit.8809ece9 in Remix:

Without optimization in Remix:

 gas    2037733 gas 
 transaction cost   2037733 gas 
 hash   0xd4d34170c7c234cea900dcad62ac....

Turning optimizer on:

 gas    1531138 gas 
 transaction cost   1531138 gas 
 hash   0xb5f2bb985e0dfd29b1947c14fc949bab314...

I suppose there's something wrong with truffle or I can't command truffle to recompile with the optimizer. What could be the issue?

Edit:

I've tried adding a deliberate error to the truffle-config.js to see if truffle recognizes the new file and it works, it throws an error.

Removing build/ folder between compile and deploys had no effect.

I also checked bytecodes by enabling and disabling the optimizer and the they are exactly the same.

Very interestingly a day later, the total gas consumed for deployment changed. In this case, the optimizer was enabled initially. So I tried rebooting and disabling the optimizer but did not observe any change in bytecode or deployment costs.

   > gas used:            1857253
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.03714506 ETH

Edit 2
Another thing I tested is if the compile --all command works, i.e. if truffle indeed force compiles even if the code does not change. To do that I've ran 6 compile&migrates. Each time I included an else block or removed it, or enabled or disabled the optimizer, or both. The optimizer runs 1500 times.

|                        | Test 1  | Test 2  | Test 3  | Test 4  | Test 5  | Test 6  |
|------------------------|---------|---------|---------|---------|---------|---------|
| Else block included?   | Yes     | Yes     | No      | No      | Yes     | No      |
| optimizer enabled?     | No      | Yes     | Yes     | No      | No      | Yes     |
| Deployment cost in ETH | 0,04766 | 0,04766 | 0,04709 | 0,04709 | 0,04766 | 0,04709 |

This shows compile --all is not the issue as Test 5–>Test 6 yields the same ETH cost: forcing to compile optimized by changing the contract code and enabling optimizer at the same time results same as just changing the contract code.

Edit 3

Tried changing the EVM version in truffle-config.js. The deployment costs do change. It's only enabling the optimizer that does not cause any change at all.

Best Answer

Obviously it is really simple: The optimizer settings are in the wrong place. I used the example provided here but according to the documentation it needs to be under settings:{...} in the solc config.

So this:

  compilers: {
    solc: {
      version: '^0.5.0',
      settings: {
        evmVersion: 'byzantium' // Default: "petersburg"
      },
      optimizer: {
        enabled: true,
        runs: 1500
      }
    }
  }

Becomes this:

  compilers: {
    solc: {
      version: '^0.5.0',
      settings: {
        evmVersion: 'byzantium', // Default: "petersburg"
        optimizer: {
          enabled: true,
          runs: 1500
        }
      }
    }
  }

Will be requesting a fix in above StackExchange question. Hope this will save someone a couple of hours.

Related Topic