From 3a73cdeeb0e96d16e188292674d737c6a80529e9 Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Wed, 29 Sep 2021 13:41:14 +1000 Subject: [PATCH] Add all routes to mock server --- .../execution_layer/src/engine_api/http.rs | 4 +- .../test_utils/execution_block_generator.rs | 45 +++++++++++++++---- .../src/test_utils/handle_rpc.rs | 45 +++++++++++++++++++ 3 files changed, 84 insertions(+), 10 deletions(-) diff --git a/beacon_node/execution_layer/src/engine_api/http.rs b/beacon_node/execution_layer/src/engine_api/http.rs index 37747d1f5e..9a7b31db93 100644 --- a/beacon_node/execution_layer/src/engine_api/http.rs +++ b/beacon_node/execution_layer/src/engine_api/http.rs @@ -246,9 +246,9 @@ pub struct JsonPreparePayloadRequest { #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(transparent, rename_all = "camelCase")] -struct JsonPayloadId { +pub struct JsonPayloadId { #[serde(with = "eth2_serde_utils::u64_hex_be")] - payload_id: u64, + pub payload_id: u64, } #[derive(Debug, PartialEq, Serialize, Deserialize)] diff --git a/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs b/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs index 523d439647..433a76138a 100644 --- a/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs +++ b/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs @@ -1,4 +1,6 @@ -use crate::engine_api::{http::JsonPreparePayloadRequest, ExecutePayloadResponse, ExecutionBlock}; +use crate::engine_api::{ + http::JsonPreparePayloadRequest, ConsensusStatus, ExecutePayloadResponse, ExecutionBlock, +}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use tree_hash::TreeHash; @@ -186,17 +188,26 @@ impl ExecutionBlockGenerator { block.block_hash = block.tree_hash_root(); + self.insert_block(Block::PoW(block)) + } + + pub fn insert_block(&mut self, block: Block) -> Result<(), String> { + if self.blocks.contains_key(&block.block_hash()) { + return Err(format!("{:?} is already known", block.block_hash())); + } else if block.parent_hash() != Hash256::zero() + && !self.blocks.contains_key(&block.parent_hash()) + { + return Err(format!("parent block {:?} is unknown", block.parent_hash())); + } + self.block_hashes - .insert(block.block_number, block.block_hash); - self.blocks.insert(block.block_hash, Block::PoW(block)); + .insert(block.block_number(), block.block_hash()); + self.blocks.insert(block.block_hash(), block); Ok(()) } - pub fn prepare_payload_id( - &mut self, - payload: JsonPreparePayloadRequest, - ) -> Result { + pub fn prepare_payload(&mut self, payload: JsonPreparePayloadRequest) -> Result { if !self .blocks .iter() @@ -256,6 +267,22 @@ impl ExecutionBlockGenerator { ExecutePayloadResponse::Valid } + + pub fn consensus_validated( + &mut self, + block_hash: Hash256, + status: ConsensusStatus, + ) -> Result<(), String> { + let payload = self + .pending_payloads + .remove(&block_hash) + .ok_or_else(|| format!("no pending payload for {:?}", block_hash))?; + + match status { + ConsensusStatus::Valid => self.insert_block(Block::PoS(payload)), + ConsensusStatus::Invalid => Ok(()), + } + } } #[cfg(test)] @@ -273,7 +300,9 @@ mod test { ExecutionBlockGenerator::new(TERMINAL_DIFFICULTY, TERMINAL_BLOCK); for i in 0..=TERMINAL_BLOCK { - generator.insert_pow_block(i).unwrap(); + if i > 0 { + generator.insert_pow_block(i).unwrap(); + } /* * Generate a block, inspect it. diff --git a/beacon_node/execution_layer/src/test_utils/handle_rpc.rs b/beacon_node/execution_layer/src/test_utils/handle_rpc.rs index 3e4560cbd8..50a61405af 100644 --- a/beacon_node/execution_layer/src/test_utils/handle_rpc.rs +++ b/beacon_node/execution_layer/src/test_utils/handle_rpc.rs @@ -1,5 +1,6 @@ use super::Context; use crate::engine_api::http::*; +use serde::de::DeserializeOwned; use serde_json::Value as JsonValue; use std::sync::Arc; use types::EthSpec; @@ -54,6 +55,40 @@ pub async fn handle_rpc( ) .unwrap()) } + ENGINE_PREPARE_PAYLOAD => { + let request = get_param_0(params)?; + let payload_id = ctx + .execution_block_generator + .write() + .await + .prepare_payload(request)?; + + Ok(serde_json::to_value(JsonPayloadId { payload_id }).unwrap()) + } + ENGINE_EXECUTE_PAYLOAD => { + let request: JsonExecutionPayload = get_param_0(params)?; + let response = ctx + .execution_block_generator + .write() + .await + .execute_payload(request.into()); + + Ok(serde_json::to_value(response).unwrap()) + } + ENGINE_GET_PAYLOAD => { + let request: JsonPayloadId = get_param_0(params)?; + let id = request.payload_id; + + let response = ctx + .execution_block_generator + .write() + .await + .get_payload(id) + .ok_or_else(|| format!("no payload for id {}", id))?; + + Ok(serde_json::to_value(JsonExecutionPayload::from(response)).unwrap()) + } + ENGINE_CONSENSUS_VALIDATED => Ok(JsonValue::Null), ENGINE_FORKCHOICE_UPDATED => Ok(JsonValue::Null), other => Err(format!( @@ -62,3 +97,13 @@ pub async fn handle_rpc( )), } } + +fn get_param_0(params: &JsonValue) -> Result { + params + .get(0) + .ok_or_else(|| "missing/invalid params[0] value".to_string()) + .and_then(|param| { + serde_json::from_value(param.clone()) + .map_err(|e| format!("failed to deserialize param[0]: {:?}", e)) + }) +}