From fbad63543f9934c22a9f26bc981e108efef293de Mon Sep 17 00:00:00 2001 From: Steven Sheehy <17552371+steven-sheehy@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:23:50 -0600 Subject: [PATCH] README cleanup and simplification (#3104) * Change docker-compose commands to docker compose built into Docker * Change to de-emphasize Docker Compose in favor of Helm/Kubernetes * General grammar and spelling cleanup * Move component documentation to docs//README.md * Move Docker Compose details from README.md to docs/installation.md * Remove references to "Beta" mirror node * Remove irrelevant TimescaleDB docs * Remove unused REST API performance images * Simplified mirror node overview Signed-off-by: Steven Sheehy --- README.md | 260 +++++------------- docs/configuration.md | 3 +- docs/grpc/README.md | 4 + .../rest_api_perf_test_architecture.png | Bin 36401 -> 0 bytes docs/images/rest_api_perf_test_migration.png | Bin 75796 -> 0 bytes docs/installation.md | 179 +++++++----- docs/{monitor.md => monitor/README.md} | 0 docs/operations.md | 138 ++-------- docs/rest/README.md | 5 + docs/rosetta-server.md | 66 ----- docs/rosetta/README.md | 63 +++++ .../rosetta-architecture.png} | Bin docs/{web3.md => web3/README.md} | 0 13 files changed, 284 insertions(+), 434 deletions(-) create mode 100644 docs/grpc/README.md delete mode 100644 docs/images/rest_api_perf_test_architecture.png delete mode 100644 docs/images/rest_api_perf_test_migration.png rename docs/{monitor.md => monitor/README.md} (100%) create mode 100644 docs/rest/README.md delete mode 100644 docs/rosetta-server.md create mode 100644 docs/rosetta/README.md rename docs/{images/rosetta-server.png => rosetta/rosetta-architecture.png} (100%) rename docs/{web3.md => web3/README.md} (100%) diff --git a/README.md b/README.md index f9bfae4c502..fa19ebf5349 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,63 @@ [![Build](https://github.com/hashgraph/hedera-mirror-node/actions/workflows/importer.yml/badge.svg)](https://github.com/hashgraph/hedera-mirror-node/actions) [![codecov](https://img.shields.io/codecov/c/github/hashgraph/hedera-mirror-node/main)](https://codecov.io/gh/hashgraph/hedera-mirror-node) -[![GitHub](https://img.shields.io/github/license/hashgraph/hedera-mirror-node)](LICENSE) [![Discord](https://img.shields.io/badge/discord-join%20chat-blue.svg)](https://hedera.com/discord) # Hedera Mirror Node -Hedera Mirror Node exposes Hedera Hashgraph transactions, transaction records, account balances, and events generated by -the Hedera mainnet (or testnet, if so configured) via a REST & gRPC API. +The Hedera Mirror Node acts as an archive node and stores historical data for the Hedera network. ## Overview -Hedera mirror nodes receive the information from the mainnet nodes and they provide value-added services such as -providing audit support, access to historical data, transaction analytics, visibility services, security threat -modeling, data monetization services, etc. Mirror nodes can also run additional business logic to support applications -built using Hedera mainnet. +Mirror nodes receive information from the Hedera nodes and can provide value-added services such as APIs, auditing, +analytics, visibility services, security threat modeling, data monetization services, etc. Mirror nodes can also run +additional business logic to support applications built using the Hedera network. -While mirror nodes receive information from the mainnet nodes, they do not contribute to consensus on the mainnet, and -their votes are not counted. Only the votes from the mainnet nodes are counted for determining consensus. The trust of -Hedera mainnet is derived based on the the consensus reached by the mainnet nodes. That trust is transferred to the -mirror nodes using cryptographic signatures on a chain of records (account balances, events, transactions, etc). +While mirror nodes receive information from the main nodes, they do not contribute to consensus on the network, and +their votes are not counted. Only the votes from the main nodes are counted for determining consensus. The trust of the +Hedera network is derived based on the consensus reached by the main nodes. That trust is transferred to the mirror +nodes using cryptographic signatures on a chain of files. -## Beta Mirror Node +Eventually, the mirror nodes will be able to run the same code as the Hedera nodes so that they can see the transactions +in real time. To make the initial deployments easier, the mirror node strives to take away the burden of running a full +Hedera node through creation of periodic files that contain processed information (such as account balances or +transaction records), and have the full trust of the main nodes. The mirror node software reduces the processing burden +by receiving pre-constructed files from the network, validating those, populating a database, and providing APIs to +expose the data. This approach provides the following advantages: -Eventually, the mirror nodes can run the same code as the Hedera mainnet nodes so that they can see the transactions in -real time. To make the initial deployments easier, the beta mirror node strives to take away the burden of running a -full Hedera node through creation of periodic files that contain processed information (such as account balances or -transaction records), and have the full trust of the Hedera mainnet nodes. The beta mirror node software reduces the -processing burden by receiving pre-constructed files from the mainnet, validating those, populating a database and -providing REST APIs. - -### Advantages - -- Lower compute, bandwidth requirement -- It allows users to only save what they care about, and discard what they don’t (lower storage requirement) +- Lower compute and bandwidth requirements +- Allows users to only save the data that they care about (lower storage requirement) - Easy searchable database so the users can add value quickly -- Easy to consume REST APIs to make integrations faster +- Easy to consume APIs to make integrations faster -### Description +## Architecture -The beta mirror node works as follows: +### Main Nodes -- When a transaction reaches consensus, Hedera nodes add the transaction and its associated record to a record file. -- The file is closed on a regular cadence and a new file is created for the next batch of transactions and records. The - interval is currently set to 2 seconds but may vary between networks. -- Once the file is closed, nodes generate a signature file which contains the signature generated by the node for the - record file. -- Record files also contain the hash of the previous record file, thus creating an unbreakable validation chain. +- When a transaction reaches consensus, Hedera nodes add the transaction and its associated record to a + [record file](https://docs.hedera.com/guides/docs/record-and-event-stream-file-formats#version-5-record-stream-file-format) + . +- Record files contain the hash of the previous record file, thus creating an unbreakable validation chain. +- The file is closed on a regular cadence and a signature file is generated by the node for the record file. +- The record and signature files from each node are then uploaded to Amazon S3 and Google Cloud Storage. -- The signature and record files are then uploaded from the nodes to Amazon S3 and Google File Storage. +### Mirror Nodes -- This mirror node software downloads signature files from either S3 or Google File Storage. -- The signature files are validated to ensure at least 1/3 of the nodes in the address book (stored in a `0.0.102` file) - have the same signature. -- For each valid signature file, the corresponding record file is then downloaded from the cloud. +- This mirror node software downloads signature files from cloud storage. +- The signature files are verified using the corresponding node's public key from the address book (stored in + a `0.0.102` file) +- The verified signature files are checked to ensure at least 1/3 have the same record file hash +- For each valid signature file, the corresponding record file is then downloaded from cloud storage and its hash + verified against the hash contained in the signature file. +- The downloaded record file contains a previous hash that is validated against the last processed file to verify the + hash chain. - Record files can then be processed and transactions and records processed for long term storage. -- Event files are handled in same manner as record files. - -- In addition, nodes regularly generate a balance file which contains the list of Hedera accounts and their - corresponding hbar balance and miscellaneous token balances which is also uploaded to S3 and Google File Storage. -- The files are also signed by the nodes. -- This mirror node software can download the balance files, validate at least 1/3 of nodes have signed and then process - the balance files for long term storage. - -### Rosetta API - -In addition to the REST API which exposes the persisted network entities, the Mirror Node also provides a -[Rosetta API](https://www.rosetta-api.org/docs/welcome.html) compliant REST API server. This exposes a subset of data -with a focus on blockchain data integration. See [rosetta-server](docs/rosetta-server.md) for more details. +In addition, nodes regularly generate +a [balance file](https://github.com/hashgraph/hedera-protobufs/blob/main/streams/account_balance_file.proto) and an +[event file](https://docs.hedera.com/guides/docs/record-and-event-stream-file-formats#version-5-event-stream-file-format) +. The balance file contains the list of Hedera accounts and their corresponding HBAR and token balances. The event file +contains events that were gossiped between nodes. Both of these files are processed by the mirror node in a similar +fashion as outlined above. ## Getting Started @@ -77,170 +67,60 @@ Multiple technologies are utilized in the mirror node. The following topics are to understanding the mirror node operations. - [Git](https://git-scm.com/about) -- [Maven](https://maven.apache.org/guides/getting-started/index.html) -- [Docker](https://docs.docker.com/) - - [docker-compose commands](https://docs.docker.com/compose/reference/overview/) - - [docker commands](https://docs.docker.com/engine/reference/commandline/docker/) -- [NodeJS](https://nodejs.org/en/about/) -- [Spring](https://spring.io/quickstart) - - [Spring Boot](https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started) - - [Externalized Configurations](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config) -- [PostgreSQL](https://www.postgresql.org/docs/9.6/index.html) - - [SQL commands](https://www.postgresql.org/docs/9.6/sql-commands.html) - - [Client Application & Utilities](https://www.postgresql.org/docs/9.6/reference-client.html) - [Go](https://golang.org/) +- [Docker](https://docs.docker.com/engine/reference/commandline/docker/) +- [Helm](https://helm.sh) +- [Maven](https://maven.apache.org/guides/getting-started/index.html) +- [Node.js](https://nodejs.org/en/about/) +- [PostgreSQL](https://www.postgresql.org/docs) +- [Spring Boot](https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started) ### Prerequisite Tools -Ensure these tools are installed (note minimum versions) prior to running the mirror node +Ensure these tools are installed (note minimum versions) prior to running the mirror node: -- [Docker](https://www.docker.com/products/docker-desktop) - v3.3.3+ -- [NodeJs](https://nodejs.org) - v16.13.0+ -- [Npm](https://www.npmjs.com/get-npm) - v8.1.0+ -- [Go](https://golang.org/dl/) - v1.17+ -- Java - [AdoptOpenJDK 11](https://adoptopenjdk.net/) +- [Docker Desktop 4.3+](https://www.docker.com/products/docker-desktop) -### Running Mirror Node +### Running -To run the mirror node, execute these 3 commands in your terminal. +For production use, we recommend using Kubernetes and to deploy using our Helm [chart](charts). Hedera managed mirror +nodes use Kubernetes and Helm for their deployments, and this process is considered the most production-ready. As an +alternative for local development, Docker Compose can be used to run the mirror node. See +the [installation](docs/installation.md#running-via-docker-compose) document for more details on configuring and running +with Docker Compose. To get up and running quickly with Docker Compose execute the following commands in your terminal: ```bash git clone https://github.com/hashgraph/hedera-mirror-node.git cd hedera-mirror-node -docker-compose up +docker compose up ``` -> **_NOTE:_** This defaults to a bucket setup for demonstration purposes. See the [Public Networks](#public-networks) -> section for how to configure the mirror node to retrieve production data. +> **_NOTE:_** This defaults to a bucket setup for demonstration purposes. See the next section for more details. ## Data Access ### Demo -The free option utilizes a bucket setup for demonstration purposes. This is the default option and requires no -additional steps. +The free option utilizes a bucket setup for demonstration purposes. This is not a real Hedera network but simply a dummy +bucket populated with a day's worth of past testnet data. This is the default option and requires no additional steps. +Once you've verified your deployment works against the demo bucket, remember to configure it with +a [public network](#public-networks) then wipe the database and restart the mirror node. ### Public Networks -To access real data from the testnet or mainnet buckets the requester pays flow -for [GCP](https://cloud.google.com/storage/docs/requester-pays) -or [AWS](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html) must be utilized. Here the charges -associated with request and download of transaction data are paid for by the requester and not the bucket owner. - -To achieve this, two simple steps must be taken to configure the mirror node: - -- Uncomment the contents of [application.yml](./application.yml) file under the root folder -- Customize the contents according to your setup. See [configurations](docs/configuration.md) for a detailed description - of the configuration options. - -> **_Note_** The [application.yml](./application.yml) file contents represent the minimal set of fields required to -> configure requester pays and must all be uncommented and filled in. The file is referenced in the -> [docker-compose.yml](docker-compose.yml) and allows customized configuration for each of the sub modules. - -See the [Docker Compose](/docs/installation.md#running-via-docker-compose) documentation for further details. - -### Verify Operational Mirror Node - -When running the Mirror Node using Docker, activity logs and container status for each module container can be viewed in -the [Docker Desktop Dashboard](https://docs.docker.com/desktop/dashboard/) to verify expected operation. - -You can also interact with some module containers (gRPC and REST API's) to verify their operation. - -First list running docker container information using: - - docker ps - -Useful information for all the running containers such as CONTAINER ID, STATUS, IP's and ports will be displayed as -below: - - CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES - 21fa2a986d99 gcr.io/mirrornode/hedera-mirror-rest:0.12.0 "docker-entrypoint.s…" 7 minutes ago Up 12 seconds 0.0.0.0:5551->5551/tcp hedera-mirror-node_rest_1 - 56647c384d49 gcr.io/mirrornode/hedera-mirror-grpc:0.12.0 "java -cp /app/resou…" 8 minutes ago Up 16 seconds 0.0.0.0:5600->5600/tcp edera-mirror-node_grpc_1 - -An 'Up' STATUS confirms the mirror node sub modules are running. - -Using the IP and port, the gRPC and REST API's endpoints can be called to confirm data is processed and available. - -Using the CONTAINER ID docker containers can be accessed for in depth troubleshooting. - -#### Importer - -Logs similar to the following snippets can be used to confirm the Importer is downloading and parsing transactions to -the database - - Current version of schema "public": << Empty Schema >> - ... - Migrating schema "public" to version 1.0 - Init - ... - Successfully applied 41 migrations to schema "public" (execution time 00:01.656s) - ... - Loading record format version 2 from record file: ... - Inserted 2 transactions, 6 transfer lists, 0 files, 0 contracts, 0 claims, 0 topic messages, 0 non-fee transfers - Finished parsing 2 transactions from record file .... - -#### Database - -The following log can be used to confirm the database is up and running: - - LOG: database system is ready to accept connections - -If you have postgresql installed you can connect directly to your database using the following psql command and -default [configurations](docs/configuration.md): - - psql "dbname=mirror_node host=localhost user=mirror_node password=mirror_node_pass port=5432" - -If psql is not available you can `docker exec -it bash` into the db container and run the same command -above - -Some useful basic queries to help view database contents and data include - -``` -\du -select * from account_balance limit 5; -select * from transactions limit 5; -select * from topic_message limit 5; -``` - -#### REST API - -The REST API container will display logs similar to the below at start: - - Server running on port: 5551 - -To manually verify REST API endpoints follow the [Operations](docs/operations.md#verifying-1) details. - -#### gRPC API - -The gRPC container will display logs similar to the below at start - - MirrorGrpcApplication Started MirrorGrpcApplication .... - Listener Starting to poll every 1000ms - -To manually verify the gRPC streaming endpoint follow the [Operations](docs/operations.md#verifying) details. - -Additionally, logs of each module container can be viewed to verify expected operation or decipher issues. -See [Troubleshooting](docs/troubleshooting.md) for details. - -Simply access the terminal on each container with the following command and refer to the [perations](docs/operations.md) -documentation for directions on where and how to view logs. - - docker exec -it bash - -> **_Note_** You cannot exec into the gRPC, Monitor and Importer containers as they are -> [distroless](https://github.com/GoogleContainerTools/distroless) java images. - -#### Rosetta API - -The Rosetta API container will display logs similar to the below at start: - - Successfully connected to Database - Serving Rosetta API in ONLINE mode - Listening on port 5700 - -To manually verify the Rosetta API endpoints follow the [Operations](docs/operations.md#verifying-2) details. +To access data from real Hedera networks, +[AWS](https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html) or +[GCS](https://cloud.google.com/storage/docs/requester-pays) requester pays credentials must be used. The charges +associated with the downloading of stream files are paid for by the requester and not the bucket owner. ## Documentation +- Components + - [gRPC API](docs/grpc/README.md) + - [Monitor](docs/monitor/README.md) + - [REST API](docs/rest/README.md) + - [Rosetta API](docs/rosetta/README.md) + - [Web3 API](docs/web3/README.md) - [Installation](docs/installation.md) - [Configuration](docs/configuration.md) - [Operations](docs/operations.md) diff --git a/docs/configuration.md b/docs/configuration.md index 14c99000252..6bced0ae67f 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -224,7 +224,8 @@ to configure the application. The following table lists the available properties along with their default values. Unless you need to set a non-default value, it is recommended to only populate overridden properties in the custom `application.yml`. -See the monitor [documentation](monitor.md) for more general information about configuring and using the monitor. +See the monitor [documentation](/docs/monitor/monitor.md) for more general information about configuring and using the +monitor. Name | Default | Description ----------------------------------------------------------------| -----------| --------------------------------------- diff --git a/docs/grpc/README.md b/docs/grpc/README.md new file mode 100644 index 00000000000..62fc0cbccc0 --- /dev/null +++ b/docs/grpc/README.md @@ -0,0 +1,4 @@ +# gRPC API + +The gRPC API provides a protobuf defined interface for interacting with the mirror node. Currently only the Hedera +Consensus Service (HCS) topic subscription is supported. diff --git a/docs/images/rest_api_perf_test_architecture.png b/docs/images/rest_api_perf_test_architecture.png deleted file mode 100644 index 042a50a1a3b6cf2c94dabc8313c4cffa0ff58762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36401 zcmeFZWmJ`2)Gka4sI-)HOP5Hugd!l)-6gr{4(Udeln_B`)7`l#DFNx;lr)=ez8e*v z=Xu9>#yIEC`E?xkAQtOhG1rXinsaSKU&~9Q-+z1`4h|0eh0OCeaBv7qaB%P$sP}-D zUgSDm;2V;en4B0KTxs-!O9N!!cM2n!H*#=r?sRZ)z5#G>=RlM1PdGRyb~v~VeKT<96jcl!14UBCKO;}y6?SMDn-~?Uyfgi0+91SR3t*vYv z_+5ple)Zr7e!gvHqoVlL#nDoTN?qd4=yK$bI zI2hSm*g0C*+ECn%YhY;Wb&o$|39{Xa>tEvgeKx;Z zfx{8LFUa=ypoQ;aN-}|u@>XU zLXodjn$JJI$$PXN_C@C_mUoEwn}8=C0o_e~6DUUWrktlfB7-w){0_4M4!fxWTqkp9 zo_fW*GY)B2Zs`WXYqj$SBwx*GL=pbq^M59R1zChz&q>1ReGh~T&bG3>4esJ%t%B#F zZ_MP=o_H^|1vUgyhfC_pT(b@4edv0y)`J_*qcGRtrjW|3OL5lbli}9Z*1p2E{G$i= zj4J$*&?fZc^8sUH&))jz+^XwRsXVAHAdTz>g*??*&VC##eDpzzIs{fFdh&Tw2F>7n2@8Kv`=Zm zq})fKl3x+VtodqC(B~Q<-|qbv=lhCZzvae!|EL#vc}BgpVugHv;o#?c2}TBnyhl+t zvM-gP5BoCu#zOif(`6DK(z4W6^89$`{*7OOFDZprMXp+@rtibJb{cpb3ct@3 zEh24xZba=S6P1k04bSM91@-#YmFPDE!rvCTT959P;W4fRe~)6+kcxYvp^3+Y{q|}#ltW(?+)>M`JjU0RNhO0CJiwBj}2B*z8ui3e! z#h$Bpe!9jd1KZ<;di5I_f*EeH3M3-#1?DiE-hng`A@_qiC#y3|)3H6_0x?+|~xtRD6oHzg(xB z^nO+8B}gA6SJcl5*nFi`Z@)g?MkSmB+cRz2_iPE|W2)ZEo*{M>)08&s93&A*ZV7hx zKRmbB1WfW;+Sezbd^b77hWR^JnR=bMSam&DAVbvj52WzVgltZVss~5}s)p3O%1G}-2#>Qz3ttp* z5u5E{ElI$JePk~q^K(|mLr}G(UnljTHYC-#m^G+CBJpc3$3nb z&^hF7PVBya>9ORTx7!shugklZGlKj;QhufkmOlPfPxz7n>q%!hl!v|K{4*hD!Dh!$ zEF2n=Fnk!SuQ6!xY#+~+SI_TqklSjwp+({*;Yiv3pU&_ zin4^+;CTHbFK&|S@y*XT!x@nxf04*{hBN6!_qxOpXku_tUq_hDsYEf5Xc+f3Hj=T~ z>lHTzKEP*8aT6*viAL)l3)v`Nv`v|;7qIE^YXqIVM5GtAp+RMQ9f8s+c?f&-q|@u+ z$NpO@5amaD(m4XZEa~ibiF`k*rfS2tJbUbezi$f%tAdVY%#<>Iepb-Mu@;_~j7 zkT_T+oxccOOZMWnaL()g(!n`LrPYm(P-$!a*_8Rb{?y6Ih9pHmA?_UT@;PU zycO=Aeed-0Py<)>Ugmoyf?^hm^ic@@|D#6Tl7|8@w|z-0nr* zSSUW7|FTZo0+*}0mHg!B>@?}?vZfCA>vi@T*E#K3jbxDXUt71kYL_G~cBo9&V| z`{t>v)Fq#-aOXQ2w>Tl1ekXZycNC&6w@z{AO{LrF3J;r`T3jVUWD85-?yFc17xW5{ zL&M+oUn>CXueW@pRDIna*#Q2g=_mEsx~u5Sq%VRPv*JM)3^0ISMg{k4M5+#L)%+|M z6%D5Es6T8cDoP^GRz-<~z4WEDCFO!vy-b3wEB|=ck5OuI}+oA+vu^^o&^7 z=`?pmbh5n~mr4yL3e*$<57ox~L+XuI>Gb;{F#DLl0`ijv1k`IemND(0?>M=?ajw~jS6usQZ5qhv>bN_(8Y{3p2Qc$z-YrJ~8 zm$T#G;^v2;OMe0oJPzs`ghxw64JB^vZKEY@o!}m$W@YL*vaD-aXf`p?^JME$%&qCn zbD@bBE72jZuk_rQraN1s{z} nByuDuCZ){oqqtE_L5YHu)I8kGulDrZm%%R&pN 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 diff --git a/docs/installation.md b/docs/installation.md index 7c0e74deb83..e7f22c14140 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,16 +1,11 @@ # Installation -The Mirror Node can be ran [locally](#running-locally) or via [Docker](#running-via-docker-compose). To run locally, -it'll first need to be built using Java. To run via Docker, either build locally, or pull latest images from GCR. - -```console -docker-compose pull -``` +The Mirror Node can be run [locally](#running-locally) or via [Docker](#running-via-docker-compose). ## Building -Ensure you have AdoptOpenJDK 11 installed, then run the following command from the top level directory. This will -compile a runnable Mirror Node JAR file in the `target` directory. +To run locally, first build the project using Java. Ensure you have OpenJDK 11 installed, then run the following command +from the top level directory. This will compile a runnable mirror node JAR file in the `target` directory. ```console ./mvnw clean package -DskipTests @@ -20,14 +15,12 @@ compile a runnable Mirror Node JAR file in the `target` directory. ### Database Setup -In addition to OpenJDK 11, you will need to install a database and initialize it. The Mirror Node -utilizes [PostgreSQL](https://postgresql.org) v9.6 or [TimescaleDB](https://docs.timescale.com/latest/main) depending on -the version of its database schema. +In addition to OpenJDK 11, you will need to install a [PostgreSQL](https://postgresql.org) database and initialize it. -For both databases, since [Flyway](https://flywaydb.org) will manage the database schema, the only required step is to -run the database initialization script. Locate the SQL script -at `hedera-mirror-importer/src/main/resources/db/scripts/init.sh` and edit the file to change the name and password -variables at the top of the file as appropriate. Then make sure the application [configuration](configuration.md) +Since [Flyway](https://flywaydb.org) will manage the database schema, the only required step is to run the database +initialization script. Locate the SQL script at `hedera-mirror-importer/src/main/resources/db/scripts/init.sh` and edit +the file to change the name and password variables at the top of the file to the desired values. Then make sure the +application [configuration](configuration.md) matches the values in the script. Run the SQL script as a super user and check the output carefully to ensure no errors occurred. @@ -47,9 +40,9 @@ java -jar hedera-mirror-importer/target/hedera-mirror-importer-*.jar Additionally, there is a Systemd unit file located in the `hedera-mirror-importer/scripts/` directory that can be used to manage the process. See the [operations](operations.md) documentation for more information. -### GRPC API +### gRPC API -To run the GRPC API, first populate the configuration at one of the supported +To run the gRPC API, first populate the configuration at one of the supported [configuration](configuration.md#grpc-api) paths, then run: ```console @@ -91,7 +84,7 @@ npm test #### Prerequisites `` -Go 1.16+ +Go 1.17+ `` To start the Rosetta API ensure you have the necessary [configuration](configuration.md#rosetta-api) populated and run: @@ -130,7 +123,7 @@ Currently, Rosetta CLI Validation supports only `DEMO` and `TESTNET`, where The `All-in-One` configuration aggregates the PostgreSQL, Importer, and Rosetta services into a single Dockerfile configuration. Configuration is based on the Rosetta specification, -found [here](https://www.rosetta-api.org/docs/node_deployment.html). Data Persistence is based on Rosetta specification +found [here](https://www.rosetta-api.org/docs/node_deployment.html). Data persistence is based on Rosetta specification as well, found [here](https://www.rosetta-api.org/docs/standard_storage_location.html). Exposed ports are `5432` (PostgreSQL) and `5700` (Rosetta). @@ -201,67 +194,121 @@ docker run -e NETWORK=TESTNET \ ## Running via Docker Compose -Docker Compose scripts are provided and run all the mirror node components: +Docker Compose scripts are provided and can run all the mirror node components. Containers use the following persistent +volumes: -- PostgreSQL/TimescaleDB database -- GRPC API -- Importer -- Monitor -- REST API -- Rosetta API - -Containers use the following persisted volumes: - -- `./db` on your local machine maps to `/var/lib/postgresql/data` in the containers. This contains the files for the - PostgreSQL/TimescaleDB database. If the database container fails to initialise properly and the database fails to run, - you will have to delete this folder prior to attempting a restart otherwise the database initialisation scripts will - not be run. +- `./db` on your local machine maps to `/var/lib/postgresql/data` in the db container. This contains the files for the + PostgreSQL database. If the database container fails to initialise properly and the database fails to run, you will + have to delete this folder prior to attempting a restart otherwise the database initialisation scripts will not be + run. ### Configuration -#### TimescaleDB vs PostgreSQL - -To utilize the TimescaleDB database over the default PostgreSQL database, disable the PostgreSQL container and enable -the TimescaleDB container. - -To achieve this the `docker-compose.yml` can be updated to set the postgres `db` service replicas to 0, while removing -this same setting from the `timescaledb` service as follows: - -```yaml - ... - services: - db: - deploy: - replicas: 0 - ... - timescaledb: - # deploy: - # replicas: 0 - ... -``` +Before starting, [configure](configuration.md) the application by updating the [application.yml](/application.yml) +file with the desired custom values. This file is passed to Docker Compose and allows customized configuration for each +of the mirror node components. The `application.yml` file contents represent the minimal set of fields required to +configure requester pays and must be uncommented and filled in. ### Starting -Before starting, [configure](configuration.md) the application by updating the [application.yml](../application.yml) -file with the desired custom values. This file is passed to Docker compose and allows customized configuration for each -of the sub modules. - Finally, run the commands to build and startup: ```console -docker-compose up +docker compose up ``` -### Stopping +### Verifying + +When running the mirror node using Docker, activity logs and container status for each module container can be viewed in +the [Docker Desktop Dashboard](https://docs.docker.com/desktop/dashboard/) or the `docker` CLI to verify expected +operation. You can also interact with mirror node APIs to verify their operation. + +First list running docker container information using and verify an `Up` status is present: + +```shell +$ docker ps +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +21fa2a986d99 gcr.io/mirrornode/hedera-mirror-rest:main "docker-entrypoint.s…" 7 minutes ago Up 12 seconds 0.0.0.0:5551->5551/tcp hedera-mirror-node_rest_1 +56647c384d49 gcr.io/mirrornode/hedera-mirror-grpc:main "java -cp /app/resou…" 8 minutes ago Up 16 seconds 0.0.0.0:5600->5600/tcp hedera-mirror-node_grpc_1 +``` + +Using the IP address and port, the APIs' endpoints can be called to confirm data is processed and available. + +#### Database -Shutting down the database container via `docker-compose down` may result in a corrupted database that may not restart -or may take longer than usual to restart. In order to avoid this, shell into the container and issue the following -command: +The following log can be used to confirm the database is up and running: -Use `docker ps` to get the name of the database container, it should be something like `hedera-mirror-node_db_1`. +```shell +database system is ready to accept connections +``` + +If you have PostgreSQL installed you can connect directly to your database using the following `psql` command and +default [configurations](/docs/configuration.md): -Use the command `docker exec -it hedera-mirror-node_db_1 /bin/sh` to get a shell in the container. +```shell +psql "dbname=mirror_node host=localhost user=mirror_node password=mirror_node_pass port=5432" +``` + +If `psql` is not available locally you can `docker exec -it bash` into the db container and run the same +command above. + +#### Importer + +Logs similar to the following snippets can be used to confirm the Importer is downloading and persisting transactions to +the database: + +```shell +o.f.c.i.c.DbMigrate Schema "public" is up to date. No migration necessary. +c.h.m.i.MirrorImporterApplication Started MirrorImporterApplication in 18.77 seconds +... +c.h.m.i.p.b.AccountBalanceFileParser Successfully processed 1474 items from 2022-01-05T18_30_00.150597126Z_Balances.pb.gz in 12.78 ms +c.h.m.i.d.r.RecordFileDownloader Downloaded 1 signatures in 102.8 ms (9/s) +c.h.m.i.p.r.RecordFileParser Successfully processed 2 items from 2022-01-05T18_16_24.581564299Z.rcd in 3.784 ms +``` -`su - postgres -c "PGDATA=$PGDATA /usr/local/bin/pg_ctl -w stop"` +#### gRPC API + +The gRPC container will display logs similar to the below at start: + +```shell +c.h.m.g.MirrorGrpcApplication Started MirrorGrpcApplication in 15.808 seconds +``` + +To manually verify the gRPC streaming endpoint please consult the [operations](/docs/operations.md#verifying) guide. + +#### REST API + +The REST API container will display logs similar to the below at start: + +```shell +Server running on port: 5551 +``` + +To manually verify REST API endpoint please consult the [operations](/docs/operations.md#verifying-1) guide. + +#### Rosetta API + +The Rosetta API container will display logs similar to the below at start: + +```shell +Successfully connected to Database +Serving Rosetta API in ONLINE mode +Listening on port 5700 +``` + +To manually verify the Rosetta API endpoints follow the [operations](/docs/operations.md#verifying-2) details. + +#### Web3 API + +The Web3 API container will display logs similar to the below at start: + +```shell +c.h.m.web3.Web3Application Started Web3Application in 27.808 seconds +c.h.m.w.config.LoggingFilter /10.0.0.43 POST http://localhost:8545/web3/v1 in 8 ms: 200 OK +``` + +To manually verify the Web3 API endpoints run the [acceptance tests](/docs/web3/README.md#acceptance-tests). + +### Stopping -You may now power down the docker image itself. +Shut down the containers via `docker compose down`. diff --git a/docs/monitor.md b/docs/monitor/README.md similarity index 100% rename from docs/monitor.md rename to docs/monitor/README.md diff --git a/docs/operations.md b/docs/operations.md index 3de0117908f..31704c6a4ad 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -104,90 +104,6 @@ systemctl status hedera-mirror-importer.service sudo journalctl -fu hedera-mirror-importer.service ``` -### v1 to v2 Data Migration - -In an effort to increase performance and reduce storage costs, the Mirror Node DB schema shifted from PostgreSQL (v1) to -TimescaleDB (v2). -[Migrating from a Different PostgreSQL Database](https://docs.timescale.com/latest/getting-started/migrating-data#different-db) -highlights the general recommended data migration steps when moving to TimescaleDB. - -For mirror node operators running the v1 database schema, the following steps can be taken to upgrade to v2. - -1. Upgrade the importer - - Ensure the importer is on the latest version and all v1 database migrations have completed before continuing. - -2. Stop the importer - - If on a version that still downloads files to the filesystem, ensure the valid directory for each stream type is - empty. For example if `dataPath` is set to `/var/lib/hedera-mirror-importer` then - `/var/lib/hedera-mirror-importer/*/valid/` should be empty. If it's not empty, let the importer process fully catch - up before attempting the migration. - -3. Set up a new TimescaleDB database - - A new TimescaleDB server must be spun up. Refer to the Mirror Node [DB Installation](installation.md#database-setup) - for manual instructions. For example, to use the Mirror Node configured docker container, simply run: - - ```shell script - $ docker-compose up timescaledb - ``` - - Refer to the [TimescaleDB Installation Instructions](https://docs.timescale.com/latest/getting-started/installation) - for other installation options. - - > **_NOTE:_** The following steps assume the database, users and schema have been created as detailed above - -4. Configure properties - - First, locate the directory that contains the TimescaleDB migration scripts. For source code, the target directory is - located at `hedera-mirror-importer/src/main/resources/db/scripts/v2`. For binaries, the migration directory - can be extracted from the JAR file: - - ```shell - jar -xvf hedera-mirror-importer-*.jar - cd BOOT-INF/classes/db/scripts/v2 - ``` - - The configuration file `migration.config` contains database variables that need to be modified before running the - migration. These options include variables such as database names, passwords, users, hosts for both the existing - database and the new database. Update these values appropriately for your database setup. - -5. Run migration - - Run the migration script that was previously extracted: - - ```shell - $ ./migration.sh - ``` - - The script uses successive `psql` connections to back up, configure and restore data on the new database nodes. First - it copies over the `flyway_schema_history` table, to maintain migration history. It then utilizes the migration SQL - script used by normal flyway operations to create the new tables and then creates the TimescaleDB hypertables based - on these. Following this, the tables from the old database are backed up as CSV files using `COPY` and then the data - inserted into the new database also using `COPY`. Finally, the schema of the `flyway_schema_history` is updated and - the sequence values are updated to ensure continuation. - -6. Start the importer - - Configure the importer with the new database information. Note that the default schema has been changed from `public` - to `mirrornode` and the database user has been split into a separate owner and regular user. The importer will need - to be updated with the same values specified in the `migration.config`. Example configuration: - - ```yaml - hedera: - mirror: - importer: - db: - host: timescaledb_host - owner: mirror_node - ownerPassword: mirror_node_pass - password: mirror_importer_pass - port: 5432 - schema: mirrornode - username: mirror_importer - ``` - ### Historical Data Ingestion The following resource allocation and configuration is recommended to speed up historical data ingestion. The importer @@ -195,43 +111,43 @@ should be able to ingest one month's worth of mainnet data in less than 1.5 days 1. Importer - - Resource allocation +- Resource allocation - Run the importer with 4 vCPUs and 10 GB of heap. + Run the importer with 4 vCPUs and 10 GB of heap. - - Configuration: +- Configuration: - ```yaml - hedera: - mirror: - importer: - downloader: - record: - batchSize: 600 - frequency: 1 - parser: - record: - entity: - redis: - enabled: false - frequency: 10 - queueCapacity: 40 - ``` + ```yaml + hedera: + mirror: + importer: + downloader: + record: + batchSize: 600 + frequency: 1 + parser: + record: + entity: + redis: + enabled: false + frequency: 10 + queueCapacity: 40 + ``` - Note once the importer has caught up all data, please change the configuration to the default where applicable. + Note once the importer has caught up all data, please change the configuration to the default where applicable. 2. PostgreSQL Database - - Resource allocation +- Resource allocation - Run a PostgreSQL 13 instance with at least 4 vCPUs and 16 GB memory. + Run a PostgreSQL 13 instance with at least 4 vCPUs and 16 GB memory. - - Configuration: +- Configuration: - Set the following parameters. Note the unit is kilobytes. + Set the following parameters. Note the unit is kilobytes. - - max_wal_size = 8388608 - - work_mem = 262144 + - max_wal_size = 8388608 + - work_mem = 262144 ## Monitor @@ -341,7 +257,7 @@ Verify all ports: for port in {6551..6560}; do curl -s "http://127.0.0.1:${port}/api/v1/transactions?limit=1" && echo; done ``` -To setup live monitoring, see [monitoring](../hedera-mirror-rest/monitoring/README.md) documentation. +To set up live monitoring, see [monitoring](/hedera-mirror-rest/monitoring/README.md) documentation. ### Open API Spec diff --git a/docs/rest/README.md b/docs/rest/README.md new file mode 100644 index 00000000000..73d1986d6f5 --- /dev/null +++ b/docs/rest/README.md @@ -0,0 +1,5 @@ +# REST API + +The REST API is the main API to retrieve data from the mirror node. Further documentation is available +on [docs.hedera.com](https://docs.hedera.com/guides/docs/mirror-node-api/cryptocurrency-api) and via +our [Swagger UI](https://mainnet-public.mirrornode.hedera.com/api/v1/docs/#/). diff --git a/docs/rosetta-server.md b/docs/rosetta-server.md deleted file mode 100644 index d68f01d0b64..00000000000 --- a/docs/rosetta-server.md +++ /dev/null @@ -1,66 +0,0 @@ -# Overview - -The rosetta server is a REST API complying with the Rosetta API -Specification [Rosetta API Specification](https://www.rosetta-api.org/docs/welcome.html). This server enables -exchanges (ex. Coinbase) to be able to integrate and work with Hedera Hashgraph. The server is written in Golang and is -largely based on [rosetta-sdk-go](https://github.com/coinbase/rosetta-sdk-go). Its main job is to respond to the Rosetta -Specified requests, to the extent allowed by Hedera, while fetching information from the mirror node database. - -## Architecture - -![Hedera Mirror Node Rosetta API](images/rosetta-server.png) -The server is largely based on [rosetta-sdk-go](https://github.com/coinbase/rosetta-sdk-go) provided by Rosetta. It -takes care of significant part of the entity model definitions and some of the API work. It assumes the request and -response models provided by Rosetta. - -As General structure the Rosetta API server has 4 main components. - -### Domain models - -These are models internal to the system allowing for safe and easy serialization and passing off information. These are -ultimately converted to/from Rosetta models or are marshaled from Database records. - -### Domain Repositories - -These are repositories used for fetching data from the Mirror node database and Marshaling it into the Domain Models. -They are providing an abstraction into the persistence layer and allowing the Services to request the necessary data. - -### Business Logic Services - -These are services executing the business logic in response to the request from the client side applications. They make -use of the Repositories to gather the necessary domain models, convert them to the necessary Rosetta types and return -them back to the client. - -### Rosetta API Controllers - -These are structures coming out of the box with rosetta-sdk-go. These are handling the raw requests, -marshaling/unmarshaling the data and triggering the business logic services. - -## Integration Tests - -The Rosetta module supports integration tests that can be run against deployed instances. - -### Postman API Tests - -[Postman's](https://www.postman.com/) [Newman](https://learning.postman.com/docs/running-collections/using-newman-cli/command-line-integration-with-newman/) -command-line collection runner is utilized for easy configuration and sharing. - -#### Setup - -```shell -npm install -g newman -``` - -#### Test Configuration - -Configuration properties are passed as parameters to the newman CLI. Available properties include: - -- `base_url` - The base URL of the target Rosetta API e.g. `http://localhost:5700` - -#### Execution - -Tests can be run using the `newman run --env-var =` command. - -```shell -newman run rosetta-api-postman.json --env-var base_url=https://previewnet.mirrornode.hedera.com/rosetta -``` diff --git a/docs/rosetta/README.md b/docs/rosetta/README.md new file mode 100644 index 00000000000..438d97754e6 --- /dev/null +++ b/docs/rosetta/README.md @@ -0,0 +1,63 @@ +# Rosetta API + +## Overview + +The Rosetta API is a REST API complying with +the [Rosetta API Specification](https://www.rosetta-api.org/docs/welcome.html) with a focus on blockchain data +integration. This server enables exchanges to be able to integrate and work with the Hedera Hashgraph network. The +server is written in Golang and is largely based on the [rosetta-sdk-go](https://github.com/coinbase/rosetta-sdk-go). +Its main job is to respond to Rosetta requests, to the extent allowed by Hedera, while fetching information from the +mirror node database. + +## Architecture + +![Architecture](rosetta-architecture.png) + +The rosetta-sdk-go takes care of a significant part of the entity model definitions and API work. The rosetta API server +has four main components: + +### Domain models + +These are models internal to the system allowing for safe and easy serialization and passing off information. These are +ultimately converted to/from rosetta models or are marshaled from database records. + +### Repositories + +These are repositories used for fetching data from the mirror node database and marshaling it into the domain models. +They provide an abstraction from the persistence layer and allow the services to request the necessary data. + +### Business Logic Services + +These services execute business logic in response to requests from client applications. They make use of the +repositories to gather the necessary domain models, convert them to the rosetta types, and return them back to the +client. + +### API Controllers + +These are structures coming out of the box with rosetta-sdk-go. These handle the raw requests, marshaling/unmarshaling +the data, and triggering the business logic services. + +## Acceptance Tests + +The Rosetta API uses [Postman](https://www.postman.com) tests to verify proper operation. The +[Newman](https://learning.postman.com/docs/running-collections/using-newman-cli/command-line-integration-with-newman) +command-line collection runner is used to execute the tests against a remote server. To use newman, either the +executable binary or Docker approach can be used. With either approach, a `base_url` variable can be supplied to +customize the target server. + +### Executable + +First ensure newman is installed locally using `npm`, then execute `newman`. + +```shell +npm install -g newman +newman run hedera-mirror-rosetta/scripts/validation/postman/rosetta-api-postman.json --env-var base_url=https://previewnet.mirrornode.hedera.com/rosetta +``` + +### Docker + +```shell +docker run --rm -v "${PWD}/hedera-mirror-rosetta/scripts/validation/postman/rosetta-api-postman.json:/tmp/postman.json" -t postman/newman run /tmp/postman.json --env-var base_url=https://previewnet.mirrornode.hedera.com/rosetta +``` + +_Note:_ To test against an instance running on the same machine as Docker use your local IP instead of 127.0.0.1. diff --git a/docs/images/rosetta-server.png b/docs/rosetta/rosetta-architecture.png similarity index 100% rename from docs/images/rosetta-server.png rename to docs/rosetta/rosetta-architecture.png diff --git a/docs/web3.md b/docs/web3/README.md similarity index 100% rename from docs/web3.md rename to docs/web3/README.md