{"id":13566512,"url":"https://github.com/ergoplatform/ergo","last_synced_at":"2026-01-06T12:55:57.526Z","repository":{"id":37979540,"uuid":"94215475","full_name":"ergoplatform/ergo","owner":"ergoplatform","description":"Ergo protocol description \u0026 reference client implementation","archived":false,"fork":false,"pushed_at":"2024-05-21T21:35:25.000Z","size":70920,"stargazers_count":497,"open_issues_count":192,"forks_count":165,"subscribers_count":42,"default_branch":"master","last_synced_at":"2024-05-21T22:22:46.896Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://ergoplatform.org/","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ergoplatform.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":"2017-06-13T13:23:11.000Z","updated_at":"2024-05-21T22:22:51.876Z","dependencies_parsed_at":"2022-07-14T05:40:29.310Z","dependency_job_id":"8104d11c-2fdc-430a-8e6a-6c95af34f69a","html_url":"https://github.com/ergoplatform/ergo","commit_stats":null,"previous_names":[],"tags_count":164,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ergoplatform%2Fergo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ergoplatform%2Fergo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ergoplatform%2Fergo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ergoplatform%2Fergo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ergoplatform","download_url":"https://codeload.github.com/ergoplatform/ergo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":213527941,"owners_count":15600792,"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:11.052Z","updated_at":"2026-01-06T12:55:57.520Z","avatar_url":"https://github.com/ergoplatform.png","language":"Scala","funding_links":[],"categories":["Scala","Privacy Coins","🏗️ Core Infrastructure \u003ca id=\"core-infrastructure\"\u003e\u003c/a\u003e"],"sub_categories":["⚙️ Nodes \u003ca id=\"nodes\"\u003e\u003c/a\u003e"],"readme":"*The World still needs for better money. Join us in this quest.* \n\n# Ergo\n\nWelcome to the repository for the [Ergo Platform](https://ergoplatform.org/). Ergo is a Proof-of-Work cryptocurrency protocol that has been designed to offer a secure environment for new kinds of money, peer-to-peer interactions, trust-minimized financial tooling and derivatives. This repository contains the reference client, also known as the node, for Ergo.\n\nThe reference client is primarily written in Scala. While certain components of the protocol are implemented in other languages (for instance, [sigma-rust](https://github.com/ergoplatform/sigma-rust) is a Rust-based implementation of the ErgoScript cryptocurrency scripting language), the reference client provides the most complete and comprehensive implementation of the Ergo protocol at the moment.\n\n## Key Features of Ergo\n\nErgo, while sharing some commonalities with Bitcoin as a UTXO Proof-of-Work cryptocurrency, stands out due to its unique design and features. It has been built from the ground up to achieve its goals \n, introducing several innovative elements:\n\n* **ErgoScript**: A powerful contract language in the multi-stage extended UTXO model. More details can be found in the [ErgoScript whitepaper](https://ergoplatform.org/docs/ErgoScript.pdf).\n* **Autolykos2**: A memory-hard Proof-of-Work function, providing enhanced security. Learn more about it [here](https://docs.ergoplatform.com/ErgoPow.pdf).\n* Support for Stateless Clients: Ergo supports asymmetric stateless clients, based on [this paper](https://eprint.iacr.org/2016/994), and includes features like NiPoPoWs and hybrid modes.\n* **Advanced Transactional Language**: Ergo introduces an [alternative transactional language](https://github.com/ScorexFoundation/sigmastate-interpreter) that is more powerful than Bitcoin Script and is designed to be safe against heavy validation attacks.\n* **Innovative Fee Model**: Ergo implements an alternative fee model with a [mandatory storage-rent component](https://fc18.ifca.ai/bitcoin/papers/bitcoin18-final18.pdf ) (also known as demurrage). It provides truly fixed supply in the long-term, protection from UTXO dust bloating, and additional rewards stream for miners.\n\n## Specifications\n\n* [white paper](https://ergoplatform.org/docs/whitepaper.pdf) - a brief description of the protocol\n* [ErgoScript white paper](https://ergoplatform.org/docs/ErgoScript.pdf) - describes ErgoScript, a Cryptocurrency Scripting Language Supporting Noninteractive Zero-Knowledge Proofs used in Ergo\n\nMore papers can be found at [docs.ergoplatform.com/documents](https://docs.ergoplatform.com/documents/).\n\n## Security Assumptions\n\nThe Ergo client operates under certain assumptions about its environment:\n\n* The execution environment is trusted. Although the seed is stored in an encrypted file, and the client's wallet attempts to purge the secret key from memory as soon as it is no longer needed, the client does not have defenses against side-channel attacks, memory scans, etc.\n* Clocks are expected to be synchronized to a reasonable degree. If a block's timestamp is more than 20 minutes into the future, the block will be temporarily rejected. The client does not utilize NTP or other time synchronization protocols.\n\n## Building and Running the Node and UI\n\nFor instructions on how to build and run the node and UI, refer to the [official documentation](https://docs.ergoplatform.com/node/install/). \n\nBy default, the node processes all blocks from the genesis block. However, there are other options available that may be more suitable for hardware with limited resources.\n\n* **Bootstrapping with a UTXO set snapshot:** This works similarly to Ethereum's snap-sync. The node first downloads a UTXO set snapshot from a secure point in the past, then downloads blocks following the UTXO set snapshot and applies them to the set. For more details and security proofs, refer to the [\"Multi-mode cryptocurrency systems\" paper](https://eprint.iacr.org/2018/129.pdf). To enable this feature add the following to your configuration file: \n```\n\nergo {\n  ...\n  node.utxo.utxoBootstrap = true\n  ...\n}\n```\n\n* The UTXO set snapshot bootstrapping can be further optimized by combining it with NiPoPoW (Non-Interactive Proofs of Proof-of-Work). This method allows for syncing the headers-chain in logarithmic time, as opposed to the linear time required by the standard SPV sync for headers. For more details, refer to the [NiPoPoW paper](https://eprint.iacr.org/2017/963.pdf).\n```\n\nergo{\n  ...\n  node.nipopow.nipopowBootstrap = true\n  node.utxo.utxoBootstrap = true\n  ...\n}\n```\n\n* The stateless mode provides full-node security without the need to hold the entire UTXO set. This is achieved through the methods detailed in the [\"Improving Authenticated Dynamic Dictionaries, with Applications to Cryptocurrencies\" paper](https://eprint.iacr.org/2016/994.pdf). In this mode, it's possible to download and validate an arbitrary-sized suffix of the blockchain. Here's an example of how to configure this mode:\n\n```\nergo {\n   ...\n   node.stateType = \"digest\"\n   node.blocksToKeep = 2160 # store and process last three days only\n   node.nipopow.nipopowBootstrap = true   # compatible with NiPoPoWs \n   ...\n}\n```\n\n\nFor more detailed information on different modes of node operation, please visit [docs.ergoplatform.com/node/modes](https://docs.ergoplatform.com/node/modes).\n\n## Testing Procedures\n\nErgo utilizes three types of tests: \n\n1) Unit and property tests: These can be run using the `sbt test` command.\n2) Integration tests: These tests require Docker to be installed. Run them with the `sudo sbt it:test` command.\n3) Bootstrapping tests: These tests are time-consuming as they verify that the node is syncing with the main network in various modes. Docker is also required for these tests. Run them with the `sudo sbt it2:test` command.\n\n## Setting up the Project in an IDE\n\nYou can use either [IntelliJ IDEA](https://www.jetbrains.com/idea/) (Community or Ultimate edition) or [VSCode](https://code.visualstudio.com/) with the [Metals](https://scalameta.org/metals/) extension. \n\nEnsure that the project can be built with sbt before opening it in an IDE. You may need to resolve any dependency errors first.\n\nTo open the project in IntelliJ IDEA, select File / Open and navigate to the project folder. This will initiate the Project Import Wizard, which uses the SBT configuration (build.sbt file) to generate the project configuration files for IDEA. You can view the project configuration in the `File / Project Structure...` dialog. If the import is successful, you should be able to compile the project in the IDE. \n\n## Modules\n\nThis repository has modular structure, so only parts which are needed for an application could be used:\n\n* [avldb](avldb/README.md) - implementation of authenticated AVL+ tree used in Ergo, with persistence\n* [ergo-core](ergo-core/README.md) - functionality needed for an SPV client (P2P messages, block section stuctures, PoW, NiPoPoW)\n* ergo-wallet - Java and Scala functionalities to sign and verify transactions\n\nUsing IntelliJ IDEA be sure to set Build Tools / sbt -\u003e `sbt shell` / `use for` / builds, to avoid compilation errors\n\n## Contributing to Ergo\n\nErgo is an open-source project and we welcome contributions from developers and testers! Join the discussion over [Ergo Discord](https://discord.gg/kj7s7nb) in #development channel, or Telegram: https://t.me/ErgoDevelopers. Please also check out our [Contributing documentation](https://docs.ergoplatform.com/contribute/).\n\n## Frequently Asked Questions\n\nFor common queries, please refer to our [Frequently Asked Questions](FAQ.md) page.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fergoplatform%2Fergo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fergoplatform%2Fergo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fergoplatform%2Fergo/lists"}