core/vm/runtime: don't overwrite user input with default value (#33510)

runtime.setDefaults was unconditionally assigning cfg.Random =
&common.Hash{}, which silently overwrote any caller-provided Random
value. This made it impossible to simulate a specific PREVRANDAO and
also forced post-merge rules whenever London was active, regardless of
the intended environment.

This change only initializes cfg.Random when it is nil, matching how
other fields in Config are defaulted. Existing callers that did not set
Random keep the same behavior (a non-nil zero hash still enables
post-merge semantics), while callers that explicitly set Random now get
their value respected.
This commit is contained in:
phrwlk 2026-04-13 16:46:13 +03:00 committed by GitHub
parent 4da1e29320
commit 527ea11e50
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 18 additions and 1 deletions

View file

@ -109,7 +109,9 @@ func setDefaults(cfg *Config) {
if cfg.BlobBaseFee == nil {
cfg.BlobBaseFee = big.NewInt(params.BlobTxMinBlobGasprice)
}
cfg.Random = &(common.Hash{})
if cfg.Random == nil {
cfg.Random = new(common.Hash)
}
}
// Execute executes the code using the input as call data during the execution.

View file

@ -65,6 +65,21 @@ func TestDefaults(t *testing.T) {
if cfg.BlockNumber == nil {
t.Error("expected block number to be non nil")
}
if cfg.Random == nil {
t.Error("expected Random to be non nil")
}
}
func TestDefaultsPreserveRandom(t *testing.T) {
h := common.HexToHash("0x01")
cfg := &Config{Random: &h}
setDefaults(cfg)
if cfg.Random == nil {
t.Fatal("expected Random to remain non-nil")
}
if *cfg.Random != h {
t.Fatalf("expected Random to be preserved, got %x, want %x", *cfg.Random, h)
}
}
func TestEVM(t *testing.T) {