{"id":13566376,"url":"https://github.com/pysel/dolev-strong","last_synced_at":"2025-04-21T18:31:57.240Z","repository":{"id":181676973,"uuid":"667131634","full_name":"pysel/dolev-strong","owner":"pysel","description":"Implementation of a Dolev-Strong protocol ","archived":false,"fork":false,"pushed_at":"2024-02-14T18:54:44.000Z","size":48947,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-01T15:21:23.342Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://www2.imm.dtu.dk/courses/02220/2015/L12/DolevStrong83.pdf","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pysel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-16T18:35:21.000Z","updated_at":"2024-11-18T01:41:30.000Z","dependencies_parsed_at":"2023-07-16T19:51:36.176Z","dependency_job_id":"88d7035e-e071-461c-90df-07908515dd87","html_url":"https://github.com/pysel/dolev-strong","commit_stats":null,"previous_names":["pysel/dolev-strong"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pysel%2Fdolev-strong","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pysel%2Fdolev-strong/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pysel%2Fdolev-strong/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pysel%2Fdolev-strong/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pysel","download_url":"https://codeload.github.com/pysel/dolev-strong/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250111091,"owners_count":21376589,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-01T13:02:08.295Z","updated_at":"2025-04-21T18:31:56.840Z","avatar_url":"https://github.com/pysel.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# Dolev-Strong protocol (***For demo use latest tag***)\n\nThis is my attempt at implementing Dolev-Strong consensus protocol in Rust.\n\nDolev-Strong is a consensus protocol for a single-shot consensus problem `Byzantine Broadcast`.\n\n## Assumptions\n\n* Permissioned (participants are known prior to run).\n* Public Key Infrastructure - PKI (all nodes know other nodes' public keys prior to the run of the protocol).\n* Synchronous model (shared global clock, bound on message delays).\n* Known bound `f` on the number of Byzantine nodes.\n\n## Byzantine Tolerance\n\nNotation: let `f` be the number of Byzantine nodes that can be tolerated by this protocol (note: `f` is not a % of total number of nodes, but an actual number of Byzantine nodes).\n\nUnder said assumptions, `f` can be arbitrarily large. Even if 2 nodes run the protocol honestly, no matter how big `f` is, honest nodes will always stay in sync with one another.\n\n## Running a Protocol\n\nThere are two ways to execute a protocol: by setting arbitrary values for amount of nodes in the system, and F (configurable)\nand by running a default configuration (10 nodes total, tolerating 8 Byzantine nodes).\n\nIn either way, each node will write it's output into a file `output.txt` in the root of the project.\nIt will be recreated for every launch of the protocol.\n\n### Configurable way\n\nTo run a protocol, execute:\n\n```bash\nmake NODES=X F=Y launch\n```\n\nwhere `X` is a number of nodes and `Y` is a number of Byzantine nodes a protocol will be able to tolerate\n(in other words, a number of stages a protocol will execute).\n\nNote: available values for `Y`: [0; X-2].\n\nReason: there should be at least 2 honest nodes in the system.\n\nNote#2: available values for `X`: 3+.\n\nReason: there should be at least 3 nodes in the consensus instance (otherwise, it's trivial).\n\n### Default way\n\nTo run a protocol in default mode, execute:\n\n```bash\n    make launch-default\n```\n\n## Running a protocol with Byzantine nodes\n\n### Byzantine Leader\n\nCurrently, available Byzantine modes for a leader are:\n\n* Null Proposal - a leader does not broadcast a proposal\n\n#### Null Proposal\n\nTo run a default instance of a protocol in null proposal mode, execute:\n\n```bash\n    make launch-null-proposal-default\n```\n\nTo run a custom instance of a protocol in null proposal mode, refer to Makefile's target `launch-null-proposal`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpysel%2Fdolev-strong","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpysel%2Fdolev-strong","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpysel%2Fdolev-strong/lists"}