{"id":13730423,"url":"https://github.com/eduardsui/edwork","last_synced_at":"2025-05-08T03:30:31.728Z","repository":{"id":60275115,"uuid":"144971657","full_name":"eduardsui/edwork","owner":"eduardsui","description":"Decentralized, distributed read-write filesystem","archived":false,"fork":false,"pushed_at":"2022-10-09T12:28:33.000Z","size":4393,"stargazers_count":25,"open_issues_count":0,"forks_count":0,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-11-14T21:38:01.443Z","etag":null,"topics":["decentralized-storage","filesystem"],"latest_commit_sha":null,"homepage":"","language":"C","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/eduardsui.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}},"created_at":"2018-08-16T10:14:15.000Z","updated_at":"2024-03-20T14:07:23.000Z","dependencies_parsed_at":"2023-01-19T17:03:31.835Z","dependency_job_id":null,"html_url":"https://github.com/eduardsui/edwork","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduardsui%2Fedwork","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduardsui%2Fedwork/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduardsui%2Fedwork/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eduardsui%2Fedwork/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eduardsui","download_url":"https://codeload.github.com/eduardsui/edwork/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252992697,"owners_count":21837169,"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":["decentralized-storage","filesystem"],"created_at":"2024-08-03T02:01:14.640Z","updated_at":"2025-05-08T03:30:31.159Z","avatar_url":"https://github.com/eduardsui.png","language":"C","readme":"# edwork\nYou may donate Bitcoin for this project at 14LqvMzFfaJ82C7wY5iavvTf9HPELYWsax\n\n![](bwallet.png)\n\nedwork is a lightweight decentralized, distributed read-write filesystem. It uses UDP and SCTP/UDP protocol for node sync. For now, it should not be used in production.\n\nHow it works\n------------\n\nAfter compiling you will get either an `edfs_mount`(if built with fuse or dokany) or `edfs_console`. This is a node. Every node is the same (no master). The difference is that some nodes may have a full key pair (public-private) and some have only the public key, that can be only used for checking signatures.\n\nThe nodes discover each other by using 3 strategies:\n1. using the -use parameter to explicitly set the first node (eg.: `./edfs_mount -use someserver:4848`)\n2. hardcoding a node (by defining EDFS_DEFAULT_HOST at compile time)\n3. exchanging lists of addresses between them\n\nAll data traffic is encrypted using chacha20.\n\nEvery file has an unique 64-bit id, computed as:\n```\nfile_id = xxhash(sha256(parent_id || filename))\n```\n\nThere is some collision probability on deployments with lots of files. This could be mediated by using larger file ids. 64bit id's were used for compatibility with fuse's `ino_t` type.\n\nAfter the file id is computed, the file content is split into 57k chunks (in order to fit in a UDP datagram). Each chunk is optionally compressed (compression is enabled by default). \nEvery user will have the full inode list, but not every file chunk. The inode list is sent when receiving a `ROOT` request.\n\nFile chunks are sent \"on-needed\" by broadcasting a ``WANT`` request. In order to avoid flooding the edwork nodes, a cost function (proof of work) function was added. It is closely related with hashcash original specification, but instead of sha-1, it uses sha3-256. For every chunk (57k or less) a node must compute a hash begining with 12 zero bits. A `ROOT` request needs a 14 zero bit  proof of work.\n\nThe filesystem supports most of the I/O operations except rename. This is because the `file_id` is dependent of its name.\n\nCompiling\n------------\n\nedwork may be compiled stand-alone (with no dependencies), with fuse or with dokany-fuse compatibility layer.\n\nOn Linux (fuse):\n```\n$ make\n```\n\nLinux, FreeBSD, OS X, without fuse:\n```\n$ make -f Makefile.console\n```\n\nWindows (dokany):\n```\nmake -f Makefile.win32\n```\n\nWindows (console):\n```\nmake -f Makefile.console.win32\n```\n\nWork in progress\n------------\nThis is work in progress, protocol and API may change. For now, is not suitable for production use.\n","funding_links":[],"categories":["C++"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feduardsui%2Fedwork","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feduardsui%2Fedwork","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feduardsui%2Fedwork/lists"}