From 6efbb3bf2f6ccc20e6993a0b10dc3675f4512999 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 13 Jun 2025 13:43:33 +0800 Subject: [PATCH 01/18] test: dispersal with mod da images --- src/env_vars.py | 6 +++++- src/node/node_vars.py | 14 ++++++++++++- src/steps/common.py | 20 +++++++++++++++++- .../test_dispersal_resilience.py | 21 +++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 tests/dispersal_resilience/test_dispersal_resilience.py diff --git a/src/env_vars.py b/src/env_vars.py index 8a2358e..28b2c59 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -15,8 +15,10 @@ def get_env_var(var_name, default=None): # Configuration constants. Need to be upercase to appear in reports -DEFAULT_NOMOS_IMAGE = "ghcr.io/logos-co/nomos:testnet" +DEFAULT_NOMOS_IMAGE = "nomos:testnet" NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) +NOMOS_MOD_DA_IMAGE = "nomos-mod-da:testnet" +NOMOS_EXECUTOR_MOD_DA_IMAGE = "nomos-executor-mod-da:testnet" DEFAULT_PROXY_IMAGE = "bitnami/configurable-http-proxy:latest" HTTP_PROXY_IMAGE = get_env_var("HTTP_PROXY_IMAGE", DEFAULT_PROXY_IMAGE) @@ -25,6 +27,8 @@ NOMOS_CUSTOM = "nomos_custom" NOMOS = "nomos" NOMOS_EXECUTOR = "nomos_executor" CFGSYNC = "cfgsync" +NOMOS_MOD_DA = "nomos_mod_da" +NOMOS_EXECUTOR_MOD_DA = "nomos_executor_mod_da" NODE_1 = get_env_var("NODE_1", NOMOS) NODE_2 = get_env_var("NODE_2", NOMOS_EXECUTOR) diff --git a/src/node/node_vars.py b/src/node/node_vars.py index 6b1f71f..f45530a 100644 --- a/src/node/node_vars.py +++ b/src/node/node_vars.py @@ -1,6 +1,18 @@ -from src.env_vars import NOMOS_IMAGE +from src.env_vars import NOMOS_IMAGE, NOMOS_MOD_DA_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE nomos_nodes = { + "nomos_mod_da": { + "image": NOMOS_MOD_DA_IMAGE, + "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], + "ports": ["3000/udp", "18080/tcp"], + "entrypoint": "/etc/nomos/scripts/run_nomos_node.sh", + }, + "nomos_executor_mod_da": { + "image": NOMOS_EXECUTOR_MOD_DA_IMAGE, + "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], + "ports": ["3000/udp", "18080/tcp"], + "entrypoint": "/etc/nomos/scripts/run_nomos_executor.sh", + }, "nomos_custom": { "image": NOMOS_IMAGE, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], diff --git a/src/steps/common.py b/src/steps/common.py index 89671eb..eaf9db9 100644 --- a/src/steps/common.py +++ b/src/steps/common.py @@ -4,7 +4,7 @@ import os import pytest from src.client.proxy_client import ProxyClient -from src.env_vars import CFGSYNC, NOMOS, NOMOS_EXECUTOR, CONSENSUS_SLOT_TIME +from src.env_vars import CFGSYNC, NOMOS, NOMOS_EXECUTOR, CONSENSUS_SLOT_TIME, NOMOS_MOD_DA, NOMOS_EXECUTOR_MOD_DA from src.libs.common import delay from src.libs.custom_logger import get_custom_logger from src.node.nomos_node import NomosNode @@ -112,3 +112,21 @@ class StepsCommon: @pytest.fixture(params=["setup_2_node_cluster", "setup_4_node_cluster"]) def setup_cluster_variant(self, request): return request.getfixturevalue(request.param) + + @pytest.fixture(scope="function") + def setup_2_node_mod_da_cluster(self, request): + logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}") + + subnet_size = get_param_or_default(request, "subnet_size", 2) + dispersal_factor = get_param_or_default(request, "dispersal_factor", 2) + min_dispersal_peers = get_param_or_default(request, "min_dispersal_peers", 1) + prepare_cluster_config(2, subnet_size, dispersal_factor, min_dispersal_peers) + + self.node1 = NomosNode(CFGSYNC, "cfgsync") + self.node2 = NomosNode(NOMOS_MOD_DA, "nomos_node_0") + self.node3 = NomosNode(NOMOS_EXECUTOR_MOD_DA, "nomos_node_1") + self.main_nodes.extend([self.node1, self.node2, self.node3]) + start_nodes(self.main_nodes) + ensure_nodes_ready(self.main_nodes[1:]) + + delay(CONSENSUS_SLOT_TIME) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py new file mode 100644 index 0000000..e3ce060 --- /dev/null +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -0,0 +1,21 @@ +import pytest + +from src.env_vars import CONSENSUS_SLOT_TIME +from src.libs.common import to_app_id, to_index, delay +from src.steps.da import StepsDataAvailability +from src.test_data import DATA_TO_DISPERSE + + +class TestDispersalResilience(StepsDataAvailability): + main_nodes = [] + + @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") + def test_integrity_kzg_commitments(self): + # Confirm validator node has rejected dispersal request from executor - there is a mismatch between + # column data and proofs. + self.disperse_data(DATA_TO_DISPERSE[3], to_app_id(1), to_index(0)) + delay(CONSENSUS_SLOT_TIME) + try: + _rcv_data = self.get_data_range(self.node2, to_app_id(1), to_index(0), to_index(5)) + except AssertionError as ae: + assert "Get data range response is empty" in str(ae), "Get data range response should be empty" From 59c4d629b1ac2e6de3b9b2bbf6015d15549d4e0e Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 16 Jun 2025 09:38:15 +0800 Subject: [PATCH 02/18] fix: find executor node --- src/steps/da.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/steps/da.py b/src/steps/da.py index a6d4e8a..ebbf880 100644 --- a/src/steps/da.py +++ b/src/steps/da.py @@ -48,7 +48,7 @@ class StepsDataAvailability(StepsCommon): def find_executor_node(self): executor = {} for node in self.main_nodes: - if node.node_type() == NOMOS_EXECUTOR: + if "nomos_executor" in node.node_type(): executor = node return executor From bc34291cefa96724558e2d6458d081211becfe8b Mon Sep 17 00:00:00 2001 From: Roman Date: Mon, 16 Jun 2025 09:52:25 +0800 Subject: [PATCH 03/18] fix: add get-range response check --- tests/dispersal_resilience/test_dispersal_resilience.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index e3ce060..198bb23 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -16,6 +16,10 @@ class TestDispersalResilience(StepsDataAvailability): self.disperse_data(DATA_TO_DISPERSE[3], to_app_id(1), to_index(0)) delay(CONSENSUS_SLOT_TIME) try: - _rcv_data = self.get_data_range(self.node2, to_app_id(1), to_index(0), to_index(5)) + rcv_data = self.get_data_range(self.node2, to_app_id(1), to_index(0), to_index(5)) except AssertionError as ae: assert "Get data range response is empty" in str(ae), "Get data range response should be empty" + return + + if rcv_data: + raise AssertionError("Get data range response should be empty") From b1c37ea7eae1b7946b5336e27df75983b3589f8a Mon Sep 17 00:00:00 2001 From: Roman Date: Tue, 17 Jun 2025 14:32:24 +0800 Subject: [PATCH 04/18] fix: run modified nodes with DEBUG log level --- cluster_config/scripts/run_nomos_executor_debug.sh | 14 ++++++++++++++ cluster_config/scripts/run_nomos_node_debug.sh | 13 +++++++++++++ src/node/node_vars.py | 4 ++-- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100755 cluster_config/scripts/run_nomos_executor_debug.sh create mode 100755 cluster_config/scripts/run_nomos_node_debug.sh diff --git a/cluster_config/scripts/run_nomos_executor_debug.sh b/cluster_config/scripts/run_nomos_executor_debug.sh new file mode 100755 index 0000000..be81f4b --- /dev/null +++ b/cluster_config/scripts/run_nomos_executor_debug.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +export CFG_FILE_PATH="/config.yaml" \ + CFG_SERVER_ADDR="http://cfgsync:4400" \ + CFG_HOST_IP=$(hostname -i) \ + CFG_HOST_KIND="executor" \ + CFG_HOST_IDENTIFIER="executor-$(hostname -i)" \ + LOG_LEVEL="DEBUG" \ + RISC0_DEV_MODE=true + +/usr/bin/cfgsync-client && \ + exec /usr/bin/nomos-executor /config.yaml diff --git a/cluster_config/scripts/run_nomos_node_debug.sh b/cluster_config/scripts/run_nomos_node_debug.sh new file mode 100755 index 0000000..a42b992 --- /dev/null +++ b/cluster_config/scripts/run_nomos_node_debug.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e + +export CFG_FILE_PATH="/config.yaml" \ + CFG_SERVER_ADDR="http://cfgsync:4400" \ + CFG_HOST_IP=$(hostname -i) \ + CFG_HOST_IDENTIFIER="validator-$(hostname -i)" \ + LOG_LEVEL="DEBUG" \ + RISC0_DEV_MODE=true + +/usr/bin/cfgsync-client && \ + exec /usr/bin/nomos-node /config.yaml diff --git a/src/node/node_vars.py b/src/node/node_vars.py index f45530a..628f76b 100644 --- a/src/node/node_vars.py +++ b/src/node/node_vars.py @@ -5,13 +5,13 @@ nomos_nodes = { "image": NOMOS_MOD_DA_IMAGE, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], "ports": ["3000/udp", "18080/tcp"], - "entrypoint": "/etc/nomos/scripts/run_nomos_node.sh", + "entrypoint": "/etc/nomos/scripts/run_nomos_node_debug.sh", }, "nomos_executor_mod_da": { "image": NOMOS_EXECUTOR_MOD_DA_IMAGE, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], "ports": ["3000/udp", "18080/tcp"], - "entrypoint": "/etc/nomos/scripts/run_nomos_executor.sh", + "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", }, "nomos_custom": { "image": NOMOS_IMAGE, From 7266af67ca3747503c5c543f22e5d9df19814c27 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 18 Jun 2025 09:59:13 +0800 Subject: [PATCH 05/18] fix: add package files --- tests/data_confidentiality/__init__.py | 0 tests/dispersal_resilience/__init__.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/data_confidentiality/__init__.py create mode 100644 tests/dispersal_resilience/__init__.py diff --git a/tests/data_confidentiality/__init__.py b/tests/data_confidentiality/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/dispersal_resilience/__init__.py b/tests/dispersal_resilience/__init__.py new file mode 100644 index 0000000..e69de29 From 24ceab9e03718caf11973f9196f3ea9e7362a625 Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 19 Jun 2025 15:09:55 +0800 Subject: [PATCH 06/18] test: chunkification robustness --- src/env_vars.py | 2 ++ src/node/node_vars.py | 8 +++++++- src/steps/common.py | 5 ++++- .../test_dispersal_resilience.py | 12 ++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/env_vars.py b/src/env_vars.py index 28b2c59..a44a73d 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -19,6 +19,7 @@ DEFAULT_NOMOS_IMAGE = "nomos:testnet" NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) NOMOS_MOD_DA_IMAGE = "nomos-mod-da:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE = "nomos-executor-mod-da:testnet" +NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e = "nomos-executor-mod-da-25d781e:testnet" DEFAULT_PROXY_IMAGE = "bitnami/configurable-http-proxy:latest" HTTP_PROXY_IMAGE = get_env_var("HTTP_PROXY_IMAGE", DEFAULT_PROXY_IMAGE) @@ -29,6 +30,7 @@ NOMOS_EXECUTOR = "nomos_executor" CFGSYNC = "cfgsync" NOMOS_MOD_DA = "nomos_mod_da" NOMOS_EXECUTOR_MOD_DA = "nomos_executor_mod_da" +NOMOS_EXECUTOR_MOD_DA_25d781e = "nomos_executor_mod_da_25d781e" NODE_1 = get_env_var("NODE_1", NOMOS) NODE_2 = get_env_var("NODE_2", NOMOS_EXECUTOR) diff --git a/src/node/node_vars.py b/src/node/node_vars.py index 628f76b..8ed0215 100644 --- a/src/node/node_vars.py +++ b/src/node/node_vars.py @@ -1,4 +1,4 @@ -from src.env_vars import NOMOS_IMAGE, NOMOS_MOD_DA_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE +from src.env_vars import NOMOS_IMAGE, NOMOS_MOD_DA_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e nomos_nodes = { "nomos_mod_da": { @@ -13,6 +13,12 @@ nomos_nodes = { "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", }, + "nomos_executor_mod_da_25d781e": { + "image": NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e, + "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], + "ports": ["3000/udp", "18080/tcp"], + "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", + }, "nomos_custom": { "image": NOMOS_IMAGE, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], diff --git a/src/steps/common.py b/src/steps/common.py index eaf9db9..8428834 100644 --- a/src/steps/common.py +++ b/src/steps/common.py @@ -122,9 +122,12 @@ class StepsCommon: min_dispersal_peers = get_param_or_default(request, "min_dispersal_peers", 1) prepare_cluster_config(2, subnet_size, dispersal_factor, min_dispersal_peers) + executor_version = get_param_or_default(request, "executor_version", "") + executor_version = f"_{executor_version}" if executor_version else "" + self.node1 = NomosNode(CFGSYNC, "cfgsync") self.node2 = NomosNode(NOMOS_MOD_DA, "nomos_node_0") - self.node3 = NomosNode(NOMOS_EXECUTOR_MOD_DA, "nomos_node_1") + self.node3 = NomosNode(NOMOS_EXECUTOR_MOD_DA + f"{executor_version}", "nomos_node_1") self.main_nodes.extend([self.node1, self.node2, self.node3]) start_nodes(self.main_nodes) ensure_nodes_ready(self.main_nodes[1:]) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index 198bb23..66e70a3 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -23,3 +23,15 @@ class TestDispersalResilience(StepsDataAvailability): if rcv_data: raise AssertionError("Get data range response should be empty") + + @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") + @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"executor_version": "25d781e"}], indirect=True) + def test_chunkification_robustness_chunk_size_30_executor(self): + # Confirm validator node has rejected dispersal request from executor with different data alignment + try: + self.disperse_data(DATA_TO_DISPERSE[4], to_app_id(1), to_index(0), timeout_duration=0) + except Exception as e: + assert "does not match destination slice length" in str(e), "Send dispersal request should fail" + return + + assert False, "Send dispersal request should fail" From 5d7c5d31209074dea2fd8e99b93bfced38ca94a8 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 20 Jun 2025 09:20:39 +0800 Subject: [PATCH 07/18] fix: rename test chunkification robustness --- tests/dispersal_resilience/test_dispersal_resilience.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index 66e70a3..e72b97a 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -26,7 +26,7 @@ class TestDispersalResilience(StepsDataAvailability): @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"executor_version": "25d781e"}], indirect=True) - def test_chunkification_robustness_chunk_size_30_executor(self): + def test_chunkification_robustness_different_chunk_size(self): # Confirm validator node has rejected dispersal request from executor with different data alignment try: self.disperse_data(DATA_TO_DISPERSE[4], to_app_id(1), to_index(0), timeout_duration=0) From 5900c11e802d97a4ad9d5e049e3a7963fbb65b3c Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 20 Jun 2025 13:38:45 +0800 Subject: [PATCH 08/18] test: rs encoding resistance to manipulation --- src/env_vars.py | 2 ++ src/node/node_vars.py | 14 +++++++++++++- .../test_dispersal_resilience.py | 12 ++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/env_vars.py b/src/env_vars.py index a44a73d..47c334f 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -20,6 +20,7 @@ NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) NOMOS_MOD_DA_IMAGE = "nomos-mod-da:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE = "nomos-executor-mod-da:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e = "nomos-executor-mod-da-25d781e:testnet" +NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb = "nomos-executor-mod-da-0a01ddb:testnet" DEFAULT_PROXY_IMAGE = "bitnami/configurable-http-proxy:latest" HTTP_PROXY_IMAGE = get_env_var("HTTP_PROXY_IMAGE", DEFAULT_PROXY_IMAGE) @@ -31,6 +32,7 @@ CFGSYNC = "cfgsync" NOMOS_MOD_DA = "nomos_mod_da" NOMOS_EXECUTOR_MOD_DA = "nomos_executor_mod_da" NOMOS_EXECUTOR_MOD_DA_25d781e = "nomos_executor_mod_da_25d781e" +NOMOS_EXECUTOR_MOD_DA_0a01ddb = "nomos_executor_mod_da_0a01ddb" NODE_1 = get_env_var("NODE_1", NOMOS) NODE_2 = get_env_var("NODE_2", NOMOS_EXECUTOR) diff --git a/src/node/node_vars.py b/src/node/node_vars.py index 8ed0215..4da8077 100644 --- a/src/node/node_vars.py +++ b/src/node/node_vars.py @@ -1,4 +1,10 @@ -from src.env_vars import NOMOS_IMAGE, NOMOS_MOD_DA_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e +from src.env_vars import ( + NOMOS_IMAGE, + NOMOS_MOD_DA_IMAGE, + NOMOS_EXECUTOR_MOD_DA_IMAGE, + NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e, + NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb, +) nomos_nodes = { "nomos_mod_da": { @@ -19,6 +25,12 @@ nomos_nodes = { "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", }, + "nomos_executor_mod_da_0a01ddb": { + "image": NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb, + "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], + "ports": ["3000/udp", "18080/tcp"], + "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", + }, "nomos_custom": { "image": NOMOS_IMAGE, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index e72b97a..e8d6de8 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -35,3 +35,15 @@ class TestDispersalResilience(StepsDataAvailability): return assert False, "Send dispersal request should fail" + + @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") + @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"executor_version": "0a01ddb"}], indirect=True) + def test_rs_encoding_resistance_to_manipulation(self): + # Confirm validator node has rejected dispersal request from executor with inconsistent RS encoding + try: + self.disperse_data(DATA_TO_DISPERSE[5], to_app_id(1), to_index(0), timeout_duration=0) + except Exception as e: + assert "does not match destination slice length" in str(e), "Send dispersal request should fail" + return + + assert False, "Send dispersal request with inconsistent RS encoding should fail" From 0e78516607ab302c51761843fd50437dac5f0cb8 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 20 Jun 2025 15:42:25 +0800 Subject: [PATCH 09/18] fix: assertion string --- tests/dispersal_resilience/test_dispersal_resilience.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index e8d6de8..ecb1f6a 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -31,10 +31,10 @@ class TestDispersalResilience(StepsDataAvailability): try: self.disperse_data(DATA_TO_DISPERSE[4], to_app_id(1), to_index(0), timeout_duration=0) except Exception as e: - assert "does not match destination slice length" in str(e), "Send dispersal request should fail" + assert "does not match destination slice length" in str(e), "Send dispersal request with different data alignment should fail" return - assert False, "Send dispersal request should fail" + assert False, "Send dispersal request with different data alignment should fail" @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"executor_version": "0a01ddb"}], indirect=True) @@ -43,7 +43,7 @@ class TestDispersalResilience(StepsDataAvailability): try: self.disperse_data(DATA_TO_DISPERSE[5], to_app_id(1), to_index(0), timeout_duration=0) except Exception as e: - assert "does not match destination slice length" in str(e), "Send dispersal request should fail" + assert "blob sampling timed out for" in str(e), "Send dispersal request with inconsistent RS encoding should fail" return assert False, "Send dispersal request with inconsistent RS encoding should fail" From ddb5d22d8dd99b7cea244ded2ed10be189c4392f Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 20 Jun 2025 16:44:51 +0800 Subject: [PATCH 10/18] fix: add marker for tests requiring node with modifications --- tests/conftest.py | 15 +++++++++++++++ .../test_dispersal_resilience.py | 1 + 2 files changed, 16 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index ea0920e..d6a8857 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -17,6 +17,21 @@ from src.data_storage import DS logger = get_custom_logger(__name__) +def pytest_addoption(parser): + parser.addoption("--run-with-mod-da-node", action="store_true", default=False, help="Run tests requiring nodes with modified da layer") + + +def pytest_configure(config): + config.addinivalue_line("markers", "mod_da_node: Mark test as requiring --run-with-mod-da-node") + + +def pytest_collection_modifyitems(config, items): + run_mod_da_node = config.getoption("--run-with-mod-da-node") + for item in items: + if "mod_da_node" in item.keywords and not run_mod_da_node: + item.add_marker(pytest.mark.skip(reason="Requires --run-with-mod-da-node option")) + + # See https://docs.pytest.org/en/latest/example/simple.html#making-test-result-information-available-in-fixtures @pytest.hookimpl(hookwrapper=True, tryfirst=True) def pytest_runtest_makereport(item): diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index ecb1f6a..54e17e2 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -6,6 +6,7 @@ from src.steps.da import StepsDataAvailability from src.test_data import DATA_TO_DISPERSE +@pytest.mark.mod_da_node class TestDispersalResilience(StepsDataAvailability): main_nodes = [] From 8b1df73ccbaa93d536b2ae1ddb497a458484867a Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 25 Jun 2025 09:04:25 +0800 Subject: [PATCH 11/18] fix: re-test chunkification robustness --- src/env_vars.py | 6 +++--- src/node/node_vars.py | 12 ++++++------ src/steps/common.py | 5 ++++- .../test_dispersal_resilience.py | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/env_vars.py b/src/env_vars.py index 47c334f..2fe4932 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -17,9 +17,9 @@ def get_env_var(var_name, default=None): # Configuration constants. Need to be upercase to appear in reports DEFAULT_NOMOS_IMAGE = "nomos:testnet" NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) -NOMOS_MOD_DA_IMAGE = "nomos-mod-da:testnet" +NOMOS_MOD_DA_IMAGE_d8bbc46 = "nomos-mod-da-d8bbc46:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE = "nomos-executor-mod-da:testnet" -NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e = "nomos-executor-mod-da-25d781e:testnet" +NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114 = "nomos-executor-mod-da-7f54114:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb = "nomos-executor-mod-da-0a01ddb:testnet" DEFAULT_PROXY_IMAGE = "bitnami/configurable-http-proxy:latest" @@ -31,7 +31,7 @@ NOMOS_EXECUTOR = "nomos_executor" CFGSYNC = "cfgsync" NOMOS_MOD_DA = "nomos_mod_da" NOMOS_EXECUTOR_MOD_DA = "nomos_executor_mod_da" -NOMOS_EXECUTOR_MOD_DA_25d781e = "nomos_executor_mod_da_25d781e" +NOMOS_EXECUTOR_MOD_DA_7f54114 = "nomos_executor_mod_da_7f54114" NOMOS_EXECUTOR_MOD_DA_0a01ddb = "nomos_executor_mod_da_0a01ddb" NODE_1 = get_env_var("NODE_1", NOMOS) diff --git a/src/node/node_vars.py b/src/node/node_vars.py index 4da8077..ce0d941 100644 --- a/src/node/node_vars.py +++ b/src/node/node_vars.py @@ -1,14 +1,14 @@ from src.env_vars import ( NOMOS_IMAGE, - NOMOS_MOD_DA_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE, - NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e, NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb, + NOMOS_MOD_DA_IMAGE_d8bbc46, + NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114, ) nomos_nodes = { - "nomos_mod_da": { - "image": NOMOS_MOD_DA_IMAGE, + "nomos_mod_da_d8bbc46": { + "image": NOMOS_MOD_DA_IMAGE_d8bbc46, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_node_debug.sh", @@ -19,8 +19,8 @@ nomos_nodes = { "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", }, - "nomos_executor_mod_da_25d781e": { - "image": NOMOS_EXECUTOR_MOD_DA_IMAGE_25d781e, + "nomos_executor_mod_da_7f54114": { + "image": NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", diff --git a/src/steps/common.py b/src/steps/common.py index 8428834..86ff1d9 100644 --- a/src/steps/common.py +++ b/src/steps/common.py @@ -122,11 +122,14 @@ class StepsCommon: min_dispersal_peers = get_param_or_default(request, "min_dispersal_peers", 1) prepare_cluster_config(2, subnet_size, dispersal_factor, min_dispersal_peers) + validator_version = get_param_or_default(request, "validator_version", "") + validator_version = f"_{validator_version}" if validator_version else "" + executor_version = get_param_or_default(request, "executor_version", "") executor_version = f"_{executor_version}" if executor_version else "" self.node1 = NomosNode(CFGSYNC, "cfgsync") - self.node2 = NomosNode(NOMOS_MOD_DA, "nomos_node_0") + self.node2 = NomosNode(NOMOS_MOD_DA + f"{validator_version}", "nomos_node_0") self.node3 = NomosNode(NOMOS_EXECUTOR_MOD_DA + f"{executor_version}", "nomos_node_1") self.main_nodes.extend([self.node1, self.node2, self.node3]) start_nodes(self.main_nodes) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index 54e17e2..a0b53f6 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -26,7 +26,7 @@ class TestDispersalResilience(StepsDataAvailability): raise AssertionError("Get data range response should be empty") @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") - @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"executor_version": "25d781e"}], indirect=True) + @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"validator_version": "d8bbc46", "executor_version": "7f54114"}], indirect=True) def test_chunkification_robustness_different_chunk_size(self): # Confirm validator node has rejected dispersal request from executor with different data alignment try: From 66b49e1ef8d992e049b1c4ccd3dc9cd61b2fac06 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 25 Jun 2025 10:44:16 +0800 Subject: [PATCH 12/18] fix: re-test rs encoding resistance --- src/env_vars.py | 4 ++-- src/node/node_vars.py | 6 +++--- tests/dispersal_resilience/test_dispersal_resilience.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/env_vars.py b/src/env_vars.py index 2fe4932..2d7b53a 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -20,7 +20,7 @@ NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) NOMOS_MOD_DA_IMAGE_d8bbc46 = "nomos-mod-da-d8bbc46:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE = "nomos-executor-mod-da:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114 = "nomos-executor-mod-da-7f54114:testnet" -NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb = "nomos-executor-mod-da-0a01ddb:testnet" +NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376 = "nomos-executor-mod-da-4a58376:testnet" DEFAULT_PROXY_IMAGE = "bitnami/configurable-http-proxy:latest" HTTP_PROXY_IMAGE = get_env_var("HTTP_PROXY_IMAGE", DEFAULT_PROXY_IMAGE) @@ -32,7 +32,7 @@ CFGSYNC = "cfgsync" NOMOS_MOD_DA = "nomos_mod_da" NOMOS_EXECUTOR_MOD_DA = "nomos_executor_mod_da" NOMOS_EXECUTOR_MOD_DA_7f54114 = "nomos_executor_mod_da_7f54114" -NOMOS_EXECUTOR_MOD_DA_0a01ddb = "nomos_executor_mod_da_0a01ddb" +NOMOS_EXECUTOR_MOD_DA_4a58376 = "nomos_executor_mod_da_4a58376" NODE_1 = get_env_var("NODE_1", NOMOS) NODE_2 = get_env_var("NODE_2", NOMOS_EXECUTOR) diff --git a/src/node/node_vars.py b/src/node/node_vars.py index ce0d941..0d38044 100644 --- a/src/node/node_vars.py +++ b/src/node/node_vars.py @@ -1,7 +1,7 @@ from src.env_vars import ( NOMOS_IMAGE, NOMOS_EXECUTOR_MOD_DA_IMAGE, - NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb, + NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376, NOMOS_MOD_DA_IMAGE_d8bbc46, NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114, ) @@ -25,8 +25,8 @@ nomos_nodes = { "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", }, - "nomos_executor_mod_da_0a01ddb": { - "image": NOMOS_EXECUTOR_MOD_DA_IMAGE_0a01ddb, + "nomos_executor_mod_da_4a58376": { + "image": NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index a0b53f6..db499cd 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -38,7 +38,7 @@ class TestDispersalResilience(StepsDataAvailability): assert False, "Send dispersal request with different data alignment should fail" @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") - @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"executor_version": "0a01ddb"}], indirect=True) + @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"validator_version": "d8bbc46", "executor_version": "4a58376"}], indirect=True) def test_rs_encoding_resistance_to_manipulation(self): # Confirm validator node has rejected dispersal request from executor with inconsistent RS encoding try: From 2b51738ffc2f7685021a3bac46aa125972df63ac Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 25 Jun 2025 15:19:41 +0800 Subject: [PATCH 13/18] fix: re-test KZG commitments integrity --- src/env_vars.py | 3 ++- src/node/node_vars.py | 8 ++++---- tests/dispersal_resilience/test_dispersal_resilience.py | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/env_vars.py b/src/env_vars.py index 2d7b53a..974fb5f 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -18,7 +18,7 @@ def get_env_var(var_name, default=None): DEFAULT_NOMOS_IMAGE = "nomos:testnet" NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) NOMOS_MOD_DA_IMAGE_d8bbc46 = "nomos-mod-da-d8bbc46:testnet" -NOMOS_EXECUTOR_MOD_DA_IMAGE = "nomos-executor-mod-da:testnet" +NOMOS_EXECUTOR_MOD_DA_IMAGE_d19a1f3 = "nomos-executor-mod-da-d19a1f3:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114 = "nomos-executor-mod-da-7f54114:testnet" NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376 = "nomos-executor-mod-da-4a58376:testnet" @@ -31,6 +31,7 @@ NOMOS_EXECUTOR = "nomos_executor" CFGSYNC = "cfgsync" NOMOS_MOD_DA = "nomos_mod_da" NOMOS_EXECUTOR_MOD_DA = "nomos_executor_mod_da" +NOMOS_EXECUTOR_MOD_DA_d19a1f3 = "nomos_executor_mod_da_d19a1f3" NOMOS_EXECUTOR_MOD_DA_7f54114 = "nomos_executor_mod_da_7f54114" NOMOS_EXECUTOR_MOD_DA_4a58376 = "nomos_executor_mod_da_4a58376" diff --git a/src/node/node_vars.py b/src/node/node_vars.py index 0d38044..3648ac4 100644 --- a/src/node/node_vars.py +++ b/src/node/node_vars.py @@ -1,9 +1,9 @@ from src.env_vars import ( NOMOS_IMAGE, - NOMOS_EXECUTOR_MOD_DA_IMAGE, - NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376, NOMOS_MOD_DA_IMAGE_d8bbc46, + NOMOS_EXECUTOR_MOD_DA_IMAGE_d19a1f3, NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114, + NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376, ) nomos_nodes = { @@ -13,8 +13,8 @@ nomos_nodes = { "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_node_debug.sh", }, - "nomos_executor_mod_da": { - "image": NOMOS_EXECUTOR_MOD_DA_IMAGE, + "nomos_executor_mod_da_d19a1f3": { + "image": NOMOS_EXECUTOR_MOD_DA_IMAGE_d19a1f3, "volumes": ["cluster_config:/etc/nomos", "./kzgrs/kzgrs_test_params:/kzgrs_test_params:z"], "ports": ["3000/udp", "18080/tcp"], "entrypoint": "/etc/nomos/scripts/run_nomos_executor_debug.sh", diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index db499cd..77cab55 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -11,6 +11,7 @@ class TestDispersalResilience(StepsDataAvailability): main_nodes = [] @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") + @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"validator_version": "d8bbc46", "executor_version": "d19a1f3"}], indirect=True) def test_integrity_kzg_commitments(self): # Confirm validator node has rejected dispersal request from executor - there is a mismatch between # column data and proofs. From d7fe54e06e2e6c63785428053ffea97e640fa2a6 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 25 Jun 2025 16:54:49 +0800 Subject: [PATCH 14/18] fix: optimize variables --- src/env_vars.py | 28 +++++++++++++++++++--------- src/steps/common.py | 10 +++++----- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/env_vars.py b/src/env_vars.py index 974fb5f..e6bfcb3 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -14,13 +14,24 @@ def get_env_var(var_name, default=None): return env_var +def make_mod_da_var(node_type, version, is_image=False): + base = "nomos_executor_mod_da" if node_type == "executor" else "nomos_mod_da" + value = f"{base}_{version}" + + if is_image: + return value.replace("_", "-") + ":testnet" + else: + return value + + # Configuration constants. Need to be upercase to appear in reports DEFAULT_NOMOS_IMAGE = "nomos:testnet" NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) -NOMOS_MOD_DA_IMAGE_d8bbc46 = "nomos-mod-da-d8bbc46:testnet" -NOMOS_EXECUTOR_MOD_DA_IMAGE_d19a1f3 = "nomos-executor-mod-da-d19a1f3:testnet" -NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114 = "nomos-executor-mod-da-7f54114:testnet" -NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376 = "nomos-executor-mod-da-4a58376:testnet" + +NOMOS_MOD_DA_IMAGE_d8bbc46 = make_mod_da_var("validator", "d8bbc46", True) +NOMOS_EXECUTOR_MOD_DA_IMAGE_d19a1f3 = make_mod_da_var("executor", "d19a1f3", True) +NOMOS_EXECUTOR_MOD_DA_IMAGE_7f54114 = make_mod_da_var("executor", "7f54114", True) +NOMOS_EXECUTOR_MOD_DA_IMAGE_4a58376 = make_mod_da_var("executor", "4a58376", True) DEFAULT_PROXY_IMAGE = "bitnami/configurable-http-proxy:latest" HTTP_PROXY_IMAGE = get_env_var("HTTP_PROXY_IMAGE", DEFAULT_PROXY_IMAGE) @@ -29,11 +40,10 @@ NOMOS_CUSTOM = "nomos_custom" NOMOS = "nomos" NOMOS_EXECUTOR = "nomos_executor" CFGSYNC = "cfgsync" -NOMOS_MOD_DA = "nomos_mod_da" -NOMOS_EXECUTOR_MOD_DA = "nomos_executor_mod_da" -NOMOS_EXECUTOR_MOD_DA_d19a1f3 = "nomos_executor_mod_da_d19a1f3" -NOMOS_EXECUTOR_MOD_DA_7f54114 = "nomos_executor_mod_da_7f54114" -NOMOS_EXECUTOR_MOD_DA_4a58376 = "nomos_executor_mod_da_4a58376" + +NOMOS_EXECUTOR_MOD_DA_d19a1f3 = make_mod_da_var("executor", "d19a1f3") +NOMOS_EXECUTOR_MOD_DA_7f54114 = make_mod_da_var("executor", "7f54114") +NOMOS_EXECUTOR_MOD_DA_4a58376 = make_mod_da_var("executor", "4a58376") NODE_1 = get_env_var("NODE_1", NOMOS) NODE_2 = get_env_var("NODE_2", NOMOS_EXECUTOR) diff --git a/src/steps/common.py b/src/steps/common.py index 86ff1d9..5eaceb2 100644 --- a/src/steps/common.py +++ b/src/steps/common.py @@ -4,7 +4,7 @@ import os import pytest from src.client.proxy_client import ProxyClient -from src.env_vars import CFGSYNC, NOMOS, NOMOS_EXECUTOR, CONSENSUS_SLOT_TIME, NOMOS_MOD_DA, NOMOS_EXECUTOR_MOD_DA +from src.env_vars import CFGSYNC, NOMOS, NOMOS_EXECUTOR, CONSENSUS_SLOT_TIME, make_mod_da_var from src.libs.common import delay from src.libs.custom_logger import get_custom_logger from src.node.nomos_node import NomosNode @@ -123,14 +123,14 @@ class StepsCommon: prepare_cluster_config(2, subnet_size, dispersal_factor, min_dispersal_peers) validator_version = get_param_or_default(request, "validator_version", "") - validator_version = f"_{validator_version}" if validator_version else "" + validator = make_mod_da_var("validator", validator_version) executor_version = get_param_or_default(request, "executor_version", "") - executor_version = f"_{executor_version}" if executor_version else "" + executor = make_mod_da_var("executor", executor_version) self.node1 = NomosNode(CFGSYNC, "cfgsync") - self.node2 = NomosNode(NOMOS_MOD_DA + f"{validator_version}", "nomos_node_0") - self.node3 = NomosNode(NOMOS_EXECUTOR_MOD_DA + f"{executor_version}", "nomos_node_1") + self.node2 = NomosNode(validator, "nomos_node_0") + self.node3 = NomosNode(executor, "nomos_node_1") self.main_nodes.extend([self.node1, self.node2, self.node3]) start_nodes(self.main_nodes) ensure_nodes_ready(self.main_nodes[1:]) From e2b77f9f1702dee983757abee2e8d9a9057340f8 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 25 Jun 2025 21:57:48 +0800 Subject: [PATCH 15/18] fix: optimize usefixtures --- tests/dispersal_resilience/test_dispersal_resilience.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index 77cab55..21ceaf8 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -6,11 +6,11 @@ from src.steps.da import StepsDataAvailability from src.test_data import DATA_TO_DISPERSE +@pytest.mark.usefixtures("setup_2_node_mod_da_cluster") @pytest.mark.mod_da_node class TestDispersalResilience(StepsDataAvailability): main_nodes = [] - @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"validator_version": "d8bbc46", "executor_version": "d19a1f3"}], indirect=True) def test_integrity_kzg_commitments(self): # Confirm validator node has rejected dispersal request from executor - there is a mismatch between @@ -26,7 +26,6 @@ class TestDispersalResilience(StepsDataAvailability): if rcv_data: raise AssertionError("Get data range response should be empty") - @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"validator_version": "d8bbc46", "executor_version": "7f54114"}], indirect=True) def test_chunkification_robustness_different_chunk_size(self): # Confirm validator node has rejected dispersal request from executor with different data alignment @@ -38,7 +37,6 @@ class TestDispersalResilience(StepsDataAvailability): assert False, "Send dispersal request with different data alignment should fail" - @pytest.mark.usefixtures("setup_2_node_mod_da_cluster") @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"validator_version": "d8bbc46", "executor_version": "4a58376"}], indirect=True) def test_rs_encoding_resistance_to_manipulation(self): # Confirm validator node has rejected dispersal request from executor with inconsistent RS encoding From b2f68acbce505e2baacb1ffb0c953cae0045bf5b Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 25 Jun 2025 22:11:36 +0800 Subject: [PATCH 16/18] fix: redundant return and clarify assertions --- tests/dispersal_resilience/test_dispersal_resilience.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/dispersal_resilience/test_dispersal_resilience.py b/tests/dispersal_resilience/test_dispersal_resilience.py index 21ceaf8..91b55d5 100644 --- a/tests/dispersal_resilience/test_dispersal_resilience.py +++ b/tests/dispersal_resilience/test_dispersal_resilience.py @@ -21,7 +21,6 @@ class TestDispersalResilience(StepsDataAvailability): rcv_data = self.get_data_range(self.node2, to_app_id(1), to_index(0), to_index(5)) except AssertionError as ae: assert "Get data range response is empty" in str(ae), "Get data range response should be empty" - return if rcv_data: raise AssertionError("Get data range response should be empty") @@ -35,7 +34,7 @@ class TestDispersalResilience(StepsDataAvailability): assert "does not match destination slice length" in str(e), "Send dispersal request with different data alignment should fail" return - assert False, "Send dispersal request with different data alignment should fail" + raise AssertionError("Send dispersal request with different data alignment should fail") @pytest.mark.parametrize("setup_2_node_mod_da_cluster", [{"validator_version": "d8bbc46", "executor_version": "4a58376"}], indirect=True) def test_rs_encoding_resistance_to_manipulation(self): @@ -46,4 +45,4 @@ class TestDispersalResilience(StepsDataAvailability): assert "blob sampling timed out for" in str(e), "Send dispersal request with inconsistent RS encoding should fail" return - assert False, "Send dispersal request with inconsistent RS encoding should fail" + raise AssertionError("Send dispersal request with inconsistent RS encoding should fail") From 9379b6b17dfbc12cd906584d028a6bb37702d696 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 25 Jun 2025 22:21:20 +0800 Subject: [PATCH 17/18] fix: reset DEFAULT_NOMOS_IMAGE --- src/env_vars.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/env_vars.py b/src/env_vars.py index e6bfcb3..735c283 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -25,7 +25,7 @@ def make_mod_da_var(node_type, version, is_image=False): # Configuration constants. Need to be upercase to appear in reports -DEFAULT_NOMOS_IMAGE = "nomos:testnet" +DEFAULT_NOMOS_IMAGE = "ghcr.io/logos-co/nomos:testnet" NOMOS_IMAGE = get_env_var("NOMOS_IMAGE", DEFAULT_NOMOS_IMAGE) NOMOS_MOD_DA_IMAGE_d8bbc46 = make_mod_da_var("validator", "d8bbc46", True) From b49e5527bb110a5a77b149ad6ab1324490bfd1b7 Mon Sep 17 00:00:00 2001 From: Roman Date: Thu, 26 Jun 2025 08:48:17 +0800 Subject: [PATCH 18/18] fix: update README with dispersal resilience tests instructions --- README.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index a01d94a..dd0752c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # nomos-e2e-tests -Nomos e2e framework used to test various implementations of the Nomos node. +Nomos E2E framework used to test various implementations of the Nomos node. ## Setup and contribute @@ -16,12 +16,36 @@ pre-commit install (optional) Overwrite default vars from src/env_vars.py via env vars or by adding a .env file pytest ``` -Set optional environment variable to search logs for errors after each tests: + +### Additional instructions for dispersal resilience tests + +1. Build prerequisites +```sh +git clone https://github.com/logos-co/nomos-security-tests.git +cd nomos-security-tests +git fetch; git switch test-dispersal-resilience + +git checkout d8bbc464420ef86337df963c64ac2f7c3fd97008 +docker build --no-cache -f testnet/Dockerfile.debug -t nomos-mod-da-d8bbc46:testnet . +# (x86_64) docker build --no-cache -f testnet/Dockerfile -t nomos-mod-da-d8bbc46:testnet . + +git checkout d19a1f3d8c80f654e6cf6139641519f16fe670ec +docker build --no-cache -f testnet/Dockerfile.debug -t nomos-executor-mod-da-d19a1f3:testnet . + +git checkout 7f54114b6c320dc32577b0e8bb85c2d543b4bd56 +docker build --no-cache -f testnet/Dockerfile.debug -t nomos-executor-mod-da-7f54114:testnet . + +git checkout 4a58376ac4956d87502b9fd72b64a756396f2a8d +docker build --no-cache -f testnet/Dockerfile.debug -t nomos-executor-mod-da-4a58376:testnet . +``` + +2. Run tests with `pytest --run-with-mod-da-node tests/dispersal_resilience/test_dispersal_resilience.py` + +### Enable node log search with environment variable: ```shell export CHECK_LOG_ERRORS=True ``` - ## License Licensed and distributed under either of