diff --git a/go.mod b/go.mod index 27a6253524..74ffc5d676 100644 --- a/go.mod +++ b/go.mod @@ -53,7 +53,7 @@ require ( github.com/multiformats/go-multihash v0.2.3 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/prometheus/client_golang v1.19.1 - github.com/rollkit/go-da v0.5.0 + github.com/rollkit/go-da v0.5.3-0.20240918201948-f132b113e642 github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 @@ -74,7 +74,7 @@ require ( golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 golang.org/x/sync v0.7.0 golang.org/x/text v0.16.0 - google.golang.org/grpc v1.65.0 + google.golang.org/grpc v1.66.2 google.golang.org/protobuf v1.34.2 ) @@ -116,7 +116,7 @@ require ( github.com/cosmos/btcutil v1.0.5 // indirect github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect github.com/cosmos/go-bip39 v1.0.0 // indirect - github.com/cosmos/gogoproto v1.5.0 // indirect + github.com/cosmos/gogoproto v1.7.0 // indirect github.com/cosmos/gorocksdb v1.2.0 // indirect github.com/cosmos/iavl v0.19.6 // indirect github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6 v6.1.2 // indirect diff --git a/go.sum b/go.sum index b2a56315e9..2b280c4cee 100644 --- a/go.sum +++ b/go.sum @@ -481,8 +481,8 @@ github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRAp github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= -github.com/cosmos/gogoproto v1.5.0 h1:SDVwzEqZDDBoslaeZg+dGE55hdzHfgUA40pEanMh52o= -github.com/cosmos/gogoproto v1.5.0/go.mod h1:iUM31aofn3ymidYG6bUR5ZFrk+Om8p5s754eMUcyp8I= +github.com/cosmos/gogoproto v1.7.0 h1:79USr0oyXAbxg3rspGh/m4SWNyoz/GLaAh0QlCe2fro= +github.com/cosmos/gogoproto v1.7.0/go.mod h1:yWChEv5IUEYURQasfyBW5ffkMHR/90hiHgbNgrtp4j0= github.com/cosmos/gorocksdb v1.2.0 h1:d0l3jJG8M4hBouIZq0mDUHZ+zjOx044J3nGRskwTb4Y= github.com/cosmos/gorocksdb v1.2.0/go.mod h1:aaKvKItm514hKfNJpUJXnnOWeBnk2GL4+Qw9NHizILw= github.com/cosmos/iavl v0.19.6 h1:XY78yEeNPrEYyNCKlqr9chrwoeSDJ0bV2VjocTk//OU= @@ -2176,8 +2176,8 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -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/rollkit/go-da v0.5.3-0.20240918201948-f132b113e642 h1:VC1H7miu5OT9cmBk5yfWrd49HBfpXbK1WbMEJ6qKxj8= +github.com/rollkit/go-da v0.5.3-0.20240918201948-f132b113e642/go.mod h1:9YCbEhUkF/QHbbKPBe5uvu93Co/mgPRtYjlwj6GPuhI= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.3 h1:O+qNyWn7Z+F9M0ILBHgMVPuB1xTOucVd5gtaYyXBpRo= github.com/rs/cors v1.8.3/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= @@ -3295,8 +3295,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= +google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= diff --git a/nodebuilder/da/da.go b/nodebuilder/da/da.go index 0d604d769f..47c87776af 100644 --- a/nodebuilder/da/da.go +++ b/nodebuilder/da/da.go @@ -17,7 +17,7 @@ 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"` + GetIDs func(ctx context.Context, height uint64, ns da.Namespace) (*da.GetIDsResult, 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"` @@ -33,7 +33,7 @@ func (api *API) Get(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.Blo return api.Internal.Get(ctx, ids, ns) } -func (api *API) GetIDs(ctx context.Context, height uint64, ns da.Namespace) ([]da.ID, error) { +func (api *API) GetIDs(ctx context.Context, height uint64, ns da.Namespace) (*da.GetIDsResult, error) { return api.Internal.GetIDs(ctx, height, ns) } diff --git a/nodebuilder/da/service.go b/nodebuilder/da/service.go index 113fe10c80..9435ae2626 100644 --- a/nodebuilder/da/service.go +++ b/nodebuilder/da/service.go @@ -13,6 +13,7 @@ import ( "github.com/celestiaorg/celestia-app/v2/pkg/appconsts" "github.com/celestiaorg/celestia-node/blob" + "github.com/celestiaorg/celestia-node/header" nodeblob "github.com/celestiaorg/celestia-node/nodebuilder/blob" "github.com/celestiaorg/celestia-node/share" "github.com/celestiaorg/celestia-node/state" @@ -28,12 +29,17 @@ var log = logging.Logger("go-da") const heightLen = 8 type Service struct { - blobServ nodeblob.Module + blobServ nodeblob.Module + headerGetter func(context.Context, uint64) (*header.ExtendedHeader, error) } -func NewService(blobMod nodeblob.Module) *Service { +func NewService( + blobMod nodeblob.Module, + headerGetter func(context.Context, uint64) (*header.ExtendedHeader, error), +) *Service { return &Service{ - blobServ: blobMod, + blobServ: blobMod, + headerGetter: headerGetter, } } @@ -59,21 +65,25 @@ func (s *Service) Get(ctx context.Context, ids []da.ID, ns da.Namespace) ([]da.B } // GetIDs returns IDs of all Blobs located in DA at given height. -func (s *Service) GetIDs(ctx context.Context, height uint64, namespace da.Namespace) ([]da.ID, error) { +func (s *Service) GetIDs(ctx context.Context, height uint64, namespace da.Namespace) (*da.GetIDsResult, error) { var ids []da.ID //nolint:prealloc log.Debugw("getting ids", "height", height, "namespace", share.Namespace(namespace)) blobs, err := s.blobServ.GetAll(ctx, height, []share.Namespace{namespace}) log.Debugw("got ids", "height", height, "namespace", share.Namespace(namespace)) if err != nil { if strings.Contains(err.Error(), blob.ErrBlobNotFound.Error()) { - return nil, nil + return nil, nil //nolint:nilnil } return nil, err } for _, b := range blobs { ids = append(ids, MakeID(height, b.Commitment)) } - return ids, nil + h, err := s.headerGetter(ctx, height) + if err != nil { + return nil, err + } + return &da.GetIDsResult{IDs: ids, Timestamp: h.Time()}, nil } // GetProofs returns inclusion Proofs for all Blobs located in DA at given height. @@ -105,15 +115,31 @@ func (s *Service) Submit( daBlobs []da.Blob, gasPrice float64, namespace da.Namespace, +) ([]da.ID, error) { + return s.SubmitWithOptions(ctx, daBlobs, gasPrice, namespace, nil) +} + +// SubmitWithOptions submits the Blobs to Data Availability layer. +func (s *Service) SubmitWithOptions( + ctx context.Context, + daBlobs []da.Blob, + gasPrice float64, + namespace da.Namespace, + options []byte, ) ([]da.ID, error) { blobs, _, err := s.blobsAndCommitments(daBlobs, namespace) if err != nil { return nil, err } - opts := state.NewTxConfig(state.WithGasPrice(gasPrice)) + opts, err := parseOptions(options) + if err != nil { + return nil, err + } + opts = append(opts, state.WithGasPrice(gasPrice)) + cfg := state.NewTxConfig(opts...) - height, err := s.blobServ.Submit(ctx, blobs, opts) + height, err := s.blobServ.Submit(ctx, blobs, cfg) if err != nil { log.Error("failed to submit blobs", "height", height, "gas price", gasPrice) return nil, err @@ -126,6 +152,31 @@ func (s *Service) Submit( return ids, nil } +func parseOptions(options []byte) ([]state.ConfigOption, error) { + parsedOpts := struct { + KeyName string + SignerAddress string + FeeGranterAddress string + }{} + + err := json.Unmarshal(options, &parsedOpts) + if err != nil { + return nil, err + } + + var opts []state.ConfigOption + if parsedOpts.KeyName != "" { + opts = append(opts, state.WithKeyName(parsedOpts.KeyName)) + } + if parsedOpts.SignerAddress != "" { + opts = append(opts, state.WithSignerAddress(parsedOpts.SignerAddress)) + } + if parsedOpts.FeeGranterAddress != "" { + opts = append(opts, state.WithFeeGranterAddress(parsedOpts.FeeGranterAddress)) + } + return opts, nil +} + // blobsAndCommitments converts []da.Blob to []*blob.Blob and generates corresponding // []da.Commitment func (s *Service) blobsAndCommitments(