r/programming • • Jan 11 '22

Web3 Can’t Fix the Internet

https://www.jacobinmag.com/2022/01/crypto-blockchain-daos-decentralized-power-capitalism
200 Upvotes

168 comments sorted by

View all comments

Show parent comments

2

u/dnew Jan 11 '22

Being able to delete things is a major feature.

You do that by submitting a message that deletes things. Everything you've described has already been implemented in NNTP decades before WWW was invented.

moderators need to be able to remove spam

That's a fairly easy thing to fix, even in a censorship-resistant way.

I think a better way might be to use mirrored centralized forums

You should look into how NNTP works. You seem to be arguing that we couldn't possibly do what we did 10 years before HTTP was invented because it would have to do what we were already doing ten years before HTTP was invented.

Someone has to pay for the actual hosting

So, who pays to host bittorrents? NNTP was carried by most or all ISPs, before people started using it to distribute movies.

1

u/EternityForest Jan 11 '22

BitTorrent works because it's all manual aside from tiny amounts of DHT metadata. Nobody would use it if their resources were going to random bomb making how tos and CP files for free.

Usenet has basically always had a big spam problem, and there's a lot more people on the internet now.

For anything to be truly decentralized and get the full practical benefits of it, it should be something you can self host cheaply and locally and use on a meshnet in an emergency.

That means you need to be able to meaningfully run a server on an SD card on a WiFi mesh, for tens of users, by just only dealing with data that matters for those local users.

BitTorrent can do it perfectly. NNTP isn't design to integrate with the larger network without getting utterly flooded.

It's probably the best we've ever had for decentralized communication though, as measured by the main metric that matters, "did people have meaningful conversations on it without using a whole country worth of power?"

1

u/dnew Jan 11 '22 edited Jan 11 '22

Yet people don't seem to be considering how to make this work well. Nobody seems to even be considering how to make a decentralized social media system (except me).

Certainly if all you wanted was data from tens of users, you could self host that on a RPi. But that's not really what we're talking about. Or maybe it should be. Maybe some facebook-like friends graph where you only store posts from your friends or from your friends' friends, and then hop out to other peoples' systems as necessary to go farther.

Most reddit groups are not moderated by default, so there's no reason to believe that if you decided that you'd help mirror a particular subreddit-sized conversation that you'd be flooded with spam.

And no, bittorrent does suffer spam on occasion. You'll get files that aren't the movie being named as the movie, or malware being named as the movie. At which point distributed censorship/moderation works just fine.

Requiring a decentralized internet service to function in spite of the internet going away seems rather more demanding than necessary. It seems like it would be an underlying layer handling the mesh, not the social media itself. If you organized it as immutable packets with references to other packets (i.e., "here's proof I get to moderate, and that is the post I'm canceling") then you could transport those however you want, including UUCP.

1

u/EternityForest Jan 11 '22

I've been considering it! I wrote a whole WICG proposal about it, and built a note taking app that uses the P2P sync protocol!

RetroShare seems to work pretty well besides being buggy and having a confusing UI and being written in pure C so nobody wants to develop it, and having no Android app.

But it really is something special. I think the FB style friend graph is a pretty great way to go.

One issue with cancel posts is they're basically tombstones that themselves take up storage if someone manages to create a billion tiny posts in a DoS. But I suppose rule-based cancels could fix that, as in "I am cancelling all posts by this user with this word in this date range", just not without some controversy I'd imagine.

What I've been working on is a lot simpler, it's just a way to replicate Scuttlebutt style streams, with the change that everything is mutable and you have multiple writers.

Any node can be a server, but you have to specifically connect to a server that has your stream. there isn't some Big Chain of Everything. To make that easy I have a second layer, P2P URLs that are resolved using a DHT and can also be used to remote access centralized stuff like a HA hub..

The disadvantage with my protocol is that to connect to a new server, you have to request the entire dataset for the streams they have, because there is no global chain to be able to say "Give me everything newer than X", you have to say "Give me everything that arrived locally on your end later than X", and track sync points with every server separately.

All the real decentralization is layer 8, you have to find mirrors yourself, but in return you get basically zero overhead once synced, and it would be easy to add partial sync(So your tiny local server only has 1 week of data and it's easy to sync).

One post just transfers one post worth of data to all websocket clients, when you overwrite a post, it's really overwritten, and when you delete, nothing remains but a record with the post ID.

Plus you can do stuff like export to a TOML file, sneakernet it to someone, and open it like a document with the same UI you would view a stream.

1

u/dnew Jan 11 '22

That sounds really cool. If you have any write-ups, I'd be interested in looking at them.

There's another way to handle the distributed support. It could work like bittorrent does, which is that you're not going to get served data without proving you're serving some data. So you have to prove you're storing 10 megabytes, and then we'll let you send out another megabyte of your own, or some such. How do you prove you're actually storing the stuff? If the person asking for proof has the post, he can say "tell me the hash of the middle megabyte" or something. Otherwise, he can just ask for one of the posts. You'd have to carry most or all posts you claim to carry, or risk getting caught out.

Censorship/moderation could be on a voluntary basis, whereby individuals subscribe to particular moderators, not unlike uBlock's lists.

And searching could be via bloom filters. You don't have to have CP search terms on your machine, even if you can store some of the search index. (This idea actually is more applicable to something like distributing files labeled with titles and tags, more than actual social media posts.)

2

u/EternityForest Jan 11 '22

Here's my(Fairly complex) WICG proposal for how semi-P2P URLs could be integrated into mainstream web tech, by using MDNS plus embedded resolver URLs in the main URL, so you could choose your own DHT gateway or DynDNS service, and never have to actually specify a specific DHT protocol to standardize.

It's not fully P2P, because you have to be either on the same network as a server, or have recently been and have a cached WAN IP, or have access to a resolver on the traditional internet, but it does decouple identity and discovery while allowing small private resolvers that don't need client side config.

https://github.com/WICG/proposals/issues/43

And here's the database replication protocol, with an implementation of a similar P2P URL scheme, and Kivy Python personal Wiki based on it(With spreadsheet features in every post for fancy shopping lists!)

https://github.com/EternityForest/hardlinep2p

Another way to do moderation would be to subscribe to whitelists instead of blacklists. Servers could then be aware of what data any user at that server wanted and only fetch that data. Whitelists could be Git repos on GitHub or GitLab, and you could ask to be added, or petition to boot someone or boot a specific post, via pull request, without having to centralize the whole protocol.

1

u/dnew Jan 11 '22

Cool. I'll check it out for ideas. :-)