From 84d25f1ecc51d12f4165fdeebefb4958ba3a5852 Mon Sep 17 00:00:00 2001 From: Jay Graber Date: Tue, 7 Jul 2020 16:14:29 -0700 Subject: [PATCH] Add diagrams, edit overview, update protocols --- Federated.png | Bin 0 -> 35167 bytes P2P.png | Bin 0 -> 49278 bytes overview.md | 105 ++++++++++++++++++++++++++++---------------- protocols/gun.md | 26 ++++++----- protocols/ipfs.md | 7 +-- protocols/ssb.md | 8 ++-- topics/discovery.md | 2 + topics/identity.md | 3 +- 8 files changed, 90 insertions(+), 61 deletions(-) create mode 100644 Federated.png create mode 100644 P2P.png diff --git a/Federated.png b/Federated.png new file mode 100644 index 0000000000000000000000000000000000000000..c1233b475edca2c569697bca9cebb0c7e8c0ecf0 GIT binary patch literal 35167 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 literal 0 HcmV?d00001 diff --git a/P2P.png b/P2P.png new file mode 100644 index 0000000000000000000000000000000000000000..9a30743834d5c9777ca3c861f9c0e77922317c21 GIT binary patch literal 49278 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 Q=^FT@qNJ%K4`m>pl>h($ literal 0 HcmV?d00001 diff --git a/overview.md b/overview.md index 23bc2c1..a4bdfc2 100644 --- a/overview.md +++ b/overview.md @@ -1,72 +1,99 @@ # Ecosystem Overview -We can structure the overview by topic and by protocols. It is easier to write up overviews by protocol, but organizing information by topic will be more helpful when making design decisions and evaluating relevance. +This overview of the decentralized social ecosystem is structured by protocols, applications, and topics. The protocols and applications directories contain summaries of existing projects. The topics section compares how decentralized protocols handle key topics, and includes relevant projects not covered elsewhere. -## Protocols: +### Protocols: -The protocols directory contains summaries of existing projects. Anyone can add new files summarizing a project or subject area they find interesting. The lists below are of current projects, but there is also value in summarizing historical projects that are no longer in use. +- [ActivityPub](protocols/activitypub.md) +- [Gun](protocols/gun.md) +- [Hypercore Protocol (DAT)](protocols/hypercore.md) +- [IPFS](protocols/ipfs.md) +- [Matrix](protocols/matrix.md) +- [Peergos](protocols/peergos.md) +- [Solid](protocols/solid.md) +- [XMPP](protocols/xmpp.md) -Lists of decentralized web projects. +### Applications: -[Redecentralize](https://github.com/redecentralize/alternative-internet) -[Decentralized Web projects by gdamdam](https://github.com/gdamdam/awesome-decentralized-web) -[DIDs](https://github.com/didecentral/didecentral.github.io) +- [Aether](applications/aether.md) +- [Blockchain social networks](applications/blockchain-social.md) +- [Diaspora](applications/diaspora.md) +- [Mastodon](applications/mastodon.md) +- [Ssb social networks](applications/ssb.md) -Overviews of decentralized social networks +In the p2p ecosystem, there is sometimes not a clear distinction between protocols and applications, making it unclear what a project encompasses. This diagram attempts to clarify which layer of the stack these p2p projects operate at. -[Decentralized Social Networks](https://medium.com/@jaygraber/decentralized-social-networks-e5a7a2603f53) -[Blockchain Social Networks](https://medium.com/@jaygraber/blockchain-social-networks-c941fb337970) +![P2p ecosystem](P2P.png) -## Topics: +The distinction between protocols and applications is clearer in the federated social ecosystem, where applications follow a familiar client-server model. Diaspora is both the name of the social application as well as the protocol, and Solid does not yet have a social network application. -This is a suggested list of how we could organize by topic in the `topics` directory. +![Federated ecosystem](Federated.png) -This section will be structured as comparisons between how protocols handle these core topics. Under each topic, we can address how existing protocols and projects have addressed it. Can evaluate pros and cons, as well as include concepts from projects not covered more in depth elsewhere. +More extensive lists of decentralized web projects: -#### Network structure +- [Redecentralize](https://github.com/redecentralize/alternative-internet) +- [Decentralized Web projects by gdamdam](https://github.com/gdamdam/awesome-decentralized-web) -- Federation - - Messages passed between systems - - Data replicated between systems -- P2p +Overviews of decentralized social networks: + +- [Decentralized Social Networks](https://medium.com/@jaygraber/decentralized-social-networks-e5a7a2603f53) +- [Blockchain Social Networks](https://medium.com/@jaygraber/blockchain-social-networks-c941fb337970) + +### Topics: + +[Network structure](topics/network-structure.md) + +- Federated networks + - Passing messages between systems + - Replicating data between systems +- P2p networks - Hybrid -#### Identity +[Identity](topics/identity.md) - Decentralized identity -- Key management - - Key verification - - Key backup +- In federated applications +- In p2p applications +- DIDs +- Blockchain identity - Reputation, Trust -- Account recovery -- Privacy +- Failure modes: + - Sybils & spam + - Account loss + - Impersonation -#### Data +[Data](topics/data.md) - Data models -- Data availability +- Mutability -#### Monetization - -- Business models -- Payment - -#### Discovery +[Discovery](topics/discovery.md) - Queries - Curation +- Consistency & availability -#### Moderation +[Moderation](topics/moderation.md) +- Community-based +- User-driven +- Experimental + +[Privacy](topics/privacy.md) + +- User metadata +- Private accounts +- Direct messaging + +[Monetization](topics/monetization.md) + +- Application level +- Provider level - Protocol level -- Server level -- User level -- Content level -#### Governance +[Governance](topics/governance.md) -- Upgrading protocols -- Organizational structure +- Overview of existing models ## Contributions diff --git a/protocols/gun.md b/protocols/gun.md index 8f317ef..f5d6969 100644 --- a/protocols/gun.md +++ b/protocols/gun.md @@ -4,19 +4,19 @@ GUN is a decentralized graph database with a conflict resolution algorithm (CRDT In GUN's graph store, entries are [javascript objects under UUID keys](https://gun.eco/docs/Porting-GUN). Objects can be data of any type, including files, JSON, or other documents. Data is stored in the browser by default, with backup "superpeers" to ensure persistence. Peers connect to other peers, and choose what data to synchronize and persist. -There is a public space, and a subset of that is the user space. In the public space are all graphs without a public key as their ID. In the user space, graphs are signed with the user's keys, and their IDs must include the user's public key. - ### Identity -Gun's [User System](https://gun.eco/docs/Auth) creates a username and password. Usernames are global but not unique. +Gun's [User System](https://gun.eco/docs/Auth) allows the creation of a human-readable username and password. Usernames are global but not unique. As with many other decentralized systems, there is no password recovery mechanism. -[Multi-device login](https://gun.eco/docs/Auth) is handled by encrypting a user's crytographic keypair, which is stored in the GUN graph. Keypairs are not derived from the password. PBKDF2 proof is derived from the password, and AES keys are derived from that to encrypt the keypair. GUN treats this method as "secure enough" for applications in which private keys do not control financial information. "Auth" is doing a GUN query for that account, subscribing to it, and then attempting to brute force decrypt the keys of all accounts that match that username. Once an account has been loaded once, it's cached on that device, loading from localstorage or the local harddrive. +[Multi-device login](https://gun.eco/docs/Auth) is handled by encrypting a user's crytographic keypair, which is stored in the GUN graph. Keypairs are not derived from the password. Instead, a PBKDF2 proof is derived from the password, and AES keys are derived from that to encrypt the keypair. GUN treats this method as "secure enough" for applications in which private keys do not control financial information. -GUN's SEA (Security, Encryption, Authorization) module provides the capability to directly create a [public/private keypair](https://gun.eco/docs/SEA) for a user, without a username and account. +Authentication is performed by doing a GUN query for the account username, subscribing to it, and then attempting to brute force decrypt the keys of all accounts that match the username until a match is found. Once an account has been loaded once, it's cached on device, loading from localstorage or the local harddrive. + +GUN's [SEA](https://gun.eco/docs/SEA) (Security, Encryption, Authorization) module provides the capability to directly create a [public/private keypair](https://gun.eco/docs/SEA) for a user, without a username and account. ### Network -GUN uses a gossip protocol along with a topic-based PubSub protocol to sync data between peers. GUN peers fall back to the [gossip-based protocol](https://gun.eco/docs/DAM) when the more optimized PubSub [routing](https://gun.eco/docs/Routing) protocol fails. Messages can be routed across different transport layers (websockets, WebRTC, multicast UDP etc). +GUN uses a [gossip-based protocol](https://gun.eco/docs/DAM) along with a topic-based PubSub protocol to sync data between peers. GUN peers fall back to the gossip protocol when the more optimized PubSub [routing](https://gun.eco/docs/Routing) protocol fails. Messages can be routed across different transport layers (websockets, WebRTC, multicast UDP, etc). Peers subscribe to graphs relevant to their application's logic, although the global GUN graph is accessible to all peers. @@ -24,19 +24,21 @@ Planned future network upgrades include the addition of a DHT. A [tokenized ince ### Data -Peers subscribe to the data they need and the network retrieves it from any peer (including browsers, where GUN stores data in localStorage). Running always-online peers, a "superpeer", is recommended for most applications to ensure availability of data when most browser-based peers may be offline. A superpeer is an IP addressable machine running node.js that persists data to disk. [RAD](https://gun.eco/docs/RAD), GUN's storage adaptor, saves data to disk. +Peers subscribe to the data they need and the network retrieves it from any peer (including browsers, where GUN stores data in localStorage). Running always-online peers, a "superpeer", is recommended for most applications to ensure availability of data when most browser-based peers may be offline. A superpeer is an IP addressable machine running node.js that persists data to disk. + +There is a public space, and a subset of that is the user space. In the public space are all graphs without a public key as their ID. In the user space, graphs are signed with the user's keys, and their IDs must include the user's public key. GUN uses a CRDT (Conflict-free Replicated Data Type) to merge data. Conflicts are handled by a [conflict resolution algorithm](https://gun.eco/docs/Conflict-Resolution-with-Guns) that uses lexical sort. GUN is [strongly eventually consistent](https://pages.lip6.fr/Marc.Shapiro/slides/CRDTs%20Google%20Zurich-2011-09.pdf), meaning that peers will eventually converge upon the last updated value when nodes that are offline eventually receive updates. -GUN focuses on mutability by not using an append-only log, which implements updates, insertions, and deletion as a layer on top. [Deletion](https://stackoverflow.com/questions/37758618/how-to-delete-data-in-gun-db) in GUN works by overwriting bytes with `null`, or by de-referencing portions of a graph. A content-addressed graph space is used to implement immutable, append-only data. +GUN focuses on mutability by not using an append-only log (which implements updates, insertions, and deletion as a layer on top of the immutable log). [Deletion](https://stackoverflow.com/questions/37758618/how-to-delete-data-in-gun-db) in GUN works by overwriting bytes with `null`, or by de-referencing portions of a graph. A content-addressed graph space is used to implement immutable, append-only data. ### Privacy & Access Control -Access control is built into the [User system](https://gun.eco/docs/Auth) and can be combined with [SEA](https://gun.eco/docs/SEA), GUN's encryption utilities, for more advanced use cases. +Access control is built into the [User system](https://gun.eco/docs/Auth) and can be combined with SEA, GUN's encryption utilities, for more advanced use cases. Cryptographic keypairs are assigned to roles, groups, or data points. This information is either used to derive a shared ECDH secret to decrypt (read), or to load collaborative multi-writer edits (signed). -[Iris-lib](https://github.com/irislib/iris-lib) provides an API for end-to-end encrypted chat channels and private contact list management. +[Iris-lib](https://github.com/irislib/iris-lib) is a decentralized social networking library built on GUN. It provides an API for end-to-end encrypted chat channels and private contact list management. ### Interoperablity @@ -68,7 +70,7 @@ GUN is used for p2p chat/social apps, encrypted video conferencing, realtime GPS # Iris -[Iris-lib](https://github.com/irislib/iris-lib) is a library built on Gun that allows the integration of decentralized social networking features into applications. An experimental social network application, [Iris](https://github.com/irislib/iris), was built to demonstrate its features: public messaging, [private chats](<(https://iris.to/), web of trust, and contacts management. Iris-lib uses [Gun](../proocols/gun.md) for networking and data storage, and [IPFS](../protocols/ipfs.md) for attachments and message backups. The team is funded by Gun, and also accepts donations. +[Iris-lib](https://github.com/irislib/iris-lib) is a library built on Gun that allows the integration of decentralized social networking features into applications. An experimental social network application, [Iris](https://github.com/irislib/iris), was built to demonstrate its features: public messaging, [private chats](<(https://iris.to/), web of trust, and contact management. Iris-lib uses [Gun](../proocols/gun.md) for networking and data storage, and [IPFS](../protocols/ipfs.md) for attachments and message backups. The team is funded by Gun, and also accepts donations. Iris uses WoT (Web-of-Trust) attestations to link human readable names to key-pair and other identity attributes. Users only see messages in their WoT, from users who have been upvoted by someone in a chain from someone they upvoted. Downvotes are also possible. [Reputation](https://medium.com/@mmalmi/learning-to-trust-strangers-167b652a654f) is not represented by a static score, but by how a user's personal web of trust regards them. A percentage threshold of confidence in a person's identity is calculated by the number of attestations relative to the size of the network. @@ -77,4 +79,4 @@ For interoperability, Iris allows [importing content from other sources](https:/ ### Links - [Site](gun.eco) -- [3box comparison of p2p DBs](https://medium.com/3box/3box-research-comparing-distributed-databases-gun-orbitdb-and-scuttlebutt-2e3b5da34ef3) +- [3box comparison of p2p DBs: GUN, OrbitDB, Scuttlebutt](https://medium.com/3box/3box-research-comparing-distributed-databases-gun-orbitdb-and-scuttlebutt-2e3b5da34ef3) diff --git a/protocols/ipfs.md b/protocols/ipfs.md index fcae3c4..8b176b1 100644 --- a/protocols/ipfs.md +++ b/protocols/ipfs.md @@ -92,7 +92,7 @@ Notable p2p applications include: - [Dtube](https://about.d.tube/), a Youtube alternative - [Everipedia](https://everipedia.org/), a wikipedia alternative [built on IPFS](https://qz.com/1151073/wikipedias-cofounder-on-how-hes-creating-a-bigger-better-rival-on-the-blockchain/) - [Audius](https://github.com/AudiusProject), a music streaming service -- Anytype, a locally hosted Notion-like writing platform +- [Anytype](https://anytype.io/), a locally hosted Notion-like writing platform Enterprise adoptions and integrations include: @@ -101,11 +101,8 @@ Enterprise adoptions and integrations include: - [Netflix](https://blog.ipfs.io/2020-02-14-improved-bitswap-for-container-distribution/) switched to IPFS for docker container distribution, improving performance 2x - [Opera](https://blog.ipfs.io/2020-03-30-ipfs-in-opera-for-android/) IPFS is supported by default in the Opera browser for Android -### Related - -- [Hypercore/DAT](hypercore.md) - ### Links - [Docs](https://docs.ipfs.io/) - [Mapping the Interplanetary Filesystem](https://arxiv.org/pdf/2002.07747.pdf) +- [Comparing IPFS and Dat](https://medium.com/decentralized-web/comparing-ipfs-and-dat-8f3891d3a603) diff --git a/protocols/ssb.md b/protocols/ssb.md index 0f51c66..6b91b89 100644 --- a/protocols/ssb.md +++ b/protocols/ssb.md @@ -102,7 +102,7 @@ Other applications include: ### Links -[Overview](https://scuttlebot.io/more/protocols/secure-scuttlebutt.html) -[Ssb concepts](https://handbook.scuttlebutt.nz/concepts/) -[Dark Crystal ssb protocol docs](https://darkcrystal.pw/ssb-protocol-docs.html) -[3box comparison of p2p DBs](https://medium.com/3box/3box-research-comparing-distributed-databases-gun-orbitdb-and-scuttlebutt-2e3b5da34ef3) +- [Overview](https://scuttlebot.io/more/protocols/secure-scuttlebutt.html) +- [Ssb concepts](https://handbook.scuttlebutt.nz/concepts/) +- [Dark Crystal ssb protocol docs](https://darkcrystal.pw/ssb-protocol-docs.html) +- [3box comparison of p2p DBs: GUN, OrbitDB, Scuttlebutt](https://medium.com/3box/3box-research-comparing-distributed-databases-gun-orbitdb-and-scuttlebutt-2e3b5da34ef3) diff --git a/topics/discovery.md b/topics/discovery.md index d70e9df..65a601d 100644 --- a/topics/discovery.md +++ b/topics/discovery.md @@ -12,6 +12,8 @@ Mastodon has [public relays](https://source.joinmastodon.org/mastodon/pub-relay) To overcome the difficulties of new users finding people to follow to get connected to the network, [Trunk](https://communitywiki.org/trunk/) is a community-built tool that helps users find and follow people by category. Users have requested a global directory for [importing friends from other networks](https://github.com/tootsuite/mastodon/issues/11886). Mastodon users used to be able to find their Twitter friends using `bridge.joinmastodon.org`, but the service was shut down after the developer lost access to API keys and was not granted another set. +Mastodon's feed is chronological, not algorithmic. + Hashtags are used to filter and discover content in ssb, Diaspora, and Mastodon. ### Matrix diff --git a/topics/identity.md b/topics/identity.md index 977dd31..1029b21 100644 --- a/topics/identity.md +++ b/topics/identity.md @@ -76,7 +76,7 @@ Reputation in decentralized networks is established using many of the same [mech - Sybils and spam - Spam, and the creation of many fake users to carry out attacks or misinformation campaigns, are problems for existing centralized social networks. These problems are also present in decentralized networks, and approaches to combat them are still evolving. Federated architectures allow server administrators to intervene and block or filter malicious accounts. However, ongoing harassment and abuse through sockpuppet accounts in Mastodon has motivated the creation of [OCapPub](https://gitlab.com/spritely/ocappub/blob/master/README.org), an object-capability based upgrade of ActivityPub. Steemit, a blockchain social network, requires new user registrations to be approved by a centralized service in order to combat the problem of fake accounts created to rig the voting system that determines monetary rewards for posts. P2p systems also struggle with spam and sockpuppets, although they have not seen a level of adoption that leads to high levels of abuse yet. Aether requires a hash computation to be performed for every event posted, raising the computational power required to mass spam the network. -- Account Loss and Recovery - Federated networks can allow server admins to help users reset lost or forgotten passwords. For example, Mastodon users can ask their server for a password reset as they would any other service. P2p networks do not generally allow users to recover lost accounts, as there is no third-party to facilitate the exchange. [Dark Crystal](https://darkcrystal.pw/), a project in the ssb ecosystem, implements social key recovery to attempt to address this problem. User keys are split into shards that can be shared with trusted friends and family, and later used to reconstruct a lost key. +- Account Loss - Federated networks can allow server admins to help users reset lost or forgotten passwords. For example, Mastodon users can ask their server for a password reset as they would any other service. P2p networks do not generally allow users to recover lost accounts, as there is no third-party to facilitate the exchange. [Dark Crystal](https://darkcrystal.pw/), a project in the ssb ecosystem, implements social key recovery to attempt to address this problem. User keys are split into shards that can be shared with trusted friends and family, and later used to reconstruct a lost key. - Impersonation - Attempts to impersonate users for fraud or defamation purposes are widespread on centralized social networks. This threat also exists in decentralized social networks, although it has not been exploited to large extent because these networks have not achieved the same scale and prominence. @@ -84,3 +84,4 @@ Reputation in decentralized networks is established using many of the same [mech - [What are Decentralized Identifiers](https://www.evernym.com/blog/what-are-decentralized-identifiers-dids/) - [Decentralizing the Social Web](https://hal.inria.fr/hal-01966561/document) +- [DIDs](https://github.com/didecentral/didecentral.github.io)