-
Notifications
You must be signed in to change notification settings - Fork 53
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(client):
StatelessL2BlockExecutor
Implements the `StatelessL2BlockExecutor`, capable of executing `L2ExecutionPayloadEnvelope`s and returning the block header + receipts. The `StatelessL2BlockExecutor` is backed by the `TrieDB` in the `kona-mpt` crate, fetching necessary data from the initial state root as well as the starting parent block hash.
- Loading branch information
Showing
83 changed files
with
1,197 additions
and
226 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
//! Contains logic specific to Canyon hardfork activation. | ||
use alloy_primitives::{address, b256, hex, Address, Bytes, B256}; | ||
use kona_derive::types::RollupConfig; | ||
use revm::{ | ||
primitives::{Account, Bytecode, HashMap}, | ||
DatabaseCommit, State, | ||
}; | ||
|
||
/// The address of the create2 deployer | ||
const CREATE_2_DEPLOYER_ADDR: Address = address!("13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2"); | ||
|
||
/// The codehash of the create2 deployer contract. | ||
const CREATE_2_DEPLOYER_CODEHASH: B256 = | ||
b256!("b0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2"); | ||
|
||
/// The raw bytecode of the create2 deployer contract. | ||
const CREATE_2_DEPLOYER_BYTECODE: [u8; 1584] = hex!("6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033"); | ||
|
||
/// The Canyon hardfork issues an irregular state transition that force-deploys the create2 | ||
/// deployer contract. This is done by directly setting the code of the create2 deployer account | ||
/// prior to executing any transactions on the timestamp activation of the fork. | ||
pub(crate) fn ensure_create2_deployer_canyon<DB>( | ||
config: &RollupConfig, | ||
timestamp: u64, | ||
db: &mut State<DB>, | ||
) -> Result<(), DB::Error> | ||
where | ||
DB: revm::Database, | ||
{ | ||
// If the canyon hardfork is active at the current timestamp, and it was not active at the | ||
// previous block timestamp (heuristically, block time is not perfectly constant at 2s), and the | ||
// chain is an optimism chain, then we need to force-deploy the create2 deployer contract. | ||
if config.is_canyon_active(timestamp) && !config.is_canyon_active(timestamp.saturating_sub(2)) { | ||
// Load the create2 deployer account from the cache. | ||
let acc = db.load_cache_account(CREATE_2_DEPLOYER_ADDR)?; | ||
|
||
// Update the account info with the create2 deployer codehash and bytecode. | ||
let mut acc_info = acc.account_info().unwrap_or_default(); | ||
acc_info.code_hash = CREATE_2_DEPLOYER_CODEHASH; | ||
acc_info.code = Some(Bytecode::new_raw(Bytes::from_static(&CREATE_2_DEPLOYER_BYTECODE))); | ||
|
||
// Convert the cache account back into a revm account and mark it as touched. | ||
let mut revm_acc: Account = acc_info.into(); | ||
revm_acc.mark_touch(); | ||
|
||
// Commit the create2 deployer account to the database. | ||
db.commit(HashMap::from([(CREATE_2_DEPLOYER_ADDR, revm_acc)])); | ||
return Ok(()); | ||
} | ||
|
||
Ok(()) | ||
} |
Oops, something went wrong.