diff --git a/buds/03.md b/buds/03.md index 42345a3..e52d010 100644 --- a/buds/03.md +++ b/buds/03.md @@ -10,9 +10,9 @@ Defines a replaceable event using `kind:10063` to advertise the blossom servers The event MUST include at least one `server` tag containing the full server URL including the `http://` or `https://`. -The order of these tags is important and should be arranged with the users most "reliable" or "trusted" servers coming first. +The order of these tags is important and should be arranged with the users most "reliable" or "trusted" servers being first. -The `.content` is not used. +The `.content` field is not used. ```json { @@ -29,12 +29,50 @@ The `.content` is not used. } ``` -## Client Integration +## Client Upload Implementation -When uploading blobs clients should attempt to upload the blob to all or at least the top 3 server on the list event. +When uploading blobs clients MUST attempt to upload the blob to at least the first `server` listed in the users server list. + +Optionally clients MAY upload the blob to all the servers or mirror the blob to the other servers if they support [BUD-04](./04.md) This ensures that the blob is available in multiple locations in the case one of the servers goes offline. -## Server Integration +## Client Retrieval Implementation -Servers may use this event kind to discover other servers that a user is uploading to in order to download specific blobs from. +When extracting the SHA256 hash from the URL clients MUST use the last occurrence of a 64 char hex string. This allows clients to extract hashes from blossom URLs and SOME non-blossom URLs. + +In all the following examples, the hash `b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553` should be selected + +- Blossom URLs + - `https://blossom.example.com/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553.pdf` + - `https://cdn.example.com/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553` +- Non Blossom URLs + - `https://cdn.example.com/user/ec4425ff5e9446080d2f70440188e3ca5d6da8713db7bdeef73d0ed54d9093f0/media/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553.pdf` + - `https://cdn.example.com/media/user-name/documents/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553.pdf` + - `http://download.example.com/downloads/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553` + - `http://media.example.com/documents/b1/67/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553.pdf` + +In the context of nostr events, clients SHOULD use the author's server list when looking for blobs that are no longer available at the original URL. + +Take the following event as an example + +```json +{ + "id": "834185269f4ab72539193105060dbb1c8b2efd702d14481cea345c47beefe6eb", + "pubkey": "ec4425ff5e9446080d2f70440188e3ca5d6da8713db7bdeef73d0ed54d9093f0", + "content": "I've developed a new open source P2P e-cash system called Bitcoin. check it out\nhttps://cdn.broken-domain.com/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553.pdf", + "kind": 1, + "created_at": 1297484820, + "tags": [], + "sig": "bd4bb200bdd5f7ffe5dbc3e539052e27b05d6f9f528e255b1bc4261cc16b8f2ad85c89eef990c5f2eee756ef71b4c571ecf6a88ad12f7338e321dd60c6a903b5" +} +``` + +Once the client discovers that the URL `https://cdn.broken-domain.com/b1674191a88ec5cdd733e4240a81803105dc412d6c6708d53ab94fc248f4f553.pdf` is no longer available. It should perform the following steps to find the blob: + +1. Get the SHA256 has from the URL +2. Look for the authors server list `kind:10063` +3. If found, Attempt to retrieve the blob from each `server` listed started with the first +3. If not found, the client MAY fallback to using a well-known popular blossom server to retrieve the blob + +This ensures clients can quickly find missing blobs using the users list of trusted servers.