Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Patch for debug trace message to address reference #553

Merged
merged 2 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 23 additions & 5 deletions ethapi/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -2129,7 +2129,15 @@ func (api *PublicDebugAPI) TraceTransaction(ctx context.Context, hash common.Has
// traceTx configures a new tracer according to the provided configuration, and
// executes the given message in the provided environment. The return value will
// be tracer dependent.
func (api *PublicDebugAPI) traceTx(ctx context.Context, message evmcore.Message, txctx *tracers.Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig) (interface{}, error) {
func (api *PublicDebugAPI) traceTx(ctx context.Context, message evmcore.Message, txctx *tracers.Context, vmctx vm.BlockContext, statedb *state.StateDB, config *TraceConfig) (ret interface{}, reterr error) {

defer func() {
if r := recover(); r != nil {
log.Error("debug trace transaction failed with panic:", r)
reterr = fmt.Errorf("debug trace transaction failed with panic: %v", r)
}
}()

// Assemble the structured logger or the JavaScript tracer
var (
tracer vm.Tracer
Expand Down Expand Up @@ -2202,17 +2210,27 @@ func (api *PublicDebugAPI) traceTx(ctx context.Context, message evmcore.Message,
if config.Tracer != nil && strings.Compare(*config.Tracer, "callTracer") == 0 {
if strings.Contains(err.Error(), "cannot read property 'toString' of undefined") {
log.Debug("error when debug with callTracer", "err", err.Error())
callTracer, _ := tracers.New(*config.Tracer, txctx)
callTracer.CaptureStart(vmenv, message.From(), *message.To(), false, message.Data(), message.Gas(), message.Value())
callTracer, errTracer := tracers.New(*config.Tracer, txctx)
if errTracer != nil {
return nil, errTracer
}
if message == nil || vmenv == nil {
return nil, err
}
to := message.To()
if to == nil {
to = &common.Address{}
}
callTracer.CaptureStart(vmenv, message.From(), *to, false, message.Data(), message.Gas(), message.Value())
callTracer.CaptureEnd([]byte{}, message.Gas(), time.Duration(0), fmt.Errorf("execution reverted"))
result, err = callTracer.GetResult()
return callTracer.GetResult()
}
}
}
return result, err

default:
panic(fmt.Sprintf("bad tracer type %T", tracer))
return nil, fmt.Errorf("bad tracer type %T", tracer)
}
}

Expand Down
18 changes: 13 additions & 5 deletions gossip/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package gossip
import (
"errors"
"fmt"
"github.com/ethereum/go-ethereum/p2p/enode"
"math"
"math/rand"
"strings"
Expand Down Expand Up @@ -773,6 +774,17 @@ func (h *handler) highestPeerProgress() PeerProgress {
return max
}

// isUseless checks if the peer is banned from discovery and ban it if it should be
func isUseless(node *enode.Node, name string) bool {
useless := discfilter.Banned(node.ID(), node.Record())
lowerName := strings.ToLower(name)
if !useless && !strings.Contains(lowerName, "opera") && !strings.Contains(lowerName, "sonic") {
useless = true
discfilter.Ban(node.ID())
}
return useless
}

// handle is the callback invoked to manage the life cycle of a peer. When
// this function terminates, the peer is disconnected.
func (h *handler) handle(p *peer) error {
Expand All @@ -783,11 +795,7 @@ func (h *handler) handle(p *peer) error {
p.Log().Error("Snapshot extension barrier failed", "err", err)
return err
}
useless := discfilter.Banned(p.Node().ID(), p.Node().Record())
if !useless && (!eligibleForSnap(p.Peer) || !strings.Contains(strings.ToLower(p.Name()), "opera")) {
useless = true
discfilter.Ban(p.ID())
}
useless := isUseless(p.Node(), p.Name())
if !p.Peer.Info().Network.Trusted && useless {
if h.peers.UselessNum() >= h.maxPeers/10 {
// don't allow more than 10% of useless peers
Expand Down
Loading