accounts/abi/bind/backends: Disallow AdjustTime for non-empty blocks (#21334)
* accounts/abi/bind/backends: Disallow timeshift for non-empty blocks * accounts/abi/bind/backends: added tests for adjust time * accounts/abi/bind/simulated: added comments, fixed test for AdjustTime * accounts/abi/bind/backends: updated comment
This commit is contained in:
		
							parent
							
								
									fc20680b95
								
							
						
					
					
						commit
						92b12ee6c6
					
				| @ -675,14 +675,16 @@ func (b *SimulatedBackend) SubscribeNewHead(ctx context.Context, ch chan<- *type | ||||
| } | ||||
| 
 | ||||
| // AdjustTime adds a time shift to the simulated clock.
 | ||||
| // It can only be called on empty blocks.
 | ||||
| func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error { | ||||
| 	b.mu.Lock() | ||||
| 	defer b.mu.Unlock() | ||||
| 
 | ||||
| 	if len(b.pendingBlock.Transactions()) != 0 { | ||||
| 		return errors.New("Could not adjust time on non-empty block") | ||||
| 	} | ||||
| 
 | ||||
| 	blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), ethash.NewFaker(), b.database, 1, func(number int, block *core.BlockGen) { | ||||
| 		for _, tx := range b.pendingBlock.Transactions() { | ||||
| 			block.AddTx(tx) | ||||
| 		} | ||||
| 		block.OffsetTime(int64(adjustment.Seconds())) | ||||
| 	}) | ||||
| 	statedb, _ := b.blockchain.State() | ||||
|  | ||||
| @ -143,8 +143,7 @@ func TestSimulatedBackend_AdjustTime(t *testing.T) { | ||||
| 	defer sim.Close() | ||||
| 
 | ||||
| 	prevTime := sim.pendingBlock.Time() | ||||
| 	err := sim.AdjustTime(time.Second) | ||||
| 	if err != nil { | ||||
| 	if err := sim.AdjustTime(time.Second); err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| 	newTime := sim.pendingBlock.Time() | ||||
| @ -154,6 +153,44 @@ func TestSimulatedBackend_AdjustTime(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestNewSimulatedBackend_AdjustTimeFail(t *testing.T) { | ||||
| 	testAddr := crypto.PubkeyToAddress(testKey.PublicKey) | ||||
| 	sim := simTestBackend(testAddr) | ||||
| 	// Create tx and send
 | ||||
| 	tx := types.NewTransaction(0, testAddr, big.NewInt(1000), params.TxGas, big.NewInt(1), nil) | ||||
| 	signedTx, err := types.SignTx(tx, types.HomesteadSigner{}, testKey) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("could not sign tx: %v", err) | ||||
| 	} | ||||
| 	sim.SendTransaction(context.Background(), signedTx) | ||||
| 	// AdjustTime should fail on non-empty block
 | ||||
| 	if err := sim.AdjustTime(time.Second); err == nil { | ||||
| 		t.Error("Expected adjust time to error on non-empty block") | ||||
| 	} | ||||
| 	sim.Commit() | ||||
| 
 | ||||
| 	prevTime := sim.pendingBlock.Time() | ||||
| 	if err := sim.AdjustTime(time.Minute); err != nil { | ||||
| 		t.Error(err) | ||||
| 	} | ||||
| 	newTime := sim.pendingBlock.Time() | ||||
| 	if newTime-prevTime != uint64(time.Minute.Seconds()) { | ||||
| 		t.Errorf("adjusted time not equal to a minute. prev: %v, new: %v", prevTime, newTime) | ||||
| 	} | ||||
| 	// Put a transaction after adjusting time
 | ||||
| 	tx2 := types.NewTransaction(1, testAddr, big.NewInt(1000), params.TxGas, big.NewInt(1), nil) | ||||
| 	signedTx2, err := types.SignTx(tx2, types.HomesteadSigner{}, testKey) | ||||
| 	if err != nil { | ||||
| 		t.Errorf("could not sign tx: %v", err) | ||||
| 	} | ||||
| 	sim.SendTransaction(context.Background(), signedTx2) | ||||
| 	sim.Commit() | ||||
| 	newTime = sim.pendingBlock.Time() | ||||
| 	if newTime-prevTime >= uint64(time.Minute.Seconds()) { | ||||
| 		t.Errorf("time adjusted, but shouldn't be: prev: %v, new: %v", prevTime, newTime) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestSimulatedBackend_BalanceAt(t *testing.T) { | ||||
| 	testAddr := crypto.PubkeyToAddress(testKey.PublicKey) | ||||
| 	expectedBal := big.NewInt(10000000000) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user