@@ -18,7 +18,6 @@ package core
1818
1919import  (
2020	"crypto/ecdsa" 
21- 	"encoding/binary" 
2221	"math" 
2322	"math/big" 
2423	"testing" 
@@ -30,14 +29,11 @@ import (
3029	"github.com/ethereum/go-ethereum/consensus/misc/eip1559" 
3130	"github.com/ethereum/go-ethereum/consensus/misc/eip4844" 
3231	"github.com/ethereum/go-ethereum/core/rawdb" 
33- 	"github.com/ethereum/go-ethereum/core/state" 
3432	"github.com/ethereum/go-ethereum/core/types" 
3533	"github.com/ethereum/go-ethereum/core/vm" 
3634	"github.com/ethereum/go-ethereum/crypto" 
3735	"github.com/ethereum/go-ethereum/params" 
3836	"github.com/ethereum/go-ethereum/trie" 
39- 	"github.com/ethereum/go-ethereum/triedb" 
40- 	"github.com/ethereum/go-verkle" 
4137	"github.com/holiman/uint256" 
4238	"golang.org/x/crypto/sha3" 
4339)
@@ -426,193 +422,3 @@ func GenerateBadBlock(parent *types.Block, engine consensus.Engine, txs types.Tr
426422	}
427423	return  types .NewBlock (header , body , receipts , trie .NewStackTrie (nil ))
428424}
429- 
430- var  (
431- 	code                             =  common .FromHex (`6060604052600a8060106000396000f360606040526008565b00` )
432- 	intrinsicContractCreationGas , _  =  IntrinsicGas (code , nil , true , true , true , true )
433- 	// A contract creation that calls EXTCODECOPY in the constructor. Used to ensure that the witness 
434- 	// will not contain that copied data. 
435- 	// Source: https://gist.github.com/gballet/a23db1e1cb4ed105616b5920feb75985 
436- 	codeWithExtCodeCopy                 =  common .FromHex (`0x60806040526040516100109061017b565b604051809103906000f08015801561002c573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561007857600080fd5b5060008067ffffffffffffffff8111156100955761009461024a565b5b6040519080825280601f01601f1916602001820160405280156100c75781602001600182028036833780820191505090505b50905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506020600083833c81610101906101e3565b60405161010d90610187565b61011791906101a3565b604051809103906000f080158015610133573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061029b565b60d58061046783390190565b6102068061053c83390190565b61019d816101d9565b82525050565b60006020820190506101b86000830184610194565b92915050565b6000819050602082019050919050565b600081519050919050565b6000819050919050565b60006101ee826101ce565b826101f8846101be565b905061020381610279565b925060208210156102435761023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261028e565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061028582516101d9565b80915050919050565b600082821b905092915050565b6101bd806102aa6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d565b60405180910390f35b60006001905090565b6057816076565b82525050565b6000602082019050607060008301846050565b92915050565b600081905091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddda3e553245a99afc4eeefb2fbae5327aa64736f6c63430008070033608060405234801561001057600080fd5b5060405161020638038061020683398181016040528101906100329190610063565b60018160001c6100429190610090565b60008190555050610145565b60008151905061005d8161012e565b92915050565b60006020828403121561007957610078610129565b5b60006100878482850161004e565b91505092915050565b600061009b826100f0565b91506100a6836100f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156100db576100da6100fa565b5b828201905092915050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b610137816100e6565b811461014257600080fd5b50565b60b3806101536000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806381ca91d314602d575b600080fd5b60336047565b604051603e9190605a565b60405180910390f35b60005481565b6054816073565b82525050565b6000602082019050606d6000830184604d565b92915050565b600081905091905056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b74a413036d6063ca6a0998ca4264736f6c63430008070033` )
437- 	intrinsicCodeWithExtCodeCopyGas , _  =  IntrinsicGas (codeWithExtCodeCopy , nil , true , true , true , true )
438- )
439- 
440- func  TestProcessVerkle (t  * testing.T ) {
441- 	var  (
442- 		config  =  & params.ChainConfig {
443- 			ChainID :                 big .NewInt (1 ),
444- 			HomesteadBlock :          big .NewInt (0 ),
445- 			EIP150Block :             big .NewInt (0 ),
446- 			EIP155Block :             big .NewInt (0 ),
447- 			EIP158Block :             big .NewInt (0 ),
448- 			ByzantiumBlock :          big .NewInt (0 ),
449- 			ConstantinopleBlock :     big .NewInt (0 ),
450- 			PetersburgBlock :         big .NewInt (0 ),
451- 			IstanbulBlock :           big .NewInt (0 ),
452- 			MuirGlacierBlock :        big .NewInt (0 ),
453- 			BerlinBlock :             big .NewInt (0 ),
454- 			LondonBlock :             big .NewInt (0 ),
455- 			Ethash :                  new (params.EthashConfig ),
456- 			ShanghaiTime :            u64 (0 ),
457- 			VerkleTime :              u64 (0 ),
458- 			TerminalTotalDifficulty : common .Big0 ,
459- 		}
460- 		signer      =  types .LatestSigner (config )
461- 		testKey , _  =  crypto .HexToECDSA ("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" )
462- 		bcdb        =  rawdb .NewMemoryDatabase () // Database for the blockchain 
463- 		coinbase    =  common .HexToAddress ("0x71562b71999873DB5b286dF957af199Ec94617F7" )
464- 		gspec       =  & Genesis {
465- 			Config : config ,
466- 			Alloc : GenesisAlloc {
467- 				coinbase : GenesisAccount {
468- 					Balance : big .NewInt (1000000000000000000 ), // 1 ether 
469- 					Nonce :   0 ,
470- 				},
471- 			},
472- 		}
473- 	)
474- 	// Verkle trees use the snapshot, which must be enabled before the 
475- 	// data is saved into the tree+database. 
476- 	// genesis := gspec.MustCommit(bcdb, triedb) 
477- 	cacheConfig  :=  DefaultCacheConfigWithScheme ("path" )
478- 	cacheConfig .SnapshotLimit  =  0 
479- 	blockchain , _  :=  NewBlockChain (bcdb , cacheConfig , gspec , nil , beacon .New (ethash .NewFaker ()), vm.Config {}, nil )
480- 	defer  blockchain .Stop ()
481- 
482- 	txCost1  :=  params .TxGas 
483- 	txCost2  :=  params .TxGas 
484- 	contractCreationCost  :=  intrinsicContractCreationGas  + 
485- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  params .WitnessBranchReadCost  +  params .WitnessBranchWriteCost  +  /* creation */ 
486- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* creation with value */ 
487- 		739  /* execution costs */ 
488- 	codeWithExtCodeCopyGas  :=  intrinsicCodeWithExtCodeCopyGas  + 
489- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  params .WitnessBranchReadCost  +  params .WitnessBranchWriteCost  +  /* creation (tx) */ 
490- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  params .WitnessBranchReadCost  +  params .WitnessBranchWriteCost  +  /* creation (CREATE at pc=0x20) */ 
491- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* write code hash */ 
492- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #0 */ 
493- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #1 */ 
494- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #2 */ 
495- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #3 */ 
496- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #4 */ 
497- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #5 */ 
498- 		params .WitnessChunkReadCost  +  /* SLOAD in constructor */ 
499- 		params .WitnessChunkWriteCost  +  /* SSTORE in constructor */ 
500- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  params .WitnessBranchReadCost  +  params .WitnessBranchWriteCost  +  /* creation (CREATE at PC=0x121) */ 
501- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* write code hash */ 
502- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #0 */ 
503- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #1 */ 
504- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #2 */ 
505- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #3 */ 
506- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #4 */ 
507- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* code chunk #5 */ 
508- 		params .WitnessChunkReadCost  +  /* SLOAD in constructor */ 
509- 		params .WitnessChunkWriteCost  +  /* SSTORE in constructor */ 
510- 		params .WitnessChunkReadCost  +  params .WitnessChunkWriteCost  +  /* write code hash for tx creation */ 
511- 		15 * (params .WitnessChunkReadCost + params .WitnessChunkWriteCost ) +  /* code chunks #0..#14 */ 
512- 		4844  /* execution costs */ 
513- 	blockGasUsagesExpected  :=  []uint64 {
514- 		txCost1 * 2  +  txCost2 ,
515- 		txCost1 * 2  +  txCost2  +  contractCreationCost  +  codeWithExtCodeCopyGas ,
516- 	}
517- 	_ , chain , _ , proofs , statediffs  :=  GenerateVerkleChainWithGenesis (gspec , beacon .New (ethash .NewFaker ()), 2 , func (i  int , gen  * BlockGen ) {
518- 		gen .SetPoS ()
519- 
520- 		// TODO need to check that the tx cost provided is the exact amount used (no remaining left-over) 
521- 		tx , _  :=  types .SignTx (types .NewTransaction (uint64 (i )* 3 , common.Address {byte (i ), 2 , 3 }, big .NewInt (999 ), txCost1 , big .NewInt (875000000 ), nil ), signer , testKey )
522- 		gen .AddTx (tx )
523- 		tx , _  =  types .SignTx (types .NewTransaction (uint64 (i )* 3 + 1 , common.Address {}, big .NewInt (999 ), txCost1 , big .NewInt (875000000 ), nil ), signer , testKey )
524- 		gen .AddTx (tx )
525- 		tx , _  =  types .SignTx (types .NewTransaction (uint64 (i )* 3 + 2 , common.Address {}, big .NewInt (0 ), txCost2 , big .NewInt (875000000 ), nil ), signer , testKey )
526- 		gen .AddTx (tx )
527- 
528- 		// Add two contract creations in block #2 
529- 		if  i  ==  1  {
530- 			tx , _  =  types .SignTx (types .NewContractCreation (6 , big .NewInt (16 ), 3000000 , big .NewInt (875000000 ), code ), signer , testKey )
531- 			gen .AddTx (tx )
532- 
533- 			tx , _  =  types .SignTx (types .NewContractCreation (7 , big .NewInt (0 ), 3000000 , big .NewInt (875000000 ), codeWithExtCodeCopy ), signer , testKey )
534- 			gen .AddTx (tx )
535- 		}
536- 	})
537- 
538- 	// Check proof for both blocks 
539- 	err  :=  verkle .Verify (proofs [0 ], gspec .ToBlock ().Root ().Bytes (), chain [0 ].Root ().Bytes (), statediffs [0 ])
540- 	if  err  !=  nil  {
541- 		t .Fatal (err )
542- 	}
543- 	err  =  verkle .Verify (proofs [1 ], chain [0 ].Root ().Bytes (), chain [1 ].Root ().Bytes (), statediffs [1 ])
544- 	if  err  !=  nil  {
545- 		t .Fatal (err )
546- 	}
547- 
548- 	t .Log ("verified verkle proof, inserting blocks into the chain" )
549- 
550- 	endnum , err  :=  blockchain .InsertChain (chain )
551- 	if  err  !=  nil  {
552- 		t .Fatalf ("block %d imported with error: %v" , endnum , err )
553- 	}
554- 
555- 	for  i  :=  0 ; i  <  2 ; i ++  {
556- 		b  :=  blockchain .GetBlockByNumber (uint64 (i ) +  1 )
557- 		if  b  ==  nil  {
558- 			t .Fatalf ("expected block %d to be present in chain" , i + 1 )
559- 		}
560- 		if  b .Hash () !=  chain [i ].Hash () {
561- 			t .Fatalf ("block #%d not found at expected height" , b .NumberU64 ())
562- 		}
563- 		if  b .GasUsed () !=  blockGasUsagesExpected [i ] {
564- 			t .Fatalf ("expected block #%d txs to use %d, got %d\n " , b .NumberU64 (), blockGasUsagesExpected [i ], b .GasUsed ())
565- 		}
566- 	}
567- }
568- 
569- func  TestProcessParentBlockHash (t  * testing.T ) {
570- 	var  (
571- 		chainConfig  =  params .MergedTestChainConfig 
572- 		hashA        =  common.Hash {0x01 }
573- 		hashB        =  common.Hash {0x02 }
574- 		header       =  & types.Header {ParentHash : hashA , Number : big .NewInt (2 ), Difficulty : big .NewInt (0 )}
575- 		parent       =  & types.Header {ParentHash : hashB , Number : big .NewInt (1 ), Difficulty : big .NewInt (0 )}
576- 		coinbase     =  common.Address {}
577- 	)
578- 	test  :=  func (statedb  * state.StateDB ) {
579- 		statedb .SetNonce (params .HistoryStorageAddress , 1 )
580- 		statedb .SetCode (params .HistoryStorageAddress , params .HistoryStorageCode )
581- 		statedb .IntermediateRoot (true )
582- 
583- 		vmContext  :=  NewEVMBlockContext (header , nil , & coinbase )
584- 		evm  :=  vm .NewEVM (vmContext , vm.TxContext {}, statedb , chainConfig , vm.Config {})
585- 		ProcessParentBlockHash (header .ParentHash , evm , statedb )
586- 
587- 		vmContext  =  NewEVMBlockContext (parent , nil , & coinbase )
588- 		evm  =  vm .NewEVM (vmContext , vm.TxContext {}, statedb , chainConfig , vm.Config {})
589- 		ProcessParentBlockHash (parent .ParentHash , evm , statedb )
590- 
591- 		// make sure that the state is correct 
592- 		if  have  :=  getParentBlockHash (statedb , 1 ); have  !=  hashA  {
593- 			t .Errorf ("want parent hash %v, have %v" , hashA , have )
594- 		}
595- 		if  have  :=  getParentBlockHash (statedb , 0 ); have  !=  hashB  {
596- 			t .Errorf ("want parent hash %v, have %v" , hashB , have )
597- 		}
598- 	}
599- 	t .Run ("MPT" , func (t  * testing.T ) {
600- 		statedb , _  :=  state .New (types .EmptyRootHash , state .NewDatabaseForTesting ())
601- 		test (statedb )
602- 	})
603- 	t .Run ("Verkle" , func (t  * testing.T ) {
604- 		db  :=  rawdb .NewMemoryDatabase ()
605- 		cacheConfig  :=  DefaultCacheConfigWithScheme (rawdb .PathScheme )
606- 		cacheConfig .SnapshotLimit  =  0 
607- 		triedb  :=  triedb .NewDatabase (db , cacheConfig .triedbConfig (true ))
608- 		statedb , _  :=  state .New (types .EmptyVerkleHash , state .NewDatabase (triedb , nil ))
609- 		test (statedb )
610- 	})
611- }
612- 
613- func  getParentBlockHash (statedb  * state.StateDB , number  uint64 ) common.Hash  {
614- 	ringIndex  :=  number  %  params .HistoryServeWindow 
615- 	var  key  common.Hash 
616- 	binary .BigEndian .PutUint64 (key [24 :], ringIndex )
617- 	return  statedb .GetState (params .HistoryStorageAddress , key )
618- }
0 commit comments