@@ -185,7 +185,105 @@ func TestCreation(t *testing.T) {
185185 }
186186 for i , tt := range tests {
187187 for j , ttt := range tt .cases {
188- if have := NewID (tt .config , tt .genesis , ttt .head ); have != ttt .want {
188+ if have := NewID (tt .config , tt .genesis , ttt .head , 0 ); have != ttt .want {
189+ t .Errorf ("test %d, case %d: fork ID mismatch: have %x, want %x" , i , j , have , ttt .want )
190+ }
191+ }
192+ }
193+ }
194+
195+ // TestCreationWithTimestamps tests that different genesis and fork rule combinations result in
196+ // the correct fork ID even for time based forks.
197+ func TestCreationWithTimestamps (t * testing.T ) {
198+ mergeConfig := * params .MainnetChainConfig
199+ mergeConfig .MergeNetsplitBlock = big .NewInt (18000000 )
200+
201+ withdrawalConfig := * params .MainnetChainConfig
202+ withdrawalConfig .MergeNetsplitBlock = big .NewInt (18000000 )
203+ withdrawalConfig .ShanghaiTime = big .NewInt (1668000000 )
204+ type testcase struct {
205+ head uint64
206+ time uint64
207+ want ID
208+ }
209+ tests := []struct {
210+ config * params.ChainConfig
211+ genesis common.Hash
212+ cases []testcase
213+ }{
214+ // Mainnet test cases
215+ {
216+ params .MainnetChainConfig ,
217+ params .MainnetGenesisHash ,
218+ []testcase {
219+ {0 , 0 , ID {Hash : checksumToBytes (0xfc64ec04 ), Next : 1150000 }}, // Unsynced
220+ {1149999 , 0 , ID {Hash : checksumToBytes (0xfc64ec04 ), Next : 1150000 }}, // Last Frontier block
221+ {1150000 , 0 , ID {Hash : checksumToBytes (0x97c2c34c ), Next : 1920000 }}, // First Homestead block
222+ {1919999 , 0 , ID {Hash : checksumToBytes (0x97c2c34c ), Next : 1920000 }}, // Last Homestead block
223+ {1920000 , 0 , ID {Hash : checksumToBytes (0x91d1f948 ), Next : 2463000 }}, // First DAO block
224+ {2462999 , 0 , ID {Hash : checksumToBytes (0x91d1f948 ), Next : 2463000 }}, // Last DAO block
225+ {2463000 , 0 , ID {Hash : checksumToBytes (0x7a64da13 ), Next : 2675000 }}, // First Tangerine block
226+ {2674999 , 0 , ID {Hash : checksumToBytes (0x7a64da13 ), Next : 2675000 }}, // Last Tangerine block
227+ {2675000 , 0 , ID {Hash : checksumToBytes (0x3edd5b10 ), Next : 4370000 }}, // First Spurious block
228+ {4369999 , 0 , ID {Hash : checksumToBytes (0x3edd5b10 ), Next : 4370000 }}, // Last Spurious block
229+ {4370000 , 0 , ID {Hash : checksumToBytes (0xa00bc324 ), Next : 7280000 }}, // First Byzantium block
230+ {7279999 , 0 , ID {Hash : checksumToBytes (0xa00bc324 ), Next : 7280000 }}, // Last Byzantium block
231+ {7280000 , 0 , ID {Hash : checksumToBytes (0x668db0af ), Next : 9069000 }}, // First and last Constantinople, first Petersburg block
232+ {9068999 , 0 , ID {Hash : checksumToBytes (0x668db0af ), Next : 9069000 }}, // Last Petersburg block
233+ {9069000 , 0 , ID {Hash : checksumToBytes (0x879d6e30 ), Next : 9200000 }}, // First Istanbul and first Muir Glacier block
234+ {9199999 , 0 , ID {Hash : checksumToBytes (0x879d6e30 ), Next : 9200000 }}, // Last Istanbul and first Muir Glacier block
235+ {9200000 , 0 , ID {Hash : checksumToBytes (0xe029e991 ), Next : 12244000 }}, // First Muir Glacier block
236+ {12243999 , 0 , ID {Hash : checksumToBytes (0xe029e991 ), Next : 12244000 }}, // Last Muir Glacier block
237+ {12244000 , 0 , ID {Hash : checksumToBytes (0x0eb440f6 ), Next : 12965000 }}, // First Berlin block
238+ {12964999 , 0 , ID {Hash : checksumToBytes (0x0eb440f6 ), Next : 12965000 }}, // Last Berlin block
239+ {12965000 , 0 , ID {Hash : checksumToBytes (0xb715077d ), Next : 13773000 }}, // First London block
240+ {13772999 , 0 , ID {Hash : checksumToBytes (0xb715077d ), Next : 13773000 }}, // Last London block
241+ {13773000 , 0 , ID {Hash : checksumToBytes (0x20c327fc ), Next : 15050000 }}, // First Arrow Glacier block
242+ {15049999 , 0 , ID {Hash : checksumToBytes (0x20c327fc ), Next : 15050000 }}, // Last Arrow Glacier block
243+ {15050000 , 0 , ID {Hash : checksumToBytes (0xf0afd0e3 ), Next : 0 }}, // First Gray Glacier block
244+ {20000000 , 0 , ID {Hash : checksumToBytes (0xf0afd0e3 ), Next : 0 }}, // Future Gray Glacier block
245+ },
246+ },
247+ // Withdrawal test cases
248+ {
249+ & withdrawalConfig ,
250+ params .MainnetGenesisHash ,
251+ []testcase {
252+ {0 , 0 , ID {Hash : checksumToBytes (0xfc64ec04 ), Next : 1150000 }}, // Unsynced
253+ {1149999 , 0 , ID {Hash : checksumToBytes (0xfc64ec04 ), Next : 1150000 }}, // Last Frontier block
254+ {1150000 , 0 , ID {Hash : checksumToBytes (0x97c2c34c ), Next : 1920000 }}, // First Homestead block
255+ {1919999 , 0 , ID {Hash : checksumToBytes (0x97c2c34c ), Next : 1920000 }}, // Last Homestead block
256+ {1920000 , 0 , ID {Hash : checksumToBytes (0x91d1f948 ), Next : 2463000 }}, // First DAO block
257+ {2462999 , 0 , ID {Hash : checksumToBytes (0x91d1f948 ), Next : 2463000 }}, // Last DAO block
258+ {2463000 , 0 , ID {Hash : checksumToBytes (0x7a64da13 ), Next : 2675000 }}, // First Tangerine block
259+ {2674999 , 0 , ID {Hash : checksumToBytes (0x7a64da13 ), Next : 2675000 }}, // Last Tangerine block
260+ {2675000 , 0 , ID {Hash : checksumToBytes (0x3edd5b10 ), Next : 4370000 }}, // First Spurious block
261+ {4369999 , 0 , ID {Hash : checksumToBytes (0x3edd5b10 ), Next : 4370000 }}, // Last Spurious block
262+ {4370000 , 0 , ID {Hash : checksumToBytes (0xa00bc324 ), Next : 7280000 }}, // First Byzantium block
263+ {7279999 , 0 , ID {Hash : checksumToBytes (0xa00bc324 ), Next : 7280000 }}, // Last Byzantium block
264+ {7280000 , 0 , ID {Hash : checksumToBytes (0x668db0af ), Next : 9069000 }}, // First and last Constantinople, first Petersburg block
265+ {9068999 , 0 , ID {Hash : checksumToBytes (0x668db0af ), Next : 9069000 }}, // Last Petersburg block
266+ {9069000 , 0 , ID {Hash : checksumToBytes (0x879d6e30 ), Next : 9200000 }}, // First Istanbul and first Muir Glacier block
267+ {9199999 , 0 , ID {Hash : checksumToBytes (0x879d6e30 ), Next : 9200000 }}, // Last Istanbul and first Muir Glacier block
268+ {9200000 , 0 , ID {Hash : checksumToBytes (0xe029e991 ), Next : 12244000 }}, // First Muir Glacier block
269+ {12243999 , 0 , ID {Hash : checksumToBytes (0xe029e991 ), Next : 12244000 }}, // Last Muir Glacier block
270+ {12244000 , 0 , ID {Hash : checksumToBytes (0x0eb440f6 ), Next : 12965000 }}, // First Berlin block
271+ {12964999 , 0 , ID {Hash : checksumToBytes (0x0eb440f6 ), Next : 12965000 }}, // Last Berlin block
272+ {12965000 , 0 , ID {Hash : checksumToBytes (0xb715077d ), Next : 13773000 }}, // First London block
273+ {13772999 , 0 , ID {Hash : checksumToBytes (0xb715077d ), Next : 13773000 }}, // Last London block
274+ {13773000 , 0 , ID {Hash : checksumToBytes (0x20c327fc ), Next : 15050000 }}, // First Arrow Glacier block
275+ {15049999 , 0 , ID {Hash : checksumToBytes (0x20c327fc ), Next : 15050000 }}, // Last Arrow Glacier block
276+ {15050000 , 0 , ID {Hash : checksumToBytes (0xf0afd0e3 ), Next : 18000000 }}, // First Gray Glacier block
277+ {18000000 , 0 , ID {Hash : checksumToBytes (0x4fb8a872 ), Next : 1668000000 }}, // First Merge Start block
278+ {20000000 , 0 , ID {Hash : checksumToBytes (0x4fb8a872 ), Next : 1668000000 }}, // Last Merge Start block
279+ {20000000 , 1668000000 , ID {Hash : checksumToBytes (0xc1fdf181 ), Next : 0 }}, // First Merge Start block
280+ {20000000 , 2668000000 , ID {Hash : checksumToBytes (0xc1fdf181 ), Next : 0 }}, // Future Merge Start block
281+ },
282+ },
283+ }
284+ for i , tt := range tests {
285+ for j , ttt := range tt .cases {
286+ if have := NewID (tt .config , tt .genesis , ttt .head , ttt .time ); have != ttt .want {
189287 t .Errorf ("test %d, case %d: fork ID mismatch: have %x, want %x" , i , j , have , ttt .want )
190288 }
191289 }
0 commit comments