Skip to content

Commit a811273

Browse files
Remove internal daprovider server for AnyTrust (#3989)
This is a backport of #3989 The internal daprovider server was originally added in PR #2533 to unify the code paths between internal AnyTrust and external DA providers by making both use RPC clients. After working with it for a while it's clear that the drawbacks outweigh any benefit from it: it added an unnecessary HTTP/RPC layer for in-process communication, introduced timeout configuration complexity, and made retry behavior difficult to reason about. The proper abstraction point is the daprovider.Writer and Reader interfaces, not the transport layer. External DA providers need RPC because they're remote, but internal AnyTrust components can communicate directly. This change removes the internal server entirely and connects the Nitro node directly to the AnyTrust aggregator writer and REST aggregator reader.
1 parent ea4cf11 commit a811273

File tree

1 file changed

+50
-35
lines changed

1 file changed

+50
-35
lines changed

arbnode/node.go

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@ import (
99
"errors"
1010
"fmt"
1111
"math/big"
12-
"os"
13-
"path"
14-
"path/filepath"
1512
"strings"
1613

1714
"github.com/spf13/pflag"
@@ -36,12 +33,11 @@ import (
3633
"github.com/offchainlabs/nitro/broadcastclients"
3734
"github.com/offchainlabs/nitro/broadcaster"
3835
"github.com/offchainlabs/nitro/cmd/chaininfo"
39-
"github.com/offchainlabs/nitro/cmd/genericconf"
4036
"github.com/offchainlabs/nitro/daprovider"
4137
"github.com/offchainlabs/nitro/daprovider/daclient"
4238
"github.com/offchainlabs/nitro/daprovider/das"
4339
"github.com/offchainlabs/nitro/daprovider/data_streaming"
44-
"github.com/offchainlabs/nitro/daprovider/server"
40+
"github.com/offchainlabs/nitro/daprovider/factory"
4541
"github.com/offchainlabs/nitro/execution"
4642
"github.com/offchainlabs/nitro/execution/gethexec"
4743
"github.com/offchainlabs/nitro/solgen/go/bridgegen"
@@ -581,6 +577,8 @@ func getDAS(
581577

582578
var err error
583579
var daClient *daclient.Client
580+
var anytrustWriter daprovider.Writer
581+
var anytrustReader daprovider.Reader
584582
var withDAWriter bool
585583
var dasServerCloseFn func()
586584
if config.DAProvider.Enable {
@@ -591,51 +589,57 @@ func getDAS(
591589
// Only allow dawriter if batchposter is enabled
592590
withDAWriter = config.DAProvider.WithWriter && config.BatchPoster.Enable
593591
} else if config.DataAvailability.Enable {
594-
jwtPath := path.Join(filepath.Dir(stack.InstanceDir()), "dasserver-jwtsecret")
595-
if err := genericconf.TryCreatingJWTSecret(jwtPath); err != nil {
596-
return nil, nil, nil, fmt.Errorf("error writing ephemeral jwtsecret of dasserver to file: %w", err)
592+
// Create AnyTrust factory
593+
daFactory, err := factory.NewDAProviderFactory(
594+
factory.ModeAnyTrust,
595+
&config.DataAvailability,
596+
nil, // referencedaCfg
597+
dataSigner,
598+
l1client,
599+
l1Reader,
600+
deployInfo.SequencerInbox,
601+
config.BatchPoster.Enable,
602+
)
603+
if err != nil {
604+
return nil, nil, nil, err
597605
}
598-
log.Info("Generated ephemeral JWT secret for dasserver", "jwtPath", jwtPath)
599-
// JWTSecret is no longer needed, cleanup when returning
600-
defer func() {
601-
if err := os.Remove(jwtPath); err != nil {
602-
log.Error("error deleting generated ephemeral JWT secret of dasserver", "jwtPath", jwtPath)
603-
}
604-
}()
605606

606-
serverConfig := dapserver.DefaultDASServerConfig
607-
serverConfig.Port = 0 // Initializes server at a random available port
608-
serverConfig.DataAvailability = config.DataAvailability
609-
serverConfig.EnableDAWriter = config.BatchPoster.Enable
610-
serverConfig.JWTSecret = jwtPath
611-
withDAWriter = config.BatchPoster.Enable
612-
dasServer, closeFn, err := dapserver.NewServerForDAS(ctx, &serverConfig, dataSigner, l1client, l1Reader, deployInfo.SequencerInbox)
613-
if err != nil {
607+
if err := daFactory.ValidateConfig(); err != nil {
614608
return nil, nil, nil, err
615609
}
616-
rpcClientConfig := rpcclient.DefaultClientConfig
617-
rpcClientConfig.URL = dasServer.Addr
618-
rpcClientConfig.JWTSecret = jwtPath
619610

620-
daClientConfig := config.DAProvider
621-
daClientConfig.RPC = rpcClientConfig
611+
// Create writer if batch poster is enabled
612+
var writerCleanup func()
613+
if config.BatchPoster.Enable {
614+
anytrustWriter, writerCleanup, err = daFactory.CreateWriter(ctx)
615+
if err != nil {
616+
return nil, nil, nil, err
617+
}
618+
withDAWriter = true
619+
}
622620

623-
daClient, err = daclient.NewClient(ctx, &daClientConfig, data_streaming.PayloadCommiter())
621+
// Create reader
622+
var readerCleanup func()
623+
anytrustReader, readerCleanup, err = daFactory.CreateReader(ctx)
624624
if err != nil {
625625
return nil, nil, nil, err
626626
}
627+
628+
// Set up cleanup function
627629
dasServerCloseFn = func() {
628-
_ = dasServer.Shutdown(ctx)
629-
if closeFn != nil {
630-
closeFn()
630+
if writerCleanup != nil {
631+
writerCleanup()
632+
}
633+
if readerCleanup != nil {
634+
readerCleanup()
631635
}
632636
}
633637
} else if l2Config.ArbitrumChainParams.DataAvailabilityCommittee {
634638
return nil, nil, nil, errors.New("a data availability service is required for this chain, but it was not configured")
635639
}
636640

637641
// We support a nil txStreamer for the pruning code
638-
if txStreamer != nil && txStreamer.chainConfig.ArbitrumChainParams.DataAvailabilityCommittee && daClient == nil {
642+
if txStreamer != nil && txStreamer.chainConfig.ArbitrumChainParams.DataAvailabilityCommittee && daClient == nil && anytrustReader == nil {
639643
return nil, nil, nil, errors.New("data availability service required but unconfigured")
640644
}
641645

@@ -650,15 +654,26 @@ func getDAS(
650654
return nil, nil, nil, fmt.Errorf("failed to register DA client: %w", err)
651655
}
652656
}
657+
if anytrustReader != nil {
658+
headerBytes := []byte{
659+
daprovider.DASMessageHeaderFlag,
660+
daprovider.DASMessageHeaderFlag | daprovider.TreeDASMessageHeaderFlag,
661+
}
662+
if err := dapReaders.RegisterAll(headerBytes, anytrustReader); err != nil {
663+
return nil, nil, nil, fmt.Errorf("failed to register AnyTrust reader: %w", err)
664+
}
665+
}
653666
if blobReader != nil {
654667
if err := dapReaders.SetupBlobReader(daprovider.NewReaderForBlobReader(blobReader)); err != nil {
655668
return nil, nil, nil, fmt.Errorf("failed to register blob reader: %w", err)
656669
}
657670
}
658-
// AnyTrust now always uses the daClient, which is already registered,
659-
// so we don't need to register it separately here.
660671

661672
if withDAWriter {
673+
// Return anytrustWriter if it exists, otherwise daClient
674+
if anytrustWriter != nil {
675+
return anytrustWriter, dasServerCloseFn, dapReaders, nil
676+
}
662677
return daClient, dasServerCloseFn, dapReaders, nil
663678
}
664679
return nil, dasServerCloseFn, dapReaders, nil

0 commit comments

Comments
 (0)