diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index f5cd705e58..6744d61497 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -523,6 +523,60 @@ } ] }, + "/v2/blocks/{round}/hash": { + "get": { + "produces": [ + "application/json" + ], + "schemes": [ + "http" + ], + "summary": "Get the block hash for the block on the given round.", + "operationId": "GetBlockHash", + "parameters": [ + { + "minimum": 0, + "type": "integer", + "description": "The round from which to fetch block hash information.", + "name": "round", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/BlockHashResponse" + }, + "400": { + "description": "Bad Request - Non integer number", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "401": { + "description": "Invalid API Token", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "description": "None existing block ", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "500": { + "description": "Internal Error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "default": { + "description": "Unknown Error" + } + } + } + }, "/v2/blocks/{round}/transactions/{txid}/proof": { "get": { "produces": [ @@ -3024,6 +3078,21 @@ } } }, + "BlockHashResponse": { + "description": "Hash of a block header.", + "schema": { + "type": "object", + "required": [ + "blockHash" + ], + "properties": { + "blockHash": { + "description": "Block header hash.", + "type": "string" + } + } + } + }, "TransactionProofResponse": { "description": "Proof of transaction in a block.", "schema": { diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index 50bd0494d7..0a15f51bbb 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -304,6 +304,25 @@ }, "description": "Asset information" }, + "BlockHashResponse": { + "content": { + "application/json": { + "schema": { + "properties": { + "blockHash": { + "description": "Block header hash.", + "type": "string" + } + }, + "required": [ + "blockHash" + ], + "type": "object" + } + } + }, + "description": "Hash of a block header." + }, "BlockResponse": { "content": { "application/json": { @@ -2701,6 +2720,89 @@ "summary": "Get the block for the given round." } }, + "/v2/blocks/{round}/hash": { + "get": { + "operationId": "GetBlockHash", + "parameters": [ + { + "description": "The round from which to fetch block hash information.", + "in": "path", + "name": "round", + "required": true, + "schema": { + "minimum": 0, + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "blockHash": { + "description": "Block header hash.", + "type": "string" + } + }, + "required": [ + "blockHash" + ], + "type": "object" + } + } + }, + "description": "Hash of a block header." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Bad Request - Non integer number" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Invalid API Token" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "None existing block " + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + }, + "description": "Internal Error" + }, + "default": { + "content": {}, + "description": "Unknown Error" + } + }, + "summary": "Get the block hash for the block on the given round." + } + }, "/v2/blocks/{round}/lightheader/proof": { "get": { "operationId": "GetLightBlockHeaderProof", diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index 921f69d943..2603a9022e 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -311,162 +311,163 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "bdH15+v/GwAA//9MwM7Ji70AAA==", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index 1eaa4b4c83..70a6da158c 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -626,6 +626,13 @@ type ApplicationResponse Application // AssetResponse defines model for AssetResponse. type AssetResponse Asset +// BlockHashResponse defines model for BlockHashResponse. +type BlockHashResponse struct { + + // Block header hash. + BlockHash string `json:"blockHash"` +} + // BlockResponse defines model for BlockResponse. type BlockResponse struct { diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 3389b370d5..7a57208578 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -38,6 +38,9 @@ type ServerInterface interface { // Get the block for the given round. // (GET /v2/blocks/{round}) GetBlock(ctx echo.Context, round uint64, params GetBlockParams) error + // Get the block hash for the block on the given round. + // (GET /v2/blocks/{round}/hash) + GetBlockHash(ctx echo.Context, round uint64) error // Gets a proof for a given light block header inside a state proof commitment // (GET /v2/blocks/{round}/lightheader/proof) GetLightBlockHeaderProof(ctx echo.Context, round uint64) error @@ -397,6 +400,36 @@ func (w *ServerInterfaceWrapper) GetBlock(ctx echo.Context) error { return err } +// GetBlockHash converts echo context to params. +func (w *ServerInterfaceWrapper) GetBlockHash(ctx echo.Context) error { + + validQueryParams := map[string]bool{ + "pretty": true, + } + + // Check for unknown query parameters. + for name, _ := range ctx.QueryParams() { + if _, ok := validQueryParams[name]; !ok { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Unknown parameter detected: %s", name)) + } + } + + var err error + // ------------- Path parameter "round" ------------- + var round uint64 + + err = runtime.BindStyledParameter("simple", false, "round", ctx.Param("round"), &round) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter round: %s", err)) + } + + ctx.Set("api_key.Scopes", []string{""}) + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.GetBlockHash(ctx, round) + return err +} + // GetLightBlockHeaderProof converts echo context to params. func (w *ServerInterfaceWrapper) GetLightBlockHeaderProof(ctx echo.Context) error { @@ -837,6 +870,7 @@ func RegisterHandlers(router interface { router.GET("/v2/applications/:application-id", wrapper.GetApplicationByID, m...) router.GET("/v2/assets/:asset-id", wrapper.GetAssetByID, m...) router.GET("/v2/blocks/:round", wrapper.GetBlock, m...) + router.GET("/v2/blocks/:round/hash", wrapper.GetBlockHash, m...) router.GET("/v2/blocks/:round/lightheader/proof", wrapper.GetLightBlockHeaderProof, m...) router.GET("/v2/blocks/:round/transactions/:txid/proof", wrapper.GetTransactionProof, m...) router.GET("/v2/ledger/supply", wrapper.GetSupply, m...) @@ -856,215 +890,217 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "MgEA", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index c3d71a7aa0..b52d1286fb 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -626,6 +626,13 @@ type ApplicationResponse Application // AssetResponse defines model for AssetResponse. type AssetResponse Asset +// BlockHashResponse defines model for BlockHashResponse. +type BlockHashResponse struct { + + // Block header hash. + BlockHash string `json:"blockHash"` +} + // BlockResponse defines model for BlockResponse. type BlockResponse struct { diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go index 353cb0335f..dadaf52638 100644 --- a/daemon/algod/api/server/v2/handlers.go +++ b/daemon/algod/api/server/v2/handlers.go @@ -627,6 +627,25 @@ func (v2 *Handlers) GetBlock(ctx echo.Context, round uint64, params generated.Ge return ctx.Blob(http.StatusOK, contentType, data) } +// GetBlockHash gets the block hash for the given round. +// (GET /v2/blocks/{round}/hash) +func (v2 *Handlers) GetBlockHash(ctx echo.Context, round uint64) error { + ledger := v2.Node.LedgerForAPI() + block, _, err := ledger.BlockCert(basics.Round(round)) + if err != nil { + switch err.(type) { + case ledgercore.ErrNoEntry: + return notFound(ctx, err, errFailedLookingUpLedger, v2.Log) + default: + return internalError(ctx, err, errFailedLookingUpLedger, v2.Log) + } + } + + response := generated.BlockHashResponse{BlockHash: crypto.Digest(block.Hash()).String()} + + return ctx.JSON(http.StatusOK, response) +} + // GetTransactionProof generates a Merkle proof for a transaction in a block. // (GET /v2/blocks/{round}/transactions/{txid}/proof) func (v2 *Handlers) GetTransactionProof(ctx echo.Context, round uint64, txid string, params generated.GetTransactionProofParams) error { diff --git a/daemon/algod/api/server/v2/test/handlers_test.go b/daemon/algod/api/server/v2/test/handlers_test.go index b587f75308..588743a598 100644 --- a/daemon/algod/api/server/v2/test/handlers_test.go +++ b/daemon/algod/api/server/v2/test/handlers_test.go @@ -208,6 +208,74 @@ func addBlockHelper(t *testing.T) (v2.Handlers, echo.Context, *httptest.Response return handler, c, rec, stx, releasefunc } +func TestGetBlockHash(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + handler, c, rec, _, _, releasefunc := setupTestForMethodGet(t) + defer releasefunc() + + err := handler.GetBlockHash(c, 0) + require.NoError(t, err) + require.Equal(t, 200, rec.Code) + + c, rec = newReq(t) + err = handler.GetBlockHash(c, 1) + require.NoError(t, err) + require.Equal(t, 404, rec.Code) +} + +func TestGetBlockGetBlockHash(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + a := require.New(t) + + handler, c, rec, _, _, releasefunc := setupTestForMethodGet(t) + defer releasefunc() + insertRounds(a, handler, 2) + + type blockResponse struct { + Block bookkeeping.Block `codec:"block"` + } + + var block1, block2 blockResponse + var block1Hash generatedV2.BlockHashResponse + format := "json" + + // Get block 1 + err := handler.GetBlock(c, 1, generatedV2.GetBlockParams{Format: &format}) + a.NoError(err) + a.Equal(200, rec.Code) + err = protocol.DecodeJSON(rec.Body.Bytes(), &block1) + a.NoError(err) + + // Get block 2 + c, rec = newReq(t) + err = handler.GetBlock(c, 2, generatedV2.GetBlockParams{Format: &format}) + a.NoError(err) + a.Equal(200, rec.Code) + err = protocol.DecodeJSON(rec.Body.Bytes(), &block2) + a.NoError(err) + + // Get block 1 hash + c, rec = newReq(t) + err = handler.GetBlockHash(c, 1) + a.NoError(err) + a.Equal(200, rec.Code) + err = protocol.DecodeJSON(rec.Body.Bytes(), &block1Hash) + a.NoError(err) + + // Validate that the block returned from GetBlock(1) has the same hash that is returned via GetBlockHash(1) + a.Equal(crypto.HashObj(block1.Block.BlockHeader).String(), block1Hash.BlockHash) + + // Validate that the block returned from GetBlock(2) has the same prev-hash that is returned via GetBlockHash(1) + hash := block2.Block.Branch.String() + a.Equal(fmt.Sprintf("blk-%s", block1Hash.BlockHash), hash) + + // Sanity check that the hashes are not equal (i.e. they are not the default values) + a.NotEqual(block1.Block.Branch, block2.Block.Branch) +} + func TestGetBlockJsonEncoding(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel()