A idea about decentralized social meadia Protocol

I like the social media, it helps me making friends and getting knowledge. However, the social media also has their problems like violating users’ privacy and censorship and I think IPFS is a good solution. We already saw a lot of social media platform bases on IPFS and they are all pretty cool, but should we create a new platform? Or we should can a new protocol.

Before we begin to try to create this protocol, we should take look the existed social platform again and figure out What are key elements of those websites. In my opinion, these websites are made with Post and each Post has Content and Operation. It looks abstract, So let’s see some examples.



In Twitter example, the Content is text and pictures and the Operation is comments, retwitt and like (We ignore the share, because it’s local operation). Of course, this model is not perfect suiting any social media platform, but it’s good enough for me.

If you are familiar with ADT(Abstract Data Type), It’s pretty like it. The Post is Type, Content is Value and Operation is just Operation.

Now, We have this Model and new question is how to give the feedback to Poster? That’s actually simple, we just need give a pubsub channel to each Post (Of course, we can share a same channel for multi-post) as the way to feedback.

There is IPLD schema. (I’m new to it, so If I’m wrong, please correct me.)

type Post struct {
    version Version
    update RFC3339
    channel nullable string
    history [&Content] #Includes first.
    content &Content
    operations [Operation]
}

the history in there is for supporting the mutable post.

When we have the Post, We can create the List to contain these Posts. Like this.

type List struct {
    version Version
    subLists nullable [&List]
    posts nullable [&Post]
}

The List should also have subLists, it will help to gather information.

When we have the Post and List We can desgin a new Content and Operation. For the sake of simplicity, we will create a image based Content (like Instergram).

type Content enum {
    | ImageContent
}
type ImageContent struct {
    version Version
    fileType string
    image Link
}

fileType represents image type like png and image represents the CID of a image. Then, we can create a new Operation, this Operation call like

type Operation enum {
    | LikeOperation
}
type LikeOperation struct {
    version Version
    value int
    feedback LikeFeedBack
}
type LikeFeedBack struct {
    like GenericLikeFeedBack
    revokeLike GenericLikeFeedBack
}
type GenericLikeFeedBack struct {
    type LikeFeedBackType
    content &Content
}
type LikeFeedBackType enum{
    | Like
    | RevokeLike
}

Every Operation should have value and feedback fields. The vaule fields is providing the state of this operation, in our case, it’s number of like. The feedback field tells viewers how to feedback to poster. It’s should be a struct, because there may be some sub-operations like Like and RevokeLike.

When viewer see the feedback, they can follow these information and feedback to poster.

The whole protocol looks like this:

2 Likes

hello,

your approach will have the merit to be studied, do not hesitate to make a repository on github or gitlab and share it here others than me could be interested in helping you.

Regards

@josselinchevalay Thanks for replying. This is still a idea and I need to do more to verify it.
I just create a repository but there is basically empty😂

3 Likes

Good jobs ! i’ll check that !

I think ActivityPub seems to be the most popular protocol right now for open source social media. Google search “Fediverse” and Mastodon if you haven’t heard of those. I think there might be ways to integrate IPFS CIDs into the ActivityPub spec to let that be the way of referencing objects, but I haven’t done a good analysis yet on how that would work.

@wclayf I checked out activitypub before. It bases on traditional network model and hard to integrate to p2p network like IPFS, in my opinion.
And I want to create a fully distributed social network not “Fediverse”.
What’s why I don’t chose the activitypub and create a new protocol.
Anyway, I like mastodon and their idea, I just think it’s not suit for IPFS.

1 Like

Even in a fully decentralized version of a social media protocol 90% of the object types and concepts in ActivityPub could still be reused. There’s no reason to burn it all down and start over from scratch imo.

For example, if each person ran their own Mastodon instance, and we found a way to make that work with new protocol and UX enhancements, that is a viable way to build a truly decentralized network. It would be like an ActivityPub 2.0 (2.0==decentralized). Once you have the massive network effect of millions of users like the Fediverse has, it’s better to work with that rather than against it if possible.

1 Like

Yes the network effect is not to be underestimated: it’s demotivating to make posts into the void if most of your friends are absent.

What we need though is for “each person’s mastodon instance” to be unstoppable: friends should pin each others’ content. “Normal” people don’t have computers that run and stay online 24/7.

There are many definitions of this term “social network”. Some want to send short messages in real time, but even that means different things to different people (twitter, telegram, tox, xmpp, matrix and slack are all different, for example, and don’t get used in the same ways). Some want a way to broadcast their posts as widely as possible, and even for search engines to find those posts (something like instagram I guess); so then privacy doesn’t matter. Some want to go even further with that: have a blockchain and a chance to get paid for posting, as on steem. That is IMO not a social network, it’s a self-promotion machine. If you want posts to be freely accessible to everyone, wide-open plain HTML pages were OK in the 1990’s but nowadays how do you know there aren’t crawlers doing the same thing facebook is doing, profiling you and figuring out how to track you elsewhere and target you with ads and other kinds of manipulation? If you have to engage in self-promotion because of the gig economy or because you’re a celebrity or want to be one, tracking seems the likely consequence.

For me what’s more urgent is a way to replace facebook, stay in touch with actual friends and family, and feel free to post all the trivia that people post. I’ve gotten to the point that I’m afraid to post on facebook because I always think what are they going to do with it… it’s so creepy that every post helps fb know me better than I know myself. But everyone is there so I can’t stop signing in either; it’s just gotten to be a more passive and loathesome experience now.

At the opposite extreme for privacy are things like peergos and ssb: the content is encrypted and simply not accessible to non-friends at all. I kindof like that model theoretically, and I think it’s a good fit for an IPFS social network, because the set of friends who want to read your posts probably includes a subset who will pin your content and keep it online for the benefit of those who haven’t yet read it. I’m not a cypherpunk but I started to understand a few things: 1) it’s possible (but more expensive) to encrypt a message in such a way that many people can decrypt it with their own separate keys. gpg can do this. So you could write a message intended only for a specific group of friends and publish it via IPFS with no worries (right now!) about unintended recipients; but then the downside is when you add a new friend, (s)he can’t read your old posts, unless you decrypt and re-encrypt them all with that additional key, which of course changes all the CIDs for everyone else too. 2) A fundamental tenet of Web 3.0 is: there is no such thing as access control; if you want to limit availability of data to certain users, you just have to encrypt it. 3) Most asymmetric ciphers (public-key crypto) are expected to be broken by quantum computers, so are we really going to trust that Web 3.0 model? Can we pick a quantum-safe cipher then, if there is such a thing? If we don’t get past that hurdle, IPFS doesn’t seem suitable: maybe we’re better off actually limiting access too. Or, well, nothing to hide, nothing to fear… just don’t be so paranoid… that’s what most people would say.

Another thing I’ve noticed: a “free speech platform” where anyone can publish without moderation, especially if it looks anything like a broadcast medium, always comes across as having libertarian values, by its nature. And that attracts a certain kind of people: in the best case, anti-vaxxers, conspiracy theorists, everyone from the right wing; and usually it gets much seedier than that. The attraction of joining some elite subculture is stronger for such people who feel rejected elsewhere, whereas reasonable people stay on mainstream platforms where the eyeballs already are. Just try to find any good videos on d.tube, for example. I logged into mastodon a couple days ago and started to see some crap there too. As we know, the big social networks hire human moderators, who then develop mental problems from spending their days judging the badness of all the crap that people are posting. We’ve got to be able to do better than that! But how? There are plenty of people in my facebook network, actual friends and family, whose posts I mostly don’t appreciate. So it’s complicated to build the sort of social network that I’d actually want to spend time on. Algorithmic feeds: are they always bad, or only bad when they are optimized for the attention economy? I need an algorithmic feed to weed out all the crap from my friends. But an AI that figures out what each user likes to see and weeds out everything else is by definition a way of creating an echo chamber, so that you never get your opinions challenged too much. Besides, are you going to run such an AI on your own machine, if there’s no cloud to do that for you? That’s the only way for such an AI to be secure, to avoid giving away that intimate knowledge of yourself that the attention economy is trying to gather. But it’s hard to train the AI with so little data, whereas facebook has it easy to put users and posts into categories.

In my experience people are acting more authentic and civil on SSB for some reason. Not many of my friends are on it though, only a few people I met at IPFS Camp. Evangelizing these things always feels a bit creepy too, like trying to sell something to somebody, already knowing what their answer will be, and not wanting to grovel and beg. I wouldn’t recommend SSB to normal people anyway because of technical issues; first it’s not a web site; second, your identity is non-portable: you are expected to use it on a single computer. Pretty much the opposite of what we’d want with a distributed system.

If “normal” people actually had friends who were already using a new independent social network though, maybe they could be persuaded to run a monolithic tray application. So it should be possible to write a social network daemon, probably in go, that encapsulates IPFS plus the rest of the code, and can be left running all the time. If friending automatically implies pinning, it wouldn’t even matter if most of the friends are using laptops that are sleeping sometimes: most of the content would stay available most of the time. So I think that’s what we should build, and yes it should be able to integrate into the fediverse somehow for the sake of discoverability and for friending people who aren’t on this new network. It should be possible to discover it like an ordinary web site and use it via IPFS gateways for a while, without installing anything; but the experience should get so much better when running the tray application that most users will. Otherwise it won’t become viral enough.

2 Likes

ipfs://CID

ipns://Key

social://bob@channel

Brave Browser is heading in the direction of installing IPFS nodes under the noses of millions of users. It’s a few hops away to the social media extension that utilizes the pre-installed IPFS node to retrieve data and pin content.

@wclayf @ecloud
Thanks your replying and I’m appreciate your ideas.
@wclayf
I have thought ActivityPub in IPFS. The easiest way to use ActivityPub may be using PubSub to send to ActivityPub message.

@ecloud

I totally agree your viewpoint. People also have inertia and don’t what to change to a new platform and new platform will become the hotbed of extreme thinking and crime activities and attract the people who are repelled form mainstream. Yes, This is the thing we need to think more.

Yes, Brave could help as long as people are actually keeping it running a lot of the time. Then would you use js-ipfs to build the social network? So users who run non-IPFS-integrated browsers will also run full IPFS instances just for a few minutes at a time, see what they want to see, and then close the tab, thus shutting it down again? If the page has downloaded JS code to do that though, isn’t it redundant when there’s already an IPFS daemon running (the one Brave provides)? I’ve read there is supposed to be fallback of some sort, but I keep wondering whether an IPFS-using web application running in Brave really relies fully on the local daemon if it’s already running. And if users are going to pin each others’ content… where does it go then, into browser-managed local storage, or into storage managed by the daemon? Will users notice that something is wasting a lot of space and freak out?

Can we unite to a new forum?My forum has realized that anyone can visit the newest content from all over world even in network-restricted area.You only need to remember the ipns code of the website.But people in my website can not post if he is in network-restricted area.This is my forum:reforum-ipfs

If there’s an associated ENS domain, the IPNS key can be placed in the ENS record.

Anyone can visit the website using the .link TLD… which is sadly now mostly controlled via Cloudflare. Or people who have Metamask installed can configure any gateway to resolve the IPNS.

So… using ENS…

  • Install Metamask
  • Visit IPFS website via mydomain.eth/

reforum.eth seems to be available … careful of those gas fees… running a bit hot lately.

yes,ENS can be a good idea.But I don’t know the principle behind it.How do MetaMask find the address of ens domain?Is there a point of failure in MetaMask?

Metamask looks up the record in ENS, which is an ERC-721 token smart contract sitting on the Ethereum blockchain.

See the ENS FAQ for some brief answers to who controls what and how things work.

Per the FAQ, ENS is centralized via the root keys. But what can you do? If one wishes to have human readable and recognizable names translated to addresses of any sort, one is going to either need a somewhat centralized place to look those things up or wait an hour or 2 to search a global network of distributed nodes.

1 Like

didnt see your post but i too have been hacking on the idea of layering interlinked data structures of social graph info on top of ipfs. in my design however there are primarily Profile and GraphNode, with Post being one of the several operations supported within a GraphNode - other operations (will) include things like Like, Follow, Reply, Unfollow etc. A Profile is identified by its RSA public key, which becomes its PeerID in IPFS. When a profile makes a new update to their graph my creating a new signed graphnode, they also create a new signed profile entry which links to their latest graphnode, and each graphnode (also profile) links to a previous content identifier, creating a chain back to the first post.

:slight_smile:

With each post pointing to the previous post that sounds like a reverse-linked list (I won’t call it a blockchain, but you can see the similarity). I wonder if there exists somewhere a best-practices simple use case of doing a simple generic linked-list on top of IPFS. The tricky part is how to always be able to identify the “latest” link/entry in the chain. When I studied this I concluded IPNS was really required, and the deal breaker for me was the fact that IPNS updates take “minutes” to complete, so I considered it just completely impractical in any real-world use case. I hope somebody proves me wrong but that’s where I ended up.

I ended up implementing ActivityPub in my platform rather than designing an IPFS-based solution from scratch. I would love to hear one of the IPFS developers tell me I’m wrong about IPNS being slow, but I think they actually agreed it’s too slow. AFAIK IPNS can be used for some “one time” setup similar to how you might wait 24hrs for DNS to start working after you get a new domain name, but as far as expecting to get IPNS to update every time someone does a social media post would be completely unworkable. That’s a use case where even waiting over 10 seconds is too long.

EDIT: Maybe it’s just the initial IPNS publish that takes forever, and once an IPNS publish has been done then updates to it are fast? I don’t know. If it’s the case that IPNS updates are fast, and IPFS developers say so themselves, then a ‘reverse-only’ linked list might be workable.

IPNS is just slow and PubSub may be the best solution for real-time applications for now.

1 Like

my use case is to have a reverse chronological feed of posts created by profiles i follow, and i really dont mind if that list is at any given moment up to a few minutes out of date. Clients publishing updates through my server will have their latest profile tip cid cached while IPNS publishes as backround task in a goroutine, so that other servers in the world can be at least able to resolve it. Could theoretically embed info about the cache server in the profile itself so other server could then know exactly who to go ask for the freshest of fresh after it gets something slightly stale out of IPNS

Idk about best practices for a linked list but what I’m doing is embedding the previous entry cid in the new one in JSON, and signing the data structure using the RSA private key inside the browser before publishing it, and these structures all link to a profile with the pubkey so you can verify that a) the profileid matches the pubkey and b) the signatures match. All my stuff is JSON right now but one day probably go to protobuf. JSON is easy to inspect for now heh.

true IPNS is slow :wink: i do the publishes in the background and cache the current cid in the server so it can be made available more readily. I … need to check how much parallelization is possible with the publishes. i suppose there could still be a show stopper in there but so far with my limited testing i’m finding stuff to be acceptable if not slightly painful.