diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 47aa60bb41..c95c0dbd18 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -531,8 +531,8 @@ "schemes": [ "http" ], - "summary": "Get a Merkle proof for a transaction in a block.", - "operationId": "GetProof", + "summary": "Get a proof for a transaction in a block.", + "operationId": "GetTransactionProof", "parameters": [ { "type": "integer", @@ -566,7 +566,7 @@ ], "responses": { "200": { - "$ref": "#/responses/ProofResponse" + "$ref": "#/responses/TransactionProofResponse" }, "400": { "description": "Malformed round number or transaction ID", @@ -587,7 +587,7 @@ } }, "500": { - "description": "Internal error, including protocol not supporting Merkle proofs.", + "description": "Internal error, including protocol not supporting proofs.", "schema": { "$ref": "#/definitions/ErrorResponse" } @@ -1317,7 +1317,7 @@ "http" ], "summary": "Gets a proof for a given light block header inside a state proof commitment", - "operationId": "GetProofForLightBlockHeader", + "operationId": "GetLightBlockHeaderProof", "parameters": [ { "type": "integer", @@ -2683,9 +2683,42 @@ ], "properties": { "Message": { - "description": "The encoded message.", - "type": "string", - "format": "byte" + "description": "Represents the message that the state proofs are attesting to.", + "type": "object", + "required": [ + "BlockHeadersCommitment", + "VotersCommitment", + "LnProvenWeight", + "FirstAttestedRound", + "LastAttestedRound" + ], + "properties": { + "BlockHeadersCommitment": { + "description": "The vector commitment root on all light block headers within a state proof interval.", + "type": "string", + "format": "byte" + }, + "VotersCommitment": { + "description": "The vector commitment root of the top N accounts to sign the next StateProof.", + "type": "string", + "format": "byte" + }, + "LnProvenWeight": { + "description": "An integer value representing the natural log of the proven weight with 16 bits of precision. This value would be used to verify the next state proof.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "FirstAttestedRound": { + "description": "The first round the message attests to.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "LastAttestedRound": { + "description": "The last round the message attests to.", + "type": "integer", + "x-algorand-format": "uint64" + } + } }, "StateProof": { "description": "The encoded StateProof for the message.", @@ -2976,7 +3009,7 @@ } } }, - "ProofResponse": { + "TransactionProofResponse": { "description": "Proof of transaction in a block.", "schema": { "type": "object", @@ -2989,7 +3022,7 @@ ], "properties": { "proof": { - "description": "Merkle proof of transaction membership.", + "description": "Proof of transaction membership.", "type": "string", "format": "byte" }, diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index 969134bcb3..44d4d1b955 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -630,53 +630,6 @@ }, "description": "Transaction ID of the submission." }, - "ProofResponse": { - "content": { - "application/json": { - "schema": { - "properties": { - "hashtype": { - "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256", - "enum": [ - "sha512_256", - "sha256" - ], - "type": "string" - }, - "idx": { - "description": "Index of the transaction in the block's payset.", - "type": "integer" - }, - "proof": { - "description": "Merkle proof of transaction membership.", - "format": "byte", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string" - }, - "stibhash": { - "description": "Hash of SignedTxnInBlock for verifying proof.", - "format": "byte", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string" - }, - "treedepth": { - "description": "Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root.", - "type": "integer" - } - }, - "required": [ - "hashtype", - "idx", - "proof", - "stibhash", - "treedepth" - ], - "type": "object" - } - } - }, - "description": "Proof of transaction in a block." - }, "StateProofResponse": { "content": { "application/json": { @@ -765,6 +718,53 @@ }, "description": "TransactionParams contains the parameters that help a client construct a new transaction." }, + "TransactionProofResponse": { + "content": { + "application/json": { + "schema": { + "properties": { + "hashtype": { + "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256", + "enum": [ + "sha512_256", + "sha256" + ], + "type": "string" + }, + "idx": { + "description": "Index of the transaction in the block's payset.", + "type": "integer" + }, + "proof": { + "description": "Proof of transaction membership.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "stibhash": { + "description": "Hash of SignedTxnInBlock for verifying proof.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "treedepth": { + "description": "Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root.", + "type": "integer" + } + }, + "required": [ + "hashtype", + "idx", + "proof", + "stibhash", + "treedepth" + ], + "type": "object" + } + } + }, + "description": "Proof of transaction in a block." + }, "VersionsResponse": { "content": { "application/json": { @@ -1623,10 +1623,44 @@ "description": "Represents a state proof and its corresponding message", "properties": { "Message": { - "description": "The encoded message.", - "format": "byte", - "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", - "type": "string" + "description": "Represents the message that the state proofs are attesting to.", + "properties": { + "BlockHeadersCommitment": { + "description": "The vector commitment root on all light block headers within a state proof interval.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + }, + "FirstAttestedRound": { + "description": "The first round the message attests to.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "LastAttestedRound": { + "description": "The last round the message attests to.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "LnProvenWeight": { + "description": "An integer value representing the natural log of the proven weight with 16 bits of precision. This value would be used to verify the next state proof.", + "type": "integer", + "x-algorand-format": "uint64" + }, + "VotersCommitment": { + "description": "The vector commitment root of the top N accounts to sign the next StateProof.", + "format": "byte", + "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", + "type": "string" + } + }, + "required": [ + "BlockHeadersCommitment", + "FirstAttestedRound", + "LastAttestedRound", + "LnProvenWeight", + "VotersCommitment" + ], + "type": "object" }, "StateProof": { "description": "The encoded StateProof for the message.", @@ -2666,7 +2700,7 @@ }, "/v2/blocks/{round}/lightheader/proof": { "get": { - "operationId": "GetProofForLightBlockHeader", + "operationId": "GetLightBlockHeaderProof", "parameters": [ { "description": "The round to which the light block header belongs.", @@ -2740,7 +2774,7 @@ }, "/v2/blocks/{round}/transactions/{txid}/proof": { "get": { - "operationId": "GetProof", + "operationId": "GetTransactionProof", "parameters": [ { "description": "The round in which the transaction appears.", @@ -2805,7 +2839,7 @@ "type": "integer" }, "proof": { - "description": "Merkle proof of transaction membership.", + "description": "Proof of transaction membership.", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" @@ -2872,14 +2906,14 @@ } } }, - "description": "Internal error, including protocol not supporting Merkle proofs." + "description": "Internal error, including protocol not supporting proofs." }, "default": { "content": {}, "description": "Unknown error" } }, - "summary": "Get a Merkle proof for a transaction in a block." + "summary": "Get a proof for a transaction in a block." } }, "/v2/catchup/{catchpoint}": { diff --git a/daemon/algod/api/client/restClient.go b/daemon/algod/api/client/restClient.go index ac4a78ff32..b5c3097565 100644 --- a/daemon/algod/api/client/restClient.go +++ b/daemon/algod/api/client/restClient.go @@ -661,7 +661,7 @@ func (client RestClient) LightBlockHeaderProof(round uint64) (response generated } // TransactionProof gets a Merkle proof for a transaction in a block. -func (client RestClient) TransactionProof(txid string, round uint64, hashType crypto.HashType) (response generatedV2.ProofResponse, err error) { +func (client RestClient) TransactionProof(txid string, round uint64, hashType crypto.HashType) (response generatedV2.TransactionProofResponse, err error) { txid = stripTransaction(txid) err = client.get(&response, fmt.Sprintf("/v2/blocks/%d/transactions/%s/proof", round, txid), proofParams{HashType: hashType.String()}) return diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index 9367f54efd..2ea4c40331 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -311,159 +311,162 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "///X/FsWRbgAAA==", + "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", } // 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 83d9ea4020..8221e77310 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -459,8 +459,24 @@ type StateDelta []EvalDeltaKeyValue // StateProof defines model for StateProof. type StateProof struct { - // The encoded message. - Message []byte `json:"Message"` + // Represents the message that the state proofs are attesting to. + Message struct { + + // The vector commitment root on all light block headers within a state proof interval. + BlockHeadersCommitment []byte `json:"BlockHeadersCommitment"` + + // The first round the message attests to. + FirstAttestedRound uint64 `json:"FirstAttestedRound"` + + // The last round the message attests to. + LastAttestedRound uint64 `json:"LastAttestedRound"` + + // An integer value representing the natural log of the proven weight with 16 bits of precision. This value would be used to verify the next state proof. + LnProvenWeight uint64 `json:"LnProvenWeight"` + + // The vector commitment root of the top N accounts to sign the next StateProof. + VotersCommitment []byte `json:"VotersCommitment"` + } `json:"Message"` // The encoded StateProof for the message. StateProof []byte `json:"StateProof"` @@ -742,27 +758,6 @@ type PostTransactionsResponse struct { TxId string `json:"txId"` } -// ProofResponse defines model for ProofResponse. -type ProofResponse struct { - - // The type of hash function used to create the proof, must be one of: - // * sha512_256 - // * sha256 - Hashtype string `json:"hashtype"` - - // Index of the transaction in the block's payset. - Idx uint64 `json:"idx"` - - // Merkle proof of transaction membership. - Proof []byte `json:"proof"` - - // Hash of SignedTxnInBlock for verifying proof. - Stibhash []byte `json:"stibhash"` - - // Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root. - Treedepth uint64 `json:"treedepth"` -} - // StateProofResponse defines model for StateProofResponse. type StateProofResponse StateProof @@ -806,6 +801,27 @@ type TransactionParametersResponse struct { MinFee uint64 `json:"min-fee"` } +// TransactionProofResponse defines model for TransactionProofResponse. +type TransactionProofResponse struct { + + // The type of hash function used to create the proof, must be one of: + // * sha512_256 + // * sha256 + Hashtype string `json:"hashtype"` + + // Index of the transaction in the block's payset. + Idx uint64 `json:"idx"` + + // Proof of transaction membership. + Proof []byte `json:"proof"` + + // Hash of SignedTxnInBlock for verifying proof. + Stibhash []byte `json:"stibhash"` + + // Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root. + Treedepth uint64 `json:"treedepth"` +} + // VersionsResponse defines model for VersionsResponse. type VersionsResponse Version diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 3539f8f9a3..185fbbca1b 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -40,10 +40,10 @@ type ServerInterface interface { GetBlock(ctx echo.Context, round uint64, params GetBlockParams) error // Gets a proof for a given light block header inside a state proof commitment // (GET /v2/blocks/{round}/lightheader/proof) - GetProofForLightBlockHeader(ctx echo.Context, round uint64) error - // Get a Merkle proof for a transaction in a block. + GetLightBlockHeaderProof(ctx echo.Context, round uint64) error + // Get a proof for a transaction in a block. // (GET /v2/blocks/{round}/transactions/{txid}/proof) - GetProof(ctx echo.Context, round uint64, txid string, params GetProofParams) error + GetTransactionProof(ctx echo.Context, round uint64, txid string, params GetTransactionProofParams) error // Get the current supply reported by the ledger. // (GET /v2/ledger/supply) GetSupply(ctx echo.Context) error @@ -397,8 +397,8 @@ func (w *ServerInterfaceWrapper) GetBlock(ctx echo.Context) error { return err } -// GetProofForLightBlockHeader converts echo context to params. -func (w *ServerInterfaceWrapper) GetProofForLightBlockHeader(ctx echo.Context) error { +// GetLightBlockHeaderProof converts echo context to params. +func (w *ServerInterfaceWrapper) GetLightBlockHeaderProof(ctx echo.Context) error { validQueryParams := map[string]bool{ "pretty": true, @@ -423,12 +423,12 @@ func (w *ServerInterfaceWrapper) GetProofForLightBlockHeader(ctx echo.Context) e ctx.Set("api_key.Scopes", []string{""}) // Invoke the callback with all the unmarshalled arguments - err = w.Handler.GetProofForLightBlockHeader(ctx, round) + err = w.Handler.GetLightBlockHeaderProof(ctx, round) return err } -// GetProof converts echo context to params. -func (w *ServerInterfaceWrapper) GetProof(ctx echo.Context) error { +// GetTransactionProof converts echo context to params. +func (w *ServerInterfaceWrapper) GetTransactionProof(ctx echo.Context) error { validQueryParams := map[string]bool{ "pretty": true, @@ -463,7 +463,7 @@ func (w *ServerInterfaceWrapper) GetProof(ctx echo.Context) error { ctx.Set("api_key.Scopes", []string{""}) // Parameter object where we will unmarshal all parameters from the context - var params GetProofParams + var params GetTransactionProofParams // ------------- Optional query parameter "hashtype" ------------- if paramValue := ctx.QueryParam("hashtype"); paramValue != "" { @@ -485,7 +485,7 @@ func (w *ServerInterfaceWrapper) GetProof(ctx echo.Context) error { } // Invoke the callback with all the unmarshalled arguments - err = w.Handler.GetProof(ctx, round, txid, params) + err = w.Handler.GetTransactionProof(ctx, round, txid, params) return err } @@ -837,8 +837,8 @@ 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/lightheader/proof", wrapper.GetProofForLightBlockHeader, m...) - router.GET("/v2/blocks/:round/transactions/:txid/proof", wrapper.GetProof, 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...) router.GET("/v2/stateproofs/:round", wrapper.GetStateProof, m...) router.GET("/v2/status", wrapper.GetStatus, m...) @@ -856,212 +856,215 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "+/j/AwAA//92ZqolGSgBAA==", + "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", + "ljPEDCwBAA==", } // 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 ec2587265b..db3bd074eb 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -459,8 +459,24 @@ type StateDelta []EvalDeltaKeyValue // StateProof defines model for StateProof. type StateProof struct { - // The encoded message. - Message []byte `json:"Message"` + // Represents the message that the state proofs are attesting to. + Message struct { + + // The vector commitment root on all light block headers within a state proof interval. + BlockHeadersCommitment []byte `json:"BlockHeadersCommitment"` + + // The first round the message attests to. + FirstAttestedRound uint64 `json:"FirstAttestedRound"` + + // The last round the message attests to. + LastAttestedRound uint64 `json:"LastAttestedRound"` + + // An integer value representing the natural log of the proven weight with 16 bits of precision. This value would be used to verify the next state proof. + LnProvenWeight uint64 `json:"LnProvenWeight"` + + // The vector commitment root of the top N accounts to sign the next StateProof. + VotersCommitment []byte `json:"VotersCommitment"` + } `json:"Message"` // The encoded StateProof for the message. StateProof []byte `json:"StateProof"` @@ -742,27 +758,6 @@ type PostTransactionsResponse struct { TxId string `json:"txId"` } -// ProofResponse defines model for ProofResponse. -type ProofResponse struct { - - // The type of hash function used to create the proof, must be one of: - // * sha512_256 - // * sha256 - Hashtype string `json:"hashtype"` - - // Index of the transaction in the block's payset. - Idx uint64 `json:"idx"` - - // Merkle proof of transaction membership. - Proof []byte `json:"proof"` - - // Hash of SignedTxnInBlock for verifying proof. - Stibhash []byte `json:"stibhash"` - - // Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root. - Treedepth uint64 `json:"treedepth"` -} - // StateProofResponse defines model for StateProofResponse. type StateProofResponse StateProof @@ -806,6 +801,27 @@ type TransactionParametersResponse struct { MinFee uint64 `json:"min-fee"` } +// TransactionProofResponse defines model for TransactionProofResponse. +type TransactionProofResponse struct { + + // The type of hash function used to create the proof, must be one of: + // * sha512_256 + // * sha256 + Hashtype string `json:"hashtype"` + + // Index of the transaction in the block's payset. + Idx uint64 `json:"idx"` + + // Proof of transaction membership. + Proof []byte `json:"proof"` + + // Hash of SignedTxnInBlock for verifying proof. + Stibhash []byte `json:"stibhash"` + + // Represents the depth of the tree that is being proven, i.e. the number of edges from a leaf to the root. + Treedepth uint64 `json:"treedepth"` +} + // VersionsResponse defines model for VersionsResponse. type VersionsResponse Version @@ -850,8 +866,8 @@ type GetBlockParams struct { Format *string `json:"format,omitempty"` } -// GetProofParams defines parameters for GetProof. -type GetProofParams struct { +// GetTransactionProofParams defines parameters for GetTransactionProof. +type GetTransactionProofParams struct { // The type of hash function used to create the proof, must be one of: // * sha512_256 diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go index 141f71882f..918440f19b 100644 --- a/daemon/algod/api/server/v2/handlers.go +++ b/daemon/algod/api/server/v2/handlers.go @@ -593,9 +593,9 @@ func (v2 *Handlers) GetBlock(ctx echo.Context, round uint64, params generated.Ge return ctx.Blob(http.StatusOK, contentType, data) } -// GetProof generates a Merkle proof for a transaction in a block. +// GetTransactionProof generates a Merkle proof for a transaction in a block. // (GET /v2/blocks/{round}/transactions/{txid}/proof) -func (v2 *Handlers) GetProof(ctx echo.Context, round uint64, txid string, params generated.GetProofParams) error { +func (v2 *Handlers) GetTransactionProof(ctx echo.Context, round uint64, txid string, params generated.GetTransactionProofParams) error { var txID transactions.Txid err := txID.UnmarshalText([]byte(txid)) if err != nil { @@ -660,7 +660,7 @@ func (v2 *Handlers) GetProof(ctx echo.Context, round uint64, txid string, params return internalError(ctx, err, "generating proof", v2.Log) } - response := generated.ProofResponse{ + response := generated.TransactionProofResponse{ Proof: proof.GetConcatenatedProof(), Stibhash: stibhash[:], Idx: uint64(idx), @@ -1254,16 +1254,21 @@ func (v2 *Handlers) GetStateProof(ctx echo.Context, round uint64) error { } response := generated.StateProofResponse{ - Message: protocol.Encode(&tx.Message), StateProof: protocol.Encode(&tx.StateProof), } + response.Message.BlockHeadersCommitment = tx.Message.BlockHeadersCommitment + response.Message.VotersCommitment = tx.Message.VotersCommitment + response.Message.LnProvenWeight = tx.Message.LnProvenWeight + response.Message.FirstAttestedRound = tx.Message.FirstAttestedRound + response.Message.LastAttestedRound = tx.Message.LastAttestedRound + return ctx.JSON(http.StatusOK, response) } -// GetProofForLightBlockHeader Gets a proof of a light block header for a given round +// GetLightBlockHeaderProof Gets a proof of a light block header for a given round // (GET /v2/blocks/{round}/lightheader/proof) -func (v2 *Handlers) GetProofForLightBlockHeader(ctx echo.Context, round uint64) error { +func (v2 *Handlers) GetLightBlockHeaderProof(ctx echo.Context, round uint64) error { ledger := v2.Node.LedgerForAPI() if ledger.Latest() < basics.Round(round) { return internalError(ctx, errors.New(errRoundGreaterThanTheLatest), errRoundGreaterThanTheLatest, v2.Log) diff --git a/daemon/algod/api/server/v2/test/handlers_test.go b/daemon/algod/api/server/v2/test/handlers_test.go index f8b7e4eb5b..789097fda5 100644 --- a/daemon/algod/api/server/v2/test/handlers_test.go +++ b/daemon/algod/api/server/v2/test/handlers_test.go @@ -934,10 +934,10 @@ func TestGetProofDefault(t *testing.T) { defer releasefunc() txid := stx.ID() - err := handler.GetProof(c, 1, txid.String(), generated.GetProofParams{}) + err := handler.GetTransactionProof(c, 1, txid.String(), generated.GetTransactionProofParams{}) a.NoError(err) - var resp generatedV2.ProofResponse + var resp generatedV2.TransactionProofResponse err = json.Unmarshal(rec.Body.Bytes(), &resp) a.NoError(err) a.Equal("sha512_256", resp.Hashtype) @@ -1075,9 +1075,7 @@ func TestStateProof200(t *testing.T) { stprfResp := generated.StateProofResponse{} a.NoError(json.Unmarshal(responseRecorder.Body.Bytes(), &stprfResp)) - msg := stateproofmsg.Message{} - a.NoError(protocol.Decode(stprfResp.Message, &msg)) - a.Equal([]byte{0x0, 0x1, 0x2}, msg.BlockHeadersCommitment) + a.Equal([]byte{0x0, 0x1, 0x2}, stprfResp.Message.BlockHeadersCommitment) } func TestHeaderProofRoundTooHigh(t *testing.T) { @@ -1087,7 +1085,7 @@ func TestHeaderProofRoundTooHigh(t *testing.T) { handler, ctx, responseRecorder, _, _, releasefunc := setupTestForMethodGet(t) defer releasefunc() - a.NoError(handler.GetProofForLightBlockHeader(ctx, 2)) + a.NoError(handler.GetLightBlockHeaderProof(ctx, 2)) a.Equal(500, responseRecorder.Code) } @@ -1100,7 +1098,7 @@ func TestHeaderProofStateProofNotFound(t *testing.T) { insertRounds(a, handler, 700) - a.NoError(handler.GetProofForLightBlockHeader(ctx, 650)) + a.NoError(handler.GetLightBlockHeaderProof(ctx, 650)) a.Equal(404, responseRecorder.Code) } @@ -1113,7 +1111,7 @@ func TestGetBlockProof200(t *testing.T) { insertRounds(a, handler, 1000) - a.NoError(handler.GetProofForLightBlockHeader(ctx, stateProofIntervalForHandlerTests*2+2)) + a.NoError(handler.GetLightBlockHeaderProof(ctx, stateProofIntervalForHandlerTests*2+2)) a.Equal(200, responseRecorder.Code) blkHdrArr, err := stateproof.FetchLightHeaders(handler.Node.LedgerForAPI(), stateProofIntervalForHandlerTests, basics.Round(stateProofIntervalForHandlerTests*3)) diff --git a/libgoal/libgoal.go b/libgoal/libgoal.go index 562ec0fe1b..b19d379a31 100644 --- a/libgoal/libgoal.go +++ b/libgoal/libgoal.go @@ -1212,7 +1212,7 @@ func (c *Client) Dryrun(data []byte) (resp generatedV2.DryrunResponse, err error } // TransactionProof returns a Merkle proof for a transaction in a block. -func (c *Client) TransactionProof(txid string, round uint64, hashType crypto.HashType) (resp generatedV2.ProofResponse, err error) { +func (c *Client) TransactionProof(txid string, round uint64, hashType crypto.HashType) (resp generatedV2.TransactionProofResponse, err error) { algod, err := c.ensureAlgodClient() if err == nil { return algod.TransactionProof(txid, round, hashType) diff --git a/test/framework/fixtures/libgoalFixture.go b/test/framework/fixtures/libgoalFixture.go index 34c8276ede..af84e4d2e1 100644 --- a/test/framework/fixtures/libgoalFixture.go +++ b/test/framework/fixtures/libgoalFixture.go @@ -504,15 +504,15 @@ func (f *LibGoalFixture) MinFeeAndBalance(round uint64) (minFee, minBalance uint } // TransactionProof returns a proof for usage in merkle array verification for the provided transaction. -func (f *LibGoalFixture) TransactionProof(txid string, round uint64, hashType crypto.HashType) (generatedV2.ProofResponse, merklearray.SingleLeafProof, error) { +func (f *LibGoalFixture) TransactionProof(txid string, round uint64, hashType crypto.HashType) (generatedV2.TransactionProofResponse, merklearray.SingleLeafProof, error) { proofResp, err := f.LibGoalClient.TransactionProof(txid, round, hashType) if err != nil { - return generatedV2.ProofResponse{}, merklearray.SingleLeafProof{}, err + return generatedV2.TransactionProofResponse{}, merklearray.SingleLeafProof{}, err } proof, err := merklearray.ProofDataToSingleLeafProof(proofResp.Hashtype, proofResp.Treedepth, proofResp.Proof) if err != nil { - return generatedV2.ProofResponse{}, merklearray.SingleLeafProof{}, err + return generatedV2.TransactionProofResponse{}, merklearray.SingleLeafProof{}, err } return proofResp, proof, nil