Skip to content

Commit c4252b9

Browse files
merge upstream
2 parents 955587d + 24028e6 commit c4252b9

File tree

11 files changed

+123
-127
lines changed

11 files changed

+123
-127
lines changed

arbnode/mel/extraction/message_extraction_function.go

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -151,16 +151,6 @@ func extractMessagesImpl(
151151
if delayed.Message.Header.Kind == arbostypes.L1MessageType_BatchPostingReport || delayed.Message.Header.Kind == arbostypes.L1MessageType_Initialize { // Let's consider the init message as a batch posting report, since it is seen as a batch as well, we can later ignore filling its batchGasCost anyway
152152
batchPostingReports = append(batchPostingReports, delayed)
153153
}
154-
if err = state.AccumulateDelayedMessage(delayed); err != nil {
155-
return nil, nil, nil, nil, err
156-
}
157-
state.DelayedMessagesSeen += 1
158-
}
159-
if len(delayedMessages) > 0 {
160-
// Only need to calculate partials once, after all the delayed messages are `seen`
161-
if err := state.GenerateDelayedMessagesSeenMerklePartialsAndRoot(); err != nil {
162-
return nil, nil, nil, nil, err
163-
}
164154
}
165155

166156
// Batch posting reports are included in the same transaction as a batch, so there should
@@ -175,6 +165,7 @@ func extractMessagesImpl(
175165

176166
var batchMetas []*mel.BatchMetadata
177167
var messages []*arbostypes.MessageWithMetadata
168+
var serializedBatches [][]byte
178169
for i, batch := range batches {
179170
batchTx := batchTxs[i]
180171
serialized, err := serialize(
@@ -209,7 +200,26 @@ func extractMessagesImpl(
209200
} else if !(inputState.DelayedMessagesSeen == 0 && i == 0 && delayedMessages[i] == batchPostReport) {
210201
return nil, nil, nil, nil, errors.New("encountered initialize message that is not the first delayed message and the first batch ")
211202
}
203+
serializedBatches = append(serializedBatches, serialized)
204+
}
205+
206+
// Update the delayed message accumulator in the MEL state.
207+
for _, delayed := range delayedMessages {
208+
if err = state.AccumulateDelayedMessage(delayed); err != nil {
209+
return nil, nil, nil, nil, err
210+
}
211+
state.DelayedMessagesSeen += 1
212+
}
213+
if len(delayedMessages) > 0 {
214+
// Only need to calculate partials once, after all the delayed messages are `seen`
215+
if err := state.GenerateDelayedMessagesSeenMerklePartialsAndRoot(); err != nil {
216+
return nil, nil, nil, nil, err
217+
}
218+
}
212219

220+
// Extract L2 messages from batches
221+
for i, batch := range batches {
222+
serialized := serializedBatches[i]
213223
rawSequencerMsg, err := parseSequencerMessage(
214224
ctx,
215225
batch.SequenceNumber,

arbnode/mel/messages.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,24 +59,13 @@ func (m *DelayedInboxMessage) AfterInboxAcc() common.Hash {
5959
}
6060

6161
func (m *DelayedInboxMessage) Hash() common.Hash {
62-
encoded, err := rlp.EncodeToBytes(m.WithMELRelevantFields())
62+
encoded, err := rlp.EncodeToBytes(m)
6363
if err != nil {
6464
panic(err)
6565
}
6666
return crypto.Keccak256Hash(encoded)
6767
}
6868

69-
func (m *DelayedInboxMessage) WithMELRelevantFields() *DelayedInboxMessage {
70-
return &DelayedInboxMessage{
71-
BlockHash: m.BlockHash,
72-
Message: &arbostypes.L1IncomingMessage{
73-
Header: m.Message.Header,
74-
L2msg: m.Message.L2msg,
75-
},
76-
ParentChainBlockNumber: m.ParentChainBlockNumber,
77-
}
78-
}
79-
8069
type BatchMetadata struct {
8170
Accumulator common.Hash
8271
MessageCount arbutil.MessageIndex

arbnode/mel/recording/delayed_msg_database.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (r *DelayedMsgDatabase) ReadDelayedMessage(ctx context.Context, state *mel.
6363
if err != nil {
6464
return nil, err
6565
}
66-
delayedMsgBytes, err := rlp.EncodeToBytes(delayed.WithMELRelevantFields())
66+
delayedMsgBytes, err := rlp.EncodeToBytes(delayed)
6767
if err != nil {
6868
return nil, err
6969
}

arbnode/mel/state.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ func (s *State) AccumulateMessage(msg *arbostypes.MessageWithMetadata) error {
168168
}
169169
}
170170
}
171-
msgBytes, err := rlp.EncodeToBytes(msg.WithMELRelevantFields())
171+
msgBytes, err := rlp.EncodeToBytes(msg)
172172
if err != nil {
173173
return err
174174
}

arbos/arbostypes/messagewithmeta.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,13 @@ type MessageWithMetadata struct {
1616
}
1717

1818
func (m *MessageWithMetadata) Hash() common.Hash {
19-
encoded, err := rlp.EncodeToBytes(m.WithMELRelevantFields())
19+
encoded, err := rlp.EncodeToBytes(m)
2020
if err != nil {
2121
panic(err)
2222
}
2323
return crypto.Keccak256Hash(encoded)
2424
}
2525

26-
func (m *MessageWithMetadata) WithMELRelevantFields() *MessageWithMetadata {
27-
return &MessageWithMetadata{
28-
Message: &L1IncomingMessage{
29-
Header: m.Message.Header,
30-
L2msg: m.Message.L2msg,
31-
},
32-
DelayedMessagesRead: m.DelayedMessagesRead,
33-
}
34-
}
35-
3626
// lint:require-exhaustive-initialization
3727
type MessageWithMetadataAndBlockInfo struct {
3828
MessageWithMeta MessageWithMetadata

staker/block_validation_entry_creator.go

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package staker
22

33
import (
44
"context"
5-
"fmt"
65

76
"github.com/ethereum/go-ethereum/common"
87
"github.com/ethereum/go-ethereum/log"
@@ -18,19 +17,16 @@ import (
1817
type MELEnabledValidationEntryCreator struct {
1918
melValidator MELValidatorInterface
2019
txStreamer TransactionStreamerInterface
21-
melRunner MELRunnerInterface
2220
}
2321

2422
// NewMELEnabledValidationEntryCreator creates a new instance of MELEnabledValidationEntryCreator.
2523
func NewMELEnabledValidationEntryCreator(
2624
melValidator MELValidatorInterface,
2725
txStreamer TransactionStreamerInterface,
28-
melRunner MELRunnerInterface,
2926
) *MELEnabledValidationEntryCreator {
3027
return &MELEnabledValidationEntryCreator{
3128
melValidator: melValidator,
3229
txStreamer: txStreamer,
33-
melRunner: melRunner,
3430
}
3531
}
3632

@@ -61,13 +57,6 @@ func (m *MELEnabledValidationEntryCreator) CreateBlockValidationEntry(
6157
if err != nil {
6258
return nil, created, err
6359
}
64-
melStateForMsg, err := m.melRunner.GetState(ctx, msg.Message.Header.BlockNumber)
65-
if err != nil {
66-
return nil, created, err
67-
}
68-
if melStateForMsg.MsgCount == 0 {
69-
return nil, created, fmt.Errorf("MEL state for msg at position %d has 0 msg count", position)
70-
}
7160
prevResult, err := m.txStreamer.ResultAtMessageIndex(arbutil.MessageIndex(position) - 1)
7261
if err != nil {
7362
return nil, created, err
@@ -80,38 +69,48 @@ func (m *MELEnabledValidationEntryCreator) CreateBlockValidationEntry(
8069
preimages := make(daprovider.PreimagesMap)
8170
preimages[arbutil.Keccak256PreimageType] = make(map[common.Hash][]byte)
8271

83-
// Add MEL state to the preimages map.
84-
encodedInitialState, err := rlp.EncodeToBytes(latestValidatedMELState)
72+
// Fetch and add the msg releated preimages.
73+
msgPreimagesAndRelevantState, err := m.melValidator.FetchMsgPreimagesAndRelevantState(ctx, position)
8574
if err != nil {
8675
return nil, created, err
8776
}
88-
preimages[arbutil.Keccak256PreimageType][latestValidatedMELState.Hash()] = encodedInitialState
77+
validator.CopyPreimagesInto(preimages, msgPreimagesAndRelevantState.msgPreimages)
8978

90-
// Fetch and add the msg releated preimages.
91-
msgPreimages, err := m.melValidator.FetchMsgPreimages(ctx, uint64(position), melStateForMsg.ParentChainBlockNumber)
79+
// Add relevant MEL state to the preimages map.
80+
relevantMELState := msgPreimagesAndRelevantState.relevantState
81+
encodedInitialState, err := rlp.EncodeToBytes(relevantMELState)
9282
if err != nil {
9383
return nil, created, err
9484
}
95-
validator.CopyPreimagesInto(preimages, msgPreimages)
85+
preimages[arbutil.Keccak256PreimageType][relevantMELState.Hash()] = encodedInitialState
86+
9687
startGs := validator.GoGlobalState{
9788
BlockHash: prevResult.BlockHash,
9889
SendRoot: prevResult.SendRoot,
99-
MELStateHash: latestValidatedMELState.Hash(),
90+
MELStateHash: relevantMELState.Hash(),
10091
MELMsgHash: msg.Hash(),
10192
PosInBatch: uint64(position),
10293
}
94+
endGsMELMsgHash := common.Hash{}
95+
if relevantMELState.MsgCount > uint64(position)+1 {
96+
nextMsg, err := m.txStreamer.GetMessage(position + 1)
97+
if err != nil {
98+
return nil, created, err
99+
}
100+
endGsMELMsgHash = nextMsg.Hash()
101+
}
103102
endGlobalState := validator.GoGlobalState{
104103
BlockHash: executionResult.BlockHash,
105104
SendRoot: executionResult.SendRoot,
106-
MELStateHash: latestValidatedMELState.Hash(),
107-
MELMsgHash: msg.Hash(),
105+
MELStateHash: relevantMELState.Hash(),
106+
MELMsgHash: endGsMELMsgHash,
108107
PosInBatch: uint64(position) + 1,
109108
}
110109
chainConfig := m.txStreamer.ChainConfig()
111110
created = true
112111
return &validationEntry{
113112
Stage: ReadyForRecord,
114-
Pos: arbutil.MessageIndex(position),
113+
Pos: position,
115114
Start: startGs,
116115
End: endGlobalState,
117116
msg: msg,

staker/block_validator.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,6 @@ func NewBlockValidator(
383383
validationEntryCreator := NewMELEnabledValidationEntryCreator(
384384
melValidator,
385385
streamer,
386-
melRunner,
387386
)
388387
ret.melEnabledEntryCreator = validationEntryCreator
389388
}
@@ -1124,12 +1123,7 @@ func (v *BlockValidator) iterativeValidationProgress(ctx context.Context, ignore
11241123
}
11251124
}
11261125
if v.config().EnableMEL {
1127-
msg, err := v.streamer.GetMessage(v.validated())
1128-
if err != nil {
1129-
log.Error("Couldn't clear msg preimages cache in MEL validator", "err", err)
1130-
} else {
1131-
v.melValidator.ClearValidatedMsgPreimages(msg.Message.Header.BlockNumber)
1132-
}
1126+
v.melValidator.ClearValidatedMsgPreimages(v.validated())
11331127
}
11341128
return v.config().ValidationPoll
11351129
}

0 commit comments

Comments
 (0)