Post

Post deletes being complete happening soon! Thanks @jay.bsky.team! NOTE regardless of network, scraping happens and can't really be stopped. For years a bot reposted my every tweet. Please be careful. BlueSky is a playground - not a different universe - even if we rejoice in momentary reprieve.

Jay 🦋@jay.bsky.team

yep, we probably need a new user FAQ. But on this issue, the PRs to hard delete blobs and accounts are landing soon, and rebasing to hard delete posts is following. https://github.com/bluesky-social/atproto/pull/963

every user in atproto has a signed data repository, which is quite similar to a git repository. changes get written in commits and each repository maintains a history (commit log) we do that because the network is largely pull-based, and maintaining the history makes catchup sync efficient

designing the data repository is a bit of an art, because it's a merkle tree and you're balancing the size of proofs for a given record or subset of the data against the flexibility of the data it contains. @dholms.xyz is your guy on how all that works

as it turned out, the way image blobs get stored in the repository make it easy to just drop them and leave dangling references. that's why we're able to ship that quickly records, however, are harder to expunge without losing the ability to verify the proofs

daniel tells me it might be possible to change the data structure so that it's possible, but he had that kind of quiver in his voice when he said it that tells me I shouldnt expect it any time soon that means if we want to expunge the actual records, we have to do a "rebase"

a "rebase" basically means rewriting the history to remove any record of the past writes. generally speaking you want to do this every so often as a form of compaction, because otherwise every repository is going to grow unbounded. so, that's something the team designed for from the start

3 reposts76 likes

This smells like the kind of thing that will lead to something like “The Great Skeet Massacre” or “Rebaseageddon” around 2027

I suppose it’s more complicated than marking deleted entries as “dirty” and preventing aggregators from collecting those nodes or something at the protocol level

the problem with a rebase is that it interferes with replication. daniel can expand on this, but basically there are some conditions (which he calls the "happy path") where a rebase will cause no problems, and some where it'll mean having to refetch the whole repo

it also takes half a second to execute the rebase. so, for obvious reasons, we were trying to avoid doing it very often. reality is now blasting us in the face, and so more frequent rebases are on the table and the team will have to adapt. that's how this stuff goes

okay now let's talk about privacy models the data repositories are designed to be public. they're designed to be easy to cache and easy to aggregate. large scale was a design requirement from the get-go -- we want this network to be able to do what traditional services can

we did not, however, fall on our heads and forget about privacy models we also have designs for how to do user-to-user and user-to-group communication. they just have to happen *off the repo* and let me explain why

One of the very cool things about this design (IMO, as someone who has used them a lot, for other things), is that the merkle sync does very naturally and elegantly recover from a rebase. It just ends up having to fetch a lot more data.

My almost entirely armchair quarterback opinion: lean into that and do what you need to do to make rebase faster. Don't try and do something off to the side for expunge. Just literally resync and let the pieces fall.

I’m not technically minded, so I might have this completely wrong, but would it be possible to give users the ability to rebase their own accounts only when they need/want to via a settings menu or something like that?

you could and we've discussed that, but we're not super sure that's the ideal UX. right now I'm more inclined to flag certain record types as requiring a rebase -- a deleted post matters more than a deleted like, for instance

So, in some ways at_protocol, although much better, still suffers some of the weird problems with delete that scuttlebutt has? I assumed the whole point of the Merkel DAG was to fix that. It’s a hard problem we never did solve with scuttlebutt.

when I worked on ssb, there was no rebase operation. not sure if that changed one way we might be able to leverage the merkle tree is through interactive diffs on the tree structure rather than relying on the history when the happy path isnt available. there are some good wire protos for that

This will lead to great pain and will end with deeply confused users. It brings on all the problems that CRDTs haven’t solved regarding automatic conflict resolution. The answer is to represent the root as a set. It’ll get you deletes. @dholms.xyz, we should chat.

I was also initially scared of rebases, but we actually have a pretty happy path for them I don't think repos don't need to work as CRDTs because we have an actor with the authority to linearize & declare the current state

Probably best done as a giant array of hashes at the base. Bloom filters built from that for numerous use cases

Two thoughts: 1. Could use use tombstones and compact later? It’s a soft delete so data is technically still there, but should keep meekly intact. 2. Could you use crypto key shredding similar to how PII is dealt with when users want to delete their data for GDPR?

To expand on (1): in my mind the idea would be to *add a piece of data* that marks something as deleted. It's annoying to have dangling CIDs in IPFS data structures, but the whole ecosystem will need to deal with that at some point IMO. This is a problem that appears in lots of places.

Exactly this 💯 Or to put it another way: just because you have a Merkle proof doesn't mean that you have to provide all of the underlying data. If no one holds on to the leaf, then it's just not available. Tombstoning (the previous skeet) is a gentler sign of intention, and the two can work togther.

1. nah the problem is the proof authentication relies on the record being available (as I understand it) 2. you'd need a key for each post and I'm not sure how you reliably shred since you need to publish the key to anybody who can read in the first place

(1) ugh, yea kinda painted into a corner if that’s the case.. (2) makes sense. In this case, I think best approach might be to focus on mitigating blast radius damage when a “rebase” occurs. Figuring out ways to rebase less often, or on smaller data… (shard?)