Skip to content

Commit 1cc4fd9

Browse files
authored
Merge pull request OffchainLabs#3280 from OffchainLabs/raul/mef-batch-lookup-func
[MEL] - Implement a Pure, Batch Lookup Function Using Only a Parent Chain Block
2 parents a4b72ab + 19c5672 commit 1cc4fd9

File tree

6 files changed

+647
-52
lines changed

6 files changed

+647
-52
lines changed

arbnode/delayed_seq_reorg_test.go

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ func TestSequencerReorgFromDelayed(t *testing.T) {
7878
AfterDelayedAcc: initMsgDelayed.AfterInboxAcc(),
7979
AfterDelayedCount: 1,
8080
TimeBounds: bridgegen.IBridgeTimeBounds{},
81-
rawLog: types.Log{},
82-
dataLocation: 0,
83-
bridgeAddress: [20]byte{},
81+
RawLog: types.Log{},
82+
DataLocation: 0,
83+
BridgeAddress: [20]byte{},
8484
serialized: serializedInitMsgBatch,
8585
}
8686
serializedUserMsgBatch := make([]byte, 40)
@@ -94,9 +94,9 @@ func TestSequencerReorgFromDelayed(t *testing.T) {
9494
AfterDelayedAcc: userDelayed2.AfterInboxAcc(),
9595
AfterDelayedCount: 3,
9696
TimeBounds: bridgegen.IBridgeTimeBounds{},
97-
rawLog: types.Log{},
98-
dataLocation: 0,
99-
bridgeAddress: [20]byte{},
97+
RawLog: types.Log{},
98+
DataLocation: 0,
99+
BridgeAddress: [20]byte{},
100100
serialized: serializedUserMsgBatch,
101101
}
102102
emptyBatch := &SequencerInboxBatch{
@@ -108,9 +108,9 @@ func TestSequencerReorgFromDelayed(t *testing.T) {
108108
AfterDelayedAcc: userDelayed2.AfterInboxAcc(),
109109
AfterDelayedCount: 3,
110110
TimeBounds: bridgegen.IBridgeTimeBounds{},
111-
rawLog: types.Log{},
112-
dataLocation: 0,
113-
bridgeAddress: [20]byte{},
111+
RawLog: types.Log{},
112+
DataLocation: 0,
113+
BridgeAddress: [20]byte{},
114114
serialized: serializedUserMsgBatch,
115115
}
116116
err = tracker.AddSequencerBatches(ctx, nil, []*SequencerInboxBatch{initMsgBatch, userMsgBatch, emptyBatch})
@@ -194,9 +194,9 @@ func TestSequencerReorgFromDelayed(t *testing.T) {
194194
AfterDelayedAcc: initMsgDelayed.AfterInboxAcc(),
195195
AfterDelayedCount: 1,
196196
TimeBounds: bridgegen.IBridgeTimeBounds{},
197-
rawLog: types.Log{},
198-
dataLocation: 0,
199-
bridgeAddress: [20]byte{},
197+
RawLog: types.Log{},
198+
DataLocation: 0,
199+
BridgeAddress: [20]byte{},
200200
serialized: serializedInitMsgBatch,
201201
}
202202
err = tracker.AddSequencerBatches(ctx, nil, []*SequencerInboxBatch{emptyBatch})
@@ -278,9 +278,9 @@ func TestSequencerReorgFromLastDelayedMsg(t *testing.T) {
278278
AfterDelayedAcc: initMsgDelayed.AfterInboxAcc(),
279279
AfterDelayedCount: 1,
280280
TimeBounds: bridgegen.IBridgeTimeBounds{},
281-
rawLog: types.Log{},
282-
dataLocation: 0,
283-
bridgeAddress: [20]byte{},
281+
RawLog: types.Log{},
282+
DataLocation: 0,
283+
BridgeAddress: [20]byte{},
284284
serialized: serializedInitMsgBatch,
285285
}
286286
serializedUserMsgBatch := make([]byte, 40)
@@ -294,9 +294,9 @@ func TestSequencerReorgFromLastDelayedMsg(t *testing.T) {
294294
AfterDelayedAcc: userDelayed2.AfterInboxAcc(),
295295
AfterDelayedCount: 3,
296296
TimeBounds: bridgegen.IBridgeTimeBounds{},
297-
rawLog: types.Log{},
298-
dataLocation: 0,
299-
bridgeAddress: [20]byte{},
297+
RawLog: types.Log{},
298+
DataLocation: 0,
299+
BridgeAddress: [20]byte{},
300300
serialized: serializedUserMsgBatch,
301301
}
302302
emptyBatch := &SequencerInboxBatch{
@@ -308,9 +308,9 @@ func TestSequencerReorgFromLastDelayedMsg(t *testing.T) {
308308
AfterDelayedAcc: userDelayed2.AfterInboxAcc(),
309309
AfterDelayedCount: 3,
310310
TimeBounds: bridgegen.IBridgeTimeBounds{},
311-
rawLog: types.Log{},
312-
dataLocation: 0,
313-
bridgeAddress: [20]byte{},
311+
RawLog: types.Log{},
312+
DataLocation: 0,
313+
BridgeAddress: [20]byte{},
314314
serialized: serializedUserMsgBatch,
315315
}
316316
err = tracker.AddSequencerBatches(ctx, nil, []*SequencerInboxBatch{initMsgBatch, userMsgBatch, emptyBatch})
@@ -423,9 +423,9 @@ func TestSequencerReorgFromLastDelayedMsg(t *testing.T) {
423423
AfterDelayedAcc: initMsgDelayed.AfterInboxAcc(),
424424
AfterDelayedCount: 1,
425425
TimeBounds: bridgegen.IBridgeTimeBounds{},
426-
rawLog: types.Log{},
427-
dataLocation: 0,
428-
bridgeAddress: [20]byte{},
426+
RawLog: types.Log{},
427+
DataLocation: 0,
428+
BridgeAddress: [20]byte{},
429429
serialized: serializedInitMsgBatch,
430430
}
431431
err = tracker.AddSequencerBatches(ctx, nil, []*SequencerInboxBatch{emptyBatch})

arbnode/message-extraction/extraction-function/abis.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ var inboxMessageDeliveredID common.Hash
1111
var inboxMessageFromOriginID common.Hash
1212
var iBridgeABI *abi.ABI
1313
var iInboxABI *abi.ABI
14+
var seqInboxABI *abi.ABI
1415
var iDelayedMessageProviderABI *abi.ABI
16+
var batchDeliveredID common.Hash
1517

1618
func init() {
1719
var err error
@@ -32,4 +34,13 @@ func init() {
3234
panic(err)
3335
}
3436
iInboxABI = parsedIInboxABI
37+
sequencerBridgeABI, err := bridgegen.SequencerInboxMetaData.GetAbi()
38+
if err != nil {
39+
panic(err)
40+
}
41+
batchDeliveredID = sequencerBridgeABI.Events["SequencerBatchDelivered"].ID
42+
seqInboxABI, err = bridgegen.SequencerInboxMetaData.GetAbi()
43+
if err != nil {
44+
panic(err)
45+
}
3546
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package extractionfunction
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
8+
"github.com/ethereum/go-ethereum/accounts/abi"
9+
"github.com/ethereum/go-ethereum/core/types"
10+
11+
"github.com/offchainlabs/nitro/arbnode"
12+
meltypes "github.com/offchainlabs/nitro/arbnode/message-extraction/types"
13+
"github.com/offchainlabs/nitro/solgen/go/bridgegen"
14+
)
15+
16+
type eventUnpacker interface {
17+
unpackLogTo(event any, abi *abi.ABI, eventName string, log types.Log) error
18+
}
19+
20+
func parseBatchesFromBlock(
21+
ctx context.Context,
22+
melState *meltypes.State,
23+
parentChainBlock *types.Block,
24+
receiptFetcher ReceiptFetcher,
25+
eventUnpacker eventUnpacker,
26+
) ([]*arbnode.SequencerInboxBatch, []*types.Transaction, []uint, error) {
27+
allBatches := make([]*arbnode.SequencerInboxBatch, 0)
28+
allBatchTxs := make([]*types.Transaction, 0)
29+
allBatchTxIndices := make([]uint, 0)
30+
for i, tx := range parentChainBlock.Transactions() {
31+
if tx.To() == nil {
32+
continue
33+
}
34+
if *tx.To() != melState.BatchPostingTargetAddress {
35+
continue
36+
}
37+
// Fetch the receipts for the transaction to get the logs.
38+
txIndex := uint(i) // #nosec G115
39+
receipt, err := receiptFetcher.ReceiptForTransactionIndex(ctx, txIndex)
40+
if err != nil {
41+
return nil, nil, nil, err
42+
}
43+
if len(receipt.Logs) == 0 {
44+
continue
45+
}
46+
batches := make([]*arbnode.SequencerInboxBatch, 0, len(receipt.Logs))
47+
txs := make([]*types.Transaction, 0, len(receipt.Logs))
48+
txIndices := make([]uint, 0, len(receipt.Logs))
49+
var lastSeqNum *uint64
50+
for _, log := range receipt.Logs {
51+
if log == nil || log.Topics[0] != batchDeliveredID {
52+
continue
53+
}
54+
event := new(bridgegen.SequencerInboxSequencerBatchDelivered)
55+
if err := eventUnpacker.unpackLogTo(event, seqInboxABI, "SequencerBatchDelivered", *log); err != nil {
56+
return nil, nil, nil, err
57+
}
58+
if !event.BatchSequenceNumber.IsUint64() {
59+
return nil, nil, nil, errors.New("sequencer inbox event has non-uint64 sequence number")
60+
}
61+
if !event.AfterDelayedMessagesRead.IsUint64() {
62+
return nil, nil, nil, errors.New("sequencer inbox event has non-uint64 delayed messages read")
63+
}
64+
65+
seqNum := event.BatchSequenceNumber.Uint64()
66+
if lastSeqNum != nil {
67+
if seqNum != *lastSeqNum+1 {
68+
return nil, nil, nil, fmt.Errorf("sequencer batches out of order; after batch %v got batch %v", *lastSeqNum, seqNum)
69+
}
70+
}
71+
lastSeqNum = &seqNum
72+
batch := &arbnode.SequencerInboxBatch{
73+
BlockHash: log.BlockHash,
74+
ParentChainBlockNumber: log.BlockNumber,
75+
SequenceNumber: seqNum,
76+
BeforeInboxAcc: event.BeforeAcc,
77+
AfterInboxAcc: event.AfterAcc,
78+
AfterDelayedAcc: event.DelayedAcc,
79+
AfterDelayedCount: event.AfterDelayedMessagesRead.Uint64(),
80+
RawLog: *log,
81+
TimeBounds: event.TimeBounds,
82+
DataLocation: arbnode.BatchDataLocation(event.DataLocation),
83+
BridgeAddress: log.Address,
84+
}
85+
batches = append(batches, batch)
86+
txs = append(txs, tx)
87+
txIndices = append(txIndices, uint(i)) // #nosec G115
88+
}
89+
allBatches = append(allBatches, batches...)
90+
allBatchTxs = append(allBatchTxs, txs...)
91+
allBatchTxIndices = append(allBatchTxIndices, txIndices...)
92+
}
93+
return allBatches, allBatchTxs, allBatchTxIndices, nil
94+
}

0 commit comments

Comments
 (0)