matter-labs / era-compiler-solidity

Solidity compiler for ZKsync.
Apache License 2.0
62 stars 26 forks source link

zksolc produces x5 larger bytecode size compare to solc #91

Closed Khang-NT closed 5 months ago

Khang-NT commented 5 months ago

๐Ÿ› Bug Report for hardaht-zksync plugins

๐Ÿ’ฅ Plugin name

hardaht-zksync-solc

๐Ÿ“ Description

Hardhat config:


const config: HardhatUserConfig = {
    solidity: {
        version: "0.8.25",
        settings: {
            viaIR: true,
            evmVersion: "cancun",
            optimizer: {
                enabled: true,
                runs: 2000
            },
        },
    },
    zksolc: {
        version: "1.4.1", // Uses latest available in https://github.com/matter-labs/zksolc-bin/
        settings: {
            optimizer: {
                enabled: true,
                mode: 'z' // even worse if mode = 3
            },
            contractsToCompile: ["USDC.sol", "MyContract.sol"]
        }
    },
    networks: {
        hardhat: {
            zksync: process.env.ZKSYNC_NODE === "1",
        },
    },
};

๐Ÿ”„ Reproduction Steps

$ ZKSYNC_NODE=0 hardhat compile
ยท------------------------|--------------------------------|--------------------------------ยท
|  Solc version: 0.8.25  ยท  Optimizer enabled: true       ยท  Runs: 2000                    โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  Contract Name         ยท  Deployed size (KiB) (change)  ยท  Initcode size (KiB) (change)  โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  USDC                  ยท                 2.038 (0.000)  ยท                 2.906 (0.000)  โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  MyContract            ยท                 9.904 (0.000)  ยท                10.780 (0.000)  โ”‚
ยท------------------------|--------------------------------|--------------------------------ยท

$ ZKSYNC_NODE=1 hardhat compile
Compiling contracts for zkSync Era with zksolc v1.4.1 and solc v0.8.25
Compiling 11 Solidity files
Generating typings for: 13 artifacts in dir: typechain for target: ethers-v6
Successfully generated 50 typings!
Successfully compiled 11 Solidity files
 ยท------------------------|--------------------------------|--------------------------------ยท
|  Solc version: 0.8.25  ยท  Optimizer enabled: true       ยท  Runs: undefined               โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  Contract Name         ยท  Deployed size (KiB) (change)  ยท  Initcode size (KiB) (change)  โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  USDC                  ยท                      6.094 ()  ยท                      6.094 ()  โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  MyContract            ยท                     31.531 ()  ยท                     31.531 ()  โ”‚
ยท------------------------|--------------------------------|--------------------------------ยท

Set optimizer.mode = "3" and run again:

$ ZKSYNC_NODE=1 hardhat compile
Compiling contracts for zkSync Era with zksolc v1.4.1 and solc v0.8.25
Compiling 11 Solidity files
Generating typings for: 13 artifacts in dir: typechain for target: ethers-v6
Successfully generated 50 typings!
Successfully compiled 11 Solidity files
 ยท------------------------|--------------------------------|--------------------------------ยท
|  Solc version: 0.8.25  ยท  Optimizer enabled: true       ยท  Runs: undefined               โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  Contract Name         ยท  Deployed size (KiB) (change)  ยท  Initcode size (KiB) (change)  โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  USDC                  ยท                8.219 (+2.125)  ยท                8.219 (+2.125)  โ”‚
ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท|ยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยทยท
|  MyContract            ยท              56.406 (+24.875)  ยท              56.406 (+24.875)  โ”‚
ยท------------------------|--------------------------------|--------------------------------ยท

zksolc produces insane large bytecode size, x3 times solc produces when using optimizer.mode = 'z', and x5 when using optimizer.mode = "3"

Here's USDC.sol, just a simple ERC20 contract:

pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract USDC is ERC20 {
    constructor() ERC20("Fake USDC", "USDC") {
        _mint(msg.sender, 1000000 * (10 ** uint256(decimals())));
    }

    function decimals() public pure override returns (uint8) {
        return 10;
    }
}

๐Ÿ–ฅ๏ธ Environment

hedgar2017 commented 5 months ago

Thanks for the report, but it is not a bug.

EraVM bytecode is larger than that of EVM, mostly due to different encoding and the usage of System Contracts which make EraVM behavior equivalent to EVM's.