Skip to content

Commit 04f1761

Browse files
authored
Merge branch 'master' into bold_staker_balance_metrics
2 parents 0a75012 + 6e3aba7 commit 04f1761

File tree

15 files changed

+909
-36
lines changed

15 files changed

+909
-36
lines changed

arbnode/node.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ func getStatelessBlockValidator(
880880
err = errors.New("no validator url specified")
881881
}
882882
if err != nil {
883-
if config.ValidatorRequired() || config.Staker.Enable {
883+
if config.ValidatorRequired() {
884884
return nil, fmt.Errorf("%w: failed to init block validator", err)
885885
}
886886
log.Warn("validation not supported", "err", err)

arbnode/seq_coordinator.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type SeqCoordinatorConfig struct {
6969
ChosenHealthcheckAddr string `koanf:"chosen-healthcheck-addr"`
7070
RedisUrl string `koanf:"redis-url"`
7171
NewRedisUrl string `koanf:"new-redis-url"`
72+
RedisQuorumSize uint64 `koanf:"redis-quorum-size"`
7273
LockoutDuration time.Duration `koanf:"lockout-duration"`
7374
LockoutSpare time.Duration `koanf:"lockout-spare"`
7475
SeqNumDuration time.Duration `koanf:"seq-num-duration"`
@@ -96,6 +97,7 @@ func SeqCoordinatorConfigAddOptions(prefix string, f *flag.FlagSet) {
9697
f.Bool(prefix+".enable", DefaultSeqCoordinatorConfig.Enable, "enable sequence coordinator")
9798
f.String(prefix+".redis-url", DefaultSeqCoordinatorConfig.RedisUrl, "the Redis URL to coordinate via")
9899
f.String(prefix+".new-redis-url", DefaultSeqCoordinatorConfig.NewRedisUrl, "switch to the new Redis URL to coordinate via")
100+
f.Uint64(prefix+".redis-quorum-size", DefaultSeqCoordinatorConfig.RedisQuorumSize, "the quorum size needed to qualify a redis GET as valid")
99101
f.String(prefix+".chosen-healthcheck-addr", DefaultSeqCoordinatorConfig.ChosenHealthcheckAddr, "if non-empty, launch an HTTP service binding to this address that returns status code 200 when chosen and 503 otherwise")
100102
f.Duration(prefix+".lockout-duration", DefaultSeqCoordinatorConfig.LockoutDuration, "duration to hold the sequencer lockout after acquiring it")
101103
f.Duration(prefix+".lockout-spare", DefaultSeqCoordinatorConfig.LockoutSpare, "time to subtract from lockout duration to ensure timely renewal")
@@ -117,6 +119,7 @@ var DefaultSeqCoordinatorConfig = SeqCoordinatorConfig{
117119
ChosenHealthcheckAddr: "",
118120
RedisUrl: "",
119121
NewRedisUrl: "",
122+
RedisQuorumSize: 1,
120123
LockoutDuration: time.Minute,
121124
LockoutSpare: 30 * time.Second,
122125
SeqNumDuration: 10 * 24 * time.Hour,
@@ -136,6 +139,7 @@ var TestSeqCoordinatorConfig = SeqCoordinatorConfig{
136139
Enable: false,
137140
RedisUrl: "",
138141
NewRedisUrl: "",
142+
RedisQuorumSize: 1,
139143
LockoutDuration: time.Second * 2,
140144
LockoutSpare: time.Millisecond * 10,
141145
SeqNumDuration: time.Minute * 10,
@@ -159,7 +163,7 @@ func NewSeqCoordinator(
159163
sync *SyncMonitor,
160164
config SeqCoordinatorConfig,
161165
) (*SeqCoordinator, error) {
162-
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl)
166+
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl, config.RedisQuorumSize)
163167
if err != nil {
164168
return nil, err
165169
}
@@ -610,7 +614,7 @@ func (c *SeqCoordinator) deleteFinalizedMsgsFromRedis(ctx context.Context, final
610614
}
611615

612616
func (c *SeqCoordinator) blockMetadataAt(ctx context.Context, pos arbutil.MessageIndex) (common.BlockMetadata, error) {
613-
blockMetadataStr, err := c.RedisCoordinator().Client.Get(ctx, redisutil.BlockMetadataKeyFor(pos)).Result()
617+
blockMetadataStr, err := c.RedisCoordinator().GetIfInQuorum(ctx, redisutil.BlockMetadataKeyFor(pos))
614618
if err != nil {
615619
if errors.Is(err, redis.Nil) {
616620
return nil, nil
@@ -673,12 +677,12 @@ func (c *SeqCoordinator) update(ctx context.Context) (time.Duration, error) {
673677
return c.retryAfterRedisError(), nil
674678
}
675679
readUntil := min(localMsgCount+c.config.MsgPerPoll, remoteMsgCount)
676-
client := c.RedisCoordinator().Client
680+
redisCoordinator := c.RedisCoordinator()
677681
// If we have a previous redis coordinator,
678682
// we can read from it until the local message count catches up to the prev coordinator's message count
679683
if c.prevRedisMessageCount > localMsgCount {
680684
readUntil = min(readUntil, c.prevRedisMessageCount)
681-
client = c.prevRedisCoordinator.Client
685+
redisCoordinator = c.prevRedisCoordinator
682686
}
683687
if c.prevRedisMessageCount != 0 && localMsgCount >= c.prevRedisMessageCount {
684688
log.Info("coordinator caught up to prev redis coordinator", "msgcount", localMsgCount, "prevMsgCount", c.prevRedisMessageCount)
@@ -689,7 +693,7 @@ func (c *SeqCoordinator) update(ctx context.Context) (time.Duration, error) {
689693
var msgReadErr error
690694
for msgToRead < readUntil && localMsgCount >= remoteFinalizedMsgCount {
691695
var resString string
692-
resString, msgReadErr = client.Get(ctx, redisutil.MessageKeyFor(msgToRead)).Result()
696+
resString, msgReadErr = redisCoordinator.GetIfInQuorum(ctx, redisutil.MessageKeyFor(msgToRead))
693697
if msgReadErr != nil && c.sequencer.Synced(ctx) {
694698
log.Warn("coordinator failed reading message", "pos", msgToRead, "err", msgReadErr)
695699
break
@@ -698,7 +702,7 @@ func (c *SeqCoordinator) update(ctx context.Context) (time.Duration, error) {
698702
var sigString string
699703
var sigBytes []byte
700704
sigSeparateKey := true
701-
sigString, msgReadErr = client.Get(ctx, redisutil.MessageSigKeyFor(msgToRead)).Result()
705+
sigString, msgReadErr = redisCoordinator.GetIfInQuorum(ctx, redisutil.MessageSigKeyFor(msgToRead))
702706
if errors.Is(msgReadErr, redis.Nil) {
703707
// no separate signature. Try reading old-style sig
704708
if len(rsBytes) < 32 {
@@ -900,7 +904,7 @@ func (c *SeqCoordinator) Start(ctxIn context.Context) {
900904
var newRedisCoordinator *redisutil.RedisCoordinator
901905
if c.config.NewRedisUrl != "" {
902906
var err error
903-
newRedisCoordinator, err = redisutil.NewRedisCoordinator(c.config.NewRedisUrl)
907+
newRedisCoordinator, err = redisutil.NewRedisCoordinator(c.config.NewRedisUrl, c.config.RedisQuorumSize)
904908
if err != nil {
905909
log.Warn("failed to create new redis coordinator", "err",
906910
err, "newRedisUrl", c.config.NewRedisUrl)

arbnode/seq_coordinator_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func TestRedisSeqCoordinatorAtomic(t *testing.T) {
125125
for i := 0; i < NumOfThreads; i++ {
126126
config := coordConfig
127127
config.MyUrl = fmt.Sprint(i)
128-
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl)
128+
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl, config.RedisQuorumSize)
129129
Require(t, err)
130130
coordinator := &SeqCoordinator{
131131
redisCoordinator: *redisCoordinator,
@@ -181,7 +181,7 @@ func TestSeqCoordinatorDeletesFinalizedMessages(t *testing.T) {
181181

182182
config := coordConfig
183183
config.MyUrl = "test"
184-
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl)
184+
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl, config.RedisQuorumSize)
185185
Require(t, err)
186186
coordinator := &SeqCoordinator{
187187
redisCoordinator: *redisCoordinator,
@@ -272,7 +272,7 @@ func TestSeqCoordinatorAddsBlockMetadata(t *testing.T) {
272272

273273
config := coordConfig
274274
config.MyUrl = "test"
275-
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl)
275+
redisCoordinator, err := redisutil.NewRedisCoordinator(config.RedisUrl, config.RedisQuorumSize)
276276
Require(t, err)
277277
coordinator := &SeqCoordinator{
278278
redisCoordinator: *redisCoordinator,

cmd/nitro/nitro.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ func mainImpl() int {
224224
var l1TransactionOptsBatchPoster *bind.TransactOpts
225225
// If sequencer and signing is enabled or batchposter is enabled without
226226
// external signing sequencer will need a key.
227-
sequencerNeedsKey := (nodeConfig.Node.Sequencer && !nodeConfig.Node.Feed.Output.DisableSigning) ||
227+
sequencerNeedsKey := (nodeConfig.Node.Sequencer && nodeConfig.Node.Feed.Output.Signed) ||
228228
(nodeConfig.Node.BatchPoster.Enable && (nodeConfig.Node.BatchPoster.DataPoster.ExternalSigner.URL == "" || nodeConfig.Node.DataAvailability.Enable))
229229
validatorNeedsKey := nodeConfig.Node.Staker.OnlyCreateWalletContract ||
230230
(nodeConfig.Node.Staker.Enable && !strings.EqualFold(nodeConfig.Node.Staker.Strategy, "watchtower") && nodeConfig.Node.Staker.DataPoster.ExternalSigner.URL == "")
@@ -531,9 +531,13 @@ func mainImpl() int {
531531
log.Error("failed to create execution node", "err", err)
532532
return 1
533533
}
534-
locator, err := server_common.NewMachineLocator(liveNodeConfig.Get().Validation.Wasm.RootPath)
535-
if err != nil {
536-
log.Error("failed to create machine locator: %w", err)
534+
var wasmModuleRoot common.Hash
535+
if liveNodeConfig.Get().Node.ValidatorRequired() {
536+
locator, err := server_common.NewMachineLocator(liveNodeConfig.Get().Validation.Wasm.RootPath)
537+
if err != nil {
538+
log.Error("failed to create machine locator: %w", err)
539+
}
540+
wasmModuleRoot = locator.LatestWasmModuleRoot()
537541
}
538542

539543
currentNode, err := arbnode.CreateNodeFullExecutionClient(
@@ -554,7 +558,7 @@ func mainImpl() int {
554558
fatalErrChan,
555559
new(big.Int).SetUint64(nodeConfig.ParentChain.ID),
556560
blobReader,
557-
locator.LatestWasmModuleRoot(),
561+
wasmModuleRoot,
558562
)
559563
if err != nil {
560564
log.Error("failed to create node", "err", err)

cmd/seq-coordinator-manager/seq-coordinator-manager.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func main() {
4949
os.Exit(1)
5050
}
5151
redisURL := args[0]
52-
redisutilCoordinator, err := redisutil.NewRedisCoordinator(redisURL)
52+
redisutilCoordinator, err := redisutil.NewRedisCoordinator(redisURL, 1)
5353
if err != nil {
5454
panic(err)
5555
}

execution/gethexec/blockchain.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type CachingConfig struct {
4444
DisableStylusCacheMetricsCollection bool `koanf:"disable-stylus-cache-metrics-collection"`
4545
StateScheme string `koanf:"state-scheme"`
4646
StateHistory uint64 `koanf:"state-history"`
47+
EnablePreimages bool `koanf:"enable-preimages"`
4748
}
4849

4950
func CachingConfigAddOptions(prefix string, f *flag.FlagSet) {
@@ -65,6 +66,7 @@ func CachingConfigAddOptions(prefix string, f *flag.FlagSet) {
6566
f.Bool(prefix+".disable-stylus-cache-metrics-collection", DefaultCachingConfig.DisableStylusCacheMetricsCollection, "disable metrics collection for the stylus cache")
6667
f.String(prefix+".state-scheme", DefaultCachingConfig.StateScheme, "scheme to use for state trie storage (hash, path)")
6768
f.Uint64(prefix+".state-history", DefaultCachingConfig.StateHistory, "number of recent blocks to retain state history for (path state-scheme only)")
69+
f.Bool(prefix+".enable-preimages", DefaultCachingConfig.EnablePreimages, "enable recording of preimages")
6870
}
6971

7072
func getStateHistory(maxBlockSpeed time.Duration) uint64 {
@@ -109,7 +111,7 @@ func DefaultCacheConfigFor(stack *node.Node, cachingConfig *CachingConfig) *core
109111
TriesInMemory: cachingConfig.BlockCount,
110112
TrieRetention: cachingConfig.BlockAge,
111113
SnapshotLimit: cachingConfig.SnapshotCache,
112-
Preimages: baseConf.Preimages,
114+
Preimages: baseConf.Preimages || cachingConfig.EnablePreimages,
113115
SnapshotRestoreMaxGas: cachingConfig.SnapshotRestoreGasLimit,
114116
HeadRewindBlocksLimit: cachingConfig.HeadRewindBlocksLimit,
115117
MaxNumberOfBlocksToSkipStateSaving: cachingConfig.MaxNumberOfBlocksToSkipStateSaving,

execution/gethexec/forwarder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ func (f *RedisTxForwarder) CheckHealth(ctx context.Context) error {
376376
// not thread safe vs update and itself
377377
func (f *RedisTxForwarder) Initialize(ctx context.Context) error {
378378
var err error
379-
f.redisCoordinator, err = redisutil.NewRedisCoordinator(f.config.RedisUrl)
379+
f.redisCoordinator, err = redisutil.NewRedisCoordinator(f.config.RedisUrl, 1)
380380
if err != nil {
381381
return fmt.Errorf("unable to create redis coordinator: %w", err)
382382
}

system_tests/timeboost_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ func testTxsHandlingDuringSequencerSwap(t *testing.T, dueToCrash bool) {
323323
Require(t, err)
324324

325325
// Set reader and writer coordinators for redis
326-
redisCoordinatorGetter, err := redisutil.NewRedisCoordinator(builderSeq.nodeConfig.SeqCoordinator.RedisUrl)
326+
redisCoordinatorGetter, err := redisutil.NewRedisCoordinator(builderSeq.nodeConfig.SeqCoordinator.RedisUrl, builderSeq.nodeConfig.SeqCoordinator.RedisQuorumSize)
327327
Require(t, err)
328328
currentChosen, err := redisCoordinatorGetter.CurrentChosenSequencer(ctx)
329329
Require(t, err)

0 commit comments

Comments
 (0)