Skip to content

Commit

Permalink
Merge pull request #2845 from OffchainLabs/prevent_arbtrace_with_latest
Browse files Browse the repository at this point in the history
[NIT-2990] Prevent calling arbtrace_* against nitro with the latest block number
  • Loading branch information
tsahee authored Jan 2, 2025
2 parents 4eaf47e + 7c1b94f commit a2baea9
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 9 deletions.
54 changes: 45 additions & 9 deletions execution/gethexec/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rpc"

"github.com/offchainlabs/nitro/arbos/arbosState"
Expand Down Expand Up @@ -285,14 +286,16 @@ func stateAndHeader(blockchain *core.BlockChain, block uint64) (*arbosState.Arbo
type ArbTraceForwarderAPI struct {
fallbackClientUrl string
fallbackClientTimeout time.Duration
blockchainConfig *params.ChainConfig

initialized atomic.Bool
mutex sync.Mutex
fallbackClient types.FallbackClient
}

func NewArbTraceForwarderAPI(fallbackClientUrl string, fallbackClientTimeout time.Duration) *ArbTraceForwarderAPI {
func NewArbTraceForwarderAPI(blockchainConfig *params.ChainConfig, fallbackClientUrl string, fallbackClientTimeout time.Duration) *ArbTraceForwarderAPI {
return &ArbTraceForwarderAPI{
blockchainConfig: blockchainConfig,
fallbackClientUrl: fallbackClientUrl,
fallbackClientTimeout: fallbackClientTimeout,
}
Expand Down Expand Up @@ -332,16 +335,45 @@ func (api *ArbTraceForwarderAPI) forward(ctx context.Context, method string, arg
return resp, nil
}

func (api *ArbTraceForwarderAPI) Call(ctx context.Context, callArgs json.RawMessage, traceTypes json.RawMessage, blockNum json.RawMessage) (*json.RawMessage, error) {
return api.forward(ctx, "arbtrace_call", callArgs, traceTypes, blockNum)
func (api *ArbTraceForwarderAPI) blockSupportedByClassicNode(blockNumOrHash json.RawMessage) error {
var bnh rpc.BlockNumberOrHash
err := bnh.UnmarshalJSON(blockNumOrHash)
if err != nil {
return err
}
blockNum, isNum := bnh.Number()
if !isNum {
return nil
}
// #nosec G115
if blockNum < 0 || blockNum > rpc.BlockNumber(api.blockchainConfig.ArbitrumChainParams.GenesisBlockNum) {
return fmt.Errorf("block number %v is not supported by classic node", blockNum)
}
return nil
}

func (api *ArbTraceForwarderAPI) CallMany(ctx context.Context, calls json.RawMessage, blockNum json.RawMessage) (*json.RawMessage, error) {
return api.forward(ctx, "arbtrace_callMany", calls, blockNum)
func (api *ArbTraceForwarderAPI) Call(ctx context.Context, callArgs json.RawMessage, traceTypes json.RawMessage, blockNumOrHash json.RawMessage) (*json.RawMessage, error) {
err := api.blockSupportedByClassicNode(blockNumOrHash)
if err != nil {
return nil, err
}
return api.forward(ctx, "arbtrace_call", callArgs, traceTypes, blockNumOrHash)
}

func (api *ArbTraceForwarderAPI) ReplayBlockTransactions(ctx context.Context, blockNum json.RawMessage, traceTypes json.RawMessage) (*json.RawMessage, error) {
return api.forward(ctx, "arbtrace_replayBlockTransactions", blockNum, traceTypes)
func (api *ArbTraceForwarderAPI) CallMany(ctx context.Context, calls json.RawMessage, blockNumOrHash json.RawMessage) (*json.RawMessage, error) {
err := api.blockSupportedByClassicNode(blockNumOrHash)
if err != nil {
return nil, err
}
return api.forward(ctx, "arbtrace_callMany", calls, blockNumOrHash)
}

func (api *ArbTraceForwarderAPI) ReplayBlockTransactions(ctx context.Context, blockNumOrHash json.RawMessage, traceTypes json.RawMessage) (*json.RawMessage, error) {
err := api.blockSupportedByClassicNode(blockNumOrHash)
if err != nil {
return nil, err
}
return api.forward(ctx, "arbtrace_replayBlockTransactions", blockNumOrHash, traceTypes)
}

func (api *ArbTraceForwarderAPI) ReplayTransaction(ctx context.Context, txHash json.RawMessage, traceTypes json.RawMessage) (*json.RawMessage, error) {
Expand All @@ -356,8 +388,12 @@ func (api *ArbTraceForwarderAPI) Get(ctx context.Context, txHash json.RawMessage
return api.forward(ctx, "arbtrace_get", txHash, path)
}

func (api *ArbTraceForwarderAPI) Block(ctx context.Context, blockNum json.RawMessage) (*json.RawMessage, error) {
return api.forward(ctx, "arbtrace_block", blockNum)
func (api *ArbTraceForwarderAPI) Block(ctx context.Context, blockNumOrHash json.RawMessage) (*json.RawMessage, error) {
err := api.blockSupportedByClassicNode(blockNumOrHash)
if err != nil {
return nil, err
}
return api.forward(ctx, "arbtrace_block", blockNumOrHash)
}

func (api *ArbTraceForwarderAPI) Filter(ctx context.Context, filter json.RawMessage) (*json.RawMessage, error) {
Expand Down
1 change: 1 addition & 0 deletions execution/gethexec/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ func CreateExecutionNode(
Namespace: "arbtrace",
Version: "1.0",
Service: NewArbTraceForwarderAPI(
l2BlockChain.Config(),
config.RPC.ClassicRedirect,
config.RPC.ClassicRedirectTimeout,
),
Expand Down

0 comments on commit a2baea9

Please sign in to comment.