Releases: hashgraph/hedera-mirror-node
v0.38.0-rc3
v0.38.0-rc3
v0.38.0-rc2
v0.38.0-rc2
v0.37.2
v0.37.2-rc1
v0.37.2-rc1
v0.38.0-rc1
v0.38.0-rc1
v0.38.0-beta1
v0.38.0-beta1
v0.37.1
A small bug fix release that addresses some minor issues with our NFT support. It also disables the stream file health indicator until we can improve how it works for some corner cases. This release will also form the basis for our new Google Marketplace version.
Bug Fixes
- Disable stream file health indicator for 0.37 release #2288
- Port fix StreamFileHealthIndicator issue to release/0.37 #2286
- Bump Java SDK v2 to 2.0.9-beta.2 #2283
- Fix issue with nft info REST API on deleted nfts (0.37) #2278
- GCP marketplace solution upgrade to v0.37 (0.37) #2277
Contributors
We'd like to thank all the contributors who worked on this release!
v0.37.0
This release broadens our support for non-fungible tokens (NFTs) with new NFT-specific REST APIs. A new API was added to return a list of NFTs for a particular token ID. We also added a new API to return a single NFT by its token ID and serial number. Finally, we added an API to see the transaction history for a particular NFT. In an effort to have more manageable REST API code, we now adopt a more object-oriented approach by utilizing models, view-models and services. Below is an example of the three new APIs:
GET /api/v1/tokens/0.0.1500/nfts
{
"nfts": [{
"account_id": "0.0.1002",
"created_timestamp": "1234567890.000000010",
"deleted": false,
"metadata": "ahf=",
"modified_timestamp": "1234567890.000000010",
"serial_number": 2,
"token_id": "0.0.1500"
},{
"account_id": "0.0.1001",
"created_timestamp": "1234567890.000000009",
"deleted": false,
"metadata": "bTM=",
"modified_timestamp": "1234567890.000000008",
"serial_number": 1,
"token_id": "0.0.1500"
}],
"links": {
"next": null
}
}
GET /api/v1/tokens/0.0.1500/nfts/1
{
"account_id": "0.0.1001",
"created_timestamp": "1234567890.000000008",
"deleted": false,
"metadata": "bTM=",
"modified_timestamp": "1234567890.000000009",
"serial_number": 1,
"token_id": "0.0.1500"
}
GET /api/v1/tokens/0.0.1500/nfts/1/transactions
{
"transactions": [{
"consensus_timestamp": "1234567890.000000009",
"transaction_id": "0.0.8-1234567890-000000009",
"receiver_account_id": "0.0.1001",
"sender_account_id": "0.0.2001",
"type": "CRYPTOTRANSFER"
}, {
"consensus_timestamp": "1234567890.000000008",
"transaction_id": "0.0.8-1234567890-000000008",
"receiver_account_id": "0.0.2001",
"sender_account_id": null,
"type": "TOKENMINT"
}],
"links": {
"next": null
}
}
This release also adds support for custom fees for HTS as defined in HIP-18. After the mirror node design was completed, the necessary custom fee tables were added and the importer modified to ingest the transactions. A list of assessed custom fees was added to the /api/v1/transactions/{transactionId}
endpoint. The ability to find a token's custom fee schedule at a point in time was added to the /api/v1/tokens/{tokenId}
endpoint.
We optimized the balance file parsing performance to be able to process files with a large numbers of accounts. We previously loaded every account balance into memory before persisting. When testing files with tens of millions account this would cause the importer process to slow down and run out of memory. This has now been optimized to load the items one by one into memory then batch persist them to the database.
Breaking Changes
If you're using our monitor tool to verify or performance test the network, you should be aware of some breaking changes to its configuration format. In order to make it easier to override the default behavior without having to duplicate its configuration, we changed the scenario properties from a list to a map where the key is the scenario name. Specifically we changed hedera.mirror.monitor.publish.scenarios
, hedera.mirror.monitor.subscribe.grpc
, and hedera.mirror.monitor.subscribe.rest
. Also, the content of the elapsed
duration in the monitor REST API changed slightly to a format like 1h2m57s
.
Enhancements
- Add ReceiptStatusException retry and account checksum support to acceptance tests #2253
- Custom fees REST api #2247
- Run GitHub actions on main #2241
- Support NFT treasury account updates #2239
- Custom fees importer #2236
- Add an alert for missing balance file #2219
- Add Upsert support to NFTs #2218
- Support NFT treasury account updates #2215
- Adding config to swagger stats #2204
- Add custom fees to existing REST APIs #2199
- Remove nft transferlist from transactions list endpoint #2181
- NFT transaction history REST API #2177
- Update README with min versions for tools #2175
- Add IP metrics to REST #2174
- Custom fees support design #2173
- NFTs list and get REST API #2171
- Custom Fee Support Importer #2166
- Improve acceptance accountId and retry logic #2162
- Change monitor scenario properties from list to map #2160
- Rename master to main #2158
- Bump versions for v0.37.0-SNAPSHOT #2151
- Rename master branch to main #2137
- REST API get NFT transaction history #2136
- REST API list/get NFTs #2135
- Refactor importer NFT logic to use upsert #2133
- REST API metrics by client IP #2130
Bug Fixes
- Fix monitor transaction publisher not recording error metrics #2240
- Retry monitor entity creation #2216
- Fix RedisEntityListenerTest.onSlowPublish #2214
- Remove broken AccountBalanceFileParserTest.keepFiles test #2213
- Fix "New Issue" only showing "Ask a Question" #2211
- Fix helm test failing during retry #2200
- Stream account balances to the database #2182
- Mitigate the impact of pgcopy timeout #2176
- Deduplicate NFT transfers #2164
- Fix Grafana & adjust alerts #2163
- Fix rosetta db integration test failure #2161
- Set entity createdTimestamp and modifiedTimestamp in transaction handlers #2159
- Add multi batch support to upsert pgcopy flow #2153
- Increase RedisEntityListenerTest.onSlowPublish timeout #2152
- Entity created and modify timestamps are null #2131
- AccountBalanceFileParserTest & RecordFileParserIntegrationTest failing in CI #1947
- Slow account balance file processing at high number of accounts #1927
Documentation
- Remove GitHub docs in favor of organization level configuration #2210
- Add example values to docker compose application.yml #2208
Dependency Upgrades
- [Cherry-pick 0.37.0] Bump protobuf to 0.16.0-alpha.4 and add new response codes #2271
- Update to hedera-protobuf-java-api 0.16.0-alpha.3 #2254
- Bump husky from 6.0.0 to 7.0.1 in /hedera-mirror-rest #2238
- Bump aws-sdk from 2.935.0 to 2.939.0 in /hedera-mirror-rest #2237
- Bump github.com/hashgraph/hedera-sdk-go/v2 from 2.1.7 to 2.1.10 in /hedera-mirror-rosetta #2235
- Bump google.golang.org/protobuf from 1.27.0 to 1.27.1 in /hedera-mirror-rosetta #2234
- Bump
@hashgraph
/proto from 1.0.25 to 1.1.4 in /hedera-mirror-rest/check-state-proof #2233 - Bump husky from 6.0.0 to 7.0.0 in /hedera-mirror-rest #2232
-...
v0.37.0-rc1
v0.37.0-rc1
v0.36.0
We are happy to announce the availability of a publicly accessible, free-to-use, mainnet Mirror Node operated by the Hedera team. As part of this, we put a large amount of effort into fine tuning our Kubernetes deployment. We migrated to Flux 2, a GitOps-based deployment tool that allows us to declaratively specify the expected state of the Mirror Node in git and manage our rollouts. You can browse our deploy branch and see the exact config and versions rolled out to various clusters and environments. The Helm chart was updated to add PodDisruptionBudgets
, adjust alert rules and other improvements to make it easier to automate the deployment.
This release is the first version of the Mirror Node with preliminary support for non-fungible tokens (NFTs). NFT support is being added to the Hedera nodes as outlined in HIP 17. We spent time designing how that NFT support will look like for the Mirror Node. Modifications to the schema were made to add new tables and fields and the Importer was updated to ingest NFT transactions. The existing REST APIs were updated to add NFT related fields to the response. This includes adding a type
field to the token related APIs to indicate fungibility and anft_transfers
to /api/v1/transactions/{id}
:
{
"transactions": [{
"consensus_timestamp": "1234567890.000000001",
"name": "CRYPTOTRANSFER",
"nft_transfers": [
{
"receiver_account_id": "0.0.121",
"sender_account_id": "0.0.122",
"serial_number": 104,
"token_id": "0.0.14873"
}
]
}]
}
One thing to note is that we did not add NFT transfers to the list transactions endpoint in an effort to reduce the size and improve the performance of that endpoint. In the next release we will add new NFT specific REST APIs.
Continuing upon the theme of the last release, we made additional changes to the Rosetta API to bring it up to par with the rest of the components. Rosetta now includes support for HTS via both is data and construction APIs.
The Importer saw a large focus on improving performance and resiliency. It is now highly available (HA) when run inside Kubernetes. This allows more than one instance to run at a time and to failover to the secondary instance when the primary becomes unhealthy. A special Kubernetes ConfigMap named leaders
is used to atomically elect the leader.
We’re improving our ingestion time dramatically for entity creation. Previously those were database finds followed by updates. Since inserts are always faster than find and updates, we’ve optimized this to insert the updates into a temporary table and at the end upsert those to the final table. A record file with 6,000 new entities went from 21 seconds to 600 ms, making it 35x improvement. Balance file processing was optimized to greatly reduce memory by only keeping one file in memory at a time.
Breaking Changes
In honor of Juneteenth and as part of general industry-wide movement, we renamed our master
branch to main
. If you have a clone or fork of the Mirror Node Git repository, you will need to take the below steps to update it to use main
:
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
As part of our optimization to reduce memory usage, we now process some things earlier in the lifecycle. Due to this we had to rename some properties to reflect this change. We also changed the disk structure if you are using the keepFiles
(now renamed to writeFiles
) properties to write the stream files to disk after download. It is no longer archived into folders by day. Instead, the folder structure will exactly match the structure in the bucket. This opens the possibility for a mirror node to download and mirror the bucket itself using a S3 compatible API like MinIO. Below is a summary of the renamed properties:
- Renamed
hedera.mirror.importer.downloader.balance.keepSignatures
tohedera.mirror.importer.downloader.balance.writeSignatures
- Renamed
hedera.mirror.importer.parser.balance.keepFiles
tohedera.mirror.importer.downloader.balance.writeFiles
- Renamed
hedera.mirror.importer.parser.balance.persistBytes
tohedera.mirror.importer.downloader.balance.persistBytes
- Renamed
hedera.mirror.importer.downloader.event.keepSignatures
tohedera.mirror.importer.downloader.event.writeSignatures
- Renamed
hedera.mirror.importer.parser.event.keepFiles
tohedera.mirror.importer.downloader.event.writeFiles
- Renamed
hedera.mirror.importer.parser.event.persistBytes
tohedera.mirror.importer.downloader.event.persistBytes
- Renamed
hedera.mirror.importer.downloader.record.keepSignatures
tohedera.mirror.importer.downloader.record.writeSignatures
- Renamed
hedera.mirror.importer.parser.record.keepFiles
tohedera.mirror.importer.downloader.record.writeFiles
- Renamed
hedera.mirror.importer.parser.record.persistBytes
tohedera.mirror.importer.downloader.record.persistBytes
Enhancements
- Remove NFT transfers from transactions list endpoint (cherry-pick) #2183
- Rename references from master to main (cherry-pick) #2170
- Improve acceptance accountId and retry logic (cherry-pick) (#2162) #2169
- Add a PodDisruptionBudget to gRPC and REST #2138
- Add NFT support to existing REST APIs #2129
- Adjust Traefik rate limit #2125
- Add high availability to importer #2124
- Nft importer #2109
- Automate deploy to integration #2102
- Add Rosetta HTS support #2093
- Add workflow for building on windows #2089
- Add a global hostname, pullPolicy and podAnnotations properties to chart #2073
- NFT Database Schema #2070
- Bump versions for v0.36.0-SNAPSHOT #2068
- NFT Design Doc V2 #2061
- NFT existing REST APIs #2058
- NFT design update #2057
- NFT database schema #2056
- Fix slow domain object ingestion #2006
- NFT importer support #1996
- Slow record parsing with high number of created entities #1926
- Rosetta HTS support #1920
- Enable importer leader election #1899
- Migrate to Flux 2 #1811
- Utilize cache for EntityRecordItemListener bulk insert/update operations on domain objects #1440
- Adding config to swagger stats (#2204) #2206
Bug Fixes
- Fix helm test failing during retry (0.36) #2203
- Deduplicate NFT transfers (cherry-pick) #2168
- Fix Grafana & adjust alerts (0.36) #2165
- Add multi batch support to upsert pgcopy flow to release 0.36 #2155
- Upsert pgcopy flow attempt to create already present temp table #2154
- Adjust alert thresholds & fix alert dashboard #2150
- Duplicate nft transfers returned by /transactions rest api #2139
- Increase verify timeout to 2s in RedisEntityListenerTest #2128
- RedisEntityListenerTest.onSlowPublish fails in github CI #2127
- Simplify automated release workflow #2126
- Optimize importer memory footprint #2103
- Fix transactions query duplicate timestamps issue #2097
- Dissociate accounts from tokens post run #2090
- OOMKilled in performance Kubernetes #2087
- Update HTS Acceptance Tests to Dissociate payer on complete [#2069](https://github.com/hashgraph/hedera-mirror-node/issu...