mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-17 18:30:45 +00:00
accounts/abi/bind/backends: Disallow AdjustTime for non-empty blocks (#21334)
This commit is contained in:
parent
25d42fef2c
commit
089242bb39
2 changed files with 45 additions and 5 deletions
|
|
@ -794,13 +794,16 @@ func (b *SimulatedBackend) SubscribeNewHead(ctx context.Context, ch chan<- *type
|
||||||
}
|
}
|
||||||
|
|
||||||
// AdjustTime adds a time shift to the simulated clock.
|
// 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 {
|
func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error {
|
||||||
b.mu.Lock()
|
b.mu.Lock()
|
||||||
defer b.mu.Unlock()
|
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(), b.blockchain.Engine(), b.database, 1, func(number int, block *core.BlockGen) {
|
blocks, _ := core.GenerateChain(b.config, b.blockchain.CurrentBlock(), b.blockchain.Engine(), b.database, 1, func(number int, block *core.BlockGen) {
|
||||||
for _, tx := range b.pendingBlock.Transactions() {
|
|
||||||
block.AddTx(tx)
|
|
||||||
}
|
|
||||||
block.OffsetTime(int64(adjustment.Seconds()))
|
block.OffsetTime(int64(adjustment.Seconds()))
|
||||||
})
|
})
|
||||||
statedb, _ := b.blockchain.State()
|
statedb, _ := b.blockchain.State()
|
||||||
|
|
|
||||||
|
|
@ -143,8 +143,7 @@ func TestSimulatedBackend_AdjustTime(t *testing.T) {
|
||||||
defer sim.Close()
|
defer sim.Close()
|
||||||
|
|
||||||
prevTime := sim.pendingBlock.Time().Uint64()
|
prevTime := sim.pendingBlock.Time().Uint64()
|
||||||
err := sim.AdjustTime(time.Second)
|
if err := sim.AdjustTime(time.Second); err != nil {
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
newTime := sim.pendingBlock.Time().Uint64()
|
newTime := sim.pendingBlock.Time().Uint64()
|
||||||
|
|
@ -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().Uint64()
|
||||||
|
if err := sim.AdjustTime(time.Minute); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
newTime := sim.pendingBlock.Time().Uint64()
|
||||||
|
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().Uint64()
|
||||||
|
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) {
|
func TestSimulatedBackend_BalanceAt(t *testing.T) {
|
||||||
testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
|
testAddr := crypto.PubkeyToAddress(testKey.PublicKey)
|
||||||
expectedBal := big.NewInt(10000000000)
|
expectedBal := big.NewInt(10000000000)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue