{"id":29560898,"url":"https://github.com/decred/cspp","last_synced_at":"2025-07-18T15:39:19.760Z","repository":{"id":42659166,"uuid":"204946403","full_name":"decred/cspp","owner":"decred","description":"Decred CoinShuffle++","archived":false,"fork":false,"pushed_at":"2025-01-24T04:02:24.000Z","size":216,"stargazers_count":32,"open_issues_count":6,"forks_count":10,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-04-25T06:24:57.315Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://docs.decred.org/privacy/cspp/overview/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/decred.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":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-08-28T14:06:13.000Z","updated_at":"2025-01-24T04:01:40.000Z","dependencies_parsed_at":"2023-02-16T08:00:59.312Z","dependency_job_id":"4c6ee785-60b5-4cb4-a941-b5bb5d854d3a","html_url":"https://github.com/decred/cspp","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/decred/cspp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decred%2Fcspp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decred%2Fcspp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decred%2Fcspp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decred%2Fcspp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/decred","download_url":"https://codeload.github.com/decred/cspp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/decred%2Fcspp/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265787578,"owners_count":23828458,"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":"2025-07-18T15:39:19.113Z","updated_at":"2025-07-18T15:39:19.753Z","avatar_url":"https://github.com/decred.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"CoinShuffle++\n=============\n\n[![Build Status](https://github.com/decred/cspp/workflows/Build%20and%20Test/badge.svg)](https://github.com/decred/cspp/actions)\n[![Doc](https://img.shields.io/badge/doc-reference-blue.svg)](https://pkg.go.dev/decred.org/cspp)\n\n## Overview\n\nThis module provides client and server implementations to execute the\n[CoinShuffle++](https://decred.org/research/ruffing2016.pdf) mixing protocol.\nWhile intended to be used to create Decred CoinJoin transactions, the client and\nserver packages are generic enough to anonymously mix and join elements of any\ngroup.\n\nThis implementation differs from the protocol described by the CoinShuffle++\npaper in the following ways:\n\n* DiceMix is replaced by [DiceMix Light](https://github.com/ElementsProject/dicemix/blob/master/doc/protocol.md).\n  This simplifies the computational cost by mixing smaller random numbers and\n  sorting results to reserve anonymous slot assignments in a traditional XOR\n  DC-net.  It also enables scaling the protocol to mix very large messages\n  without increasing the anonymization cost.\n\n* Peer session keys are ephemeral.  This is a tradeoff made to reduce\n  participant correlation observed by the server between multiple mixes with the\n  understanding that it makes peer reputation and authentication systems more\n  difficult to design.  These systems can still be built on top of ephemeral\n  session keys, e.g. by signing a challenge with both the epheremal and a static\n  identity key to demonstrate knowledge of both secret keys.\n\n* A special server acts as the central communication point rather than all peers\n  broadcasting all messages to every participant through a bulletin board or\n  chat room.  The server is the only party that advances the protocol into the\n  next state when timeouts occur.\n  \n* TLS (or another secure, authenticated channel) is required.  This simplifies\n  the protocol by removing the need to use the session signing key to\n  authenticate each individual message.  It also improves efficiency by allowing\n  authentication to be performed through a MAC.\n\n* All non-anonymous portions of the final result (in a CoinJoin, all inputs and\n  the change outputs) are shared with the server at the start of the protocol.\n  The server is responsible for merging these messages, and the mixed messages\n  from the DC-net, into a single message that clients confirm.  With knowledge\n  of how many inputs each peer is providing and their change output, a server\n  can require each peer to pay their fair share of the transaction fee and check\n  that inputs do not double spend.\n\n## Privacy guarantees and caveats\n\nCoinShuffle++ provides creation of transactions with anonymized mixing of\noutputs with equally-sized amounts in a CoinJoin.  It does not anonymize\nparticipation, transaction inputs, or change outputs.  It is possible for a mix\nto be deanonymized in the future if participants reveal, maliciously or\ninadvertently, which mixed messages were theirs.\n\nIt is not possible to apply CoinShuffle++ to mix outputs with differing output\namounts without aborting the protocol entirely upon run failure (rather than\nassigning blame, removing misbehaving peers, and starting another run).  Doing\nso would deanonymize the final outputs by associating each peer with an output\nof the revealed amount.  Therefore, only equally-sized outputs may be mixed\nanonymously.\n\n## Build requirements\n\nAll client packages and server software from this repo requires Go 1.13 or\nlater.\n\nIn addition, the server software, found in the cmd/csppserver directory, depends\non Flint2 to efficiently factor polynomials.  This requires additional C\nlibraries and headers to be installed for the server to compile and link\nagainst.  On Ubuntu 18.04:\n\n  $ sudo apt-get install libflint-dev libmpfr-dev\n\n## License\n\ncspp is released under a permissive ISC license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecred%2Fcspp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdecred%2Fcspp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdecred%2Fcspp/lists"}