From c9b9303df7e6471d54792d54ad12296bbfb979c7 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Mon, 12 Feb 2024 11:50:37 -0800 Subject: [PATCH 01/38] fix(da): switch to jsonrpc da client --- config/config.go | 5 +++ da/client.go | 105 +++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 2 + go.sum | 4 ++ node/full.go | 10 ++--- 5 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 da/client.go diff --git a/config/config.go b/config/config.go index e14da5faf3..6e5f8d35ad 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,8 @@ const ( FlagAggregator = "rollkit.aggregator" // FlagDAAddress is a flag for specifying the data availability layer address FlagDAAddress = "rollkit.da_address" + // FlagDAAuthToken is a flag for specifying the data availability layer auth token + FlagDAAuthToken = "rollkit.da_auth_token" // FlagBlockTime is a flag for specifying the block time FlagBlockTime = "rollkit.block_time" // FlagDABlockTime is a flag for specifying the data availability layer block time @@ -45,6 +47,7 @@ type NodeConfig struct { Aggregator bool `mapstructure:"aggregator"` BlockManagerConfig `mapstructure:",squash"` DAAddress string `mapstructure:"da_address"` + DAAuthToken string `mapstructure:"da_auth_token"` Light bool `mapstructure:"light"` HeaderConfig `mapstructure:",squash"` LazyAggregator bool `mapstructure:"lazy_aggregator"` @@ -106,6 +109,7 @@ func GetNodeConfig(nodeConf *NodeConfig, cmConf *cmcfg.Config) { func (nc *NodeConfig) GetViperConfig(v *viper.Viper) error { nc.Aggregator = v.GetBool(FlagAggregator) nc.DAAddress = v.GetString(FlagDAAddress) + nc.DAAuthToken = v.GetString(FlagDAAuthToken) nc.DAGasPrice = v.GetFloat64(FlagDAGasPrice) nc.DAGasMultiplier = v.GetFloat64(FlagDAGasMultiplier) nc.DANamespace = v.GetString(FlagDANamespace) @@ -127,6 +131,7 @@ func AddFlags(cmd *cobra.Command) { cmd.Flags().Bool(FlagAggregator, def.Aggregator, "run node in aggregator mode") cmd.Flags().Bool(FlagLazyAggregator, def.LazyAggregator, "wait for transactions, don't build empty blocks") cmd.Flags().String(FlagDAAddress, def.DAAddress, "DA address (host:port)") + cmd.Flags().String(FlagDAAuthToken, def.DAAuthToken, "DA auth token") cmd.Flags().Duration(FlagBlockTime, def.BlockTime, "block time (for aggregator mode)") cmd.Flags().Duration(FlagDABlockTime, def.DABlockTime, "DA chain block time (for syncing)") cmd.Flags().Float64(FlagDAGasPrice, def.DAGasPrice, "DA gas price for blob transactions") diff --git a/da/client.go b/da/client.go new file mode 100644 index 0000000000..555d014f5d --- /dev/null +++ b/da/client.go @@ -0,0 +1,105 @@ +package da + +import ( + "context" + "fmt" + "net/http" + + "github.com/filecoin-project/go-jsonrpc" + "github.com/rollkit/go-da" +) + +type API struct { + Internal struct { + MaxBlobSize func(ctx context.Context) (uint64, error) `perm:"read"` + Get func(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Blob, error) `perm:"read"` + GetIDs func(ctx context.Context, height uint64, ns da.Namespace) ([]da.ID, error) `perm:"read"` + GetProofs func(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Proof, error) `perm:"read"` + Commit func(ctx context.Context, blobs []da.Blob, ns da.Namespace) ([]da.Commitment, error) `perm:"read"` + Validate func(context.Context, []da.ID, []da.Proof, da.Namespace) ([]bool, error) `perm:"read"` + Submit func(context.Context, []da.Blob, float64, da.Namespace) ([]da.ID, error) `perm:"write"` + } +} + +func (api *API) MaxBlobSize(ctx context.Context) (uint64, error) { + return api.Internal.MaxBlobSize(ctx) +} + +func (api *API) Get(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Blob, error) { + return api.Internal.Get(ctx, ids, ns) +} + +func (api *API) GetIDs(ctx context.Context, height uint64, ns da.Namespace) ([]da.ID, error) { + return api.Internal.GetIDs(ctx, height, ns) +} + +func (api *API) GetProofs(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Proof, error) { + return api.Internal.GetProofs(ctx, ids, ns) +} + +func (api *API) Commit(ctx context.Context, blobs []da.Blob, ns da.Namespace) ([]da.Commitment, error) { + return api.Internal.Commit(ctx, blobs, ns) +} + +func (api *API) Validate(ctx context.Context, ids []da.ID, proofs []da.Proof, ns da.Namespace) ([]bool, error) { + return api.Internal.Validate(ctx, ids, proofs, ns) +} + +func (api *API) Submit(ctx context.Context, blobs []da.Blob, gasPrice float64, ns da.Namespace) ([]da.ID, error) { + return api.Internal.Submit(ctx, blobs, gasPrice, ns) +} + +type Client struct { + DA API + closer multiClientCloser +} + +// multiClientCloser is a wrapper struct to close clients across multiple namespaces. +type multiClientCloser struct { + closers []jsonrpc.ClientCloser +} + +// register adds a new closer to the multiClientCloser +func (m *multiClientCloser) register(closer jsonrpc.ClientCloser) { + m.closers = append(m.closers, closer) +} + +// closeAll closes all saved clients. +func (m *multiClientCloser) closeAll() { + for _, closer := range m.closers { + closer() + } +} + +// Close closes the connections to all namespaces registered on the staticClient. +func (c *Client) Close() { + c.closer.closeAll() +} + +// NewClient creates a new Client with one connection per namespace with the +// given token as the authorization token. +func NewClient(ctx context.Context, addr string, token string) (*Client, error) { + authHeader := http.Header{"Authorization": []string{fmt.Sprintf("Bearer %s", token)}} + return newClient(ctx, addr, authHeader) +} + +func newClient(ctx context.Context, addr string, authHeader http.Header) (*Client, error) { + var multiCloser multiClientCloser + var client Client + for name, module := range moduleMap(&client) { + closer, err := jsonrpc.NewClient(ctx, addr, name, module, authHeader) + if err != nil { + return nil, err + } + multiCloser.register(closer) + } + + return &client, nil +} + +func moduleMap(client *Client) map[string]interface{} { + // TODO: this duplication of strings many times across the codebase can be avoided with issue #1176 + return map[string]interface{}{ + "da": &client.DA.Internal, + } +} diff --git a/go.mod b/go.mod index 0edfd43ead..6e1346179d 100644 --- a/go.mod +++ b/go.mod @@ -36,6 +36,7 @@ require ( require ( github.com/celestiaorg/go-header v0.5.4 + github.com/filecoin-project/go-jsonrpc v0.3.1 github.com/ipfs/go-ds-badger4 v0.1.5 ) @@ -181,6 +182,7 @@ require ( golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.16.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gonum.org/v1/gonum v0.12.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 21b90894c0..ae5792a92a 100644 --- a/go.sum +++ b/go.sum @@ -356,6 +356,8 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/filecoin-project/go-jsonrpc v0.3.1 h1:qwvAUc5VwAkooquKJmfz9R2+F8znhiqcNHYjEp/NM10= +github.com/filecoin-project/go-jsonrpc v0.3.1/go.mod h1:jBSvPTl8V1N7gSTuCR4bis8wnQnIjHbRPpROol6iQKM= github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= @@ -2153,6 +2155,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= diff --git a/node/full.go b/node/full.go index c320c8e3df..9c566c1060 100644 --- a/node/full.go +++ b/node/full.go @@ -14,8 +14,6 @@ import ( "github.com/libp2p/go-libp2p/core/crypto" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" abci "github.com/cometbft/cometbft/abci/types" llcfg "github.com/cometbft/cometbft/config" @@ -26,7 +24,6 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" cmtypes "github.com/cometbft/cometbft/types" - goDAProxy "github.com/rollkit/go-da/proxy" "github.com/rollkit/rollkit/block" "github.com/rollkit/rollkit/config" "github.com/rollkit/rollkit/da" @@ -228,12 +225,11 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L if err != nil { return nil, fmt.Errorf("error decoding namespace: %w", err) } - daClient := goDAProxy.NewClient() - err = daClient.Start(nodeConfig.DAAddress, grpc.WithTransportCredentials(insecure.NewCredentials())) + daClient, err := da.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) if err != nil { - return nil, fmt.Errorf("error while establishing GRPC connection to DA layer: %w", err) + return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } - return &da.DAClient{DA: daClient, Namespace: namespace, GasPrice: nodeConfig.DAGasPrice, GasMultiplier: nodeConfig.DAGasMultiplier, Logger: logger.With("module", "da_client")}, nil + return &da.DAClient{DA: &daClient.DA, Namespace: namespace, GasPrice: nodeConfig.DAGasPrice, Logger: logger.With("module", "da_client")}, nil } func initMempool(logger log.Logger, proxyApp proxy.AppConns, memplMetrics *mempool.Metrics) *mempool.CListMempool { From 9497916427e1030e6310b8ce936cfad73139e076 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Tue, 5 Mar 2024 15:35:33 -0800 Subject: [PATCH 02/38] fix(da): use go-da@d39d77 --- cmd/rollkit/commands/run_node.go | 15 ++++----------- da/da_test.go | 21 ++++++--------------- da/mock/cmd/main.go | 15 ++++----------- go.mod | 2 ++ go.sum | 4 ++-- rpc/json/helpers_test.go | 2 +- 6 files changed, 19 insertions(+), 40 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index 8ff5931a65..7bacd7b12f 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -4,9 +4,7 @@ import ( "context" "fmt" "math/rand" - "net" "os" - "strconv" cmtcmd "github.com/cometbft/cometbft/cmd/cometbft/commands" cometconf "github.com/cometbft/cometbft/config" @@ -20,8 +18,6 @@ import ( cometproxy "github.com/cometbft/cometbft/proxy" comettypes "github.com/cometbft/cometbft/types" comettime "github.com/cometbft/cometbft/types/time" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" "github.com/rollkit/go-da/proxy" goDATest "github.com/rollkit/go-da/test" @@ -176,7 +172,7 @@ func NewRunNodeCmd() *cobra.Command { // use mock da server by default if !cmd.Flags().Lookup("rollkit.da_address").Changed { - rollkitConfig.DAAddress = ":7980" + rollkitConfig.DAAddress = "http://localhost:7980" } return cmd } @@ -194,16 +190,13 @@ func addNodeFlags(cmd *cobra.Command) { } // startMockGRPCServ starts a mock gRPC server for the dummy DA -func startMockGRPCServ() *grpc.Server { - srv := proxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - lis, err := net.Listen("tcp", "127.0.0.1"+":"+strconv.Itoa(7980)) +func startMockGRPCServ() *proxy.Server { + srv := proxy.NewServer("localhost", "7980", goDATest.NewDummyDA()) + err := srv.Start(context.Background()) if err != nil { fmt.Println(err) return nil } - go func() { - _ = srv.Serve(lis) - }() return srv } diff --git a/da/da_test.go b/da/da_test.go index 7387fed57c..8849e9fe8b 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -6,18 +6,13 @@ import ( "errors" "fmt" "math/rand" - "net" "os" - "strconv" "testing" "time" "github.com/cometbft/cometbft/libs/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "google.golang.org/grpc" - - "google.golang.org/grpc/credentials/insecure" "github.com/rollkit/go-da" "github.com/rollkit/go-da/proxy" @@ -36,7 +31,7 @@ func TestMain(m *testing.M) { exitCode := m.Run() // teardown servers - srv.GracefulStop() + srv.Stop(context.TODO()) os.Exit(exitCode) } @@ -97,26 +92,22 @@ func TestSubmitRetrieve(t *testing.T) { } } -func startMockGRPCServ() *grpc.Server { - srv := proxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - lis, err := net.Listen("tcp", "127.0.0.1"+":"+strconv.Itoa(7980)) +func startMockGRPCServ() *proxy.Server { + srv := proxy.NewServer("localhost", "7980", goDATest.NewDummyDA()) + err := srv.Start(context.TODO()) if err != nil { fmt.Println(err) return nil } - go func() { - _ = srv.Serve(lis) - }() return srv } func startMockGRPCClient() (*DAClient, error) { - client := proxy.NewClient() - err := client.Start("127.0.0.1:7980", grpc.WithTransportCredentials(insecure.NewCredentials())) + client, err := proxy.NewClient(context.TODO(), "http://localhost:7980", "") if err != nil { return nil, err } - return &DAClient{DA: client, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()}, nil + return &DAClient{DA: &client.DA, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()}, nil } func doTestSubmitTimeout(t *testing.T, dalc *DAClient, blocks []*types.Block) { diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index 12fb217077..65461da3b2 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -1,14 +1,11 @@ package main import ( + "context" "flag" "log" - "net" "strconv" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "github.com/rollkit/go-da/proxy" goDATest "github.com/rollkit/go-da/test" ) @@ -22,13 +19,9 @@ func main() { flag.StringVar(&host, "host", "0.0.0.0", "listening address") flag.Parse() - lis, err := net.Listen("tcp", host+":"+strconv.Itoa(port)) - if err != nil { - log.Panic(err) - } - log.Println("Listening on:", lis.Addr()) - srv := proxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - if err := srv.Serve(lis); err != nil { + srv := proxy.NewServer(host, strconv.Itoa(port), goDATest.NewDummyDA()) + log.Printf("Listening on: %s:%d", host, port) + if err := srv.Start(context.Background()); err != nil { log.Fatal("error while serving:", err) } } diff --git a/go.mod b/go.mod index 6e1346179d..776af3605c 100644 --- a/go.mod +++ b/go.mod @@ -189,3 +189,5 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) + +replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240305232117-d39d77c7a6c3 diff --git a/go.sum b/go.sum index ae5792a92a..642edb539b 100644 --- a/go.sum +++ b/go.sum @@ -1364,8 +1364,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rollkit/go-da v0.4.0 h1:/s7ZrVq7DC2aK8UXIvB7rsXrZ2mVGRw7zrexcxRvhlw= -github.com/rollkit/go-da v0.4.0/go.mod h1:Kef0XI5ecEKd3TXzI8S+9knAUJnZg0svh2DuXoCsPlM= +github.com/rollkit/go-da v0.4.1-0.20240305232117-d39d77c7a6c3 h1:a/5BwBCFSssxLmkjjrbVeYi8kUzly4kt+qqfBXPExkM= +github.com/rollkit/go-da v0.4.1-0.20240305232117-d39d77c7a6c3/go.mod h1:+SNuI00o3NiQCXCWK1iwJV8aUM7E2DN6WLPlN7nswp0= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= diff --git a/rpc/json/helpers_test.go b/rpc/json/helpers_test.go index d21bc3fa28..2b597b84cd 100644 --- a/rpc/json/helpers_test.go +++ b/rpc/json/helpers_test.go @@ -30,7 +30,7 @@ func prepareProposalResponse(_ context.Context, req *abci.RequestPrepareProposal }, nil } -var MockServerAddr = ":7980" +var MockServerAddr = "http://localhost:7980" var MockNamespace = "deadbeef" From 4517a05259f9649bda22fb2127ed09528a452d08 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Tue, 5 Mar 2024 16:13:07 -0800 Subject: [PATCH 03/38] fix(da): fix lint --- config/config.go | 2 +- da/client.go | 1 + da/da_test.go | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config/config.go b/config/config.go index 6e5f8d35ad..16a957e453 100644 --- a/config/config.go +++ b/config/config.go @@ -15,7 +15,7 @@ const ( // FlagDAAddress is a flag for specifying the data availability layer address FlagDAAddress = "rollkit.da_address" // FlagDAAuthToken is a flag for specifying the data availability layer auth token - FlagDAAuthToken = "rollkit.da_auth_token" + FlagDAAuthToken = "rollkit.da_auth_token" // nosec: G101 // FlagBlockTime is a flag for specifying the block time FlagBlockTime = "rollkit.block_time" // FlagDABlockTime is a flag for specifying the data availability layer block time diff --git a/da/client.go b/da/client.go index 555d014f5d..8b257662bc 100644 --- a/da/client.go +++ b/da/client.go @@ -6,6 +6,7 @@ import ( "net/http" "github.com/filecoin-project/go-jsonrpc" + "github.com/rollkit/go-da" ) diff --git a/da/da_test.go b/da/da_test.go index 8849e9fe8b..bafabd6db6 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -31,7 +31,10 @@ func TestMain(m *testing.M) { exitCode := m.Run() // teardown servers - srv.Stop(context.TODO()) + err := srv.Stop(context.TODO()) + if err != nil { + fmt.Println(err) + } os.Exit(exitCode) } From ed2e911522f23ca37e4c23ace8e0c4a87a278893 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Tue, 5 Mar 2024 16:17:23 -0800 Subject: [PATCH 04/38] fix(da): nit --- config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.go b/config/config.go index 16a957e453..bb560c7da3 100644 --- a/config/config.go +++ b/config/config.go @@ -15,7 +15,7 @@ const ( // FlagDAAddress is a flag for specifying the data availability layer address FlagDAAddress = "rollkit.da_address" // FlagDAAuthToken is a flag for specifying the data availability layer auth token - FlagDAAuthToken = "rollkit.da_auth_token" // nosec: G101 + FlagDAAuthToken = "rollkit.da_auth_token" // #nosec G101 // FlagBlockTime is a flag for specifying the block time FlagBlockTime = "rollkit.block_time" // FlagDABlockTime is a flag for specifying the data availability layer block time From 33be25bb4f2cf3bfab666c9e1f2b050e9ab1a2e6 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 6 Mar 2024 11:16:02 -0800 Subject: [PATCH 05/38] fix(da): use go-da proxy client --- da/client.go | 106 --------------------------------------------------- node/full.go | 4 +- 2 files changed, 3 insertions(+), 107 deletions(-) delete mode 100644 da/client.go diff --git a/da/client.go b/da/client.go deleted file mode 100644 index 8b257662bc..0000000000 --- a/da/client.go +++ /dev/null @@ -1,106 +0,0 @@ -package da - -import ( - "context" - "fmt" - "net/http" - - "github.com/filecoin-project/go-jsonrpc" - - "github.com/rollkit/go-da" -) - -type API struct { - Internal struct { - MaxBlobSize func(ctx context.Context) (uint64, error) `perm:"read"` - Get func(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Blob, error) `perm:"read"` - GetIDs func(ctx context.Context, height uint64, ns da.Namespace) ([]da.ID, error) `perm:"read"` - GetProofs func(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Proof, error) `perm:"read"` - Commit func(ctx context.Context, blobs []da.Blob, ns da.Namespace) ([]da.Commitment, error) `perm:"read"` - Validate func(context.Context, []da.ID, []da.Proof, da.Namespace) ([]bool, error) `perm:"read"` - Submit func(context.Context, []da.Blob, float64, da.Namespace) ([]da.ID, error) `perm:"write"` - } -} - -func (api *API) MaxBlobSize(ctx context.Context) (uint64, error) { - return api.Internal.MaxBlobSize(ctx) -} - -func (api *API) Get(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Blob, error) { - return api.Internal.Get(ctx, ids, ns) -} - -func (api *API) GetIDs(ctx context.Context, height uint64, ns da.Namespace) ([]da.ID, error) { - return api.Internal.GetIDs(ctx, height, ns) -} - -func (api *API) GetProofs(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Proof, error) { - return api.Internal.GetProofs(ctx, ids, ns) -} - -func (api *API) Commit(ctx context.Context, blobs []da.Blob, ns da.Namespace) ([]da.Commitment, error) { - return api.Internal.Commit(ctx, blobs, ns) -} - -func (api *API) Validate(ctx context.Context, ids []da.ID, proofs []da.Proof, ns da.Namespace) ([]bool, error) { - return api.Internal.Validate(ctx, ids, proofs, ns) -} - -func (api *API) Submit(ctx context.Context, blobs []da.Blob, gasPrice float64, ns da.Namespace) ([]da.ID, error) { - return api.Internal.Submit(ctx, blobs, gasPrice, ns) -} - -type Client struct { - DA API - closer multiClientCloser -} - -// multiClientCloser is a wrapper struct to close clients across multiple namespaces. -type multiClientCloser struct { - closers []jsonrpc.ClientCloser -} - -// register adds a new closer to the multiClientCloser -func (m *multiClientCloser) register(closer jsonrpc.ClientCloser) { - m.closers = append(m.closers, closer) -} - -// closeAll closes all saved clients. -func (m *multiClientCloser) closeAll() { - for _, closer := range m.closers { - closer() - } -} - -// Close closes the connections to all namespaces registered on the staticClient. -func (c *Client) Close() { - c.closer.closeAll() -} - -// NewClient creates a new Client with one connection per namespace with the -// given token as the authorization token. -func NewClient(ctx context.Context, addr string, token string) (*Client, error) { - authHeader := http.Header{"Authorization": []string{fmt.Sprintf("Bearer %s", token)}} - return newClient(ctx, addr, authHeader) -} - -func newClient(ctx context.Context, addr string, authHeader http.Header) (*Client, error) { - var multiCloser multiClientCloser - var client Client - for name, module := range moduleMap(&client) { - closer, err := jsonrpc.NewClient(ctx, addr, name, module, authHeader) - if err != nil { - return nil, err - } - multiCloser.register(closer) - } - - return &client, nil -} - -func moduleMap(client *Client) map[string]interface{} { - // TODO: this duplication of strings many times across the codebase can be avoided with issue #1176 - return map[string]interface{}{ - "da": &client.DA.Internal, - } -} diff --git a/node/full.go b/node/full.go index 9c566c1060..22c83cf962 100644 --- a/node/full.go +++ b/node/full.go @@ -24,6 +24,8 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" cmtypes "github.com/cometbft/cometbft/types" + goDA "github.com/rollkit/go-da/proxy" + "github.com/rollkit/rollkit/block" "github.com/rollkit/rollkit/config" "github.com/rollkit/rollkit/da" @@ -225,7 +227,7 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L if err != nil { return nil, fmt.Errorf("error decoding namespace: %w", err) } - daClient, err := da.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) + daClient, err := goDA.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) if err != nil { return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } From ee4d0b3b9662ec0fe43b59db9996335f9536a863 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 6 Mar 2024 11:47:38 -0800 Subject: [PATCH 06/38] fix(da): docs, test jsonrpc --- cmd/rollkit/docs/rollkit_start.md | 1 + da/da.md | 6 +++--- da/da_test.go | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/cmd/rollkit/docs/rollkit_start.md b/cmd/rollkit/docs/rollkit_start.md index 2f7473e62f..1d300aded7 100644 --- a/cmd/rollkit/docs/rollkit_start.md +++ b/cmd/rollkit/docs/rollkit_start.md @@ -31,6 +31,7 @@ rollkit start [flags] --rollkit.aggregator run node in aggregator mode --rollkit.block_time duration block time (for aggregator mode) (default 1s) --rollkit.da_address string DA address (host:port) (default ":26650") + --rollkit.da_auth_token string DA auth token --rollkit.da_block_time duration DA chain block time (for syncing) (default 15s) --rollkit.da_gas_multiplier float DA gas price multiplier for retrying blob transactions (default -1) --rollkit.da_gas_price float DA gas price for blob transactions (default -1) diff --git a/da/da.md b/da/da.md index c986b867f4..7806914ea4 100644 --- a/da/da.md +++ b/da/da.md @@ -4,7 +4,7 @@ Rollkit provides a wrapper for [go-da][go-da], a generic data availability inter ## Details -`DAClient` under the hood uses a GRPC implementation of the [go-da][go-da] DA interface. Using the `DAAddress` specified in the node's config, node creates a GRPC connection to it using go-da's gprc implementation [grpc-proxy][grpc-proxy] which is then used under the hood of `DAClient` to communicate with the underlying DA. +`DAClient` under the hood uses a json-rpc implementation of the [go-da][go-da] DA interface. Using the `DAAddress` specified in the node's config, node creates a json-rpc connection to it using go-da's json-rpc implementation [json-rpc-proxy][json-rpc-proxy] which is then used under the hood of `DAClient` to communicate with the underlying DA. Given a set of blocks to be submitted to DA by the block manager, the `SubmitBlocks` first encodes the blocks using protobuf (the encoded data are called blobs) and invokes the `Submit` method on the underlying DA implementation. On successful submission (`StatusSuccess`), the DA block height which included in the rollup blocks is returned. @@ -29,9 +29,9 @@ See [da implementation] [2] [celestia-da][celestia-da] -[3] [grpc-proxy][grpc-proxy] +[3] [json-rpc-proxy][json-rpc-proxy] [da implementation]: https://github.com/rollkit/rollkit/blob/main/da/da.go [go-da]: https://github.com/rollkit/go-da [celestia-da]: https://github.com/rollkit/celestia-da -[grpc-proxy]: https://github.com/rollkit/go-da/tree/main/proxy +[json-rpc-proxy]: https://github.com/rollkit/go-da/tree/main/proxy diff --git a/da/da_test.go b/da/da_test.go index bafabd6db6..be2f3764f1 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -24,7 +24,7 @@ import ( const mockDaBlockTime = 100 * time.Millisecond func TestMain(m *testing.M) { - srv := startMockGRPCServ() + srv := startMockDAServ() if srv == nil { os.Exit(1) } @@ -69,11 +69,11 @@ func TestMockDAErrors(t *testing.T) { func TestSubmitRetrieve(t *testing.T) { dummyClient := &DAClient{DA: goDATest.NewDummyDA(), GasPrice: -1, Logger: log.TestingLogger()} - grpcClient, err := startMockGRPCClient() + rpcClient, err := startMockDAClient() require.NoError(t, err) clients := map[string]*DAClient{ "dummy": dummyClient, - "grpc": grpcClient, + "rpc": rpcClient, } tests := []struct { name string @@ -95,7 +95,7 @@ func TestSubmitRetrieve(t *testing.T) { } } -func startMockGRPCServ() *proxy.Server { +func startMockDAServ() *proxy.Server { srv := proxy.NewServer("localhost", "7980", goDATest.NewDummyDA()) err := srv.Start(context.TODO()) if err != nil { @@ -105,7 +105,7 @@ func startMockGRPCServ() *proxy.Server { return srv } -func startMockGRPCClient() (*DAClient, error) { +func startMockDAClient() (*DAClient, error) { client, err := proxy.NewClient(context.TODO(), "http://localhost:7980", "") if err != nil { return nil, err From 4c79f56065763337b74dc8efd9f452aa82bf8f07 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 6 Mar 2024 11:52:44 -0800 Subject: [PATCH 07/38] fix(da): lint go mod --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 776af3605c..77768c2825 100644 --- a/go.mod +++ b/go.mod @@ -62,6 +62,7 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/elastic/gosigar v0.14.2 // indirect + github.com/filecoin-project/go-jsonrpc v0.3.1 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect From 9b59363ea57a4df2163733f57f71d73fdf6a75e1 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Tue, 12 Mar 2024 13:44:02 -0700 Subject: [PATCH 08/38] fix(da): go mod tidy --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index 77768c2825..9f31091a33 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,6 @@ require ( require ( github.com/celestiaorg/go-header v0.5.4 - github.com/filecoin-project/go-jsonrpc v0.3.1 github.com/ipfs/go-ds-badger4 v0.1.5 ) From c328504e73ad90b95b69968cee32f413ad2a9217 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Tue, 12 Mar 2024 14:01:03 -0700 Subject: [PATCH 09/38] fix(da): use go-da@6da19b --- cmd/rollkit/commands/run_node.go | 2 +- da/da_test.go | 2 +- da/mock/cmd/main.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- node/full.go | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index 7bacd7b12f..9427c662df 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -19,7 +19,7 @@ import ( comettypes "github.com/cometbft/cometbft/types" comettime "github.com/cometbft/cometbft/types/time" - "github.com/rollkit/go-da/proxy" + "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/spf13/cobra" diff --git a/da/da_test.go b/da/da_test.go index be2f3764f1..975ab2421c 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -15,7 +15,7 @@ import ( "github.com/stretchr/testify/require" "github.com/rollkit/go-da" - "github.com/rollkit/go-da/proxy" + "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/da/mock" "github.com/rollkit/rollkit/types" diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index 65461da3b2..b45b08cadd 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -6,7 +6,7 @@ import ( "log" "strconv" - "github.com/rollkit/go-da/proxy" + "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" ) diff --git a/go.mod b/go.mod index 9f31091a33..376ae28cd6 100644 --- a/go.mod +++ b/go.mod @@ -190,4 +190,4 @@ require ( lukechampine.com/blake3 v1.2.1 // indirect ) -replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240305232117-d39d77c7a6c3 +replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240312205952-6da19b040bd8 diff --git a/go.sum b/go.sum index 642edb539b..56322b6822 100644 --- a/go.sum +++ b/go.sum @@ -1364,8 +1364,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rollkit/go-da v0.4.1-0.20240305232117-d39d77c7a6c3 h1:a/5BwBCFSssxLmkjjrbVeYi8kUzly4kt+qqfBXPExkM= -github.com/rollkit/go-da v0.4.1-0.20240305232117-d39d77c7a6c3/go.mod h1:+SNuI00o3NiQCXCWK1iwJV8aUM7E2DN6WLPlN7nswp0= +github.com/rollkit/go-da v0.4.1-0.20240312205952-6da19b040bd8 h1:tRGsBTeKmopi5/0q/Dv/ieT6OlyYTL7OUA5JIcXKZs0= +github.com/rollkit/go-da v0.4.1-0.20240312205952-6da19b040bd8/go.mod h1:IxCIwpvedJwwrs900fygBsRoYCBiizBOZtwbgfs4tdU= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= diff --git a/node/full.go b/node/full.go index 22c83cf962..67b1d54b15 100644 --- a/node/full.go +++ b/node/full.go @@ -24,7 +24,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" cmtypes "github.com/cometbft/cometbft/types" - goDA "github.com/rollkit/go-da/proxy" + goDA "github.com/rollkit/go-da/proxy-jsonrpc" "github.com/rollkit/rollkit/block" "github.com/rollkit/rollkit/config" From 335f99f3a21c5acaaaa74aac3fa9df7d5878d379 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Tue, 12 Mar 2024 16:58:02 -0700 Subject: [PATCH 10/38] fix(da): debug ci --- da/da_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/da/da_test.go b/da/da_test.go index 975ab2421c..7647edd62a 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -268,12 +268,12 @@ func doTestSubmitLargeBlocksOverflow(t *testing.T, dalc *DAClient) { // overflowing blocks submit partially resp := dalc.SubmitBlocks(ctx, []*types.Block{block1, block2}, limit, -1) - assert.Equal(StatusSuccess, resp.Code, "overflowing blocks should submit partially") + assert.Equal(resp.Message, "", "overflowing blocks should submit partially") assert.EqualValues(1, resp.SubmittedCount, "submitted count should be partial") // retry remaining blocks resp = dalc.SubmitBlocks(ctx, []*types.Block{block2}, limit, -1) - assert.Equal(StatusSuccess, resp.Code, "remaining blocks should submit") + assert.Equal(resp.Message, "", "remaining blocks should submit") assert.EqualValues(resp.SubmittedCount, 1, "submitted count should match") } From 1b13b3114cb1eea287983470ae6c64cbc85764cf Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Tue, 12 Mar 2024 18:39:38 -0700 Subject: [PATCH 11/38] fix(da): debug ctx timeout --- da/da.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/da/da.go b/da/da.go index 96a50ef778..c000b6489d 100644 --- a/da/da.go +++ b/da/da.go @@ -18,7 +18,7 @@ import ( var ( // submitTimeout is the timeout for block submission - submitTimeout = 60 * time.Second + submitTimeout = 120 * time.Second // retrieveTimeout is the timeout for block retrieval retrieveTimeout = 60 * time.Second From 9ad0dfd87a4513da77bf8367d674b28743bfe40c Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 00:10:56 -0700 Subject: [PATCH 12/38] fix(da): fix context timeout --- da/da.go | 2 +- da/da_test.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/da/da.go b/da/da.go index c000b6489d..96a50ef778 100644 --- a/da/da.go +++ b/da/da.go @@ -18,7 +18,7 @@ import ( var ( // submitTimeout is the timeout for block submission - submitTimeout = 120 * time.Second + submitTimeout = 60 * time.Second // retrieveTimeout is the timeout for block retrieval retrieveTimeout = 60 * time.Second diff --git a/da/da_test.go b/da/da_test.go index 7647edd62a..d47b970fe0 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -121,7 +121,9 @@ func doTestSubmitTimeout(t *testing.T, dalc *DAClient, blocks []*types.Block) { require.NoError(t, err) assert := assert.New(t) + defaultSubmitTimeout := submitTimeout submitTimeout = 50 * time.Millisecond + defer func() { submitTimeout = defaultSubmitTimeout }() resp := dalc.SubmitBlocks(ctx, blocks, maxBlobSize, -1) assert.Contains(resp.Message, "context deadline exceeded", "should return context timeout error") } From 45ba7128032f817852b94779a20342df9d691b54 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 00:31:11 -0700 Subject: [PATCH 13/38] fix(da): switch grpc/jsonrpc based on url --- node/full.go | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/node/full.go b/node/full.go index 67b1d54b15..b506f71820 100644 --- a/node/full.go +++ b/node/full.go @@ -8,6 +8,7 @@ import ( "errors" "fmt" "net/http" + "net/url" ds "github.com/ipfs/go-datastore" ktds "github.com/ipfs/go-datastore/keytransform" @@ -24,7 +25,9 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" cmtypes "github.com/cometbft/cometbft/types" - goDA "github.com/rollkit/go-da/proxy-jsonrpc" + goDA "github.com/rollkit/go-da" + grpcDA "github.com/rollkit/go-da/proxy-grpc" + jsonrpcDA "github.com/rollkit/go-da/proxy-jsonrpc" "github.com/rollkit/rollkit/block" "github.com/rollkit/rollkit/config" @@ -227,11 +230,31 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L if err != nil { return nil, fmt.Errorf("error decoding namespace: %w", err) } - daClient, err := goDA.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) + + u, err := url.Parse(nodeConfig.DAAddress) if err != nil { - return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) + return nil, fmt.Errorf("error parsing DA address url: %w", err) } - return &da.DAClient{DA: &daClient.DA, Namespace: namespace, GasPrice: nodeConfig.DAGasPrice, Logger: logger.With("module", "da_client")}, nil + + var daImpl goDA.DA + switch u.Scheme { + case "grpc": + daClient := grpcDA.NewClient() + if err := daClient.Start(nodeConfig.DAAddress); err != nil { + return nil, fmt.Errorf("error starting grpc connection: %w", err) + } + daImpl = daClient + case "http", "https": + daClient, err := jsonrpcDA.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) + if err != nil { + return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) + } + daImpl = &daClient.DA + default: + return nil, fmt.Errorf("unknown url scheme '%s'", u.Scheme) + } + + return &da.DAClient{DA: daImpl, Namespace: namespace, GasPrice: nodeConfig.DAGasPrice, Logger: logger.With("module", "da_client")}, nil } func initMempool(logger log.Logger, proxyApp proxy.AppConns, memplMetrics *mempool.Metrics) *mempool.CListMempool { From 7c667f845c464c8fab95b37c67b0e9ee0662608f Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 00:43:13 -0700 Subject: [PATCH 14/38] fix(da): nits --- da/da_test.go | 10 +++------- node/full.go | 4 ++-- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/da/da_test.go b/da/da_test.go index d47b970fe0..b835fc921c 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "errors" - "fmt" "math/rand" "os" "testing" @@ -31,10 +30,8 @@ func TestMain(m *testing.M) { exitCode := m.Run() // teardown servers - err := srv.Stop(context.TODO()) - if err != nil { - fmt.Println(err) - } + // nolint:errcheck,gosec + srv.Stop(context.TODO()) os.Exit(exitCode) } @@ -99,8 +96,7 @@ func startMockDAServ() *proxy.Server { srv := proxy.NewServer("localhost", "7980", goDATest.NewDummyDA()) err := srv.Start(context.TODO()) if err != nil { - fmt.Println(err) - return nil + panic(err) } return srv } diff --git a/node/full.go b/node/full.go index b506f71820..649075502b 100644 --- a/node/full.go +++ b/node/full.go @@ -241,7 +241,7 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L case "grpc": daClient := grpcDA.NewClient() if err := daClient.Start(nodeConfig.DAAddress); err != nil { - return nil, fmt.Errorf("error starting grpc connection: %w", err) + return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } daImpl = daClient case "http", "https": @@ -251,7 +251,7 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L } daImpl = &daClient.DA default: - return nil, fmt.Errorf("unknown url scheme '%s'", u.Scheme) + return nil, fmt.Errorf("error while establishing connection to DA layer: unknown url scheme '%s'", u.Scheme) } return &da.DAClient{DA: daImpl, Namespace: namespace, GasPrice: nodeConfig.DAGasPrice, Logger: logger.With("module", "da_client")}, nil From fd7751995070bf5942b0d9d25509b7bd2dbea662 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 00:46:34 -0700 Subject: [PATCH 15/38] fix(da): grpc restore insecure --- node/full.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/node/full.go b/node/full.go index 649075502b..e7dca4dada 100644 --- a/node/full.go +++ b/node/full.go @@ -15,6 +15,8 @@ import ( "github.com/libp2p/go-libp2p/core/crypto" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" abci "github.com/cometbft/cometbft/abci/types" llcfg "github.com/cometbft/cometbft/config" @@ -240,7 +242,7 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L switch u.Scheme { case "grpc": daClient := grpcDA.NewClient() - if err := daClient.Start(nodeConfig.DAAddress); err != nil { + if err := daClient.Start(nodeConfig.DAAddress, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } daImpl = daClient From 7d6132f710da90c7b8081b3cfd7221dd2f953584 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 05:26:26 -0700 Subject: [PATCH 16/38] fix(da): use go-da@9f38d3 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 376ae28cd6..0fa9aab2ed 100644 --- a/go.mod +++ b/go.mod @@ -190,4 +190,4 @@ require ( lukechampine.com/blake3 v1.2.1 // indirect ) -replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240312205952-6da19b040bd8 +replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240313122451-9f38d3f26cb5 diff --git a/go.sum b/go.sum index 56322b6822..6b2a5074c2 100644 --- a/go.sum +++ b/go.sum @@ -1364,8 +1364,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rollkit/go-da v0.4.1-0.20240312205952-6da19b040bd8 h1:tRGsBTeKmopi5/0q/Dv/ieT6OlyYTL7OUA5JIcXKZs0= -github.com/rollkit/go-da v0.4.1-0.20240312205952-6da19b040bd8/go.mod h1:IxCIwpvedJwwrs900fygBsRoYCBiizBOZtwbgfs4tdU= +github.com/rollkit/go-da v0.4.1-0.20240313122451-9f38d3f26cb5 h1:wtvMngwt2BSgFNgi6iz6RrcpIhFHbvlM+29kaGZaGWI= +github.com/rollkit/go-da v0.4.1-0.20240313122451-9f38d3f26cb5/go.mod h1:VsUeAoPvKl4Y8wWguu/VibscYiFFePkkrvZWyTjZHww= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= From 6db943809d60691b8c876689baf629f5fb4609e9 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 08:52:36 -0700 Subject: [PATCH 17/38] fix(da): grpc use host --- node/full.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/full.go b/node/full.go index e7dca4dada..14aaae8cef 100644 --- a/node/full.go +++ b/node/full.go @@ -242,7 +242,7 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L switch u.Scheme { case "grpc": daClient := grpcDA.NewClient() - if err := daClient.Start(nodeConfig.DAAddress, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { + if err := daClient.Start(u.Host, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } daImpl = daClient From fb40454ed395df7665d81b104fed95814110bf12 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 09:13:02 -0700 Subject: [PATCH 18/38] fix(da): review - docs --- config/defaults.go | 2 +- da/da.md | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/config/defaults.go b/config/defaults.go index 9bed356d36..c92b2421ca 100644 --- a/config/defaults.go +++ b/config/defaults.go @@ -26,7 +26,7 @@ var DefaultNodeConfig = NodeConfig{ BlockTime: 1 * time.Second, DABlockTime: 15 * time.Second, }, - DAAddress: ":26650", + DAAddress: "grpc://localhost:26650", DAGasPrice: -1, DAGasMultiplier: -1, Light: false, diff --git a/da/da.md b/da/da.md index 7806914ea4..45cd98159a 100644 --- a/da/da.md +++ b/da/da.md @@ -4,7 +4,11 @@ Rollkit provides a wrapper for [go-da][go-da], a generic data availability inter ## Details -`DAClient` under the hood uses a json-rpc implementation of the [go-da][go-da] DA interface. Using the `DAAddress` specified in the node's config, node creates a json-rpc connection to it using go-da's json-rpc implementation [json-rpc-proxy][json-rpc-proxy] which is then used under the hood of `DAClient` to communicate with the underlying DA. +`DAClient` can connect via either gRPC or json-rpc transports using the [go-da][go-da] [proxy-grpc][proxy-grpc] or [proxy-jsonrpc][proxy-jsonrpc] implementations. The connection can be configured using the following cli flags: + +* `--rollkit.da_address`: url address of the DA service (default: "grpc://localhost:26650") +* `--rollkit.da_auth_token`: authentication token of the DA service +* `--rollkit.da_namespace`: namespace to use when submitting blobs to the DA service Given a set of blocks to be submitted to DA by the block manager, the `SubmitBlocks` first encodes the blocks using protobuf (the encoded data are called blobs) and invokes the `Submit` method on the underlying DA implementation. On successful submission (`StatusSuccess`), the DA block height which included in the rollup blocks is returned. @@ -29,9 +33,12 @@ See [da implementation] [2] [celestia-da][celestia-da] -[3] [json-rpc-proxy][json-rpc-proxy] +[3] [proxy-grpc][proxy-grpc] + +[4] [proxy-jsonrpc][proxy-jsonrpc] [da implementation]: https://github.com/rollkit/rollkit/blob/main/da/da.go [go-da]: https://github.com/rollkit/go-da [celestia-da]: https://github.com/rollkit/celestia-da -[json-rpc-proxy]: https://github.com/rollkit/go-da/tree/main/proxy +[proxy-grpc]: https://github.com/rollkit/go-da/tree/main/proxy-grpc +[proxy-jsonrpc]: https://github.com/rollkit/go-da/tree/main/proxy-jsonrpc From fe9e08fea6d02f5339dd6ad3af4de94153a7263d Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 10:03:56 -0700 Subject: [PATCH 19/38] fix(da): const mock addr, ns --- cmd/rollkit/commands/run_node.go | 28 ++++++++---- da/da_test.go | 68 ++++++++++++++++++++++++------ da/mock/cmd/main.go | 18 +++++--- node/full.go | 8 ++-- node/full_client_test.go | 26 ++++++------ node/full_node_integration_test.go | 10 ++--- node/full_node_test.go | 6 +-- node/helpers_test.go | 4 +- node/node_test.go | 2 +- rpc/json/helpers_test.go | 14 +++--- 10 files changed, 124 insertions(+), 60 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index 9427c662df..b53e16d280 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -4,6 +4,8 @@ import ( "context" "fmt" "math/rand" + "net" + "net/url" "os" cmtcmd "github.com/cometbft/cometbft/cmd/cometbft/commands" @@ -18,8 +20,10 @@ import ( cometproxy "github.com/cometbft/cometbft/proxy" comettypes "github.com/cometbft/cometbft/types" comettime "github.com/cometbft/cometbft/types/time" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" - "github.com/rollkit/go-da/proxy-jsonrpc" + "github.com/rollkit/go-da/proxy-grpc" goDATest "github.com/rollkit/go-da/test" "github.com/spf13/cobra" @@ -31,6 +35,11 @@ import ( rolltypes "github.com/rollkit/rollkit/types" ) +const ( + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" +) + var ( // initialize the config with the cometBFT defaults config = cometconf.DefaultConfig() @@ -172,7 +181,7 @@ func NewRunNodeCmd() *cobra.Command { // use mock da server by default if !cmd.Flags().Lookup("rollkit.da_address").Changed { - rollkitConfig.DAAddress = "http://localhost:7980" + rollkitConfig.DAAddress = MockDAAddress } return cmd } @@ -190,14 +199,17 @@ func addNodeFlags(cmd *cobra.Command) { } // startMockGRPCServ starts a mock gRPC server for the dummy DA -func startMockGRPCServ() *proxy.Server { - srv := proxy.NewServer("localhost", "7980", goDATest.NewDummyDA()) - err := srv.Start(context.Background()) +func startMockGRPCServ() *grpc.Server { + server := proxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) + addr, _ := url.Parse(MockDAAddress) + lis, err := net.Listen("tcp", addr.Host) if err != nil { - fmt.Println(err) - return nil + panic(err) } - return srv + go func() { + _ = server.Serve(lis) + }() + return nil } // TODO (Ferret-san): modify so that it initiates files with rollkit configurations by default diff --git a/da/da_test.go b/da/da_test.go index b835fc921c..348379a211 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -5,6 +5,8 @@ import ( "context" "errors" "math/rand" + "net" + "net/url" "os" "testing" "time" @@ -12,26 +14,40 @@ import ( "github.com/cometbft/cometbft/libs/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "github.com/rollkit/go-da" - "github.com/rollkit/go-da/proxy-jsonrpc" + proxygrpc "github.com/rollkit/go-da/proxy-grpc" + proxyjsonrpc "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/da/mock" "github.com/rollkit/rollkit/types" ) -const mockDaBlockTime = 100 * time.Millisecond +const ( + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" + // MockDAAddressHTTP is mock address for the JSONRPC server + MockDAAddressHTTP = "http://localhost:7988" + // MockDANamespace is the mock namespace + MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" + // MockDABlockTime is the mock da block time + MockDABlockTime = 100 * time.Millisecond +) func TestMain(m *testing.M) { - srv := startMockDAServ() - if srv == nil { + jsonrpcSrv := startMockDAServJSONRPC() + if jsonrpcSrv == nil { os.Exit(1) } + grpcSrv := startMockDAServGRPC() exitCode := m.Run() // teardown servers // nolint:errcheck,gosec - srv.Stop(context.TODO()) + jsonrpcSrv.Stop(context.TODO()) + grpcSrv.Stop() os.Exit(exitCode) } @@ -66,11 +82,14 @@ func TestMockDAErrors(t *testing.T) { func TestSubmitRetrieve(t *testing.T) { dummyClient := &DAClient{DA: goDATest.NewDummyDA(), GasPrice: -1, Logger: log.TestingLogger()} - rpcClient, err := startMockDAClient() + jsonrpcClient, err := startMockDAClientJSONRPC() + require.NoError(t, err) + grpcClient := startMockDAClientGRPC() require.NoError(t, err) clients := map[string]*DAClient{ - "dummy": dummyClient, - "rpc": rpcClient, + "dummy": dummyClient, + "jsonrpc": jsonrpcClient, + "grpc": grpcClient, } tests := []struct { name string @@ -92,8 +111,31 @@ func TestSubmitRetrieve(t *testing.T) { } } -func startMockDAServ() *proxy.Server { - srv := proxy.NewServer("localhost", "7980", goDATest.NewDummyDA()) +func startMockDAServGRPC() *grpc.Server { + server := proxygrpc.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) + addr, _ := url.Parse(MockDAAddress) + lis, err := net.Listen("tcp", addr.Host) + if err != nil { + panic(err) + } + go func() { + _ = server.Serve(lis) + }() + return server +} + +func startMockDAClientGRPC() *DAClient { + client := proxygrpc.NewClient() + addr, _ := url.Parse(MockDAAddress) + if err := client.Start(addr.Host, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { + panic(err) + } + return &DAClient{DA: client, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()} +} + +func startMockDAServJSONRPC() *proxyjsonrpc.Server { + addr, _ := url.Parse(MockDAAddressHTTP) + srv := proxyjsonrpc.NewServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA()) err := srv.Start(context.TODO()) if err != nil { panic(err) @@ -101,8 +143,8 @@ func startMockDAServ() *proxy.Server { return srv } -func startMockDAClient() (*DAClient, error) { - client, err := proxy.NewClient(context.TODO(), "http://localhost:7980", "") +func startMockDAClientJSONRPC() (*DAClient, error) { + client, err := proxyjsonrpc.NewClient(context.TODO(), MockDAAddressHTTP, "") if err != nil { return nil, err } @@ -168,7 +210,7 @@ func doTestSubmitRetrieve(t *testing.T, dalc *DAClient) { blocks[i] = types.GetRandomBlock(batch*numBatches+uint64(i), rand.Int()%20) //nolint:gosec } submitAndRecordBlocks(blocks) - time.Sleep(time.Duration(rand.Int63() % mockDaBlockTime.Milliseconds())) //nolint:gosec + time.Sleep(time.Duration(rand.Int63() % MockDABlockTime.Milliseconds())) //nolint:gosec } validateBlockRetrieval := func(height uint64, expectedCount int) { diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index b45b08cadd..629ec4dad2 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -4,23 +4,29 @@ import ( "context" "flag" "log" - "strconv" + "net/url" "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" ) +const ( + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" +) + func main() { var ( host string - port int + port string ) - flag.IntVar(&port, "port", 7980, "listening port") - flag.StringVar(&host, "host", "0.0.0.0", "listening address") + addr, _ := url.Parse(MockDAAddress) + flag.StringVar(&port, "port", addr.Port(), "listening port") + flag.StringVar(&host, "host", addr.Hostname(), "listening address") flag.Parse() - srv := proxy.NewServer(host, strconv.Itoa(port), goDATest.NewDummyDA()) - log.Printf("Listening on: %s:%d", host, port) + srv := proxy.NewServer(host, port, goDATest.NewDummyDA()) + log.Printf("Listening on: %s:%s", host, port) if err := srv.Start(context.Background()); err != nil { log.Fatal("error while serving:", err) } diff --git a/node/full.go b/node/full.go index 14aaae8cef..f6d2ee3cb5 100644 --- a/node/full.go +++ b/node/full.go @@ -28,8 +28,8 @@ import ( cmtypes "github.com/cometbft/cometbft/types" goDA "github.com/rollkit/go-da" - grpcDA "github.com/rollkit/go-da/proxy-grpc" - jsonrpcDA "github.com/rollkit/go-da/proxy-jsonrpc" + proxygrpc "github.com/rollkit/go-da/proxy-grpc" + proxyjsonrpc "github.com/rollkit/go-da/proxy-jsonrpc" "github.com/rollkit/rollkit/block" "github.com/rollkit/rollkit/config" @@ -241,13 +241,13 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L var daImpl goDA.DA switch u.Scheme { case "grpc": - daClient := grpcDA.NewClient() + daClient := proxygrpc.NewClient() if err := daClient.Start(u.Host, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } daImpl = daClient case "http", "https": - daClient, err := jsonrpcDA.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) + daClient, err := proxyjsonrpc.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) if err != nil { return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } diff --git a/node/full_client_test.go b/node/full_client_test.go index d05badbe67..edf96a64e7 100644 --- a/node/full_client_test.go +++ b/node/full_client_test.go @@ -69,8 +69,8 @@ func getRPC(t *testing.T) (*mocks.Application, *FullClient) { node, err := newFullNode( ctx, config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, }, key, signingKey, @@ -172,7 +172,7 @@ func TestGenesisChunked(t *testing.T) { signingKey, _, _ := crypto.GenerateEd25519Key(crand.Reader) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - n, _ := newFullNode(ctx, config.NodeConfig{DAAddress: MockServerAddr, DANamespace: MockNamespace}, privKey, signingKey, proxy.NewLocalClientCreator(mockApp), genDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), test.NewFileLogger(t)) + n, _ := newFullNode(ctx, config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace}, privKey, signingKey, proxy.NewLocalClientCreator(mockApp), genDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), test.NewFileLogger(t)) rpc := NewFullClient(n) @@ -544,8 +544,8 @@ func TestTx(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 1 * time.Second, // blocks must be at least 1 sec apart for adjacent headers to get verified correctly @@ -802,8 +802,8 @@ func TestMempool2Nodes(t *testing.T) { defer cancel() // make node1 an aggregator, so that node2 can start gracefully node1, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, P2P: config.P2PConfig{ ListenAddress: "/ip4/127.0.0.1/tcp/9001", @@ -814,8 +814,8 @@ func TestMempool2Nodes(t *testing.T) { require.NotNil(node1) node2, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, P2P: config.P2PConfig{ ListenAddress: "/ip4/127.0.0.1/tcp/9002", Seeds: "/ip4/127.0.0.1/tcp/9001/p2p/" + id1.Loggable()["peerID"].(string), @@ -877,8 +877,8 @@ func TestStatus(t *testing.T) { node, err := newFullNode( context.Background(), config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, P2P: config.P2PConfig{ ListenAddress: "/ip4/0.0.0.0/tcp/26656", }, @@ -1013,8 +1013,8 @@ func TestFutureGenesisTime(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 200 * time.Millisecond, diff --git a/node/full_node_integration_test.go b/node/full_node_integration_test.go index 649a6f3658..e62f8148a8 100644 --- a/node/full_node_integration_test.go +++ b/node/full_node_integration_test.go @@ -60,7 +60,7 @@ func TestAggregatorMode(t *testing.T) { } ctx, cancel := context.WithCancel(context.Background()) defer cancel() - node, err := newFullNode(ctx, config.NodeConfig{DAAddress: MockServerAddr, DANamespace: MockNamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig}, key, signingKey, proxy.NewLocalClientCreator(app), genesisDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) + node, err := newFullNode(ctx, config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig}, key, signingKey, proxy.NewLocalClientCreator(app), genesisDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) require.NoError(err) require.NotNil(node) @@ -183,8 +183,8 @@ func TestLazyAggregator(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := NewNode(ctx, config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig, LazyAggregator: true, @@ -648,8 +648,8 @@ func createNode(ctx context.Context, n int, aggregator bool, isLight bool, keys node, err := NewNode( ctx, config.NodeConfig{ - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, P2P: p2pConfig, Aggregator: aggregator, BlockManagerConfig: bmConfig, diff --git a/node/full_node_test.go b/node/full_node_test.go index 53a8fba4b2..3b5c784070 100644 --- a/node/full_node_test.go +++ b/node/full_node_test.go @@ -194,7 +194,7 @@ func TestPendingBlocks(t *testing.T) { dac := &da.DAClient{ DA: mockDA, - Namespace: goDA.Namespace(MockNamespace), + Namespace: goDA.Namespace(MockDANamespace), GasPrice: 1234, } dbPath, err := os.MkdirTemp("", "testdb") @@ -281,8 +281,8 @@ func createAggregatorWithPersistence(ctx context.Context, dbPath string, dalc *d ctx, config.NodeConfig{ DBPath: dbPath, - DAAddress: MockServerAddr, - DANamespace: MockNamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 100 * time.Millisecond, diff --git a/node/helpers_test.go b/node/helpers_test.go index ef583d13c0..8de9fc1ea1 100644 --- a/node/helpers_test.go +++ b/node/helpers_test.go @@ -18,8 +18,8 @@ import ( ) func getMockDA(t *testing.T) *da.DAClient { - namespace := make([]byte, len(MockNamespace)/2) - _, err := hex.Decode(namespace, []byte(MockNamespace)) + namespace := make([]byte, len(MockDANamespace)/2) + _, err := hex.Decode(namespace, []byte(MockDANamespace)) require.NoError(t, err) return &da.DAClient{DA: goDATest.NewDummyDA(), Namespace: namespace, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()} } diff --git a/node/node_test.go b/node/node_test.go index 758594c7e1..3372fab792 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -103,7 +103,7 @@ func setupTestNode(ctx context.Context, t *testing.T, nodeType NodeType) (Node, // newTestNode creates a new test node based on the NodeType. func newTestNode(ctx context.Context, t *testing.T, nodeType NodeType) (Node, ed25519.PrivKey, error) { - config := config.NodeConfig{DAAddress: MockServerAddr, DANamespace: MockNamespace} + config := config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace} switch nodeType { case Light: config.Light = true diff --git a/rpc/json/helpers_test.go b/rpc/json/helpers_test.go index 2b597b84cd..18c66476f4 100644 --- a/rpc/json/helpers_test.go +++ b/rpc/json/helpers_test.go @@ -24,16 +24,20 @@ import ( "github.com/rollkit/rollkit/types" ) +const ( + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" + + // MockDANamespace is the mock namespace + MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" +) + func prepareProposalResponse(_ context.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) { return &abci.ResponsePrepareProposal{ Txs: req.Txs, }, nil } -var MockServerAddr = "http://localhost:7980" - -var MockNamespace = "deadbeef" - // copied from rpc func getRPC(t *testing.T) (*mocks.Application, rpcclient.Client) { t.Helper() @@ -79,7 +83,7 @@ func getRPC(t *testing.T) (*mocks.Application, rpcclient.Client) { genesisValidators := []cmtypes.GenesisValidator{ {Address: pubKey.Address(), PubKey: pubKey, Power: int64(100), Name: "gen #1"}, } - n, err := node.NewNode(context.Background(), config.NodeConfig{DAAddress: MockServerAddr, DANamespace: MockNamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{BlockTime: 1 * time.Second}, Light: false}, key, signingKey, proxy.NewLocalClientCreator(app), &cmtypes.GenesisDoc{ChainID: "test", Validators: genesisValidators}, node.DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) + n, err := node.NewNode(context.Background(), config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{BlockTime: 1 * time.Second}, Light: false}, key, signingKey, proxy.NewLocalClientCreator(app), &cmtypes.GenesisDoc{ChainID: "test", Validators: genesisValidators}, node.DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) require.NoError(err) require.NotNil(n) From 5890d8bfb765012c8176739b1982d6bf005e97f6 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 15:03:45 -0700 Subject: [PATCH 20/38] fix(da): fix lint; restore status code --- cmd/rollkit/docs/rollkit_start.md | 2 +- da/da_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/rollkit/docs/rollkit_start.md b/cmd/rollkit/docs/rollkit_start.md index 1d300aded7..fd23caa27f 100644 --- a/cmd/rollkit/docs/rollkit_start.md +++ b/cmd/rollkit/docs/rollkit_start.md @@ -30,7 +30,7 @@ rollkit start [flags] --proxy_app string proxy app address, or one of: 'kvstore', 'persistent_kvstore' or 'noop' for local testing. (default "tcp://127.0.0.1:26658") --rollkit.aggregator run node in aggregator mode --rollkit.block_time duration block time (for aggregator mode) (default 1s) - --rollkit.da_address string DA address (host:port) (default ":26650") + --rollkit.da_address string DA address (host:port) (default "grpc://localhost:26650") --rollkit.da_auth_token string DA auth token --rollkit.da_block_time duration DA chain block time (for syncing) (default 15s) --rollkit.da_gas_multiplier float DA gas price multiplier for retrying blob transactions (default -1) diff --git a/da/da_test.go b/da/da_test.go index 348379a211..ad811432c2 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -308,12 +308,12 @@ func doTestSubmitLargeBlocksOverflow(t *testing.T, dalc *DAClient) { // overflowing blocks submit partially resp := dalc.SubmitBlocks(ctx, []*types.Block{block1, block2}, limit, -1) - assert.Equal(resp.Message, "", "overflowing blocks should submit partially") + assert.Equal(StatusSuccess, resp.Code, "overflowing blocks should submit partially") assert.EqualValues(1, resp.SubmittedCount, "submitted count should be partial") // retry remaining blocks resp = dalc.SubmitBlocks(ctx, []*types.Block{block2}, limit, -1) - assert.Equal(resp.Message, "", "remaining blocks should submit") + assert.Equal(StatusSuccess, resp.Code, "remaining blocks should submit") assert.EqualValues(resp.SubmittedCount, 1, "submitted count should match") } From da26af43cfa6472a25d875be1637faf776c0f9c5 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 15:12:00 -0700 Subject: [PATCH 21/38] fix(da): fix lint --- da/da.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/da/da.md b/da/da.md index 45cd98159a..0dbf7663f9 100644 --- a/da/da.md +++ b/da/da.md @@ -4,7 +4,7 @@ Rollkit provides a wrapper for [go-da][go-da], a generic data availability inter ## Details -`DAClient` can connect via either gRPC or json-rpc transports using the [go-da][go-da] [proxy-grpc][proxy-grpc] or [proxy-jsonrpc][proxy-jsonrpc] implementations. The connection can be configured using the following cli flags: +`DAClient` can connect via either gRPC or JSON-RPC transports using the [go-da][go-da] [proxy-grpc][proxy-grpc] or [proxy-jsonrpc][proxy-jsonrpc] implementations. The connection can be configured using the following cli flags: * `--rollkit.da_address`: url address of the DA service (default: "grpc://localhost:26650") * `--rollkit.da_auth_token`: authentication token of the DA service @@ -40,5 +40,5 @@ See [da implementation] [da implementation]: https://github.com/rollkit/rollkit/blob/main/da/da.go [go-da]: https://github.com/rollkit/go-da [celestia-da]: https://github.com/rollkit/celestia-da -[proxy-grpc]: https://github.com/rollkit/go-da/tree/main/proxy-grpc -[proxy-jsonrpc]: https://github.com/rollkit/go-da/tree/main/proxy-jsonrpc +[proxy-grpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy-grpc +[proxy-jsonrpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy-jsonrpc From 831fdb2466afae0889f33a018abde8a42a726f94 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 15:30:15 -0700 Subject: [PATCH 22/38] fix(da): mock da srv handle ctrl+c --- da/mock/cmd/main.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index 629ec4dad2..052ffe07a6 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -3,8 +3,12 @@ package main import ( "context" "flag" + "fmt" "log" "net/url" + "os" + "os/signal" + "syscall" "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" @@ -30,4 +34,10 @@ func main() { if err := srv.Start(context.Background()); err != nil { log.Fatal("error while serving:", err) } + + interrupt := make(chan os.Signal, 1) + signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) + <-interrupt + fmt.Println("\nCtrl+C pressed. Exiting...") + os.Exit(0) } From acb32d68e0ace1f399537d2f45985e82bd250ab5 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 15:59:47 -0700 Subject: [PATCH 23/38] fix(da): da client constructor; default timeouts --- block/manager_test.go | 2 +- da/da.go | 39 +++++++++++++++++++++++++++------------ da/da_test.go | 14 ++++++-------- node/full.go | 3 ++- node/full_node_test.go | 6 +----- node/helpers_test.go | 2 +- 6 files changed, 38 insertions(+), 28 deletions(-) diff --git a/block/manager_test.go b/block/manager_test.go index bfe291ec40..a85c58f2a5 100644 --- a/block/manager_test.go +++ b/block/manager_test.go @@ -30,7 +30,7 @@ import ( func getManager(t *testing.T, backend goDA.DA) *Manager { logger := test.NewFileLoggerCustom(t, test.TempLogFileName(t, t.Name())) return &Manager{ - dalc: &da.DAClient{DA: backend, GasPrice: -1, GasMultiplier: -1, Logger: logger}, + dalc: da.NewDAClient(backend, -1, -1, nil, logger), blockCache: NewBlockCache(), logger: logger, } diff --git a/da/da.go b/da/da.go index 96a50ef778..a325830ae9 100644 --- a/da/da.go +++ b/da/da.go @@ -16,12 +16,12 @@ import ( pb "github.com/rollkit/rollkit/types/pb/rollkit" ) -var ( - // submitTimeout is the timeout for block submission - submitTimeout = 60 * time.Second +const ( + // defaultSubmitTimeout is the timeout for block submission + defaultSubmitTimeout = 60 * time.Second - // retrieveTimeout is the timeout for block retrieval - retrieveTimeout = 60 * time.Second + // defaultRetrieveTimeout is the timeout for block retrieval + defaultRetrieveTimeout = 60 * time.Second ) var ( @@ -95,11 +95,26 @@ type ResultRetrieveBlocks struct { // DAClient is a new DA implementation. type DAClient struct { - DA goDA.DA - GasPrice float64 - GasMultiplier float64 - Namespace goDA.Namespace - Logger log.Logger + DA goDA.DA + GasPrice float64 + GasMultiplier float64 + Namespace goDA.Namespace + SubmitTimeout time.Duration + RetrieveTimeout time.Duration + Logger log.Logger +} + +// NewDAClient returns a new DA client. +func NewDAClient(da goDA.DA, gasPrice, gasMultiplier float64, ns goDA.Namespace, logger log.Logger) *DAClient { + return &DAClient{ + DA: da, + GasPrice: gasPrice, + GasMultiplier: gasMultiplier, + Namespace: ns, + SubmitTimeout: defaultSubmitTimeout, + RetrieveTimeout: defaultRetrieveTimeout, + Logger: logger, + } } // SubmitBlocks submits blocks to DA. @@ -133,7 +148,7 @@ func (dac *DAClient) SubmitBlocks(ctx context.Context, blocks []*types.Block, ma }, } } - ctx, cancel := context.WithTimeout(ctx, submitTimeout) + ctx, cancel := context.WithTimeout(ctx, dac.SubmitTimeout) defer cancel() ids, err := dac.DA.Submit(ctx, blobs, gasPrice, dac.Namespace) if err != nil { @@ -200,7 +215,7 @@ func (dac *DAClient) RetrieveBlocks(ctx context.Context, dataLayerHeight uint64) } } - ctx, cancel := context.WithTimeout(ctx, retrieveTimeout) + ctx, cancel := context.WithTimeout(ctx, dac.RetrieveTimeout) defer cancel() blobs, err := dac.DA.Get(ctx, ids, dac.Namespace) if err != nil { diff --git a/da/da_test.go b/da/da_test.go index ad811432c2..b69617b00d 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -55,7 +55,7 @@ func TestMain(m *testing.M) { func TestMockDAErrors(t *testing.T) { t.Run("submit_timeout", func(t *testing.T) { mockDA := &mock.MockDA{} - dalc := &DAClient{DA: mockDA, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()} + dalc := NewDAClient(mockDA, -1, -1, nil, log.TestingLogger()) blocks := []*types.Block{types.GetRandomBlock(1, 0)} var blobs []da.Blob for _, block := range blocks { @@ -73,7 +73,7 @@ func TestMockDAErrors(t *testing.T) { }) t.Run("max_blob_size_error", func(t *testing.T) { mockDA := &mock.MockDA{} - dalc := &DAClient{DA: mockDA, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()} + dalc := NewDAClient(mockDA, -1, -1, nil, log.TestingLogger()) // Set up the mock to return an error for MaxBlobSize mockDA.On("MaxBlobSize").Return(uint64(0), errors.New("unable to get DA max blob size")) doTestMaxBlockSizeError(t, dalc) @@ -81,7 +81,7 @@ func TestMockDAErrors(t *testing.T) { } func TestSubmitRetrieve(t *testing.T) { - dummyClient := &DAClient{DA: goDATest.NewDummyDA(), GasPrice: -1, Logger: log.TestingLogger()} + dummyClient := NewDAClient(goDATest.NewDummyDA(), -1, -1, nil, log.TestingLogger()) jsonrpcClient, err := startMockDAClientJSONRPC() require.NoError(t, err) grpcClient := startMockDAClientGRPC() @@ -130,7 +130,7 @@ func startMockDAClientGRPC() *DAClient { if err := client.Start(addr.Host, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { panic(err) } - return &DAClient{DA: client, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()} + return NewDAClient(client, -1, -1, nil, log.TestingLogger()) } func startMockDAServJSONRPC() *proxyjsonrpc.Server { @@ -148,7 +148,7 @@ func startMockDAClientJSONRPC() (*DAClient, error) { if err != nil { return nil, err } - return &DAClient{DA: &client.DA, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()}, nil + return NewDAClient(&client.DA, -1, -1, nil, log.TestingLogger()), nil } func doTestSubmitTimeout(t *testing.T, dalc *DAClient, blocks []*types.Block) { @@ -159,9 +159,7 @@ func doTestSubmitTimeout(t *testing.T, dalc *DAClient, blocks []*types.Block) { require.NoError(t, err) assert := assert.New(t) - defaultSubmitTimeout := submitTimeout - submitTimeout = 50 * time.Millisecond - defer func() { submitTimeout = defaultSubmitTimeout }() + dalc.SubmitTimeout = 50 * time.Millisecond resp := dalc.SubmitBlocks(ctx, blocks, maxBlobSize, -1) assert.Contains(resp.Message, "context deadline exceeded", "should return context timeout error") } diff --git a/node/full.go b/node/full.go index f6d2ee3cb5..08443da035 100644 --- a/node/full.go +++ b/node/full.go @@ -256,7 +256,8 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L return nil, fmt.Errorf("error while establishing connection to DA layer: unknown url scheme '%s'", u.Scheme) } - return &da.DAClient{DA: daImpl, Namespace: namespace, GasPrice: nodeConfig.DAGasPrice, Logger: logger.With("module", "da_client")}, nil + return da.NewDAClient(daImpl, nodeConfig.DAGasPrice, nodeConfig.DAGasMultiplier, + namespace, logger.With("module", "da_client")), nil } func initMempool(logger log.Logger, proxyApp proxy.AppConns, memplMetrics *mempool.Metrics) *mempool.CListMempool { diff --git a/node/full_node_test.go b/node/full_node_test.go index 3b5c784070..52556cb568 100644 --- a/node/full_node_test.go +++ b/node/full_node_test.go @@ -192,11 +192,7 @@ func TestPendingBlocks(t *testing.T) { mockDA.On("MaxBlobSize", mock.Anything).Return(uint64(10240), nil) mockDA.On("Submit", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("DA not available")) - dac := &da.DAClient{ - DA: mockDA, - Namespace: goDA.Namespace(MockDANamespace), - GasPrice: 1234, - } + dac := da.NewDAClient(mockDA, 1234, -1, goDA.Namespace(MockDANamespace), nil) dbPath, err := os.MkdirTemp("", "testdb") require.NoError(t, err) defer func() { diff --git a/node/helpers_test.go b/node/helpers_test.go index 8de9fc1ea1..938307f94d 100644 --- a/node/helpers_test.go +++ b/node/helpers_test.go @@ -21,7 +21,7 @@ func getMockDA(t *testing.T) *da.DAClient { namespace := make([]byte, len(MockDANamespace)/2) _, err := hex.Decode(namespace, []byte(MockDANamespace)) require.NoError(t, err) - return &da.DAClient{DA: goDATest.NewDummyDA(), Namespace: namespace, GasPrice: -1, GasMultiplier: -1, Logger: log.TestingLogger()} + return da.NewDAClient(goDATest.NewDummyDA(), -1, -1, namespace, log.TestingLogger()) } func TestMockTester(t *testing.T) { From 4aee54b6cb2fc2d759c5be89408f74a16071bd94 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 16:20:38 -0700 Subject: [PATCH 24/38] fix(da): explain static ports --- da/da_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/da/da_test.go b/da/da_test.go index b69617b00d..b02ff6f9c0 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -36,6 +36,11 @@ const ( MockDABlockTime = 100 * time.Millisecond ) +// TestMain starts the mock gRPC and JSONRPC DA services +// gRPC service listens on MockDAAddress +// JSONRPC service listen on MockDAAddressHTTP +// Ports were chosen to be sufficiently different from defaults (26650, 26658) +// Static ports are used to keep client configuration simple func TestMain(m *testing.M) { jsonrpcSrv := startMockDAServJSONRPC() if jsonrpcSrv == nil { From 617df524d9a5a7b9101648636bbfc640b4003fd3 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 16:41:43 -0700 Subject: [PATCH 25/38] fix(da): pass context with timeout --- da/da_test.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/da/da_test.go b/da/da_test.go index b02ff6f9c0..8f14c6a5f0 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -38,11 +38,13 @@ const ( // TestMain starts the mock gRPC and JSONRPC DA services // gRPC service listens on MockDAAddress -// JSONRPC service listen on MockDAAddressHTTP +// JSONRPC service listens on MockDAAddressHTTP // Ports were chosen to be sufficiently different from defaults (26650, 26658) // Static ports are used to keep client configuration simple func TestMain(m *testing.M) { - jsonrpcSrv := startMockDAServJSONRPC() + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + jsonrpcSrv := startMockDAServJSONRPC(ctx) if jsonrpcSrv == nil { os.Exit(1) } @@ -51,7 +53,7 @@ func TestMain(m *testing.M) { // teardown servers // nolint:errcheck,gosec - jsonrpcSrv.Stop(context.TODO()) + jsonrpcSrv.Stop(context.Background()) grpcSrv.Stop() os.Exit(exitCode) @@ -86,8 +88,10 @@ func TestMockDAErrors(t *testing.T) { } func TestSubmitRetrieve(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() dummyClient := NewDAClient(goDATest.NewDummyDA(), -1, -1, nil, log.TestingLogger()) - jsonrpcClient, err := startMockDAClientJSONRPC() + jsonrpcClient, err := startMockDAClientJSONRPC(ctx) require.NoError(t, err) grpcClient := startMockDAClientGRPC() require.NoError(t, err) @@ -138,18 +142,18 @@ func startMockDAClientGRPC() *DAClient { return NewDAClient(client, -1, -1, nil, log.TestingLogger()) } -func startMockDAServJSONRPC() *proxyjsonrpc.Server { +func startMockDAServJSONRPC(ctx context.Context) *proxyjsonrpc.Server { addr, _ := url.Parse(MockDAAddressHTTP) srv := proxyjsonrpc.NewServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA()) - err := srv.Start(context.TODO()) + err := srv.Start(ctx) if err != nil { panic(err) } return srv } -func startMockDAClientJSONRPC() (*DAClient, error) { - client, err := proxyjsonrpc.NewClient(context.TODO(), MockDAAddressHTTP, "") +func startMockDAClientJSONRPC(ctx context.Context) (*DAClient, error) { + client, err := proxyjsonrpc.NewClient(ctx, MockDAAddressHTTP, "") if err != nil { return nil, err } From 2406079e3e18efecba9cae303ba3077d53bd42b0 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 17:00:06 -0700 Subject: [PATCH 26/38] fix(da): move consts to mocks pkg --- cmd/rollkit/commands/run_node.go | 10 +++------- da/da_test.go | 15 +++++---------- da/mock/cmd/main.go | 8 ++------ node/full_client_test.go | 26 +++++++++++++------------- node/full_node_integration_test.go | 10 +++++----- node/full_node_test.go | 6 +++--- node/helpers_test.go | 5 +++-- node/node_test.go | 3 ++- rpc/json/helpers_test.go | 10 +--------- test/mocks/util.go | 10 ++++++++++ 10 files changed, 47 insertions(+), 56 deletions(-) create mode 100644 test/mocks/util.go diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index b53e16d280..e240e82439 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -32,14 +32,10 @@ import ( rollconf "github.com/rollkit/rollkit/config" rollnode "github.com/rollkit/rollkit/node" rollrpc "github.com/rollkit/rollkit/rpc" + "github.com/rollkit/rollkit/test/mocks" rolltypes "github.com/rollkit/rollkit/types" ) -const ( - // MockDAAddress is the mock address for the gRPC server - MockDAAddress = "grpc://localhost:7980" -) - var ( // initialize the config with the cometBFT defaults config = cometconf.DefaultConfig() @@ -181,7 +177,7 @@ func NewRunNodeCmd() *cobra.Command { // use mock da server by default if !cmd.Flags().Lookup("rollkit.da_address").Changed { - rollkitConfig.DAAddress = MockDAAddress + rollkitConfig.DAAddress = mocks.MockDAAddress } return cmd } @@ -201,7 +197,7 @@ func addNodeFlags(cmd *cobra.Command) { // startMockGRPCServ starts a mock gRPC server for the dummy DA func startMockGRPCServ() *grpc.Server { server := proxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - addr, _ := url.Parse(MockDAAddress) + addr, _ := url.Parse(mocks.MockDAAddress) lis, err := net.Listen("tcp", addr.Host) if err != nil { panic(err) diff --git a/da/da_test.go b/da/da_test.go index 8f14c6a5f0..dd6d25164f 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -22,16 +22,11 @@ import ( proxyjsonrpc "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/da/mock" + "github.com/rollkit/rollkit/test/mocks" "github.com/rollkit/rollkit/types" ) const ( - // MockDAAddress is the mock address for the gRPC server - MockDAAddress = "grpc://localhost:7980" - // MockDAAddressHTTP is mock address for the JSONRPC server - MockDAAddressHTTP = "http://localhost:7988" - // MockDANamespace is the mock namespace - MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" // MockDABlockTime is the mock da block time MockDABlockTime = 100 * time.Millisecond ) @@ -122,7 +117,7 @@ func TestSubmitRetrieve(t *testing.T) { func startMockDAServGRPC() *grpc.Server { server := proxygrpc.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - addr, _ := url.Parse(MockDAAddress) + addr, _ := url.Parse(mocks.MockDAAddress) lis, err := net.Listen("tcp", addr.Host) if err != nil { panic(err) @@ -135,7 +130,7 @@ func startMockDAServGRPC() *grpc.Server { func startMockDAClientGRPC() *DAClient { client := proxygrpc.NewClient() - addr, _ := url.Parse(MockDAAddress) + addr, _ := url.Parse(mocks.MockDAAddress) if err := client.Start(addr.Host, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { panic(err) } @@ -143,7 +138,7 @@ func startMockDAClientGRPC() *DAClient { } func startMockDAServJSONRPC(ctx context.Context) *proxyjsonrpc.Server { - addr, _ := url.Parse(MockDAAddressHTTP) + addr, _ := url.Parse(mocks.MockDAAddressHTTP) srv := proxyjsonrpc.NewServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA()) err := srv.Start(ctx) if err != nil { @@ -153,7 +148,7 @@ func startMockDAServJSONRPC(ctx context.Context) *proxyjsonrpc.Server { } func startMockDAClientJSONRPC(ctx context.Context) (*DAClient, error) { - client, err := proxyjsonrpc.NewClient(ctx, MockDAAddressHTTP, "") + client, err := proxyjsonrpc.NewClient(ctx, mocks.MockDAAddressHTTP, "") if err != nil { return nil, err } diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index 052ffe07a6..650fbe81f3 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -12,11 +12,7 @@ import ( "github.com/rollkit/go-da/proxy-jsonrpc" goDATest "github.com/rollkit/go-da/test" -) - -const ( - // MockDAAddress is the mock address for the gRPC server - MockDAAddress = "grpc://localhost:7980" + "github.com/rollkit/rollkit/test/mocks" ) func main() { @@ -24,7 +20,7 @@ func main() { host string port string ) - addr, _ := url.Parse(MockDAAddress) + addr, _ := url.Parse(mocks.MockDAAddress) flag.StringVar(&port, "port", addr.Port(), "listening port") flag.StringVar(&host, "host", addr.Hostname(), "listening address") flag.Parse() diff --git a/node/full_client_test.go b/node/full_client_test.go index edf96a64e7..8d1ae1a22a 100644 --- a/node/full_client_test.go +++ b/node/full_client_test.go @@ -69,8 +69,8 @@ func getRPC(t *testing.T) (*mocks.Application, *FullClient) { node, err := newFullNode( ctx, config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, }, key, signingKey, @@ -172,7 +172,7 @@ func TestGenesisChunked(t *testing.T) { signingKey, _, _ := crypto.GenerateEd25519Key(crand.Reader) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - n, _ := newFullNode(ctx, config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace}, privKey, signingKey, proxy.NewLocalClientCreator(mockApp), genDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), test.NewFileLogger(t)) + n, _ := newFullNode(ctx, config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace}, privKey, signingKey, proxy.NewLocalClientCreator(mockApp), genDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), test.NewFileLogger(t)) rpc := NewFullClient(n) @@ -544,8 +544,8 @@ func TestTx(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 1 * time.Second, // blocks must be at least 1 sec apart for adjacent headers to get verified correctly @@ -802,8 +802,8 @@ func TestMempool2Nodes(t *testing.T) { defer cancel() // make node1 an aggregator, so that node2 can start gracefully node1, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, Aggregator: true, P2P: config.P2PConfig{ ListenAddress: "/ip4/127.0.0.1/tcp/9001", @@ -814,8 +814,8 @@ func TestMempool2Nodes(t *testing.T) { require.NotNil(node1) node2, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, P2P: config.P2PConfig{ ListenAddress: "/ip4/127.0.0.1/tcp/9002", Seeds: "/ip4/127.0.0.1/tcp/9001/p2p/" + id1.Loggable()["peerID"].(string), @@ -877,8 +877,8 @@ func TestStatus(t *testing.T) { node, err := newFullNode( context.Background(), config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, P2P: config.P2PConfig{ ListenAddress: "/ip4/0.0.0.0/tcp/26656", }, @@ -1013,8 +1013,8 @@ func TestFutureGenesisTime(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 200 * time.Millisecond, diff --git a/node/full_node_integration_test.go b/node/full_node_integration_test.go index e62f8148a8..fe3b0e4330 100644 --- a/node/full_node_integration_test.go +++ b/node/full_node_integration_test.go @@ -60,7 +60,7 @@ func TestAggregatorMode(t *testing.T) { } ctx, cancel := context.WithCancel(context.Background()) defer cancel() - node, err := newFullNode(ctx, config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig}, key, signingKey, proxy.NewLocalClientCreator(app), genesisDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) + node, err := newFullNode(ctx, config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig}, key, signingKey, proxy.NewLocalClientCreator(app), genesisDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) require.NoError(err) require.NotNil(node) @@ -183,8 +183,8 @@ func TestLazyAggregator(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := NewNode(ctx, config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig, LazyAggregator: true, @@ -648,8 +648,8 @@ func createNode(ctx context.Context, n int, aggregator bool, isLight bool, keys node, err := NewNode( ctx, config.NodeConfig{ - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, P2P: p2pConfig, Aggregator: aggregator, BlockManagerConfig: bmConfig, diff --git a/node/full_node_test.go b/node/full_node_test.go index 52556cb568..0fa3b10504 100644 --- a/node/full_node_test.go +++ b/node/full_node_test.go @@ -192,7 +192,7 @@ func TestPendingBlocks(t *testing.T) { mockDA.On("MaxBlobSize", mock.Anything).Return(uint64(10240), nil) mockDA.On("Submit", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("DA not available")) - dac := da.NewDAClient(mockDA, 1234, -1, goDA.Namespace(MockDANamespace), nil) + dac := da.NewDAClient(mockDA, 1234, -1, goDA.Namespace(mocks.MockDANamespace), nil) dbPath, err := os.MkdirTemp("", "testdb") require.NoError(t, err) defer func() { @@ -277,8 +277,8 @@ func createAggregatorWithPersistence(ctx context.Context, dbPath string, dalc *d ctx, config.NodeConfig{ DBPath: dbPath, - DAAddress: MockDAAddress, - DANamespace: MockDANamespace, + DAAddress: mocks.MockDAAddress, + DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 100 * time.Millisecond, diff --git a/node/helpers_test.go b/node/helpers_test.go index 938307f94d..29a672b5e9 100644 --- a/node/helpers_test.go +++ b/node/helpers_test.go @@ -15,11 +15,12 @@ import ( goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/da" + "github.com/rollkit/rollkit/test/mocks" ) func getMockDA(t *testing.T) *da.DAClient { - namespace := make([]byte, len(MockDANamespace)/2) - _, err := hex.Decode(namespace, []byte(MockDANamespace)) + namespace := make([]byte, len(mocks.MockDANamespace)/2) + _, err := hex.Decode(namespace, []byte(mocks.MockDANamespace)) require.NoError(t, err) return da.NewDAClient(goDATest.NewDummyDA(), -1, -1, namespace, log.TestingLogger()) } diff --git a/node/node_test.go b/node/node_test.go index 3372fab792..c304d84233 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -15,6 +15,7 @@ import ( "github.com/rollkit/rollkit/config" test "github.com/rollkit/rollkit/test/log" + "github.com/rollkit/rollkit/test/mocks" "github.com/rollkit/rollkit/types" "google.golang.org/grpc" @@ -103,7 +104,7 @@ func setupTestNode(ctx context.Context, t *testing.T, nodeType NodeType) (Node, // newTestNode creates a new test node based on the NodeType. func newTestNode(ctx context.Context, t *testing.T, nodeType NodeType) (Node, ed25519.PrivKey, error) { - config := config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace} + config := config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace} switch nodeType { case Light: config.Light = true diff --git a/rpc/json/helpers_test.go b/rpc/json/helpers_test.go index 18c66476f4..d1cbd0cf7c 100644 --- a/rpc/json/helpers_test.go +++ b/rpc/json/helpers_test.go @@ -24,14 +24,6 @@ import ( "github.com/rollkit/rollkit/types" ) -const ( - // MockDAAddress is the mock address for the gRPC server - MockDAAddress = "grpc://localhost:7980" - - // MockDANamespace is the mock namespace - MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" -) - func prepareProposalResponse(_ context.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) { return &abci.ResponsePrepareProposal{ Txs: req.Txs, @@ -83,7 +75,7 @@ func getRPC(t *testing.T) (*mocks.Application, rpcclient.Client) { genesisValidators := []cmtypes.GenesisValidator{ {Address: pubKey.Address(), PubKey: pubKey, Power: int64(100), Name: "gen #1"}, } - n, err := node.NewNode(context.Background(), config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{BlockTime: 1 * time.Second}, Light: false}, key, signingKey, proxy.NewLocalClientCreator(app), &cmtypes.GenesisDoc{ChainID: "test", Validators: genesisValidators}, node.DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) + n, err := node.NewNode(context.Background(), config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{BlockTime: 1 * time.Second}, Light: false}, key, signingKey, proxy.NewLocalClientCreator(app), &cmtypes.GenesisDoc{ChainID: "test", Validators: genesisValidators}, node.DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) require.NoError(err) require.NotNil(n) diff --git a/test/mocks/util.go b/test/mocks/util.go new file mode 100644 index 0000000000..d09a88990c --- /dev/null +++ b/test/mocks/util.go @@ -0,0 +1,10 @@ +package mocks + +const ( + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" + // MockDAAddressHTTP is mock address for the JSONRPC server + MockDAAddressHTTP = "http://localhost:7988" + // MockDANamespace is the mock namespace + MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" +) From b78dbcab39f183c7b28780b6ae058cb7a6c35397 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Wed, 13 Mar 2024 17:21:11 -0700 Subject: [PATCH 27/38] fix(da): use go-da@f70db8ef --- go.mod | 2 +- go.sum | 4 ++-- node/full.go | 31 ++++--------------------------- 3 files changed, 7 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 0fa9aab2ed..e42d5cb564 100644 --- a/go.mod +++ b/go.mod @@ -190,4 +190,4 @@ require ( lukechampine.com/blake3 v1.2.1 // indirect ) -replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240313122451-9f38d3f26cb5 +replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240314002443-f70db8efa5a2 diff --git a/go.sum b/go.sum index 6b2a5074c2..d4f8baa83a 100644 --- a/go.sum +++ b/go.sum @@ -1364,8 +1364,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rollkit/go-da v0.4.1-0.20240313122451-9f38d3f26cb5 h1:wtvMngwt2BSgFNgi6iz6RrcpIhFHbvlM+29kaGZaGWI= -github.com/rollkit/go-da v0.4.1-0.20240313122451-9f38d3f26cb5/go.mod h1:VsUeAoPvKl4Y8wWguu/VibscYiFFePkkrvZWyTjZHww= +github.com/rollkit/go-da v0.4.1-0.20240314002443-f70db8efa5a2 h1:LDVyw0ZC3TcIjvZHMQLvev9pD2Sh4Ien7ZHDRORblps= +github.com/rollkit/go-da v0.4.1-0.20240314002443-f70db8efa5a2/go.mod h1:VsUeAoPvKl4Y8wWguu/VibscYiFFePkkrvZWyTjZHww= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= diff --git a/node/full.go b/node/full.go index 08443da035..497e3d9edc 100644 --- a/node/full.go +++ b/node/full.go @@ -8,15 +8,12 @@ import ( "errors" "fmt" "net/http" - "net/url" ds "github.com/ipfs/go-datastore" ktds "github.com/ipfs/go-datastore/keytransform" "github.com/libp2p/go-libp2p/core/crypto" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" abci "github.com/cometbft/cometbft/abci/types" llcfg "github.com/cometbft/cometbft/config" @@ -27,9 +24,7 @@ import ( rpcclient "github.com/cometbft/cometbft/rpc/client" cmtypes "github.com/cometbft/cometbft/types" - goDA "github.com/rollkit/go-da" - proxygrpc "github.com/rollkit/go-da/proxy-grpc" - proxyjsonrpc "github.com/rollkit/go-da/proxy-jsonrpc" + proxyda "github.com/rollkit/go-da/proxy" "github.com/rollkit/rollkit/block" "github.com/rollkit/rollkit/config" @@ -233,30 +228,12 @@ func initDALC(nodeConfig config.NodeConfig, dalcKV ds.TxnDatastore, logger log.L return nil, fmt.Errorf("error decoding namespace: %w", err) } - u, err := url.Parse(nodeConfig.DAAddress) + client, err := proxyda.NewClient(nodeConfig.DAAddress, nodeConfig.DAAuthToken) if err != nil { - return nil, fmt.Errorf("error parsing DA address url: %w", err) + return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) } - var daImpl goDA.DA - switch u.Scheme { - case "grpc": - daClient := proxygrpc.NewClient() - if err := daClient.Start(u.Host, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { - return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) - } - daImpl = daClient - case "http", "https": - daClient, err := proxyjsonrpc.NewClient(context.Background(), nodeConfig.DAAddress, nodeConfig.DAAuthToken) - if err != nil { - return nil, fmt.Errorf("error while establishing connection to DA layer: %w", err) - } - daImpl = &daClient.DA - default: - return nil, fmt.Errorf("error while establishing connection to DA layer: unknown url scheme '%s'", u.Scheme) - } - - return da.NewDAClient(daImpl, nodeConfig.DAGasPrice, nodeConfig.DAGasMultiplier, + return da.NewDAClient(client, nodeConfig.DAGasPrice, nodeConfig.DAGasMultiplier, namespace, logger.With("module", "da_client")), nil } From aefa93e27b0a71485af4580c538d94399ef3f404 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Thu, 14 Mar 2024 13:22:35 -0700 Subject: [PATCH 28/38] fix(da): use go-da@766d5ecc --- cmd/rollkit/commands/run_node.go | 2 +- da/da_test.go | 4 ++-- da/mock/cmd/main.go | 2 +- go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index e240e82439..97b9232a5a 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -23,7 +23,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" - "github.com/rollkit/go-da/proxy-grpc" + proxy "github.com/rollkit/go-da/proxy/grpc" goDATest "github.com/rollkit/go-da/test" "github.com/spf13/cobra" diff --git a/da/da_test.go b/da/da_test.go index dd6d25164f..6ca7884224 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -18,8 +18,8 @@ import ( "google.golang.org/grpc/credentials/insecure" "github.com/rollkit/go-da" - proxygrpc "github.com/rollkit/go-da/proxy-grpc" - proxyjsonrpc "github.com/rollkit/go-da/proxy-jsonrpc" + proxygrpc "github.com/rollkit/go-da/proxy/grpc" + proxyjsonrpc "github.com/rollkit/go-da/proxy/jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/da/mock" "github.com/rollkit/rollkit/test/mocks" diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index 650fbe81f3..7213ae8056 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -10,7 +10,7 @@ import ( "os/signal" "syscall" - "github.com/rollkit/go-da/proxy-jsonrpc" + proxy "github.com/rollkit/go-da/proxy/jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/test/mocks" ) diff --git a/go.mod b/go.mod index e42d5cb564..e13f6b1fdc 100644 --- a/go.mod +++ b/go.mod @@ -190,4 +190,4 @@ require ( lukechampine.com/blake3 v1.2.1 // indirect ) -replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240314002443-f70db8efa5a2 +replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240314201619-766d5eccdbce diff --git a/go.sum b/go.sum index d4f8baa83a..f9583a813b 100644 --- a/go.sum +++ b/go.sum @@ -1364,8 +1364,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rollkit/go-da v0.4.1-0.20240314002443-f70db8efa5a2 h1:LDVyw0ZC3TcIjvZHMQLvev9pD2Sh4Ien7ZHDRORblps= -github.com/rollkit/go-da v0.4.1-0.20240314002443-f70db8efa5a2/go.mod h1:VsUeAoPvKl4Y8wWguu/VibscYiFFePkkrvZWyTjZHww= +github.com/rollkit/go-da v0.4.1-0.20240314201619-766d5eccdbce h1:PbpCBVoPZXwXlTSoiyJYyQkcD21WmpJVkorZnOHW5Mg= +github.com/rollkit/go-da v0.4.1-0.20240314201619-766d5eccdbce/go.mod h1:VsUeAoPvKl4Y8wWguu/VibscYiFFePkkrvZWyTjZHww= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= From f24df424588d7e3d62a6dd9dfec945f6d1ffc6b8 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Fri, 15 Mar 2024 06:33:37 -0700 Subject: [PATCH 29/38] fix(da): da address default http --- cmd/rollkit/commands/run_node.go | 14 +++++--------- cmd/rollkit/docs/rollkit_start.md | 2 +- config/defaults.go | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index 97b9232a5a..30ec3d2034 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -32,7 +32,6 @@ import ( rollconf "github.com/rollkit/rollkit/config" rollnode "github.com/rollkit/rollkit/node" rollrpc "github.com/rollkit/rollkit/rpc" - "github.com/rollkit/rollkit/test/mocks" rolltypes "github.com/rollkit/rollkit/types" ) @@ -131,8 +130,10 @@ func NewRunNodeCmd() *cobra.Command { return fmt.Errorf("failed to create new rollkit node: %w", err) } - // start mock da server - startMockGRPCServ() + // start mock da server if we are using the default da address + if !cmd.Flags().Lookup("rollkit.da_address").Changed { + startMockGRPCServ() + } // Launch the RPC server server := rollrpc.NewServer(rollnode, config.RPC, logger) @@ -174,11 +175,6 @@ func NewRunNodeCmd() *cobra.Command { if !cmd.Flags().Lookup("rollkit.aggregator").Changed { rollkitConfig.Aggregator = true } - - // use mock da server by default - if !cmd.Flags().Lookup("rollkit.da_address").Changed { - rollkitConfig.DAAddress = mocks.MockDAAddress - } return cmd } @@ -197,7 +193,7 @@ func addNodeFlags(cmd *cobra.Command) { // startMockGRPCServ starts a mock gRPC server for the dummy DA func startMockGRPCServ() *grpc.Server { server := proxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - addr, _ := url.Parse(mocks.MockDAAddress) + addr, _ := url.Parse(rollkitConfig.DAAddress) lis, err := net.Listen("tcp", addr.Host) if err != nil { panic(err) diff --git a/cmd/rollkit/docs/rollkit_start.md b/cmd/rollkit/docs/rollkit_start.md index fd23caa27f..e3922113c9 100644 --- a/cmd/rollkit/docs/rollkit_start.md +++ b/cmd/rollkit/docs/rollkit_start.md @@ -30,7 +30,7 @@ rollkit start [flags] --proxy_app string proxy app address, or one of: 'kvstore', 'persistent_kvstore' or 'noop' for local testing. (default "tcp://127.0.0.1:26658") --rollkit.aggregator run node in aggregator mode --rollkit.block_time duration block time (for aggregator mode) (default 1s) - --rollkit.da_address string DA address (host:port) (default "grpc://localhost:26650") + --rollkit.da_address string DA address (host:port) (default "http://localhost:26658") --rollkit.da_auth_token string DA auth token --rollkit.da_block_time duration DA chain block time (for syncing) (default 15s) --rollkit.da_gas_multiplier float DA gas price multiplier for retrying blob transactions (default -1) diff --git a/config/defaults.go b/config/defaults.go index c92b2421ca..ab88395025 100644 --- a/config/defaults.go +++ b/config/defaults.go @@ -26,7 +26,7 @@ var DefaultNodeConfig = NodeConfig{ BlockTime: 1 * time.Second, DABlockTime: 15 * time.Second, }, - DAAddress: "grpc://localhost:26650", + DAAddress: "http://localhost:26658", DAGasPrice: -1, DAGasMultiplier: -1, Light: false, From 8d28d9c078b4deceeb9c36054950987c16357d76 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Fri, 15 Mar 2024 06:48:19 -0700 Subject: [PATCH 30/38] fix(da): doc update links --- da/da.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/da/da.md b/da/da.md index 0dbf7663f9..6568f91764 100644 --- a/da/da.md +++ b/da/da.md @@ -4,7 +4,7 @@ Rollkit provides a wrapper for [go-da][go-da], a generic data availability inter ## Details -`DAClient` can connect via either gRPC or JSON-RPC transports using the [go-da][go-da] [proxy-grpc][proxy-grpc] or [proxy-jsonrpc][proxy-jsonrpc] implementations. The connection can be configured using the following cli flags: +`DAClient` can connect via either gRPC or JSON-RPC transports using the [go-da][go-da] [proxy/grpc][proxy/grpc] or [proxy/jsonrpc][proxy/jsonrpc] implementations. The connection can be configured using the following cli flags: * `--rollkit.da_address`: url address of the DA service (default: "grpc://localhost:26650") * `--rollkit.da_auth_token`: authentication token of the DA service @@ -33,12 +33,12 @@ See [da implementation] [2] [celestia-da][celestia-da] -[3] [proxy-grpc][proxy-grpc] +[3] [proxy/grpc][proxy/grpc] -[4] [proxy-jsonrpc][proxy-jsonrpc] +[4] [proxy/jsonrpc][proxy/jsonrpc] [da implementation]: https://github.com/rollkit/rollkit/blob/main/da/da.go [go-da]: https://github.com/rollkit/go-da [celestia-da]: https://github.com/rollkit/celestia-da -[proxy-grpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy-grpc -[proxy-jsonrpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy-jsonrpc +[proxy/grpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy/grpc +[proxy/jsonrpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy/jsonrpc From 86089e935c574fc1e90cae866bd64f23830124ab Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Fri, 15 Mar 2024 09:51:26 -0700 Subject: [PATCH 31/38] fix(da): move mock consts to pkgs --- da/da_test.go | 21 ++++++++++++++++----- da/mock/cmd/main.go | 8 ++++++-- node/full_client_test.go | 26 +++++++++++++------------- node/full_node_integration_test.go | 10 +++++----- node/full_node_test.go | 6 +++--- node/helpers_test.go | 5 ++--- node/node_test.go | 27 +++++++++++++++------------ rpc/json/helpers_test.go | 10 +++++++++- test/mocks/util.go | 10 ---------- 9 files changed, 69 insertions(+), 54 deletions(-) delete mode 100644 test/mocks/util.go diff --git a/da/da_test.go b/da/da_test.go index 6ca7884224..6e556e0d93 100644 --- a/da/da_test.go +++ b/da/da_test.go @@ -22,13 +22,21 @@ import ( proxyjsonrpc "github.com/rollkit/go-da/proxy/jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/da/mock" - "github.com/rollkit/rollkit/test/mocks" "github.com/rollkit/rollkit/types" ) const ( // MockDABlockTime is the mock da block time MockDABlockTime = 100 * time.Millisecond + + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" + + // MockDAAddressHTTP is mock address for the JSONRPC server + MockDAAddressHTTP = "http://localhost:7988" + + // MockDANamespace is the mock namespace + MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" ) // TestMain starts the mock gRPC and JSONRPC DA services @@ -36,6 +44,9 @@ const ( // JSONRPC service listens on MockDAAddressHTTP // Ports were chosen to be sufficiently different from defaults (26650, 26658) // Static ports are used to keep client configuration simple +// NOTE: this should be unique per test package to avoid +// "bind: listen address already in use" because multiple packages +// are tested in parallel func TestMain(m *testing.M) { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -117,7 +128,7 @@ func TestSubmitRetrieve(t *testing.T) { func startMockDAServGRPC() *grpc.Server { server := proxygrpc.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - addr, _ := url.Parse(mocks.MockDAAddress) + addr, _ := url.Parse(MockDAAddress) lis, err := net.Listen("tcp", addr.Host) if err != nil { panic(err) @@ -130,7 +141,7 @@ func startMockDAServGRPC() *grpc.Server { func startMockDAClientGRPC() *DAClient { client := proxygrpc.NewClient() - addr, _ := url.Parse(mocks.MockDAAddress) + addr, _ := url.Parse(MockDAAddress) if err := client.Start(addr.Host, grpc.WithTransportCredentials(insecure.NewCredentials())); err != nil { panic(err) } @@ -138,7 +149,7 @@ func startMockDAClientGRPC() *DAClient { } func startMockDAServJSONRPC(ctx context.Context) *proxyjsonrpc.Server { - addr, _ := url.Parse(mocks.MockDAAddressHTTP) + addr, _ := url.Parse(MockDAAddressHTTP) srv := proxyjsonrpc.NewServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA()) err := srv.Start(ctx) if err != nil { @@ -148,7 +159,7 @@ func startMockDAServJSONRPC(ctx context.Context) *proxyjsonrpc.Server { } func startMockDAClientJSONRPC(ctx context.Context) (*DAClient, error) { - client, err := proxyjsonrpc.NewClient(ctx, mocks.MockDAAddressHTTP, "") + client, err := proxyjsonrpc.NewClient(ctx, MockDAAddressHTTP, "") if err != nil { return nil, err } diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index 7213ae8056..0f3f5c1b26 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -12,7 +12,11 @@ import ( proxy "github.com/rollkit/go-da/proxy/jsonrpc" goDATest "github.com/rollkit/go-da/test" - "github.com/rollkit/rollkit/test/mocks" +) + +const ( + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" ) func main() { @@ -20,7 +24,7 @@ func main() { host string port string ) - addr, _ := url.Parse(mocks.MockDAAddress) + addr, _ := url.Parse(MockDAAddress) flag.StringVar(&port, "port", addr.Port(), "listening port") flag.StringVar(&host, "host", addr.Hostname(), "listening address") flag.Parse() diff --git a/node/full_client_test.go b/node/full_client_test.go index 8d1ae1a22a..edf96a64e7 100644 --- a/node/full_client_test.go +++ b/node/full_client_test.go @@ -69,8 +69,8 @@ func getRPC(t *testing.T) (*mocks.Application, *FullClient) { node, err := newFullNode( ctx, config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, }, key, signingKey, @@ -172,7 +172,7 @@ func TestGenesisChunked(t *testing.T) { signingKey, _, _ := crypto.GenerateEd25519Key(crand.Reader) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - n, _ := newFullNode(ctx, config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace}, privKey, signingKey, proxy.NewLocalClientCreator(mockApp), genDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), test.NewFileLogger(t)) + n, _ := newFullNode(ctx, config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace}, privKey, signingKey, proxy.NewLocalClientCreator(mockApp), genDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), test.NewFileLogger(t)) rpc := NewFullClient(n) @@ -544,8 +544,8 @@ func TestTx(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 1 * time.Second, // blocks must be at least 1 sec apart for adjacent headers to get verified correctly @@ -802,8 +802,8 @@ func TestMempool2Nodes(t *testing.T) { defer cancel() // make node1 an aggregator, so that node2 can start gracefully node1, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, P2P: config.P2PConfig{ ListenAddress: "/ip4/127.0.0.1/tcp/9001", @@ -814,8 +814,8 @@ func TestMempool2Nodes(t *testing.T) { require.NotNil(node1) node2, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, P2P: config.P2PConfig{ ListenAddress: "/ip4/127.0.0.1/tcp/9002", Seeds: "/ip4/127.0.0.1/tcp/9001/p2p/" + id1.Loggable()["peerID"].(string), @@ -877,8 +877,8 @@ func TestStatus(t *testing.T) { node, err := newFullNode( context.Background(), config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, P2P: config.P2PConfig{ ListenAddress: "/ip4/0.0.0.0/tcp/26656", }, @@ -1013,8 +1013,8 @@ func TestFutureGenesisTime(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := newFullNode(ctx, config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 200 * time.Millisecond, diff --git a/node/full_node_integration_test.go b/node/full_node_integration_test.go index fe3b0e4330..e62f8148a8 100644 --- a/node/full_node_integration_test.go +++ b/node/full_node_integration_test.go @@ -60,7 +60,7 @@ func TestAggregatorMode(t *testing.T) { } ctx, cancel := context.WithCancel(context.Background()) defer cancel() - node, err := newFullNode(ctx, config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig}, key, signingKey, proxy.NewLocalClientCreator(app), genesisDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) + node, err := newFullNode(ctx, config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig}, key, signingKey, proxy.NewLocalClientCreator(app), genesisDoc, DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) require.NoError(err) require.NotNil(node) @@ -183,8 +183,8 @@ func TestLazyAggregator(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() node, err := NewNode(ctx, config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: blockManagerConfig, LazyAggregator: true, @@ -648,8 +648,8 @@ func createNode(ctx context.Context, n int, aggregator bool, isLight bool, keys node, err := NewNode( ctx, config.NodeConfig{ - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, P2P: p2pConfig, Aggregator: aggregator, BlockManagerConfig: bmConfig, diff --git a/node/full_node_test.go b/node/full_node_test.go index 0fa3b10504..52556cb568 100644 --- a/node/full_node_test.go +++ b/node/full_node_test.go @@ -192,7 +192,7 @@ func TestPendingBlocks(t *testing.T) { mockDA.On("MaxBlobSize", mock.Anything).Return(uint64(10240), nil) mockDA.On("Submit", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("DA not available")) - dac := da.NewDAClient(mockDA, 1234, -1, goDA.Namespace(mocks.MockDANamespace), nil) + dac := da.NewDAClient(mockDA, 1234, -1, goDA.Namespace(MockDANamespace), nil) dbPath, err := os.MkdirTemp("", "testdb") require.NoError(t, err) defer func() { @@ -277,8 +277,8 @@ func createAggregatorWithPersistence(ctx context.Context, dbPath string, dalc *d ctx, config.NodeConfig{ DBPath: dbPath, - DAAddress: mocks.MockDAAddress, - DANamespace: mocks.MockDANamespace, + DAAddress: MockDAAddress, + DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{ BlockTime: 100 * time.Millisecond, diff --git a/node/helpers_test.go b/node/helpers_test.go index 29a672b5e9..938307f94d 100644 --- a/node/helpers_test.go +++ b/node/helpers_test.go @@ -15,12 +15,11 @@ import ( goDATest "github.com/rollkit/go-da/test" "github.com/rollkit/rollkit/da" - "github.com/rollkit/rollkit/test/mocks" ) func getMockDA(t *testing.T) *da.DAClient { - namespace := make([]byte, len(mocks.MockDANamespace)/2) - _, err := hex.Decode(namespace, []byte(mocks.MockDANamespace)) + namespace := make([]byte, len(MockDANamespace)/2) + _, err := hex.Decode(namespace, []byte(MockDANamespace)) require.NoError(t, err) return da.NewDAClient(goDATest.NewDummyDA(), -1, -1, namespace, log.TestingLogger()) } diff --git a/node/node_test.go b/node/node_test.go index c304d84233..443d6a74cc 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "net" + "net/url" "os" "testing" @@ -15,25 +16,26 @@ import ( "github.com/rollkit/rollkit/config" test "github.com/rollkit/rollkit/test/log" - "github.com/rollkit/rollkit/test/mocks" "github.com/rollkit/rollkit/types" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" - goDAproxy "github.com/rollkit/go-da/proxy" + goDAproxy "github.com/rollkit/go-da/proxy/grpc" goDATest "github.com/rollkit/go-da/test" ) -// MockServerAddr is the address used by the mock gRPC service -// NOTE: this should be unique per test package to avoid -// "bind: listen address already in use" because multiple packages -// are tested in parallel -var MockServerAddr = "127.0.0.1:7990" - -// MockNamespace is a sample namespace used by the mock DA client -var MockNamespace = "00000000000000000000000000000000000000000000000000deadbeef" +const ( + // MockDAAddress is the address used by the mock gRPC service + // NOTE: this should be unique per test package to avoid + // "bind: listen address already in use" because multiple packages + // are tested in parallel + MockDAAddress = "grpc://localhost:7990" + + // MockDANamespace is a sample namespace used by the mock DA client + MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" +) // TestMain does setup and teardown on the test package // to make the mock gRPC service available to the nodes @@ -52,7 +54,8 @@ func TestMain(m *testing.M) { func startMockGRPCServ() *grpc.Server { srv := goDAproxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) - lis, err := net.Listen("tcp", MockServerAddr) + addr, _ := url.Parse(MockDAAddress) + lis, err := net.Listen("tcp", addr.Host) if err != nil { panic(err) } @@ -104,7 +107,7 @@ func setupTestNode(ctx context.Context, t *testing.T, nodeType NodeType) (Node, // newTestNode creates a new test node based on the NodeType. func newTestNode(ctx context.Context, t *testing.T, nodeType NodeType) (Node, ed25519.PrivKey, error) { - config := config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace} + config := config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace} switch nodeType { case Light: config.Light = true diff --git a/rpc/json/helpers_test.go b/rpc/json/helpers_test.go index d1cbd0cf7c..18c66476f4 100644 --- a/rpc/json/helpers_test.go +++ b/rpc/json/helpers_test.go @@ -24,6 +24,14 @@ import ( "github.com/rollkit/rollkit/types" ) +const ( + // MockDAAddress is the mock address for the gRPC server + MockDAAddress = "grpc://localhost:7980" + + // MockDANamespace is the mock namespace + MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" +) + func prepareProposalResponse(_ context.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) { return &abci.ResponsePrepareProposal{ Txs: req.Txs, @@ -75,7 +83,7 @@ func getRPC(t *testing.T) (*mocks.Application, rpcclient.Client) { genesisValidators := []cmtypes.GenesisValidator{ {Address: pubKey.Address(), PubKey: pubKey, Power: int64(100), Name: "gen #1"}, } - n, err := node.NewNode(context.Background(), config.NodeConfig{DAAddress: mocks.MockDAAddress, DANamespace: mocks.MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{BlockTime: 1 * time.Second}, Light: false}, key, signingKey, proxy.NewLocalClientCreator(app), &cmtypes.GenesisDoc{ChainID: "test", Validators: genesisValidators}, node.DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) + n, err := node.NewNode(context.Background(), config.NodeConfig{DAAddress: MockDAAddress, DANamespace: MockDANamespace, Aggregator: true, BlockManagerConfig: config.BlockManagerConfig{BlockTime: 1 * time.Second}, Light: false}, key, signingKey, proxy.NewLocalClientCreator(app), &cmtypes.GenesisDoc{ChainID: "test", Validators: genesisValidators}, node.DefaultMetricsProvider(cmconfig.DefaultInstrumentationConfig()), log.TestingLogger()) require.NoError(err) require.NotNil(n) diff --git a/test/mocks/util.go b/test/mocks/util.go deleted file mode 100644 index d09a88990c..0000000000 --- a/test/mocks/util.go +++ /dev/null @@ -1,10 +0,0 @@ -package mocks - -const ( - // MockDAAddress is the mock address for the gRPC server - MockDAAddress = "grpc://localhost:7980" - // MockDAAddressHTTP is mock address for the JSONRPC server - MockDAAddressHTTP = "http://localhost:7988" - // MockDANamespace is the mock namespace - MockDANamespace = "00000000000000000000000000000000000000000000000000deadbeef" -) From ac627672d86196b63ade9f3832c011a8bd713489 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Fri, 15 Mar 2024 10:40:32 -0700 Subject: [PATCH 32/38] fix(da): fix run node mock srv --- cmd/rollkit/commands/run_node.go | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index 30ec3d2034..1aa61923da 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "math/rand" - "net" "net/url" "os" @@ -20,10 +19,8 @@ import ( cometproxy "github.com/cometbft/cometbft/proxy" comettypes "github.com/cometbft/cometbft/types" comettime "github.com/cometbft/cometbft/types/time" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - proxy "github.com/rollkit/go-da/proxy/grpc" + proxy "github.com/rollkit/go-da/proxy/jsonrpc" goDATest "github.com/rollkit/go-da/test" "github.com/spf13/cobra" @@ -115,6 +112,11 @@ func NewRunNodeCmd() *cobra.Command { // initialize the metrics metrics := rollnode.DefaultMetricsProvider(cometconf.DefaultInstrumentationConfig()) + // use mock jsonrpc da server by default + if !cmd.Flags().Lookup("rollkit.da_address").Changed { + startMockDAServJSONRPC(context.Background()) + } + // create the rollkit node rollnode, err := rollnode.NewNode( context.Background(), @@ -130,11 +132,6 @@ func NewRunNodeCmd() *cobra.Command { return fmt.Errorf("failed to create new rollkit node: %w", err) } - // start mock da server if we are using the default da address - if !cmd.Flags().Lookup("rollkit.da_address").Changed { - startMockGRPCServ() - } - // Launch the RPC server server := rollrpc.NewServer(rollnode, config.RPC, logger) err = server.Start() @@ -190,18 +187,15 @@ func addNodeFlags(cmd *cobra.Command) { rollconf.AddFlags(cmd) } -// startMockGRPCServ starts a mock gRPC server for the dummy DA -func startMockGRPCServ() *grpc.Server { - server := proxy.NewServer(goDATest.NewDummyDA(), grpc.Creds(insecure.NewCredentials())) +// startMockDAServJSONRPC starts a mock JSONRPC server +func startMockDAServJSONRPC(ctx context.Context) *proxy.Server { addr, _ := url.Parse(rollkitConfig.DAAddress) - lis, err := net.Listen("tcp", addr.Host) + srv := proxy.NewServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA()) + err := srv.Start(ctx) if err != nil { panic(err) } - go func() { - _ = server.Serve(lis) - }() - return nil + return srv } // TODO (Ferret-san): modify so that it initiates files with rollkit configurations by default From 1b59c63a6de110b34769cf6ebe1c610947ee1265 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Sat, 16 Mar 2024 17:39:23 -0700 Subject: [PATCH 33/38] fix(da): run_node: err; mock: sigint --- cmd/rollkit/commands/run_node.go | 12 ++++++++---- da/mock/cmd/main.go | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index 1aa61923da..f271549e2c 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -114,7 +114,11 @@ func NewRunNodeCmd() *cobra.Command { // use mock jsonrpc da server by default if !cmd.Flags().Lookup("rollkit.da_address").Changed { - startMockDAServJSONRPC(context.Background()) + srv, err := startMockDAServJSONRPC(context.Background()) + if err != nil { + return err + } + defer srv.Stop(context.Background()) } // create the rollkit node @@ -188,14 +192,14 @@ func addNodeFlags(cmd *cobra.Command) { } // startMockDAServJSONRPC starts a mock JSONRPC server -func startMockDAServJSONRPC(ctx context.Context) *proxy.Server { +func startMockDAServJSONRPC(ctx context.Context) (*proxy.Server, error) { addr, _ := url.Parse(rollkitConfig.DAAddress) srv := proxy.NewServer(addr.Hostname(), addr.Port(), goDATest.NewDummyDA()) err := srv.Start(ctx) if err != nil { - panic(err) + return nil, err } - return srv + return srv, nil } // TODO (Ferret-san): modify so that it initiates files with rollkit configurations by default diff --git a/da/mock/cmd/main.go b/da/mock/cmd/main.go index 0f3f5c1b26..3517fa9130 100644 --- a/da/mock/cmd/main.go +++ b/da/mock/cmd/main.go @@ -36,7 +36,7 @@ func main() { } interrupt := make(chan os.Signal, 1) - signal.Notify(interrupt, os.Interrupt, syscall.SIGTERM) + signal.Notify(interrupt, os.Interrupt, syscall.SIGINT) <-interrupt fmt.Println("\nCtrl+C pressed. Exiting...") os.Exit(0) From ed179bec42fb93827e49aba516610cbc7c03fbe2 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Sat, 16 Mar 2024 17:45:42 -0700 Subject: [PATCH 34/38] fix(da): nolint srv.Stop --- cmd/rollkit/commands/run_node.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index f271549e2c..b9448a1268 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -118,7 +118,8 @@ func NewRunNodeCmd() *cobra.Command { if err != nil { return err } - defer srv.Stop(context.Background()) + // nolint:errcheck,gosec + defer func() { srv.Stop(context.Background()) }() } // create the rollkit node From 51b6d7fdaf30fdd3949b515b3984edcc52fe30f3 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Sat, 16 Mar 2024 17:52:24 -0700 Subject: [PATCH 35/38] fix(da): run_node: wrap err --- cmd/rollkit/commands/run_node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index b9448a1268..f1a807f5d5 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -116,7 +116,7 @@ func NewRunNodeCmd() *cobra.Command { if !cmd.Flags().Lookup("rollkit.da_address").Changed { srv, err := startMockDAServJSONRPC(context.Background()) if err != nil { - return err + return fmt.Errorf("failed to launch mock da server: %w", err) } // nolint:errcheck,gosec defer func() { srv.Stop(context.Background()) }() From eb65ee6327f27782c5bae155375c344ccec11609 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Mon, 18 Mar 2024 08:29:29 -0700 Subject: [PATCH 36/38] fix(da): use go-da@v0.5.0 --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index e13f6b1fdc..a6f758c636 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/multiformats/go-multiaddr v0.12.2 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.19.0 - github.com/rollkit/go-da v0.4.0 + github.com/rollkit/go-da v0.5.0 github.com/rs/cors v1.10.1 github.com/spf13/cobra v1.8.0 github.com/spf13/viper v1.18.2 @@ -189,5 +189,3 @@ require ( gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/blake3 v1.2.1 // indirect ) - -replace github.com/rollkit/go-da => github.com/rollkit/go-da v0.4.1-0.20240314201619-766d5eccdbce diff --git a/go.sum b/go.sum index f9583a813b..1795796baf 100644 --- a/go.sum +++ b/go.sum @@ -1364,8 +1364,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= -github.com/rollkit/go-da v0.4.1-0.20240314201619-766d5eccdbce h1:PbpCBVoPZXwXlTSoiyJYyQkcD21WmpJVkorZnOHW5Mg= -github.com/rollkit/go-da v0.4.1-0.20240314201619-766d5eccdbce/go.mod h1:VsUeAoPvKl4Y8wWguu/VibscYiFFePkkrvZWyTjZHww= +github.com/rollkit/go-da v0.5.0 h1:sQpZricNS+2TLx3HMjNWhtRfqtvVC/U4pWHpfUz3eN4= +github.com/rollkit/go-da v0.5.0/go.mod h1:VsUeAoPvKl4Y8wWguu/VibscYiFFePkkrvZWyTjZHww= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= From 49fcd5e00f558e08491693f8f7616fd201ac46c7 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Mon, 18 Mar 2024 08:39:01 -0700 Subject: [PATCH 37/38] fix(da): fix links --- da/da.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/da/da.md b/da/da.md index 6568f91764..9c87cd63f7 100644 --- a/da/da.md +++ b/da/da.md @@ -40,5 +40,5 @@ See [da implementation] [da implementation]: https://github.com/rollkit/rollkit/blob/main/da/da.go [go-da]: https://github.com/rollkit/go-da [celestia-da]: https://github.com/rollkit/celestia-da -[proxy/grpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy/grpc -[proxy/jsonrpc]: https://github.com/rollkit/go-da/tree/tux/jsonrpc/proxy/jsonrpc +[proxy/grpc]: https://github.com/rollkit/go-da/tree/main/proxy/grpc +[proxy/jsonrpc]: https://github.com/rollkit/go-da/tree/main/proxy/jsonrpc From b489ea9243f1ee18252b39ecf1478446ce45d3e8 Mon Sep 17 00:00:00 2001 From: Javed Khan Date: Mon, 18 Mar 2024 08:59:19 -0700 Subject: [PATCH 38/38] fix(da): run_node: parent ctx --- cmd/rollkit/commands/run_node.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/rollkit/commands/run_node.go b/cmd/rollkit/commands/run_node.go index f1a807f5d5..f59d1adf54 100644 --- a/cmd/rollkit/commands/run_node.go +++ b/cmd/rollkit/commands/run_node.go @@ -114,12 +114,12 @@ func NewRunNodeCmd() *cobra.Command { // use mock jsonrpc da server by default if !cmd.Flags().Lookup("rollkit.da_address").Changed { - srv, err := startMockDAServJSONRPC(context.Background()) + srv, err := startMockDAServJSONRPC(cmd.Context()) if err != nil { return fmt.Errorf("failed to launch mock da server: %w", err) } // nolint:errcheck,gosec - defer func() { srv.Stop(context.Background()) }() + defer func() { srv.Stop(cmd.Context()) }() } // create the rollkit node