{"id":15535762,"url":"https://github.com/jakecraige/provisions","last_synced_at":"2025-09-20T03:08:25.937Z","repository":{"id":67973124,"uuid":"181239028","full_name":"jakecraige/provisions","owner":"jakecraige","description":"A Rust implementation of the Provisions protocol","archived":false,"fork":false,"pushed_at":"2019-04-17T15:38:28.000Z","size":92,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-06T13:41:31.980Z","etag":null,"topics":["proof","provisions-protocol"],"latest_commit_sha":null,"homepage":"https://provisions.glitch.me","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/jakecraige.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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":"2019-04-13T23:28:15.000Z","updated_at":"2022-11-12T01:36:16.000Z","dependencies_parsed_at":"2023-09-12T02:26:00.078Z","dependency_job_id":null,"html_url":"https://github.com/jakecraige/provisions","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jakecraige/provisions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakecraige%2Fprovisions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakecraige%2Fprovisions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakecraige%2Fprovisions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakecraige%2Fprovisions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jakecraige","download_url":"https://codeload.github.com/jakecraige/provisions/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jakecraige%2Fprovisions/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276038107,"owners_count":25574259,"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","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["proof","provisions-protocol"],"created_at":"2024-10-02T11:48:40.260Z","updated_at":"2025-09-20T03:08:25.901Z","avatar_url":"https://github.com/jakecraige.png","language":"Rust","readme":"# Provisions: Privacy-preserving proofs of solvency\n\nThis Rust is an implementation of the [Provisions Protocol][Paper] which is described like so:\n\n\u003e Bitcoin exchanges function like banks, securely holding their customers' bitcoins on their behalf.\n\u003e Several exchanges have suffered catastrophic losses with customers permanently losing their\n\u003e savings. A proof of solvency demonstrates that the exchange controls sufficient reserves to settle\n\u003e each customer's account. We introduce Provisions, a privacy-preserving proof of solvency whereby\n\u003e an exchange does not have to disclose its Bitcoin addresses; total holdings or liabilities; or any\n\u003e information about its customers. We also propose an extension which prevents exchanges from\n\u003e colluding to cover for each other's losses. We have implemented Provisions and it offers practical\n\u003e computation times and proof sizes even for a large Bitcoin exchange with millions of customers.\n\n**Warning: This library has not received any security audit and is authored by an novice\ncryptographer. It is very likely insecure and _should not be used in any production systems._**\n\n## Supported Features\n\nThe protocol includes multiple proofs and a few optional extensions. This is the status of support\nof those features in this project so far:\n\n| Name | Description | Status |\n| --- | --- | --- |\n| Proof of Assets | Proof of knowledge of the on-chain balance and private keys. | :white_check_mark: |\n| Proof of Liability | Proof of knowledge of all customers and their balance. | :white_check_mark: |\n| Proof of Solvency | Proof that `total assets - total liabilities = 0`. | :white_check_mark: |\n| Proof of Surplus | Optional proof of surplus of assets so that the prover can have more assets than liabilities without the proof failing. | :x: |\n| Proof of Non-Collusion | Optional proof that can be used to verify provers are not colluding and including the same asset in multiple proofs of solvency. | :x: |\n\n## Usage\n\nComing soon. In the meantime, see `tests/integration_test.rs` for current API.\n\nCurrently this only works with small sets of addresses and liabilities since it does everything in\nmemory.\n\n## Future Work\n\nA list of features that I'd like to eventually have this library support.\n\n- **Persistence:** This is needed to run on larger datasets as well as to actually implement this in\n  a system. You have to provide the data in a format available for others to verify.\n- **Proof of Surplus:** Many exchanges operate on a surplus, this is a necessary feature for any\n  practical usage.\n- **A CLI:** A CLI interface that can accept data from some data source like CSV and produce a proof\n  that can be published and then used to verify the proof on that data.\n\n## Open Problems\n\nThere's a few open problems that would need to be supported for practical usage or improvements\nfrom when the paper was published, these are:\n\n**Support for cold-storage keys**\n\nExchanges operate with a majority of funds in cold-storage. To have an option of publishing a Proof\nof Solvency we need to support this use case that doesn't require regularly having cold-storage\nprivate keys available. The idea of [\"Valet\nKeys\"](https://rwc.iacr.org/2016/Slides/Provisions%20talk%20RWC.pdf) has been proposed but is not\ndocumented in a paper yet. We'll need to investigate this further and see how we could integrate\nthis.\n\n**Support for addresses**\n\nThe protocol currently requires publishing all public keys alongside some extras to create an\nanonimity set. This is problematic for cold-storage if there are no sends from the address but it\nhas received funds. If they are included in the proof it would break some of the privacy of the\nprotocol since it would be easy to confirm which of these are not on chain by diffing with the\npublished PKs on chain. This could be done with proving systems like zkSNARKS or Bulletproofs but\nwould take some work to integrate it with the protocol.\n\n**General Proof Optimizations**\n\nAll the proofs in the protocol scale linearly and are quite large. By using newer cryptographic\ntools we could reduce the size of the proofs significantly. Bulletproofs for range proofs have been\nproposed for this.\n\n[Paper]: https://crypto.stanford.edu/~dabo/pubs/abstracts/provisions.html\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjakecraige%2Fprovisions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjakecraige%2Fprovisions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjakecraige%2Fprovisions/lists"}