From 140ff2df6e4e154a2c7fa0240296a694fc5f0171 Mon Sep 17 00:00:00 2001 From: SANJI <124805533+GRYPHON000@users.noreply.github.com> Date: Sat, 16 May 2026 18:03:21 +0530 Subject: [PATCH 1/4] Return error for unserializable trusted block spends --- crates/chia-consensus/src/run_block_generator.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/crates/chia-consensus/src/run_block_generator.rs b/crates/chia-consensus/src/run_block_generator.rs index 80d6a2917..e64f71647 100644 --- a/crates/chia-consensus/src/run_block_generator.rs +++ b/crates/chia-consensus/src/run_block_generator.rs @@ -385,8 +385,10 @@ where // solution reuses CLVM subtrees such that a plain serialization becomes // very large. from_clvm() fails if the resulting buffer is greater than // 2 MB - let puzzle_program = Program::from_clvm(&a, puzzle).unwrap_or_default(); - let solution_program = Program::from_clvm(&a, solution).unwrap_or_default(); + let puzzle_program = Program::from_clvm(&a, puzzle) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; + let solution_program = Program::from_clvm(&a, solution) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; let coinspend = CoinSpend::new(coin, puzzle_program, solution_program); output.push(coinspend); } @@ -480,9 +482,10 @@ where puzhash.into(), parse_amount(&a, amount, ErrorCode::InvalidCoinAmount)?, ); - let puzzle_program = Program::from_clvm(&a, puzzle).unwrap_or_default(); - let solution_program = Program::from_clvm(&a, solution).unwrap_or_default(); - + let puzzle_program = Program::from_clvm(&a, puzzle) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; + let solution_program = Program::from_clvm(&a, solution) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; let Reduction(_clvm_cost, res) = run_program( &mut a, &dialect, From 39c22ad132b9ae41c6e7f73b1e2b7e10ec813dce Mon Sep 17 00:00:00 2001 From: SANJI <124805533+GRYPHON000@users.noreply.github.com> Date: Sat, 16 May 2026 18:11:17 +0530 Subject: [PATCH 2/4] Update run_block_generator.rs --- crates/chia-consensus/src/run_block_generator.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/chia-consensus/src/run_block_generator.rs b/crates/chia-consensus/src/run_block_generator.rs index e64f71647..cd114b920 100644 --- a/crates/chia-consensus/src/run_block_generator.rs +++ b/crates/chia-consensus/src/run_block_generator.rs @@ -387,7 +387,7 @@ where // 2 MB let puzzle_program = Program::from_clvm(&a, puzzle) .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; - let solution_program = Program::from_clvm(&a, solution) + let solution_program = Program::from_clvm(&a, solution) .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; let coinspend = CoinSpend::new(coin, puzzle_program, solution_program); output.push(coinspend); From c2016f5f07abb22e424e39d4a7ae25b46e3776f3 Mon Sep 17 00:00:00 2001 From: SANJI <124805533+GRYPHON000@users.noreply.github.com> Date: Sat, 16 May 2026 22:38:41 +0530 Subject: [PATCH 3/4] Skip unserializable trusted block spends --- .../chia-consensus/src/run_block_generator.rs | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/crates/chia-consensus/src/run_block_generator.rs b/crates/chia-consensus/src/run_block_generator.rs index cd114b920..64ce1a499 100644 --- a/crates/chia-consensus/src/run_block_generator.rs +++ b/crates/chia-consensus/src/run_block_generator.rs @@ -385,10 +385,14 @@ where // solution reuses CLVM subtrees such that a plain serialization becomes // very large. from_clvm() fails if the resulting buffer is greater than // 2 MB - let puzzle_program = Program::from_clvm(&a, puzzle) - .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; - let solution_program = Program::from_clvm(&a, solution) - .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; + let puzzle_program = match Program::from_clvm(&a, puzzle) { + Ok(program) => program, + Err(_) => continue, + }; + let solution_program = match Program::from_clvm(&a, solution) { + Ok(program) => program, + Err(_) => continue, + }; let coinspend = CoinSpend::new(coin, puzzle_program, solution_program); output.push(coinspend); } @@ -482,10 +486,14 @@ where puzhash.into(), parse_amount(&a, amount, ErrorCode::InvalidCoinAmount)?, ); - let puzzle_program = Program::from_clvm(&a, puzzle) - .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; - let solution_program = Program::from_clvm(&a, solution) - .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; + let puzzle_program = match Program::from_clvm(&a, puzzle) { + Ok(program) => program, + Err(_) => continue, + }; + let solution_program = match Program::from_clvm(&a, solution) { + Ok(program) => program, + Err(_) => continue, + }; let Reduction(_clvm_cost, res) = run_program( &mut a, &dialect, From 65aea8776528207916d87417c3a0f92b2ceb9a9f Mon Sep 17 00:00:00 2001 From: SANJI <124805533+GRYPHON000@users.noreply.github.com> Date: Sat, 16 May 2026 23:05:05 +0530 Subject: [PATCH 4/4] Return extraction error for unserializable trusted spends --- .../chia-consensus/src/run_block_generator.rs | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/crates/chia-consensus/src/run_block_generator.rs b/crates/chia-consensus/src/run_block_generator.rs index 64ce1a499..cc5382bf3 100644 --- a/crates/chia-consensus/src/run_block_generator.rs +++ b/crates/chia-consensus/src/run_block_generator.rs @@ -384,15 +384,12 @@ where // This may fail for malicious generators, where the puzzle reveal or // solution reuses CLVM subtrees such that a plain serialization becomes // very large. from_clvm() fails if the resulting buffer is greater than - // 2 MB - let puzzle_program = match Program::from_clvm(&a, puzzle) { - Ok(program) => program, - Err(_) => continue, - }; - let solution_program = match Program::from_clvm(&a, solution) { - Ok(program) => program, - Err(_) => continue, - }; + // 2 MB. Treat this as an extraction failure instead of silently + // substituting Program::default(). + let puzzle_program = Program::from_clvm(&a, puzzle) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; + let solution_program = Program::from_clvm(&a, solution) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; let coinspend = CoinSpend::new(coin, puzzle_program, solution_program); output.push(coinspend); } @@ -486,14 +483,12 @@ where puzhash.into(), parse_amount(&a, amount, ErrorCode::InvalidCoinAmount)?, ); - let puzzle_program = match Program::from_clvm(&a, puzzle) { - Ok(program) => program, - Err(_) => continue, - }; - let solution_program = match Program::from_clvm(&a, solution) { - Ok(program) => program, - Err(_) => continue, - }; + // Treat puzzle/solution serialization failure as an extraction failure + // instead of silently substituting Program::default(). + let puzzle_program = Program::from_clvm(&a, puzzle) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; + let solution_program = Program::from_clvm(&a, solution) + .map_err(|_| ValidationErr(ErrorCode::GeneratorRuntimeError))?; let Reduction(_clvm_cost, res) = run_program( &mut a, &dialect,