diff --git a/.github/workflows/checks_docker.yaml b/.github/workflows/checks_docker.yaml index 78770bd3..1d4fc566 100644 --- a/.github/workflows/checks_docker.yaml +++ b/.github/workflows/checks_docker.yaml @@ -10,7 +10,7 @@ on: jobs: build-docker: name: Build Docker image - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 steps: - name: Checkout sources diff --git a/.github/workflows/docker_build.yaml b/.github/workflows/docker_build.yaml index 1f3a24c4..d894b767 100644 --- a/.github/workflows/docker_build.yaml +++ b/.github/workflows/docker_build.yaml @@ -8,7 +8,7 @@ on: jobs: extract-version: name: Extract version - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 outputs: VERSION: ${{ steps.extract_version.outputs.VERSION }} steps: @@ -43,7 +43,7 @@ jobs: matrix: configs: - target: linux/amd64 - runner: warp-ubuntu-latest-x64-16x + runner: ubuntu-24.04 - target: linux/arm64 runner: warp-ubuntu-latest-arm64-16x docker_target: diff --git a/.github/workflows/op_rbuilder_checks.yaml b/.github/workflows/op_rbuilder_checks.yaml index 524360de..d762ba4d 100644 --- a/.github/workflows/op_rbuilder_checks.yaml +++ b/.github/workflows/op_rbuilder_checks.yaml @@ -13,7 +13,7 @@ env: jobs: lint_and_test: name: Lint and test - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 env: # Set features for the Makefile FEATURES: ${{ matrix.features }} diff --git a/.github/workflows/op_rbuilder_release.yaml b/.github/workflows/op_rbuilder_release.yaml index 37303146..3021b5c7 100644 --- a/.github/workflows/op_rbuilder_release.yaml +++ b/.github/workflows/op_rbuilder_release.yaml @@ -34,7 +34,7 @@ on: jobs: extract-version: name: Extract version - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 outputs: VERSION: ${{ steps.extract-version.outputs.VERSION }} steps: @@ -73,7 +73,7 @@ jobs: matrix: configs: - target: x86_64-unknown-linux-gnu - runner: warp-ubuntu-latest-x64-16x + runner: ubuntu-24.04 - target: aarch64-unknown-linux-gnu runner: warp-ubuntu-latest-arm64-32x # Paused until docker is pre-installed https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md @@ -120,7 +120,7 @@ jobs: name: Draft release if: ${{ github.event.inputs.draft-release == 'true' || github.event_name == 'push'}} # when manually triggered or version tagged needs: [extract-version, build-binary] - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 env: VERSION: ${{ needs.extract-version.outputs.VERSION }} permissions: @@ -179,7 +179,7 @@ jobs: matrix: configs: - platform: linux/amd64 - runner: warp-ubuntu-latest-x64-16x + runner: ubuntu-24.04 - platform: linux/arm64 runner: warp-ubuntu-latest-arm64-16x steps: @@ -249,7 +249,7 @@ jobs: publish-container-index: name: Publish container index - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 env: VERSION: ${{ needs.extract-version.outputs.VERSION }} needs: diff --git a/.github/workflows/tdx_quote_provider_checks.yaml b/.github/workflows/tdx_quote_provider_checks.yaml index 48f83bda..ad6d1df4 100644 --- a/.github/workflows/tdx_quote_provider_checks.yaml +++ b/.github/workflows/tdx_quote_provider_checks.yaml @@ -11,7 +11,7 @@ env: jobs: check: name: Check - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 defaults: run: working-directory: "./crates/tdx-quote-provider" @@ -48,7 +48,7 @@ jobs: docker: name: Docker Build - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 defaults: run: working-directory: "./crates/tdx-quote-provider" diff --git a/.github/workflows/tdx_quote_provider_release.yaml b/.github/workflows/tdx_quote_provider_release.yaml index 0506f7c6..ee6e6eeb 100644 --- a/.github/workflows/tdx_quote_provider_release.yaml +++ b/.github/workflows/tdx_quote_provider_release.yaml @@ -22,7 +22,7 @@ on: jobs: extract-version: name: Extract version - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 outputs: VERSION: ${{ steps.extract_version.outputs.VERSION }} steps: @@ -58,7 +58,7 @@ jobs: matrix: configs: - target: x86_64-unknown-linux-gnu - runner: warp-ubuntu-latest-x64-16x + runner: ubuntu-24.04 - target: aarch64-unknown-linux-gnu runner: warp-ubuntu-latest-arm64-32x # Paused until docker is pre-installed https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md @@ -100,7 +100,7 @@ jobs: name: Draft release if: ${{ github.event.inputs.draft-release == 'true' || github.event_name == 'push'}} # when manually triggered or version tagged needs: [extract-version, build-binary] - runs-on: warp-ubuntu-latest-x64-16x + runs-on: ubuntu-24.04 env: VERSION: op-${{ needs.extract-version.outputs.VERSION }} permissions: diff --git a/Cargo.lock b/Cargo.lock index 8a382642..f7dd9b7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7138,6 +7138,7 @@ dependencies = [ "chrono", "clap", "clap_builder", + "concurrent-queue", "ctor", "dashmap 6.1.0", "derive_more", @@ -7232,6 +7233,7 @@ dependencies = [ "thiserror 1.0.69", "tikv-jemallocator", "time", + "tips-core", "tokio", "tokio-tungstenite", "tokio-util", @@ -14277,6 +14279,23 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tips-core" +version = "0.1.0" +source = "git+https://github.com/base/tips?rev=c08eaa4fe10c26de8911609b41ddab4918698325#c08eaa4fe10c26de8911609b41ddab4918698325" +dependencies = [ + "alloy-consensus", + "alloy-primitives 1.4.1", + "alloy-provider", + "alloy-serde", + "op-alloy-consensus", + "op-alloy-flz", + "serde", + "tracing", + "tracing-subscriber 0.3.20", + "uuid", +] + [[package]] name = "tokio" version = "1.47.1" @@ -15025,9 +15044,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", diff --git a/Cargo.toml b/Cargo.toml index 6997295b..dfbec51a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -213,3 +213,7 @@ time = { version = "0.3.36", features = ["macros", "formatting", "parsing"] } vergen = "9.0.4" vergen-git2 = "1.0.5" opentelemetry = { version = "0.31", features = ["trace"] } + +# Base Path +concurrent-queue = "2.5.0" +tips-core = { git = "https://github.com/base/tips", rev = "c08eaa4fe10c26de8911609b41ddab4918698325", default-features = false } \ No newline at end of file diff --git a/crates/op-rbuilder/Cargo.toml b/crates/op-rbuilder/Cargo.toml index c312f643..a0f5c8d2 100644 --- a/crates/op-rbuilder/Cargo.toml +++ b/crates/op-rbuilder/Cargo.toml @@ -14,6 +14,8 @@ workspace = true [dependencies] p2p = { path = "../p2p" } +tips-core.workspace = true + reth.workspace = true reth-optimism-node.workspace = true reth-optimism-cli.workspace = true @@ -112,6 +114,7 @@ url.workspace = true anyhow = "1" opentelemetry = { workspace = true, optional = true } dashmap.workspace = true +concurrent-queue.workspace = true hex = { workspace = true } futures = { workspace = true } futures-util = { workspace = true } diff --git a/crates/op-rbuilder/src/args/op.rs b/crates/op-rbuilder/src/args/op.rs index 4e3d0308..4dc0663c 100644 --- a/crates/op-rbuilder/src/args/op.rs +++ b/crates/op-rbuilder/src/args/op.rs @@ -48,6 +48,15 @@ pub struct OpRbuilderArgs { /// Whether to enable revert protection by default #[arg(long = "builder.enable-revert-protection", default_value = "false")] pub enable_revert_protection: bool, + /// Whether to enable TIPS Resource Metering + #[arg(long = "builder.enable-resource-metering", default_value = "false")] + pub enable_resource_metering: bool, + /// Whether to enable TIPS Resource Metering + #[arg( + long = "builder.resource-metering-buffer-size", + default_value = "10000" + )] + pub resource_metering_buffer_size: usize, /// Path to builder playgorund to automatically start up the node connected to it #[arg( diff --git a/crates/op-rbuilder/src/builders/context.rs b/crates/op-rbuilder/src/builders/context.rs index e1eb4f39..040a59c8 100644 --- a/crates/op-rbuilder/src/builders/context.rs +++ b/crates/op-rbuilder/src/builders/context.rs @@ -43,6 +43,7 @@ use crate::{ gas_limiter::AddressGasLimiter, metrics::OpRBuilderMetrics, primitives::reth::{ExecutionInfo, TxnExecutionResult}, + resource_metering::ResourceMetering, traits::PayloadTxsBounds, tx::MaybeRevertingTransaction, tx_signer::Signer, @@ -77,6 +78,8 @@ pub struct OpPayloadBuilderCtx { pub max_gas_per_txn: Option, /// Rate limiting based on gas. This is an optional feature. pub address_gas_limiter: AddressGasLimiter, + /// Per transaction resource metering information + pub resource_metering: ResourceMetering, } impl OpPayloadBuilderCtx { @@ -441,6 +444,8 @@ impl OpPayloadBuilderCtx { num_txs_considered += 1; + let _resource_usage = self.resource_metering.get(&tx_hash); + // TODO: ideally we should get this from the txpool stream if let Some(conditional) = conditional && !conditional.matches_block_attributes(&block_attr) diff --git a/crates/op-rbuilder/src/builders/flashblocks/ctx.rs b/crates/op-rbuilder/src/builders/flashblocks/ctx.rs index 16d1a71c..28cbae76 100644 --- a/crates/op-rbuilder/src/builders/flashblocks/ctx.rs +++ b/crates/op-rbuilder/src/builders/flashblocks/ctx.rs @@ -2,6 +2,7 @@ use crate::{ builders::{BuilderConfig, OpPayloadBuilderCtx, flashblocks::FlashblocksConfig}, gas_limiter::{AddressGasLimiter, args::GasLimiterArgs}, metrics::OpRBuilderMetrics, + resource_metering::ResourceMetering, traits::ClientBounds, }; use op_revm::OpSpecId; @@ -29,6 +30,8 @@ pub(super) struct OpPayloadSyncerCtx { max_gas_per_txn: Option, /// The metrics for the builder metrics: Arc, + /// Resource metering tracking + resource_metering: ResourceMetering, } impl OpPayloadSyncerCtx { @@ -48,6 +51,7 @@ impl OpPayloadSyncerCtx { chain_spec, max_gas_per_txn: builder_config.max_gas_per_txn, metrics, + resource_metering: builder_config.resource_metering, }) } @@ -80,6 +84,7 @@ impl OpPayloadSyncerCtx { extra_ctx: (), max_gas_per_txn: self.max_gas_per_txn, address_gas_limiter: AddressGasLimiter::new(GasLimiterArgs::default()), + resource_metering: self.resource_metering.clone(), } } } diff --git a/crates/op-rbuilder/src/builders/flashblocks/payload.rs b/crates/op-rbuilder/src/builders/flashblocks/payload.rs index cb91116e..74fcf923 100644 --- a/crates/op-rbuilder/src/builders/flashblocks/payload.rs +++ b/crates/op-rbuilder/src/builders/flashblocks/payload.rs @@ -273,6 +273,7 @@ where extra_ctx, max_gas_per_txn: self.config.max_gas_per_txn, address_gas_limiter: self.address_gas_limiter.clone(), + resource_metering: self.config.resource_metering.clone(), }) } diff --git a/crates/op-rbuilder/src/builders/mod.rs b/crates/op-rbuilder/src/builders/mod.rs index 4edb2088..48ce625b 100644 --- a/crates/op-rbuilder/src/builders/mod.rs +++ b/crates/op-rbuilder/src/builders/mod.rs @@ -21,6 +21,7 @@ mod flashblocks; mod generator; mod standard; +use crate::resource_metering::ResourceMetering; pub use builder_tx::{ BuilderTransactionCtx, BuilderTransactionError, BuilderTransactions, InvalidContractDataError, SimulationSuccessResult, get_balance, get_nonce, @@ -126,6 +127,9 @@ pub struct BuilderConfig { /// Address gas limiter stuff pub gas_limiter_config: GasLimiterArgs, + + /// Resource metering context + pub resource_metering: ResourceMetering, } impl core::fmt::Debug for BuilderConfig { @@ -166,6 +170,7 @@ impl Default for BuilderConfig { sampling_ratio: 100, max_gas_per_txn: None, gas_limiter_config: GasLimiterArgs::default(), + resource_metering: ResourceMetering::default(), } } } @@ -188,6 +193,10 @@ where sampling_ratio: args.telemetry.sampling_ratio, max_gas_per_txn: args.max_gas_per_txn, gas_limiter_config: args.gas_limiter.clone(), + resource_metering: ResourceMetering::new( + args.enable_resource_metering, + args.resource_metering_buffer_size, + ), specific: S::try_from(args)?, }) } diff --git a/crates/op-rbuilder/src/builders/standard/mod.rs b/crates/op-rbuilder/src/builders/standard/mod.rs index e26bbc6c..15b006a5 100644 --- a/crates/op-rbuilder/src/builders/standard/mod.rs +++ b/crates/op-rbuilder/src/builders/standard/mod.rs @@ -1,10 +1,9 @@ +use super::BuilderConfig; use crate::{ builders::standard::service::StandardServiceBuilder, traits::{NodeBounds, PoolBounds}, }; -use super::BuilderConfig; - mod builder_tx; mod payload; mod service; diff --git a/crates/op-rbuilder/src/builders/standard/payload.rs b/crates/op-rbuilder/src/builders/standard/payload.rs index 4907c5c2..858357fc 100644 --- a/crates/op-rbuilder/src/builders/standard/payload.rs +++ b/crates/op-rbuilder/src/builders/standard/payload.rs @@ -250,6 +250,7 @@ where extra_ctx: Default::default(), max_gas_per_txn: self.config.max_gas_per_txn, address_gas_limiter: self.address_gas_limiter.clone(), + resource_metering: self.config.resource_metering.clone(), }; let builder = OpBuilder::new(best); diff --git a/crates/op-rbuilder/src/launcher.rs b/crates/op-rbuilder/src/launcher.rs index e487e016..5d7c6f84 100644 --- a/crates/op-rbuilder/src/launcher.rs +++ b/crates/op-rbuilder/src/launcher.rs @@ -7,6 +7,7 @@ use crate::{ metrics::{VERSION, record_flag_gauge_metrics}, monitor_tx_pool::monitor_tx_pool, primitives::reth::engine_api_builder::OpEngineApiBuilder, + resource_metering::{BaseApiExtServer, ResourceMeteringExt}, revert_protection::{EthApiExtServer, RevertProtectionExt}, tx::FBPooledTransaction, }; @@ -109,6 +110,7 @@ where let op_node = OpNode::new(rollup_args.clone()); let reverted_cache = Cache::builder().max_capacity(100).build(); let reverted_cache_copy = reverted_cache.clone(); + let resource_metering = builder_config.resource_metering.clone(); let mut addons: OpAddOns< _, @@ -164,6 +166,10 @@ where .add_or_replace_configured(revert_protection_ext.into_rpc())?; } + let resource_metering_ext = ResourceMeteringExt::new(resource_metering); + ctx.modules + .add_or_replace_configured(resource_metering_ext.into_rpc())?; + Ok(()) }) .on_node_started(move |ctx| { diff --git a/crates/op-rbuilder/src/lib.rs b/crates/op-rbuilder/src/lib.rs index 7817ba2d..f61c39b0 100644 --- a/crates/op-rbuilder/src/lib.rs +++ b/crates/op-rbuilder/src/lib.rs @@ -13,5 +13,6 @@ pub mod tx_signer; #[cfg(test)] pub mod mock_tx; +mod resource_metering; #[cfg(any(test, feature = "testing"))] pub mod tests; diff --git a/crates/op-rbuilder/src/metrics.rs b/crates/op-rbuilder/src/metrics.rs index c381fed8..75ebb874 100644 --- a/crates/op-rbuilder/src/metrics.rs +++ b/crates/op-rbuilder/src/metrics.rs @@ -161,6 +161,12 @@ pub struct OpRBuilderMetrics { pub bundles_reverted: Histogram, /// Histogram of eth_sendBundle request duration pub bundle_receive_duration: Histogram, + /// Count of the number of times transactions had metering information + pub metering_known_transaction: Counter, + /// Count of the number of times transactions did not have any metering information + pub metering_unknown_transaction: Counter, + /// Count of the number of times we were unable to resolve metering information due to locking + pub metering_locked_transaction: Counter, } impl OpRBuilderMetrics { diff --git a/crates/op-rbuilder/src/resource_metering.rs b/crates/op-rbuilder/src/resource_metering.rs new file mode 100644 index 00000000..21d68f5e --- /dev/null +++ b/crates/op-rbuilder/src/resource_metering.rs @@ -0,0 +1,218 @@ +use crate::metrics::OpRBuilderMetrics; +use alloy_primitives::TxHash; +use concurrent_queue::{ConcurrentQueue, PopError}; +use dashmap::try_result::TryResult; +use jsonrpsee::{ + core::{RpcResult, async_trait}, + proc_macros::rpc, +}; +use std::{ + fmt::Debug, + sync::{ + Arc, + atomic::{AtomicBool, Ordering}, + }, +}; +use tips_core::MeterBundleResponse; + +struct Data { + enabled: AtomicBool, + by_tx_hash: dashmap::DashMap, + lru: ConcurrentQueue, +} + +#[derive(Clone)] +pub struct ResourceMetering { + data: Arc, + metrics: OpRBuilderMetrics, +} + +impl Debug for ResourceMetering { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("ResourceMetering") + .field("enabled", &self.data.enabled) + .field("by_tx_hash", &self.data.by_tx_hash.len()) + .finish() + } +} + +impl ResourceMetering { + pub(crate) fn insert(&self, tx: TxHash, metering_info: MeterBundleResponse) { + let to_remove = if self.data.lru.is_full() { + match self.data.lru.pop() { + Ok(tx_hash) => Some(tx_hash), + Err(PopError::Empty) => None, + Err(PopError::Closed) => None, + } + } else { + None + }; + + if let Some(tx_hash) = to_remove { + self.data.by_tx_hash.remove(&tx_hash); + } + + self.data.by_tx_hash.insert(tx, metering_info); + } + + pub(crate) fn clear(&self) { + self.data.by_tx_hash.clear(); + } + + pub(crate) fn set_enabled(&self, enabled: bool) { + self.data.enabled.store(enabled, Ordering::Relaxed); + } + + pub(crate) fn get(&self, tx: &TxHash) -> Option { + if !self.data.enabled.load(Ordering::Relaxed) { + return None; + } + + match self.data.by_tx_hash.try_get(tx) { + TryResult::Present(result) => { + self.metrics.metering_known_transaction.increment(1); + Some(result.clone()) + } + TryResult::Absent => { + self.metrics.metering_unknown_transaction.increment(1); + None + } + TryResult::Locked => { + self.metrics.metering_locked_transaction.increment(1); + None + } + } + } +} + +impl Default for ResourceMetering { + fn default() -> Self { + Self::new(false, 10_000) + } +} + +impl ResourceMetering { + pub fn new(enabled: bool, buffer_size: usize) -> Self { + Self { + data: Arc::new(Data { + by_tx_hash: dashmap::DashMap::new(), + enabled: AtomicBool::new(enabled), + lru: ConcurrentQueue::bounded(buffer_size), + }), + metrics: OpRBuilderMetrics::default(), + } + } +} + +// Namespace overrides for ingesting resource metering +#[cfg_attr(not(test), rpc(server, namespace = "base"))] +#[cfg_attr(test, rpc(server, client, namespace = "base"))] +pub trait BaseApiExt { + #[method(name = "setMeteringInformation")] + async fn set_metering_information( + &self, + tx_hash: TxHash, + meter: MeterBundleResponse, + ) -> RpcResult<()>; + + #[method(name = "setMeteringEnabled")] + async fn set_metering_enabled(&self, enabled: bool) -> RpcResult<()>; + + #[method(name = "clearMeteringInformation")] + async fn clear_metering_information(&self) -> RpcResult<()>; +} + +pub(crate) struct ResourceMeteringExt { + metering_info: ResourceMetering, +} + +impl ResourceMeteringExt { + pub(crate) fn new(metering_info: ResourceMetering) -> Self { + Self { metering_info } + } +} + +#[async_trait] +impl BaseApiExtServer for ResourceMeteringExt { + async fn set_metering_information( + &self, + tx_hash: TxHash, + metering: MeterBundleResponse, + ) -> RpcResult<()> { + self.metering_info.insert(tx_hash, metering); + Ok(()) + } + + async fn set_metering_enabled(&self, enabled: bool) -> RpcResult<()> { + self.metering_info.set_enabled(enabled); + Ok(()) + } + + async fn clear_metering_information(&self) -> RpcResult<()> { + self.metering_info.clear(); + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use alloy_primitives::{B256, TxHash, U256}; + use tips_core::MeterBundleResponse; + + fn create_test_metering(gas_used: u64) -> MeterBundleResponse { + MeterBundleResponse { + bundle_hash: B256::random(), + bundle_gas_price: U256::from(123), + coinbase_diff: U256::from(123), + eth_sent_to_coinbase: U256::from(123), + gas_fees: U256::from(123), + results: vec![], + state_block_number: 4, + state_flashblock_index: None, + total_gas_used: gas_used, + total_execution_time_us: 533, + } + } + + #[test] + fn test_basic_insert_get_and_enable_disable() { + let metering = ResourceMetering::default(); + let tx_hash = TxHash::random(); + let meter_data = create_test_metering(21000); + + metering.insert(tx_hash, meter_data); + assert!(metering.get(&tx_hash).is_none()); + + metering.set_enabled(true); + assert_eq!(metering.get(&tx_hash).unwrap().total_gas_used, 21000); + + metering.insert(tx_hash, create_test_metering(50000)); + assert_eq!(metering.get(&tx_hash).unwrap().total_gas_used, 50000); + + metering.set_enabled(false); + assert!(metering.get(&tx_hash).is_none()); + + metering.set_enabled(true); + assert!(metering.get(&TxHash::random()).is_none()); + } + + #[test] + fn test_clear() { + let metering = ResourceMetering::new(true, 100); + + let tx1 = TxHash::random(); + let tx2 = TxHash::random(); + + metering.insert(tx1, create_test_metering(1000)); + metering.insert(tx2, create_test_metering(2000)); + + assert!(metering.get(&tx1).is_some()); + assert!(metering.get(&tx2).is_some()); + + metering.clear(); + + assert!(metering.get(&tx1).is_none()); + assert!(metering.get(&tx2).is_none()); + } +} diff --git a/justfile b/justfile index de496d0b..d3ab4caf 100644 --- a/justfile +++ b/justfile @@ -1,7 +1,17 @@ # Build and run op-rbuilder in playground mode for testing run-playground: - cargo build --bin op-rbuilder -p op-rbuilder - ./target/debug/op-rbuilder node --builder.playground + cargo run -p op-rbuilder --bin op-rbuilder -- node \ + --chain $HOME/.playground/devnet/l2-genesis.json \ + --flashblocks.enabled \ + --builder.enable-resource-metering \ + --datadir ~/.playground/devnet/op-rbuilder \ + -vv \ + --http --http.port 2222 \ + --authrpc.addr 0.0.0.0 --authrpc.port 4444 --authrpc.jwtsecret $HOME/.playground/devnet/jwtsecret \ + --port 30333 --disable-discovery \ + --metrics 127.0.0.1:9011 \ + --rollup.builder-secret-key ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ + --trusted-peers enode://79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8@127.0.0.1:30304 # Run the complete test suite (genesis generation, build, and tests) run-tests: