From 8a11b04404fd1467d3a4c8096b51dfd235d6f575 Mon Sep 17 00:00:00 2001
From: asuch <asuch@syncad.com>
Date: Wed, 15 Jan 2025 13:55:54 +0100
Subject: [PATCH] Update readme

---
 README.md | 198 ++++++++++++++++++++++++------------------------------
 1 file changed, 86 insertions(+), 112 deletions(-)

diff --git a/README.md b/README.md
index eebf50928..b5bc33d35 100644
--- a/README.md
+++ b/README.md
@@ -15,8 +15,6 @@ developers with a more flexible/extensible alternative to the raw hived API.
    - [Prerequisites](#prerequisites)
    - [Installing Hivemind](#install-the-hivemind-itself)
    - [Installation of dockerized version](#dockerized-setup)
-1. [Updating from an existing hivemind database](#updating-from-an-existing-hivemind-database)
-1. [Running](#running)
 1. [Tests](#tests)
 1. [Configuration](#configuration)
 1. [Requirements](#requirements)
@@ -38,7 +36,7 @@ developers with a more flexible/extensible alternative to the raw hived API.
 
 - Python 3.8+ required
 - Python dependencies: `pip >= 22.2.2` and `setuptools >= 63.1.0`
-- Postgres 12+ recommended
+- Postgres 17 recommended
 
 ### Dependencies
 
@@ -113,122 +111,88 @@ pip install --no-cache-dir --verbose --user . 2>&1 | tee pip_install.log
 
 ### Dockerized setup
 
-#### Building
-
-To build image holding Hivemind instance, please use [build_instance.sh](scripts/ci-helpers/build_instance.sh). This script requires several parameters:
-
-- a tag identifier to be set on the built image
-- directory where Hivemind source code is located
-- docker registry url to produce fully qualified image name and allow to correctly resolve its dependencies
-
-```bash
-# Assuming you are in workdir directory, to perform out of source build
-../hivemind/scripts/ci-helpers/build_instance.sh local ../hivemind registry.gitlab.syncad.com/hive/hivemind
+1. Firstly, we need a working HAF instance. Create some working directory (example workplace-haf on the same level as haf directory) and we can build it via docker:
 ```
-
-#### Running HAF instance container
-
-A Hivemind instance requires a HAF instance to process incoming blockchain data collected and to store its own data in fork-resistant manner (allows hivemind data to be reverted in case of a fork).
-The easiest way to setup a HAF instance is to use a dockerized instance.
-
-To start a HAF instance, we need to prepare a data directory containing:
-
-- a blockchain subdirectory (where can be put the block_log file used by hived)
-- optionally, but very useful, a copy of haf/doc/haf_postgresql_conf.d directory, which allows simple customization of Postgres database setup by modification of `custom_postgres.conf` and `custom_pg_hba.conf` files stored inside.
-
-Please take care to set correct file permissions in order to provide write access to the data directory for processes running inside the HAF container.
-
-```bash
-cd /storage1/haf-data-dir/
-../hivemind/haf/scripts/run_hived_img.sh registry.gitlab.syncad.com/hive/haf/instance:<tag> --name=haf-mainnet-instance  --data-dir="$(pwd)" <hived-options>
+../haf/scripts/ci-helpers/build_instance.sh local-haf-develop ../haf/ registry.gitlab.syncad.com/hive/haf/
 ```
 
-For example, for testing purposes (assuming block_log file has been put into data-dir), you can spawn a 5M block replay to prepare a HAF database for further quick testing:
-
-```bash
-../hivemind/haf/scripts/run_hived_img.sh registry.gitlab.syncad.com/hive/haf/instance:instance-v1.27.3.0 --name=haf-mainnet-instance  --data-dir="$(pwd)" --replay --stop-at-block=5000000
+2. For testing purposes we need a 5M block_log, so in order to avoid syncing in `workplace-haf` directory we create blockchain directory and copy there a block_log (split or monolit block_log). We can skip this step and go to 3rd step directly, but we need to remove `--replay` option in order to let hive download 5M blocks.
+```
+└── workplace-haf
+    ├── blockchain
+    │   └── block_log
 ```
 
-By examining hived.log file or using docker logs haf-mainnet-instance, you can examine state of the started instance. Once replay will be finished, you can continue and start the Hivemind sync process.
-
-Example output of hived process stopped on 5,000,000th block:
+3. Prepare HAF database - replay:
+```
+../haf/scripts/run_hived_img.sh registry.gitlab.syncad.com/hive/haf/instance:local-haf-develop --name=haf-instance --webserver-http-endpoint=8091 --webserver-ws-endpoint=8090  --data-dir=$(pwd) --docker-option="--shm-size=4294967296" --replay --stop-at-block=5000000
+```
 
-```bash
-2022-12-19T18:28:05.574637 chain_plugin.cpp:701          replay_blockchain    ] Stopped blockchain replaying on user request. Last applied block numbe
-r: 5000000.
-2022-12-19T18:28:05.574658 chain_plugin.cpp:966          plugin_startup       ] P2P enabling after replaying...
-2022-12-19T18:28:05.574670 chain_plugin.cpp:721          work                 ] Started on blockchain with 5000000 blocks, LIB: 4999980
-2022-12-19T18:28:05.574687 chain_plugin.cpp:727          work                 ] Started on blockchain with 5000000 blocks
-2022-12-19T18:28:05.574736 chain_plugin.cpp:993          plugin_startup       ] Chain plugin initialization finished...
-2022-12-19T18:28:05.574753 sql_serializer.cpp:712        plugin_startup       ] sql::plugin_startup()
-2022-12-19T18:28:05.574772 p2p_plugin.cpp:466            plugin_startup       ] P2P plugin startup...
-2022-12-19T18:28:05.574764 chain_plugin.cpp:339          operator()           ] Write processing thread started.
-2022-12-19T18:28:05.574782 p2p_plugin.cpp:470            plugin_startup       ] P2P plugin is not enabled...
-2022-12-19T18:28:05.574840 witness_plugin.cpp:648        plugin_startup       ] witness plugin:  plugin_startup() begin
-2022-12-19T18:28:05.574866 witness_plugin.cpp:655        plugin_startup       ] Witness plugin is not enabled, beause P2P plugin is disabled...
-2022-12-19T18:28:05.574885 wallet_bridge_api_plugin.cpp:20 plugin_startup       ] Wallet bridge api plugin initialization...
-2022-12-19T18:28:05.574905 wallet_bridge_api.cpp:169     api_startup          ] Wallet bridge api initialized. Missing plugins: database_api block_api
- account_history_api market_history_api network_broadcast_api rc_api_plugin
-2022-12-19T18:28:05.575624 webserver_plugin.cpp:240      operator()           ] start processing ws thread
-Entering application main loop...
-2022-12-19T18:28:05.575687 webserver_plugin.cpp:261      operator()           ] start listening for http requests on 0.0.0.0:8090
-2022-12-19T18:28:05.575716 webserver_plugin.cpp:263      operator()           ] start listening for ws requests on 0.0.0.0:8090
-2022-12-19T18:28:35.575535 chain_plugin.cpp:380          operator()           ] No P2P data (block/transaction) received in last 30 seconds... peer_count=0
-```
-
-#### Running Hivemind instance container
-
-The built Hivemind instance requires a preconfigured HAF database to store its data. You  can perform them with `install_app` command before starting the sync.
-
-The commands below assume that the running HAF container has IP: 172.17.0.2
+Replay will be finished when you see these logs:
+```
+2025-01-15T12:06:28.244946 livesync_data_dumper.cpp:85   livesync_data_dumper ] livesync dumper created
+2025-01-15T12:06:28.244960 data_processor.cpp:68         operator()           ] Account operations data writer_1 data processor connected successfully ...
+2025-01-15T12:06:28.244971 indexation_state.cpp:429      flush_all_data_to_re ] Flushing reversible blocks...
+2025-01-15T12:06:28.244976 data_processor.cpp:66         operator()           ] Applied hardforks data writer data processor is connecting ...
+2025-01-15T12:06:28.244991 indexation_state.cpp:445      flush_all_data_to_re ] Flushed all reversible blocks
+2025-01-15T12:06:28.245001 data_processor.cpp:68         operator()           ] Applied hardforks data writer data processor connected successfully ...
+2025-01-15T12:06:28.245016 indexation_state.cpp:379      update_state         ] PROFILE: Entered LIVE sync from start state: 606 s 5000000
+2025-01-15T12:06:28.245047 chain_plugin.cpp:485          operator()           ] entering API mode
+```
 
-```bash
-# Set-up Database
-../hivemind/scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local install_app \
-   --database-admin-url="postgresql://haf_admin@172.17.0.2/haf_block_log" # haf_admin access URL
+Everytime when you want to run tests or do anything with hivemind, you need to run above command and wait until above logs appear.
 
-# Run the sync
-../hivemind/scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local sync \
-   --database-url="postgresql://hivemind@172.17.0.2:5432/haf_block_log"
+4. Update haf docker in order to allow connecting to postgres DB. You can use for that case `lazydocker` for example - in that case run lazydocker, choose proper docker container and then press shift+e in order to enter container.
+Add to `/etc/postgresql/17/main/pg_hba.conf` these lines: (sudo may be needed)
 ```
+host all all 0.0.0.0/0 trust
+local all all peer
+```
+then restart postgresql: `sudo /etc/init.d/postgresql restart` (if for some reason docker container shutdown, just repeat step 3 and this one)
 
-## Updating from an existing hivemind database
+Now HAF database is ready to apply hivemind part. You can explore DB inside container with: `PGOPTIONS='-c search_path=hafd' psql -U haf_admin -d haf_block_log`
 
-```bash
-../hivemind/scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local install_app --upgrade-schema \
-   --database-admin-url="postgresql://haf_admin@172.17.0.2/haf_block_log" # haf_admin access URL
+5. Build hivemind image (assuming we run this cmd inside `workplace-hivemind` directory which is on the same level as `hivemind` directory):
+```
+../hivemind/scripts/ci-helpers/build_instance.sh local-hivemind-develop ../hivemind registry.gitlab.syncad.com/hive/hivemind
 ```
 
-(where *user-name* is your database login name)
-
-## Running
+6. Install hivemind *with mocks* (test data):
+```
+../hivemind/scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local-hivemind-develop install_app --database-admin-url="postgresql://haf_admin@172.17.0.2/haf_block_log" --with-reptracker --add-mocks="true"
+```
 
-Export the URL to your HAF database:
+you should see a lot of logs like: `INFO:hive.indexer.mocking.mock_block:OperationMock pushed successfully!` - it means mock data was applied.
 
-```bash
-export DATABASE_URL=postgresql://hivemind_app:pass@localhost:5432/haf_block_log
+7. Install reputation tracker:
+```
+../hivemind/reputation_tracker/scripts/process_blocks.sh --stop-at-block=4999979 --postgres-url="postgresql://haf_admin@172.17.0.2/haf_block_log"
 ```
 
-### Start the hivemind indexer (aka synchronization process)
 
-```bash
-hive sync
+8. Begin sync process (it will take a while).
+Note - make sure that the mocks have been added correctly via: `SELECT num FROM hafd.blocks ORDER BY NUM DESC LIMIT 1;` - this query should return `5000024` - if you still have `5000000`, you need to repeat previous steps (uninstall hivemind app or remove db and recreate it).
+Start sync process with:
 ```
-
-```bash
-$ hive status
-{'db_head_block': 19930833, 'db_head_time': '2018-02-16 21:37:36', 'db_head_age': 10}
+../hivemind/scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local-hivemind-develop sync --database-url="postgresql://hivemind@172.17.0.2:5432/haf_block_log" --community-start-block 4998000 --test-max-block=5000024
 ```
 
-### Start the hivemind API server
+9. Finish installing reputation tracker:
+```
+../hivemind/reputation_tracker/scripts/process_blocks.sh --stop-at-block=5000024 --postgres-url="postgresql://haf_admin@172.17.0.2/haf_block_log"
+```
 
-```bash
-hive server
+After this 9 steps your local hivemind instance is ready for testing purposes.
+If you want to uninstall hivemind (you will need to repeat all hivemind install steps):
+```
+../hivemind/scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local-hivemind-develop uninstall_app --database-admin-url="postgresql://haf_admin@172.17.0.2/haf_block_log"
 ```
 
-```bash
-$ curl --data '{"jsonrpc":"2.0","id":0,"method":"hive.db_head_state","params":{}}' http://localhost:8080
-{"jsonrpc": "2.0", "result": {"db_head_block": 19930795, "db_head_time": "2018-02-16 21:35:42", "db_head_age": 10}, "id": 0}
+If you updated some sql files and want to reload sql queries etc:
+1. Build again hivemind docker image
+2. Run:
+```
+../hivemind/scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local-hivemind-develop install_app --upgrade-schema --database-admin-url="postgresql://haf_admin@172.17.0.2/haf_block_log"
 ```
 
 ## Tests
@@ -236,27 +200,37 @@ $ curl --data '{"jsonrpc":"2.0","id":0,"method":"hive.db_head_state","params":{}
 To run api tests:
 
 1. Make sure that the current version of `hivemind` is installed,
-2. Api tests require that `hivemind` is synced to a node replayed up to `5_000_024` blocks (including mocks).\
-   This means, you should have your HAF database replayed up to `5_000_000` mainnet blocks and run the mocking script with:
-
-    ```bash
-    cd hivemind/scripts/ci/
-    ./scripts/ci/add-mocks-to-db.sh --postgres-url="postgresql://haf_admin@172.17.0.2/haf_block_log" # haf_admin access URL, assuming HAF is running on 172.17.0.2
-    ```
-
+2. Api tests require that `hivemind` is synced to a node replayed up to `5_000_024` blocks (including mocks).
 3. Run `hivemind` in `server` mode
-4. Set env variables:
+  (you may need to uncomment `export PGRST_DB_ROOT_SPEC="home"` from `scripts/start_postgrest.sh`. Otherwise, empty jsons could be returned , because postgrest doesn't support jsonrpc and there must be a proxy which handles this problem)
+  We can launch postgrest server in two ways (from root directory of `hivemind` repo):
+  -via docker:
+  ```
+  ./scripts/run_instance.sh registry.gitlab.syncad.com/hive/hivemind/instance:local-hivemind-develop server --database-url="postgresql://hivemind@172.17.0.2:5432/haf_block_log" --http-server-port=8080
+  ```
+  - directly launching script:
+  `./scripts/start_postgrest.sh --host=172.17.0.2`
+4. Run test:
+While postgrest server is on, we can run all test cases from specific directory (again from root directory of `hivemind` repo):
+```
+./scripts/ci/start-api-smoketest.sh localhost 8080 follow_api_patterns result.xml 8
+```
+Which will launch all tests from `follow_api_patterns` directory.
 
-    ```bash
-    export HIVEMIND_PORT=8080
-    export HIVEMIND_ADDRESS=127.0.0.1
-    ```
+To run only one, specific test case:
+```
+./scripts/ci/start-api-smoketest.sh localhost 8080 condenser_api_patterns/get_blog/limit_0.tavern.yaml result.xml 8
+```
 
-5. Run tests using tox:
+You can also check response from database with:
+```
+select * from hivemind_endpoints.home('{"jsonrpc": "2.0", "id": 1, "method": "condenser_api.get_follow_count", "params": ["gtg"]}'::json);
+```
 
-    ```bash
-    tox -e tavern -- -n auto --durations=0
-    ```
+or via curl:
+```
+curl localhost:8080 --header "Content-Type: application/json" --data '{"id": "cagdbc1", "method": "condenser_api.get_follow_count", "params": ["gtg"], "jsonrpc": "2.0"}'
+```
 
 ## Configuration
 
-- 
GitLab