{"id":14904420,"url":"https://github.com/liamzebedee/tendermint-rs","last_synced_at":"2026-01-26T01:38:17.675Z","repository":{"id":257319901,"uuid":"857914413","full_name":"liamzebedee/tendermint-rs","owner":"liamzebedee","description":"A minimal reimplementation of Tendermint in Rust","archived":false,"fork":false,"pushed_at":"2025-06-05T06:55:34.000Z","size":135,"stargazers_count":25,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-05T07:56:50.006Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://hackmd.io/@liamzebedee/BJAJYs0CA#","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liamzebedee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"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,"zenodo":null}},"created_at":"2024-09-15T23:40:30.000Z","updated_at":"2025-06-03T16:19:12.000Z","dependencies_parsed_at":"2025-01-14T08:35:12.278Z","dependency_job_id":"d9e206da-e8c3-4ada-867c-33fbc62c57e8","html_url":"https://github.com/liamzebedee/tendermint-rs","commit_stats":null,"previous_names":["liamzebedee/tendermint-rs"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/liamzebedee/tendermint-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liamzebedee%2Ftendermint-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liamzebedee%2Ftendermint-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liamzebedee%2Ftendermint-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liamzebedee%2Ftendermint-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liamzebedee","download_url":"https://codeload.github.com/liamzebedee/tendermint-rs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liamzebedee%2Ftendermint-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28764162,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T00:37:26.264Z","status":"ssl_error","status_checked_at":"2026-01-26T00:37:25.959Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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-09-22T13:01:40.330Z","updated_at":"2026-01-26T01:38:17.656Z","avatar_url":"https://github.com/liamzebedee.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# tendermint-rs\n\nA minimal reimplementation of the Tendermint BFT consensus protocol in Rust.\n\nDependencies:\n\n * tokio - for async runtime.\n * secp256k1 - for cryptographic identities.\n * serde - for message serialisation.\n * warp/reqwest - for HTTP server/clients (for node RPC).\n * hex.\n\n## Conceptual overview.\n\nA consensus protocol consists of a set of processes, which communicate by sending messages to each other in order to agree on a value. Processes may crash, run at arbitrary speeds, and display byzantine failures. The challenge of consensus is building a protocol which can finalise and does so safely and consistently given these assumptions.\n\nThe basic Tendermint algorithm is implemented as `Process`. Each `Process` communicates via abstract channels - there is an implementation using just local communication (`examples/standalone-channels`), and an implementation using RPC over HTTP servers (`examples/standalone-http`). Processes emit consensus events via tokio async streams - consumers can subscribe to the process and receive callbacks for new values agreed on by the network (called \"decisions\"). Each node has an ECDSA keypair it uses to sign messages.\n\n\n## Status.\n\nProtocol runs and achieves consensus, with rounds, epochs. \n\nSee [PLAN](./PLAN.md) for the backlog.\n\n\n## Usage.\n\n### Running tests.\n\n```sh\ncargo build\n\ncargo run --example standalone-channels\ncargo run --example standalone-http\n```\n\n### Using it.\n\nRust Tendermint can be used to build a consistent and partition-tolerant network, with a custom value that is agreed per epoch, and event streams which allow you to consume different events (such agreement - referred to as a decision, and intermediate stages).\n\n```rs\nuse tendermint::Process;\n\nfn example() {\n    // Setup networking substrate between nodes.\n    let node = Process::new();\n    \n    // Pass a get_value callback to get the next candidate value for proposal.\n    // Subscribe and listen to Decision events to process them.\n}\n```\n\nSee `examples/`.\n\n\n## Readings.\n\n - [The latest gossip on BFT consensus.](https://arxiv.org/abs/1807.04938)\n - [Tendermint: Byzantine Fault Tolerance in the Age of Blockchains.](https://atrium.lib.uoguelph.ca/server/api/core/bitstreams/0816af2c-5fd4-4d99-86d6-ced4eef2fb52/content)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliamzebedee%2Ftendermint-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliamzebedee%2Ftendermint-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliamzebedee%2Ftendermint-rs/lists"}