Mechanisms for private "block" relationships between Bluesky accounts #1131
Replies: 5 comments 7 replies
-
Bloom FiltersOne technical mechanism to keep blocks public, but make them less trivially "enumerable", would be to store them in Bloom Filters. These are a probabilistic data structure which makes it possible to check if an object is in a set, without having to store or transmit the entire set of objects. In the case of blocks, the pair of DIDs for each block relationship would be put in a bloom filter, and downstream services (eg, AppViews) would be able to check if a block relationship exists when needed. There are a couple different ways bloom filters could be distributed. Each repo could have a single bloom filter with all blocks in it, and that gets distributed with the rest of repo content. Or an account's PDS could aggregate blocks for all local accounts privately and distribute a combined bloom filter. Or a small number of trusted 3rd parties could directly receive "private" block info from many PDSs, and publish a combined bloom filter. We considered a series of designs like this, but there were two main problems we saw:
Maybe the friction of needing to figure out a bloom filter is sufficient! Blocks overall are mostly about "fiction" anyways (people can screenshot, sub-tweet, just log out, etc, to bypass). But the advantage isn't very certain, and the downsides are certain. |
Beta Was this translation helpful? Give feedback.
-
Label-based block enforcementInstead of trying to consistently prevent all block-violating interactions across the network, it might be easier to scan for such violations and label them right after the fact. This would look like a central labeling service which receives the full network firehose, and is also a trusted party that all PDS instances are willing to forward private block metadata to. The labeler would keep a database of allowed/disallowed relationships, and would label replies and quote-posts that violate those rules. Then everybody in the network would be expected to subscribe to this labeling authority and respect the labels, which would result in the content being filtered out consistently. An added detail would be the need for PDS-to-PDS communication to notify the blockee and their PDS of the expected behaviors. This would usually not result in a notification, and in the ideal case the blockee's PDS would handle all of the mutual-mute and interaction block behaviors, it would only be in cases of bad actor PDSs that violating interactions would even exist. This proposal would not handle retroactive blocking. That is, third parties would still be able to see (unlabeled/unfiltered) historical replies and other interactions between the two blocking accounts. |
Beta Was this translation helpful? Give feedback.
-
Interaction GatingIn this proposal, authority for many forms of interaction rests in the relevant account's PDS. It introduces a huge amount of PDS-to-PDS or AppView-to-PDS communication, moving a step closer to the ActivityPub model. The basic idea is that post threads and quote posts would be the responsibility of the original post account's PDS. To render a post thread, all actors in the network would connect to that PDS to get a "thread skeleton" (base AT-URI identifiers), then hydrate in contents from a regular AppView for display. Block information would not need to leave that PDS, which already has a trust relationship with the blocking account. |
Beta Was this translation helpful? Give feedback.
-
Zero-Knowledge ProofsThere may be clever cryptographic tools that could be used to transmit the existence of a block action without having all blocks be enumerable. We asked our technical advisors, who have specific experience in this field, and they felt that there was not likely an off-the-shelf solution that we could realistically deploy in Summer 2023 without significant additional research and security review. There are almost certainly interesting novel approaches to federated blocking coming from this area of research. See also: SNARKBlock: Federated Anonymous Blocklisting from Hidden Common Input Aggregate Proofs, from 2022, by Michael Rosenberg, Mary Maller, and Ian Miers. |
Beta Was this translation helpful? Give feedback.
-
Trusted AppViewsOne proposal would be for accounts to privately register their blocks with their PDS, and then have PDSs forward block metadata to a small number of "blessed" AppViews. The AppViews can help enforce both the mutual-mute behaviors and interaction display behaviors, because they already handle thread and feed hydration, and would have full knowledge of the block graph. The biggest issue of this approach is figuring out the trust relationship and authority of AppViews. What would a new AppView need to do to receive all private blocks? How would they know when they had all the relevant block graph context such that they could start servicing requests without violating expectations? These are easy questions with public blocks, very hard with private blocks. The incentives are also mixed: it is important for AppViews to enforce block behaviors, but it is also difficult for them to do so. AppView developers and service providers might decide that blocks just aren't worth the hassle and display content with only partial or even zero block metadata. |
Beta Was this translation helpful? Give feedback.
-
In late April (#922), we rolled out "blocks" in Bluesky, as a mechanism for individual accounts to control interactions.
NOTE: we will likely post more context about the decision to roll out public blocks, and will update with a link here if we do
In planning out how blocks would work in a federated system, we knew that there was a tension between making the actions public enough that all the services in the network could act upon them, but also the potential for harassment and call-outs if blocks were entirely public and enumerable. In the end we could not come up with a design for meaningfully "private" blocks while still having the block behaviors enforced consistently, so we went ahead with storing blocks as public records in atproto repositories, very similar to other graph records like "follow".
To re-iterate, the core block behaviors are:
The purpose of this discussion is to describe some of the ideas we've had for non-public blocks, and to solicit ideas from the community.
Beta Was this translation helpful? Give feedback.
All reactions