Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
ea83cb8
Initial impl, fails some tests
edfelten May 7, 2022
a73e415
Fix bug
edfelten May 9, 2022
b47a907
Track collected funds in special account
edfelten May 9, 2022
d4ba840
Fix test
edfelten May 9, 2022
fd50e9b
Merge branch 'master' into automatic-l1-gas-pricing
edfelten May 11, 2022
84da1a3
Merge integration
edfelten May 16, 2022
cbd177d
Disable obsolete tests
edfelten May 16, 2022
ea25cdc
Add ArbitrumBatchPostingReportTx type
edfelten May 16, 2022
9884f3b
Update geth pin
edfelten May 16, 2022
8b5a02b
Merge branch 'master' into automatic-l1-gas-pricing
edfelten May 28, 2022
bcb6dab
Restore geth pin to geth master
edfelten May 28, 2022
d86a7e3
Add ArbitrumInternalTx type for batch posting report
edfelten May 28, 2022
c35f273
Add method to ArbosActs
edfelten May 28, 2022
7f375eb
Add explanatory comment
edfelten May 28, 2022
b11c5d2
Refactor Arbitrum internal tx
edfelten May 29, 2022
c9dbeb1
Update geth pin
edfelten May 29, 2022
3867415
Renaming
edfelten May 29, 2022
cde372b
Add data hash field to batch posting report tx
edfelten May 29, 2022
279a3cc
Set up batchFetcher in tx processor
edfelten May 30, 2022
dd20dba
Implement new batch fetching scheme for automatic L1 gas pricing
PlasmaPower May 31, 2022
7cb27c0
Rotate CI docker cache key
PlasmaPower May 31, 2022
4e00b40
touch up math
rachel-bousfield Jun 1, 2022
5fac5de
time deltas
rachel-bousfield Jun 1, 2022
86222fa
update CI cache key
rachel-bousfield Jun 1, 2022
6c21818
Merge pull request #650 from OffchainLabs/auto-l1-gas-batch-reading
edfelten Jun 1, 2022
5c3ae7b
Merge pull request #651 from OffchainLabs/automatic-l1-gas-pricing-ar…
edfelten Jun 2, 2022
01b594c
Remove unneeded version check
edfelten Jun 2, 2022
d0f071b
Address some code review comments
edfelten Jun 2, 2022
d9360b3
Merge branch 'master' into automatic-l1-gas-pricing
edfelten Jun 2, 2022
3a8bcd4
Merge branch 'master' into automatic-l1-gas-pricing
edfelten Jun 3, 2022
3042af3
Fix bug
edfelten Jun 3, 2022
81e86cf
Refactor and rename
edfelten Jun 4, 2022
655c0c1
Use AddressSet in BatchPosterTable
edfelten Jun 4, 2022
ffde9e8
Add ArbOwner methods to control params
edfelten Jun 4, 2022
aab358f
Merge branch 'master' into automatic-l1-gas-pricing
edfelten Jun 4, 2022
b20b70f
Merge branch 'devnet-reinit-1' into automatic-l1-gas-pricing
edfelten Jun 4, 2022
62f40ab
Add test and fix bugs
edfelten Jun 4, 2022
af563be
Send report message from L1
edfelten Jun 4, 2022
7b45d03
Update submodule pin
edfelten Jun 6, 2022
eb0aacb
Debugging WIP
edfelten Jun 6, 2022
a0dc784
Don't post a batch if the only contents are a batch posting report
PlasmaPower Jun 9, 2022
97d67e3
Fix batch posting receipt preimage resolution when preimages disabled
PlasmaPower Jun 9, 2022
79b672d
Wait for only the last useful block in block validator test
PlasmaPower Jun 9, 2022
0975aef
use 4 byte method selectors instead of internaltx subtypes
rachel-bousfield Jun 9, 2022
0de60c1
misc math tweak
rachel-bousfield Jun 9, 2022
48b70be
Restore erroneously commented-out code
edfelten Jun 9, 2022
9e485bd
update geth pin
rachel-bousfield Jun 10, 2022
c1866db
address review comments
rachel-bousfield Jun 10, 2022
edd1c1d
Merge pull request #681 from OffchainLabs/remove-internaltx-subtype
edfelten Jun 10, 2022
8f90620
Merge pull request #680 from OffchainLabs/dont-post-forever
rachel-bousfield Jun 10, 2022
ffb27e7
fix tests
rachel-bousfield Jun 10, 2022
36cfb20
Improve test and fix bug
edfelten Jun 13, 2022
93a29e1
end-to-end test & TestSequencerFeePaid + fix
rachel-bousfield Jun 13, 2022
ebbd284
automatically add posters & fix SetPricePerUnit bug
rachel-bousfield Jun 13, 2022
874ec66
Correct regression in this branch
edfelten Jun 14, 2022
d1f9d12
Debugging and fixes WIP
edfelten Jun 14, 2022
cbb31c0
Merge pull request #690 from OffchainLabs/l1-gas-pricing-e2e-test
edfelten Jun 15, 2022
b53c73e
Merge branch 'redo-devnet-reinit-1' into automatic-l1-gas-pricing
edfelten Jun 15, 2022
0a1905a
Merge integration
edfelten Jun 15, 2022
5743c5d
Fix test
edfelten Jun 15, 2022
c81e911
Use coinbase to determine reimbursability
edfelten Jun 16, 2022
51a2d8d
Remove spurious _reportBatchSpending
edfelten Jun 16, 2022
0ab910c
Refactor
edfelten Jun 16, 2022
8032aed
Merge branch 'redo-devnet-reinit-1' into automatic-l1-gas-pricing
PlasmaPower Jun 17, 2022
db44509
Fix merge
PlasmaPower Jun 17, 2022
d76dd08
Remove unused DropTip method (was used before merge)
PlasmaPower Jun 17, 2022
067558b
Merge branch 'redo-devnet-reinit-1' into automatic-l1-gas-pricing
PlasmaPower Jun 17, 2022
291bcbd
Fix sequencer inbox force include test
PlasmaPower Jun 17, 2022
1e6f138
Commit for merge
edfelten Jun 17, 2022
1c3883b
Merge branch 'automatic-l1-gas-pricing' of github.com:OffchainLabs/ni…
edfelten Jun 17, 2022
502b79c
update geth pin
edfelten Jun 17, 2022
6332df5
Don't create poster based on untrusted call
edfelten Jun 17, 2022
82a1de9
Fixes from code review
edfelten Jun 17, 2022
1381b76
Merge branch 'redo-devnet-reinit-1' into automatic-l1-gas-pricing
edfelten Jun 17, 2022
209ee9b
Backport sequencer inbox reader test flakiness fix
PlasmaPower Jun 16, 2022
1cb2b9e
Charge L1 gas for eth_calls
PlasmaPower Jun 17, 2022
d54f53e
Fix one step proof tests with inbox changes
PlasmaPower Jun 17, 2022
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
36 changes: 8 additions & 28 deletions arbnode/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ type PricingModelHistory struct {
GasBacklog []uint64 `json:"gasBacklog"`
GasUsed []uint64 `json:"gasUsed"`
L1BaseFeeEstimate []*big.Int `json:"l1BaseFeeEstimate"`
L1BaseFeeUpdateTime []uint64 `json:"l1BaseFeeUpdateTime"`
MinBaseFee *big.Int `json:"minBaseFee"`
SpeedLimit uint64 `json:"speedLimit"`
MaxPerBlockGasLimit uint64 `json:"maxPerBlockGasLimit"`
Expand All @@ -82,26 +81,12 @@ func (api *ArbDebugAPI) PricingModel(ctx context.Context, start, end rpc.BlockNu
}

history := PricingModelHistory{
First: uint64(start),
Timestamp: make([]uint64, blocks),
BaseFee: make([]*big.Int, blocks),
GasBacklog: make([]uint64, blocks),
GasUsed: make([]uint64, blocks),
L1BaseFeeEstimate: make([]*big.Int, blocks),
L1BaseFeeUpdateTime: make([]uint64, blocks+1),
}

genesisBlock := api.blockchain.Config().ArbitrumChainParams.GenesisBlockNum
if start > rpc.BlockNumber(genesisBlock) {
state, _, err := stateAndHeader(api.blockchain, uint64(start)-1)
if err != nil {
return history, err
}
l1BaseFeeUpdateTime, err := state.L1PricingState().LastL1BaseFeeUpdateTime()
if err != nil {
return history, err
}
history.L1BaseFeeUpdateTime[0] = l1BaseFeeUpdateTime
First: uint64(start),
Timestamp: make([]uint64, blocks),
BaseFee: make([]*big.Int, blocks),
GasBacklog: make([]uint64, blocks),
GasUsed: make([]uint64, blocks),
L1BaseFeeEstimate: make([]*big.Int, blocks),
}

for i := uint64(0); i < uint64(blocks); i++ {
Expand All @@ -116,21 +101,16 @@ func (api *ArbDebugAPI) PricingModel(ctx context.Context, start, end rpc.BlockNu
history.BaseFee[i] = header.BaseFee

gasBacklog, _ := l2Pricing.GasBacklog()
l1BaseFeeEstimate, _ := l1Pricing.L1BaseFeeEstimateWei()
l1BaseFeeUpdateTime, err := l1Pricing.LastL1BaseFeeUpdateTime()
if err != nil {
return history, err
}
l1BaseFeeEstimate, _ := l1Pricing.PricePerUnit()

history.GasBacklog[i] = gasBacklog
history.GasUsed[i] = header.GasUsed
history.L1BaseFeeEstimate[i] = l1BaseFeeEstimate
history.L1BaseFeeUpdateTime[i+1] = l1BaseFeeUpdateTime

if i == uint64(blocks)-1 {
speedLimit, _ := l2Pricing.SpeedLimitPerSecond()
maxPerBlockGasLimit, _ := l2Pricing.PerBlockGasLimit()
l1BaseFeeEstimateInertia, err := l1Pricing.L1BaseFeeEstimateInertia()
l1BaseFeeEstimateInertia, err := l1Pricing.Inertia()
minBaseFee, _ := l2Pricing.MinBaseFeeWei()
pricingInertia, _ := l2Pricing.PricingInertia()
backlogTolerance, _ := l2Pricing.BacklogTolerance()
Expand Down
14 changes: 12 additions & 2 deletions arbnode/batch_poster.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"math/big"
"time"

"github.com/offchainlabs/nitro/arbos"
"github.com/offchainlabs/nitro/util/headerreader"

"github.com/andybalholm/brotli"
Expand Down Expand Up @@ -353,30 +354,39 @@ func (b *BatchPoster) maybePostSequencerBatch(ctx context.Context, batchSeqNum u
if err != nil {
return nil, err
}

forcePostBatch := timeSinceNextMessage >= b.config.MaxBatchPostInterval
haveUsefulMessage := false

for b.building.msgCount < msgCount {
msg, err := b.streamer.GetMessage(b.building.msgCount)
if err != nil {
log.Error("error getting message from streamer", "error", err)
break
}
if msg.Message.Header.Kind != arbos.L1MessageType_BatchPostingReport {
haveUsefulMessage = true
}
success, err := b.building.segments.AddMessage(&msg)
if err != nil {
log.Error("error adding message to batch", "error", err)
break
}
if !success {
forcePostBatch = true // this batch is full
// this batch is full
forcePostBatch = true
haveUsefulMessage = true
break
}
b.building.msgCount++
}

if b.building.segments.IsEmpty() {
// we don't need to post a batch for the time being
b.pendingMsgTimestamp = time.Now()
return nil, nil
}
if !forcePostBatch {
if !forcePostBatch || !haveUsefulMessage {
// the batch isn't full yet and we've posted a batch recently
// don't post anything for now
return nil, nil
Expand Down
1 change: 1 addition & 0 deletions arbnode/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,7 @@ func createNodeImpl(
if err != nil {
return nil, err
}
txStreamer.SetInboxReader(inboxReader)

nitroMachineConfig := validator.DefaultNitroMachineConfig
if config.Wasm.RootPath != "" {
Expand Down
9 changes: 1 addition & 8 deletions arbnode/sequencer.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,6 @@ func (s *Sequencer) PublishTransaction(ctx context.Context, tx *types.Transactio
}

func (s *Sequencer) preTxFilter(state *arbosState.ArbosState, tx *types.Transaction, sender common.Address) error {
agg, err := state.L1PricingState().ReimbursableAggregatorForSender(sender)
if err != nil {
return err
}
if agg == nil || *agg != l1pricing.SequencerAddress {
return errors.New("transaction sender's preferred aggregator is not the sequencer")
}
return nil
}

Expand Down Expand Up @@ -217,7 +210,7 @@ func (s *Sequencer) sequenceTransactions(ctx context.Context) {

header := &arbos.L1IncomingMessageHeader{
Kind: arbos.L1MessageType_L2Message,
Poster: l1pricing.SequencerAddress,
Poster: l1pricing.BatchPosterAddress,
BlockNumber: l1Block,
Timestamp: uint64(timestamp),
RequestId: nil,
Expand Down
21 changes: 20 additions & 1 deletion arbnode/transaction_streamer.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ type TransactionStreamer struct {
coordinator *SeqCoordinator
broadcastServer *broadcaster.Broadcaster
validator *validator.BlockValidator
inboxReader *InboxReader
}

func NewTransactionStreamer(db ethdb.Database, bc *core.BlockChain, broadcastServer *broadcaster.Broadcaster) (*TransactionStreamer, error) {
Expand Down Expand Up @@ -96,6 +97,16 @@ func (s *TransactionStreamer) SetSeqCoordinator(coordinator *SeqCoordinator) {
s.coordinator = coordinator
}

func (s *TransactionStreamer) SetInboxReader(inboxReader *InboxReader) {
if s.Started() {
panic("trying to set inbox reader after start")
}
if s.inboxReader != nil {
panic("trying to set inbox reader when already set")
}
s.inboxReader = inboxReader
}

func (s *TransactionStreamer) cleanupInconsistentState() error {
// If it doesn't exist yet, set the message count to 0
hasMessageCount, err := s.db.Has(messageCountKey)
Expand Down Expand Up @@ -695,6 +706,10 @@ func (s *TransactionStreamer) createBlocks(ctx context.Context) error {
}
}()

batchFetcher := func(batchNum uint64) ([]byte, error) {
return s.inboxReader.GetSequencerMessageBytes(ctx, batchNum)
}

for pos < msgCount {

statedb, err = s.bc.StateAt(lastBlockHeader.Root)
Expand All @@ -719,14 +734,18 @@ func (s *TransactionStreamer) createBlocks(ctx context.Context) error {
return err
}

block, receipts := arbos.ProduceBlock(
block, receipts, err := arbos.ProduceBlock(
msg.Message,
msg.DelayedMessagesRead,
lastBlockHeader,
statedb,
s.bc,
s.bc.Config(),
batchFetcher,
)
if err != nil {
return err
}

// ProduceBlock advances one message
pos++
Expand Down
19 changes: 12 additions & 7 deletions arbos/addressSet/addressSet.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ func (aset *AddressSet) GetAnyMember() (*common.Address, error) {
if err != nil || size == 0 {
return nil, err
}
addrAsHash, err := aset.backingStorage.GetByUint64(1)
addr := common.BytesToAddress(addrAsHash.Bytes())
return &addr, err
sba := aset.backingStorage.OpenStorageBackedAddressOrNil(1)
addr, err := sba.Get()
return addr, err
}

func (aset *AddressSet) Clear() error {
Expand All @@ -65,18 +65,21 @@ func (aset *AddressSet) Clear() error {
return aset.size.Clear()
}

func (aset *AddressSet) AllMembers() ([]common.Address, error) {
func (aset *AddressSet) AllMembers(maxNumToReturn uint64) ([]common.Address, error) {
size, err := aset.size.Get()
if err != nil {
return nil, err
}
if size > maxNumToReturn {
size = maxNumToReturn
}
ret := make([]common.Address, size)
for i := range ret {
bytes, err := aset.backingStorage.GetByUint64(uint64(i + 1))
sba := aset.backingStorage.OpenStorageBackedAddress(uint64(i + 1))
ret[i], err = sba.Get()
if err != nil {
return nil, err
}
ret[i] = common.BytesToAddress(bytes.Bytes())
}
return ret, nil
}
Expand All @@ -90,13 +93,15 @@ func (aset *AddressSet) Add(addr common.Address) error {
if err != nil {
return err
}
sba := aset.backingStorage.OpenStorageBackedAddress(1 + size)
slot := util.UintToHash(1 + size)
addrAsHash := common.BytesToHash(addr.Bytes())
err = aset.byAddress.Set(addrAsHash, slot)
if err != nil {
return err
}
err = aset.backingStorage.Set(slot, addrAsHash)
sba = aset.backingStorage.OpenStorageBackedAddress(1 + size)
err = sba.Set(addr)
if err != nil {
return err
}
Expand Down
3 changes: 2 additions & 1 deletion arbos/addressSet/addressSet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package addressSet

import (
"github.com/ethereum/go-ethereum/common/math"
"testing"

"github.com/ethereum/go-ethereum/common"
Expand Down Expand Up @@ -92,7 +93,7 @@ func TestAddressSet(t *testing.T) {
}

Require(t, aset.Add(addr1))
all, err := aset.AllMembers()
all, err := aset.AllMembers(math.MaxUint64)
Require(t, err)
if len(all) != 2 {
Fail(t)
Expand Down
16 changes: 7 additions & 9 deletions arbos/arbosState/initialization_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ func checkRetryables(arbState *ArbosState, expected []statetransfer.Initializati

func checkAccounts(db *state.StateDB, arbState *ArbosState, accts []statetransfer.AccountInitializationInfo, t *testing.T) {
l1p := arbState.L1PricingState()
posterTable := l1p.BatchPosterTable()
for _, acct := range accts {
addr := acct.Addr
if db.GetNonce(addr) != acct.Nonce {
Expand All @@ -168,20 +169,17 @@ func checkAccounts(db *state.StateDB, arbState *ArbosState, accts []statetransfe
t.Fatal(err)
}
}
if acct.AggregatorInfo != nil {
fc, err := l1p.AggregatorFeeCollector(addr)
isPoster, err := posterTable.ContainsPoster(addr)
Require(t, err)
if acct.AggregatorInfo != nil && isPoster {
posterInfo, err := posterTable.OpenPoster(addr, false)
Require(t, err)
fc, err := posterInfo.PayTo()
Require(t, err)
if fc != acct.AggregatorInfo.FeeCollector {
t.Fatal()
}
}
if acct.AggregatorToPay != nil {
aggregator, err := l1p.ReimbursableAggregatorForSender(addr)
Require(t, err)
if aggregator == nil || *aggregator != *acct.AggregatorToPay {
Fail(t)
}
}
}
_ = l1p
}
18 changes: 12 additions & 6 deletions arbos/arbosState/initialize.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,16 +154,22 @@ func initializeRetryables(rs *retryables.RetryableState, initData statetransfer.

func initializeArbosAccount(statedb *state.StateDB, arbosState *ArbosState, account statetransfer.AccountInitializationInfo) error {
l1pState := arbosState.L1PricingState()
posterTable := l1pState.BatchPosterTable()
if account.AggregatorInfo != nil {
err := l1pState.SetAggregatorFeeCollector(account.Addr, account.AggregatorInfo.FeeCollector)
isPoster, err := posterTable.ContainsPoster(account.Addr)
if err != nil {
return err
}
}
if account.AggregatorToPay != nil {
err := l1pState.SetUserSpecifiedAggregator(account.Addr, account.AggregatorToPay)
if err != nil {
return err
if isPoster {
// poster is already authorized, just set its fee collector
poster, err := posterTable.OpenPoster(account.Addr, false)
if err != nil {
return err
}
err = poster.SetPayTo(account.AggregatorInfo.FeeCollector)
if err != nil {
return err
}
}
}

Expand Down
Loading