From 20664789d8d5119ec197de304cb9ee103f80c4c1 Mon Sep 17 00:00:00 2001
From: Bao Pham <145053932+bao1029p@users.noreply.github.com>
Date: Tue, 31 Oct 2023 01:48:48 +0700
Subject: [PATCH] refactor(nodebuilder/share/cmd)!: Take block height instead
 of `ExtendedHeader` as argument for share cmds (#2872)

Co-authored-by: Bao <bao@MacBook-Pro.local>
Co-authored-by: heh im a handsome boi <hehimahandsomeboi@Sons-MacBook-Pro.local>

Replace extended headers with block height as an argument in shares cmd

**Issues close**

Close [#2848 ](https://github.com/celestiaorg/celestia-node/issues/2848)

**Changes made**
- Replace all uses of `extended header` as an argument with block height in `nodebuilder/share/cmd/share.go.`
- Add logic to fetch header first with `block height` for
---
 nodebuilder/share/cmd/share.go | 54 +++++++++++++---------------------
 1 file changed, 21 insertions(+), 33 deletions(-)

diff --git a/nodebuilder/share/cmd/share.go b/nodebuilder/share/cmd/share.go
index 3d1af05289..b890f2d4c0 100644
--- a/nodebuilder/share/cmd/share.go
+++ b/nodebuilder/share/cmd/share.go
@@ -1,12 +1,14 @@
 package cmd
 
 import (
+	"context"
 	"encoding/hex"
-	"encoding/json"
+	"fmt"
 	"strconv"
 
 	"github.com/spf13/cobra"
 
+	rpc "github.com/celestiaorg/celestia-node/api/rpc/client"
 	cmdnode "github.com/celestiaorg/celestia-node/cmd"
 	"github.com/celestiaorg/celestia-node/header"
 	"github.com/celestiaorg/celestia-node/share"
@@ -39,13 +41,8 @@ var sharesAvailableCmd = &cobra.Command{
 		}
 		defer client.Close()
 
-		raw, err := parseJSON(args[0])
-		if err != nil {
-			return err
-		}
+		eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
 
-		var eh *header.ExtendedHeader
-		err = json.Unmarshal(raw, &eh)
 		if err != nil {
 			return err
 		}
@@ -72,7 +69,7 @@ var sharesAvailableCmd = &cobra.Command{
 }
 
 var getSharesByNamespaceCmd = &cobra.Command{
-	Use:   "get-by-namespace [extended header, namespace]",
+	Use:   "get-by-namespace (height | hash) namespace",
 	Short: "Gets all shares from an EDS within the given namespace.",
 	Args:  cobra.ExactArgs(2),
 	RunE: func(cmd *cobra.Command, args []string) error {
@@ -82,13 +79,8 @@ var getSharesByNamespaceCmd = &cobra.Command{
 		}
 		defer client.Close()
 
-		raw, err := parseJSON(args[0])
-		if err != nil {
-			return err
-		}
+		eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
 
-		var eh *header.ExtendedHeader
-		err = json.Unmarshal(raw, &eh)
 		if err != nil {
 			return err
 		}
@@ -104,7 +96,7 @@ var getSharesByNamespaceCmd = &cobra.Command{
 }
 
 var getShare = &cobra.Command{
-	Use:   "get-share [extended header, row, col]",
+	Use:   "get-share (height | hash) row col",
 	Short: "Gets a Share by coordinates in EDS.",
 	Args:  cobra.ExactArgs(3),
 	RunE: func(cmd *cobra.Command, args []string) error {
@@ -114,13 +106,8 @@ var getShare = &cobra.Command{
 		}
 		defer client.Close()
 
-		raw, err := parseJSON(args[0])
-		if err != nil {
-			return err
-		}
+		eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
 
-		var eh *header.ExtendedHeader
-		err = json.Unmarshal(raw, &eh)
 		if err != nil {
 			return err
 		}
@@ -158,8 +145,8 @@ var getShare = &cobra.Command{
 }
 
 var getEDS = &cobra.Command{
-	Use:   "get-eds [extended header]",
-	Short: "Gets the full EDS identified by the given extended header",
+	Use:   "get-eds (height | hash)",
+	Short: "Gets the full EDS identified by the given block height",
 	Args:  cobra.ExactArgs(1),
 	RunE: func(cmd *cobra.Command, args []string) error {
 		client, err := cmdnode.ParseClientFromCtx(cmd.Context())
@@ -168,13 +155,8 @@ var getEDS = &cobra.Command{
 		}
 		defer client.Close()
 
-		raw, err := parseJSON(args[0])
-		if err != nil {
-			return err
-		}
+		eh, err := getExtendedHeaderFromCmdArg(cmd.Context(), client, args[0])
 
-		var eh *header.ExtendedHeader
-		err = json.Unmarshal(raw, &eh)
 		if err != nil {
 			return err
 		}
@@ -184,8 +166,14 @@ var getEDS = &cobra.Command{
 	},
 }
 
-func parseJSON(param string) (json.RawMessage, error) {
-	var raw json.RawMessage
-	err := json.Unmarshal([]byte(param), &raw)
-	return raw, err
+func getExtendedHeaderFromCmdArg(ctx context.Context, client *rpc.Client, arg string) (*header.ExtendedHeader, error) {
+	hash, err := hex.DecodeString(arg)
+	if err == nil {
+		return client.Header.GetByHash(ctx, hash)
+	}
+	height, err := strconv.ParseUint(arg, 10, 64)
+	if err != nil {
+		return nil, fmt.Errorf("can't parse the height/hash argument: %w", err)
+	}
+	return client.Header.GetByHeight(ctx, height)
 }