FIP-3: Links #85
Replies: 26 comments 63 replies
-
I'd love to see a viable solution to this problem! I agree that there are problems with implementing follows naively. Making follows more composable or potentially carry more utility could change these incentives. Follows as NFTs does this effectively - although the gas fees for this make it very unappealing. What could an NFT-pseudoequivalent on a hub instead of a blockchain look like? |
Beta Was this translation helpful? Give feedback.
-
I‘m not able to comprehend the DoS concern here. When someone sends regular messages and they smartly define the timestamp of the message within the tolerance window, can‘t creating casts be equally used as a DoS vector? I‘d assume that both if users spam casts or spam follows, that they‘ll get banned from sending more messages to the nodes, right? E.g. the Fid could be tainted. But what am I missing? |
Beta Was this translation helpful? Give feedback.
-
So to clarify, is this proposal effectively scrapping amps and adding follows to the protocol with a limit (I'm guessing of 10k similar to other message types)? I like it. Would even be in favor of a lower limit on the basis of any time I see an account on Twitter follows ~2k+ people, I somewhat discount the significance of their follow. I understand the problems you mentioned but I don't totally see how it's different from casts. Wouldn't it also be easier for a client not to publish casts, and the only way a user can find out is by checking other clients? The same thing can be said for private casts and client lock-in. |
Beta Was this translation helpful? Give feedback.
-
Solutions (Incentives)We outline two approaches to the incentive problems above and want to make sure we have buy-in from developers before choosing one. The solutions to technical problems will be discussed in a separate post. App developers should comment below this with a clear vote for one of the options, or an alternative proposal FollowsOne approach is to simply approximate follows on existing social networks. A new follows CRDT is added which stores 1,000 messages with last-write-wins rules and no expiration, similar to the Signer Set. Apps like Warpcast, Jam and Discove must agree to not introduce private follows and publish them correctly. The burden is on users to figure out whether their app is publishing correctly and leave for another app if it isn’t. This model has little short-term risk since users and apps are very familiar with this setup. But it poses greater long-term risk — when a single apps stops publishing some follows, others might follow suit in retaliation. AmpsAnother approach is to introduce Amps, which is like a recast of a user. Amping someone means that you endorse them and all your followers will see their messages more often. Users are more likely to notice if their amps are not published correctly since they are infrequent, public and valuable actions. A new amps CRDT is added which stores 100 messages with last-write-wins rules and a 3 month expiration, similar to the Reaction Set. Apps must teach users about Amps and if implemented correctly ensures that a small, but very important part of each user’s social graph is published. The cold start problem is partially solved since there is strong incentive for a small but valuable part of the social graph to always live on Hubs. Apps can also support private follows and algo feeds in addition to amps and there is no limitation on what they can do. This model has more short-term risk since it takes a lot longer to implement at the app level and users may not like it. However, the tradeoff is that it might address the long-term incentive problem much better and be a more durable primitive for decentralized social networks. |
Beta Was this translation helpful? Give feedback.
-
Amps gets my vote. I think follows at individual client level is better than protocol level. May even act as an incentive driver for clustering differentiation across clients in different industries. Allowing users to port following from client X to Y because X & Y share same graph schema but not with the protocol. Allowing for following to take on a different form within different consumer behaviors. Free markets sound good to me. Don't fully get how it works, yet. Overall, moving away from follows as a predominant theme is a good move for the future of consumer social. Might be a slightly blind take. |
Beta Was this translation helpful? Give feedback.
-
Adding follows to hubs is a no brainer. I think the incentives issues are overblown. Follows is a core primitive for building a social graph, and is critical for building a basic personalized feed. Without follows being in hubs, clients will be forced to implement their own ad hoc solutions, which fragments users social graphs across different clients. Follow graphs should be portable across clients. To address the concerns:
|
Beta Was this translation helpful? Give feedback.
-
Vote for amps |
Beta Was this translation helpful? Give feedback.
-
This risk doesn’t make sense to me. Applications without product market fit should only spend time implementing features that benefit their users. Perhaps amps can be reconsidered when there is a sufficient number of clients + active users to test on. Amps design leans too heavily on application incentives. User behavior of the proposed 3-month ephemeral boost is largely unknown. I think amps should be A/B tested on Warpcast first before being considered for implementation as a protocol primitive. Observing actual user behavior > hypothesizing in theory. |
Beta Was this translation helpful? Give feedback.
-
My vote is for integrating follows at the protocol layer. If we want to make good on the promise of enabling devs to build on top of a growing userbase, then it's more benificial for a new app to take advantage of the existing follower social graph. Amps do sound interesting but if I gained a following of 2000+ users on Warpcast, I may be less motivated to join any other client where ill have to start with only 100 of those followers. I am worried about the tombstone pollution and I fear that users will be confused by it. This is less of an issue if the avg user never gets close to the max number of follow slots allowed. Users would need to be educated on how follows and unfollows count against the total number of slots available. Im unclear about one thing: if a dev is building a new app and wanted to build a unique follower social graph, could they still do this in a centralized way and simply ignore the decentralized follows that will be provided by hubs? |
Beta Was this translation helpful? Give feedback.
-
I vote for follows
|
Beta Was this translation helpful? Give feedback.
-
Another vote for follows!
Those are my thoughts, but also just want to say how neat and fun it is to be able to think about this and participate in the discussion. Love you all! 💜 |
Beta Was this translation helpful? Give feedback.
-
I just don't think follows make sense outside of a single theme (such as Warpcast or, more broadly, Ethereum). I care more about distribution than individual followers, especially after several years. Amps, despite the cartoonish name, seem like a better way to reach a wider audience and achieve more distribution. On my old Twitter account, I had around 2,000 or 3,000 followers, but only about 100 of them were meaningfully related to Ethereum or crypto, which is my main reason for using social media these days. Moreover, it seems like you're suggesting that following would be capped. In my opinion, that's even worse. The only argument supporting this, from a consumer perspective, is the follower-to-following ratio, but that's subjective and would make gaining followers even more difficult, potentially creating an unfair advantage worse than the auto-follow-50 feature. |
Beta Was this translation helpful? Give feedback.
-
I'm more inclined to lean towards follows here instead of Amps Amps feel very limiting in a way, and like trying to reinvent the social wheel whereas thus far I have seen Farcaster as a better wheel. It does everything a social system should allow you to do, just better, with decentralization and portability. If anything, Amps sound like more of a client-side optimization in terms of the feed and algorithm vs something the protocol should be incentivizing (vs a follow list that apps can simply pull a chron feed based off of) As stated there has to be a follow cap obviously because of network limitations and attacks, I have a couple of thoughts on this:
It just makes me worried about limiting a users functionality on a protocol level, at scale. Feels like it'll push people away when they learn the tech behind their favorite social app is actually limiting their experience, especially if something like AT Protocol comes along and says "oh we'll allow you to follow up to 20,000 people" |
Beta Was this translation helpful? Give feedback.
-
Hi, I've written a ton of notes on this but I'm not prepared to publish them all yet as I want to offer clear well-thought through proposals rather than just fast opinions/reactions. I do think there are potentially better options/alternatives than the 2 proposed, but I'm not in a position to share them quite yet and I don't feel great about being rushed to have a vote by end of week on this. (It feels like 90+ days of "it's definitely not follows" followed by 1 week of, "everyone vote on follows ASAP!") What I can share now is probably more helpful for the debate: what we plan to do at Jam, regardless of the decision around Follows / Amps -- so core team can factor that into their thinking. We do not plan to have Follows on Jam. We plan to have a For You feed which presents casts and content users might like based on all of the signals we are able to get about their preferences on Jam, on Farcaster apps/clients, and elsewhere on-chain and off-chain. We plan to give users full control over their For You and enable them to create custom feeds as well. We will introduce other ways to interact with and consume content beyond twitter-like feeds from follows. And we will make attempts to be interoperable with other apps and networks; the ethereum ecosystem does not stop at Farcaster's hubs. I'm putting all this out there because i think it's important for core devs and the ecosystem to understand how one of the top FC clients/apps thinks about this. On the Follow/Amps debate: I do think there are opportunities for Farcaster to introduce new web3 primitives for social engagement that go beyond web2 follows, and that if we do pursue a new web3 social model it can help us move past the twitter-clone state of farcaster today and help unleash new apps and models. That said, it's also is very hard for new apps to solve the cold start and keep up with Warpcast without starting with some sort of follows. So i understand both sides of the debate. If i was absolutely forced to vote today, i'd prob vote against follows, but in favor of a different type of Amp that enables us to solve the cold start with on-chain capturing of user's interests across all the farcaster apps/clients. Both from engagements with other users and with the engagements with objects in the newest version of the protocol. I worry about statements like this one: "Apps like Warpcast, Jam and Discove must agree to not introduce private follows" -- is our "For You" private following? I don't think so -- would be important to clear up now though if FC is going to issue such an edict to FC apps. Last point for now. For a long while i was very frustrated by the idea of Warpcast having follows when its not in the protocol, as it gives WC a huge advantage on other apps as the "home app" and especially as the onboarding app for everyone until the end of the year. But then I was like, whatevs it, it'll just motivate us to try to build something different, which is probably better for everyone anyways. |
Beta Was this translation helpful? Give feedback.
-
Two thoughts 1In addition to @davidfurlong’s great point about follower-based experiences, here are two more incentives for apps to publish all follows:
2On the other hand, by having a 1000 follower limit, you are all but ensuring that apps will implement private follows. As an app dev, I’m not going to force my users to understand why they can only follow so many accounts. No other service works that way, and it’s not what users want. Instead I’m just gonna work around it somehow, most likely by hiding the limit from users and doing private follows or by not doing follows at all. Edit: after reading more comments, id update point 2 to say that this may not be a big deal since it won’t affect most ppl (and the cap can be raised too). I still think it’s a real effect in principle. |
Beta Was this translation helpful? Give feedback.
-
If one could pack all follows in a bloom filter, e.g. 2^16 bits is just 8 kilobytes but 65k follows, and I think it can be made quite efficient where we try to map FID space into it (only 10k or so rn). Seems premature to decide for or against follows with a vote as I‘m sure we can come up with an appropriate solution for eg node-based follows with enough consideration being put into it. Design space is still quite underexplored. |
Beta Was this translation helpful? Give feedback.
-
If I had to choose, I'd pick follow. However, I'd suggest:
Ultimately, users have the biggest incentives to push clients to be honest because they don't want to be locked in - so we just need to leverage free market while brining transparency into what clients are really doing. |
Beta Was this translation helpful? Give feedback.
-
On testing Amps on Warpcast,
~3000 MAU is not a great sample size but it's better than what we have here |
Beta Was this translation helpful? Give feedback.
-
Below is a theoretical discussion about a different option. It’s not yet at the technical proposal level. I'd love to see a group of us spend some cycles thinking this through together. – Rather than rush into a decision on Follows, I propose we take a step back and think more holistically about how to create a system that enables a wide range of social applications to flourish, supporting all sorts of models that clients can choose to implement, including Follows and alternative social models, as desired. What I propose is a framework that: Introducing: Caster Scores Devs should be able to propose variables that get added to Caster Scores. FIP-1 Canonical URIs #72 provides a good precedent. Similar to how devs can propose new URIs that get added to “a finite and mutually agreed upon set of URIs” (that will will result in maximal cross compatibility across different clients. Each client can deterministically know if it can render all valid content produced by other applications) – I recommend that devs can propose new CSV’s (Cast Score Variables) that can be accepted into the protocol. Here are just some example of CSV’s that could be added by clients and made available to other clients through the protocol:
Devs can propose new CSVs that are considered and approved or rejected via technical governance or some sort of DAO voting. Approved CSVs are made available for all devs to submit and read from. Clients submit CSVs by posting messages to the protocol. The protocol enables clients to read all of the CS scores of all users (e.g. Alice liked content by Bob 973 times across 15 different clients) Clients are able to decide on their own how they want to make use of CSVs and implement whatever front end models they desire with them. Users are able to access their CSVs and delete or expire records as desired. At some point users could even control which apps get access to their CSVs. Other considerations over time:
|
Beta Was this translation helpful? Give feedback.
-
I would prefer to see follows enshrined in the protocol before amps. Follows are inherently different from casts and there needs to be a data structure for hubs to represent them. If I understand Amps correctly, they could be implemented within casts. Casts last 1 year. Amps last 3 months. If an app casts "@pal amps @v", then that app (and other apps) could search for messages with amp metadata and change the behavior of the feed based on those amps. This would allow apps to experiment with amps right now, without requiring a protocol change. The same is not true of follows. I don't want my follows to expire after 1 year |
Beta Was this translation helpful? Give feedback.
-
Myself and Paragraph vote for follows. Private social graphs would reduce the usefulness of features like this greatly. We could rely on heuristics (likes, etc), but not ideal & not consistent x-product. I've always thought fully portable social graphs were one of the biggest value props of decentralized social and I don't think amps are an equivalent model. |
Beta Was this translation helpful? Give feedback.
-
Hi @varunsrin circling back on the Follows topic for tomorrow. At Jam we planned for there not being follows. So we designed our "For You" features in a way that it could launch already and continue improving, and then get even better when Amps are introduced. Wrt to adding Follows to the protocol. I'm not against it. If it helps developers onboard faster and build better FC apps and helps us grow the ecosystem and community, i'm all for it! Just a few last notes/ caveats from my side before the meeting:
For some apps it also may make more sense for it to be "Connect" not follow, more like LinkedIn/Facebook than Twiter/IG. We should be open to that. Maybe it involves a token so connection has some cost, tbd.
|
Beta Was this translation helpful? Give feedback.
-
I think we might be going down the wrong path with this entire discussion, unfortunately. It seems like implementing something so specific like "follows" or "amps" at the protocol level is not best for Farcaster long-term. I really like @michaelhly 's overview of how Farcaster could become a flexible, interoperable protocol with the goal to "facilitate an ecosystem of diverse applications". @varunsrin gave a brilliant overview of a similar vision in response. This is what Farcaster needs to become. It will enable so much more potential and allow the core team to focus on more fundamental problems than "follows vs. amps". The apps can create their own "modules" with specific event / interaction metadata and let other apps decide what they want to use. It's similar to deployed contracts on Ethereum allowing other contracts to read or write according to its internal rules, and if a protocol doesn't like those rules, they can go deploy their own version of the contract. Perhaps hubs can even choose which "modules" to store and propagate. Farcaster has the potential to be so much more than a single type of application, and as Saypien recently pointed out:
|
Beta Was this translation helpful? Give feedback.
-
Some data on follows on Warpcast today, for discussion tomorrow:
Another way to look at is % of users with > x follows:
|
Beta Was this translation helpful? Give feedback.
-
I wanted to follow up with one thing that literally kept me up thinking last night. Part of the "promise" of web3 is more user control over their data. In web 2.0 when Facebook, Twitter, etc. first started making their social graphs available via APIs, it was initially possible to get all of a user's social graph without them ever joining your app. This helped early apps grow rapidly because they could kickstart networks easier, but then FB, TW, and the like reigned that in to be more user friendly, and made it such that you can only get the follows of someone when they join your app (give your app permission), and not before. You could construct the social graph one person at a time, but not just read the entire graph publicly. With blockchain, if we put all of the social graph on-chain, it's all public. I am wondering if we should at least stop and think about ways for:
Not stating a firm position on my side yet., but wanted to make sure we're at least considering these matters. I think it's at least worth a stop and think on the topics above. |
Beta Was this translation helpful? Give feedback.
-
Understand that we need to get the |
Beta Was this translation helpful? Give feedback.
-
FIP: Links
Title: Links
Type: Implementation FIP
Author: Varun Srinivasan (gh: @varunsrin , fc: @v), Cassandra Heart (gh: @CassOnMars , fc: @cassie)
Abstract
A proposal to add Links, a new message type that expresses relationships between users.
Problem
Users of social networks have explicit relationships with other users (e.g. following, subscribing) which is used to generate feeds or make recommendations. Such relationships cannot be stored on Hubs today which makes switching applications difficult for users.
Specification
We propose a new Message type called a Link, which is a long-lived, directed, typed relationship between two users (e.g. Alice follows Bob). Links can express different types of relationships and be upgraded to express relationships between users and non-user objects.
Links are similar to Reactions, except that they never expire due to a time based limit. They require active management from applications to ensure a good user experience when limits are reached (see Appendix A and Appendix B). Each user can store 2500 links, which was chosen after analysis of existing behaviors (see Appendix C). A Link message is at most 164 bytes, which will add a total of 382 GB / million users at most.
Message Data
Add a new
LinkBody
type to MessageData at the empty position 8.message MessageData { .... oneof body { ... LinkBody link_body = 8; .... } }
Message Type
Add
LINK_ADD
andLINK_REMOVE
types at the empty positions 5 and 6.Link CRDT
Add a Link CRDT which validates and accepts LinkAdd and LinkRemove messages. The CRDT also ensures that the message
m
passes these validations:m.signer
must be a valid Signer in the add-set of the Signer CRDT formessage.fid
A conflict occurs if two messages have the same values for
m.data.fid
,m.data.body.target
andm.data.body.type
. Conflicts are resolved with the following rules:m.data.timestamp
is distinct, discard the message with the lower timestamp.m.data.timestamp
is identical andm.data.type
is distinct, discard the LinkAdd message.m.data.timestamp
andm.data.type
are identical, discard the message with the lowest lexicographical order.The Link CRDT has a per-user size limit of 2,500.
Link Message
A Link is a relationship between two users which can be one of several types. Links are added with a
LinkAdd
message and removed with aLinkRemove
message which shares a common body structure.A Link message
m
must pass these validations and the validations for LinkAdd or LinkRemove:m.signature_scheme
must beSIGNATURE_SCHEME_ED25519
.m.data.body
must beLinkBody
.m.data.body.type
must be ≤ 8 bytes.m.data.body.target
must be a known fid.m.data.body.displayTimestamp
must be ≤m.data.timestamp
A LinkAdd message
m
is valid only if it passes these validations:m.data.type
must beMESSAGE_TYPE_LINK_ADD
A LinkRemove in a message
m
is valid only if it passes these validations:m.data.type
must beMESSAGE_TYPE_LINK_REMOVE
Link APIs
Hubs must also provide the following APIs to fetch Link Messages:
Rationale
Why are applications incentivized to publish the follow graphs of their users?
Farcaster cannot enforce publishing of data, but apps are strongly incentivized to publish casts (or users won't get engagement and churn) and weakly incentivized to publish reactions (or users will eventually notice and be annoyed). Publishing follows and other links can be incentivized if users and apps reward others who maintain follow relationships (e.g. airdrops for long term followers). There is some probability that such incentives are too weak to enforce publishing links and we may need to roll back this change.
Why not just extend reactions with a new 'Follow' type and fid target?
Reaction CRDT's expire messages to optimize for storage of a greater number of recent messages, since those are more valuable. The same is not true of Links, where older messages might be more valuable than newer messages and time-based expiry is a bad user experience.
Why is there a string type instead of an enum type like in Reactions?
A string type allows a greater deal of flexibility without requiring protocol changes, at the expense of being slightly larger in size and adding more complexity for apps to interpret and render them. If this works well, it might be worth upgrading reactions to have string types instead of enum types.
Release
Links will be included in the
2023.5.31
protocol release. Adding Links is not backwards compatible since it may cause Hubs to believe they are out of sync. Hubs must not accept Link messages or respond to Link RPC queries until2023.6.14
or1686700800000
in unix epoch, when older versions of the Hub are shut down.Appendix A: Compaction
Message Graph CRDTs impose a per-user limit on the number of messages, and both add and remove messages are counted in the limit. A user who follows 2,500 people and then unfollows 500 people still takes up 2,500 slots because they have 2000 add and 500 remove messages. When the 2501-th message is received, the oldest message is kicked out which is usually a follow, resulting in 2000 add and 500 remove messages.
Applications can improve this UX by re-signing and re-ordering the add messages by giving them a greater timestamp than follows. When the 2501-th message is received, it replaces a remove message, resulting in 2001 adds and 499 removes. This allows users to take advantage of the maximum size allowed by CRDTs. Since timestamps become unreliable, links have an optional display timestamp property that can be set by users to indicate the “real” time of the action.
Apps should pick a full-ness limit (80%) and a compaction threshold (e.g. 1%). If a user adds a message using the application which uses up more than 80% of the CRDT’s limit and more than 1% of the messages are taken up by remove messages, a compaction is triggered. Apps should not trigger compaction constantly or in the background since this can result in network thrash, which may trigger hubs to rate limit the user.
Appendix B: Curation
When users approach their CRDT limit and there is no more room for compaction, some links must be removed to make space for new ones. Apps can make curation suggestions to users to remove unnecessary follows based on interaction or usage patterns.
Since CRDT’s are eventually consistent it may be possible the application is not aware of all the links yet. A user may have 2,495 links on one Hub and 2,500 on another which are in the process of syncing. Apps should therefore recommend curation well before this limit to prevent the oldest link from unintentionally being pruned. As a safety measure, apps can keep track of pruned LinkAdd messages and prompt the user to see if they intended to clear out the links. If not, the user can choose to remove some other Link and regenerate the pruned Link.
Appendix C: Follow Graph Analysis
The following data is taken from Warpcast, which implements a centralized form of follow relationships between users. Warpcast has ~ 12,000 registered users.
Number of follows created by users who were active within the last 90 days:
95th percentile: 307
99th percentile: 1898
Percentage of users active in the last 90 days with > x follows:
1000: 1.63% of users
2000: 0.96% of users
3000: 0.71% of users
4000: 0.61% of users
5000: 0.53% of users
Beta Was this translation helpful? Give feedback.
All reactions