From d2c450989c1b89bf25923564dacd99cec045ad94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C5=A1a=20Tomi=C4=87?= Date: Fri, 19 Jan 2024 17:53:02 +0100 Subject: [PATCH 1/5] docs: Add architectural doc for trustworthy node metrics --- docs/trustworthy-metrics/architecture.md | 72 +++++++++++++++++++++++ docs/trustworthy-metrics/data-flow.mmd | 27 +++++++++ docs/trustworthy-metrics/image.png | Bin 0 -> 31976 bytes 3 files changed, 99 insertions(+) create mode 100644 docs/trustworthy-metrics/architecture.md create mode 100644 docs/trustworthy-metrics/data-flow.mmd create mode 100644 docs/trustworthy-metrics/image.png diff --git a/docs/trustworthy-metrics/architecture.md b/docs/trustworthy-metrics/architecture.md new file mode 100644 index 000000000..249313908 --- /dev/null +++ b/docs/trustworthy-metrics/architecture.md @@ -0,0 +1,72 @@ +# Trustworthy Node Metrics: Architectural Overview and Design + +## Introduction + +This document offers a deeper look at the architectural design of the Trustworthy Node Metrics feature on the Internet Computer (IC). It is tailored for IC stakeholders and technical professionals, providing a detailed understanding of both the functional and structural aspects. + + +## Objectives + +The primary goal is to provide clear visibility into the useful work carried out by nodes on the IC. This transparency is a foundational step towards a future feature that will enable the adjustment of node remuneration based on their operational performance and reliability. + + +## High-Level Architectural Changes + +On a high level, planned architectural changes are illustrated in the following figure: + +![Architectural changes diagram](image.png) + +### Integration with Existing Architecture + +The feature is designed to integrate seamlessly with the existing IC infrastructure. The changes primarily involve the Consensus Layer, Message Routing Layer, and the addition of new components to handle metric aggregation and retrieval. + +### Expose already existing information to end users + +Consensus Layer to expose block maker information, which will be collected and aggregated by the Message Routing Layer, and stored in the replicated state with success and failure metrics of nodes. +- The metrics for the number of successfully proposed blocks and failures thereof are accumulated in the replicated state for node IDs.  +- The state of this accumulation is saved as a snapshot including the last batch just before midnight in a queue of snapshots (in chronologically ascending order). +- Snapshots in the queue are immutable, i.e. the current state is not included. +- There is no guarantee that the snapshots represent whole days or that all days are included since the subnet could have been offline at some point.  + + +### Data Accessibility +The inclusion of new components to ensure that the metrics are easily accessible for analysis and decision-making processes. This involves the management canister playing a crucial role in fetching and providing these metrics to stakeholders. + +- A metrics-fetching function is added to the management canister + + - There is support for querying since particular date + + - The function will return data from the replicated state. + + - See https://github.com/dfinity/interface-spec/pull/215 for more details. + +The DRE team provided open source tooling that fetches the metrics from the management canister(s) of all subnets and allows the community members to inspect the metrics in details. + +- The metrics retrieved from the IC can be stored in a local file (JSON format), and then further analyzed + +- The metrics will be retrieved from all subnets in parallel, whenever possible, to reduce the amount of time needed to fetch them, taking into account the possible increase of the number of subnets in the future. + +- See [trustworth-metrics](./trustworth-metrics.md) + +## Detailed Architectural Diagrams and Data Flow + +The high-level and in-depth technical diagrams provide a visual representation of the data flow within the IC architecture with to the implementation of the Trustworthy Node Metrics feature. + +[![](https://mermaid.ink/img/pako:eNqtlFFv2jAQx7_KyU8gQSWSNzRVotCqoMEqQKNrwoNJLonVxEa2M8pKv3vPoYMwqa2K5pdYd3__7-4Xy88sUjGyLks1X2cwH4QSaJlytQ-EbNiHviqKUgq7Ddk-7dZNELJDAsZYrFCbMJTBb9Qi2UKBVovILEO2hHb7ch4MptcwVyoXMl3WbFwSboMBtxx6kudbI0ylMzXVbaUaBaPZjwnETroRNjvWOAhHlXAYHDsbSiPSzAKXMfx0rYmIW6EkqAQmNDvcoU6ULriM8M0IZfwPhtlTUJGggEQL9zTUseYcvrXbruziGFsEC57nJO1zKYxFXdMvSH9x0b7cJWijrBpnB4POUdDrUP_SoDSlge98S6fdWLvrp7UyaGCVq-gRCv6IGoSsmncT7eCqQ22O0RieIkxVaYk1NMbT5t7lpOurTuXZS1ONKbdk6whttKDtDvqdRqMxxXXuaGEMM0ufZrN5PD_oBGMuqVCBsjZmZTrXpbEbpW12uAfQuxs623cJb08I_zrpdU_MIQvZzQFadQfoxkVaGdN-O9i4n6BtQkT0TciIq1fj6p3L1fsCV-9Drt6nXL1zuHrvcv1zwvXhv3H1a1z9c7n6X-Dqf8jV_5Srfw5Xv8aVtViB1LuI6b18domQ2Yz8QtalbYwJL3Pr3sgXkvLSqtlWRqxrdYktVq6JLQ4Ep_9SsG7Cc0NRjIVVerx_g6unuMXWXD4o9Vfz8gpvRMv6?type=png)](https://mermaid.live/edit#pako:eNqtlFFv2jAQx7_KyU8gQSWSNzRVotCqoMEqQKNrwoNJLonVxEa2M8pKv3vPoYMwqa2K5pdYd3__7-4Xy88sUjGyLks1X2cwH4QSaJlytQ-EbNiHviqKUgq7Ddk-7dZNELJDAsZYrFCbMJTBb9Qi2UKBVovILEO2hHb7ch4MptcwVyoXMl3WbFwSboMBtxx6kudbI0ylMzXVbaUaBaPZjwnETroRNjvWOAhHlXAYHDsbSiPSzAKXMfx0rYmIW6EkqAQmNDvcoU6ULriM8M0IZfwPhtlTUJGggEQL9zTUseYcvrXbruziGFsEC57nJO1zKYxFXdMvSH9x0b7cJWijrBpnB4POUdDrUP_SoDSlge98S6fdWLvrp7UyaGCVq-gRCv6IGoSsmncT7eCqQ22O0RieIkxVaYk1NMbT5t7lpOurTuXZS1ONKbdk6whttKDtDvqdRqMxxXXuaGEMM0ufZrN5PD_oBGMuqVCBsjZmZTrXpbEbpW12uAfQuxs623cJb08I_zrpdU_MIQvZzQFadQfoxkVaGdN-O9i4n6BtQkT0TciIq1fj6p3L1fsCV-9Drt6nXL1zuHrvcv1zwvXhv3H1a1z9c7n6X-Dqf8jV_5Srfw5Xv8aVtViB1LuI6b18domQ2Yz8QtalbYwJL3Pr3sgXkvLSqtlWRqxrdYktVq6JLQ4Ep_9SsG7Cc0NRjIVVerx_g6unuMXWXD4o9Vfz8gpvRMv6) + +## Changes in the Public Specification + +Addition of the `node_metrics` Interface: This involves updating the existing public spec to include a new `node_metrics` interface that will provide detailed metrics about node performance. + +This new interface is marked as experimental, which means that end users should not count on it being permanently being present without changes. + + +## Security and Reliability Considerations + +The feature requires the use of a wallet canister, in order to prevent abuse. Each request for fetching metrics will be charged for, which makes it harder for malicious users to conduct DOS attacks using this interface. + +All data is retrieved through `update` calls, in order to prevent a potentially malicious node from providing false data. + +## Conclusion + +The Trustworthy Node Metrics feature enables the next milestone in the transparency and operational efficiency of the IC. By providing clear insights into node performance, it lays the groundwork for decentralized data-driven decision making, and for future enhancements in node remuneration processes. diff --git a/docs/trustworthy-metrics/data-flow.mmd b/docs/trustworthy-metrics/data-flow.mmd new file mode 100644 index 000000000..20d59ee2e --- /dev/null +++ b/docs/trustworthy-metrics/data-flow.mmd @@ -0,0 +1,27 @@ +graph TD + subgraph "IC Community" + F["Community Members\n[verify metrics]"] -->T[DRE Tooling] + F --> H[Data Analysis Tools] + H --> J[JSON data with metrics] + J --> I[Community Insight and Verification of Node Performance] + end + subgraph Sx["IC subnet X"] + T <----> W + W[Wallet Canister] + W <-..->|fetch data| D1 + A1[Consensus Layer] -->|Exposes block maker information| B1["Message Routing (MR) Layer"] + B1 -->|Aggregates and writes| C1(((Replicated State))) + D1[Management Canister] -->|Trustworthy metrics API| C1 + end + subgraph Sy["IC subnet Y"] + W <-...->|"Fetch data with\ncross-subnet (XNet) calls"| D2 + A2[Consensus Layer] -->|Exposes block maker information| B2["Message Routing (MR) Layer"] + B2 -->|Aggregates and writes| C2(((Replicated State))) + D2[Management Canister] -->|Trustworthy metrics API| C2 + end + subgraph Sz["IC subnet Z"] + W <-...->|"Fetch data with\ncross-subnet (XNet) calls"| D3 + A3[Consensus Layer] -->|Exposes block maker information| B3["Message Routing (MR) Layer"] + B3 -->|Aggregates and writes| C3(((Replicated State))) + D3[Management Canister] -->|Trustworthy metrics API| C3 + end diff --git a/docs/trustworthy-metrics/image.png b/docs/trustworthy-metrics/image.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8ed2cf48fe9b886ce09770bc696b9b1202c739 GIT binary patch literal 31976 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 literal 0 HcmV?d00001 From 6cd3b28c1ede9d8370533b2a2f8b037213f01d63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C5=A1a=20Tomi=C4=87?= Date: Fri, 19 Jan 2024 18:13:41 +0100 Subject: [PATCH 2/5] Move DRE download instructions higher --- docs/trustworthy-metrics/trustworthy-metrics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/trustworthy-metrics/trustworthy-metrics.md b/docs/trustworthy-metrics/trustworthy-metrics.md index 805e0eaf8..db030ce72 100644 --- a/docs/trustworthy-metrics/trustworthy-metrics.md +++ b/docs/trustworthy-metrics/trustworthy-metrics.md @@ -48,6 +48,8 @@ To be able to fetch trustworthy metrics there are a couple of things needed prio ### Using the cli +You can obtain the DRE tool by following [getting started](../getting-started.md) + To test out the command you can run the following command ```bash @@ -104,7 +106,5 @@ Or with an HSM: dre --private-key-pem identity.pem trustworthy-metrics nanx4-baaaa-aaaap-qb4sq-cai 0 > data.json ``` -You can obtain the DRE tool by following [getting started](../getting-started.md) - You can check some examples of the analytics possible with the IC Mainnet data in the following [Jupyter Notebook](./TrustworthyMetricsAnalytics.ipynb) If you don't have Jupyter notebooks locally, you can use [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/dfinity/dre/main?labpath=docs%2Ftrustworthy-metrics%2FTrustworthyMetricsAnalytics.ipynb) to run it online. From 6313dff93d55e172bcedb40b8e9a0a3501d850f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C5=A1a=20Tomi=C4=87?= Date: Fri, 19 Jan 2024 18:29:47 +0100 Subject: [PATCH 3/5] Embed mermaid.js into the markdown doc --- docs/trustworthy-metrics/architecture.md | 34 ++++++++++++++++++++++-- docs/trustworthy-metrics/data-flow.mmd | 27 ------------------- mkdocs.yml | 6 ++++- 3 files changed, 37 insertions(+), 30 deletions(-) delete mode 100644 docs/trustworthy-metrics/data-flow.mmd diff --git a/docs/trustworthy-metrics/architecture.md b/docs/trustworthy-metrics/architecture.md index 249313908..f374b3960 100644 --- a/docs/trustworthy-metrics/architecture.md +++ b/docs/trustworthy-metrics/architecture.md @@ -46,13 +46,43 @@ The DRE team provided open source tooling that fetches the metrics from the mana - The metrics will be retrieved from all subnets in parallel, whenever possible, to reduce the amount of time needed to fetch them, taking into account the possible increase of the number of subnets in the future. -- See [trustworth-metrics](./trustworth-metrics.md) +- See [trustworthy-metrics](./trustworthy-metrics.md) ## Detailed Architectural Diagrams and Data Flow The high-level and in-depth technical diagrams provide a visual representation of the data flow within the IC architecture with to the implementation of the Trustworthy Node Metrics feature. -[![](https://mermaid.ink/img/pako:eNqtlFFv2jAQx7_KyU8gQSWSNzRVotCqoMEqQKNrwoNJLonVxEa2M8pKv3vPoYMwqa2K5pdYd3__7-4Xy88sUjGyLks1X2cwH4QSaJlytQ-EbNiHviqKUgq7Ddk-7dZNELJDAsZYrFCbMJTBb9Qi2UKBVovILEO2hHb7ch4MptcwVyoXMl3WbFwSboMBtxx6kudbI0ylMzXVbaUaBaPZjwnETroRNjvWOAhHlXAYHDsbSiPSzAKXMfx0rYmIW6EkqAQmNDvcoU6ULriM8M0IZfwPhtlTUJGggEQL9zTUseYcvrXbruziGFsEC57nJO1zKYxFXdMvSH9x0b7cJWijrBpnB4POUdDrUP_SoDSlge98S6fdWLvrp7UyaGCVq-gRCv6IGoSsmncT7eCqQ22O0RieIkxVaYk1NMbT5t7lpOurTuXZS1ONKbdk6whttKDtDvqdRqMxxXXuaGEMM0ufZrN5PD_oBGMuqVCBsjZmZTrXpbEbpW12uAfQuxs623cJb08I_zrpdU_MIQvZzQFadQfoxkVaGdN-O9i4n6BtQkT0TciIq1fj6p3L1fsCV-9Drt6nXL1zuHrvcv1zwvXhv3H1a1z9c7n6X-Dqf8jV_5Srfw5Xv8aVtViB1LuI6b18domQ2Yz8QtalbYwJL3Pr3sgXkvLSqtlWRqxrdYktVq6JLQ4Ep_9SsG7Cc0NRjIVVerx_g6unuMXWXD4o9Vfz8gpvRMv6?type=png)](https://mermaid.live/edit#pako:eNqtlFFv2jAQx7_KyU8gQSWSNzRVotCqoMEqQKNrwoNJLonVxEa2M8pKv3vPoYMwqa2K5pdYd3__7-4Xy88sUjGyLks1X2cwH4QSaJlytQ-EbNiHviqKUgq7Ddk-7dZNELJDAsZYrFCbMJTBb9Qi2UKBVovILEO2hHb7ch4MptcwVyoXMl3WbFwSboMBtxx6kudbI0ylMzXVbaUaBaPZjwnETroRNjvWOAhHlXAYHDsbSiPSzAKXMfx0rYmIW6EkqAQmNDvcoU6ULriM8M0IZfwPhtlTUJGggEQL9zTUseYcvrXbruziGFsEC57nJO1zKYxFXdMvSH9x0b7cJWijrBpnB4POUdDrUP_SoDSlge98S6fdWLvrp7UyaGCVq-gRCv6IGoSsmncT7eCqQ22O0RieIkxVaYk1NMbT5t7lpOurTuXZS1ONKbdk6whttKDtDvqdRqMxxXXuaGEMM0ufZrN5PD_oBGMuqVCBsjZmZTrXpbEbpW12uAfQuxs623cJb08I_zrpdU_MIQvZzQFadQfoxkVaGdN-O9i4n6BtQkT0TciIq1fj6p3L1fsCV-9Drt6nXL1zuHrvcv1zwvXhv3H1a1z9c7n6X-Dqf8jV_5Srfw5Xv8aVtViB1LuI6b18domQ2Yz8QtalbYwJL3Pr3sgXkvLSqtlWRqxrdYktVq6JLQ4Ep_9SsG7Cc0NRjIVVerx_g6unuMXWXD4o9Vfz8gpvRMv6) +```mermaid +graph TD + subgraph "IC Community" + F["Community Members\n[verify metrics]"] -->T[DRE Tooling] + F --> H[Data Analysis Tools] + H --> J[JSON data with metrics] + J --> I[Community Insight and Verification of Node Performance] + end + subgraph Sx["IC subnet X"] + T <----> W + W[Wallet Canister] + W <-..->|fetch data| D1 + A1[Consensus Layer] -->|Exposes block maker information| B1["Message Routing (MR) Layer"] + B1 -->|Aggregates and writes| C1(((Replicated State))) + D1[Management Canister] -->|Trustworthy metrics API| C1 + end + subgraph Sy["IC subnet Y"] + W <-.....->|"Fetch data with\ncross-subnet (XNet) calls"| D2 + A2[Consensus Layer] -->|Exposes block maker information| B2["Message Routing (MR) Layer"] + B2 -->|Aggregates and writes| C2(((Replicated State))) + D2[Management Canister] -->|Trustworthy metrics API| C2 + end + subgraph Sz["IC subnet Z"] + W <-.....->|"Fetch data with\ncross-subnet (XNet) calls"| D3 + A3[Consensus Layer] -->|Exposes block maker information| B3["Message Routing (MR) Layer"] + B3 -->|Aggregates and writes| C3(((Replicated State))) + D3[Management Canister] -->|Trustworthy metrics API| C3 + end +``` + +[Link for online editing with preview](https://mermaid.live/edit#pako:eNqtlFFv2jAQx7_KyU8gQSWSNzRVoqRVQYNVgEbXhAeTHMFqYiPbGWWl373n0JEwqa2K5pdYd3__7-4Xy88sVgmyLks136xhFkQSaJlieQhEbNCHvsrzQgq7i9gh7dZNGLFjAkaYL1GbKJLhb9RitYMcrRaxWURsAe325SwMJtcwUyoTMl3UbFwSbsOAWw49ybOdEabUmZrqtlQNw-H0xxgSJ90Ku65qHIXDUjgIq84G0oh0bYHLBH661kTMrVAS1ArGNDvcoV4pnXMZ45sRyuQfDNOnsCRBAYkW7mmoquYMvrXbruy8is3DOc8ykva5FMairunnpL-4aF_uV2jjdTnOHoJOJeh1qH9pUJrCwHe-o9NurP3100YZNLDMVPwIOX9EDUKWzbuJ9nDVoTZHaAxPESaqsMQaGqNJ8-By0vVVp_TspanGlFuydYS2WtB2D_1Oo9GY4CZztDCBqaVPs9mszgedcMQlFcpR1sYsTWe6MHartF0f7wH07gbO9l3CuxPCv056PRC7KKFF7OaIrbwFdOdirYxpvx1t3I_RNiEm_iZiRNarkfXOJet9gaz3IVnvU7LeOWS9d8n-OSH78B_J-jWy_rlk_S-Q9T8k639K1j-HrF8jy1osR-pdJPRmPrtExOya_CLWpW2CK15k1r2TLyTlhVXTnYxZ1-oCW6zYEFsMBKc_k7PuimeGopgIq_To8A6Xz3GLbbh8UOqv5uUVRR7Msg) ## Changes in the Public Specification diff --git a/docs/trustworthy-metrics/data-flow.mmd b/docs/trustworthy-metrics/data-flow.mmd deleted file mode 100644 index 20d59ee2e..000000000 --- a/docs/trustworthy-metrics/data-flow.mmd +++ /dev/null @@ -1,27 +0,0 @@ -graph TD - subgraph "IC Community" - F["Community Members\n[verify metrics]"] -->T[DRE Tooling] - F --> H[Data Analysis Tools] - H --> J[JSON data with metrics] - J --> I[Community Insight and Verification of Node Performance] - end - subgraph Sx["IC subnet X"] - T <----> W - W[Wallet Canister] - W <-..->|fetch data| D1 - A1[Consensus Layer] -->|Exposes block maker information| B1["Message Routing (MR) Layer"] - B1 -->|Aggregates and writes| C1(((Replicated State))) - D1[Management Canister] -->|Trustworthy metrics API| C1 - end - subgraph Sy["IC subnet Y"] - W <-...->|"Fetch data with\ncross-subnet (XNet) calls"| D2 - A2[Consensus Layer] -->|Exposes block maker information| B2["Message Routing (MR) Layer"] - B2 -->|Aggregates and writes| C2(((Replicated State))) - D2[Management Canister] -->|Trustworthy metrics API| C2 - end - subgraph Sz["IC subnet Z"] - W <-...->|"Fetch data with\ncross-subnet (XNet) calls"| D3 - A3[Consensus Layer] -->|Exposes block maker information| B3["Message Routing (MR) Layer"] - B3 -->|Aggregates and writes| C3(((Replicated State))) - D3[Management Canister] -->|Trustworthy metrics API| C3 - end diff --git a/mkdocs.yml b/mkdocs.yml index e8ab76e91..4bd0dc8ef 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -41,5 +41,9 @@ markdown_extensions: - pymdownx.keys - pymdownx.tabbed: alternate_style: true - - pymdownx.superfences + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format - tables From f1bb8a8aef1e250a4830cf99b706cb5accc6b713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C5=A1a=20Tomi=C4=87?= Date: Fri, 19 Jan 2024 18:40:05 +0100 Subject: [PATCH 4/5] Add link to github pages from the README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index e773ea0e9..a8451bdc9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +# Repo docs in Github Pages + +Searchable docs are available as GitHub pages at https://dfinity.github.io/dre/ + # Pre-requisites ## 1. Install dependencies From 7b5521bc7bf0c5d5e2cbc12d7f811e22bb47bdbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C5=A1a=20Tomi=C4=87?= Date: Fri, 19 Jan 2024 18:41:15 +0100 Subject: [PATCH 5/5] Update title --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a8451bdc9..3b3dd9fde 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Repo docs in Github Pages +# Documentation in Github Pages Searchable docs are available as GitHub pages at https://dfinity.github.io/dre/