From 03fe4e271f0fd7817f28854122f0981d2973c060 Mon Sep 17 00:00:00 2001 From: Amin Latifi Date: Wed, 28 Sep 2022 16:54:53 +0330 Subject: [PATCH] Added power snapshot section to README.md --- README.md | 44 ++++++++++++++++++++++++++++++++++++++ docs/img/pg_cron_jobs.png | Bin 0 -> 29618 bytes 2 files changed, 44 insertions(+) create mode 100644 docs/img/pg_cron_jobs.png diff --git a/README.md b/README.md index 236f2892a..5530d1be6 100644 --- a/README.md +++ b/README.md @@ -203,3 +203,47 @@ in below image links #### Verify social network accounts ( for project verification flow) [![](https://mermaid.ink/img/pako:eNrFVcFu2zAM_RXCl7VAmgA9-hCga9euQJcNS7tTgEGVaEeNLXkSnSwo-u-jJDtJ03TYgA7zyYbI98j3aOoxk1Zhlmcef7RoJF5oUTpRzwzwIyRZB3ceXfpuhCMtdSMMwaWzhtColyfvhVwcPJhOQHiYWqlFBROklXULCGEzk4J7TDgZj3uYHM5FVYFQaoKrlPvF2UJXCHVLgrQ1cOQ5UJsSfDzvoQUjNc4-oKRv6HShZQy_tK6-VseJ0lhCsEt0W74pEmjTtARKkOBXcKi0j3AlGnSCUwSQ4wQmPWcBX8X6JEIItK6C-zXISqOhazWIiI7ruuODAQyHw4TQ5cFJEKBXI4evDql1JsAcEGo64YgOD1o2C8h2SoDppVDKofcpm32IBMHYHM78YpPlUCiQ1rCeFPutbKk7c0I0bAhvwsFLom5uKoIL7aV13RT0rLu2vih55Hfd9SPJvt9z9EglKFhpmvNMSm7kO1lGCd7w2Lo1eHKs85ZsI-R4HKq9Yktj_doUNjiRUG4DyPMK90pMsveZKXQz26HNK2vLCt-iyzIiDVKX4a_8o-6iGdPwEVOYoORe_6q9neDouVZJ3W3mgcG-wFRiFwtHoOmdh4cVHXc_Smr5OgheOFsDzdHhjoJbDW-0WbBM5i1UrDqs_6bjvnb7HHGbzYkan49GotHDvuKhtPVoeTqq8TdUYdG9Oo8HbLqKu6y3IO2xKMzu9oqG0dzZFeBPiU3cqbpIjjIoLEWlX-c4560RN-IyLllU8MyciO6wCjGagrIHdjIUvJS3E_H57O7242naPuDbKOxhSbdLsuh3YtmuPfi5bSt-10tkvbi4IHNg4UZZg6Z1jfW4J-AefSG4fPWPebNBVqOrhVZ8Cz_G2zDjX4WnIMv5VWEh2opm2cw8cWjb8J2EH5TmiznLC1F5HGSiJTtdG5nl5Frsg7qbvIt6-gW6nqHe)](https://mermaid-js.github.io/mermaid-live-editor/edit#pako:eNrFVcFu2zAM_RXCl7VAmgA9-hCga9euQJcNS7tTgEGVaEeNLXkSnSwo-u-jJDtJ03TYgA7zyYbI98j3aOoxk1Zhlmcef7RoJF5oUTpRzwzwIyRZB3ceXfpuhCMtdSMMwaWzhtColyfvhVwcPJhOQHiYWqlFBROklXULCGEzk4J7TDgZj3uYHM5FVYFQaoKrlPvF2UJXCHVLgrQ1cOQ5UJsSfDzvoQUjNc4-oKRv6HShZQy_tK6-VseJ0lhCsEt0W74pEmjTtARKkOBXcKi0j3AlGnSCUwSQ4wQmPWcBX8X6JEIItK6C-zXISqOhazWIiI7ruuODAQyHw4TQ5cFJEKBXI4evDql1JsAcEGo64YgOD1o2C8h2SoDppVDKofcpm32IBMHYHM78YpPlUCiQ1rCeFPutbKk7c0I0bAhvwsFLom5uKoIL7aV13RT0rLu2vih55Hfd9SPJvt9z9EglKFhpmvNMSm7kO1lGCd7w2Lo1eHKs85ZsI-R4HKq9Yktj_doUNjiRUG4DyPMK90pMsveZKXQz26HNK2vLCt-iyzIiDVKX4a_8o-6iGdPwEVOYoORe_6q9neDouVZJ3W3mgcG-wFRiFwtHoOmdh4cVHXc_Smr5OgheOFsDzdHhjoJbDW-0WbBM5i1UrDqs_6bjvnb7HHGbzYkan49GotHDvuKhtPVoeTqq8TdUYdG9Oo8HbLqKu6y3IO2xKMzu9oqG0dzZFeBPiU3cqbpIjjIoLEWlX-c4560RN-IyLllU8MyciO6wCjGagrIHdjIUvJS3E_H57O7242naPuDbKOxhSbdLsuh3YtmuPfi5bSt-10tkvbi4IHNg4UZZg6Z1jfW4J-AefSG4fPWPebNBVqOrhVZ8Cz_G2zDjX4WnIMv5VWEh2opm2cw8cWjb8J2EH5TmiznLC1F5HGSiJTtdG5nl5Frsg7qbvIt6-gW6nqHe) + + + +### Power Snapshot + +Impact graph supports ranking projects based on power boosted by users. +Users who have GIVpower, can boost a project by allocating a portion (percentage) of their GIVpower to that project and after that impact-graph regularly takes snapshot of user GIVpower balance and boost percentages. +At the end of each givback round (14 days), average of allocated power will be the effective power balance of each project. + +Snapshotting mechanism is implemented in by the hlp of database cron job and impact graph support of historic user balance on blockchain. +##### Database Snapshot +Snapshot taking on database is implemented by the help `pg_cron` extension on Postgres database. +On regular interval (defined by cron job expression), calls a db procedure called public."TAKE_POWER_BOOSTING_SNAPSHOT". +This procedure creates a new record of power_snapshot and copies power boosting percentages content to another table and associates them to the new power_snapshot record. +###### Cron Job Creation +Cron job creation for test environment is already implemented in dbCronRepository.ts and a modified docker with enabled `pg_cron` extension. +Giveth uses digitalocean database in production and staging environment and setting snapshot cron job is done manually there because of the digital ocean restriction on configuring `pg_cron` extension. +Creating snapshot cronjob on digital ocean postgres database step: +1. Connect to database by `doadmin` user (database owner). +2. Create cron job by sql command +```sql +CREATE EXTENSION IF NOT EXISTS PG_CRON; +SELECT CRON.schedule( + 'take givpower boosting snapshot', + '*/5 * * * *', + $$CALL public."TAKE_POWER_BOOSTING_SNAPSHOT"()$$); +``` +The cronjob expression above `*/5 * * * *` is for getting snapshot every 5 minutes in the test env. It can be a different schedule based on requirements. +3. Find created job id by running +```sql +SELECT * FROM cron.job +ORDER BY jobid DESC +``` +![img.png](docs/img/pg_cron_jobs.png) +4. Alter the job (found its id above, supposed here 1) database to whatever is set for impact-graph, here `deveop`. +```sql +select cron.alter_job(job_id:=1,database:='develop'); +``` + +##### User GIVpower balance snapshot +impact-graph monitors power_snapshot table and whenever a new record is created it find corresponding ethereum blockchain block number and fills in the snapshot record. +Then for every user who has a percentage snapshot, fills balance snapshot table with the user balance at the corresponding block number by the help of impact graph block filter. + + diff --git a/docs/img/pg_cron_jobs.png b/docs/img/pg_cron_jobs.png new file mode 100644 index 0000000000000000000000000000000000000000..a76aec9dcaa6f2542cba85dd33434d97d88b64fb GIT binary patch literal 29618 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 Q@5uCS7+o*F<`DCL0N_G&V*mgE literal 0 HcmV?d00001