Skip to content

Commit cfb363c

Browse files
authored
!refactor(api/share): use height in share module (#3870)
1 parent 01de405 commit cfb363c

File tree

10 files changed

+80
-122
lines changed

10 files changed

+80
-122
lines changed

Diff for: api/gateway/availability.go

+1-7
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,7 @@ func (h *Handler) handleHeightAvailabilityRequest(w http.ResponseWriter, r *http
2727
return
2828
}
2929

30-
header, err := h.header.GetByHeight(r.Context(), uint64(height))
31-
if err != nil {
32-
writeError(w, http.StatusInternalServerError, heightAvailabilityEndpoint, err)
33-
return
34-
}
35-
36-
err = h.share.SharesAvailable(r.Context(), header)
30+
err = h.share.SharesAvailable(r.Context(), uint64(height))
3731
switch {
3832
case err == nil:
3933
resp, err := json.Marshal(&AvailabilityResponse{Available: true})

Diff for: api/gateway/share.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,7 @@ func (h *Handler) getShares(
9393
height uint64,
9494
namespace libshare.Namespace,
9595
) ([]libshare.Share, error) {
96-
header, err := h.header.GetByHeight(ctx, height)
97-
if err != nil {
98-
return nil, err
99-
}
100-
101-
shares, err := h.share.GetSharesByNamespace(ctx, header, namespace)
96+
shares, err := h.share.GetSharesByNamespace(ctx, height, namespace)
10297
if err != nil {
10398
return nil, err
10499
}

Diff for: nodebuilder/node_test.go

-33
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,7 @@ import (
1515
collectormetricpb "go.opentelemetry.io/proto/otlp/collector/metrics/v1"
1616
"google.golang.org/protobuf/proto"
1717

18-
"github.com/celestiaorg/celestia-node/header/headertest"
1918
"github.com/celestiaorg/celestia-node/nodebuilder/node"
20-
"github.com/celestiaorg/celestia-node/share"
2119
)
2220

2321
func TestLifecycle(t *testing.T) {
@@ -125,34 +123,3 @@ func StartMockOtelCollectorHTTPServer(t *testing.T) (string, func()) {
125123
server.EnableHTTP2 = true
126124
return server.URL, server.Close
127125
}
128-
129-
func TestEmptyBlockExists(t *testing.T) {
130-
ctx, cancel := context.WithCancel(context.Background())
131-
defer cancel()
132-
133-
test := []struct {
134-
tp node.Type
135-
}{
136-
{tp: node.Bridge},
137-
{tp: node.Full},
138-
// technically doesn't need to be tested as a SharesAvailable call to
139-
// light node short circuits on an empty EDS
140-
{tp: node.Light},
141-
}
142-
for i, tt := range test {
143-
t.Run(strconv.Itoa(i), func(t *testing.T) {
144-
node := TestNode(t, tt.tp)
145-
err := node.Start(ctx)
146-
require.NoError(t, err)
147-
148-
// ensure an empty block exists in store
149-
150-
eh := headertest.RandExtendedHeaderWithRoot(t, share.EmptyEDSRoots())
151-
err = node.ShareServ.SharesAvailable(ctx, eh)
152-
require.NoError(t, err)
153-
154-
err = node.Stop(ctx)
155-
require.NoError(t, err)
156-
})
157-
}
158-
}

Diff for: nodebuilder/share/cmd/share.go

+8-26
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package cmd
22

33
import (
4-
"context"
54
"encoding/hex"
6-
"fmt"
75
"strconv"
86

97
"github.com/spf13/cobra"
108

119
libshare "github.com/celestiaorg/go-square/v2/share"
1210

13-
rpc "github.com/celestiaorg/celestia-node/api/rpc/client"
1411
cmdnode "github.com/celestiaorg/celestia-node/cmd"
15-
"github.com/celestiaorg/celestia-node/header"
1612
)
1713

1814
func init() {
@@ -42,12 +38,12 @@ var sharesAvailableCmd = &cobra.Command{
4238
}
4339
defer client.Close()
4440

45-
eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
41+
height, err := strconv.ParseUint(args[0], 10, 64)
4642
if err != nil {
4743
return err
4844
}
4945

50-
err = client.Share.SharesAvailable(cmd.Context(), eh)
46+
err = client.Share.SharesAvailable(cmd.Context(), height)
5147
formatter := func(data interface{}) interface{} {
5248
err, ok := data.(error)
5349
available := false
@@ -79,7 +75,7 @@ var getSharesByNamespaceCmd = &cobra.Command{
7975
}
8076
defer client.Close()
8177

82-
eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
78+
height, err := strconv.ParseUint(args[0], 10, 64)
8379
if err != nil {
8480
return err
8581
}
@@ -89,7 +85,7 @@ var getSharesByNamespaceCmd = &cobra.Command{
8985
return err
9086
}
9187

92-
shares, err := client.Share.GetSharesByNamespace(cmd.Context(), eh, ns)
88+
shares, err := client.Share.GetSharesByNamespace(cmd.Context(), height, ns)
9389
return cmdnode.PrintOutput(shares, err, nil)
9490
},
9591
}
@@ -105,7 +101,7 @@ var getShare = &cobra.Command{
105101
}
106102
defer client.Close()
107103

108-
eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
104+
height, err := strconv.ParseUint(args[0], 10, 64)
109105
if err != nil {
110106
return err
111107
}
@@ -120,7 +116,7 @@ var getShare = &cobra.Command{
120116
return err
121117
}
122118

123-
s, err := client.Share.GetShare(cmd.Context(), eh, int(row), int(col))
119+
s, err := client.Share.GetShare(cmd.Context(), height, int(row), int(col))
124120

125121
formatter := func(data interface{}) interface{} {
126122
sh, ok := data.(libshare.Share)
@@ -153,26 +149,12 @@ var getEDS = &cobra.Command{
153149
}
154150
defer client.Close()
155151

156-
eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
152+
height, err := strconv.ParseUint(args[0], 10, 64)
157153
if err != nil {
158154
return err
159155
}
160156

161-
shares, err := client.Share.GetEDS(cmd.Context(), eh)
157+
shares, err := client.Share.GetEDS(cmd.Context(), height)
162158
return cmdnode.PrintOutput(shares, err, nil)
163159
},
164160
}
165-
166-
func getExtendedHeaderFromCmdArg(ctx context.Context, client *rpc.Client, arg string) (*header.ExtendedHeader, error) {
167-
height, err := strconv.ParseUint(arg, 10, 64)
168-
if err == nil {
169-
return client.Header.GetByHeight(ctx, height)
170-
}
171-
172-
hash, err := hex.DecodeString(arg)
173-
if err != nil {
174-
return nil, fmt.Errorf("can't parse the height/hash argument: %w", err)
175-
}
176-
177-
return client.Header.GetByHash(ctx, hash)
178-
}

Diff for: nodebuilder/share/mocks/api.go

+4-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: nodebuilder/share/share.go

+46-27
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
libshare "github.com/celestiaorg/go-square/v2/share"
99
"github.com/celestiaorg/rsmt2d"
1010

11-
"github.com/celestiaorg/celestia-node/header"
1211
headerServ "github.com/celestiaorg/celestia-node/nodebuilder/header"
1312
"github.com/celestiaorg/celestia-node/share"
1413
"github.com/celestiaorg/celestia-node/share/eds"
@@ -43,15 +42,15 @@ type GetRangeResult struct {
4342
type Module interface {
4443
// SharesAvailable subjectively validates if Shares committed to the given
4544
// ExtendedHeader are available on the Network.
46-
SharesAvailable(context.Context, *header.ExtendedHeader) error
45+
SharesAvailable(ctx context.Context, height uint64) error
4746
// GetShare gets a Share by coordinates in EDS.
48-
GetShare(ctx context.Context, header *header.ExtendedHeader, row, col int) (libshare.Share, error)
47+
GetShare(ctx context.Context, height uint64, row, col int) (libshare.Share, error)
4948
// GetEDS gets the full EDS identified by the given extended header.
50-
GetEDS(ctx context.Context, header *header.ExtendedHeader) (*rsmt2d.ExtendedDataSquare, error)
49+
GetEDS(ctx context.Context, height uint64) (*rsmt2d.ExtendedDataSquare, error)
5150
// GetSharesByNamespace gets all shares from an EDS within the given namespace.
5251
// Shares are returned in a row-by-row order if the namespace spans multiple rows.
5352
GetSharesByNamespace(
54-
ctx context.Context, header *header.ExtendedHeader, namespace libshare.Namespace,
53+
ctx context.Context, height uint64, namespace libshare.Namespace,
5554
) (shwap.NamespaceData, error)
5655
// GetRange gets a list of shares and their corresponding proof.
5756
GetRange(ctx context.Context, height uint64, start, end int) (*GetRangeResult, error)
@@ -60,19 +59,19 @@ type Module interface {
6059
// API is a wrapper around Module for the RPC.
6160
type API struct {
6261
Internal struct {
63-
SharesAvailable func(context.Context, *header.ExtendedHeader) error `perm:"read"`
62+
SharesAvailable func(ctx context.Context, height uint64) error `perm:"read"`
6463
GetShare func(
6564
ctx context.Context,
66-
header *header.ExtendedHeader,
65+
height uint64,
6766
row, col int,
6867
) (libshare.Share, error) `perm:"read"`
6968
GetEDS func(
7069
ctx context.Context,
71-
header *header.ExtendedHeader,
70+
height uint64,
7271
) (*rsmt2d.ExtendedDataSquare, error) `perm:"read"`
7372
GetSharesByNamespace func(
7473
ctx context.Context,
75-
header *header.ExtendedHeader,
74+
height uint64,
7675
namespace libshare.Namespace,
7776
) (shwap.NamespaceData, error) `perm:"read"`
7877
GetRange func(
@@ -83,16 +82,16 @@ type API struct {
8382
}
8483
}
8584

86-
func (api *API) SharesAvailable(ctx context.Context, header *header.ExtendedHeader) error {
87-
return api.Internal.SharesAvailable(ctx, header)
85+
func (api *API) SharesAvailable(ctx context.Context, height uint64) error {
86+
return api.Internal.SharesAvailable(ctx, height)
8887
}
8988

90-
func (api *API) GetShare(ctx context.Context, header *header.ExtendedHeader, row, col int) (libshare.Share, error) {
91-
return api.Internal.GetShare(ctx, header, row, col)
89+
func (api *API) GetShare(ctx context.Context, height uint64, row, col int) (libshare.Share, error) {
90+
return api.Internal.GetShare(ctx, height, row, col)
9291
}
9392

94-
func (api *API) GetEDS(ctx context.Context, header *header.ExtendedHeader) (*rsmt2d.ExtendedDataSquare, error) {
95-
return api.Internal.GetEDS(ctx, header)
93+
func (api *API) GetEDS(ctx context.Context, height uint64) (*rsmt2d.ExtendedDataSquare, error) {
94+
return api.Internal.GetEDS(ctx, height)
9695
}
9796

9897
func (api *API) GetRange(ctx context.Context, height uint64, start, end int) (*GetRangeResult, error) {
@@ -101,28 +100,44 @@ func (api *API) GetRange(ctx context.Context, height uint64, start, end int) (*G
101100

102101
func (api *API) GetSharesByNamespace(
103102
ctx context.Context,
104-
header *header.ExtendedHeader,
103+
height uint64,
105104
namespace libshare.Namespace,
106105
) (shwap.NamespaceData, error) {
107-
return api.Internal.GetSharesByNamespace(ctx, header, namespace)
106+
return api.Internal.GetSharesByNamespace(ctx, height, namespace)
108107
}
109108

110109
type module struct {
111-
shwap.Getter
112-
share.Availability
113-
hs headerServ.Module
110+
getter shwap.Getter
111+
avail share.Availability
112+
hs headerServ.Module
114113
}
115114

116-
func (m module) SharesAvailable(ctx context.Context, header *header.ExtendedHeader) error {
117-
return m.Availability.SharesAvailable(ctx, header)
115+
func (m module) GetShare(ctx context.Context, height uint64, row, col int) (libshare.Share, error) {
116+
header, err := m.hs.GetByHeight(ctx, height)
117+
if err != nil {
118+
return libshare.Share{}, err
119+
}
120+
return m.getter.GetShare(ctx, header, row, col)
118121
}
119122

120-
func (m module) GetRange(ctx context.Context, height uint64, start, end int) (*GetRangeResult, error) {
121-
extendedHeader, err := m.hs.GetByHeight(ctx, height)
123+
func (m module) GetEDS(ctx context.Context, height uint64) (*rsmt2d.ExtendedDataSquare, error) {
124+
header, err := m.hs.GetByHeight(ctx, height)
122125
if err != nil {
123126
return nil, err
124127
}
125-
extendedDataSquare, err := m.GetEDS(ctx, extendedHeader)
128+
return m.getter.GetEDS(ctx, header)
129+
}
130+
131+
func (m module) SharesAvailable(ctx context.Context, height uint64) error {
132+
header, err := m.hs.GetByHeight(ctx, height)
133+
if err != nil {
134+
return err
135+
}
136+
return m.avail.SharesAvailable(ctx, header)
137+
}
138+
139+
func (m module) GetRange(ctx context.Context, height uint64, start, end int) (*GetRangeResult, error) {
140+
extendedDataSquare, err := m.GetEDS(ctx, height)
126141
if err != nil {
127142
return nil, err
128143
}
@@ -144,8 +159,12 @@ func (m module) GetRange(ctx context.Context, height uint64, start, end int) (*G
144159

145160
func (m module) GetSharesByNamespace(
146161
ctx context.Context,
147-
header *header.ExtendedHeader,
162+
height uint64,
148163
namespace libshare.Namespace,
149164
) (shwap.NamespaceData, error) {
150-
return m.Getter.GetSharesByNamespace(ctx, header, namespace)
165+
header, err := m.hs.GetByHeight(ctx, height)
166+
if err != nil {
167+
return nil, err
168+
}
169+
return m.getter.GetSharesByNamespace(ctx, header, namespace)
151170
}

Diff for: nodebuilder/tests/nd_test.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ func TestShrexNDFromLights(t *testing.T) {
7272
ns, err := libshare.NewNamespaceFromBytes(namespace)
7373
require.NoError(t, err)
7474

75-
expected, err := bridgeClient.Share.GetSharesByNamespace(reqCtx, h, ns)
75+
height := h.Height()
76+
expected, err := bridgeClient.Share.GetSharesByNamespace(reqCtx, height, ns)
7677
require.NoError(t, err)
77-
got, err := lightClient.Share.GetSharesByNamespace(reqCtx, h, ns)
78+
got, err := lightClient.Share.GetSharesByNamespace(reqCtx, height, ns)
7879
require.NoError(t, err)
7980

8081
require.True(t, len(got[0].Shares) > 0)
@@ -145,20 +146,21 @@ func TestShrexNDFromLightsWithBadFulls(t *testing.T) {
145146

146147
// ensure to fetch random namespace (not the reserved namespace)
147148
namespace := h.DAH.RowRoots[1][:libshare.NamespaceSize]
149+
height := h.Height()
148150
ns, err := libshare.NewNamespaceFromBytes(namespace)
149151
require.NoError(t, err)
150-
expected, err := bridgeClient.Share.GetSharesByNamespace(reqCtx, h, ns)
152+
expected, err := bridgeClient.Share.GetSharesByNamespace(reqCtx, height, ns)
151153
require.NoError(t, err)
152154
require.True(t, len(expected[0].Shares) > 0)
153155

154156
// choose a random full to test
155157
fN := fulls[len(fulls)/2]
156158
fnClient := getAdminClient(ctx, fN, t)
157-
gotFull, err := fnClient.Share.GetSharesByNamespace(reqCtx, h, ns)
159+
gotFull, err := fnClient.Share.GetSharesByNamespace(reqCtx, height, ns)
158160
require.NoError(t, err)
159161
require.True(t, len(gotFull[0].Shares) > 0)
160162

161-
gotLight, err := lightClient.Share.GetSharesByNamespace(reqCtx, h, ns)
163+
gotLight, err := lightClient.Share.GetSharesByNamespace(reqCtx, height, ns)
162164
require.NoError(t, err)
163165
require.True(t, len(gotLight[0].Shares) > 0)
164166

0 commit comments

Comments
 (0)