From e0bcf134f0f49e8c860e18492aa83b116dacee79 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Tue, 15 Oct 2024 22:29:44 -0300 Subject: [PATCH 01/14] Implement `GET /v2/blocks` --- api/converter_utils.go | 107 ++++++++ api/error_messages.go | 1 + api/generated/common/routes.go | 302 ++++++++++----------- api/generated/common/types.go | 11 + api/generated/v2/routes.go | 481 ++++++++++++++++++--------------- api/generated/v2/types.go | 20 ++ api/handlers.go | 84 ++++++ api/indexer.oas2.json | 60 ++++ api/indexer.oas3.yml | 133 +++++++++ api/server.go | 4 + cmd/algorand-indexer/daemon.go | 6 + idb/dummy/dummy.go | 5 + idb/idb.go | 39 +++ idb/postgres/postgres.go | 107 ++++++++ 14 files changed, 984 insertions(+), 376 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 3f30a6678..8bb8935df 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -258,6 +258,95 @@ type rowData struct { AssetCloseAmount uint64 } +// rowToBlock parses the idb.BlockRow and generates the appropriate generated.Block object. +func rowToBlock(blockHeader *sdk.BlockHeader) generated.Block { + + rewards := generated.BlockRewards{ + FeeSink: blockHeader.FeeSink.String(), + RewardsCalculationRound: uint64(blockHeader.RewardsRecalculationRound), + RewardsLevel: blockHeader.RewardsLevel, + RewardsPool: blockHeader.RewardsPool.String(), + RewardsRate: blockHeader.RewardsRate, + RewardsResidue: blockHeader.RewardsResidue, + } + + upgradeState := generated.BlockUpgradeState{ + CurrentProtocol: string(blockHeader.CurrentProtocol), + NextProtocol: strPtr(string(blockHeader.NextProtocol)), + NextProtocolApprovals: uint64Ptr(blockHeader.NextProtocolApprovals), + NextProtocolSwitchOn: uint64Ptr(uint64(blockHeader.NextProtocolSwitchOn)), + NextProtocolVoteBefore: uint64Ptr(uint64(blockHeader.NextProtocolVoteBefore)), + } + + upgradeVote := generated.BlockUpgradeVote{ + UpgradeApprove: boolPtr(blockHeader.UpgradeApprove), + UpgradeDelay: uint64Ptr(uint64(blockHeader.UpgradeDelay)), + UpgradePropose: strPtr(string(blockHeader.UpgradePropose)), + } + + var partUpdates *generated.ParticipationUpdates = &generated.ParticipationUpdates{} + if len(blockHeader.ExpiredParticipationAccounts) > 0 { + addrs := make([]string, len(blockHeader.ExpiredParticipationAccounts)) + for i := 0; i < len(addrs); i++ { + addrs[i] = blockHeader.ExpiredParticipationAccounts[i].String() + } + partUpdates.ExpiredParticipationAccounts = strArrayPtr(addrs) + } + if len(blockHeader.AbsentParticipationAccounts) > 0 { + addrs := make([]string, len(blockHeader.AbsentParticipationAccounts)) + for i := 0; i < len(addrs); i++ { + addrs[i] = blockHeader.AbsentParticipationAccounts[i].String() + } + partUpdates.AbsentParticipationAccounts = strArrayPtr(addrs) + } + if *partUpdates == (generated.ParticipationUpdates{}) { + partUpdates = nil + } + + // order these so they're deterministic + orderedTrackingTypes := make([]sdk.StateProofType, len(blockHeader.StateProofTracking)) + trackingArray := make([]generated.StateProofTracking, len(blockHeader.StateProofTracking)) + elems := 0 + for key := range blockHeader.StateProofTracking { + orderedTrackingTypes[elems] = key + elems++ + } + sort.Slice(orderedTrackingTypes, func(i, j int) bool { return orderedTrackingTypes[i] < orderedTrackingTypes[j] }) + for i := 0; i < len(orderedTrackingTypes); i++ { + stpfTracking := blockHeader.StateProofTracking[orderedTrackingTypes[i]] + thing1 := generated.StateProofTracking{ + NextRound: uint64Ptr(uint64(stpfTracking.StateProofNextRound)), + Type: uint64Ptr(uint64(orderedTrackingTypes[i])), + VotersCommitment: byteSliceOmitZeroPtr(stpfTracking.StateProofVotersCommitment), + OnlineTotalWeight: uint64Ptr(uint64(stpfTracking.StateProofOnlineTotalWeight)), + } + trackingArray[orderedTrackingTypes[i]] = thing1 + } + + ret := generated.Block{ + Bonus: uint64PtrOrNil(uint64(blockHeader.Bonus)), + FeesCollected: uint64PtrOrNil(uint64(blockHeader.FeesCollected)), + GenesisHash: blockHeader.GenesisHash[:], + GenesisId: blockHeader.GenesisID, + ParticipationUpdates: partUpdates, + PreviousBlockHash: blockHeader.Branch[:], + Proposer: addrPtr(blockHeader.Proposer), + ProposerPayout: uint64PtrOrNil(uint64(blockHeader.ProposerPayout)), + Rewards: &rewards, + Round: uint64(blockHeader.Round), + Seed: blockHeader.Seed[:], + StateProofTracking: &trackingArray, + Timestamp: uint64(blockHeader.TimeStamp), + Transactions: nil, + TransactionsRoot: blockHeader.TxnCommitments.NativeSha512_256Commitment[:], + TransactionsRootSha256: blockHeader.TxnCommitments.Sha256Commitment[:], + TxnCounter: uint64Ptr(blockHeader.TxnCounter), + UpgradeState: &upgradeState, + UpgradeVote: &upgradeVote, + } + return ret +} + // txnRowToTransaction parses the idb.TxnRow and generates the appropriate generated.Transaction object. // If the TxnRow contains a RootTxn, the generated.Transaction object will be the root txn. func txnRowToTransaction(row idb.TxnRow) (generated.Transaction, error) { @@ -706,6 +795,24 @@ func (si *ServerImplementation) appParamsToApplicationQuery(params generated.Sea }, nil } +func (si *ServerImplementation) blockParamsToBlockFilter(params generated.SearchForBlocksParams) (filter idb.BlockFilter, err error) { + var errorArr = make([]string, 0) + + // Integer + filter.Limit = min(uintOrDefaultValue(params.Limit, si.opts.DefaultBlocksLimit), si.opts.MaxBlocksLimit) + + // String + if params.Next != nil { + n, err := idb.DecodeBlockRowNext(*params.Next) + if err != nil { + errorArr = append(errorArr, fmt.Sprintf("%s: %v", errUnableToParseNext, err)) + } + filter.MinRound = max(filter.MinRound, n+1) + } + + return +} + func (si *ServerImplementation) transactionParamsToTransactionFilter(params generated.SearchForTransactionsParams) (filter idb.TransactionFilter, err error) { var errorArr = make([]string, 0) diff --git a/api/error_messages.go b/api/error_messages.go index 71401b0d4..15ee052e4 100644 --- a/api/error_messages.go +++ b/api/error_messages.go @@ -39,6 +39,7 @@ const ( ErrFailedLookingUpBoxes = "failed while looking up application boxes" errRewindingAccountNotSupported = "rewinding account is no longer supported, please remove the `round=` query parameter and try again" errLookingUpBlockForRound = "error while looking up block for round" + errBlockHeaderSearch = "error while searching for block headers" errTransactionSearch = "error while searching for transaction" errZeroAddressCloseRemainderToRole = "searching transactions by zero address with close address role is not supported" errZeroAddressAssetSenderRole = "searching transactions by zero address with asset sender role is not supported" diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index aa093f800..6f3358051 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -105,157 +105,157 @@ var swaggerSpec = []string{ "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", - "/y8AAP//tVra42nhAAA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 92b65acb9..fe3c84fe3 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -1343,6 +1343,17 @@ type AssetsResponse struct { // data/bookkeeping/block.go : Block type BlockResponse = Block +// BlocksResponse defines model for BlocksResponse. +type BlocksResponse struct { + Blocks []Block `json:"blocks"` + + // CurrentRound Round at which the results were computed. + CurrentRound uint64 `json:"current-round"` + + // NextToken Used for pagination, when making another request provide this token with the next parameter. + NextToken *string `json:"next-token,omitempty"` +} + // BoxResponse Box name and its content. type BoxResponse = Box diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 67a7e76c7..6491bf1a3 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -69,6 +69,9 @@ type ServerInterface interface { // (GET /v2/assets/{asset-id}/transactions) LookupAssetTransactions(ctx echo.Context, assetId uint64, params LookupAssetTransactionsParams) error + // (GET /v2/blocks) + SearchForBlocks(ctx echo.Context, params SearchForBlocksParams) error + // (GET /v2/blocks/{round-number}) LookupBlock(ctx echo.Context, roundNumber uint64, params LookupBlockParams) error @@ -974,6 +977,31 @@ func (w *ServerInterfaceWrapper) LookupAssetTransactions(ctx echo.Context) error return err } +// SearchForBlocks converts echo context to params. +func (w *ServerInterfaceWrapper) SearchForBlocks(ctx echo.Context) error { + var err error + + // Parameter object where we will unmarshal all parameters from the context + var params SearchForBlocksParams + // ------------- Optional query parameter "limit" ------------- + + err = runtime.BindQueryParameter("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter limit: %s", err)) + } + + // ------------- Optional query parameter "next" ------------- + + err = runtime.BindQueryParameter("form", true, false, "next", ctx.QueryParams(), ¶ms.Next) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter next: %s", err)) + } + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.SearchForBlocks(ctx, params) + return err +} + // LookupBlock converts echo context to params. func (w *ServerInterfaceWrapper) LookupBlock(ctx echo.Context) error { var err error @@ -1210,6 +1238,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/v2/assets/:asset-id", wrapper.LookupAssetByID, m...) router.GET(baseURL+"/v2/assets/:asset-id/balances", wrapper.LookupAssetBalances, m...) router.GET(baseURL+"/v2/assets/:asset-id/transactions", wrapper.LookupAssetTransactions, m...) + router.GET(baseURL+"/v2/blocks", wrapper.SearchForBlocks, m...) router.GET(baseURL+"/v2/blocks/:round-number", wrapper.LookupBlock, m...) router.GET(baseURL+"/v2/transactions", wrapper.SearchForTransactions, m...) router.GET(baseURL+"/v2/transactions/:txid", wrapper.LookupTransaction, m...) @@ -1219,231 +1248,233 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "AQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index b234ab79c..9a4375a4e 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1431,6 +1431,17 @@ type AssetsResponse struct { // data/bookkeeping/block.go : Block type BlockResponse = Block +// BlocksResponse defines model for BlocksResponse. +type BlocksResponse struct { + Blocks []Block `json:"blocks"` + + // CurrentRound Round at which the results were computed. + CurrentRound uint64 `json:"current-round"` + + // NextToken Used for pagination, when making another request provide this token with the next parameter. + NextToken *string `json:"next-token,omitempty"` +} + // BoxResponse Box name and its content. type BoxResponse = Box @@ -1814,6 +1825,15 @@ type LookupAssetTransactionsParamsSigType string // LookupAssetTransactionsParamsAddressRole defines parameters for LookupAssetTransactions. type LookupAssetTransactionsParamsAddressRole string +// SearchForBlocksParams defines parameters for SearchForBlocks. +type SearchForBlocksParams struct { + // Limit Maximum number of results to return. There could be additional pages even if the limit is not reached. + Limit *uint64 `form:"limit,omitempty" json:"limit,omitempty"` + + // Next The next page of results. Use the next token provided by the previous results. + Next *string `form:"next,omitempty" json:"next,omitempty"` +} + // LookupBlockParams defines parameters for LookupBlock. type LookupBlockParams struct { // HeaderOnly Header only flag. When this is set to true, returned block does not contain the transactions diff --git a/api/handlers.go b/api/handlers.go index 78f15ef7c..4ce800962 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -45,6 +45,16 @@ type ServerImplementation struct { // Helper functions // ////////////////////// +func validateBlockFilter(filter *idb.BlockFilter) error { + var errorArr = make([]string, 0) + + if len(errorArr) > 0 { + return errors.New("invalid input: " + strings.Join(errorArr, ", ")) + } + + return nil +} + func validateTransactionFilter(filter *idb.TransactionFilter) error { var errorArr = make([]string, 0) @@ -981,6 +991,40 @@ func (si *ServerImplementation) LookupTransaction(ctx echo.Context, txid string) return ctx.JSON(http.StatusOK, response) } +// SearchForBlocks returns block headers matching the provided parameters +// (GET /v2/blocks) +func (si *ServerImplementation) SearchForBlocks(ctx echo.Context, params generated.SearchForBlocksParams) error { + + // Validate query parameters + if err := si.verifyHandler("SearchForBlocks", ctx); err != nil { + return badRequest(ctx, err.Error()) + } + + // Convert query params into a filter + filter, err := si.blockParamsToBlockFilter(params) + if err != nil { + return badRequest(ctx, err.Error()) + } + err = validateBlockFilter(&filter) + if err != nil { + return badRequest(ctx, err.Error()) + } + + // Fetch the block headers + blockHeaders, next, round, err := si.fetchBlockHeaders(ctx.Request().Context(), filter) + if err != nil { + return indexerError(ctx, fmt.Errorf("%s: %w", errBlockHeaderSearch, err)) + } + + // Populate the response model and render it + response := generated.BlocksResponse{ + CurrentRound: round, + NextToken: strPtr(next), + Blocks: blockHeaders, + } + return ctx.JSON(http.StatusOK, response) +} + // SearchForTransactions returns transactions matching the provided parameters // (GET /v2/transactions) func (si *ServerImplementation) SearchForTransactions(ctx echo.Context, params generated.SearchForTransactionsParams) error { @@ -1416,6 +1460,46 @@ func (si *ServerImplementation) fetchAccounts(ctx context.Context, options idb.A return accounts, round, nil } +// fetchBlockHeaders is used to query the backend for block headers, and compute the next token +func (si *ServerImplementation) fetchBlockHeaders(ctx context.Context, bf idb.BlockFilter) ([]generated.Block, string, uint64 /*round*/, error) { + + var round uint64 + var nextToken string + results := make([]generated.Block, 0) + err := callWithTimeout(ctx, si.log, si.timeout, func(ctx context.Context) error { + + // Open a channel from which result rows will be received + var rows <-chan idb.BlockRow + rows, round = si.db.Blocks(ctx, bf) + + // Iterate recieved rows, converting each to a generated.Block + var lastRow idb.BlockRow + for row := range rows { + if row.Error != nil { + return row.Error + } + + results = append(results, rowToBlock(&row.BlockHeader)) + lastRow = row + } + + // No next token if there were no results. + if len(results) == 0 { + return nil + } + + // Generate the next token and return + var err error + nextToken, err = lastRow.Next() + return err + }) + if err != nil { + return nil, "", 0, err + } + + return results, nextToken, round, nil +} + // fetchTransactions is used to query the backend for transactions, and compute the next token // If returnInnerTxnOnly is false, then the root txn is returned for a inner txn match. func (si *ServerImplementation) fetchTransactions(ctx context.Context, filter idb.TransactionFilter) ([]generated.Transaction, string, uint64 /*round*/, error) { diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 2deec1b49..952095df8 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -853,6 +853,40 @@ } } }, + "/v2/blocks": { + "get": { + "description": "Search for blocks. Blocks are returned in ascending round order. Transactions are not included in the output.", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "search" + ], + "operationId": "searchForBlocks", + "parameters": [ + { + "$ref": "#/parameters/limit" + }, + { + "$ref": "#/parameters/next" + } + ], + "responses": { + "200": { + "$ref": "#/responses/BlocksResponse" + }, + "404": { + "$ref": "#/responses/ErrorResponse" + }, + "500": { + "$ref": "#/responses/ErrorResponse" + } + } + } + }, "/v2/blocks/{round-number}": { "get": { "description": "Lookup block.", @@ -3189,6 +3223,32 @@ "$ref": "#/definitions/Block" } }, + "BlocksResponse": { + "description": "(empty)", + "schema": { + "type": "object", + "required": [ + "current-round", + "blocks" + ], + "properties": { + "current-round": { + "description": "Round at which the results were computed.", + "type": "integer" + }, + "next-token": { + "description": "Used for pagination, when making another request provide this token with the next parameter.", + "type": "string" + }, + "blocks": { + "type": "array", + "items": { + "$ref": "#/definitions/Block" + } + } + } + } + }, "HealthCheckResponse": { "description": "(empty)", "schema": { diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 63382e00a..02e91d030 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -569,6 +569,36 @@ }, "description": "(empty)" }, + "BlocksResponse": { + "content": { + "application/json": { + "schema": { + "properties": { + "blocks": { + "items": { + "$ref": "#/components/schemas/Block" + }, + "type": "array" + }, + "current-round": { + "description": "Round at which the results were computed.", + "type": "integer" + }, + "next-token": { + "description": "Used for pagination, when making another request provide this token with the next parameter.", + "type": "string" + } + }, + "required": [ + "blocks", + "current-round" + ], + "type": "object" + } + } + }, + "description": "(empty)" + }, "BoxResponse": { "content": { "application/json": { @@ -4773,6 +4803,109 @@ ] } }, + "/v2/blocks": { + "get": { + "description": "Search for blocks. Blocks are returned in ascending round order. Transactions are not included in the output.", + "operationId": "searchForBlocks", + "parameters": [ + { + "description": "Maximum number of results to return. There could be additional pages even if the limit is not reached.", + "in": "query", + "name": "limit", + "schema": { + "type": "integer" + } + }, + { + "description": "The next page of results. Use the next token provided by the previous results.", + "in": "query", + "name": "next", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "properties": { + "blocks": { + "items": { + "$ref": "#/components/schemas/Block" + }, + "type": "array" + }, + "current-round": { + "description": "Round at which the results were computed.", + "type": "integer" + }, + "next-token": { + "description": "Used for pagination, when making another request provide this token with the next parameter.", + "type": "string" + } + }, + "required": [ + "blocks", + "current-round" + ], + "type": "object" + } + } + }, + "description": "(empty)" + }, + "404": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": {}, + "type": "object" + }, + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" + } + } + }, + "description": "Response for errors" + }, + "500": { + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "properties": {}, + "type": "object" + }, + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" + } + } + }, + "description": "Response for errors" + } + }, + "tags": [ + "search" + ] + } + }, "/v2/blocks/{round-number}": { "get": { "description": "Lookup block.", diff --git a/api/server.go b/api/server.go index 0f4d402d5..cb172a362 100644 --- a/api/server.go +++ b/api/server.go @@ -48,6 +48,10 @@ type ExtraOptions struct { // Limit Constants // ///////////////////// + // Blocks + MaxBlocksLimit uint64 + DefaultBlocksLimit uint64 + // Transactions MaxTransactionsLimit uint64 DefaultTransactionsLimit uint64 diff --git a/cmd/algorand-indexer/daemon.go b/cmd/algorand-indexer/daemon.go index ce73ea764..671e0eab7 100644 --- a/cmd/algorand-indexer/daemon.go +++ b/cmd/algorand-indexer/daemon.go @@ -32,6 +32,8 @@ type daemonConfig struct { readTimeout time.Duration maxConn uint32 maxAPIResourcesPerAccount uint32 + maxBlocksLimit uint32 + defaultBlocksLimit uint32 maxTransactionsLimit uint32 defaultTransactionsLimit uint32 maxAccountsLimit uint32 @@ -79,6 +81,8 @@ func DaemonCmd() *cobra.Command { cfg.flags.StringVar(&cfg.suppliedAPIConfigFile, "api-config-file", "", "supply an API config file to enable/disable parameters") cfg.flags.BoolVar(&cfg.enableAllParameters, "enable-all-parameters", false, "override default configuration and enable all parameters. Can't be used with --api-config-file") cfg.flags.Uint32VarP(&cfg.maxAPIResourcesPerAccount, "max-api-resources-per-account", "", 1000, "set the maximum total number of resources (created assets, created apps, asset holdings, and application local state) per account that will be allowed in REST API lookupAccountByID and searchForAccounts responses before returning a 400 Bad Request. Set zero for no limit") + cfg.flags.Uint32VarP(&cfg.maxBlocksLimit, "max-blocks-limit", "", 1000, "set the maximum allowed Limit parameter for querying blocks") + cfg.flags.Uint32VarP(&cfg.defaultBlocksLimit, "default-blocks-limit", "", 100, "set the default Limit parameter for querying blocks, if none is provided") cfg.flags.Uint32VarP(&cfg.maxTransactionsLimit, "max-transactions-limit", "", 10000, "set the maximum allowed Limit parameter for querying transactions") cfg.flags.Uint32VarP(&cfg.defaultTransactionsLimit, "default-transactions-limit", "", 1000, "set the default Limit parameter for querying transactions, if none is provided") cfg.flags.Uint32VarP(&cfg.maxAccountsLimit, "max-accounts-limit", "", 1000, "set the maximum allowed Limit parameter for querying accounts") @@ -319,6 +323,8 @@ func makeOptions(daemonConfig *daemonConfig) (options api.ExtraOptions) { options.ReadTimeout = daemonConfig.readTimeout options.MaxAPIResourcesPerAccount = uint64(daemonConfig.maxAPIResourcesPerAccount) + options.MaxBlocksLimit = uint64(daemonConfig.maxBlocksLimit) + options.DefaultBlocksLimit = uint64(daemonConfig.defaultBlocksLimit) options.MaxTransactionsLimit = uint64(daemonConfig.maxTransactionsLimit) options.DefaultTransactionsLimit = uint64(daemonConfig.defaultTransactionsLimit) options.MaxAccountsLimit = uint64(daemonConfig.maxAccountsLimit) diff --git a/idb/dummy/dummy.go b/idb/dummy/dummy.go index 19e276e8b..29552c4c3 100644 --- a/idb/dummy/dummy.go +++ b/idb/dummy/dummy.go @@ -53,6 +53,11 @@ func (db *dummyIndexerDb) GetBlock(ctx context.Context, round uint64, options id return sdk.BlockHeader{}, nil, nil } +// Blocks is part of idb.IndexerDB +func (db *dummyIndexerDb) Blocks(ctx context.Context, bf idb.BlockFilter) (<-chan idb.BlockRow, uint64) { + return nil, 0 +} + // Transactions is part of idb.IndexerDB func (db *dummyIndexerDb) Transactions(ctx context.Context, tf idb.TransactionFilter) (<-chan idb.TxnRow, uint64) { return nil, 0 diff --git a/idb/idb.go b/idb/idb.go index 5e423747f..3c6375cf8 100644 --- a/idb/idb.go +++ b/idb/idb.go @@ -15,6 +15,23 @@ import ( sdk "github.com/algorand/go-algorand-sdk/v2/types" ) +// BlockRow is metadata relating to one block in a block query. +type BlockRow struct { + BlockHeader sdk.BlockHeader + + // Error indicates that there was an internal problem processing the expected block. + Error error +} + +// Next returns what should be an opaque string to be used with the next query to resume where a previous limit left off. +func (br BlockRow) Next() (string, error) { + + var b [8]byte + binary.LittleEndian.PutUint64(b[:8], uint64(br.BlockHeader.Round)) + + return base64.URLEncoding.EncodeToString(b[:]), nil +} + // TxnRow is metadata relating to one transaction in a transaction query. type TxnRow struct { // Round is the round where the transaction was committed. @@ -83,6 +100,21 @@ func (tr TxnRow) Next(ascending bool) (string, error) { return base64.URLEncoding.EncodeToString(b[:]), nil } +// DecodeBlockRowNext unpacks opaque string returned from BlockRow.Next() +func DecodeBlockRowNext(s string) (uint64 /*round*/, error) { + b, err := base64.URLEncoding.DecodeString(s) + if err != nil { + return 0, fmt.Errorf("DecodeBlockRowNext() decode err: %w", err) + } + + if len(b) != 8 { + return 0, fmt.Errorf("DecodeBlockRowNext() bad next token b: %x", b) + } + + round := binary.LittleEndian.Uint64(b[:8]) + return round, nil +} + // DecodeTxnRowNext unpacks opaque string returned from TxnRow.Next() func DecodeTxnRowNext(s string) (uint64 /*round*/, uint32 /*intra*/, error) { b, err := base64.URLEncoding.DecodeString(s) @@ -173,6 +205,7 @@ type IndexerDb interface { // The next multiple functions return a channel with results as well as the latest round // accounted. + Blocks(ctx context.Context, bf BlockFilter) (<-chan BlockRow, uint64) Transactions(ctx context.Context, tf TransactionFilter) (<-chan TxnRow, uint64) GetAccounts(ctx context.Context, opts AccountQueryOptions) (<-chan AccountRow, uint64) Assets(ctx context.Context, filter AssetsQuery) (<-chan AssetRow, uint64) @@ -195,6 +228,12 @@ type GetBlockOptions struct { MaxTransactionsLimit uint64 } +// BlockFilter is a parameter object with all the block filter options. +type BlockFilter struct { + Limit uint64 + MinRound uint64 +} + // TransactionFilter is a parameter object with all the transaction filter options. type TransactionFilter struct { // SkipOptimization is used for testing to ensure the parameters are not modified. diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 579259fda..e1fe70407 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -723,6 +723,53 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] return } +func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, err error) { + + whereParts := make([]string, 0) + whereArgs = make([]interface{}, 0) + partNumber := 1 + + if bf.MinRound != 0 { + whereParts = append(whereParts, fmt.Sprintf("round >= $%d", partNumber)) + whereArgs = append(whereArgs, bf.MinRound) + partNumber++ + } + + // SELECT, FROM + query = `SELECT header FROM block_header` + // WHERE + if len(whereParts) > 0 { + whereStr := strings.Join(whereParts, " AND ") + query += " WHERE " + whereStr + } + // ORDER BY + query += " ORDER BY round ASC" + // LIMIT + if bf.Limit != 0 { + query += fmt.Sprintf(" LIMIT %d", bf.Limit) + } + return +} + +// This function blocks. `tx` must be non-nil. +func (db *IndexerDb) yieldBlocks(ctx context.Context, tx pgx.Tx, bf idb.BlockFilter, out chan<- idb.BlockRow) { + + query, whereArgs, err := buildBlockQuery(bf) + if err != nil { + err = fmt.Errorf("block query err %v", err) + out <- idb.BlockRow{Error: err} + return + } + + rows, err := tx.Query(ctx, query, whereArgs...) + if err != nil { + err = fmt.Errorf("block query %#v err %v", query, err) + out <- idb.BlockRow{Error: err} + return + } + db.yieldBlocksThreadSimple(rows, out) +} + // This function blocks. `tx` must be non-nil. func (db *IndexerDb) yieldTxns(ctx context.Context, tx pgx.Tx, tf idb.TransactionFilter, out chan<- idb.TxnRow) { if len(tf.NextToken) > 0 { @@ -769,6 +816,42 @@ func txnFilterOptimization(tf idb.TransactionFilter) idb.TransactionFilter { return tf } +// Blocks is part of idb.IndexerDB +func (db *IndexerDb) Blocks(ctx context.Context, bf idb.BlockFilter) (<-chan idb.BlockRow, uint64) { + out := make(chan idb.BlockRow, 1) + + tx, err := db.db.BeginTx(ctx, readonlyRepeatableRead) + if err != nil { + out <- idb.BlockRow{Error: err} + close(out) + return out, 0 + } + + round, err := db.getMaxRoundAccounted(ctx, tx) + if err != nil { + out <- idb.BlockRow{Error: err} + close(out) + if rerr := tx.Rollback(ctx); rerr != nil { + db.log.Printf("rollback error: %s", rerr) + } + return out, round + } + + go func() { + db.yieldBlocks(ctx, tx, bf, out) + // Because we return a channel into a "callWithTimeout" function, + // We need to make sure that rollback is called before close() + // otherwise we can end up with a situation where "callWithTimeout" + // will cancel our context, resulting in connection pool churn + if rerr := tx.Rollback(ctx); rerr != nil { + db.log.Printf("rollback error: %s", rerr) + } + close(out) + }() + + return out, round +} + // Transactions is part of idb.IndexerDB func (db *IndexerDb) Transactions(ctx context.Context, tf idb.TransactionFilter) (<-chan idb.TxnRow, uint64) { out := make(chan idb.TxnRow, 1) @@ -893,6 +976,30 @@ func (db *IndexerDb) txnsWithNext(ctx context.Context, tx pgx.Tx, tf idb.Transac db.yieldTxnsThreadSimple(rows, out, nil, nil) } +func (db *IndexerDb) yieldBlocksThreadSimple(rows pgx.Rows, results chan<- idb.BlockRow) { + defer rows.Close() + + for rows.Next() { + var row idb.BlockRow + + var blockheaderjson []byte + err := rows.Scan(&blockheaderjson) + if err != nil { + row.Error = err + } else { + row.BlockHeader, err = encoding.DecodeBlockHeader(blockheaderjson) + if err != nil { + row.Error = fmt.Errorf("failed to decode block header: %w", err) + } + } + + results <- row + } + if err := rows.Err(); err != nil { + results <- idb.BlockRow{Error: err} + } +} + func (db *IndexerDb) yieldTxnsThreadSimple(rows pgx.Rows, results chan<- idb.TxnRow, countp *int, errp *error) { defer rows.Close() From 7f695ad63dfbeb12c2e5d2eea4383a7646be5fbe Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Wed, 16 Oct 2024 19:08:56 -0300 Subject: [PATCH 02/14] Add min/max round parameters to `GET /v2/blocks` --- api/converter_utils.go | 23 ++++++++++++++++++++++- api/generated/v2/routes.go | 30 ++++++++++++++++++++++-------- api/generated/v2/types.go | 6 ++++++ api/handlers.go | 5 +++++ api/indexer.oas2.json | 6 ++++++ api/indexer.oas3.yml | 16 ++++++++++++++++ idb/idb.go | 3 ++- idb/postgres/postgres.go | 18 +++++++++++++----- 8 files changed, 92 insertions(+), 15 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 8bb8935df..b28059ffa 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -800,6 +800,15 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search // Integer filter.Limit = min(uintOrDefaultValue(params.Limit, si.opts.DefaultBlocksLimit), si.opts.MaxBlocksLimit) + // If min/max are mixed up + // + // This check is performed here instead of in validateBlockFilter because + // when converting params into a filter, the next token is merged with params.MinRound. + if params.MinRound != nil && params.MaxRound != nil && *params.MinRound > *params.MaxRound { + errorArr = append(errorArr, errInvalidRoundMinMax) + } + filter.MaxRound = params.MaxRound + filter.MinRound = params.MinRound // String if params.Next != nil { @@ -807,9 +816,21 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search if err != nil { errorArr = append(errorArr, fmt.Sprintf("%s: %v", errUnableToParseNext, err)) } - filter.MinRound = max(filter.MinRound, n+1) + // Set the MinRound + if filter.MinRound == nil { + filter.MinRound = uint64Ptr(n + 1) + } else { + filter.MinRound = uint64Ptr(max(*filter.MinRound, n+1)) + } } + // If there were any errorArr while setting up the BlockFilter, return now. + if len(errorArr) > 0 { + err = errors.New("invalid input: " + strings.Join(errorArr, ", ")) + + // clear out the intermediates. + filter = idb.BlockFilter{} + } return } diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 6491bf1a3..5ef5fca90 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -997,6 +997,20 @@ func (w *ServerInterfaceWrapper) SearchForBlocks(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter next: %s", err)) } + // ------------- Optional query parameter "min-round" ------------- + + err = runtime.BindQueryParameter("form", true, false, "min-round", ctx.QueryParams(), ¶ms.MinRound) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter min-round: %s", err)) + } + + // ------------- Optional query parameter "max-round" ------------- + + err = runtime.BindQueryParameter("form", true, false, "max-round", ctx.QueryParams(), ¶ms.MaxRound) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter max-round: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments err = w.Handler.SearchForBlocks(ctx, params) return err @@ -1467,14 +1481,14 @@ var swaggerSpec = []string{ "oKDRkprwDvuGRhIdvAz2rCtTshx4X8EJB4TinPFr+O9cMfYbywxVlrke8962VuMBhNKY0fxxbcyD1maZ", "YlS4EZ8PRLsyqmoFaWhNyFVLKPErmVo+eStrsobLUvIr6O/qatpNX0FB1k6NViOJUfWgcdp1zwCevZlH", "pvdhADolUTklUTklUfkDaENmpcyvRjmdYcsz8hT+bSs4uH3lcybAPAJYQ6QqmEooRYQ0np4EYVrWpqrN", - "Dn82nPOkDfkMgnQahBoXUWObn3TQQQftEf0U7f+v6zSEh3z+O5xthtRqr+MQdBpSHOMt2kMe8crgdOlU", - "fDFAt2Qkf2C0sDTYClrzki7OyN/tFYI7Au78xnPF0+YZgTWSQjKkuE7p2pW79AChW8KUmZ3ybtnOEfTs", - "dD0/X5ZolDkoYozGZj3vWoG8iiQtqnMNKpCuoiSo5g7Lpx44qZN16WRdOlmXPlnrUkw8ZluyULKuyMvn", - "9ppxjRgRsAYPKnPJfNCHDPTra6oKPfXJfvIlVTSHrQN91b9PyTm0/T6M9NObV36YgSUDINlOI9Ytce1k", - "bTvllj/llj/Z8E42vJMN72TDO9nw/tVteB/T7nb39apPlr2TZe+kxvqoWub4aM9/tzLR/uBUYsXpsvVC", - "DqmcY6wbE6HqhLL7y+N5jyQk2q6DLuv4y3mK4zyRl09FS/5hOtFMXfu7XqtycjFZGlPpi/NztqGrqmRn", - "uVydQ6Ik1//3wPfL1QoeqvCLGzn6xZEy232TScXt21tmek0XC6YyOzPC/Pjs0eTD/w8AAP//T3mZpE6H", - "AQA=", + "Dn82nPOkDbkfbcgfUxA8sl4+3KtxgUW2+UkVH1Tx/r6fkh786/pO4SGf/w5nmyHR3us/BZ2G9Od4i/a8", + "EnhlcLp0RsIYoFvy0z8wWtinyMqb85Iuzsjf7RWCOwJRDcYLB9PmNYU1kkIyfHic7rkrfuoBcreEKTM7", + "5d1y3yPo2el6fr6c4SirWMQfjk3+3jWGeU1RWmPBNWiCuvqiwBccllY+MJQnI9vJyHYysn2yRraYeMy2", + "ZKFkXZGXz+014xoxImANHlTmchqhKx3IKmuqCj31OY/yJVU0h60Dtd2/T8k5tP0+jPTTm1d+mIElAyDZ", + "TlveLXHtZHQ8pdg/pdg/mTJPpsyTKfNkyjyZMv/VTZkf0/x492W7TwbOk4HzpMb6qFrm+GjPf7cy0f4Y", + "XWLF6bL1Qg6pnGOsGxOo64Sy+0tneo8kJNqugy7r+Mt5Cmc9kZdPRUv+YTrRTF37u16rcnIxWRpT6Yvz", + "c7ahq6pkZ7lcnUO+KNf/98D3y9UKHqrwixs5+sWRMtt9k0nF7dtbZnpNFwumMjszwvz47NHkw/8PAAD/", + "/+1p/kBViAEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 9a4375a4e..43c4a366a 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1832,6 +1832,12 @@ type SearchForBlocksParams struct { // Next The next page of results. Use the next token provided by the previous results. Next *string `form:"next,omitempty" json:"next,omitempty"` + + // MinRound Include results at or after the specified min-round. + MinRound *uint64 `form:"min-round,omitempty" json:"min-round,omitempty"` + + // MaxRound Include results at or before the specified max-round. + MaxRound *uint64 `form:"max-round,omitempty" json:"max-round,omitempty"` } // LookupBlockParams defines parameters for LookupBlock. diff --git a/api/handlers.go b/api/handlers.go index 4ce800962..a54853040 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -48,6 +48,11 @@ type ServerImplementation struct { func validateBlockFilter(filter *idb.BlockFilter) error { var errorArr = make([]string, 0) + if (filter.MaxRound != nil && *filter.MaxRound > math.MaxInt64) || + (filter.MinRound != nil && *filter.MinRound > math.MaxInt64) { + errorArr = append(errorArr, errValueExceedingInt64) + } + if len(errorArr) > 0 { return errors.New("invalid input: " + strings.Join(errorArr, ", ")) } diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 952095df8..88a34485e 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -872,6 +872,12 @@ }, { "$ref": "#/parameters/next" + }, + { + "$ref": "#/parameters/min-round" + }, + { + "$ref": "#/parameters/max-round" } ], "responses": { diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 02e91d030..ea3e4b3cb 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -4823,6 +4823,22 @@ "schema": { "type": "string" } + }, + { + "description": "Include results at or after the specified min-round.", + "in": "query", + "name": "min-round", + "schema": { + "type": "integer" + } + }, + { + "description": "Include results at or before the specified max-round.", + "in": "query", + "name": "max-round", + "schema": { + "type": "integer" + } } ], "responses": { diff --git a/idb/idb.go b/idb/idb.go index 3c6375cf8..0729eebef 100644 --- a/idb/idb.go +++ b/idb/idb.go @@ -231,7 +231,8 @@ type GetBlockOptions struct { // BlockFilter is a parameter object with all the block filter options. type BlockFilter struct { Limit uint64 - MinRound uint64 + MaxRound *uint64 + MinRound *uint64 } // TransactionFilter is a parameter object with all the transaction filter options. diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index e1fe70407..b79ad0b37 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -725,14 +725,22 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, err error) { + // Compute the terms in the WHERE clause whereParts := make([]string, 0) whereArgs = make([]interface{}, 0) - partNumber := 1 + { + partNumber := 1 - if bf.MinRound != 0 { - whereParts = append(whereParts, fmt.Sprintf("round >= $%d", partNumber)) - whereArgs = append(whereArgs, bf.MinRound) - partNumber++ + if bf.MaxRound != nil { + whereParts = append(whereParts, fmt.Sprintf("round <= $%d", partNumber)) + whereArgs = append(whereArgs, *bf.MaxRound) + partNumber++ + } + if bf.MinRound != nil { + whereParts = append(whereParts, fmt.Sprintf("round >= $%d", partNumber)) + whereArgs = append(whereArgs, *bf.MinRound) + partNumber++ + } } // SELECT, FROM From 8e5e975a84ef753d9f112ceb481c506c04d0a024 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Wed, 16 Oct 2024 19:17:39 -0300 Subject: [PATCH 03/14] Lints --- api/converter_utils.go | 2 +- api/handlers.go | 2 +- idb/postgres/postgres.go | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index b28059ffa..55ec1e636 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -796,7 +796,7 @@ func (si *ServerImplementation) appParamsToApplicationQuery(params generated.Sea } func (si *ServerImplementation) blockParamsToBlockFilter(params generated.SearchForBlocksParams) (filter idb.BlockFilter, err error) { - var errorArr = make([]string, 0) + var errorArr []string // Integer filter.Limit = min(uintOrDefaultValue(params.Limit, si.opts.DefaultBlocksLimit), si.opts.MaxBlocksLimit) diff --git a/api/handlers.go b/api/handlers.go index a54853040..a8a979f40 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -1477,7 +1477,7 @@ func (si *ServerImplementation) fetchBlockHeaders(ctx context.Context, bf idb.Bl var rows <-chan idb.BlockRow rows, round = si.db.Blocks(ctx, bf) - // Iterate recieved rows, converting each to a generated.Block + // Iterate receieved rows, converting each to a generated.Block var lastRow idb.BlockRow for row := range rows { if row.Error != nil { diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index b79ad0b37..22e260e99 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -729,17 +729,17 @@ func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, whereParts := make([]string, 0) whereArgs = make([]interface{}, 0) { - partNumber := 1 + var partNumber int if bf.MaxRound != nil { + partNumber++ whereParts = append(whereParts, fmt.Sprintf("round <= $%d", partNumber)) whereArgs = append(whereArgs, *bf.MaxRound) - partNumber++ } if bf.MinRound != nil { + partNumber++ whereParts = append(whereParts, fmt.Sprintf("round >= $%d", partNumber)) whereArgs = append(whereArgs, *bf.MinRound) - partNumber++ } } From ecf2f87e7af2db1604b1274067d9f6d63b531e82 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Wed, 16 Oct 2024 20:13:58 -0300 Subject: [PATCH 04/14] Add min/max time parameters to `GET /v2/blocks` --- api/converter_utils.go | 8 ++++++++ api/error_messages.go | 1 + api/generated/v2/routes.go | 30 ++++++++++++++++++++++-------- api/generated/v2/types.go | 6 ++++++ api/handlers.go | 6 ++++++ api/indexer.oas2.json | 6 ++++++ api/indexer.oas3.yml | 22 ++++++++++++++++++++++ idb/idb.go | 8 +++++--- idb/postgres/postgres.go | 16 ++++++++++++++++ 9 files changed, 92 insertions(+), 11 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 55ec1e636..4349aff89 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -824,6 +824,14 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search } } + // Time + if params.AfterTime != nil { + filter.AfterTime = *params.AfterTime + } + if params.BeforeTime != nil { + filter.BeforeTime = *params.BeforeTime + } + // If there were any errorArr while setting up the BlockFilter, return now. if len(errorArr) > 0 { err = errors.New("invalid input: " + strings.Join(errorArr, ", ")) diff --git a/api/error_messages.go b/api/error_messages.go index 15ee052e4..0bc4fb348 100644 --- a/api/error_messages.go +++ b/api/error_messages.go @@ -11,6 +11,7 @@ import ( const ( errInvalidRoundAndMinMax = "cannot specify round and min-round/max-round" errInvalidRoundMinMax = "min-round must be less than max-round" + errInvalidTimeMinMax = "after-time must be less than before-time" errUnableToParseAddress = "unable to parse address" errInvalidCreatorAddress = "found an invalid creator address" errUnableToParseBase64 = "unable to parse base64 data" diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 5ef5fca90..6f298afc7 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1011,6 +1011,20 @@ func (w *ServerInterfaceWrapper) SearchForBlocks(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter max-round: %s", err)) } + // ------------- Optional query parameter "before-time" ------------- + + err = runtime.BindQueryParameter("form", true, false, "before-time", ctx.QueryParams(), ¶ms.BeforeTime) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter before-time: %s", err)) + } + + // ------------- Optional query parameter "after-time" ------------- + + err = runtime.BindQueryParameter("form", true, false, "after-time", ctx.QueryParams(), ¶ms.AfterTime) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter after-time: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments err = w.Handler.SearchForBlocks(ctx, params) return err @@ -1481,14 +1495,14 @@ var swaggerSpec = []string{ "oKDRkprwDvuGRhIdvAz2rCtTshx4X8EJB4TinPFr+O9cMfYbywxVlrke8962VuMBhNKY0fxxbcyD1maZ", "YlS4EZ8PRLsyqmoFaWhNyFVLKPErmVo+eStrsobLUvIr6O/qatpNX0FB1k6NViOJUfWgcdp1zwCevZlH", "pvdhADolUTklUTklUfkDaENmpcyvRjmdYcsz8hT+bSs4uH3lcybAPAJYQ6QqmEooRYQ0np4EYVrWpqrN", - "Dn82nPOkDbkfbcgfUxA8sl4+3KtxgUW2+UkVH1Tx/r6fkh786/pO4SGf/w5nmyHR3us/BZ2G9Od4i/a8", - "EnhlcLp0RsIYoFvy0z8wWtinyMqb85Iuzsjf7RWCOwJRDcYLB9PmNYU1kkIyfHic7rkrfuoBcreEKTM7", - "5d1y3yPo2el6fr6c4SirWMQfjk3+3jWGeU1RWmPBNWiCuvqiwBccllY+MJQnI9vJyHYysn2yRraYeMy2", - "ZKFkXZGXz+014xoxImANHlTmchqhKx3IKmuqCj31OY/yJVU0h60Dtd2/T8k5tP0+jPTTm1d+mIElAyDZ", - "TlveLXHtZHQ8pdg/pdg/mTJPpsyTKfNkyjyZMv/VTZkf0/x492W7TwbOk4HzpMb6qFrm+GjPf7cy0f4Y", - "XWLF6bL1Qg6pnGOsGxOo64Sy+0tneo8kJNqugy7r+Mt5Cmc9kZdPRUv+YTrRTF37u16rcnIxWRpT6Yvz", - "c7ahq6pkZ7lcnUO+KNf/98D3y9UKHqrwixs5+sWRMtt9k0nF7dtbZnpNFwumMjszwvz47NHkw/8PAAD/", - "/+1p/kBViAEA", + "Dn82nPOkDbkfbchJEDwJgn8MQfDItphAS8cFk9nmJ/NLML94Gn9KdPGv6y+Hh3z+O5xthg/1Xp856DRk", + "M8FbtIczwCuD06WzUMYA3VKG+oHRwrIfotySeUkXZ+Tv9grBHYFIFuMFwmnDQcEaSSEZMhvO3tBVOegB", + "arqEKTM75d1KXCPo2el6fr7SwChLaCQTjE343zWAeu1gWkvFNWj/ujrCwIwcVkogCBEnw+rJsHoyrH6y", + "htWYeMy2ZKFkXZGXz+014xoxImANHlTm8lih+yRIFGuqCj31ea7yJVU0h60DVe2/T8k5tP0+jPTTm1d+", + "mIElAyDZTvvtLXHtZGg+lVU4lVU4aS1O5uuT+fpkvj6Zr//Vzdcf0+R896XaT0btk1H7pMb6qFrm+GjP", + "f7cy0f64bGLF6bL1Qg6pnGOsGxOc7YSy+0the48kJNqugy7r+Mt5CmE+kZdPRUv+YTrRTF37u16rcnIx", + "WRpT6Yvzc7ahq6pkZ7lcnYNp2fX/PfD9crWChyr84kaOfnGkzHbfZFJx+/aWmV7TxYKpzM6MMD8+ezT5", + "8P8DAAD//7IBU7tJigEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 43c4a366a..96f38c929 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1838,6 +1838,12 @@ type SearchForBlocksParams struct { // MaxRound Include results at or before the specified max-round. MaxRound *uint64 `form:"max-round,omitempty" json:"max-round,omitempty"` + + // BeforeTime Include results before the given time. Must be an RFC 3339 formatted string. + BeforeTime *time.Time `form:"before-time,omitempty" json:"before-time,omitempty"` + + // AfterTime Include results after the given time. Must be an RFC 3339 formatted string. + AfterTime *time.Time `form:"after-time,omitempty" json:"after-time,omitempty"` } // LookupBlockParams defines parameters for LookupBlock. diff --git a/api/handlers.go b/api/handlers.go index a8a979f40..5ae09a7f7 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -48,11 +48,17 @@ type ServerImplementation struct { func validateBlockFilter(filter *idb.BlockFilter) error { var errorArr = make([]string, 0) + // Int64 overflows if (filter.MaxRound != nil && *filter.MaxRound > math.MaxInt64) || (filter.MinRound != nil && *filter.MinRound > math.MaxInt64) { errorArr = append(errorArr, errValueExceedingInt64) } + // Time + if !filter.AfterTime.IsZero() && !filter.BeforeTime.IsZero() && filter.AfterTime.After(filter.BeforeTime) { + errorArr = append(errorArr, errInvalidTimeMinMax) + } + if len(errorArr) > 0 { return errors.New("invalid input: " + strings.Join(errorArr, ", ")) } diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 88a34485e..5b98f53ad 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -878,6 +878,12 @@ }, { "$ref": "#/parameters/max-round" + }, + { + "$ref": "#/parameters/before-time" + }, + { + "$ref": "#/parameters/after-time" } ], "responses": { diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index ea3e4b3cb..14dad71e9 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -4839,6 +4839,28 @@ "schema": { "type": "integer" } + }, + { + "description": "Include results before the given time. Must be an RFC 3339 formatted string.", + "in": "query", + "name": "before-time", + "schema": { + "format": "date-time", + "type": "string", + "x-algorand-format": "RFC3339 String" + }, + "x-algorand-format": "RFC3339 String" + }, + { + "description": "Include results after the given time. Must be an RFC 3339 formatted string.", + "in": "query", + "name": "after-time", + "schema": { + "format": "date-time", + "type": "string", + "x-algorand-format": "RFC3339 String" + }, + "x-algorand-format": "RFC3339 String" } ], "responses": { diff --git a/idb/idb.go b/idb/idb.go index 0729eebef..c55fda768 100644 --- a/idb/idb.go +++ b/idb/idb.go @@ -230,9 +230,11 @@ type GetBlockOptions struct { // BlockFilter is a parameter object with all the block filter options. type BlockFilter struct { - Limit uint64 - MaxRound *uint64 - MinRound *uint64 + Limit uint64 + MaxRound *uint64 + MinRound *uint64 + AfterTime time.Time + BeforeTime time.Time } // TransactionFilter is a parameter object with all the transaction filter options. diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 22e260e99..daa74254c 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -741,6 +741,22 @@ func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, whereParts = append(whereParts, fmt.Sprintf("round >= $%d", partNumber)) whereArgs = append(whereArgs, *bf.MinRound) } + if !bf.AfterTime.IsZero() { + partNumber++ + whereParts = append( + whereParts, + fmt.Sprintf("round >= (SELECT tmp.round FROM block_header tmp WHERE tmp.realtime > $%d ORDER BY tmp.realtime ASC, tmp.round ASC LIMIT 1)", partNumber), + ) + whereArgs = append(whereArgs, bf.AfterTime) + } + if !bf.BeforeTime.IsZero() { + partNumber++ + whereParts = append( + whereParts, + fmt.Sprintf("round <= (SELECT tmp.round FROM block_header tmp WHERE tmp.realtime < $%d ORDER BY tmp.realtime DESC, tmp.round DESC LIMIT 1)", partNumber), + ) + whereArgs = append(whereArgs, bf.BeforeTime) + } } // SELECT, FROM From 3a92111741729cc96bc8f62ded4236e7038d8b2d Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Wed, 16 Oct 2024 22:31:55 -0300 Subject: [PATCH 05/14] Add `proposer` parameter to `GET /v2/blocks` --- api/converter_utils.go | 21 + api/generated/common/routes.go | 337 ++++++------- api/generated/common/types.go | 3 + api/generated/v2/routes.go | 462 +++++++++--------- api/generated/v2/types.go | 6 + api/indexer.oas2.json | 14 + api/indexer.oas3.yml | 28 ++ idb/idb.go | 1 + .../internal/schema/setup_postgres.sql | 3 +- .../internal/schema/setup_postgres_sql.go | 3 +- idb/postgres/postgres.go | 10 + 11 files changed, 491 insertions(+), 397 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 4349aff89..998a97711 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -34,6 +34,15 @@ func decodeDigest(str *string, field string, errorArr []string) (string, []strin return "", errorArr } +// decodeSdkAddress returns the sdk.Address representation of the input string, or appends an error to errorArr +func decodeSdkAddress(str string, field string, errorArr []string) (sdk.Address, []string) { + addr, err := sdk.DecodeAddress(str) + if err != nil { + return sdk.ZeroAddress, append(errorArr, fmt.Sprintf("%s '%s': %v", errUnableToParseAddress, field, err)) + } + return addr, errorArr +} + // decodeAddress returns the byte representation of the input string, or appends an error to errorArr func decodeAddress(str *string, field string, errorArr []string) ([]byte, []string) { if str != nil { @@ -832,6 +841,18 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search filter.BeforeTime = *params.BeforeTime } + // Address list + { + filter.Proposers = make(map[sdk.Address]struct{}, 0) + if params.Proposer != nil { + for _, s := range *params.Proposer { + var addr sdk.Address + addr, errorArr = decodeSdkAddress(s, "proposer", errorArr) + filter.Proposers[addr] = struct{}{} + } + } + } + // If there were any errorArr while setting up the BlockFilter, return now. if len(errorArr) > 0 { err = errors.New("invalid input: " + strings.Join(errorArr, ", ")) diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 6f3358051..2ac4c54f5 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -72,190 +72,191 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "FwAA//9YFQ2yJuQAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index fe3c84fe3..695f8eaa2 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -1207,6 +1207,9 @@ type Next = string // NotePrefix defines model for note-prefix. type NotePrefix = string +// Proposer defines model for proposer. +type Proposer = []string + // RekeyTo defines model for rekey-to. type RekeyTo = bool diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 6f298afc7..2205295dc 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1025,6 +1025,13 @@ func (w *ServerInterfaceWrapper) SearchForBlocks(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter after-time: %s", err)) } + // ------------- Optional query parameter "proposer" ------------- + + err = runtime.BindQueryParameter("form", false, false, "proposer", ctx.QueryParams(), ¶ms.Proposer) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter proposer: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments err = w.Handler.SearchForBlocks(ctx, params) return err @@ -1276,233 +1283,234 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "8P8DAAD//7IBU7tJigEA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 96f38c929..0a0325838 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1295,6 +1295,9 @@ type Next = string // NotePrefix defines model for note-prefix. type NotePrefix = string +// Proposer defines model for proposer. +type Proposer = []string + // RekeyTo defines model for rekey-to. type RekeyTo = bool @@ -1844,6 +1847,9 @@ type SearchForBlocksParams struct { // AfterTime Include results after the given time. Must be an RFC 3339 formatted string. AfterTime *time.Time `form:"after-time,omitempty" json:"after-time,omitempty"` + + // Proposer Block proposer. Comma separated list of addresses. + Proposer *[]string `form:"proposer,omitempty" json:"proposer,omitempty"` } // LookupBlockParams defines parameters for LookupBlock. diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 5b98f53ad..8fa4669c2 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -884,6 +884,9 @@ }, { "$ref": "#/parameters/after-time" + }, + { + "$ref": "#/parameters/proposer" } ], "responses": { @@ -2726,6 +2729,17 @@ } }, "parameters": { + "proposer": { + "type": "array", + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "description": "Block proposer. Comma separated list of addresses.", + "name": "proposer", + "in": "query", + "required": false + }, "account-id": { "type": "string", "description": "account string", diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 14dad71e9..400afb517 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -203,6 +203,20 @@ }, "x-algorand-format": "base64" }, + "proposer": { + "description": "Block proposer. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "proposer", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" + }, "rekey-to": { "description": "Include results which include the rekey-to field.", "in": "query", @@ -4861,6 +4875,20 @@ "x-algorand-format": "RFC3339 String" }, "x-algorand-format": "RFC3339 String" + }, + { + "description": "Block proposer. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "proposer", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" } ], "responses": { diff --git a/idb/idb.go b/idb/idb.go index c55fda768..dfed45529 100644 --- a/idb/idb.go +++ b/idb/idb.go @@ -235,6 +235,7 @@ type BlockFilter struct { MinRound *uint64 AfterTime time.Time BeforeTime time.Time + Proposers map[sdk.Address]struct{} } // TransactionFilter is a parameter object with all the transaction filter options. diff --git a/idb/postgres/internal/schema/setup_postgres.sql b/idb/postgres/internal/schema/setup_postgres.sql index fa74d463b..4f3ccca58 100644 --- a/idb/postgres/internal/schema/setup_postgres.sql +++ b/idb/postgres/internal/schema/setup_postgres.sql @@ -5,7 +5,8 @@ CREATE TABLE public.block_header ( rewardslevel INT8 NOT NULL, header JSONB NOT NULL, CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), - INDEX block_header_time (realtime ASC) + INDEX block_header_time (realtime ASC), + INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL ); CREATE TABLE public.txn ( diff --git a/idb/postgres/internal/schema/setup_postgres_sql.go b/idb/postgres/internal/schema/setup_postgres_sql.go index 5721e2c01..02fe8b649 100644 --- a/idb/postgres/internal/schema/setup_postgres_sql.go +++ b/idb/postgres/internal/schema/setup_postgres_sql.go @@ -9,7 +9,8 @@ CREATE TABLE public.block_header ( rewardslevel INT8 NOT NULL, header JSONB NOT NULL, CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), - INDEX block_header_time (realtime ASC) + INDEX block_header_time (realtime ASC), + INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL ); CREATE TABLE public.txn ( diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index daa74254c..cf81083e0 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -757,6 +757,16 @@ func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, ) whereArgs = append(whereArgs, bf.BeforeTime) } + if len(bf.Proposers) > 0 { + var proposersStr []string + for addr := range bf.Proposers { + proposersStr = append(proposersStr, `'"`+addr.String()+`"'`) + } + whereParts = append( + whereParts, + fmt.Sprintf("( (header->'prp') IS NOT NULL AND ((header->'prp')::TEXT IN (%s)) )", strings.Join(proposersStr, ",")), + ) + } } // SELECT, FROM From 76fe4ed03f9464d6b696491886947d0aab13ff70 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Thu, 17 Oct 2024 20:49:50 -0300 Subject: [PATCH 06/14] Add `expired` parameter to `GET /v2/blocks` --- api/converter_utils.go | 9 + api/generated/common/routes.go | 338 +++++++++++++------------- api/generated/common/types.go | 3 + api/generated/v2/routes.go | 432 +++++++++++++++++---------------- api/generated/v2/types.go | 6 + api/indexer.oas2.json | 14 ++ api/indexer.oas3.yml | 28 +++ idb/idb.go | 13 +- idb/postgres/postgres.go | 10 + 9 files changed, 466 insertions(+), 387 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 998a97711..e47852187 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -851,6 +851,15 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search filter.Proposers[addr] = struct{}{} } } + + filter.ExpiredParticipationAccounts = make(map[sdk.Address]struct{}, 0) + if params.Expired != nil { + for _, s := range *params.Expired { + var addr sdk.Address + addr, errorArr = decodeSdkAddress(s, "expired", errorArr) + filter.ExpiredParticipationAccounts[addr] = struct{}{} + } + } } // If there were any errorArr while setting up the BlockFilter, return now. diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 2ac4c54f5..32caf9c99 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -88,175 +88,175 @@ var swaggerSpec = []string{ "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", - "FwAA//9YFQ2yJuQAAA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 695f8eaa2..91879422f 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -1183,6 +1183,9 @@ type Exclude = []string // ExcludeCloseTo defines model for exclude-close-to. type ExcludeCloseTo = bool +// Expired defines model for expired. +type Expired = []string + // GroupId defines model for group-id. type GroupId = string diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 2205295dc..c743b7fd3 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1032,6 +1032,13 @@ func (w *ServerInterfaceWrapper) SearchForBlocks(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter proposer: %s", err)) } + // ------------- Optional query parameter "expired" ------------- + + err = runtime.BindQueryParameter("form", false, false, "expired", ctx.QueryParams(), ¶ms.Expired) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter expired: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments err = w.Handler.SearchForBlocks(ctx, params) return err @@ -1299,218 +1306,219 @@ var swaggerSpec = []string{ "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", + "8eTD/w8AAP//iQizO9CNAQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 0a0325838..7d73a013f 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1271,6 +1271,9 @@ type Exclude = []string // ExcludeCloseTo defines model for exclude-close-to. type ExcludeCloseTo = bool +// Expired defines model for expired. +type Expired = []string + // GroupId defines model for group-id. type GroupId = string @@ -1850,6 +1853,9 @@ type SearchForBlocksParams struct { // Proposer Block proposer. Comma separated list of addresses. Proposer *[]string `form:"proposer,omitempty" json:"proposer,omitempty"` + + // Expired Expired participation accounts. Comma separated list of addresses. + Expired *[]string `form:"expired,omitempty" json:"expired,omitempty"` } // LookupBlockParams defines parameters for LookupBlock. diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 8fa4669c2..c0ff562fc 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -887,6 +887,9 @@ }, { "$ref": "#/parameters/proposer" + }, + { + "$ref": "#/parameters/expired" } ], "responses": { @@ -2729,6 +2732,17 @@ } }, "parameters": { + "expired": { + "type": "array", + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "description": "Expired participation accounts. Comma separated list of addresses.", + "name": "expired", + "in": "query", + "required": false + }, "proposer": { "type": "array", "items": { diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 400afb517..69f45d431 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -135,6 +135,20 @@ "type": "boolean" } }, + "expired": { + "description": "Expired participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "expired", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" + }, "group-id": { "description": "Lookup transactions by group ID. This field must be base64-encoded, and afterwards, base64 characters like +, / and = must be URL-encoded", "in": "query", @@ -4889,6 +4903,20 @@ "type": "array" }, "style": "form" + }, + { + "description": "Expired participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "expired", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" } ], "responses": { diff --git a/idb/idb.go b/idb/idb.go index dfed45529..9633ac95a 100644 --- a/idb/idb.go +++ b/idb/idb.go @@ -230,12 +230,13 @@ type GetBlockOptions struct { // BlockFilter is a parameter object with all the block filter options. type BlockFilter struct { - Limit uint64 - MaxRound *uint64 - MinRound *uint64 - AfterTime time.Time - BeforeTime time.Time - Proposers map[sdk.Address]struct{} + Limit uint64 + MaxRound *uint64 + MinRound *uint64 + AfterTime time.Time + BeforeTime time.Time + Proposers map[sdk.Address]struct{} + ExpiredParticipationAccounts map[sdk.Address]struct{} } // TransactionFilter is a parameter object with all the transaction filter options. diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index cf81083e0..9d3707749 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -767,6 +767,16 @@ func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, fmt.Sprintf("( (header->'prp') IS NOT NULL AND ((header->'prp')::TEXT IN (%s)) )", strings.Join(proposersStr, ",")), ) } + if len(bf.ExpiredParticipationAccounts) > 0 { + var expiredStr []string + for addr := range bf.ExpiredParticipationAccounts { + expiredStr = append(expiredStr, `'`+addr.String()+`'`) + } + whereParts = append( + whereParts, + fmt.Sprintf("( (header->'partupdrmv') IS NOT NULL AND (header->'partupdrmv') ?| array[%s] )", strings.Join(expiredStr, ",")), + ) + } } // SELECT, FROM From 56adbcd1c6d19da95e7cadac393a0db8a12ba26b Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Thu, 17 Oct 2024 20:51:20 -0300 Subject: [PATCH 07/14] Add missing index --- idb/postgres/internal/schema/setup_postgres.sql | 3 ++- idb/postgres/internal/schema/setup_postgres_sql.go | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/idb/postgres/internal/schema/setup_postgres.sql b/idb/postgres/internal/schema/setup_postgres.sql index 4f3ccca58..8f90c081f 100644 --- a/idb/postgres/internal/schema/setup_postgres.sql +++ b/idb/postgres/internal/schema/setup_postgres.sql @@ -6,7 +6,8 @@ CREATE TABLE public.block_header ( header JSONB NOT NULL, CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), INDEX block_header_time (realtime ASC), - INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL + INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL, + INVERTED INDEX block_header_expired ((header->'partupdrmv')) WHERE (header->'partupdrmv' IS NOT NULL) ); CREATE TABLE public.txn ( diff --git a/idb/postgres/internal/schema/setup_postgres_sql.go b/idb/postgres/internal/schema/setup_postgres_sql.go index 02fe8b649..cf9256c92 100644 --- a/idb/postgres/internal/schema/setup_postgres_sql.go +++ b/idb/postgres/internal/schema/setup_postgres_sql.go @@ -10,7 +10,9 @@ CREATE TABLE public.block_header ( header JSONB NOT NULL, CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), INDEX block_header_time (realtime ASC), - INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL + INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL, + INVERTED INDEX block_header_expired ((header->'partupdrmv')) WHERE (header->'partupdrmv' IS NOT NULL) +; ); CREATE TABLE public.txn ( From 92b57ad966cb52a2804512a3735ce1a9e88a0614 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Thu, 17 Oct 2024 23:11:20 -0300 Subject: [PATCH 08/14] Add `absent` parameter to `GET /v2/blocks` --- api/converter_utils.go | 9 + api/generated/common/routes.go | 368 +++++++------- api/generated/common/types.go | 3 + api/generated/v2/routes.go | 463 +++++++++--------- api/generated/v2/types.go | 6 + api/indexer.oas2.json | 14 + api/indexer.oas3.yml | 28 ++ idb/idb.go | 1 + .../internal/schema/setup_postgres.sql | 3 +- .../internal/schema/setup_postgres_sql.go | 4 +- idb/postgres/postgres.go | 10 + 11 files changed, 494 insertions(+), 415 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index e47852187..606a293e5 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -860,6 +860,15 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search filter.ExpiredParticipationAccounts[addr] = struct{}{} } } + + filter.AbsentParticipationAccounts = make(map[sdk.Address]struct{}, 0) + if params.Absent != nil { + for _, s := range *params.Absent { + var addr sdk.Address + addr, errorArr = decodeSdkAddress(s, "absent", errorArr) + filter.AbsentParticipationAccounts[addr] = struct{}{} + } + } } // If there were any errorArr while setting up the BlockFilter, return now. diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 32caf9c99..6e5e8d6e4 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -73,190 +73,190 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 91879422f..fd2b8951c 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -1144,6 +1144,9 @@ type TransactionStateProof struct { StateProofType *uint64 `json:"state-proof-type,omitempty"` } +// Absent defines model for absent. +type Absent = []string + // AccountId defines model for account-id. type AccountId = string diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index c743b7fd3..3566f539f 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1039,6 +1039,13 @@ func (w *ServerInterfaceWrapper) SearchForBlocks(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter expired: %s", err)) } + // ------------- Optional query parameter "absent" ------------- + + err = runtime.BindQueryParameter("form", false, false, "absent", ctx.QueryParams(), ¶ms.Absent) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter absent: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments err = w.Handler.SearchForBlocks(ctx, params) return err @@ -1291,234 +1298,234 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL var swaggerSpec = []string{ "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", - "8eTD/w8AAP//iQizO9CNAQA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 7d73a013f..5ffec6411 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1232,6 +1232,9 @@ type TransactionStateProof struct { StateProofType *uint64 `json:"state-proof-type,omitempty"` } +// Absent defines model for absent. +type Absent = []string + // AccountId defines model for account-id. type AccountId = string @@ -1856,6 +1859,9 @@ type SearchForBlocksParams struct { // Expired Expired participation accounts. Comma separated list of addresses. Expired *[]string `form:"expired,omitempty" json:"expired,omitempty"` + + // Absent Absent participation accounts. Comma separated list of addresses. + Absent *[]string `form:"absent,omitempty" json:"absent,omitempty"` } // LookupBlockParams defines parameters for LookupBlock. diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index c0ff562fc..bc0d473c4 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -890,6 +890,9 @@ }, { "$ref": "#/parameters/expired" + }, + { + "$ref": "#/parameters/absent" } ], "responses": { @@ -2732,6 +2735,17 @@ } }, "parameters": { + "absent": { + "type": "array", + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "description": "Absent participation accounts. Comma separated list of addresses.", + "name": "absent", + "in": "query", + "required": false + }, "expired": { "type": "array", "items": { diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 69f45d431..4acae4d6a 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -1,6 +1,20 @@ { "components": { "parameters": { + "absent": { + "description": "Absent participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "absent", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" + }, "account-id": { "description": "account string", "in": "path", @@ -4917,6 +4931,20 @@ "type": "array" }, "style": "form" + }, + { + "description": "Absent participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "absent", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" } ], "responses": { diff --git a/idb/idb.go b/idb/idb.go index 9633ac95a..61c4430e2 100644 --- a/idb/idb.go +++ b/idb/idb.go @@ -237,6 +237,7 @@ type BlockFilter struct { BeforeTime time.Time Proposers map[sdk.Address]struct{} ExpiredParticipationAccounts map[sdk.Address]struct{} + AbsentParticipationAccounts map[sdk.Address]struct{} } // TransactionFilter is a parameter object with all the transaction filter options. diff --git a/idb/postgres/internal/schema/setup_postgres.sql b/idb/postgres/internal/schema/setup_postgres.sql index 8f90c081f..458f6ead9 100644 --- a/idb/postgres/internal/schema/setup_postgres.sql +++ b/idb/postgres/internal/schema/setup_postgres.sql @@ -7,7 +7,8 @@ CREATE TABLE public.block_header ( CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), INDEX block_header_time (realtime ASC), INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL, - INVERTED INDEX block_header_expired ((header->'partupdrmv')) WHERE (header->'partupdrmv' IS NOT NULL) + INVERTED INDEX block_header_expired ((header->'partupdrmv')) WHERE (header->'partupdrmv' IS NOT NULL), + INVERTED INDEX block_header_absent ((header->'partupdabs')) WHERE (header->'partupdabs' IS NOT NULL) ); CREATE TABLE public.txn ( diff --git a/idb/postgres/internal/schema/setup_postgres_sql.go b/idb/postgres/internal/schema/setup_postgres_sql.go index cf9256c92..328ec13fa 100644 --- a/idb/postgres/internal/schema/setup_postgres_sql.go +++ b/idb/postgres/internal/schema/setup_postgres_sql.go @@ -11,8 +11,8 @@ CREATE TABLE public.block_header ( CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), INDEX block_header_time (realtime ASC), INDEX block_header_idx_proposer (((header->'prp')::TEXT), round) WHERE (header->'prp') IS NOT NULL, - INVERTED INDEX block_header_expired ((header->'partupdrmv')) WHERE (header->'partupdrmv' IS NOT NULL) -; + INVERTED INDEX block_header_expired ((header->'partupdrmv')) WHERE (header->'partupdrmv' IS NOT NULL), + INVERTED INDEX block_header_absent ((header->'partupdabs')) WHERE (header->'partupdabs' IS NOT NULL) ); CREATE TABLE public.txn ( diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 9d3707749..efa281f80 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -777,6 +777,16 @@ func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, fmt.Sprintf("( (header->'partupdrmv') IS NOT NULL AND (header->'partupdrmv') ?| array[%s] )", strings.Join(expiredStr, ",")), ) } + if len(bf.AbsentParticipationAccounts) > 0 { + var absentStr []string + for addr := range bf.AbsentParticipationAccounts { + absentStr = append(absentStr, `'`+addr.String()+`'`) + } + whereParts = append( + whereParts, + fmt.Sprintf("( (header->'partupdabs') IS NOT NULL AND (header->'partupdabs') ?| array[%s] )", strings.Join(absentStr, ",")), + ) + } } // SELECT, FROM From 74a1e4ffa662bc8328ebb69b3547eb4f47515fe9 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Tue, 22 Oct 2024 19:42:58 -0300 Subject: [PATCH 09/14] Optimize SQL query related to `GET /v2/blocks` --- idb/postgres/postgres.go | 203 +++++++++++++++++++++++++++++---------- 1 file changed, 150 insertions(+), 53 deletions(-) diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index efa281f80..6fd971071 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -723,99 +723,196 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] return } -func buildBlockQuery(bf idb.BlockFilter) (query string, whereArgs []interface{}, err error) { +// buildBlockWhereTerms generates some of the terms that go in the WHERE clause for the block search query. +// +// It only generates terms that filter blocks based on round and/or timestamp. +// +// Filters related to participacion are generated elsewhere. +func buildBlockWhereTerms(bf idb.BlockFilter) []string { + + var terms []string + + // Round-based filters + if bf.MaxRound != nil { + terms = append( + terms, + fmt.Sprintf("round <= %d", *bf.MaxRound), + ) + } + if bf.MinRound != nil { + terms = append( + terms, + fmt.Sprintf("round >= %d", *bf.MinRound), + ) + } + + // Timestamp-based filters + // + // Converting the timestamp into a round usually results in faster execution plans + // (compared to the execution plans that would result from using the `block_header.realtime` column directly) + if !bf.AfterTime.IsZero() { + tmpl := ` + round >= ( + SELECT tmp.round + FROM block_header tmp + WHERE tmp.realtime > (to_timestamp(%d) AT TIME ZONE 'UTC') + ORDER BY tmp.realtime ASC, tmp.round ASC + LIMIT 1 + )` + terms = append( + terms, + fmt.Sprintf(tmpl, bf.AfterTime.UTC().Unix()), + ) + } + if !bf.BeforeTime.IsZero() { + tmpl := ` + round <= ( + SELECT tmp.round + FROM block_header tmp + WHERE tmp.realtime < (to_timestamp(%d) AT TIME ZONE 'UTC') + ORDER BY tmp.realtime DESC, tmp.round DESC + LIMIT 1 + )` + terms = append( + terms, + fmt.Sprintf(tmpl, bf.BeforeTime.UTC().Unix()), + ) + } + + return terms +} - // Compute the terms in the WHERE clause - whereParts := make([]string, 0) - whereArgs = make([]interface{}, 0) +func buildBlockQuery(bf idb.BlockFilter) (query string, err error) { + + // helper function to build CTEs + buildCte := func(cteName string, whereTerms []string) string { + tmpl := `%s AS ( + SELECT round, header + FROM block_header + WHERE %s + ORDER BY round ASC + LIMIT %d + )` + return fmt.Sprintf(tmpl, cteName, strings.Join(whereTerms, " AND "), bf.Limit) + } + + // Build auxiliary CTEs for participation-related parameters. + // + // Using CTEs in this way turned out to be necessary to lead CockroachDB's query optimizer + // into using the execution plan we want. + // + // If we were to put the CTE filters in the main query's WHERE clause, that would result + // in a sub-optimal execution plan. At least this was the case at the time of writing. + var CTEs []string + var CteNames []string { - var partNumber int - - if bf.MaxRound != nil { - partNumber++ - whereParts = append(whereParts, fmt.Sprintf("round <= $%d", partNumber)) - whereArgs = append(whereArgs, *bf.MaxRound) - } - if bf.MinRound != nil { - partNumber++ - whereParts = append(whereParts, fmt.Sprintf("round >= $%d", partNumber)) - whereArgs = append(whereArgs, *bf.MinRound) - } - if !bf.AfterTime.IsZero() { - partNumber++ - whereParts = append( - whereParts, - fmt.Sprintf("round >= (SELECT tmp.round FROM block_header tmp WHERE tmp.realtime > $%d ORDER BY tmp.realtime ASC, tmp.round ASC LIMIT 1)", partNumber), - ) - whereArgs = append(whereArgs, bf.AfterTime) - } - if !bf.BeforeTime.IsZero() { - partNumber++ - whereParts = append( - whereParts, - fmt.Sprintf("round <= (SELECT tmp.round FROM block_header tmp WHERE tmp.realtime < $%d ORDER BY tmp.realtime DESC, tmp.round DESC LIMIT 1)", partNumber), - ) - whereArgs = append(whereArgs, bf.BeforeTime) - } if len(bf.Proposers) > 0 { + terms := buildBlockWhereTerms(bf) var proposersStr []string for addr := range bf.Proposers { proposersStr = append(proposersStr, `'"`+addr.String()+`"'`) } - whereParts = append( - whereParts, + terms = append( + terms, fmt.Sprintf("( (header->'prp') IS NOT NULL AND ((header->'prp')::TEXT IN (%s)) )", strings.Join(proposersStr, ",")), ) + + cteName := "prp" + cte := buildCte(cteName, terms) + CTEs = append(CTEs, cte) + CteNames = append(CteNames, cteName) + } if len(bf.ExpiredParticipationAccounts) > 0 { + terms := buildBlockWhereTerms(bf) var expiredStr []string for addr := range bf.ExpiredParticipationAccounts { expiredStr = append(expiredStr, `'`+addr.String()+`'`) } - whereParts = append( - whereParts, + terms = append( + terms, fmt.Sprintf("( (header->'partupdrmv') IS NOT NULL AND (header->'partupdrmv') ?| array[%s] )", strings.Join(expiredStr, ",")), ) + + cteName := "expired" + CTE := buildCte(cteName, terms) + CTEs = append(CTEs, CTE) + CteNames = append(CteNames, "expired") + } if len(bf.AbsentParticipationAccounts) > 0 { + terms := buildBlockWhereTerms(bf) var absentStr []string for addr := range bf.AbsentParticipationAccounts { absentStr = append(absentStr, `'`+addr.String()+`'`) } - whereParts = append( - whereParts, + terms = append( + terms, fmt.Sprintf("( (header->'partupdabs') IS NOT NULL AND (header->'partupdabs') ?| array[%s] )", strings.Join(absentStr, ",")), ) + + cteName := "absent" + CTE := buildCte(cteName, terms) + CTEs = append(CTEs, CTE) + CteNames = append(CteNames, cteName) + } + if len(CteNames) > 0 { + var selects []string + for _, cteName := range CteNames { + selects = append(selects, fmt.Sprintf("SELECT * FROM %s", cteName)) + } + CTE := "tmp AS (" + strings.Join(selects, " UNION ") + ")" + CTEs = append(CTEs, CTE) } } - // SELECT, FROM - query = `SELECT header FROM block_header` - // WHERE - if len(whereParts) > 0 { - whereStr := strings.Join(whereParts, " AND ") - query += " WHERE " + whereStr - } - // ORDER BY - query += " ORDER BY round ASC" - // LIMIT - if bf.Limit != 0 { - query += fmt.Sprintf(" LIMIT %d", bf.Limit) + // Build the main query. It uses the CTEs, if any. + { + var withClause string + if len(CTEs) > 0 { + withClause = "WITH " + strings.Join(CTEs, ",\n") + } + + var fromTable string + if len(CTEs) > 0 { + fromTable = "tmp" + } else { + fromTable = "block_header" + } + + var whereClause string + if len(CTEs) == 0 { + terms := buildBlockWhereTerms(bf) + if len(terms) > 0 { + whereClause = "WHERE " + strings.Join(terms, " AND ") + "\n" + } + } + + tmpl := ` + %s + SELECT header + FROM %s + %s + ORDER BY round ASC + LIMIT %d` + + query = fmt.Sprintf(tmpl, withClause, fromTable, whereClause, bf.Limit) } - return + + return query, nil } // This function blocks. `tx` must be non-nil. func (db *IndexerDb) yieldBlocks(ctx context.Context, tx pgx.Tx, bf idb.BlockFilter, out chan<- idb.BlockRow) { - query, whereArgs, err := buildBlockQuery(bf) + query, err := buildBlockQuery(bf) if err != nil { err = fmt.Errorf("block query err %v", err) out <- idb.BlockRow{Error: err} return } - rows, err := tx.Query(ctx, query, whereArgs...) + rows, err := tx.Query(ctx, query) if err != nil { err = fmt.Errorf("block query %#v err %v", query, err) out <- idb.BlockRow{Error: err} From d8c260c48503f36f10cb25d727e53677307bd45f Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Tue, 22 Oct 2024 19:45:20 -0300 Subject: [PATCH 10/14] Lint --- idb/postgres/postgres.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 6fd971071..3387786f4 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -727,7 +727,7 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] // // It only generates terms that filter blocks based on round and/or timestamp. // -// Filters related to participacion are generated elsewhere. +// Filters related to participation are generated elsewhere. func buildBlockWhereTerms(bf idb.BlockFilter) []string { var terms []string From 30fec0576495877ef0c68787f3a2bb9ad188d2d1 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Tue, 22 Oct 2024 20:26:50 -0300 Subject: [PATCH 11/14] Add parameters to endpoint `GET /v2/blocks` Add `updates` and `participation` parameters to the endpoint `GET /v2/blocks`. --- api/converter_utils.go | 41 +++ api/generated/common/routes.go | 369 +++++++++++++------------- api/generated/common/types.go | 6 + api/generated/v2/routes.go | 464 +++++++++++++++++---------------- api/generated/v2/types.go | 12 + api/indexer.oas2.json | 34 ++- api/indexer.oas3.yml | 56 ++++ 7 files changed, 571 insertions(+), 411 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 606a293e5..610520a03 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -843,6 +843,26 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search // Address list { + numParticipationFilters := 0 + if params.Proposer != nil { + numParticipationFilters++ + } + if params.Expired != nil { + numParticipationFilters++ + } + if params.Absent != nil { + numParticipationFilters++ + } + if params.Updates != nil { + numParticipationFilters++ + } + if params.Participation != nil { + numParticipationFilters++ + } + if numParticipationFilters > 1 { + errorArr = append(errorArr, "only one of `proposer`, `expired`, `absent`, `updates`, or `participation` can be specified") + } + filter.Proposers = make(map[sdk.Address]struct{}, 0) if params.Proposer != nil { for _, s := range *params.Proposer { @@ -869,6 +889,27 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search filter.AbsentParticipationAccounts[addr] = struct{}{} } } + + // Updates = absent || expired + if params.Updates != nil { + for _, s := range *params.Updates { + var addr sdk.Address + addr, errorArr = decodeSdkAddress(s, "updates", errorArr) + filter.AbsentParticipationAccounts[addr] = struct{}{} + filter.ExpiredParticipationAccounts[addr] = struct{}{} + } + } + + // Participation = proposer || absent || expired + if params.Participation != nil { + for _, s := range *params.Participation { + var addr sdk.Address + addr, errorArr = decodeSdkAddress(s, "participation", errorArr) + filter.Proposers[addr] = struct{}{} + filter.AbsentParticipationAccounts[addr] = struct{}{} + filter.ExpiredParticipationAccounts[addr] = struct{}{} + } + } } // If there were any errorArr while setting up the BlockFilter, return now. diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 6e5e8d6e4..87a72ac47 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -73,190 +73,191 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index fd2b8951c..0ee1979d4 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -1213,6 +1213,9 @@ type Next = string // NotePrefix defines model for note-prefix. type NotePrefix = string +// Participation defines model for participation. +type Participation = []string + // Proposer defines model for proposer. type Proposer = []string @@ -1237,6 +1240,9 @@ type TxType string // Txid defines model for txid. type Txid = string +// Updates defines model for updates. +type Updates = []string + // AccountResponse defines model for AccountResponse. type AccountResponse struct { // Account Account information at a given round. diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 3566f539f..9ef716617 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1046,6 +1046,20 @@ func (w *ServerInterfaceWrapper) SearchForBlocks(ctx echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter absent: %s", err)) } + // ------------- Optional query parameter "updates" ------------- + + err = runtime.BindQueryParameter("form", false, false, "updates", ctx.QueryParams(), ¶ms.Updates) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter updates: %s", err)) + } + + // ------------- Optional query parameter "participation" ------------- + + err = runtime.BindQueryParameter("form", false, false, "participation", ctx.QueryParams(), ¶ms.Participation) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter participation: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments err = w.Handler.SearchForBlocks(ctx, params) return err @@ -1297,235 +1311,237 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "AA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 5ffec6411..7c19ea411 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1301,6 +1301,9 @@ type Next = string // NotePrefix defines model for note-prefix. type NotePrefix = string +// Participation defines model for participation. +type Participation = []string + // Proposer defines model for proposer. type Proposer = []string @@ -1325,6 +1328,9 @@ type TxType string // Txid defines model for txid. type Txid = string +// Updates defines model for updates. +type Updates = []string + // AccountResponse defines model for AccountResponse. type AccountResponse struct { // Account Account information at a given round. @@ -1862,6 +1868,12 @@ type SearchForBlocksParams struct { // Absent Absent participation accounts. Comma separated list of addresses. Absent *[]string `form:"absent,omitempty" json:"absent,omitempty"` + + // Updates Expired or absent participation accounts. Comma separated list of addresses. + Updates *[]string `form:"updates,omitempty" json:"updates,omitempty"` + + // Participation Proposer, expired or absent participation accounts. Comma separated list of addresses. + Participation *[]string `form:"participation,omitempty" json:"participation,omitempty"` } // LookupBlockParams defines parameters for LookupBlock. diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index bc0d473c4..4afdd3d1e 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -893,6 +893,12 @@ }, { "$ref": "#/parameters/absent" + }, + { + "$ref": "#/parameters/updates" + }, + { + "$ref": "#/parameters/participation" } ], "responses": { @@ -2735,6 +2741,17 @@ } }, "parameters": { + "proposer": { + "type": "array", + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "description": "Block proposer. Comma separated list of addresses.", + "name": "proposer", + "in": "query", + "required": false + }, "absent": { "type": "array", "items": { @@ -2757,14 +2774,25 @@ "in": "query", "required": false }, - "proposer": { + "updates": { "type": "array", "items": { "type": "string", "x-algorand-format": "Address" }, - "description": "Block proposer. Comma separated list of addresses.", - "name": "proposer", + "description": "Expired or absent participation accounts. Comma separated list of addresses.", + "name": "updates", + "in": "query", + "required": false + }, + "participation": { + "type": "array", + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "description": "Proposer, expired or absent participation accounts. Comma separated list of addresses.", + "name": "participation", "in": "query", "required": false }, diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 4acae4d6a..aeb444b36 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -231,6 +231,20 @@ }, "x-algorand-format": "base64" }, + "participation": { + "description": "Proposer, expired or absent participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "participation", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" + }, "proposer": { "description": "Block proposer. Comma separated list of addresses.", "explode": false, @@ -316,6 +330,20 @@ "schema": { "type": "string" } + }, + "updates": { + "description": "Expired or absent participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "updates", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" } }, "responses": { @@ -4945,6 +4973,34 @@ "type": "array" }, "style": "form" + }, + { + "description": "Expired or absent participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "updates", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" + }, + { + "description": "Proposer, expired or absent participation accounts. Comma separated list of addresses.", + "explode": false, + "in": "query", + "name": "participation", + "schema": { + "items": { + "type": "string", + "x-algorand-format": "Address" + }, + "type": "array" + }, + "style": "form" } ], "responses": { From d098f006187f8eac1c00e7ef7a8e9465b36aed3a Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Tue, 22 Oct 2024 21:00:15 -0300 Subject: [PATCH 12/14] Validate account list sizes --- api/converter_utils.go | 18 ++++++++++++++++++ api/handlers.go | 1 - api/server.go | 6 ++++++ cmd/algorand-indexer/daemon.go | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 610520a03..ed53e5891 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -843,6 +843,7 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search // Address list { + // Make sure at most one of the participation parameters is set numParticipationFilters := 0 if params.Proposer != nil { numParticipationFilters++ @@ -863,6 +864,23 @@ func (si *ServerImplementation) blockParamsToBlockFilter(params generated.Search errorArr = append(errorArr, "only one of `proposer`, `expired`, `absent`, `updates`, or `participation` can be specified") } + // Validate the number of items in the participation account lists + if params.Proposer != nil && uint64(len(*params.Proposer)) > si.opts.MaxAccountListSize { + errorArr = append(errorArr, fmt.Sprintf("proposer list too long, max size is %d", si.opts.MaxAccountListSize)) + } + if params.Expired != nil && uint64(len(*params.Expired)) > si.opts.MaxAccountListSize { + errorArr = append(errorArr, fmt.Sprintf("expired list too long, max size is %d", si.opts.MaxAccountListSize)) + } + if params.Absent != nil && uint64(len(*params.Absent)) > si.opts.MaxAccountListSize { + errorArr = append(errorArr, fmt.Sprintf("absent list too long, max size is %d", si.opts.MaxAccountListSize)) + } + if params.Updates != nil && uint64(len(*params.Updates)) > si.opts.MaxAccountListSize { + errorArr = append(errorArr, fmt.Sprintf("updates list too long, max size is %d", si.opts.MaxAccountListSize)) + } + if params.Participation != nil && uint64(len(*params.Participation)) > si.opts.MaxAccountListSize { + errorArr = append(errorArr, fmt.Sprintf("participation list too long, max size is %d", si.opts.MaxAccountListSize)) + } + filter.Proposers = make(map[sdk.Address]struct{}, 0) if params.Proposer != nil { for _, s := range *params.Proposer { diff --git a/api/handlers.go b/api/handlers.go index 5ae09a7f7..6e3f48665 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -1005,7 +1005,6 @@ func (si *ServerImplementation) LookupTransaction(ctx echo.Context, txid string) // SearchForBlocks returns block headers matching the provided parameters // (GET /v2/blocks) func (si *ServerImplementation) SearchForBlocks(ctx echo.Context, params generated.SearchForBlocksParams) error { - // Validate query parameters if err := si.verifyHandler("SearchForBlocks", ctx); err != nil { return badRequest(ctx, err.Error()) diff --git a/api/server.go b/api/server.go index cb172a362..6a703d24a 100644 --- a/api/server.go +++ b/api/server.go @@ -44,6 +44,12 @@ type ExtraOptions struct { // If an address exceeds this number, a 400 error is returned. Zero means unlimited. MaxAPIResourcesPerAccount uint64 + // MaxAccountListSize is the maximum number of items that can be passed in query parameter account lists. + // (e.g.: GET /v2/blocks?proposer=A,B,C) + // + // Zero means unlimited. + MaxAccountListSize uint64 + ///////////////////// // Limit Constants // ///////////////////// diff --git a/cmd/algorand-indexer/daemon.go b/cmd/algorand-indexer/daemon.go index 671e0eab7..39fc4888d 100644 --- a/cmd/algorand-indexer/daemon.go +++ b/cmd/algorand-indexer/daemon.go @@ -32,6 +32,7 @@ type daemonConfig struct { readTimeout time.Duration maxConn uint32 maxAPIResourcesPerAccount uint32 + maxAccountListSize uint32 maxBlocksLimit uint32 defaultBlocksLimit uint32 maxTransactionsLimit uint32 @@ -81,6 +82,7 @@ func DaemonCmd() *cobra.Command { cfg.flags.StringVar(&cfg.suppliedAPIConfigFile, "api-config-file", "", "supply an API config file to enable/disable parameters") cfg.flags.BoolVar(&cfg.enableAllParameters, "enable-all-parameters", false, "override default configuration and enable all parameters. Can't be used with --api-config-file") cfg.flags.Uint32VarP(&cfg.maxAPIResourcesPerAccount, "max-api-resources-per-account", "", 1000, "set the maximum total number of resources (created assets, created apps, asset holdings, and application local state) per account that will be allowed in REST API lookupAccountByID and searchForAccounts responses before returning a 400 Bad Request. Set zero for no limit") + cfg.flags.Uint32VarP(&cfg.maxAccountListSize, "max-account-list-size", "", 50, "set the maximum number of items for query parameters that accept account lists. Set zero for no limit") cfg.flags.Uint32VarP(&cfg.maxBlocksLimit, "max-blocks-limit", "", 1000, "set the maximum allowed Limit parameter for querying blocks") cfg.flags.Uint32VarP(&cfg.defaultBlocksLimit, "default-blocks-limit", "", 100, "set the default Limit parameter for querying blocks, if none is provided") cfg.flags.Uint32VarP(&cfg.maxTransactionsLimit, "max-transactions-limit", "", 10000, "set the maximum allowed Limit parameter for querying transactions") @@ -323,6 +325,7 @@ func makeOptions(daemonConfig *daemonConfig) (options api.ExtraOptions) { options.ReadTimeout = daemonConfig.readTimeout options.MaxAPIResourcesPerAccount = uint64(daemonConfig.maxAPIResourcesPerAccount) + options.MaxAccountListSize = uint64(daemonConfig.maxAccountListSize) options.MaxBlocksLimit = uint64(daemonConfig.maxBlocksLimit) options.DefaultBlocksLimit = uint64(daemonConfig.defaultBlocksLimit) options.MaxTransactionsLimit = uint64(daemonConfig.maxTransactionsLimit) From defea653594bffe5e884cfefe3a2f1645a6811db Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Tue, 22 Oct 2024 22:08:09 -0300 Subject: [PATCH 13/14] Write better descriptions for query parameters Write better descriptions for query parameters in `GET /v2/blocks` --- api/generated/common/routes.go | 371 +++++++++++++------------- api/generated/v2/routes.go | 462 ++++++++++++++++----------------- api/generated/v2/types.go | 10 +- api/indexer.oas2.json | 10 +- api/indexer.oas3.yml | 20 +- 5 files changed, 437 insertions(+), 436 deletions(-) diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 87a72ac47..7fe53b159 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -72,192 +72,193 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "sSCa/mjpAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 9ef716617..54ac3db2d 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1311,237 +1311,237 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "AA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 7c19ea411..052287ec3 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -1860,19 +1860,19 @@ type SearchForBlocksParams struct { // AfterTime Include results after the given time. Must be an RFC 3339 formatted string. AfterTime *time.Time `form:"after-time,omitempty" json:"after-time,omitempty"` - // Proposer Block proposer. Comma separated list of addresses. + // Proposer Account(s) marked as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses. Proposer *[]string `form:"proposer,omitempty" json:"proposer,omitempty"` - // Expired Expired participation accounts. Comma separated list of addresses. + // Expired Account(s) marked as expired in the block header's participation updates. This parameter accepts a comma separated list of addresses. Expired *[]string `form:"expired,omitempty" json:"expired,omitempty"` - // Absent Absent participation accounts. Comma separated list of addresses. + // Absent Account(s) marked as absent in the block header's participation updates. This parameter accepts a comma separated list of addresses. Absent *[]string `form:"absent,omitempty" json:"absent,omitempty"` - // Updates Expired or absent participation accounts. Comma separated list of addresses. + // Updates Account(s) marked as expired or absent in the block header's participation updates. This parameter accepts a comma separated list of addresses. Updates *[]string `form:"updates,omitempty" json:"updates,omitempty"` - // Participation Proposer, expired or absent participation accounts. Comma separated list of addresses. + // Participation Account(s) marked as expired, absent or as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses. Participation *[]string `form:"participation,omitempty" json:"participation,omitempty"` } diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 4afdd3d1e..164c8cf80 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -2747,7 +2747,7 @@ "type": "string", "x-algorand-format": "Address" }, - "description": "Block proposer. Comma separated list of addresses.", + "description": "Account(s) marked as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "name": "proposer", "in": "query", "required": false @@ -2758,7 +2758,7 @@ "type": "string", "x-algorand-format": "Address" }, - "description": "Absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as absent in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "name": "absent", "in": "query", "required": false @@ -2769,7 +2769,7 @@ "type": "string", "x-algorand-format": "Address" }, - "description": "Expired participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "name": "expired", "in": "query", "required": false @@ -2780,7 +2780,7 @@ "type": "string", "x-algorand-format": "Address" }, - "description": "Expired or absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired or absent in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "name": "updates", "in": "query", "required": false @@ -2791,7 +2791,7 @@ "type": "string", "x-algorand-format": "Address" }, - "description": "Proposer, expired or absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired, absent or as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "name": "participation", "in": "query", "required": false diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index aeb444b36..07aadbbe8 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -2,7 +2,7 @@ "components": { "parameters": { "absent": { - "description": "Absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as absent in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "absent", @@ -150,7 +150,7 @@ } }, "expired": { - "description": "Expired participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "expired", @@ -232,7 +232,7 @@ "x-algorand-format": "base64" }, "participation": { - "description": "Proposer, expired or absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired, absent or as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "participation", @@ -246,7 +246,7 @@ "style": "form" }, "proposer": { - "description": "Block proposer. Comma separated list of addresses.", + "description": "Account(s) marked as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "proposer", @@ -332,7 +332,7 @@ } }, "updates": { - "description": "Expired or absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired or absent in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "updates", @@ -4933,7 +4933,7 @@ "x-algorand-format": "RFC3339 String" }, { - "description": "Block proposer. Comma separated list of addresses.", + "description": "Account(s) marked as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "proposer", @@ -4947,7 +4947,7 @@ "style": "form" }, { - "description": "Expired participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "expired", @@ -4961,7 +4961,7 @@ "style": "form" }, { - "description": "Absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as absent in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "absent", @@ -4975,7 +4975,7 @@ "style": "form" }, { - "description": "Expired or absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired or absent in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "updates", @@ -4989,7 +4989,7 @@ "style": "form" }, { - "description": "Proposer, expired or absent participation accounts. Comma separated list of addresses.", + "description": "Account(s) marked as expired, absent or as proposer in the block header's participation updates. This parameter accepts a comma separated list of addresses.", "explode": false, "in": "query", "name": "participation", From d83ddd9f35334c319bdb6592e6adc5ca85aad9a4 Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Wed, 23 Oct 2024 19:56:01 -0300 Subject: [PATCH 14/14] Fix error in SQL query --- idb/postgres/postgres.go | 112 +++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 51 deletions(-) diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 3387786f4..ce3723b4e 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -723,26 +723,25 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] return } -// buildBlockWhereTerms generates some of the terms that go in the WHERE clause for the block search query. -// -// It only generates terms that filter blocks based on round and/or timestamp. +// buildBlockFilters generates filters based on a block's round and/or timestamp. // // Filters related to participation are generated elsewhere. -func buildBlockWhereTerms(bf idb.BlockFilter) []string { - - var terms []string +// +// Some of the filters are meant to be used as boolean conditions in the WHERE clause. +// Others, for performance reasons, have to be used as INNER JOIN terms in the FROM clause. +func buildBlockFilters(bf idb.BlockFilter) (whereTerms []string, joinTerms []string) { // Round-based filters if bf.MaxRound != nil { - terms = append( - terms, - fmt.Sprintf("round <= %d", *bf.MaxRound), + whereTerms = append( + whereTerms, + fmt.Sprintf("bh.round <= %d", *bf.MaxRound), ) } if bf.MinRound != nil { - terms = append( - terms, - fmt.Sprintf("round >= %d", *bf.MinRound), + whereTerms = append( + whereTerms, + fmt.Sprintf("bh.round >= %d", *bf.MinRound), ) } @@ -750,50 +749,56 @@ func buildBlockWhereTerms(bf idb.BlockFilter) []string { // // Converting the timestamp into a round usually results in faster execution plans // (compared to the execution plans that would result from using the `block_header.realtime` column directly) + // + // Unfortunately, writing this condition in the WHERE clause results in poor execution plans. + // Expressing the filter as an INNER JOIN results in an efficient query execution plan. if !bf.AfterTime.IsZero() { tmpl := ` - round >= ( - SELECT tmp.round + INNER JOIN ( + SELECT COALESCE(tmp.round, 0) AS round FROM block_header tmp WHERE tmp.realtime > (to_timestamp(%d) AT TIME ZONE 'UTC') ORDER BY tmp.realtime ASC, tmp.round ASC LIMIT 1 - )` - terms = append( - terms, + ) bh_at ON bh.round >= bh_at.round + ` + joinTerms = append( + joinTerms, fmt.Sprintf(tmpl, bf.AfterTime.UTC().Unix()), ) } if !bf.BeforeTime.IsZero() { tmpl := ` - round <= ( - SELECT tmp.round + INNER JOIN ( + SELECT COALESCE(tmp.round, 0) AS round FROM block_header tmp WHERE tmp.realtime < (to_timestamp(%d) AT TIME ZONE 'UTC') ORDER BY tmp.realtime DESC, tmp.round DESC LIMIT 1 - )` - terms = append( - terms, + ) bh_bt ON bh.round <= bh_bt.round + ` + joinTerms = append( + joinTerms, fmt.Sprintf(tmpl, bf.BeforeTime.UTC().Unix()), ) } - return terms + return whereTerms, joinTerms } func buildBlockQuery(bf idb.BlockFilter) (query string, err error) { // helper function to build CTEs - buildCte := func(cteName string, whereTerms []string) string { + buildCte := func(cteName string, whereTerms []string, joinTerms []string) string { tmpl := `%s AS ( - SELECT round, header - FROM block_header + SELECT bh.round, bh.header + FROM block_header bh + %s WHERE %s - ORDER BY round ASC + ORDER BY bh.round ASC LIMIT %d )` - return fmt.Sprintf(tmpl, cteName, strings.Join(whereTerms, " AND "), bf.Limit) + return fmt.Sprintf(tmpl, cteName, strings.Join(joinTerms, "\n"), strings.Join(whereTerms, " AND "), bf.Limit) } // Build auxiliary CTEs for participation-related parameters. @@ -807,52 +812,52 @@ func buildBlockQuery(bf idb.BlockFilter) (query string, err error) { var CteNames []string { if len(bf.Proposers) > 0 { - terms := buildBlockWhereTerms(bf) + whereTerms, joinTerms := buildBlockFilters(bf) var proposersStr []string for addr := range bf.Proposers { proposersStr = append(proposersStr, `'"`+addr.String()+`"'`) } - terms = append( - terms, - fmt.Sprintf("( (header->'prp') IS NOT NULL AND ((header->'prp')::TEXT IN (%s)) )", strings.Join(proposersStr, ",")), + whereTerms = append( + whereTerms, + fmt.Sprintf("( (bh.header->'prp') IS NOT NULL AND ((bh.header->'prp')::TEXT IN (%s)) )", strings.Join(proposersStr, ",")), ) cteName := "prp" - cte := buildCte(cteName, terms) + cte := buildCte(cteName, whereTerms, joinTerms) CTEs = append(CTEs, cte) CteNames = append(CteNames, cteName) } if len(bf.ExpiredParticipationAccounts) > 0 { - terms := buildBlockWhereTerms(bf) + whereTerms, joinTerms := buildBlockFilters(bf) var expiredStr []string for addr := range bf.ExpiredParticipationAccounts { expiredStr = append(expiredStr, `'`+addr.String()+`'`) } - terms = append( - terms, - fmt.Sprintf("( (header->'partupdrmv') IS NOT NULL AND (header->'partupdrmv') ?| array[%s] )", strings.Join(expiredStr, ",")), + whereTerms = append( + whereTerms, + fmt.Sprintf("( (bh.header->'partupdrmv') IS NOT NULL AND (bh.header->'partupdrmv') ?| array[%s] )", strings.Join(expiredStr, ",")), ) cteName := "expired" - CTE := buildCte(cteName, terms) + CTE := buildCte(cteName, whereTerms, joinTerms) CTEs = append(CTEs, CTE) CteNames = append(CteNames, "expired") } if len(bf.AbsentParticipationAccounts) > 0 { - terms := buildBlockWhereTerms(bf) + whereTerms, joinTerms := buildBlockFilters(bf) var absentStr []string for addr := range bf.AbsentParticipationAccounts { absentStr = append(absentStr, `'`+addr.String()+`'`) } - terms = append( - terms, - fmt.Sprintf("( (header->'partupdabs') IS NOT NULL AND (header->'partupdabs') ?| array[%s] )", strings.Join(absentStr, ",")), + whereTerms = append( + whereTerms, + fmt.Sprintf("( (bh.header->'partupdabs') IS NOT NULL AND (bh.header->'partupdabs') ?| array[%s] )", strings.Join(absentStr, ",")), ) cteName := "absent" - CTE := buildCte(cteName, terms) + CTE := buildCte(cteName, whereTerms, joinTerms) CTEs = append(CTEs, CTE) CteNames = append(CteNames, cteName) } @@ -875,28 +880,33 @@ func buildBlockQuery(bf idb.BlockFilter) (query string, err error) { var fromTable string if len(CTEs) > 0 { - fromTable = "tmp" + fromTable = "tmp bh" } else { - fromTable = "block_header" + fromTable = "block_header bh" } var whereClause string + var joinClause string if len(CTEs) == 0 { - terms := buildBlockWhereTerms(bf) - if len(terms) > 0 { - whereClause = "WHERE " + strings.Join(terms, " AND ") + "\n" + whereTerms, joinTerms := buildBlockFilters(bf) + if len(whereTerms) > 0 { + whereClause = "WHERE " + strings.Join(whereTerms, " AND ") + "\n" + } + if len(joinTerms) > 0 { + joinClause = strings.Join(joinTerms, "\n") } } tmpl := ` %s - SELECT header + SELECT bh.header FROM %s %s - ORDER BY round ASC + %s + ORDER BY bh.round ASC LIMIT %d` - query = fmt.Sprintf(tmpl, withClause, fromTable, whereClause, bf.Limit) + query = fmt.Sprintf(tmpl, withClause, fromTable, joinClause, whereClause, bf.Limit) } return query, nil