Skip to content

Commit a77614a

Browse files
committed
Merge branch 'master' into braga/disable-arbowner-flag
Signed-off-by: Igor Braga <5835477+bragaigor@users.noreply.github.com>
2 parents 5060a63 + 68da2ed commit a77614a

77 files changed

Lines changed: 2097 additions & 23878 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.dockerignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ crates/tools/module_roots
2727
crates/tools/pricer
2828

2929
# Rust outputs
30-
crates/stylus/tests/*/target/
30+
crates/stylus/tests/target/
3131
crates/wasm-testsuite/target/
3232
crates/wasm-libraries/target/
3333
crates/tools/wasmer/target/

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ stylus_lang_rust = $(wildcard $(rust_sdk)/*/src/*.rs $(rust_sdk)/*/src/*/*.rs $(
124124
stylus_lang_c = $(wildcard $(c_sdk)/*/*.c $(c_sdk)/*/*.h)
125125
stylus_lang_bf = $(wildcard crates/langs/bf/src/*.* crates/langs/bf/src/*.toml)
126126

127-
get_stylus_test_wasm = $(stylus_test_dir)/$(1)/$(wasm32_unknown)/$(1).wasm
127+
get_stylus_test_wasm = $(stylus_test_dir)/$(wasm32_unknown)/$(1).wasm
128128
get_stylus_test_rust = $(wildcard $(stylus_test_dir)/$(1)/*.toml $(stylus_test_dir)/$(1)/src/*.rs) $(stylus_cargo) $(stylus_lang_rust)
129129
get_stylus_test_c = $(wildcard $(c_sdk)/examples/$(1)/*.c $(c_sdk)/examples/$(1)/*.h) $(stylus_lang_c)
130130
stylus_test_bfs = $(wildcard $(stylus_test_dir)/bf/*.b)
@@ -293,7 +293,7 @@ clean:
293293
rm -f crates/wasm-libraries/soft-float/SoftFloat/build/Wasm-Clang/*.o
294294
rm -f crates/wasm-libraries/soft-float/SoftFloat/build/Wasm-Clang/*.a
295295
rm -f crates/wasm-libraries/forward/*.wat
296-
rm -rf crates/stylus/tests/*/target/ crates/stylus/tests/*/*.wasm
296+
rm -rf crates/stylus/tests/target/ crates/stylus/tests/*/*.wasm
297297
rm -rf brotli/buildfiles
298298
@rm -rf contracts/build contracts/cache solgen/go/
299299
@rm -rf contracts-legacy/build contracts-legacy/cache

arbnode/inbox_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func NewTransactionStreamerForTest(t *testing.T, ctx context.Context, ownerAddre
141141
}
142142

143143
transactionStreamerConfigFetcher := func() *TransactionStreamerConfig { return &DefaultTransactionStreamerConfig }
144-
execEngine := gethexec.NewExecutionEngine(bc, 0, false, false)
144+
execEngine := gethexec.NewExecutionEngine(bc, 0, false, false, nil)
145145
stylusTargetConfig := &gethexec.DefaultStylusTargetConfig
146146
Require(t, stylusTargetConfig.Validate()) // pre-processes config (i.a. parses wasmTargets)
147147
if err := execEngine.Initialize(gethexec.DefaultCachingConfig.StylusLRUCacheCapacity, &gethexec.DefaultStylusTargetConfig); err != nil {

arbnode/mel/runner/database.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func (d *Database) setMelState(batch ethdb.KeyValueWriter, parentChainBlockNumbe
5151
if err != nil {
5252
return err
5353
}
54+
melStateSizeBytesGauge.Update(int64(len(melStateBytes)))
5455
if err := batch.Put(key, melStateBytes); err != nil {
5556
return err
5657
}

arbnode/mel/runner/mel.go

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"github.com/ethereum/go-ethereum/core/rawdb"
1919
"github.com/ethereum/go-ethereum/core/types"
2020
"github.com/ethereum/go-ethereum/log"
21-
"github.com/ethereum/go-ethereum/metrics"
2221
"github.com/ethereum/go-ethereum/params"
2322
"github.com/ethereum/go-ethereum/rpc"
2423

@@ -29,46 +28,49 @@ import (
2928
"github.com/offchainlabs/nitro/bold/containers/fsm"
3029
"github.com/offchainlabs/nitro/cmd/chaininfo"
3130
"github.com/offchainlabs/nitro/daprovider"
31+
"github.com/offchainlabs/nitro/staker"
3232
"github.com/offchainlabs/nitro/util/headerreader"
3333
"github.com/offchainlabs/nitro/util/stopwaiter"
3434
)
3535

36-
var (
37-
stuckFSMIndicatingGauge = metrics.NewRegisteredGauge("arb/mel/stuck", nil) // 1-stuck, 0-not_stuck
38-
)
39-
4036
type MessageExtractionConfig struct {
41-
Enable bool `koanf:"enable"`
42-
RetryInterval time.Duration `koanf:"retry-interval"`
43-
BlocksToPrefetch uint64 `koanf:"blocks-to-prefetch"`
44-
ReadMode string `koanf:"read-mode"`
45-
StallTolerance uint64 `koanf:"stall-tolerance"`
37+
Enable bool `koanf:"enable"`
38+
RetryInterval time.Duration `koanf:"retry-interval"`
39+
BlocksToPrefetch uint64 `koanf:"blocks-to-prefetch"`
40+
ReadMode string `koanf:"read-mode"`
41+
StallTolerance uint64 `koanf:"stall-tolerance"`
42+
LogExtractionStatusFrequencyBlocks uint64 `koanf:"log-extraction-status-frequency-blocks"`
4643
}
4744

4845
func (c *MessageExtractionConfig) Validate() error {
4946
c.ReadMode = strings.ToLower(c.ReadMode)
5047
if c.ReadMode != "latest" && c.ReadMode != "safe" && c.ReadMode != "finalized" {
5148
return fmt.Errorf("inbox reader read-mode is invalid, want: latest or safe or finalized, got: %s", c.ReadMode)
5249
}
50+
if c.LogExtractionStatusFrequencyBlocks == 0 {
51+
return errors.New("log-extraction-status-frequency-blocks must be greater than 0")
52+
}
5353
return nil
5454
}
5555

5656
var DefaultMessageExtractionConfig = MessageExtractionConfig{
5757
Enable: false,
5858
// The retry interval for the message extractor FSM. After each tick of the FSM,
5959
// the extractor service stop waiter will wait for this duration before trying to act again.
60-
RetryInterval: time.Millisecond * 500,
61-
BlocksToPrefetch: 499, // 500 is the eth_getLogs block range limit
62-
ReadMode: "latest",
63-
StallTolerance: 10,
60+
RetryInterval: time.Millisecond * 500,
61+
BlocksToPrefetch: 499, // 500 is the eth_getLogs block range limit
62+
ReadMode: "latest",
63+
StallTolerance: 10,
64+
LogExtractionStatusFrequencyBlocks: 100,
6465
}
6566

6667
var TestMessageExtractionConfig = MessageExtractionConfig{
67-
Enable: false,
68-
RetryInterval: time.Millisecond * 10,
69-
BlocksToPrefetch: 499,
70-
ReadMode: "latest",
71-
StallTolerance: 10,
68+
Enable: false,
69+
RetryInterval: time.Millisecond * 10,
70+
BlocksToPrefetch: 499,
71+
ReadMode: "latest",
72+
StallTolerance: 10,
73+
LogExtractionStatusFrequencyBlocks: 100,
7274
}
7375

7476
func MessageExtractionConfigAddOptions(prefix string, f *pflag.FlagSet) {
@@ -77,6 +79,7 @@ func MessageExtractionConfigAddOptions(prefix string, f *pflag.FlagSet) {
7779
f.Uint64(prefix+".blocks-to-prefetch", DefaultMessageExtractionConfig.BlocksToPrefetch, "the number of blocks to prefetch relevant logs from. Recommend using max allowed range for eth_getLogs rpc query")
7880
f.String(prefix+".read-mode", DefaultMessageExtractionConfig.ReadMode, "mode to only read latest or safe or finalized L1 blocks. Enabling safe or finalized disables feed input and output. Defaults to latest. Takes string input, valid strings- latest, safe, finalized")
7981
f.Uint64(prefix+".stall-tolerance", DefaultMessageExtractionConfig.StallTolerance, "max times the MEL fsm is allowed to be stuck without logging error")
82+
f.Uint64(prefix+".log-extraction-status-frequency-blocks", DefaultMessageExtractionConfig.LogExtractionStatusFrequencyBlocks, "frequency of logging message extraction status in terms of number of blocks processed")
8083
}
8184

8285
// SequencerBatchCountFetcher queries the on-chain sequencer inbox batch count at a given parent chain block.
@@ -321,6 +324,17 @@ func (m *MessageExtractor) GetMsgCount() (arbutil.MessageIndex, error) {
321324
return arbutil.MessageIndex(headState.MsgCount), nil
322325
}
323326

327+
func (m *MessageExtractor) GetDelayedMessageBytes(ctx context.Context, seqNum uint64) ([]byte, error) {
328+
msg, err := m.GetDelayedMessage(seqNum)
329+
if err != nil {
330+
return nil, err
331+
}
332+
if msg.Message == nil {
333+
return nil, fmt.Errorf("message at seqNum %d has nil Message field", seqNum)
334+
}
335+
return msg.Message.Serialize()
336+
}
337+
324338
func (m *MessageExtractor) GetDelayedMessage(index uint64) (*mel.DelayedInboxMessage, error) {
325339
headState, err := m.melDB.GetHeadMelState()
326340
if err != nil {
@@ -519,6 +533,10 @@ func (m *MessageExtractor) FindInboxBatchContainingMessage(pos arbutil.MessageIn
519533
}
520534
}
521535

536+
func (m *MessageExtractor) SetBlockValidator(_ *staker.BlockValidator) {
537+
log.Info("MEL does not support block validation registration; SetBlockValidator is a no-op")
538+
}
539+
522540
func (m *MessageExtractor) GetBatchCount() (uint64, error) {
523541
headState, err := m.melDB.GetHeadMelState()
524542
if err != nil {
@@ -527,6 +545,14 @@ func (m *MessageExtractor) GetBatchCount() (uint64, error) {
527545
return headState.BatchCount, nil
528546
}
529547

548+
func (m *MessageExtractor) GetBatchAcc(seqNum uint64) (common.Hash, error) {
549+
metadata, err := m.GetBatchMetadata(seqNum)
550+
if err != nil {
551+
return common.Hash{}, err
552+
}
553+
return metadata.Accumulator, nil
554+
}
555+
530556
func (m *MessageExtractor) CaughtUp() chan struct{} {
531557
return m.caughtUpChan
532558
}
@@ -549,13 +575,15 @@ func (m *MessageExtractor) Act(ctx context.Context) (time.Duration, error) {
549575
// from the parent chain block. The FSM will transition to the `SavingMessages`
550576
// state after successfully extracting messages.
551577
case ProcessingNextBlock:
578+
fsmBlocksProcessedCounter.Inc(1)
552579
return m.processNextBlock(ctx, current)
553580
// `SavingMessages` is the state responsible for saving the extracted messages
554581
// and delayed messages to the database. It stores data in the node's consensus database
555582
// and runs after the `ProcessingNextBlock` state.
556583
// After data is stored, the FSM will then transition to the `ProcessingNextBlock` state
557584
// yet again.
558585
case SavingMessages:
586+
fsmSaveMessagesCounter.Inc(1)
559587
return m.saveMessages(ctx, current)
560588
// `Reorging` is the state responsible for handling reorgs in the parent chain.
561589
// It is triggered when a reorg occurs, and it will revert the MEL state being processed to the

arbnode/mel/runner/metrics.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package melrunner
2+
3+
import "github.com/ethereum/go-ethereum/metrics"
4+
5+
var (
6+
// FSM health.
7+
stuckFSMIndicatingGauge = metrics.NewRegisteredGauge("arb/mel/stuck", nil) // 1-stuck, 0-not_stuck
8+
fsmBlocksProcessedCounter = metrics.NewRegisteredCounter("arb/mel/fsm/process_block_total", nil)
9+
fsmSaveMessagesCounter = metrics.NewRegisteredCounter("arb/mel/fsm/save_messages_total", nil)
10+
11+
// State progress.
12+
latestBlockGauge = metrics.NewRegisteredGauge("arb/mel/latest/parent_chain_block_number", nil)
13+
latestMsgCountGauge = metrics.NewRegisteredGauge("arb/mel/latest/msg_count", nil)
14+
latestDelayedSeenCountGauge = metrics.NewRegisteredGauge("arb/mel/latest/delayed_msg_seen_count", nil)
15+
latestDelayedReadCountGauge = metrics.NewRegisteredGauge("arb/mel/latest/delayed_msg_read_count", nil)
16+
17+
// Throughput.
18+
msgsExtractedCounter = metrics.NewRegisteredCounter("arb/mel/msgs/extracted_total", nil)
19+
msgsPushedCounter = metrics.NewRegisteredCounter("arb/mel/msgs/pushed_to_execution_total", nil)
20+
21+
// Errors.
22+
extractionErrors = metrics.NewRegisteredCounter("arb/mel/errors/extraction_function_errors_total", nil)
23+
24+
// Reorgs
25+
reorgCounter = metrics.NewRegisteredCounter("arb/mel/reorgs_total", nil)
26+
27+
// Performance.
28+
blockProcessTimeGauge = metrics.NewRegisteredGauge("arb/mel/block_processing_time_micros", nil)
29+
30+
// MEL state size bytes.
31+
melStateSizeBytesGauge = metrics.NewRegisteredGauge("arb/mel/mel_state_size_bytes", nil)
32+
)

arbnode/mel/runner/process_next_block.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/ethereum/go-ethereum/rpc"
1616

1717
"github.com/offchainlabs/nitro/arbnode/mel"
18-
"github.com/offchainlabs/nitro/arbnode/mel/extraction"
18+
melextraction "github.com/offchainlabs/nitro/arbnode/mel/extraction"
1919
"github.com/offchainlabs/nitro/bold/containers/fsm"
2020
)
2121

@@ -81,6 +81,7 @@ func (m *MessageExtractor) processNextBlock(ctx context.Context, current *fsm.Cu
8181
if err = m.logsAndHeadersPreFetcher.fetch(ctx, preState); err != nil {
8282
return m.config.RetryInterval, err
8383
}
84+
start := time.Now()
8485
postState, msgs, delayedMsgs, batchMetas, err := melextraction.ExtractMessages(
8586
ctx,
8687
preState,
@@ -92,6 +93,7 @@ func (m *MessageExtractor) processNextBlock(ctx context.Context, current *fsm.Cu
9293
m.chainConfig,
9394
)
9495
if err != nil {
96+
extractionErrors.Inc(1)
9597
if errors.Is(err, mel.ErrDelayedMessagePreimageNotFound) {
9698
if err := preState.RebuildDelayedMsgPreimages(m.melDB.FetchDelayedMessage); err != nil {
9799
return m.config.RetryInterval, fmt.Errorf("error rebuilding delayed msg preimages when missing some preimages: %w", err)
@@ -100,6 +102,25 @@ func (m *MessageExtractor) processNextBlock(ctx context.Context, current *fsm.Cu
100102
}
101103
return m.config.RetryInterval, err
102104
}
105+
elapsed := time.Since(start)
106+
// After processing every 100 parent chain blocks, print a status log
107+
if postState.ParentChainBlockNumber%m.config.LogExtractionStatusFrequencyBlocks == 0 {
108+
log.Info("Message extraction successful", "parentChainBlockNumber", postState.ParentChainBlockNumber, "msgCount", postState.MsgCount)
109+
}
110+
111+
// Update metrics.
112+
//#nosec G115
113+
latestBlockGauge.Update(int64(postState.ParentChainBlockNumber))
114+
//#nosec G115
115+
latestMsgCountGauge.Update(int64(postState.MsgCount))
116+
//#nosec G115
117+
latestDelayedSeenCountGauge.Update(int64(postState.DelayedMessagesSeen))
118+
//#nosec G115
119+
latestDelayedReadCountGauge.Update(int64(postState.DelayedMessagesRead))
120+
//#nosec G115
121+
msgsExtractedCounter.Inc(int64(len(msgs)))
122+
blockProcessTimeGauge.Update(elapsed.Microseconds())
123+
103124
// Begin the next FSM state immediately.
104125
return 0, m.fsm.Do(saveMessages{
105126
preStateMsgCount: preState.MsgCount,

arbnode/mel/runner/reorg.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ func (m *MessageExtractor) reorg(ctx context.Context, current *fsm.CurrentState[
2525
return m.config.RetryInterval, err
2626
}
2727
m.logsAndHeadersPreFetcher.reset()
28+
29+
// Update metrics.
30+
reorgCounter.Inc(1)
2831
return 0, m.fsm.Do(processNextBlock{
2932
prevStepWasReorg: true,
3033
melState: previousState,

arbnode/mel/runner/save_messages.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func (m *MessageExtractor) saveMessages(ctx context.Context, current *fsm.Curren
3131
log.Error("Error saving latest state as head state to db", "err", err)
3232
return m.config.RetryInterval, err
3333
}
34+
msgsPushedCounter.Inc(int64(len(saveAction.messages)))
3435
return 0, m.fsm.Do(processNextBlock{
3536
melState: saveAction.postState,
3637
})

arbnode/node.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,7 @@ func getInboxTrackerAndReader(
756756
sequencerInbox *SequencerInbox,
757757
) (*InboxTracker, *InboxReader, error) {
758758
if config.MessageExtraction.Enable {
759+
log.Info("Inbox reader and tracker disabled")
759760
return nil, nil, nil
760761
}
761762
inboxTracker, err := NewInboxTracker(consensusDB, txStreamer, dapReaders)
@@ -863,6 +864,7 @@ func getMessageExtractor(
863864
if err != nil {
864865
return nil, err
865866
}
867+
log.Info("Message extractor enabled")
866868
return msgExtractor, nil
867869
}
868870

@@ -939,6 +941,7 @@ func getStaker(
939941
statelessBlockValidator *staker.StatelessBlockValidator,
940942
blockValidator *staker.BlockValidator,
941943
dapRegistry *daprovider.DAProviderRegistry,
944+
messageExtractor *melrunner.MessageExtractor,
942945
) (*multiprotocolstaker.MultiProtocolStaker, *MessagePruner, common.Address, error) {
943946
var stakerObj *multiprotocolstaker.MultiProtocolStaker
944947
var messagePruner *MessagePruner
@@ -990,11 +993,26 @@ func getStaker(
990993

991994
var confirmedNotifiers []legacystaker.LatestConfirmedNotifier
992995
if config.MessagePruner.Enable {
996+
if inboxTracker == nil {
997+
return nil, nil, common.Address{}, errors.New("message pruning cannot be enabled when inbox tracker is disabled (e.g. with Message Extraction enabled)")
998+
}
993999
messagePruner = NewMessagePruner(txStreamer, inboxTracker, func() *MessagePrunerConfig { return &configFetcher.Get().MessagePruner })
9941000
confirmedNotifiers = append(confirmedNotifiers, messagePruner)
9951001
}
9961002

997-
stakerObj, err = multiprotocolstaker.NewMultiProtocolStaker(stack, l1Reader, wallet, bind.CallOpts{}, func() *legacystaker.L1ValidatorConfig { return &configFetcher.Get().Staker }, &configFetcher.Get().Bold, blockValidator, statelessBlockValidator, nil, deployInfo.StakeToken, deployInfo.Rollup, confirmedNotifiers, deployInfo.ValidatorUtils, deployInfo.Bridge, txStreamer, inboxTracker, inboxReader, dapRegistry, fatalErrChan)
1003+
var tracker staker.InboxTrackerInterface
1004+
var reader staker.InboxReaderInterface
1005+
if messageExtractor != nil {
1006+
tracker = messageExtractor
1007+
reader = messageExtractor
1008+
} else {
1009+
tracker = inboxTracker
1010+
reader = inboxReader
1011+
}
1012+
if tracker == nil || reader == nil {
1013+
return nil, nil, common.Address{}, errors.New("staker requires either message extractor or inbox tracker/reader")
1014+
}
1015+
stakerObj, err = multiprotocolstaker.NewMultiProtocolStaker(stack, l1Reader, wallet, bind.CallOpts{}, func() *legacystaker.L1ValidatorConfig { return &configFetcher.Get().Staker }, &configFetcher.Get().Bold, blockValidator, statelessBlockValidator, nil, deployInfo.StakeToken, deployInfo.Rollup, confirmedNotifiers, deployInfo.ValidatorUtils, deployInfo.Bridge, txStreamer, tracker, reader, dapRegistry, fatalErrChan)
9981016
if err != nil {
9991017
return nil, nil, common.Address{}, err
10001018
}
@@ -1363,7 +1381,7 @@ func createNodeImpl(
13631381
return nil, err
13641382
}
13651383

1366-
stakerObj, messagePruner, stakerAddr, err := getStaker(ctx, config, configFetcher, consensusDB, l1Reader, txOptsValidator, syncMonitor, parentChain, l1client, deployInfo, txStreamer, inboxTracker, inboxReader, stack, fatalErrChan, statelessBlockValidator, blockValidator, dapRegistry)
1384+
stakerObj, messagePruner, stakerAddr, err := getStaker(ctx, config, configFetcher, consensusDB, l1Reader, txOptsValidator, syncMonitor, parentChain, l1client, deployInfo, txStreamer, inboxTracker, inboxReader, stack, fatalErrChan, statelessBlockValidator, blockValidator, dapRegistry, messageExtractor)
13671385
if err != nil {
13681386
return nil, err
13691387
}

0 commit comments

Comments
 (0)