The docs page, while a good resource, is currently out of date.
Solidity source code needs to be compiled using OVM modified solc compiler. Because of the way OVM is architectured, the Optimism team needs to work to support specific Solidity compiler versions. Currently supported are v0.5 & v0.6, while work is started on v0.7 & v0.8.
The JS compiler can be found in ethereum-optimism/solc-js repo. Branches of interest are master-0.5
& master-0.6
.
The Optimism Transpilation Overview is a good overview on how Solidity code is compiled to OVM, and there is also some info on this OVM vs. EVM Incompatibilities page.
- Contract size limit is 15-20% less than Ethereum's 24K.
- Block gas limit is currently set at 9 million (in contrast to Ethereums 12.5 million).
- Gas metering is not implemented correctly (false gas cost is reported).
- No native coin on L2, ETH implemented as a pre-deployed ERC20 contract (think wETH).
- Gas pricing will be implemented in the future, currently, networks accepts
gasPrice=0
- On L2 every tx is wrapped in a block, so 1 tx equals 1 block.
- The node sometimes returns a receipt with success as status, but the code is not actually deployed. To check for successful deployment you'll need to check if the code is available for the address.
- The OVM toolchain requires Node v10, with v12 support in the works.
- Some opcodes are not supported, as they don't have any meaning, in L2 context. See docs for more details.
- Issues with contracts that are themselves deployers of other contracts via
CREATE/CREATE2
.
Some background, on that last point, by Master Jedi Ben Jones:
The nuance is: because constructor arguments are technically appended to the initcode (not passed in with calldata), the safety checker will sometimes accidentally flag initcode as unsafe because the constructor parameter happens to have an unsafe EVM opcode in its encoding. This is not all that likely, but it means if you need to guarantee deployment of a contract every time, with any params, then you need to use an initialize function instead of a constructor. The reason it is only flagged in some cases is that there are only a few possible values for the constructor argument bytestrings which are unsafe--it's a combination of having an "unsafe" opcode (of which there are <20 out of 256 possible byte values) and being in "reachable" code. For example, if the constructor params happen to contain
JUMPDEST SSTORE
it would be unsafe/thrown out becauseSSTORE
is an unsafe opcode which can be reached with aJUMP
. OTOH,REVERT SSTORE
is safe because the code cannot possibly executeSSTORE
-- even though it is there, the operation immediately preceding it guarantees the contract will revert before theSSTORE
ever actually happens.
The biggest problem testing OVM contracts is that different environments currently have different behaviors. Ganache is useful for testing, but the real integration tests should be run against the local network.
OVM Ganache provider can be found in @eth-optimism/ovm-toolchain package. This is a wrapper around ganache-core
that will enable OVM bytecode execution.
Please note that OVM version of Ganache is ~2-3x slower than standard.
To run the local network:
git clone [email protected]:ethereum-optimism/optimism-integration.git
cd optimism-integration
git submodule update
docker-compose pull
./up.sh
Make sure to update the repo and Docker images daily as the codebase is still in active development:
git pull origin master
git submodule update
docker-compose pull
- Kovan L2:
{ url: "https://kovan.optimism.io", port: 69 }
- Goerli L2:
{ url: "https://goerli.optimism.io", port: 420 }
Both test networks are currently in an unstable state, and it's recommended to test against the local network. ETA for the stable testnet launch is 15.3.2021.