-
Notifications
You must be signed in to change notification settings - Fork 3.3k
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
Extract StateManager from ExecutionManager #132
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Made one note but otherwise this looks great! That said, we probably also want to be careful with merging this immediately because we've been merging Synthetix changes into master & definitely don't want to make a change like this to our Synthetix node. Tomorrow we can just decide that we'll push Synthetix changes to a synthetix branch or vice versa.
Anyway exciting progress!
* @param _ovmContractInitcode The bytecode of the contract to be deployed | ||
* @return the codeContractAddress. | ||
*/ | ||
function deployCodeContract(bytes memory _ovmContractInitcode) public returns(address codeContractAddress) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oooo so this function unfortunately needs to be a little more complex. Instead of deployCodeContract(_ovmContractInitcode)
what we really need is deployContract(_ovmContractAddress, _ovmContractInitcode)
This function will also need to inherit the logic from here: https://github.com/ethereum-optimism/optimism-monorepo/blob/c5263562d165495e3437d25e83f3a808d1f395e3/packages/ovm/src/contracts/ExecutionManager.sol#L586-L595 where we associate a code contract with it.
The reason is we want to be able to intercept this call and actually deploy a contract (with the initcode) to the Geth state at the address which the ExecutionManager wants us to deploy it to.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, yep! Done!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This LGTM 🚢
Left some small comments here and there, but everything seems in order. Pleasantly shocked by how little an effect this had on things like tests and the full node!!!
const stateManagerAddress = await executionManager.getStateManagerAddress() | ||
const stateManager = new Contract( | ||
stateManagerAddress, | ||
StateManager.abi, | ||
wallet | ||
) | ||
const nonce = await stateManager.getOvmContractNonce(wallet.address) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I count 5 of this exact same code block--might be worth pulling into a getStateManager
helper or before
if doable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
or maybe it's getNonce
, not getStateManager
packages/ovm/test/contracts/execution-manager.l1-l2-opcodes.spec.ts
Outdated
Show resolved
Hide resolved
const stateManagerAddress = await executionManager.getStateManagerAddress() | ||
const stateManager = new Contract( | ||
stateManagerAddress, | ||
StateManager.abi, | ||
wallet | ||
) | ||
const nonce = await stateManager.getOvmContractNonce(wallet.address) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Noting this is the same code block as above
const stateManagerAddress = await executionManager.getStateManagerAddress() | ||
const stateManager = new Contract( | ||
stateManagerAddress, | ||
StateManager.abi, | ||
wallet | ||
) | ||
const nonce = await stateManager.getOvmContractNonce(wallet.address) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same code block
// Safety check the runtime bytecode -- unless the overrideSafetyChecker flag is set to true | ||
if (!overrideSafetyChecker && !safetyChecker.isBytecodeSafe(codeContractBytecode)) { | ||
// Contract runtime bytecode is not safe. | ||
address codeContractAddress = stateManager.deployContract(_newOvmContractAddress, _ovmInitcode); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmmmm I'm still weirded out by doing purity checking in the SM as it feels much more "execution-ey". However we have recorded the need to revisit this for pre-deployment of code contracts so probably fine for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tbh I have the opposite feeling wrt purity checking lol but will of course see what happens as the partial state manager is implemented
|
||
address ZERO_ADDRESS = 0x0000000000000000000000000000000000000000; | ||
|
||
// bitwise right shift 28 * 8 bits so the 4 method ID bytes are in the right-most bytes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure where this came from, would delete or move if you know off the top where it originally was
constructor(uint256 _opcodeWhitelistMask, bool _overrideSafetyChecker) public { | ||
// Set override safety checker flag | ||
overrideSafetyChecker = _overrideSafetyChecker; | ||
// Set the safety checker address -- NOTE: we assume this contract is deployed by the ExecutionManager |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this NOTE is outdated as we appear to be deploying it right below.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry this is just a bad comment. "this" refers to the FullStateManager not the SafetyChecker -- updating to:
// Set the safety checker address -- NOTE: `msg.sender` is used as EM address because we assume
// the FullStateManager is deployed by the ExecutionManager
Note I'm not going to do this BS for the partial state manager. We really gotta refactor these contracts so they don't deploy their dependences & I'ma make sure to do that.
@@ -25,7 +46,7 @@ contract FullStateManager is StateManager { | |||
* @param _slot The slot we're querying. | |||
* @return The bytes32 value stored at the particular slot. | |||
*/ | |||
function getStorage(address _ovmContractAddress, bytes32 _slot) internal view returns(bytes32) { | |||
function getStorage(address _ovmContractAddress, bytes32 _slot) public view returns(bytes32) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we should be able to limit some of these functions to being external
which would be a small performance improvement that might add up. external
is cheaper because it uses the calldata directly instead of loading into memory (which it needs to do if it can be called internally)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh nice catch
@@ -7,17 +7,17 @@ pragma solidity ^0.5.0; | |||
*/ | |||
contract StateManager { | |||
// Storage | |||
function getStorage(address _ovmContractAddress, bytes32 _slot) internal view returns(bytes32); | |||
function setStorage(address _ovmContractAddress, bytes32 _slot, bytes32 _value) internal; | |||
function getStorage(address _ovmContractAddress, bytes32 _slot) public view returns(bytes32); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comment as above on all of these methods WRT making external
when possible.
bytes memory _ovmContractInitcode | ||
) public returns(address codeContractAddress) { | ||
// Safety check the initcode, unless the overrideSafetyChecker flag is set to true | ||
if (!overrideSafetyChecker && !safetyChecker.isBytecodeSafe(_ovmContractInitcode)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not within the scope of this PR, but at some point, think we'll need to pull out the safety checking into a separate step since the gas cost of safety checking is in the 5-10m range for large contracts
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah 100%. This'll have to be added into the partial state manager
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Am looking to deprecate this full state manager once we get to a point where we can deprecate the rollup-full-node
cuz we won't need it anymore for L2 once we're in Geth
if (!overrideSafetyChecker && !safetyChecker.isBytecodeSafe(codeContractBytecode)) { | ||
// Contract runtime bytecode is not pure. | ||
return ZERO_ADDRESS; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
^same comment as above
…ec.ts Co-authored-by: ben-chain <[email protected]>
Co-authored-by: ben-chain <[email protected]>
…er' into YAS-345/GoVM/ExtractStateManager
…node ref impl: main node process (connect with RPC, start drivers, handle shutdown)
* deps: update to node RC for Arabica * deps: update for arabica * add changes from ethereum-optimism#133 to test * storage in arabica-6 not arabica-8 * deps: update RPC * deps: add host.docker.internal for testing local light node (not docker) * Update docker-compose-devnet.yml * Revert "deps: add host.docker.internal for testing local light node (not docker)" This reverts commit 09490fd. * Revert "Update docker-compose-devnet.yml" This reverts commit cccaf66. * increase namespace ID to 28 bytes * update RPC and to arabica-8 for node store * deps: bump node to rc2 * Update docker-compose-testnet.yml * deps: bump go-cnc to 0.4.1, fix breaking changes * Update docker-compose-devnet.yml * bump gas fee * revert 71a3d18 this is so that ethereum-optimism#133 can be merged before this PR --------- Co-authored-by: Javed Khan <[email protected]>
b5b564702 popm/wasm: add wasm-opt target to optimise wasm binary (ethereum-optimism#146) 27a5081e3 tbc: allow seeds to be overwritten (ethereum-optimism#158) 18afbc403 Fix missing panic (ethereum-optimism#156) 05cee0afb tbc: remove height as the terminal condition for indexers (ethereum-optimism#152) 4402060d6 Use hemilabs/websocket fork of nhooyr.io/websocket (ethereum-optimism#153) 3df5001c4 Add initial CODEOWNERS file (ethereum-optimism#149) a4685a57f popm/wasm: improve and tidy up Go code (ethereum-optimism#144) 41a0009c1 Add forking detection to TBC (ethereum-optimism#101) bbeed8bac ignore ulimits in tbc when on localnet (ethereum-optimism#142) 4e1914cc6 Stopgap to re-fetch blocks with no children (ethereum-optimism#131) 12eefff06 e2e: fix issues detected by staticcheck (ethereum-optimism#134) 80153372f Add more documentation for TBC and related RPC protocol (ethereum-optimism#86) 723b63704 bfg: fix issues reported by staticcheck (ethereum-optimism#132) 509fb1be6 electrumx: fix unhandled error in NewJSONRPCRequest (ethereum-optimism#133) b19af1e1f hemictl: use sort.Strings(...) instead of sort.Sort(sort.StringSlice(...)) (S1032) (ethereum-optimism#123) cf7c570f9 popmd: remove unused 'handle' func and return err in connectBFG (ethereum-optimism#124) fa2a4c4de ci: fix bug that makes version type always 'unstable' (ethereum-optimism#125) ddc39655a ci: use org DOCKERHUB_TOKEN secret (ethereum-optimism#128) 6457d16f5 bfgd: drop btc_blocks_can refresh triggers for l2_keystones/pop_basis (ethereum-optimism#120) 2b3c096bd popm: simplify receivedKeystones variable in tests (ethereum-optimism#116) 6140bbf24 tbc: move RPC tests to a separate test file (ethereum-optimism#114) c76571ff0 Add configuration option for static fees to web PoP miner (ethereum-optimism#119) 233817e65 popm: use simple conversion instead of unnecessary fmt.Sprintf (S1025) (ethereum-optimism#115) 2879f5fa7 e2e: improve name for variable with type `time.Duration` (ST1011) (ethereum-optimism#117) 4f31965e6 database,e2e: remove use of deprecated io/ioutil (SA1019) (ethereum-optimism#118) e9e090696 tbc: do not recreate outpoint for ScriptHashByOutpoint. (ethereum-optimism#109) 52eefb136 ignore l2 keystones notifications in tests (ethereum-optimism#112) eb607994c Sync Docker image environment variables with daemon configs (ethereum-optimism#111) 57281bc5d added a way to monitor and sanity-test localnet (ethereum-optimism#106) ea1a1c94c bfgd: fix loops unconditionally exited after one interation (SA4004) (ethereum-optimism#108) 29f116fb4 Add pprof http server to daemons (ethereum-optimism#105) 18a315d7e Added README for generating forks in BTC regtest for TBC fork resolution testing (ethereum-optimism#100) 55b8f52cb more robust nextPort (ethereum-optimism#103) 48f8b293f tbcapi: use reverse byte order for hashes in serialised, tidy up (ethereum-optimism#104) b7e9f5ecb restart initialblocks on-failure (ethereum-optimism#102) f9d52d423 Update required Go version to v1.22.2 (ethereum-optimism#96) f6808aa5b Fix op-proposer op-node dependency condition (fixes ethereum-optimism#98) (ethereum-optimism#99) a882529e8 Kill all pending block downloads if a peer fails (ethereum-optimism#95) eb66345e1 e2e: tidy up docker-compose file (ethereum-optimism#81) 34766f725 Track pending blocks with ttl package (ethereum-optimism#90) 6ed3eb88b Added configurable fee-per-vB to PoP Miner (ethereum-optimism#91) 509e31fbc Replace os.Kill with syscall.SIGTERM in signal.Notify calls (ethereum-optimism#87) git-subtree-dir: heminetwork git-subtree-split: b5b564702e8d3bedcdf0e0a52c22e383d7fd4dbe
Description
In order to intercept calls to the State Manager, we have to first pull it out into a separate contract. This will allow us to easily replace the State Manager functionality with low level calls to Geth.
Metadata
Fixes
Contributing Agreement