FIP: Block Links #263
Replies: 3 comments 7 replies
-
|
This is a really well thought-out proposal! Your discussion of storage is thorough but there is one implementation detail that needs to be handled. Given how much more undesirable it would be for a block link to be pruned compared to a follow link to be pruned when storage limits are reached, I think we need to find a way to minimize the risk of pruning blocks due to follow activity. We could either just not prune blocks, since they are a generally low volume message (and the blocks table is quite small, still) but if we want to think defensively, it makes sense to configure rate limits for blocks somehow, maybe based on total links a user has. The alternative is configuring an entirely separate storage type and rate limit calculation for blocks, which is unfavorable in my opinion. |
Beta Was this translation helpful? Give feedback.
-
|
Supportive of this proposal — standardizing On the storage/pruning concern (@topocount): The core concern is valid: blocks being pruned due to follow-link churn would be a bad user experience. @christopherwxyz's suggestion to date blocks at That said, if block volume really is much lower than 1/s in practice (as the data shows), the pruning risk may be overstated. The bigger concern is probably adversarial: a user who wants to erase someone's blocks could spam follow-adds to force pruning. A simple rate limit specifically for block-type link operations (separate from general link rate limits) could close that vector without needing a fully separate store. On the privacy note: The FIP correctly calls out that block links are public protocol metadata and expose the block graph. For mini-apps that want to offer softer moderation tools (mutes, content filters), this distinction matters — a public block is a strong social signal, while a local mute is private preference. Both are useful. Worth making sure SDK docs distinguish these clearly so developers pick the right primitive. On the API side: The expectation that Overall this is a clean, minimal FIP that delivers real value without protocol complexity. Ready for finalization in my view. |
Beta Was this translation helpful? Give feedback.
-
|
I don't think this should be finalized as written. The FIP gets the implementation path right, but I think it picks the wrong social primitive to make canonical. A follow is normally meant to be public. A block is often a boundary, a safety action, or a private preference. Turning it into durable public protocol metadata creates a negative social graph that every hub, indexer, ranking system, client, and third-party app can query forever. That is bad for decentralization in a few ways:
The privacy section says apps needing private moderation can keep local/private controls such as mutes. I think that split makes the proposal weaker, not stronger. Users will now have two concepts that look similar in UX but have radically different privacy properties: a portable public block and a private non-portable mute. Most users will not understand that distinction at the moment they are trying to protect themselves. Storage is also more serious than the FIP makes it sound. If blocks share normal Link quota and pruning semantics, then safety state can be affected by unrelated follow churn or adversarial link behavior. If blocks need special pruning, special rate limits, or a separate storage class to be safe, that is a sign they are not just another ordinary Link type. I think the safer direction is:
The minimal-protocol-surface argument is attractive, but this is one of those cases where minimal implementation surface creates a much larger social surface. Public follows are part of the social graph. Public blocks are a safety graph. I don't think Farcaster should casually make that graph canonical. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Abstract
This FIP standardizes
blockas a canonical Farcaster Link type, so user block intent is portable across clients.A block uses existing Link messages:
MESSAGE_TYPE_LINK_ADDwithlinkBody.type = "block"to blockMESSAGE_TYPE_LINK_REMOVEwithlinkBody.type = "block"to unblockNo protobuf or message-type additions are required.
Problem
Blocking is a core moderation primitive.
Block state is frequently app-local today, which leads to inconsistent cross-client behavior and weak portability of user moderation preferences.
Farcaster already supports typed Links. Standardizing
type="block"enables interoperable, chain-derived block state without introducing new protocol primitives.Specification
1) Canonical Link Type
blockis a canonicalLinkBody.typevalue.LinkAdd(type="block", target_fid=B)means A blocks BLinkRemove(type="block", target_fid=B)means A unblocks B"block"satisfies existing Link constraints (type <= 8 bytes).2) Existing Link Validation and CRDT Rules Apply
blocklinks MUST follow existing Link rules, including:No new CRDT is introduced.
3) State Semantics
For key
(fid=A, link_type="block", target_fid=B):trueiff highest-order message isLINK_ADDfalseiff highest-order message isLINK_REMOVEor absentBlocks are unilateral; this FIP does not define mutual block semantics.
4) API Expectations
Nodes and SDKs SHOULD accept
link_type=blockin existing Link APIs (HTTP and gRPC), including:Older implementations may reject until upgraded.
5) Link Compact State Compatibility
blockMUST be handled as a standard Link type in compact-state paths (including Link compact-state messages) with no special-case merge logic.6) Implementation Guidance (Non-Consensus)
Clients and apps MAY reject self-block (
fid == target_fid) for UX consistency. This is non-consensus guidance.Storage Impact
blockconsumes existing Link quota under the network's active storage configuration.This FIP does not hardcode quota numbers because storage economics can vary across cohorts/config eras.
Directional expectation: block links are generally lower-volume than follow links for most users (high-friction moderation action vs high-frequency social action). This is not a protocol invariant and should be validated with telemetry.
Add/remove churn can consume more Link capacity than active block count alone suggests.
Rationale
Backward Compatibility
follow-onlySecurity and Privacy Considerations
Rollout
blocksupport in link-type handling, validation paths, and Link API filters.type="block"link_type=blockquery behaviorblocklink_type=block.Beta Was this translation helpful? Give feedback.
All reactions