Skip to content

Commit 64f6515

Browse files
Remove internal daprovider server for AnyTrust (#3956)
This change is a backport of 0195abd. There were significant changes in this area that prevent it from being applied cleanly but the idea is the same. 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 1ee5ab5 commit 64f6515

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-
dapserver "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"
@@ -579,6 +575,8 @@ func getDAS(
579575

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

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

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

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

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

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

659670
if withDAWriter {
671+
// Return anytrustWriter if it exists, otherwise daClient
672+
if anytrustWriter != nil {
673+
return anytrustWriter, dasServerCloseFn, dapReaders, nil
674+
}
660675
return daClient, dasServerCloseFn, dapReaders, nil
661676
}
662677
return nil, dasServerCloseFn, dapReaders, nil

0 commit comments

Comments
 (0)