All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
-
--parallel-job-sizeconfiguration parameter for thestellar-horizon db reingestcommand has been removed. Job size will be automatically determined based on the number of workers (configuration parameter --parallel-workers), distributing the range equally among them. The minimum job size will remain 64 ledgers and the start and end ledger range will be rounded to the nearest checkpoint.(5484) -
Removed
num_accountsandamountfields from Asset stats related endpoints, andvalid_beforeandvalid_afterfields from transaction related endpoints. Issue - 5438, PR - 5478- These fields have already been functionally deprecated as of release v2.1.0. As a part of this release, these fields are omitted from API Response
- Additionally, the
num_accountsandamountcolumns have been dropped fromexp_asset_statstable in Postgres.
- Reingest from pre-computed tx meta on remote cloud storage. (4911), (5374)
- Configure horizon reingestion to obtain ledger tx meta in pre-computed files from a Google Cloud Storage(GCS) location.
- Using this option will no longer require a captive core binary be present and it no longer runs a captive core sub-process, instead obtaining the tx meta from the GCS backend.
- Horizon supports this new feature with two new parameters
ledgerbackendanddatastore-configon thereingestcommand. Refer to Reingestion README.
- Add metrics for reaping of history lookup tables (5385).
- Add
--reap-lookup-tables(defaults to true) which will disable reaping of history lookup tables when set to false. (5366).
- Fix ingestion duration metric so it includes time spent reaping history lookup tables (5361).
- Optimize query for reaping history lookup tables (5393).
- Change ingestion filtering logic to store transactions if any filter matches on it. (5303)
- The previous behaviour was to store a tx only if both asset and account filters match together. So even if a tx matched an account filter but failed to match an asset filter, it would not be stored by Horizon.
- Captive-core configuration parameters updated to align with stellar-core v21 (5333)
- BucketlistDB is now the default database for stellar-core, deprecating the usage of
EXPERIMENTAL_BUCKETLIST_DBin captive core configuration toml. - A new mandatory parameter
DEPRECATED_SQL_LEDGER_STATE(default: false) is required by stellar-core on its captive core configuration toml file. if the toml provided byCAPTIVE_CORE_CONFIG_PATHdoes not have this new setting, Horizon will add it automatically, therefore, no action required. - If using
EXPERIMENTAL_BUCKETLIST_DB_INDEX_PAGE_SIZE_EXPONENTorEXPERIMENTAL_BUCKETLIST_DB_INDEX_CUTOFFin captive core configuration toml, they must be renamed toBUCKETLIST_DB_INDEX_PAGE_SIZE_EXPONENTandBUCKETLIST_DB_INDEX_CUTOFFrespectively.
- BucketlistDB is now the default database for stellar-core, deprecating the usage of
- Bump XDR definitions (5289), (5330)
- Add new async transaction submission endpoint (5188)
- Add
horizon_ingest_errors_totalmetric key (5302) - Add transaction hash to txsub timeout response (5328)
- Add new captive-core flags for V1 Meta (5309)
- Add version check for protocol 21 (5346)
- Improve horizon history reaper (5331). New reaper configuration flags
REAP_FREQUENCY- the frequency in units of ledgers for how often history is reaped.
- Fix the following ingestion error:
error preparing range: error starting prepare range: the previous Stellar-Core instance is still running(5307)
This release adds support for Protocol 21
- Bump XDR for protocol 21
- Make reaping batch sizes configurable via
--history-retention-reap-count(5272) - Log tx meta when ingestion failures occur (5268)
- Add deprecation warning for
--captive-core-use-db(5231)
- Optimized reingestion by addressing performance slowdown due to unnecessary operations on
history_transactions_filtered_tmp. Removed obsoleteEnableIngestionFilteringflag. (5283) - Fix deadlock in parallel ingestion (5263)
- Add missing tables to TruncateIngestStateTables() (5253)
- Performance improvements in ingest library
- New
db_error_totalmetrics key with labelsctx_error,db_error, anddb_error_extra(5225). - Bumped go version to the latest (1.22.1) (5232)
- Add metrics for ingestion loaders (5209).
- Add metrics for http api requests in flight and requests received (5240).
- Add
MAX_CONCURRENT_REQUESTS, defaults to 1000, limits the number of horizon api requests in flight (5244)
- History archive access is more effective when you pass list of URLs to Horizon: they will now be accessed in a round-robin fashion, use alternative archives on errors, and intelligently back off (5224)
- Remove captive core info request error logs (5145)
- Removed duplicate "Processed Ledger" log statement during resume state (5152)
- Fixed incorrect duration for ingestion processor metric (5216)
- Fixed sql performance on account transactions query (5229)
- Fix bug in claimable balance change processor (5246)
- Delay canceling queries from client side when there's a statement / transaction timeout configured in postgres (5223)
- The Horizon API Transaction resource field in json
result_meta_xdris now optional and Horizon API will not emit the field when Horizon has been configured withSKIP_TXMETA=true, effectively null, otherwise if Horizon is configured withSKIP_TXMETA=falsewhich is default, then the API Transaction fieldresult_meta_xdrwill remain present and populated with base64 encoded xdr 5228.
- Fix claimable_balance_claimants subquery in GetClaimableBalances() (5207)
- New optional config
SKIP_TXMETA(5189). Defaults toFALSE, whenTRUEthe following will occur:- history_transactions.tx_meta column will have serialized xdr that equates to empty for any protocol version, such as for
xdr.TransactionMeta.V3,Operations,TxChangesAfter,TxChangesBeforewill be empty arrays andSorobanMetawill be nil.
- history_transactions.tx_meta column will have serialized xdr that equates to empty for any protocol version, such as for
- Removed
DISABLE_SOROBAN_INGESTconfiguration parameter, use the newSKIP_TXMETAparameter instead.
- History archive caching would cause file corruption in certain environments (5197)
- Server error in claimable balance API when claimant, asset and cursor query params are supplied (5200)
- Submitting transaction with a future gapped sequence number greater than 1 past current source account sequence, may result in delayed 60s timeout response, rather than expected HTTP 400 error response with
result_codes: {transaction: "tx_bad_seq"}(5191)
- Ingestion performance improvements (4909)
- Trade aggregation rebuild errors reported on
db reingest rangewith parallel workers (5168) - Limited global flags displayed on cli help output (5077)
- Network usage has been significantly reduced with caching. Warning: To support the cache, disk requirements may increase by up to 15GB (5171).
- We now include metrics for history archive requests (5166)
- Http history archive requests now include a unique user agent (5166)
- Added a deprecation warning for using command-line flags when running Horizon (5051)
- New optional config
DISABLE_SOROBAN_INGEST(5175). Defaults toFALSE, whenTRUEand a soroban transaction is ingested, the following will occur:- no effects will be generated for contract invocations.
- history_transactions.tx_meta column will have serialized xdr that equates to an empty
xdr.TransactionMeta.V3,Operations,TxChangesAfter,TxChangesBeforewill empty arrays andSorobanMetawill be nil. - API transaction model for
result_meta_xdrwill have same empty serialized xdr forxdr.TransactionMeta.V3,Operations,TxChangesAfter,TxChangesBeforewill empty arrays andSorobanMetawill be nil. - API
Operationmodel forInvokeHostFunctionOptype, will have emptyasset_balance_changes
- Deprecation of legacy, non-captive core ingestion(5158):
-
removed configuration flags
--stellar-core-url-db,--cursor-name--skip-cursor-update, they are no longer usable. -
removed automatic updating of core cursor from ingestion background processing.
Note for upgrading on existing horizon deployments - Since horizon will no longer maintain advancement of this cursor on core, it may require manual removal of the cursor from the core process that your horizon was using for captive core, otherwise that core process may un-necessarily retain older data in buckets on disk up to the last cursor ledger sequence set by prior horizon release.The captive core process to check and verify presence of cursor usage is determined by the horizon deployment, if
NETWORKis present, orSTELLAR_CORE_URLis present orCAPTIVE-CORE-HTTP-PORTis present and set to non-zero value, orCAPTIVE-CORE_CONFIG_PATHis used and the toml hasHTTP_PORTset to non-zero andPUBLIC_HTTP_PORTis not set to false, then it is recommended to perform the following preventative measure on the machine hosting horizon after upgraded to 2.28.0 and process restarted:$ curl http://<captive_core_process_url:captive_core_process_port>/getcursor # If there are no cursors reported, done, no need for any action # If any horizon cursors exist they need to be dropped by id. # By default horizon sets cursor id to "HORIZON" but if it was customized # using the --cursor-name flag the id might be different $ curl http://<captive_core_process_url:captive_core_process_port>/dropcursor?id=<reported_id_from_getcursor>
-
- Ordering of effects are now deterministic. Previously the order of some Horizon effects could vary upon reingestion but this issue has now been fixed (5070).
- treat null is_payment values as equivalent to false values, avoid sql nil conversion errors(5060).
Upgrading to this version from <= 2.26.1 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
This release adds support for Protocol 20
- The command line flag
--remote-captive-core-urlhas been removed, as remote captive core functionality is now deprecated (4940). - The functionality of generating default captive core configuration based on the --network-passphrase is now deprecated. Use the --network command instead (4949).
- Added new command-line flag
--networkto specify the Stellar network (pubnet or testnet), aiming at simplifying the configuration process by automatically configuring the following parameters based on the chosen network:--history-archive-urls,--network-passphrase, and--captive-core-config-path(4949). - Added
contract_creditedandcontract_debitedeffects which are emitted whenever a Soroban contracts sends or receives a Stellar asset (4832).
- Added
num_contracts(total number of Soroban contracts which hold an asset) andcontracts_amount(total amount of the asset held by all Soroban contracts) fields to asset stat summaries at/assets(4805). - Added responses for new operations introduced in protocol 20:
invoke_host_function,bump_footprint_expiration, andrestore_footprint(4905).
- The same slippage calculation from the
v2.26.1hotfix now properly excludes spikes for smoother trade aggregation plots (4999). - Limit the display of global flags on command line help
-houtput (5077).
- Drop unused indices from the Horizon database. For the database with full history, the migration is anticipated to take up to an hour and is expected to free up approximately 1.3TB of storage (5081).
- Ingestion will not halt if liquidity pool overflows are detected.
- Improve error handling for when stellar-core crashes (4893)
- Suppress Core timeout error in log output such as
error ticking app: context deadline exceededwhen ingestion state machine is in build state. (4860)
- Modify the default value of
--captive-core-use-dbto true (4856)- This updates the default behavior of captive core to start in on-disk mode.
- To continue using the previous in-memory mode, explicitly set the
--captive-core-use-dbflag to false
- Running Horizon with remote captive core is now deprecated (4826).
- Add two new configuration variables to control the behavior of state verification (4821):
--ingest-state-verification-frequencywhich specifies the frequency in checkpoints for how often state verification is run--ingest-state-verification-timeoutwhich specifies a timeout on how long state verification can run
- Fix crash in horizon ingestion when running horizon with a remote captive core (4824).
- Bump Go to the latest version (1.20.1), including crypto/tls, mime/multipart, net/http, and path/filepath security fixes.
-
Add support for the experimental BucketListDB to Horizon, the parameters have been added to the Captive Core configuration / TOML files (4733):
- BucketListDB is enabled by default when
--captive-core-use-dbis set and yourstellar-coreversion >= 19.6 - If
--captive-core-use-dbset but yourstellar-coreversion < 19.6, an on-disk SQLite database is used (as before). - This update will not automatically trigger a state rebuild unless
EXPERIMENTAL_BUCKETLIST_DBis set to false in the Captive Core TOML file.
- BucketListDB is enabled by default when
- Improve error when setting
BUCKET_DIR_PATHand using Captive Core (4736).
- Bump Go to the latest version, including net/http security fixes.
Upgrading to this version will trigger a state rebuild. During this process, Horizon will not ingest new ledgers.
- Improve performance of
/claimable_balancesfilters. This change should significantly improve?asset=and?claimant=filters. (#4690). - Reallocate slices after offer removals in order book graph. This is done to prevent keeping a large chunks of allocated but unused memory that can lead to OOM crash.
- The ingestion subsystem will now properly use a pool of history archives if more than one is provided. (#4687)
- Add
horizon ingest build-statecommand which builds state at a specific ledger. Useful for debugging. (#4636)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
horizon db migratecommands will not apply migrations if ingestion is disabled (4664).
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Database migrations will now acquire a lock on ingestion, preventing possible deadlocks (4587).
- Optimizes startup by preserving the Captive Core storage directory if Horizon has ingested ahead of the requested ledger (4605).
- Introduces a new index that optimizes account queries filtered by asset (4635).
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Bump Go to the latest version, including net/http and net/url security fixes (4577)
- Added indexes by id for assets in the respective
history_tradestables. Ingestion will stop while the migration is being applied. (4565)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Added indexes by id for claimable balance and liquidity pool id's in the respective tx/ops tables. Ingestion will stop while the migration is being applied. (4455)
- Orphaned rows in lookup tables (
history_accounts,history_claimable_balancesandhistory_liquidity_pools) are removed in small batches after each ledger if--history-retention-countis set. (4518, 4525) - Improve restart time of Captive-Core when started with
--captive-core-use-dbflag. The solution does not work on Windows. (4471) - Fix a bug in which state verifier would run if condition checking DB query fails. (4523)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Update core version to 19.3.0 (4485).
- Pass
--consoleto captive core. This is due to a breaking change in stellar-core 19.3.0 (4487).
- Run postgres autovacuum on
history_trades_60000table more frequently. (4412). - Change
protocols/horizon.Transaction.AccountSequencetoint64fromstring. (4409). - Add missing signer key type names. (4429).
- Update core version to 19.2.0. (4441).
- Add
User-Agentheader to history archive HTTP requests. (4463).
The migration makes the following schema changes:
- tunes the
history_trades_60000table to run autovacuum more frequently. Migration should be brief, does not incur any data/runtime processing. It does not need a reingestion.
- Enabled txsub system to work if/when underlying horizon db connection is read only. (4418)
- Optimize the claimable balance SQL query for best index query plan performance(4398)
The migration makes the following schema changes:
- creates new,
history_transactions_filtered_tmptable related to enabling tx sub processing on read only, only ingest writes to the table. Deprecates, drops priortxsub_resultstable. Migration should be brief, does not incur any data/runtime processing.
-
New Experimental Ingestion Filters Feature: Provide the ability to select which ledger transactions are accepted at ingestion time to be stored on horizon's historical databse.
Define filter rules through Admin API and the historical ingestion process will check the rules and only persist the ledger transactions that pass the filter rules. Initially, two filters and corresponding rules are possible:
The filters and their configuration are optional features and must be enabled with horizon command line parameters
admin-port=4200andexp-enable-ingestion-filtering=trueOnce set, filter configurations and their rules are initially empty and the filters are disabled by default. To enable filters, update the configuration settings, refer to the Admin API Docs which are published on the Admin Port at http://localhost:<admin_port>/, follow details and examples for endpoints:
/ingestion/filters/account/ingestion/filters/asset.
- Querying claimable balances has been optimized (4385).
- Querying trade aggregations has been optimized (4389).
- Postgres connections for non ingesting Horizon instances are now configured to timeout on long running queries / transactions (4390).
- Added
disable-path-findingHorizon flag to disable the path finding endpoints. This flag should be enabled on ingesting Horizon instances which do not serve HTTP traffic (4399).
- Querying claimable balances has been optimized (4385).
- Querying trade aggregations has been optimized (4389).
- Postgres connections for non ingesting Horizon instances are now configured to timeout on long running queries / transactions (4390).
- Added
disable-path-findingHorizon flag to disable the path finding endpoints. This flag should be enabled on ingesting Horizon instances which do not serve HTTP traffic (4399).
This is the final release after the release candidate, including some small additional changes:
-
The transaction precondition record now excludes (4360):
min_account_sequence_agewhen it's"0", as this is the default value when the condition is not setpreconditions.ledgerbounds.max_ledgerwhen it's set to 0 (this means that there is no upper bound)
-
Timebounds within the
preconditionsobject are strings containing int64 UNIX timestamps in seconds rather than formatted date-times (which was a bug) (4361).
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
Support for Protocol 19 (4340):
- Account records can now contain two new, optional fields:
"sequence_ledger": 0, // uint32 ledger number
"sequence_time": "0" // uint64 unix time in seconds, as a stringThe absence of these fields indicates that the account hasn't taken any actions since prior to the Protocol 19 release. Note that they'll either be both present or both absent.
- Transaction records can now contain the following optional object:
"preconditions": {
"timebounds": {
"min_time": "0", // uint64 unix time in seconds, as a string
"max_time": "0" // as above
},
"ledgerbounds": {
"min_ledger": 0, // uint32 ledger number
"max_ledger": 0 // as above
},
"min_account_sequence": "0", // int64 sequence number, as a string
"min_account_sequence_age": "0", // uint64 unix time in seconds, as a string
"min_account_sequence_ledger_gap": 0, // uint32 ledger count
"extra_signers": [] // list of signers as StrKeys
}All of the top-level fields within this object are also optional. However, the "ledgerbounds" object will always have at least its min_ledger field set.
Note that the existing "valid_before_time" and "valid_after_time" fields on the top-level object will be identical to the "preconditions.timebounds.min_time" and "preconditions.timebounds.min_time" fields, respectively, if those exist. The "valid_before_time" and "valid_after_time" fields are now considered deprecated and will be removed in Horizon v3.0.0.
The migration makes the following schema changes:
- adds new, optional columns to the
history_transactionstable related to the new preconditions - adds new, optional columns to the
accountstable related to the new account extension - amends the
signercolumn of theaccounts_signerstable to allow signers of arbitrary length
The following fields on transaction records have been deprecated and will be removed in a future version:
"valid_before"and"valid_after"
These fields are now represented by preconditions.timebounds.min_time and preconditions.timebounds.max_time as uint64 UNIX timestamps, in seconds.
- v2.16.0 rebuilt using Golang 1.18.1 with security fixes for CVE-2022-24675, CVE-2022-28327 and CVE-2022-27536.
- Replace keybase with publicnode in the stellar core config. (4291)
- Add a rate limit for path finding requests. (4310)
- Horizonclient, fix multi-parameter url for claimable balance query. (4248)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Fixed a regression preventing running multiple concurrent captive-core ingestion instances. (4251)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- DB migrations add columns to the
history_tradestable to enable filtering trades by "rounding slippage". This is very large table so migration may take a long time (depending on your DB hardware). Please test the migrations execution time on the copy of your production DB first.
- New feature, enable captive core based ingestion to use remote db persistence rather than in-memory for ledger states. Essentially moves what would have been stored in RAM to the external db instead. Recent profiling on the two approaches shows an approximate space usage of about 8GB for ledger states as of 02/2022 timeframe, but it will gradually continue to increase as more accounts/assets are added to network. Current horizon ingest behavior when configured for captive core usage will by default take this space from RAM, unless a new command line flag is specified
--captive-core-use-db=true, which enables this space to be taken from the external db instead, and not RAM. The external db used is determined be settingDATABASEparameter in the captive core cfg/.toml file. If no value is set, then by default it uses sqlite and the db file is stored in--captive-core-storage-path- (4092)- Note, if using this feature, we recommend using a storage device with capacity for at least 3000 write ops/second.
- Exclude trades with high "rounding slippage" from
/trade_aggregationsendpoint. (4178)- Note, to apply this change retroactively to existing data you will need to reingest starting from protocol 18 (ledger
38115806).
- Note, to apply this change retroactively to existing data you will need to reingest starting from protocol 18 (ledger
- Release DB connection in
/pathswhen no longer needed. (4228) - Fixed false positive warning during orderbook verification in the horizon log output whenever the in memory orderbook is inconsistent with the postgres liquidity pool and offers table. (4236)
- Restart Stellar-Core when it's context is cancelled. (4192)
- Resume ingestion immediately when catching up. (4196)
- Check if there are newer ledger when requested ledger does not exist. (4198)
- Properly check against the HA array being empty. (4152)
- Querying claimable balances has been optimized (4385).
- Querying trade aggregations has been optimized (4389).
- Postgres connections for non ingesting Horizon instances are now configured to timeout on long running queries / transactions (4390).
- Added
disable-path-findingHorizon flag to disable the path finding endpoints. This flag should be enabled on ingesting Horizon instances which do not serve HTTP traffic (4399).
This is the final release after the release candidate, including some small additional changes:
-
The transaction precondition record now excludes (4360):
min_account_sequence_agewhen it's"0", as this is the default value when the condition is not setpreconditions.ledgerbounds.max_ledgerwhen it's set to 0 (this means that there is no upper bound)
-
Timebounds within the
preconditionsobject are strings containing int64 UNIX timestamps in seconds rather than formatted date-times (which was a bug) (4361).
-
New Ingestion Filters Feature: Provide the ability to select which ledger transactions are accepted at ingestion time to be stored on horizon's historical databse.
Define filter rules through Admin API and the historical ingestion process will check the rules and only persist the ledger transactions that pass the filter rules. Initially, two filters and corresponding rules are possible:
The filters and their configuration are optional features and must be enabled with horizon command line parameters
admin-port=4200andenable-ingestion-filtering=trueOnce set, filter configurations and their rules are initially empty and the filters are disabled by default. To enable filters, update the configuration settings, refer to the Admin API Docs which are published on the Admin Port at http://localhost:<admin_port>/, follow details and examples for endpoints:
/ingestion/filters/account/ingestion/filters/asset.
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
Support for Protocol 19 (4340):
- Account records can now contain two new, optional fields:
"sequence_ledger": 0, // uint32 ledger number
"sequence_time": "0" // uint64 unix time in seconds, as a stringThe absence of these fields indicates that the account hasn't taken any actions since prior to the Protocol 19 release. Note that they'll either be both present or both absent.
- Transaction records can now contain the following optional object:
"preconditions": {
"timebounds": {
"min_time": "0", // uint64 unix time in seconds, as a string
"max_time": "0" // as above
},
"ledgerbounds": {
"min_ledger": 0, // uint32 ledger number
"max_ledger": 0 // as above
},
"min_account_sequence": "0", // int64 sequence number, as a string
"min_account_sequence_age": "0", // uint64 unix time in seconds, as a string
"min_account_sequence_ledger_gap": 0, // uint32 ledger count
"extra_signers": [] // list of signers as StrKeys
}All of the top-level fields within this object are also optional. However, the "ledgerbounds" object will always have at least its min_ledger field set.
Note that the existing "valid_before_time" and "valid_after_time" fields on the top-level object will be identical to the "preconditions.timebounds.min_time" and "preconditions.timebounds.min_time" fields, respectively, if those exist. The "valid_before_time" and "valid_after_time" fields are now considered deprecated and will be removed in Horizon v3.0.0.
The migration makes the following schema changes:
- adds new, optional columns to the
history_transactionstable related to the new preconditions - adds new, optional columns to the
accountstable related to the new account extension - amends the
signercolumn of theaccounts_signerstable to allow signers of arbitrary length
The following fields on transaction records have been deprecated and will be removed in a future version:
"valid_before"and"valid_after"
These fields are now represented by preconditions.timebounds.min_time and preconditions.timebounds.max_time as uint64 UNIX timestamps, in seconds.
- v2.16.0 rebuilt using Golang 1.18.1 with security fixes for CVE-2022-24675, CVE-2022-28327 and CVE-2022-27536.
- Replace keybase with publicnode in the stellar core config. (4291)
- Add a rate limit for path finding requests. (4310)
- Horizonclient, fix multi-parameter url for claimable balance query. (4248)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Fixed a regression preventing running multiple concurrent captive-core ingestion instances. (4251)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- DB migrations add columns to the
history_tradestable to enable filtering trades by "rounding slippage". This is very large table so migration may take a long time (depending on your DB hardware). Please test the migrations execution time on the copy of your production DB first.
- New feature, enable captive core based ingestion to use remote db persistence rather than in-memory for ledger states. Essentially moves what would have been stored in RAM to the external db instead. Recent profiling on the two approaches shows an approximate space usage of about 8GB for ledger states as of 02/2022 timeframe, but it will gradually continue to increase as more accounts/assets are added to network. Current horizon ingest behavior when configured for captive core usage will by default take this space from RAM, unless a new command line flag is specified
--captive-core-use-db=true, which enables this space to be taken from the external db instead, and not RAM. The external db used is determined be settingDATABASEparameter in the captive core cfg/.toml file. If no value is set, then by default it uses sqlite and the db file is stored in--captive-core-storage-path- (4092)- Note, if using this feature, we recommend using a storage device with capacity for at least 3000 write ops/second.
- Exclude trades with high "rounding slippage" from
/trade_aggregationsendpoint. (4178)- Note, to apply this change retroactively to existing data you will need to reingest starting from protocol 18 (ledger
38115806).
- Note, to apply this change retroactively to existing data you will need to reingest starting from protocol 18 (ledger
- Release DB connection in
/pathswhen no longer needed. (4228) - Fixed false positive warning during orderbook verification in the horizon log output whenever the in memory orderbook is inconsistent with the postgres liquidity pool and offers table. (4236)
- Restart Stellar-Core when it's context is cancelled. (4192)
- Resume ingestion immediately when catching up. (4196)
- Check if there are newer ledger when requested ledger does not exist. (4198)
- Properly check against the HA array being empty. (4152)
- DB migrations add a column and index to the
history_tradestable to improve performance of some queries. This is very large table so migration may take a long time (depending on your DB hardware). Please test the migrations execution time on the copy of your production DB first.
- Improve performance of
/trades?trade_type=liquidity_poolrequests. (4149) - Added
absBeforeEpochto ClaimableBalance API Resources. It will contain the Unix epoch representation of absolute before date. (4148) - Path finding results contain empty paths again (removed in Horizon 2.9.0). (4137)
- Generate HTTP Status code of 499 for Client Disconnects, should propagate into
horizon_http_requests_duration_seconds_countmetric key withstatus="499"label. (4098) - Fix incorrect counting of rate limited events in stream requests. (4163)
- Update cursor on every ledger when using old non Captive-Core ingestion backend. (4150)
- Fix the code responsible for updating Stellar-Core status that could stop the metrics updates on connectivity issues. (4180)
- Fixes a critical vulnerability in HTTP server of Golang <=1.17.4. An attacker can cause unbounded memory growth in a Go server accepting HTTP/2 requests.
- Result codes for fee-bump transactions will now also include the inner result codes (4081)
-
XDR encoding/decoding pipelines have been optimized (4069, 4068, 4073, 4064, 4071, 4075, 4077)
-
Path-finding on the
/pathsendpoint has been sped up significantly (4091, 4096, 4102), 4105, 4113
-
Improves error parsing from Captive Core (4066)
-
Prevent duplicate errors related to liquidity pool tables during repeated reingestion of same range (4114)
-
In the 2.11.0 release there was a bug introduced which made the
horizon db reingest rangecommand ignore optional parameters like--parallel-workers. This bug is now fixed so all optional command line flags are parsed correctly (4127)
- Add a new horizon flag
--max-assets-per-path-request(15by default) that sets the number of assets to consider for strict-send and strict-recieve requests (4046) - Add an endpoint
/liquidity_pools?account={account_id}which returns the liquidity pools an account is participating in 4043 - Add a new horizon command
horizon db fill-gapswhich fills any gaps in history in the horizon db. The command takes optional start and end ledger parameters. If the start and end ledger is provided then horizon will only fill the gaps found within the given ledger range 4060 - Improve performance of
/liquidity_pools/{liquidity_pool_id}/effectsendpoint by optimizing the db query to fetch effects for a liquidity pool 4065 - Include the captive core binary in the
stellar/horizonDocker image 4019 - Remove
--captive-core-reuse-storage-dirhorizon flag 4048 - Improve performance of XDR encoding which should also improve ingestion speeds 4063, 4056, 3957
- Improve detection of when the Stellar Core binary has been modified 4050
horizon_ingest_state_verify_ledger_entriesmetric was changed to gauge 4054
This is a minor release with no DB Schema migrations nor explicit state rebuild.
- Use the correct asset when calculating liquidity pool disbursements (4018)
- Make sure Stellar-Core is not started before previous instance termination (4020)
- Add a new feature flag
--ingest-enable-extended-log-ledger-stats(falseby default) that enables extra ledger stats when logging ledger processing info (4017) - Add a new command
horizon record-metricsthat records:[ADMIN_PORT]/metricsinto a zip file for debugging purposes (4023) - Expose the
Latest-Ledgerheader to browser web pages (3995) - Correct
horizon db reingest rangeoutput command name when invokinghorizon db detect-gaps(4007) - Add new prometheus metrics:
round_trip_time_seconds: time required to runselect 1query in the DB (4009)state_verify_ledger_entries_count: number of ledger entries downloaded from buckets in a single state verifier run (4015)ledger_fetch_duration_seconds: duration of fetching ledgers from ledger backend, sliding window = 10m (4016)
Upgrading to this version from <= v2.8.3 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
Protocol 18 support: This release adds support for Protocol 18 (CAP 38: Automated Market Makers).
- This release comes with a DB migration removing
offer_idfield fromhistory_tradestable and adding new tables related to AMM. It should not take more than 15 minutes to complete the migration.
- There are multiple breaking changes that will activate on Protocol 18 upgrade. Please check the Horizon Liquidity Pool API doc for more information. Please upgrade to the latest SDKs that are backward compatible.
- The
--ingestflag is set by default. If--captive-core-config-pathis not set, the config file is generated based on network passhprase (3783).
- CAP 38: Automated Market Makers) support. All the API changes have been outlined in Horizon Liquidity Pool API doc.
- Update
/pathsendpoint to take liquidity pools into account when searching for possible routes between assets (3818). - Multiple performance improvements in
/paths: 3816, 3965, 3933. - Requests to
/pathsare now cancelled, respecting--connection-timeoutflag value (3081). - Multiple performance improvements to state ingestion processors: 3945, 3956, 3963, 3953, 3944.
- Add missing tx result codes in
txsub(3866). - Add new metric
ProcessorsRunDurationSummary, oldProcessorsRunDurationis deprecated (3940). - Logs during state ingesiton now display
progressvalue which is percentage progress indicator (3946).
Upgrading to this version from <= v2.8.0 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- This release comes with a small DB migration. It should not take more than a couple minutes.
In the 2.9.0 Horizon release, the --ingest flag will be set to true by default.
- Fix ingestion of fee bump transactions which have muxed source accounts (3948).
- Add an index on trade aggregations, to improve ingestion performance (3947).
Upgrading to this version from <= v2.8.0 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
In the 2.9.0 Horizon release, the --ingest flag will be set to true by default.
- Improve performance of
OffersProcessor. This should speed up ingestion of latest Stellar Public Network activity by up to 30%. Please note that this change does not improve reingestion speed because ledger entries are not processed during reingestion. (3917)
Upgrading to this version from <= v2.8.0 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
In the 2.9.0 Horizon release, the --ingest flag will be set to true by default.
- Fix bug in asset balance classification where clawback is enabled. (3847)
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
In the 2.9.0 Horizon release, the --ingest flag will be set to true by default.
- Limit reap to 100k ledgers/second, to prevent excess CPU usage (3823).
- Improve performance of path finding endpoints (3818).
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
In the 2.9.0 Horizon release, the --ingest flag will be set to true by default.
-
If
--captive-core-config-pathis not set, the config file is generated based on network passhprase. (3783) -
Fix bug in horizon reap system (used by
horizon db reapcommand and when horizon is configured with--history-retention-count) which could lead to partial deletions. (3754) -
Log debug messages from captive core at the appropriate log level. (3746)
-
Add a feature flag
--captive-core-reuse-storage-path/CAPTIVE_CORE_REUSE_STORAGE_PATHthat will reuse Captive Core's storage path for bucket files when applicable for better performance. (3750) -
Add the ability to filter accounts by their participation in a particular liquidity pool (3873).
- Include pool shares in account balances (3873).
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Fix bug introduced in v2.6.0 (#3737), preventing usage of
horizon db migrate up/down/redocommands. (#3762)
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which will take at least 10 minutes), Horizon will not ingest new ledgers.
- Precompute trade aggregations during ingestion to improve performance. Will rebuild the aggregations as part of the database migrations. (3641 & 3760).
- Require
COUNTparam when runninghorizon db migrate down COUNTto prevent accidentally running all downwards migrations. Addhorizon db migrate statuscommand. (#3737) - Fix a bug in
fee_account_muxedandfee_account_muxed_idfields (the fields were incorrectly populated with the source account details). (3735) - Validate ledger range when calling
horizon db reingest rangeso that we respond with an error when attempting to ingest ledgers which are not available in the history archives. (3738) - Improve performance of transaction submission. (3563)
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.
- Fix a bug in the method unmarshaling payment operation details. (#3722)
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.
- Fix for Stellar-Core 17.1.0 bug that can potentially corrupt Captive-Core storage dir.
- All muxed ID fields are now represented as strings. This is to support JS that may not handle uint64 values in JSON responses properly.
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.
- Add new command
horizon db detect-gaps, which detects ingestion gaps in the database. The command prints out thedb reingestcommands to run in order to fill the gaps found (3672). - Performance improvement: Captive Core now reuses bucket files whenever it finds existing ones in the corresponding
--captive-core-storage-path(introduced in v2.1.0 rather than generating a one-time temporary sub-directory (3670). This feature requires Stellar-Core version 17.1 or later. - Horizon now monitors the Stellar Core binary on disk (pointed to by
--stellar-core-binary-path/STELLAR_CORE_BINARY_PATH) and restarts its Captive Core subprocess if it detects changes (i.e a more recent file timestamp for the Stellar Core binary) (3687). POST /transactionsreturn503 Service Unavailableinstead of504 Gateway Timeoutif connected Stellar-Core is out of sync (3653).- Add protocol version metrics:
horizon_ingest_max_supported_protocol_version,horizon_ingest_captive_stellar_core_supported_protocol_version,horizon_stellar_core_supported_protocol_version(3634). - Fixed crash in
horizon ingest verify-rangecommand (3682). - Handle replica conflict errors gracefully (3674).
- Fix data race in request parameters handling (3690).
- Fix bug where the configuration for
CAPTIVE_CORE_LOG_PATH,CAPTIVE_CORE_PEER_PORT, andCAPTIVE_CORE_HTTP_PORTwere ignored if they were configured via environment variables instead of command line arguments. (3702). - Error when setting
BUCKET_DIR_PATHthrough--captive-core-config-path(3707).
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.
- Fix bug in
horizon db reingest rangecommand, which would throw a duplicate entry conflict error from the DB. (3661). - Fix bug in DB metrics preventing Horizon from starting when read-only replica middleware is enabled. (3668).
- Fix bug in the value of
routein the logs for rate-limited requests (previously it was set toundefined). (3658).
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.
- This release comes with a small DB schema change (new multiplexed-account-related columns are incorporated). It should not take more than five minutes to run due to new columns being NULL-able.
- Deprecate
--captive-core-config-append-pathin favor of--captive-core-config-path. The difference between the two flags is that--captive-core-config-pathwill validate the configuration file to reject any fields which are not supported by captive core (3629).
-
Add more in-depth Prometheus metrics (count & duration) for db queries. (3597, 3605)
-
HTTP request logs will now print the Origin header if Referer is not set. (3599)
-
Add Multiplexed Account details to API responses (additional
_muxedand_muxed_idoptional fields following what's described in SEP 23):- Transactions:
account_muxed,account_muxed_id,fee_accountandfee_account_muxed. - Operations:
source_account_muxed,source_account_muxed_idand additional fields depending on the operation (e.g.from_muxed,from_muxed_id,to_muxedandto_muxed_idfor Payment operations) - Effects:
account_muxed,account_muxed_idand additional fields depending on the effect (e.g.seller_muxedandseller_muxed_idfor the Trade effect).
- Transactions:
-
Fix bug in
horizon db reingest rangecommand which required the--ingestflag to be set (3625). -
Fix bug in causing database connections to be closed when the HTTP request was cancelled. (3630)
Upgrading to this version from <= v2.1.1 will trigger a state rebuild. During this process (which can take up to 20 minutes), Horizon will not ingest new ledgers.
- Introduces a flag (
--ro-database-url/RO_DATABASE_URL) which allows setting a connection to a read-replica database. This flag makes Horizon take into account data propagation lag to the replica instance, adding retries if the data is out of sync (3574).
-
Improved test suite coverage and stability (3560, 3562, 3551, and 3547).
-
Improved session handling and timeouts (3576, 3545, and 3567).
-
Improved stability of Captive Core's configuration options. Specifically, it will now prefer either the command-line parameter (e.g.
--captive-core-peer-portor its env-var equivalent) or the user-supplied append file (--captive-core-append-path) over Horizon's internal defaults. However, if a value is set in both the append file and at the command-line, an error will be thrown unless both values are equal (3558).
Upgrading to this version will trigger state rebuild. During this process (which can take up to 20 minutes) it will not ingest new ledgers.
- Add
num_claimable_balancesandclaimable_balances_amountfields to asset stat summaries at/assets(3502). - Improve ingestion reliability when running multiple Horizon ingestion instances (3518).
- When ingesting a backlog of ledgers, Horizon sometimes consumes ledgers faster than the rate at which Captive Core emits them. Previously this scenario caused failures in the ingestion system. That is now fixed in (3531).
- This release comes with an internal DB represenatation change: the
claimable_balancestable now represents the claimable balance identifiers as an hexadecimal string (as opposed to base64).
The migration will be performed by the ingestion system (through a state rebuild) and, thus, if some of your Horizon nodes are not ingestors (i.e. no --ingestion flag enabled) you may experience 500s in the GET /claimable_balances/ requests until an ingestion node is upgraded. Also, it's worth noting that the rebuild process will take several minutes and no new ledgers will be ingested until the rebuild is finished.
- Add a flag
--captive-core-storage-path/CAPTIVE_CORE_STORAGE_PATHthat allows users to control the storage location for Captive Core bucket data (3479).- Previously, Horizon created a directory in
/tmpto store Captive Core bucket data. Now, if the captive core storage path flag is not set, Horizon will default to using the current working directory.
- Previously, Horizon created a directory in
- Add a flag
--captive-core-log-path/CAPTIVE_CORE_LOG_PATHthat allows users to control the location of the logs emitted by Captive Core (3472). If you have aLOG_FILE_PATHentry in your Captive Core toml file remove that entry and use the horizon flag instead. --stellar-core-db-url/STELLAR_CORE_DATABASE_URLshould only be configured if Horizon ingestion is enabled otherwise Horizon will not start (3477).
- Add an endpoint which determines if Horizon is healthy enough to receive traffic (3435).
- Sanitize route regular expressions for Prometheus metrics (3459).
- Add asset stat summaries per trust-line flag category (3454).
- The
amount, andnum_accountsfields in/assetsendpoint are deprecated. Fields will be removed in Horizon 3.0. You can find the same data underbalances.authorized, andaccounts.authorized, respectively.
- The
- Add a flag
--captive-core-peer-port/CAPTIVE_CORE_PEER_PORTthat allows users to control which port the Captive Core subprocess will bind to for connecting to the Stellar swarm. (3483). - Add 2 new HTTP endpoints
GET claimable_balances/{id}/transactionsandGET claimable_balances/{id}/operations, which respectively return the transactions and operations related to a provided Claimable Balance Identifier{id}. - Add Stellar Protocol 16 support. This release comes with support for Protocol 16 (CAP 35: asset clawback). See the downstream SDK issue template for details on what changed on Horizon's side. For full details, please read CAP 35.
Please read the Captive Core doc which contains new requirements and migration guide.
Introducing the stable release with Captive Stellar-Core mode enabled by default. Captive mode relaxes Horizon's operational requirements. It allows running Horizon without a fully fledged Core instance and, most importantly, without a Core database. More information about this new mode can be found in Captive Core doc.
If you run into issues please check Known Issues or report an issue. Please ask questions in Keybase or Stack Exchange.
- There are new config params (below) required by Captive Stellar-Core. Please check the Captive Core guide for migration tips.
STELLAR_CORE_BINARY_PATH- a path to Stellar-Core binary,CAPTIVE_CORE_CONFIG_APPEND_PATH- defines a path to a file to append to the Stellar Core configuration file used by captive core.
- The
expingestcommand has been renamed toingestsince the ingestion system is not experimental anymore. - Removed
--rate-limit-redis-keyand--redis-urlconfiguration flags.
This is a release candidate: while SDF is confident that there are no critical bugs and release candidate is safe to use in production we encourage organizations to deploy it to production only after org-specific testing.
Please read the Captive Core doc which contains new requirements and migration guide.
Introducing the release candidate with Captive Stellar-Core mode enabled by default. Captive mode relaxes Horizon's operational requirements. It allows running Horizon without a fully fledged Core instance and, most importantly, without a Core database. More information about this new mode can be found in Captive Core doc.
If you run into issues please check Known Issues or report an issue. Please ask questions in Keybase or Stack Exchange.
- The
expingestcommand has been renamed toingestsince the ingestion system is not experimental anymore. - Removed
--rate-limit-redis-keyand--redis-urlconfiguration flags.
- Fix bug
/fee_statsendpoint. The endpoint was not including the additional base fee charge for fee bump transactions (#3354) - Expose the timestamp of the most recently ingested ledger in the root resource response and in the
/metricsresponse (#3281) - Add
--checkpoint-frequencyflag to configure how many ledgers span a history archive checkpoint (#3273). This is useful in the context of creating standalone Stellar networks in integration tests.
Upgrading to this version from version before v1.10.0 will trigger state rebuild. During this process (which can take several minutes) it will not ingest new ledgers.
- Fixed a bug in
/fee_statsendpoint that could calculate invalid stats if fee bump transactions were included in the ledger (#3326)
THIS IS A BETA RELEASE! DO NOT USE IN PRODUCTION. The release may contain critical bugs. It's not suitable for production use.
Please read the Captive Core doc which contains new requirements and migration guide.
Introducing the beta release with Captive Stellar-Core mode enabled by default. Captive mode relaxes Horizon's operational requirements. It allows running Horizon without a fully fledged Core instance and, most importantly, without a Core database. More information about this new mode can be found in Captive Core doc.
This version may contain bugs. If you run into issues please check Known Issues or report an issue. Please ask questions in Keybase or Stack Exchange.
Upgrading to this version from version before v1.10.0 will trigger state rebuild. During this process (which can take several minutes) it will not ingest new ledgers.
- Improved performance of
OfferProcessor(#3249). - Improved speed of state verification startup time (#3251).
- Multiple Captive Core improvements and fixes (#3237, #3257, #3260, #3264, #3262, #3265, #3269, #3271, #3270, #3272).
- Add Prometheus metrics for the duration of ingestion processors (#3224)
- Many Captive Core improvements and fixes (#3232, #3223, #3226, #3203, #3189, #3187)
- Fix bug in parsing
db-urlparameter inhorizon db migrateandhorizon db initcommands (#3192).
- The
servicefield emitted in ingestion logs has been changed fromexpingesttoingest(#3118). - Ledger stats are now exported in
/metricsinhorizon_ingest_ledger_stats_totalmetric (#3148). - Stellar Core database URL is no longer required when running in captive mode (#3150).
- xdr: Add a custom marshaller for claim predicate timestamp (#3183).
- Bump max supported protocol version to 15.
After upgrading Horizon will rebuild its state. During this process (which can take several minutes) it will not ingest new ledgers.
- Fixed a bug that caused a fresh instance of Horizon to be unable to sync with testnet (Protocol 14) correctly. (#3100)
- Add Golang- and process-related metrics. (#3103)
- New
network_passphrasefield in History Archives (added in Stellar-Core 14.1.0) is now checked. Horizon will return error if incorrect archive is used. (#3082) - Fixed a bug that caused some errors to be logged with
infolevel instead oferrorlevel. (#3094) - Fixed a bug in
/claimable_balancesthat returned 500 error instead of 400 for some requests. (#3088) - Print a friendly message when Horizon does not support the current Stellar protocol version. (#3093)
- Fixed a bug that caused a fresh instance of Horizon to be unable to sync with testnet (Protocol 14) correctly. (#3096)
- Use underscore in JSON fields for claim predicate to make the API consistent. (#3086)
This is release adds support for the upcoming Protocol 14 upgrade. However, Horizon still maintains backwards compatibility with Protocol 13, which means it is still safe to run this release before Protocol 14 is deployed.
After upgrading Horizon will rebuild it's state. During this process (which can take several minutes) it will not ingest new ledgers.
The two main features of Protocol 14 are CAP 23 Claimable Balances and CAP 33 Sponsored Reserves. Claimable balances provide a mechanism for setting up a payment which can be claimed in the future. This allows you to make payments to accounts which are currently not able to accept them. Sponsored Reserves allows an account to pay the reserves on behalf of another account.
In this release there is a new claimable balance resource which has a unique id, an asset (describing which asset can be claimed), an amount (the amount of the asset that can be claimed), and a list of claimants (an immutable list of accounts that could potentially claim the balance).
The GET /claimable_balances/{id} endpoint was added to Horizon's API to allow looking up a claimable balance by its id. See the sample response below:
{
"_links": {
"self": {
"href": "/claimable_balances/000000000102030000000000000000000000000000000000000000000000000000000000"
}
},
"id": "000000000102030000000000000000000000000000000000000000000000000000000000",
"asset": "native",
"amount": "10.0000000",
"sponsor": "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML",
"last_modified_ledger": 123,
"claimants": [
{
"destination": "GC3C4AKRBQLHOJ45U4XG35ESVWRDECWO5XLDGYADO6DPR3L7KIDVUMML",
"predicate": {
"unconditional": true
}
}
],
"paging_token": "123-000000000102030000000000000000000000000000000000000000000000000000000000"
}There is also a GET /claimable_balances endpoint which searches for claimable balances by asset, sponsor, or claimant destination.
To support CAP 33 Sponsored Reserves we have added an optional sponsor attribute in the following Horizon resources: accounts, account signers, offers, trustlines, and claimable balances.
If the sponsor field is present it means that the account with id sponsor is paying for the reserves for the sponsored account / account signer / offer / trustline / claimable balance. We have also added an optional sponsor query parameter to the following endpoints:
GET /accountsGET /offersGET /claimable_balances
If the sponsor query param is provided, Horizon will search for objects sponsored by the given account id.
- Fixed a bug which prevented Horizon from accepting TLS connections.
- Fixed a bug in a code ingesting fee bump transactions.
- Added new and changed existing metrics:
horizon_build_info- contains build information in labels (version- Horizon version,goversion- Go runtime version),horizon_ingest_enable- equals1if ingestion system is running,0otherwise,horizon_ingest_state_invalid- equals1if state is invalid,0otherwise,horizon_db_max_open_connections- determines the maximum possible opened DB connections,horizon_db_wait_duration_seconds_total- changed the values to be in seconds instead of nanoseconds.
- Fixed a data race when shutting down the HTTP server. (#2958).
- Fixed emitting incorrect errors related to OrderBook Stream when shutting down the app. (#2964)
The previous implementation of Captive Stellar-Core streams meta stream using a filesystem pipe. This implies that both Horizon and Stellar-Core had to be deployed to the same server. One of the disadvantages of such requirement is a need for detailed per-process monitoring to be able to connect potential issues (like memory leaks) to the specific service.
To solve this it's now possible to start a captivecore on another machine and configure Horizon to use it in ingestion. This requires two config options set:
ENABLE_CAPTIVE_CORE_INGESTION=true,REMOTE_CAPTIVE_CORE_URL- pointing tocaptivecoreserver.
This patch release fixes a regression introduced in 1.7.0, breaking the
/offers endpoint. Thus, we recommend upgrading as soon as possible.
- Fix path parameter mismatch in
/offersendpoint #2927.
- Add new multicolumn index to improve the
/trades's endpoint performance #2869. - Add constraints on database columns which cannot hold negative values #2827.
- Update Go toolchain to 1.14.6 in order to fix golang/go#34775, which caused some database queries to be executed instead of rolled back.
- Fix panic on missing command line arguments #2872
- Fix race condition where submitting a transaction to Horizon can result in a bad sequence error even though Stellar Core accepted the transaction. #2877
- Add new DB metrics (#2844):
db_in_use_connections- number of opened DB connections in use (not idle),db_wait_count- number of connections waited for,db_wait_duration- total time blocked waiting for a new connection.
- Add
--parallel-workersand--parallel-job-sizetohorizon db reingest range.--parallel-workerswill parallelize reingestion using the supplied number of workers. (#2724) - Remove Stellar Core's database dependency for non-ingesting instances of Horizon. (#2759)
Horizon doesn't require access to a Stellar Core database if it is only serving HTTP request, this allows the separation of front-end and ingesting instances.
The following config parameters were removed:
core-db-max-open-connectionscore-db-max-idle-connections
- HAL response population is implemented using Go
stringspackage instead ofregexp, improving its performance. (#2806) - Fix a bug in
POST /transactionsthat could causetx_bad_seqerrors instead of processing a valid transaction. (#2805) - The
--connection-timeoutparam is ignored inPOST /transactions. The requests sent to that endpoint will always timeout after 30 seconds. (#2818)
-
Add experimental support for live ingestion using a Stellar Core subprocess instead of a persistent Stellar Core database.
Stellar-core now contains an experimental feature which allows replaying ledger's metadata in-memory. This feature starts paving the way to remove the dependency between Stellar Core's database and Horizon. Requires Stellar Core v13.2.0.
To try out this new experimental feature, you need to specify the following parameters when starting ingesting Horizon instance:
--enable-captive-core-ingestionorENABLE_CAPTIVE_CORE_INGESTION=true.--stellar-core-binary-pathorSTELLAR_CORE_BINARY_PATH.
- Remove
--ingest-failed-transactionsflag. From now on Horizon will always ingest failed transactions. WARNING: If your application is using Horizon DB directly (not recommended!) remember that now it will also contain failed txs. (#2702). - Add transaction set operation count to
history_ledger(#2690). Extend ingestion to store the total number of operations in the transaction set and expose it in the ledger resource viatx_set_operation_count. This feature allows you to assess the used capacity of a transaction set. - Fix
/metricsend-point (#2717). - Gracefully handle incorrect assets in the query parameters of GET
/offers(#2634). - Fix logging message in OrderBookStream (#2699).
- Fix data race in root endpoint (#2745).
-
Add experimental support for database reingestion using a Stellar Core subprocess instead of a persistent Stellar Core database (#2695).
Stellar Core v12.3.0 added an experimental feature which allows replaying ledger's metadata in-memory. This feature speeds up reingestion and starts paving the way to remove the dependency between Stellar Core's database and Horizon.
For now, this is only supported while running
horizon db reingest. To try out this new experimental feature, you need to specify the following parameters:--enable-captive-core-ingestionorENABLE_CAPTIVE_CORE_INGESTION=true.--stellar-core-binary-pathorSTELLAR_CORE_BINARY_PATH.
- Add the new field
tx_set_operation_countto theledgerresource (#2690). This field can be anumberornull.
- Drop support for MuxedAccounts strkeys (spec'ed in SEP23). SEP23 is still a draft and we don't want to encourage storing strkeys which may not be definite.
- Replace
SequenceProviderimplementation with one which queries the Horizon DB for sequence numbers instead of the Stellar Core DB. - Use the Horizon DB instead of Horizon's in memory order book graph to query orderbook details for the /order_book endpoint.
- Remove JSON variant of
GET /metrics, both in the server and client code. It's using Prometheus format by default now. - Decreased a memory usage of initial state ingestion stage and state verifier (#2618).
- Remove
--exp-ingest-in-memory-onlyHorizon flag. The in memory order book graph which powers the path finding endpoints is now updated using the Horizon DB instead of directly via ingestion (#2630).
- The type for the following attributes has been changed from
int64tostring(#2555):- Attribute
fee_chargedin Transaction resource. - Attribute
max_feein Transaction resource.
- Attribute
- Add
last_modified_timeto account responses.last_modified_timeis the closing time of the most recent ledger in which the account was modified (#2528). - Balances in the Account resource are now sorted by asset code and asset issuer (#2516).
- Ingestion system has its dedicated DB connection pool (#2560).
- A new metric has been added to
/metrics(#2537 and #2553):ingest.local_latest_ledger: a gauge with the local latest ledger,txsub.v0: a meter countingv0transactions inPOST /transaction,txsub.v1: a meter countingv1transactions inPOST /transaction,txsub.feebump: a meter countingfeebumptransactions inPOST /transaction.
- Fix a memory leak in the code responsible for streaming (#2548, #2575 and #2576).
- Fix bug which occurs when ingesting ledgers containing both fee bump and normal transactions.
This version removes two unused columns that could overflow in catchup complete deployments. If your Horizon database contains entire public network history, you should upgrade to this version as soon as possible and run horizon db migrate up.
- Remove
idcolumns fromhistory_operation_participantsandhistory_transaction_participantsto prevent possible integer overflow #2532.
- The type for the following attributes will be changed from
int64tostringin 1.3.0:- Attribute
fee_chargedin Transaction resource. - Attribute
max_feein Transaction resource.
- Attribute
The changes are required by CAP-15.
- Added support for CAP-27 and SEP-23 #2491.
- The XDR definition of a transaction memo is a string.
However, XDR strings are actually binary blobs with no enforced encoding.
It is possible to set the memo in a transaction envelope to a binary sequence which is not valid ASCII or unicode.
Previously, if you wanted to recover the original binary sequence for a transaction memo, you would have to decode the transaction's envelope.
In this release, we have added a
memo_bytesfield to the Horizon transaction response for transactions withmemo_typeequaltext.memo_bytesstores the base 64 encoding of the memo bytes set in the transaction envelope #2485.
This version includes a significant database migration which changes the column types of fee_charged and max_fee in the history_transactions table from integer to bigint. This essential change paves the way for fee bump transactions (CAP 15), a major improvement that will be released soon in Stellar Protocol 13.
This migration will run for a long time, especially if you have a Horizon database with full history. For reference, it took around 8 hours and 42 minutes to complete this migration on a AWS db.r4.8xlarge instance with full transaction history.
To execute the migration run horizon db migrate up using the Horizon v1.1.0 binary.
Important Note: Horizon should not be serving requests or ingesting while the migration is running. For service continuity, if you run a production Horizon deployment it is recommended that you perform the migration on a second instance and then switch over.
-
DB: Remove unnecessary duplicate indexes:
index_history_transactions_on_id,index_history_ledgers_on_id,exp_asset_stats_by_code, andasset_by_code(#2419). -
DB: Remove asset_stats table which is no longer necessary (#2419).
-
Validate transaction hash IDs as 64 lowercase hex chars. As such, wrongly-formatted parameters which used to cause 404 (
Not found) errors will now cause 400 (Bad request) HTTP errors (#2394). -
Fix ask and bid price levels of
GET /order_bookwhen encountering non-canonical price values. Thelimitparameter is now respected and levels are coallesced properly. Also,price_ris now in canonical form (#2400). -
Added missing top-level HAL links to the
GET /response (#2407). -
Full transaction details are now included in the
POST /transactionsresponse. If you submit a transaction and it succeeds, the response will match theGET /transactions/{hash}response (#2406). -
The following attributes are now included in the transaction resource:
fee_account(the account which paid the transaction fee)fee_bump_transaction(only present in Protocol 13 fee bump transactions)inner_transaction(only present in Protocol 13 fee bump transactions) (#2406).
-
Add support for CAP0018: Fine-Grained Control of Authorization (Protocol 13) (#2423).
- Add
is_authorized_to_maintain_liabilitiestoBalance."balances": [ { "is_authorized": true, "is_authorized_to_maintain_liabilities": true, "balance": "27.1374422", "limit": "922337203685.4775807", "buying_liabilities": "0.0000000", "selling_liabilities": "0.0000000", "last_modified_ledger": 28893780, "asset_type": "credit_alphanum4", "asset_code": "USD", "asset_issuer": "GBSTRUSD7IRX73RQZBL3RQUH6KS3O4NYFY3QCALDLZD77XMZOPWAVTUK" }, { "balance": "1.5000000", "buying_liabilities": "0.0000000", "selling_liabilities": "0.0000000", "asset_type": "native" } ] - Add
authorize_to_maintain_liabilitiestoAllowTrustoperation.{ "id": "124042211741474817", "paging_token": "124042211741474817", "transaction_successful": true, "source_account": "GBSTRUSD7IRX73RQZBL3RQUH6KS3O4NYFY3QCALDLZD77XMZOPWAVTUK", "type": "allow_trust", "type_i": 7, "created_at": "2020-03-27T03:40:10Z", "transaction_hash": "a77d4ee5346d55fb8026cdcdad6e4b5e0c440c96b4627e3727f4ccfa6d199e94", "asset_type": "credit_alphanum4", "asset_code": "USD", "asset_issuer": "GBSTRUSD7IRX73RQZBL3RQUH6KS3O4NYFY3QCALDLZD77XMZOPWAVTUK", "trustee": "GBSTRUSD7IRX73RQZBL3RQUH6KS3O4NYFY3QCALDLZD77XMZOPWAVTUK", "trustor": "GA332TXN6BX2DYKGYB7FW5BWV2JLQKERNX4T7EUJT4MHWOW2TSGC2SPM", "authorize": true, "authorize_to_maintain_liabilities": true, } - Add effect
trustline_authorized_to_maintain_liabilities.{ "id": "0124042211741474817-0000000001", "paging_token": "124042211741474817-1", "account": "GBSTRUSD7IRX73RQZBL3RQUH6KS3O4NYFY3QCALDLZD77XMZOPWAVTUK", "type": "trustline_authorized_to_maintain_liabilities", "type_i": 25, "created_at": "2020-03-27T03:40:10Z", "trustor": "GA332TXN6BX2DYKGYB7FW5BWV2JLQKERNX4T7EUJT4MHWOW2TSGC2SPM", "asset_type": "credit_alphanum4", "asset_code": "USD" }
- Add
-
It is no longer possible to use Redis as a mechanism for rate-limiting requests (#2409).
-
Make
GET /tradesgenerate an empty response instead of a 404 when no trades are found.
- Fix
horizon db reapbug which caused the command to exit without deleting any history table rows (#2336). - The horizon reap system now also deletes rows from
history_trades. Previously, the reap system only deleted rows fromhistory_operation_participants,history_operations,history_transaction_participants,history_transactions,history_ledgers, andhistory_effects(#2336). - Fix deadlock when running
horizon db reingest range(#2373). - Fix signer update effects (#2375).
- Fix incorrect error in log when shutting down the system while
verifyStateis running (#2366). - Expose date header to CORS clients (#2316).
- Fix inconsistent ledger view in
/accounts/{id}when streaming (#2344).
- Dropped support for Go 1.12. (#2346).
- If you were using the new ingestion in one of the previous versions of Horizon, you must first remove
ENABLE_EXPERIMENTAL_INGESTIONfeature flag and restart all Horizon instances before deploying a new version. - The init stage (state ingestion) for the public Stellar network requires around 1.5GB of RAM. This memory is released after the state ingestion. State ingestion is performed only once. Restarting the server will not trigger it unless Horizon has been upgraded to a newer version (with an updated ingestion pipeline). It's worth noting that the required memory will become smaller and smaller as more of the buckets in the history archive become CAP-20 compatible. Some endpoints are not available during state ingestion.
- The CPU footprint of the new ingestion is modest. We were able to successfully run ingestion on an AWS
c5.xlargeinstance. The init stage takes a few minutes onc5.xlarge.c5.xlargeis the equivalent of 4 vCPUs and 8GB of RAM. The definition of vCPU for the c5 large family in AWS is the following:
The 2nd generation Intel Xeon Scalable Processors (Cascade Lake) or 1st generation Intel Xeon Platinum 8000 series (Skylake-SP) processor with a sustained all core Turbo frequency of up to 3.4GHz, and single core turbo frequency of up to 3.5 GHz.
- The state data requires an additional 6GB DB disk space for the public Stellar network (as of February 2020). The disk usage will increase when the number of Stellar ledger entries increases.
accounts_signerstable: 2340 MBtrust_linestable: 2052 MBaccountstable: 1545 MBofferstable: 61 MBaccounts_datatable: 15 MBexp_asset_statstable: less than 1 MB
- A new environment variable (or command line flag) needs to be set so that Horizon can ingest state from the history archives:
HISTORY_ARCHIVE_URLS="archive1,archive2,archive3"(if you don't have your own pubnet history archive, you can use one of SDF's archives, for examplehttps://history.stellar.org/prd/core-live/core_live_001)
- Horizon serves the endpoints
/pathsand/order_bookfrom an in-memory graph, which is only available on ingesting instances. If some of the instances in your cluster are not configured to ingest, you can configure your proxy server to route those endpoints to the ingesting instances. This is beyond the scope of this document - consult the relevant documentation for your proxy server. A better solution for this will be released in the next Horizon version.
The most substantial element of this release is a full rewrite of Horizon's ledger ingestion engine, which enables some key features:
- A set of important new endpoints (see below). Some of these were impossible under the previous ingestion architecture.
- An in-memory order book graph for rapid querying.
- The ability to run parallel ingestion over multiple Horizon hosts, improving service availability for production deployments.
The new engine resolves multiple issues that were present in the old system. For example:
- Horizon's coupling to Stellar-Core's database is dramatically reduced.
- Data inconsistency due to lag between endpoints is eliminated.
- Slow endpoints (path-finding for example) are now speedy.
Finally, the rearchitecting makes new reliability features possible. An example is the new internal state verifier, which guarantees consistency between the local Horizon state and the public history archives.
The admin guide contains all the information needed to operate the new ingestion system.
- Add /accounts endpoint, which allows filtering accounts that have a given signer or a trustline to an asset.
- Add /offers endpoint, which lists all offers on the network and allows filtering by seller account or by selling or buying asset.
- Add /paths/strict-send endpoint, which enables discovery of optimal "strict send" paths between assets.
- Add /paths/strict-receive endpoint, which enables discovery of optimal "strict receive" paths between assets.
- Add the fields
max_feeandfee_chargedto /fee_stats.
-
Change multiple operation types to their canonical names for operation resources (#2134).
-
Change the type of the following fields from
numbertostring:- Attribute
offer_idin manage buy offer and manage sell offer operations. - Attribute
offer_idinTradeeffect. - Attribute
idin Offer resource. - Attribute
timestampandtrade_countin Trade Aggregation resource.
- Attribute
-
/metricsendpoint is no longer part of the public API. It is now served onADMIN_PORT/metrics.ADMIN_PORTcan be set using env variable or--admin-portCLI param. -
Remove the following fields from /fee_stats:
min_accepted_feemode_accepted_feep10_accepted_feep20_accepted_feep30_accepted_feep40_accepted_feep50_accepted_feep60_accepted_feep70_accepted_feep80_accepted_feep90_accepted_feep95_accepted_feep99_accepted_fee
-
Remove
fee_paidfield from Transaction resource (Usefee_chargedandmax_feefields instead - see #1372).
- Add cache to improve performance of experimental ingestion system (#2004).
- Fix experimental ingestion bug where ledger changes were not applied in the correct order (#2050).
- Fix experimental ingestion bug where unique constraint errors are incurred when the ingestion system has to reingest state from history archive checkpoints (#2055).
- Fix experimental ingestion bug where a race condition during shutdown leads to a crash (#2058).
- Add
fee_chargedandmax_feeobjects to/fee_statsendpoint (#1964). - Experimental ledger header ingestion processor (#1949).
- Improved performance of asset stats processor (#1987).
- Provide mechanism for retrying XDR stream errors (#1899).
- Emit error level log after 3 failed attempts to validate state (#1918).
- Fixed out of bounds error in ledger backend reader (#1914).
- Fixed out of bounds error in URL params handler (#1973).
- Rename
OperationFeeStatstoFeeStats(#1952). - All DB queries are now cancelled when request is cancelled/timeout. (#1950).
- Fixed multiple issues connected to graceful shutdown of Horizon.
- All
*_accepted_feefields in/fee_statsendpoint are deprecated. Fields will be removed in Horizon 0.25.0.
Previously scheduled breaking changes reminders:
- The following operation type names have been deprecated:
path_payment,manage_offerandcreate_passive_offer. The names will be changed to:path_payment_strict_receive,manage_sell_offerandcreate_passive_sell_offerin 0.25.0. This has been previously scheduled for 0.22.0 release. fee_paidfield on Transaction resource has been deprecated and will be removed in 0.25.0 (previously scheduled for 0.22.0). Please use new fields added in 0.18.0:max_feethat defines the maximum fee the source account is willing to pay andfee_chargedthat defines the fee that was actually paid for a transaction. See CAP-0005 for more information.- The type for the following attributes will be changed from
int64tostringin 0.25.0 (previously scheduled for 0.22.0):- Attribute
offer_idin manage buy offer and manage sell offer operations. - Attribute
offer_idinTradeeffect. - Attribute
idin Offer resource. - Attribute
timestampandtrade_countin Trade Aggregation resource.
- Attribute
Check Beta Testing New Ingestion System if you want to test the new ingestion system.
- Add
ReadTimeoutto Horizon HTTP server configuration to fix potential DoS vector.
- New features in experimental ingestion (to enable: set
--enable-experimental-ingestionCLI param orENABLE_EXPERIMENTAL_INGESTION=trueenv variable):-
All state-related endpoints (i.e. ledger entries) are now served from Horizon DB (except
/account/{account_id}) -
/order_bookoffers data is served from in-memory store (#1761) -
Add
Latest-Ledgerheader with the sequence number of the most recent ledger processed by the experimental ingestion system. Endpoints built on the experimental ingestion system will always respond with data which is consistent with the ledger inLatest-Ledger(#1830) -
Add experimental support for filtering accounts who are trustees to an asset via
/accounts. Example:
/accounts?asset=COP:GC2GFGZ5CZCFCDJSQF3YYEAYBOS3ZREXJSPU7LUJ7JU3LP3BQNHY7YKS
returns all accounts who have a trustline to the assetCOPissued by accountGC2GFG...(#1835) -
Experimental "Accounts For Signers" end-point now returns a full account resource (#1876)
-
- Prevent "
multiple response.WriteHeader calls" errors when streaming (#1870) - Fix an interpolation bug in
/fee_stats(#1857) - Fix a bug in
/paths/strict-sendwhere occasionally bad paths were returned (#1863)
- Fixes a bug in accounts for signer ingestion processor.
- Fixes a bug in path payment ingestion code.
- Adds support for Stellar Protocol v12.
- The following operation type names have been deprecated:
path_payment,manage_offerandcreate_passive_offer. The names will be changed to:path_payment_strict_receive,manage_sell_offerandcreate_passive_sell_offerin 0.25.0. This has been previously scheduled for 0.22.0 release. fee_paidfield on Transaction resource has been deprecated and will be removed in 0.23.0 (previously scheduled for 0.22.0). Please use new fields added in 0.18.0:max_feethat defines the maximum fee the source account is willing to pay andfee_chargedthat defines the fee that was actually paid for a transaction. See CAP-0005 for more information.- The type for the following attributes will be changed from
int64tostringin 0.23.0 (previously scheduled for 0.22.0):- Attribute
offer_idin manage buy offer and manage sell offer operations. - Attribute
offer_idinTradeeffect. - Attribute
idin Offer resource. - Attribute
timestampandtrade_countin Trade Aggregation resource.
- Attribute
- Fixes a bug in initial schema migration file.
This version adds a new index on a table used by experimental ingestion system. If it has not been enabled, migration will be instant. If you migrate from a previous version with experimental ingestion system enabled database migration can take a couple minutes.
/paths/strict-sendcan now accept adestination_accountparameter. Ifdestination_accountis provided then the endpoint will return all payment paths which terminate with an asset held bydestination_account. Note that the endpoint will acceptdestination_accountordestination_assetsbut not both.destination_assetsis a comma separated list of assets encoded asnativeorcode:issuer./paths/strict-receivecan now accept asource_assetsparameter instead ofsource_accountparameter. Ifsource_assetsis provided the endpoint will return all payment paths originating from an asset insource_assets. Note that the endpoint will acceptsource_accountorsource_assetsbut not both.source_assetsis a comma separated list of assets encoded asnativeorcode:issuer.- Add experimental support for
/offers. To enable it, set--enable-experimental-ingestionCLI param orENABLE_EXPERIMENTAL_INGESTION=trueenv variable. - When experimental ingestion is enabled a state verification routine is started every 64 ledgers to ensure a local state is the same as in history buckets. This can be disabled by setting
--ingest-disable-state-verificationCLI param orINGEST-DISABLE-STATE-VERIFICATIONenv variable. - Add flag to apply pending migrations before running horizon. If there are pending migrations, previously you needed to run
horizon db migrate upbefore runninghorizon. Those two steps can be combined into one with the--apply-migrationsflag (APPLY_MIGRATIONSenv variable). - Improved the speed of state ingestion in experimental ingestion system.
- Fixed a bug in "Signers for Account" (experimental) transaction meta ingesting code.
- Fixed performance issue in Effects related endpoints.
- Fixed DoS vector in Go HTTP/2 implementation.
- Dropped support for Go 1.10, 1.11.
Check Beta Testing New Ingestion System if you want to test new ingestion system.
- Add
--ingest-state-reader-temp-setflag (INGEST_STATE_READER_TEMP_SETenv variable) which defines the storage type used for temporary objects during state ingestion in the new ingestion system. The possible options are:memory(requires ~1.5GB RAM, fast) andpostgres(stores data in temporary table in Postgres, less RAM but slower).
Check Beta Testing New Ingestion System if you want to test new ingestion system.
If you want to use experimental ingestion skip this version and use v0.20.1 instead. v0.20.0 has a performance issue.
- Experimental ingestion system is now run concurrently on all Horizon servers (with feature flag set - see below). This improves ingestion availability.
- Add experimental path finding endpoints which use an in memory order book for improved performance. To enable the endpoints set
--enable-experimental-ingestionCLI param orENABLE_EXPERIMENTAL_INGESTION=trueenv variable. Note that theenable-experimental-ingestionflag enables both the new path finding endpoints and the accounts for signer endpoint. There are two path finding endpoints./paths/strict-sendreturns payment paths where both the source and destination assets are fixed. This endpoint is able to answer questions like: "Get me the most EUR possible for my 10 USD."/paths/strict-receiveis the other endpoint which is an alias to the existing/pathsendpoint. --enable-accounts-for-signerCLI param orENABLE_ACCOUNTS_FOR_SIGNER=trueenv variable are merged with--enable-experimental-ingestionCLI param orENABLE_EXPERIMENTAL_INGESTION=trueenv variable.- Add experimental get offers by id endpoint
/offers/{id}which uses the new ingestion system to fill up the offers table. To enable it, set--enable-experimental-ingestionCLI param orENABLE_EXPERIMENTAL_INGESTION=trueenv variable.
Check Beta Testing New Ingestion System if you want to test new ingestion system.
fee_paidfield on Transaction resource has been deprecated and will be removed in 0.22.0. Please use new fields added in 0.18.0:max_feethat defines the maximum fee the source account is willing to pay andfee_chargedthat defines the fee that was actually paid for a transaction. See CAP-0005 for more information. This change has been previously scheduled for 0.19.0 release.- The following operation type names have been deprecated:
manage_offerandcreate_passive_offer. The names will be changed to:manage_sell_offerandcreate_passive_offerin 0.22.0. This has been previously scheduled for 0.19.0 release. - The type for the following attributes will be changed from
int64tostringin 0.22.0:- Attribute
offer_idin manage buy offer and manage sell offer operations. - Attribute
offer_idinTradeeffect. - Attribute
idin Offer resource. - Attribute
timestampandtrade_countin Trade Aggregation resource.
- Attribute
If you are an SDK maintainer, update your code to prepare for this change.
- Add
joinparameter to operations and payments endpoints. Currently, the only valid value for the parameter istransactions. Ifjoin=transactionsis included in a request then the response will include atransactionfield for each operation in the response. - Add experimental "Accounts For Signers" endpoint. To enable it set
--enable-accounts-for-signerCLI param orENABLE_ACCOUNTS_FOR_SIGNER=trueenv variable. Additionally new feature requires links to history archive: CLI:--history-archive-urls="archive1,archive2,archive3", env variable:HISTORY_ARCHIVE_URLS="archive1,archive2,archive3". This will expose/accountsendpoint. This requires around 4GB of RAM for initial state ingestion.
Check Beta Testing New Ingestion System if you want to test new ingestion system.
- Fixed
/fee_statsto correctly calculate ledger capacity in protocol v11. - Fixed
horizon db cleancommand to truncate all tables.
- Horizon requires Postgres 9.5+.
- Removed
paging_tokenfield from/accounts/{id}endpoint. - Removed
/operation_fee_statsendpoint. Please use/fee_stats.
fee_paidfield on Transaction resource has been deprecated and will be removed in 0.19.0. Two new fields have been added:max_feethat defines the maximum fee the source account is willing to pay andfee_chargedthat defines the fee that was actually paid for a transaction. See CAP-0005 for more information.- The following operation type names have been deprecated:
manage_offerandcreate_passive_offer. The names will be changed to:manage_sell_offerandcreate_passive_offerin 0.19.0.
- The following new config parameters were added. When old
max-db-connectionsconfig parameter is set, it has a priority over the the new params. Runhorizon helpfor more information.horizon-db-max-open-connections,horizon-db-max-idle-connections,core-db-max-open-connections,core-db-max-idle-connections.
- Fixed
fee_paidvalue in Transaction resource (#1358). - Fix "int64: value out of range" errors in trade aggregations (#1319).
- Improved
horizon db reingest rangecommand.
- Fixed a bug in
/order_bookwhen sum of amounts at a single price level exceedsint64_max(#1037). - Fixed a bug generating
ERRORlevel log entries for bad requests (#1186).
- Support for stellar-core v11.0.0.
- Display trustline authorization state in the balances list.
- Improved actions code.
- Improved
horizon db reingestcommand handling code. - Tracking app name and version that connects to Horizon (
X-App-Name,X-App-Version).
- Support for Stellar-Core 10.3.0 (new database schema v9).
- Fix a bug in
horizon db reingestcommand (no log output). - Multiple code improvements.
- Fix a bug in
txsubpackage that caused returning invalid status when resubmitting old transactions (#969).
- Critical fix bug
- Fixes high severity error in ingestion system.
- Account detail endpoint (
/accounts/{id}) includeslast_modified_ledgerfield for account and for each non-native asset balance.
This release introduces ingestion of failed transactions. This feature is turned off by default. To turn it on set environment variable: INGEST_FAILED_TRANSACTIONS=true or CLI param: --ingest-failed-transactions=true. Please note that ingesting failed transactions can double DB space requirements (especially important for full history deployments).
Previous versions work fine with new schema so you can migrate (horizon db migrate up using new binary) database without stopping the Horizon process. To reingest ledgers run horizon db reingest using Horizon 0.17.0 binary. You can take advantage of the new horizon db reingest range for parallel reingestion.
/operation_fee_statsis deprecated in favour of/fee_stats. Will be removed in v0.18.0.
- Fields removed in this version:
- Root >
protocol_version, usecurrent_protocol_versionandcore_supported_protocol_version. - Ledger >
transaction_count, usesuccessful_transaction_countandfailed_transaction_count. - Signer >
public_key, usekey.
- Root >
- This Horizon version no longer supports Core <10.0.0. Horizon can still ingest version <10 ledgers.
- Error event name during streaming changed to
errorto follow W3C specification.
- Added ingestion of failed transactions (see Upgrade notes). Use
include_failed=trueGET parameter to display failed transactions and operations in collection endpoints. /fee_statsendpoint has been extended with fee percentiles and ledger capacity usage. Both are useful in transaction fee estimations.- Fixed a bug causing slice bounds out of range at
/account/{id}/offersendpoint during streaming. - Added
horizon db reingest range X Ythat reingests ledgers between X and Y sequence number (closed intervals). - Many code improvements.
- Ledger > Admins need to reingest old ledgers because we introduced
successful_transaction_countandfailed_transaction_count.
Previous versions work fine with Horizon 0.16.0 schema so you can migrate (horizon db migrate up) database without stopping the Horizon process. To reingest ledgers run horizon db reingest using Horizon 0.16.0 binary.
- Root >
protocol_versionwill be removed in v0.17.0. It is replaced bycurrent_protocol_versionandcore_supported_protocol_version. - Ledger >
transaction_countwill be removed in v0.17.0. - Signer >
public_keywill be removed in v0.17.0.
- Improved
horizon db migratescript. It will now either success or show a detailed message regarding why it failed. - Fixed effects ingestion of circular payments.
- Improved account query performances for payments and operations.
- Added
successful_transaction_countandfailed_transaction_counttoledgerresource. - Fixed the wrong protocol version displayed in
rootresource by addingcurrent_protocol_versionandcore_supported_protocol_version. - Improved streaming for single objects. It won't send an event back if the current event is the same as the last event sent.
- Fixed ingesting effects of empty trades. Empty trades will be ignored during ingestion.
- Fixed multiple issues in transaction submission subsystem.
- Support for client fingerprint headers.
- Fixed parameter checking in
horizon db backfillcommand.
- Fixed a bug in Horizon DB reaping code.
- Fixed query checking code that generated
ERROR-level log entries for invalid input.
- Added
horizon db init-asset-statscommand to initializeasset_statstable. This command should be run once before starting ingestion if asset stats are enabled (ENABLE_ASSET_STATS=true). - Fixed
asset_statstable to support longerhome_domains. - Fixed slow trades DB query.
- Fixed memory leak in SSE stream code.
DB migrations add a new fields and indexes on history_trades table. This is a very large table in CATCHUP_COMPLETE deployments so migration may take a long time (depending on your DB hardware). Please test the migrations execution time on the copy of your production DB first.
This release contains several bug fixes and improvements:
- New
/operation_fee_statsendpoint includes fee stats for the last 5 ledgers. - "Trades" endpoint can now be streamed.
- In "Trade Aggregations" endpoint,
offsetparameter has been added. - Path finding bugs have been fixed and the algorithm has been improved. Check #719 for more information.
- Connections (including streams) are closed after timeout defined using
--connection-timeoutCLI param orCONNECTION_TIMEOUTenvironment variable. If Horizon is behind a load balancer with idle timeout set, it is recommended to set this to a value equal a few seconds less than idle timeout so streams can be properly closed by Horizon. - Streams have been improved to check for updates every
--sse-update-frequencyCLI param orSSE_UPDATE_FREQUENCYenvironment variable seconds. If a new ledger has been closed in this period, new events will be sent to a stream. Previously streams checked for new events every 1 second, even when there were no new ledgers. - Rate limiting algorithm has been changed to GCRA.
- Rate limiting in streams has been changed to be more fair. Now 1 credit has to be paid every time there's a new ledger instead of per request.
- Rate limiting can be disabled completely by setting
--per-hour-rate-limit=0CLI param orPER_HOUR_RATE_LIMIT=0environment variable. - Account flags now display
auth_immutablevalue. - Logs can be sent to a file. Destination file can be set using an environment variable (
LOG_FILE={file}) or CLI parameter (--log-file={file}).
- Assets stats are disabled by default. This can be changed using an environment variable (
ENABLE_ASSET_STATS=true) or CLI parameter (--enable-asset-stats=true). Please note that it has a negative impact on a DB and ingestion time. - In "Offers for Account",
last_modified_timefield endpoint can benullwhen ledger data is not available (has not been ingested yet). - "Trades for Offer" endpoint will query for trades that match the given offer on either side of trades, rather than just the "sell" offer. Offer IDs are now synthetic. You have to reingest history to update offer IDs.
horizon db backfillcommand has been fixed.- Fixed
remoteAddrIPfunction to support IPv6. - Fixed
routefield in the logs when the request is rate limited.
- Fixed and improved
txsubpackage (#695). This should resolve many issues connected toTimeoutresponses. - Improve stream error reporting (#680).
- Checking
ingest.Cursorerrors inSession(#679). - Added account ID validation in
/account/{id}endpoints (#684).
This release contains several bug fixes:
- Assets stats can cause high CPU usage on stellar-core DB. If this slows down the database it's now possible to turn off this feature by setting
DISABLE_ASSET_STATSfeature flag. This can be set as environment variable (DISABLE_ASSET_STATS=true) or CLI parameter (--disable-asset-stats=true). - Sometimes
/accounts/{id}/offersreturns500 Internal Server Errorresponse when ledger data is not available yet (for new ledgers) or no longer available (CATCHUP_RECENTdeployments). It's possible to setALLOW_EMPTY_LEDGER_DATA_RESPONSESfeature flag as environment variable (ALLOW_EMPTY_LEDGER_DATA_RESPONSES=true) or CLI parameter (--allow-empty-ledger-data-responses=true). With the flag set totrue"Offers for Account" endpoint will returnnullinlast_modified_timefield when ledger data is not available, instead of500 Internal Server Errorerror.
- Feature flag to disable asset stats (#668).
- Feature flag to allow null ledger data in responses (#672).
- Fix empty memo field in JSON when memo_type is text (#635).
- Improved logging: some bad requests no longer generate
ERRORlevel log entries (#654). /friendbotendpoint is available only whenFriendbotURLis set in the config.
- Offer resource
last_modifiedfield removed (see Bug Fixes section). - Trade aggregations endpoint accepts only specific time ranges now (1/5/15 minutes, 1 hour, 1 day, 1 week).
- Horizon sends
Cache-Control: no-cache, no-store, max-age=0HTTP header for all responses.
- Account > Signers collection
public_keyfield is deprecated, replaced bykey.
- Protocol V10 features:
- New
bump_sequenceoperation (as in CAP-0001).- New
bump_sequenceoperation. - New
sequence_bumpedeffect. - Please check CAP-0001 for new error codes for transaction submission.
- New
- Offer liabilities (as in CAP-0003):
/accounts/{id}resources contain new fields:buying_liabilitiesandselling_liabilitiesfor each entry inbalances.- Please check CAP-0003 for new error codes for transaction submission.
- New
- Added
source_amountfield topath_paymentoperations. - Added
account_creditedandaccount_debitedeffects forpath_paymentoperations. - Friendbot link in Root endpoint is empty if not set in configuration.
- Improved
ingestpackage logging. - Improved HTTP logging (
forwarded_ip,routefields,durationis always in seconds). LOGGLY_HOSTenv variable has been replaced withLOGGLY_TAGand is adding a tag to every log event.- Dropped support for Go 1.8.
- New fields in Offer resource:
last_modified_ledgerandlast_modified_time, replace buggylast_modified(#478). - Fixed pagination in Trades for account endpoint (#486).
- Fixed a synchronization issue in
ingestpackage (#603). - Fixed Order Book resource links in Root endpoint.
- Fixed streaming in Offers for Account endpoint.
- Fixed large amounts rendering in
/assets.
- Fixed a bug in
amountandpricepackages triggering long calculations.
- Fixed a conversion bug when
timebounds.max_timeis set toINT64_MAX.
amountfield in/assetsis now a String (to support Stellar amounts larger thanint64).
- Effect resource contains a new
created_atfield. - Horizon responses are compressed.
- Ingestion errors have been improved.
horizon rebasecommand was improved.
- Horizon now returns
400 Bad Requestfor negativecursorvalues.
Upgrade notes
DB migrations add a new indexes on history_trades. This is very large table so migration may take a long time (depending on your DB hardware). Please test the migrations execution time on the copy of your production DB first.
- Fix a service stutter caused by excessive
infocommands being issued from the root endpoint.
This release is a bug fix release for v0.12.1 and v0.12.2. Please see the upgrade notes below if you did not already migrate your db for v0.12.0
- Remove strict validation on the
resolutionparameter for trade aggregations endpoint. We will add this feature back in to the next major release.
This release is a bug fix release for v0.12.0. Please see the upgrade notes below if you did not already migrate your db for v0.12.0
- Fixed an issue caused by un-migrated trade rows. (https://github.com/stellar/go/issues/357)
- Command line flags are now useable for subcommands of horizon.
Big release this time for horizon: We've made a number of breaking changes since v0.11.0 and have revised both our database schema as well as our data ingestion system. We recommend that you take a backup of your horizon database prior to upgrading, just in case.
Since this release changes both the schema and the data ingestion system, we recommend the following upgrade path to minimize downtime:
- Upgrade horizon binaries, but do not restart the service
- Run
horizon db migrate upto migrate the db schema - Run
horizon db reingestin a background session to begin the data reingestion process - Restart horizon
- Operation and payment resources were changed to add
transaction_hashandcreated_atproperties. - The ledger resource was changed to add a
header_xdrproperty. Existing horizon installations should re-ingest all ledgers to populate the history database tables with the data. In future versions of horizon we will disallow null values in this column. Going forward, this change reduces the coupling of horizon to stellar-core, ensuring that horizon can re-import history even when the data is no longer stored within stellar-core's database. - All Assets endpoint (
/assets) that returns a list of all the assets in the system along with some stats per asset. The filters allow you to narrow down to any specific asset of interest. - Trade Aggregations endpoint (
/trade_aggregations) allow for efficient gathering of historical trade data. This is done by dividing a given time range into segments and aggregate statistics, for a given asset pair (base,counter) over each of these segments.
- Ingestion performance and stability has been improved.
- Changes to an account's inflation destination no longer produce erroneous "signer_updated" effects. (stellar-deprecated/horizon#390)
- BREAKING CHANGE: The
base_feeproperty of the ledger resource has been renamed tobase_fee_in_stroops - BREAKING CHANGE: The
base_reserveproperty of the ledger resource has been renamed tobase_reserve_in_stroopsand is now expressed in stroops (rather than lumens) and as a JSON number. - BREAKING CHANGE: The "Orderbook Trades" (
/orderbook/trades) endpoint has been removed and replaced by the "All Trades" (/trades) endpoint. - BREAKING CHANGE: The Trade resource has been modified to generalize assets as (
base,counter) pairs, rather than the previous (sold,bought) pairs. - Full reingestion (i.e. running
horizon db reingest) now runs in reverse chronological order.
- BREAKING CHANGE: Friendbot has been extracted to an external microservice.
v0.11.0 - 2017-08-15
- The ingestion system can now properly import envelopes that contain signatures that are zero-length strings.
- BREAKING CHANGE: specifying a
limitof0now triggers an error instead of interpreting the value to mean "use the default limit". - Requests that ask for more records than the maximum page size now trigger a bad request error, instead of an internal server error.
- Upstream bug fixes to xdr decoding from
github.com/stellar/go.
- BREAKING CHANGE: The payments endpoint now includes
account_mergeoperations in the response. - "Finished Request" log lines now include additional fields:
streaming,path,ip, andhost. - Responses now include a
Content-Disposition: inlineheader.
v0.10.1 - 2017-03-29
- Ingestion was fixed to protect against text memos that contain null bytes. While memos with null bytes are legal in stellar-core, PostgreSQL does not support such values in string columns. Horizon now strips those null bytes to fix the issue.
v0.10.0 - 2017-03-20
This is a fix release for v0.9.0 and v0.9.1
- Added
horizon db clearhelper command to clear previously ingested history.
- Embedded sql files for the database schema have been fixed agsain to be compatible with postgres 9.5. The configuration setting
row_securityhas been removed from the dumped files.
v0.9.1 - 2017-03-20
- Embedded sql files for the database schema have been fixed to be compatible with postgres 9.5. The configuration setting
idle_in_transaction_session_timeouthas been removed from the dumped files.
v0.9.0 - 2017-03-20
This release was retracted due to a bug discovered after release.
- Horizon now exposes the stellar network protocol in several places: It shows the currently reported protocol version (as returned by the stellar-core
infocommand) on the root endpoint, and it reports the protocol version of each ledger resource. - Trade resources now include a
created_attimestamp.
- BREAKING CHANGE: The reingestion process has been updated. Prior versions of horizon would enter a failed state when a gap between the imported history and the stellar-core database formed or when a previously imported ledger was no longer found in the stellar-core database. This usually occurs when running stellar-core with the
CATCHUP_RECENTconfig option. With these changed, horizon will automatically trim "abandonded" ledgers: ledgers that are older than the core elder ledger.
v0.8.0 - 2017-02-07
- account signer resources now contain a type specifying the type of the signer:
ed25519_public_key,sha256_hash, andpreauth_txare the present values used for the respective signer types.
- The
public_keyfield on signer effects and an account's signer summary has been renamed tokeyto reflect that new signer types are not necessarily specifying a public key anymore.
- The
public_keyfield on account signers and signer effects are deprecated
v0.7.1 - 2017-01-12
- Trade resources now include "bought_amount" and "sold_amount" fields when being viewed through the "Orderbook Trades" endpoint.
- Fixes #322: orderbook summaries with over 20 bids now return the correct price levels, starting with the closest to the spread.
v0.7.0 - 2017-01-10
- The account resource now includes links to the account's trades and data values.
- Fixes paging_token attribute of account resource
- Fixes race conditions in friendbot
- Fixes #202: Add price and price_r to "manage_offer" operation resources
- Fixes #318: order books for the native currency now filters correctly.
v0.6.2 - 2016-08-18
- Fixes streaming (SSE) requests, which were broken in v0.6.0
v0.6.1 - 2016-07-26
- Fixed an issue where accounts were not being properly returned when the history database had no record of the account.
v0.6.0 - 2016-07-20
This release contains the initial implementation of the "Abridged History System". It allows a horizon system to be operated without complete knowledge of the ledger's history. With this release, horizon will start ingesting data from the earliest point known to the connected stellar-core instance, rather than ledger 1 as it behaved previously. See the admin guide section titled "Ingesting stellar-core data" for more details.
- Elder ledgers have been introduced: An elder ledger is the oldest ledger known to a db. For example, the
core_elder_ledgerattribute on the root endpoint refers to the oldest known ledger stored in the connected stellar-core database. - Added the
history-retention-countcommand line flag, used to specify the amount of historical data to keep in the history db. This is expressed as a number of ledgers, for example a value of362880would retain roughly 6 weeks of data given an average of 10 seconds per ledger. - Added the
history-stale-thresholdcommand line flag to enable stale history protection. See the admin guide for more info. - Horizon now reports the last ledger ingested to stellar-core using the
setcursorcommand. - Requests for data that precede the recorded window of history stored by horizon will receive a
410 Gonehttp response to allow software to differentiate from other "not found" situations. - The new
db reapcommand will manually trigger the deletion of unretained historical data - A background process on the server now deletes unretained historical once per hour.
- BREAKING: When making a streaming request, a normal error response will be returned if an error occurs prior to sending the first event. Additionally, the initial http response and streaming preamble will not be sent until the first event is available.
- BREAKING:
horizon_latest_ledgerhas renamed tohistory_latest_ledger - Horizon no longer needs to begin the ingestion of historical data from ledger sequence 1.
- Rows in the
history_accountstable are no longer identified using the "Total Order ID" that other historical records use, but are rather using a simple auto-incremented id.
- The
/accountsendpoint, which lets a consumer page through the entire set of accounts in the ledger, has been removed. The change from complete to an abridged history in horizon makes the endpoint mostly useless, and after consulting with the community we have decided to remove the endpoint.
v0.5.1 - 2016-04-28
- ManageData operation data is now rendered in the various operation end points.
- Transaction memos that contain utf-8 are now properly rendered in browsers by properly setting the charset of the http response.
v0.5.0 - 2016-04-22
- BREAKING: Horizon can now import data from stellar-core without the aid of the horizon-importer project. This process is now known as "ingestion", and is enabled by either setting the
INGESTenvironment variable to "true" or specifying "--ingest" on the launch arguments for the horizon process. Only one process should be running in this mode for any given horizon database. - Add
horizon db init, used to install the latest bundled schema for the horizon database. - Add
horizon db reingestcommand, used to update outdated or corrupt horizon database information. Admins may now usehorizon db reingest outdatedto migrate any old data when updated horizon. - Added
network_passphrasefield to root resource. - Added
fee_meta_xdrfield to transaction resource.
- Corrected casing on the "offers" link of an account resource.
v0.4.0 - 2016-02-19
- Add
horizon db migrate [up|down|redo]commands, used for installing schema migrations. This work is in service of porting the horizon-importer project directly to horizon. - Add support for TLS: specify
--tls-certand--tls-keyto enable. - Add support for HTTP/2. To enable, use TLS.
- BREAKING CHANGE: Removed support for building on go versions lower than 1.6
v0.3.0 - 2016-01-29
- Fixed incorrect
source_amountattribute on pathfinding responses. - BREAKING CHANGE: Sequence numbers are now encoded as strings in JSON responses.
- Fixed broken link in the successful response to a posted transaction
v0.2.0 - 2015-12-01
- BREAKING CHANGE: the
addressfield of a signer in the account resource has been renamed topublic_key. - BREAKING CHANGE: the
addresson the account resource has been renamed toaccount_id.
v0.1.1 - 2015-12-01
- Github releases are created from tagged travis builds automatically