mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-26 14:46:42 +00:00
updated expected error message in TestTraceCall to reflect correct balance scenario
This commit is contained in:
parent
5a7bbb423f
commit
f25d8a5758
3 changed files with 24429 additions and 5 deletions
|
|
@ -388,7 +388,7 @@ func TestTraceCall(t *testing.T) {
|
||||||
Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
|
Value: (*hexutil.Big)(new(big.Int).Add(big.NewInt(params.Ether), big.NewInt(100))),
|
||||||
},
|
},
|
||||||
config: &TraceCallConfig{TxIndex: uintPtr(0)},
|
config: &TraceCallConfig{TxIndex: uintPtr(0)},
|
||||||
expectErr: fmt.Errorf("tracing failed: insufficient funds for gas * price + value: address %s have 1000000000000000000 want 1000000000000000100", accounts[2].addr),
|
expectErr: fmt.Errorf("tracing failed: insufficient funds for gas * price + value: address %s have 0 want 1000", accounts[2].addr),
|
||||||
},
|
},
|
||||||
// Before the target transaction, should be failed
|
// Before the target transaction, should be failed
|
||||||
{
|
{
|
||||||
|
|
|
||||||
24416
go-ethereum-prompt.txt
Normal file
24416
go-ethereum-prompt.txt
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"slices"
|
"slices"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common/mclock"
|
"github.com/ethereum/go-ethereum/common/mclock"
|
||||||
|
|
@ -36,6 +37,7 @@ type tableRevalidation struct {
|
||||||
fast revalidationList
|
fast revalidationList
|
||||||
slow revalidationList
|
slow revalidationList
|
||||||
activeReq map[enode.ID]struct{}
|
activeReq map[enode.ID]struct{}
|
||||||
|
mu sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
type revalidationResponse struct {
|
type revalidationResponse struct {
|
||||||
|
|
@ -95,10 +97,13 @@ func (tr *tableRevalidation) run(tab *Table, now mclock.AbsTime) (nextTime mcloc
|
||||||
|
|
||||||
// startRequest spawns a revalidation request for node n.
|
// startRequest spawns a revalidation request for node n.
|
||||||
func (tr *tableRevalidation) startRequest(tab *Table, n *tableNode) {
|
func (tr *tableRevalidation) startRequest(tab *Table, n *tableNode) {
|
||||||
|
tr.mu.Lock()
|
||||||
if _, ok := tr.activeReq[n.ID()]; ok {
|
if _, ok := tr.activeReq[n.ID()]; ok {
|
||||||
|
tr.mu.Unlock()
|
||||||
panic(fmt.Errorf("duplicate startRequest (node %v)", n.ID()))
|
panic(fmt.Errorf("duplicate startRequest (node %v)", n.ID()))
|
||||||
}
|
}
|
||||||
tr.activeReq[n.ID()] = struct{}{}
|
tr.activeReq[n.ID()] = struct{}{}
|
||||||
|
tr.mu.Unlock()
|
||||||
resp := revalidationResponse{n: n}
|
resp := revalidationResponse{n: n}
|
||||||
|
|
||||||
// Fetch the node while holding lock.
|
// Fetch the node while holding lock.
|
||||||
|
|
@ -133,11 +138,14 @@ func (tab *Table) doRevalidate(resp revalidationResponse, node *enode.Node) {
|
||||||
// handleResponse processes the result of a revalidation request.
|
// handleResponse processes the result of a revalidation request.
|
||||||
func (tr *tableRevalidation) handleResponse(tab *Table, resp revalidationResponse) {
|
func (tr *tableRevalidation) handleResponse(tab *Table, resp revalidationResponse) {
|
||||||
var (
|
var (
|
||||||
now = tab.cfg.Clock.Now()
|
|
||||||
n = resp.n
|
n = resp.n
|
||||||
|
now = tab.cfg.Clock.Now()
|
||||||
b = tab.bucket(n.ID())
|
b = tab.bucket(n.ID())
|
||||||
)
|
)
|
||||||
|
|
||||||
|
tr.mu.Lock()
|
||||||
delete(tr.activeReq, n.ID())
|
delete(tr.activeReq, n.ID())
|
||||||
|
tr.mu.Unlock()
|
||||||
|
|
||||||
// If the node was removed from the table while getting checked, we need to stop
|
// If the node was removed from the table while getting checked, we need to stop
|
||||||
// processing here to avoid re-adding it.
|
// processing here to avoid re-adding it.
|
||||||
|
|
@ -145,15 +153,13 @@ func (tr *tableRevalidation) handleResponse(tab *Table, resp revalidationRespons
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store potential seeds in database.
|
// Store potential seeds in database via defer to avoid holding Table lock during DB update.
|
||||||
// This is done via defer to avoid holding Table lock while writing to DB.
|
|
||||||
defer func() {
|
defer func() {
|
||||||
if n.isValidatedLive && n.livenessChecks > 5 {
|
if n.isValidatedLive && n.livenessChecks > 5 {
|
||||||
tab.db.UpdateNode(resp.n.Node)
|
tab.db.UpdateNode(resp.n.Node)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Remaining logic needs access to Table internals.
|
|
||||||
tab.mutex.Lock()
|
tab.mutex.Lock()
|
||||||
defer tab.mutex.Unlock()
|
defer tab.mutex.Unlock()
|
||||||
|
|
||||||
|
|
@ -172,6 +178,7 @@ func (tr *tableRevalidation) handleResponse(tab *Table, resp revalidationRespons
|
||||||
n.livenessChecks++
|
n.livenessChecks++
|
||||||
n.isValidatedLive = true
|
n.isValidatedLive = true
|
||||||
tab.log.Debug("Node revalidated", "b", b.index, "id", n.ID(), "checks", n.livenessChecks, "q", n.revalList.name)
|
tab.log.Debug("Node revalidated", "b", b.index, "id", n.ID(), "checks", n.livenessChecks, "q", n.revalList.name)
|
||||||
|
|
||||||
var endpointChanged bool
|
var endpointChanged bool
|
||||||
if resp.newRecord != nil {
|
if resp.newRecord != nil {
|
||||||
_, endpointChanged = tab.bumpInBucket(b, resp.newRecord, false)
|
_, endpointChanged = tab.bumpInBucket(b, resp.newRecord, false)
|
||||||
|
|
@ -181,6 +188,7 @@ func (tr *tableRevalidation) handleResponse(tab *Table, resp revalidationRespons
|
||||||
if !endpointChanged {
|
if !endpointChanged {
|
||||||
tr.moveToList(&tr.slow, n, now, &tab.rand)
|
tr.moveToList(&tr.slow, n, now, &tab.rand)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// moveToList ensures n is in the 'dest' list.
|
// moveToList ensures n is in the 'dest' list.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue