Nostr Compass #30
Welkom terug bij Nostr Compass, uw wekelijkse gids voor Nostr.
Deze week: de Marmot-specificatie is als aangenomen gemarkeerd in 42 bestanden, terwijl MDK v0.9.0 tot en met v0.9.3 uitbrengt met versleutelde groepsavatars, ondersteuning voor externe ondertekenaars en MarmotKit-bindings voor iOS en Android. Mostro brengt Transport v2 uit voor NIP-44-direct messages, met antispampoorten en een overgangsperiode waarin v1 en v2 naast elkaar werken in zowel mostrod v0.18.0 als Mobile v1.3.0. Bitchat 1.6.0 voegt NIP-13-proof-of-work toe aan berichten in geohash-kanalen, plus een optionele mesh-naar-Nostr-gateway waarmee één online telefoon een hele groep kan verbinden, prekey-bundels, transitieve verificatie en door de maker beheerde versleutelde privégroepen. Amber beperkt profielabonnementen per account, haalt NIP-65-relaylijsten op vóór profielmetadata en voegt een live Tor-statusmelding met herstartactie toe. rust-nostr voegt NIP-40-vervaltijden toe aan gift wraps en NIP-17-DM-builders, gekoppeld aan het willekeurige tijdstempel van de wrap. Amethyst voegt in 43 PR’s robuustere negentropy-synchronisatie, infrastructuur voor NIP-50-full-text search en event kinds voor nichetoepassingen toe. Nostrord brengt v2.0.0 en v2.1.0 uit met een samengevoegde relaypool, detectie van zombie-WebSockets en een volledig disk-first cache-raakvlak. Ook verschijnen Ngit v2.6.2, Jumble v26.7.1, Applesauce signers 6.2.2, Bray v1.33.0, Deepmarks 1.0.0, Bitcredit Core v0.5.13, Coop Mobile v0.2.4, Granary v11.0, Nostr-relay v0.0.244, Manent v1.4.0, Routstrd v0.3.7, Nymchat 1.0.1 en 21Meetup 1.1.0. SafeBox meldt dat fase 3 grotendeels is voltooid, naast een FreeBSD-jail-deploymentrunbook en de OpenETR-spin-off voor elektronische overdraagbare documenten. De NIPs-repository voegt een naamsafstemming tussen NIP-51 en NIP-37 samen en opent vijf voorstellen: NIP-AD Nostr Web Addresses, NIP-86-beheer voor het claimen van uitnodigingscodes, een HSL-formaat voor rolkleuren, NIP-80 voor hardware-geattesteerde mediaherkomst en een paginatiecorrectie in NIP-01. De verdiepingen behandelen NIP-13 (proof-of-work) en NIP-40 (vervaltijdstip).
Hoofdverhalen
Marmot neemt de specificatie aan en MDK brengt v0.9.x uit
De Marmot protocol repository fuseerde PR #170 op 3 juli en veranderde 42 bestanden van Status: draft for internal review (en experimental draft) naar Status: adopted. De README-titel verhuisde van het opstellen van de repo als een werk in uitvoering naar “Marmot Protocol” als de aangenomen tekst, de MIP-era-documenten werden geherkaderd als de verouderde versie van het protocol, en de “Review Status” sectie (“Dit is nog niet aangenomen spec tekst”) werd “Review Guidance” voor het bewerken van de huidige spec. Het v2 label verdwijnt doorheen: MIP-contrast frasering (“nieuw in v2,” “de v2 spec keeps”) wordt vervangen door “deze spec” en “onder deze spec.” Twee documenten behouden hun ontwerpstatus door ontwerp: implementation-model.md blijft non-normatief, en de multi-device functie eigen document blijft een concept.
Dezelfde repository landde PR #171 die admin-beleid, lidmaatschap en role-change invarianten uitlijnde. De cross-component controle dat een Remove kan niet wees een admin wordt nu vermeld als een eigenschap van elk resulterend tijdperk, geëvalueerd tegen de admin set van het vorige tijdvak wanneer een commit geen admin-policy update heeft. Convergence’s candidate-branch regel wordt aangescherpt dus “validates” betekent volledige commit geldigheid inclusief cross-component resulterende-epoch controles, die voorkomt dat een invariant-violerende commit een candidate edge creëert op elke branch. State notificaties afgeleid van een vervangen commit MUST worden ingetrokken wanneer branch selectie het vervangt, waardoor de “verlies van hernaam renders als een succesvol systeembericht” bug op het spec niveau wordt gesloten. Een nieuwe sectie “Realizing removal” in member-departure.md definieert de primaire realisatie-invoer (de geaccepteerde canonieke commit die je laatste blad verwijdert) en de terugval voor clients die nooit de removal commit hebben toegepast: geauthentificeerde post-eviction bewijs duikt nu op als een SelfEvicted resultaat met behoud-inactieve semantiek voor de verwijderde groep kopie. PR #236 vervolgens aangescherpt draad-gebonden validatie, pinning KeyPackage levenslange acceptatie tot 84 dagen plus een one-hours schew margin, het toevoegen van een Nostr tag-cardinaliteit tabel voor groep h, gift-wrap p, welkom e en relays, en KeyPackage tags, en verklaren dat ongeverifieerde Nostr gebeurtenis-id’s en metagegevens zijn niet vertrouwde routering, replay, of telemetrie bewijs.
Downstream, de MDK-werkblad gesneden v0.9.0 op 6 juli met een volledige werkruimte versie bump, gevolgd door v0.9.1, v0.9.2 en v0.9.3 gedurende de volgende twee dagen. v0.9.0 roteert oude sleutelbos ingangen wanneer een nieuwe SQLite database wordt aangemaakt en landt valideren-voor-muteren discipline over de opslaglaag. v0.9.1 routet elke uitgaande verbinding via één host-safety dial chokepoint via PR #732, waardoor de klasse van bugs waar verschillende call sites het netwerk bereikten met verschillende validaties. v0.9.3 stelt versleutelde groep avatars bloot aan de uniffi bindingen via download_group_image en image_hash_hex via PR #771, voegt externe-ondertekenaar ondersteuning toe, en markeert wn-opencode productie-klaar via PR #781. Naast de MDK cuts, schepen MarmotKit iOS en Android bindingen bij elke versie (een MarmotKit.xcframework plus Swift bindingen voor iOS en Kotlin bindingen plus JNI bibliotheken voor Android, beide gegenereerd uit een gepinde MDK commit hash), en een nieuw win-agent release kanaal biedt shell installateurs die de WN Agent versie pin aan een onveranderlijke release tag zodat downstream apps kan trekken de huidige agent met een enkele curl commando.
Mostro v0.18.0 en Mobile v1.3.0 brengen Transport v2 via NIP-44
Mostro is de peer-to-peer Bitcoin trading protocol dat ordeboeken draait, escrow, en geschillenbeslechting over Nostr gebeurtenissen, gecoördineerd door een daemon (mostrod) dat cliënten spreken over gecodeerde DMs. Tot deze week was het draadprotocol tussen klanten en mostrod Transport v1. Mostro v0.18.0 landt Transport v2, bekabeling van het protocol op NIP-44 directe berichten met anti-spam poorten en dubbele ontvangst ondersteuning lopende server-kant. PR #776 is de fase 1 wire change, PR #780 voegt de fase 2 anti-spam poorten voor protocol v2 toe, en PR #785 laat de innerlijke protocol versie het actieve transport volgen zodat een v2 client en een v1 client naast elkaar kunnen bestaan tijdens het migratie venster. Een gerelateerde PR #782 repareert een NIP-33 info tag door protocol_versions te hernoemen naar de unieke protocol_version. Naast het transportwerk, landt de release een Fase 4 geuniformeerde live-quote pad met cache-en-verhaalness handhaving (PR #783) en een El Toque fiat-cross provider die de Cubaanse CUP en MLC paren (PR #778). PR #779 voegt een doorgesneden-partij melding bij geschil slash, zodat een gebruiker die hun band verloren hoort van de daemon direct; het vorige gedrag verscheen alleen als een ontbrekende portefeuillebalans.
Mostro Mobile v1.3.0 is de client helft van de migratie. PR #613 migreert de app naar Riverpod 3.x, Fase A (PR #620) voegt twee-ontvangen ondersteuning voor NIP-44 directe berichten op het hoofdisolaat en op de achtergrond isoleren zodat een v2 mostrod en een v1 client kunnen praten tijdens de migratie, Fase B in PR #624 voegt dual-send, PR #632 re-applies dual-send na de Riverpod 3.x cut, en Fase C in PR #637 finaliseert de migratie. De release voegt ook Afrikaanse betaalmethode dekking toe: PR #625 voegt Malawi Kwacha betaalmethoden toe en PR #627 voegt KES (Kenyan Shilling), MZN (Mozambican Metical), TZS (Tanzanian Shilling), UGX (Ugandan Shilling), ZAR (Zuid-Afrikaanse Rand), en ZMW (Zambian Kwacha) methoden terwijl het uitbreiden van NGN (Nigerian Naira). Een herstelstroom wacht nu op knooppuntconnectiviteit voordat het uitbrengen van herstelverzoeken, en oorzaak-bewuste behandeling onderscheidt een geschil-gedreven obligatie slash van een timeout-gedreven.
Bitchat 1.6.0 voegt NIP-13 proof-of-work en een opt-in mesh-to-Nostr gateway toe
Bitchat 1.6.0 is de Bluetooth-mesh chat app die Nostr gebruikt voor zijn geohash kanalen en DM handoff. De release doet twee Nostr-vormige dingen die het lezen waard zijn. PR #1382 voegt NIP-13 (werkproof) toe aan uitgaande geohashkanaalberichten (soort 20000 kortstondige gebeurtenissen): elk stuurt mijnen een ["nonce", "<value>", "<target>"]-tag voordat ze gepubliceerd worden, richt zich op 8 toonaangevende nul bits, wat gemiddeld 256 hash-pogingen en eindigt in minder dan een milliseconde op een M-serie Mac. Inkomende gebeurtenissen met gevalideerde PoW ontspannen de per-send intake rate limiet, zodat een spammer betaalt berekenen per bericht, terwijl een regelmatige afzender niet voelt de kosten. Scope is bewust smal: slechts soort 20000 kanaal berichten mijn PoW, en aanwezigheid hartslagen (soort 20001), soort-1 locatie notes, en DMs zijn onaangeroerd.
PR #1384 voegt gateway mode toe, een opt-in mesh-to-Nostr uplink voor geohash kanalen. Wanneer een mesh-only gebruiker (geen internet, geen bereikbare relais) stuurt in een geohash kanaal en een andere peer op de mesh adverteert de .gateway-functie, wordt het ondertekende type 20000 evenement verpakt in een nieuwe MessageType.nostrCarrier = 0x28 TLV-envelop en verzonden naar één gateway. De gateway peer publiceert het evenement aan Nostr namens de afzender en zendt het inkomende kanaalverkeer terug naar de mesh met standaard TTL. Uplink deposito’s rijden de koerier envelop pad (geregisseerd, doorgegeven multi-hop); downlink ritten uitzending. De ondertekening vindt plaats voordat de gebeurtenis de afzender verlaat, zodat de gateway kan beslissen of ze een naamsvermelding publiceert maar niet kan vervalsen. De genoemde motivatie is ramp en protest scenario’s waar een aangesloten telefoon in een menigte is genoeg om het hele geohash kanaal een werkende Nostr uplink te geven.
Dezelfde release brengt een tweede partij Nostr-aangrenzend werk. PR #1381 voegt prekey bundels toe voor forward-secret asynchrone eerste contact op het koerier mail pad, zodat een afzender een bericht kan samenstellen aan een peer die offline is en het overhandigt aan de mesh zonder eerst een live Noise handshake te hebben gedaan. PR #1380 voegt een transitieve verificatie toe: een peer die de Noise handshake heeft voltooid met iemand die je al hebt geverifieerd, staat nu garant voor over de Noise sessie, dus de vertrouwensgrafiek propageert één hop tegelijk in plaats van een frisse persoonlijke verificatie voor elk nieuw contact. PR #1383 voegt maker-beheerde versleutelde privégroepen toe over de mesh, PR #1376 detecteert, rendert, en verlost Cashu ecash tokens met een /pay commando, en PR #1379 voegt een persistente ondertekende geohash bulletin board gelaagd op mesh sync. PR #1372 breidt store-and-forward uit met open koeriers, spray-and-wait routing, een persistente outbox en een zes uur durende publieke geschiedenisvenster. Bitchat 1.5.4 verzonden eerder in de week met de end-to-end favorieten fix in PR #1367 dat opruimt peer-list duplicaten, Nostr sync, en /fav sleutel corruptie.
Releases met versienummer
Amber v6.2.3 beperkt profielabonnementen en voegt een Tor-statusmelding toe
Amber v6.2.3 is een prestatie- en juistheidspas op de Android NIP-46-tekenaar, en de samengevoegde PR’s in de week eromheen wijzen op een samenhangend thema. De release zelf voegt een configureerbare profiel fetch interval instelling met nooit en altijd opties (PR #492), toont een profielafbeelding in de account switch onderste sheet, en scopes profielabonnementen door de huidige rekening, zodat een signer met meerdere accounts stopt met het uitven van abonnementen voor accounts waarmee de gebruiker momenteel niet tekent. Bunker toestemming ontleden krijgt expliciete fout behandeling bij parse mislukkingen. Verschillende StrictMode overtredingen zijn vastgesteld: een DiskReadVioolation van Coil’s onSuccess logging, een keystore overtreding van het laden van het account op de hoofddraad, main-thread leest voor de account naam en afbeelding in de account switch sheet, en enthousiaste KeyPair() constructie op de login en aanmelden schermen nu verplaatst uit de hoofddraad. In de dagen na v6.2.3 verzonden, PR #493 herordende het boot pad om de NIP-65 relaislijst van de gebruiker op te halen voordat profielmetadata (dus het profiel fetch queries de relais die de gebruiker publiceert), en PR #494 draaide de ingebouwde Tor notificatie in een live status indicator met een herstart actie, Dus een gebruiker wiens Tor daemon sterft tijdens een signeersessie ziet het falen en kan het stuiteren zonder de signer te verlaten. PR #495 ingeschakeld Android Lint in strikte waarschuwingen-as-errors modus over de codebase.
Jumble v26.7.1 maakt Blossom de standaarduploadservice in een DM-gerichte release
Jumble v26.7.1 is een Nostr-webclient-cut gericht op directe berichten en media. De release herdesigns media upload instellingen en maakt Blossom de standaard upload service, ter vervanging van de vorige NIP-96 standaard. DM handling krijgt een mobiel message menu, verbeterde desktop message acties, een “scroll to latest” knop, lange-druk reacties op DM media, en een retry pad voor mislukte uitgaande DMs uit de berichtenlijst. Custom emoji bewerken krijgt een gedetailleerde weergave, bericht bubble sizing verbetert voor facturen en ingebedde inhoud, verschillende DM scrollen en berichten ordering problemen zijn opgelost, en post-editor problemen rond emoji inbrengen, tekstkopie, en bestand drag worden opgeschoond. Afbeeldingsoriëntatie wordt gecorrigeerd wanneer metadata wordt verwijderd bij upload, en Linux ARM64 downloads worden toegevoegd aan de releasematrix.
Applesauce signers 6.2.2 laat een nbunksec-afhankelijkheid vallen
appleauce-signers@6.2.2 laat de @sandwichfarm/encoded-entities-afhankelijkheid van het subpakket vallen ten gunste van een ingebouwde nbunksec-helper via commit d654349. Applesauce’s NIP-46 bunker sessie codering, toegevoegd vorige week, vereist niet langer de externe codering bibliotheek, snijden een supply-chain oppervlak voor downstream klanten die het signers pakket consumeren.
Ngit v2.6.2 voorkomt dubbele PR-statusevents bij een push naar de standaardbranch
Ngit v2.6.2 is een bug-fix release voor de git-over-Nostr CLI. git push naar de standaard branch stopt het publiceren van duplicate PR merge/applied status events voor PR’s die al zijn gemarkeerd toegepast, omdat merge detectie nu de pre-push Nostr repo status leest (de bron van de waarheid voor de vraag of een PR al was opgelost op de NIP-34 kant van de workflow); de vorige heuristische gebaseerd op git internals en dupliceerde de status gebeurtenis. Actieve repositories die ngit gebruiken voor git-over-Nostr push flows stoppen met het uitzenden van dubbele type-1621 status gebeurtenissen in hun publiek.
Bray v1.33.0 CLI krijgt een bunkerprofiel, persona en uitgaand Tor-verkeer
Bray v1.33.0 is een Nostr SDK-plus-CLI release. bunker --profile <name> krijgt een auto-stabiele verbindingssleutel en relais terugval zodat een opgeslagen profiel kan overleven een relais uitval; bunker --persona <name> tekent als een afgeleide nsec-tree-identiteit, laat een ondertekening fungeren als meerdere pubkeys van een enkele afgeleide boom; en alle HTTP fetches kunnen worden doorgestuurd door een Tor SOCKS proxy wanneer geconfigureerd. De release voegt portemonnee subcommando’s voor NIP-47 NWC, NIP-29 groep admin schrijf operaties (create, update, add-user, remove-user, set-roles), NIP-86 admin werkwoorden, en NIP-65 outbox helpers. Publishing werkwoorden pick-up --jsonl, --csv, en --tsv output flags, een req werkwoord voor generieke NIP-01 filterqueries, een event werkwoord voor willekeurige event construction, een publish-raw commando dat voorgebouwde events tekent en uitzendt, een bunker sign one-shot NIP-46 signeercommando, en een per-commando --relay vlag op elke publishingcommando. Beveiligingswerkzaamheden hebben betrekking op drie groepen audituitstel: geheime nulalisatiediscipline, HTTP transportdrager-author en snelheidsbeperkingsharding, en SSRF-validatie op relais-URL’s. De NPM tarball schepen op 533.844 bytes met een byte-identieke reproduceerbaare bouw geverifieerd over twee onafhankelijke CI lopers.
Deepmarks 1.0.0 versterkt de beveiliging van Nostr-bladwijzers
Deepmarks 1.0.0 is een mijlpaal voor een publieke Nostr bookmarking service. Elke bladwijzer is nog steeds een gesigneerde Nostr gebeurtenis die elke client kan lezen. De API en archiefmedewerker zitten in een bevoorrechte netwerkpositie (zij kunnen interne Redis bereiken, het relaispad van de bunker, en cloud-metadata), zodat de SSRF-bewaker draagbaar is, en de release lost een kritische IPv6-literale bypass op in isPrivateIp: behaakte IPv6-literals werden geclassificeerd als publiek, dus [::1], [fd00::1], en IPv4-geplaatst [::ffff:10.0.0.4] bereikten alle interne doelen via dual-stack connect. De bewaker stript nu haakjes en vouwt IPv4-map en IPv4-compatibel IPv6 naar de embedded v4 voordat de private-range controle op beide dozen. Geïntegreerde kind:0 profielen van externe relais zijn nu ondertekend aan de gootsteen zodat een vijandige relais niet een nip05 of lud16 kan smeden voor een willekeurige slachtoffer pubkey, en bladwijzer URL’s worden op schema gecontroleerd bij elke render sink zodat een kind:39701 bladwijzer die rechtstreeks naar het relais wordt gepubliceerd met een javascript: of data: d-tag stopt met het bereiken van een <a href>. Zap ontvangstbewijzen overleven nu een tijdelijke bunkeruitval: de nederzetting handler atomicly claimt de hangende zap, finaliseert pas na ondertekening slaagt, en geeft de claim op mislukking, zodat een opnieuw geleverd invoice_updated kan opnieuw proberen. De /publish fan-out drain gebruikt BLMOVE in een per-worker verwerking lijst met hartslag-gated recovery, zodat een gecrashte werknemer behoudt een ondertekend evenement de client was al 202’d voor.
Bitcredit Core v0.5.13 ontsleutelt blokmetadata op de Nostr-wire
Bitcredit Core v0.5.13 verwijdert een encryptielaag uit de Nostr publieke evenementen gebruikt door het credit-bill protocol. Blok metadata (blok id, hash, handtekening) is nu niet versleuteld op de Nostr draad; alleen de blok gegevens zelf blijft versleuteld met de bijbehorende rekening sleutel. Nieuwe apps verwerken oude ketens, oude apps verwerken geen nieuwe ketens. De release voegt ook een bill-service functie toe om de bill chain op te halen, en schakelt de publicatie over naar een optimistisch drempelmodel: zodra een geconfigureerde relaisdrempel (standaard één) een publicatie accepteert, ontvangen de resterende relais de gebeurtenis asynchroon zodat publicatie niet langer wordt geblokkeerd door het langzaamste relais.
Coop Mobile v0.2.3 en v0.2.4
Coop Mobile verzonden v0.2.3 op 4 juli en v0.2.4 op 7 juli, voortzetting van de Android NIP-17 direct-messaging client’s steady release cadans. v0.2.3 voegt inline afbeelding en koppeling rendering toe in chat berichten, afbeelding bijlagen, spraak-tekst invoer, en een bevestigingsdialoog voor contact verwijderen. v0.2.4 repareert een indicator die voor altijd vast kwam te zitten, verbetert de Nostr Connect handshake, en voegt ncryptsec1 import (de NIP-49 versleuteld-privé-sleutel formaat) naast een opnieuw ontworpen importidentiteitsscherm.
Granary v11.0 voegt ondersteuning voor NIP-71-video-events toe
Granary v11.0 is de multi-protocol conversiebibliotheek die Bridgy Fed’s cross-netwerkbruggen aanstuurt. De Nostr module krijgt drie zichtbare wijzigingen. NIP-71 video events (soorten 21, 22, 34035 en 34236) zetten nu om in ActivityStreams 1.0-notities met videobijlagen, en de converter haalt de imeta afbeelding (thumbnail), de video duur, de top-level published_at tag, en de alt tag als een terugval displayName op de eerste video of audio bijlage. Aan de API kant, sign wordt hernoemd naar hash_and_sign en verify verhoogt nu ValueError bij storing; de Nostr constructor verhoogt ValueError op een ongeldige relais URL, en Nostr.query slaat de NIP-42 AUTH uitdaging sierlijk over als de beller geen privkey heeft ingesteld. Een follow-up conversie fix stopt wanneer een Nostr article object aankomt zonder een id. Elke brug of lezer die NIP-71 video-evenementen via Granary gebruikt, kan ze nu in het formaat dat de doellezer verwacht.
Nostr-relay v0.0.244 voegt een Firestore-backend toe
mattn/nostr-relay v0.0.244 voegt een Firestore backend toe via PR #12, waardoor de opslaglaag van het Go-relais wordt uitgebreid met een Google Cloud Firestore-optie naast de bestaande backends. De wijziging is klein, maar opent Firestore als een beheerde serverloze database optie voor een relais operator.
Manent v1.4.0 repareert NIP-42 AUTH en voegt mediaklembordflows toe
Manent v1.4.0 is de gecodeerde notes en bestandsopslag app gebouwd op Nostr met NIP-44 encryptie, NIP-46 en NIP-55 signer ondersteuning, NIP-65 outbox routing en Blossom storage. De release repareert NIP-42 relais authenticatie (voorheen gebroken), corrigeert Blossom uploads naar http:// hosts (voorheen onjuist behandeld), en herschrijft de compressiestroom. Aan de mediakant kunnen gebruikers nu een afbeelding naar het klembord kopiëren, een afbeelding plakken vanaf het klembord, bestanden slepen en neerzetten, afbeeldingen bijsnijden en roteren, video’s en gif afspelen en een video maken met een lange druk op het camerapictogram. Op Linux is het primaire klembord toegankelijk via middelste muisklik. Note-loaden en scrollen ontvangen verschillende optimalisaties.
Routstrd v0.3.7 maakt de Nostr-eventstore tot duurzame bron van waarheid
Routstrd v0.3.7 is de lokale daemon voor de Routstr gedecentraliseerde AI-inferentie netwerk, die routes LLM verzoeken via Nostr soort 38421 provider ontdekking en soort 38425 LGTM beoordelingen. De release voegt een routstrd update subcommando toe dat nieuwe binaire bestanden downloadt voor zowel routstrd als cocod en sierlijk herstart draait daemons; de daemon belt nu refreshNostrEvents() bij het opstarten en elke 21 minuten dus provider ontdekking en beoordelingen blijven vers zonder handmatige interventie. De gebundelde @routstr/sdk upgrades van 0.3.12 naar 0.3.15, het verwijderen van de ProviderRegistry laag in het voordeel van direct DiscoveryAdapter gebruik, het opruimen van modellen van verdwenen Nostr providers, zodat ze niet langer lekken in ranglijsten, en het behandelen van de Nostr event store als een aanhoudende bron van waarheid (de onjuiste 210-minuten TTL op cached gebeurtenissen is verdwenen). Xcashu restitutie behandeling scherpt: terugbetaling tokens worden geprobeerd voordat originelen in de fout pad, 404s opnieuw proberen 3× met twee minuten intervallen, en 425 Te vroeg wordt behandeld zonder gooien.
Nymchat 1.0.1 verschijnt als Progressive Web App op NIP-17
Nymchat 1.0.1 (ook bekend als NYM, Nostr Ynstant Messenger) is een Progressieve Web App en inheemse iOS/Android boodschapper voor kortstondige chat over Nostr, overbrugd met Bitchat. Kanalen gebruiken soort 20000 efemerale gebeurtenissen voor geohash kanalen en soort 23333 voor genoemde kanalen; prive-berichten en groep chats ride NIP-17 gift-wrapped events (soort 1059) met roterende efemerale ontvanger sleutels en automatische post-compromis recovery. Gebruikers kunnen een per session efemeral keypair genereren zonder registratie of log in met een persistente identiteit via NIP-07 browserextensies, een NIP-46 remote signer, of een nsec. Optionele apparaat-lokale identiteit versleuteling maakt gebruik van wachtwoord, pincode, wachtwoord, of biometrische ontgrendelen via WebAuthn PRF (passkey en biometrisch) of PBKDF2 (wachtwoord en PIN), met de platte tekst sleutel nooit geschreven op schijf terwijl encryptie is ingeschakeld. Voice- en videogesprekken gebruiken NIP-17 cadeauwikkels voor signalering en WebRTC voor het mediapad. Berichtreacties gebruiken NIP-25, aangepaste emoji gebruiken NIP-30, en de webapp wordt geserveerd als statische bestanden plus Cloudflare Pages Functies die fungeren als een privacyproxy voor relais en media.
21Meetup 1.1.0 introduceert door Nostr ondertekende aanwezigheidsbadges
21Meetup 1.1.0 is een Flutter app voor de Duitse Einundzwanzig Bitcoin gemeenschap die meetup aanwezigheid registreert via NFC tags en rollende QR codes. Elke aanwezige badge is een Nostr evenement (soort 21000) ondertekend door de meetup organisator met behulp van BIP-340 Schnorr, zodat een deelnemer accumuleert een reeks ondertekende evenementen die verklaren voor specifieke ontmoetingen op specifieke blokhoogten. De rollende QR-code draait elke 10 seconden, dus een badge kan niet op afstand worden geslagen, en de NFC-tag is alleen leesbaar in fysieke nabijheid. Een vertrouwensscore wordt lokaal berekend uit de verzamelde badges; de score kan worden gepresenteerd als een QR-code voor verificatie tijdens peer-to-peer trades. De app richt zich op Bitcoin gemeenschap reputatie, niet algemeen-doel Nostr sociale, maar de badge gebeurtenissen zelf zijn gewone Nostr gebeurtenissen elke lezer kan verifiëren.
Nostrord v2.0.0 en v2.1.0 voegen de relaypool samen en herstellen zombie-WebSockets
Nostrord v2.0.0 is een belangrijke versie van de KMP/WASM Nostr client die spreekt NIP-29, NIP-42, NIP-44, NIP-46, NIP-57, NIP-65 en NIP-98. v2.0.1 verscheept een dag later via PR #166 met een release-blocking desktop fix: de verpakte 2.0.0 (deb, rpm, msi, dmg) crashte bij het opstarten met NoClassDefFoundError: java/sql/DriverManager omdat de jpackage jlink afbeelding de java.sql module miste waarop de SQLDelight sqlite driver afhankelijk is; de fix voegt java.sql toe aan de runtime afbeelding, en dezelfde PR routes optimistisch sturen door het netwerk laag zodat het bericht bereikt het relais (de vorige code pad gecached stil en nooit geleverd), plus toetsenbord en scroll gedrag op mobiele web.
v2.1.0 volgde op 7 juli met de “relay pool fold” (PR #176), die de eerder gescheiden NIP-29 gerichte relaiscontactdoos in het gedeelde zwembad verenigt. Een reconnect scheduler heeft nu betrekking op alle relais, NIP-42 AUTH ondertekening is begrensd met retry, publiceert niet gesloten en opnieuw proberen op auth-equired, verzoek-storm races in requestPrivateGroupData en fetchGroupPreviews zijn gesloten, type-10009 user-group-list fetches batch per relais, en het mux_chat live-abonnement dekt nu elke samengevoegde groep (niet alleen de geopende) en zichzelf geneest wanneer een relais stil het abonnement laat vallen. UI-side wijzigingen vervangen de layout-shifting “Sending…” rij door een inline klok-dan-check pictogram en zet gestalde scroll-back in een expliciete hertry rij. PR #179 landde op dezelfde dag om zombie WebSockets op Android te detecteren: mobiele netwerken en Doze modus doden TCP zonder een close frame, dus schrijft in de dead socket buffer lokaal zonder gooien en isConnected() blijft waar, ook al zal er nooit iets worden ontvangen. NostrGroupClient stempelt nu lastInboundAtMs op elk frame, krijgt markDead() (dat annuleert de framelus zodat de normale herverbinding en opnieuw inschrijven pad loopt), en probeLiveness() (een REQ elk relais moet antwoorden binnen 5 seconden), geactiveerd op OK timeout met nul inkomende frames of op mux stale plus socket frame stilte. Een tweede bug fix in dezelfde PR stopt optimistische berichten worden geschreven naar de persistente cache op het invoegen tijd; ze schrijven nu alleen na levering bevestiging. v2.1.1 verzonden een dag later via PR #178 het toevoegen van iOS platform actuals, native test support, en app pictogrammen naast de v2.1.0 zombie-WebSocket werk.
Wijzigingen niet vrijgegeven
rust-nostr voegt NIP-40-vervaltijden toe aan gift wraps en privé-DM-builders
rust-nostr samengevoegd PR #1384 voegt een expiration optie toe aan GiftWrapBuilder en PrivateDirectMessageBuilder. De bibliotheek neemt een Duration van de beller: de NIP-40 expiration tag is verankerd aan de randomized created_at van de gift wrap (created at + duration), die het loskoppelt van de real send time. Een beller een absolute tijdstempel laten passeren, zou de verzendtijd lekken naar een relaiswaarnemer (aftrekken van de duur en je herstelt de oorspronkelijke verzendtijd), zodat de bibliotheek de tag intern bouwt vanuit de randomized wrap timestamp. De vervaldatum tag gaat op de gift wrap event, niet op de soort:13 zegel (die NIP-59 vereist om lege tags hebben). NIP-17 geeft dezelfde waarde terug aan de cadeauwikkelaar van PrivateDirectMessageBuilder. De verandering sluit issue #1381 en landt via hetzelfde bouwpatroon rust-nostr gebruik voor extra_tags. rust-nostr fuseerde ook PR #1387 met het consolideren van nostr-relay-builder in nostr-sdk, een workspace-flattening beweging.
Amethyst versterkt negentropy-synchronisatie en voegt NIP-50-search toe
Amethyst’s hoofdafdeling fuseerde 43 PR’s over drie samenhangende thema’s. De grootste thread is negentropiesynchronisatie op deGehydrolyseerde-tot-strfry grens: een geweigerde-vensterfoutmodus die gebruikt werd om de client te bestormen in een window-split lus die nu op een schone manier wordt afgebroken (PR #3480), de onderliggende negentropyKmp afhankelijkheid beweegt naar v1.1.1 (PR #3475), een 1-miljoen-event geodes-tot-strfry benchmark landt met een strfry-parity spiegel (PR #3478), en productiebenchmarks voegen zich bij de CI-matrix naast bredere synchronisatieoptimalisaties (PR #3458, PR #3466). Lock-free gelijktijdige collecties vervangen het vorige mutex-per-relay patroon en een UDP socket threading fix ritten langs (PR #3459).
De tweede thread is NIP-50 full-text zoekinfrastructuur. Een SearchableEvent interface landt zodat gebeurtenissen indexmetadata direct kunnen dragen (PR #3452), en NIP-50 zoekextensies worden nu verwijderd voordat SQLite FTS wordt gevraagd, zodat de lokale zoekmachine niet langer stikt op server-side extensie syntax (PR #3464). Standaard zoekrelais worden gecentraliseerd (PR #3446).
De derde draad is protocol integraties voor niche verticaal. Ondersteuning voor Birdstar vogeldetectie gebeurtenissen (soort 2473) bereikt een Android client (PR #3473), en PS1-geheugen-kaart opslaan staten kunnen worden gepubliceerd als ondertekende gebeurtenissen op soort 38192 (PR #3482). Afronden van de week: een samenstelling-handtekening instelling automatisch past aangepaste tekst aan berichten (PR #3450), de desktop notificaties weergave wordt opnieuw ontworpen met native OS toasts en een gedeeld filter (PR #3457), de Berichten kolom pikt een privacy slot (PR #3432), NostrServer.ingest voegt een lokale schrijfpad met per-submission verifiëren overslaan (PR #3469), en equals/hashCode contracten worden gerepareerd in de OpenTimestamps controleren pad (PR #3477).
Buzz blijft de relay versterken en definieert kind 44200 voor agent-turn-metrics
Buzz (het project voorheen Sprout) landde 123 PR’s samengevoegd in het venster van 1 juli tot 7 juli. Twee draden dragen het grootste deel van het gewicht. De eerste is een nieuwe gebeurtenis soort voor agent telemetrie: PR #1441 definieert NIP-AM duurzame gecodeerde agent draai metrics als soort 44200, die landt de telemetrie als een ondertekende gebeurtenis van de eigen relais archieven van de gebruiker, houden metrics op de gebruiker eigendom infrastructuur. Een lokaal archief voor het type volgt (PR #1555), het remove-kind pad wordt gemaakt atomic (PR #1562), en de modelnaam wordt door het uitstralen pad, zodat downstream lezers kunnen onderscheiden welk model geproduceerd welke draai (PR #1564).
De tweede draad is relais prestaties. Post-commit verzending wordt uitgesteld en een geverifieerde kloon wordt vermeden (PR #1453), inname en fan-out DB ronde reizen worden gestapeld met gemeten p99 ack druppels van 7 tot 16 procent en p999 staart druppels van 29 tot 53 procent versus de voorafgaande tip (PR #1454), multi-filter query uitvoering loopt met begrensde concurrency (PR #1457), en uitgaande WebSocket data frames batch op verzenden (PR #1464). Naast het perf werk, een per-community workspace pictogram set die admins configureren en het relais dient via NIP-11 breidt NIP-11’s informatiedocument uit met een per-community customization oppervlak (PR #1463), agent owners kunnen de berichten van hun agent verwijderen via relais type:5 gebeurtenissen plus matching desktop en mobiele UX (PR #1519), OpenTelemetry traceren voegt Prometheus metrics op het relais (PR #1398), en het git repo-name register verhuist naar Postgres (PR #1432).
Divine Video voegt relay-handtekeningverificatie toe en extraheert NostrConnect
De mobiele app van Divine Video fuseerde 97 PR’s in het venster, en de Nostr-facing thread is vertrouwensgrensverharding plus authenticatie opruiming. PR #5774 controleert inbound relay event handtekeningen, sluit een klasse van trust-in-the-relay bugs; PR #5828 versleutelt de FCM push token in het type-3080 deregistration evenement, zodat het apparaat token van de gebruiker stopt te verschijnen in duidelijke tekst op het relais wanneer ze zich afmelden; en PR #5831 chunks het type:5 delete REQ zodat een gebruiker met een grote delete geschiedenis niet langer overflowt het relais frame. Aan de authenticatiezijde haalt PR #5826 een NostrConnectCoordinator uit voor de nostrconnect://-stroom, waardoor het door NIP-46-cliënt geïnitieerde bunkercodepad wordt opgeschoond voordat een bredere auth-refactor wordt gevolgd onder issue #4741. PR #5709 maps type-16 reposts wanneer notification_type afwezig is, zodat een repost notificatie juist weergeeft, zelfs wanneer de verzendende client de hint weglaat.
Zap Cooking repareert NIP-46-bunkerlogin en voegt NIP-50-receptzoekfunctie toe
Zap Cooking’s frontend fuseerde 18 PR’s in het venster langs één thema: het maken van Nostr auth oppervlakken herstellen van fouten. PR #503 repareert bunker login met een expliciete verbinding handshake, authUrl behandeling, en fout surfacing zodat een gebruiker die een externe signer ziet een echte foutmelding bij storing waar de vorige snee hing het aanmeldscherm. PR #495 voegt NIP-98 auth toe aan de afbeelding van het extract-recipe eindpunt en tekst-upload paden zodat uploads worden gepubliceerd. Een aparte functie draad landt NIP-50 full-text recept zoeken via de nostrarcbies zoekrelais backend (PR #483), laat een gebruiker query recepten over het relais corpus zonder een client-side index. Content-rendering polish schepen naast: geciteerd-note inhoud en media nu direct oppervlak in de ouder nota ter vervanging van de vorige begraven-link fallback (PR #491), link previews en hashtag sizing land (PR #492), multi-word zoekopdrachten werk (PR #482), en server-side sociale preview kaarten worden gegenereerd voor notitie, lezingen en profiel links (PR #494).
nostr-sdk v0.6.0 werkt toe naar een eerste stabiele release
yysskk/swift-nostr-client verzonden v0.6.0 samen met 30 samengevoegde PR’s. De Swift Nostr bibliotheek beweegt dichter naar een eerste stabiele API oppervlakte voor Swift Nostr clients die het koppelen van de MDK of MarmotKit toolchains vermijden.
Nostr Applet Protocol (NAPS) scherpt NAP-OUTBOX-routing en fan-out aan
NAPS had een betekenisvolle schoonmaakweek, voornamelijk in NAP-OUTBOX. De kop is strakkere grenzen: minder beller-gecontroleerde routing, minder gelekte relais details, en een gedeelde gebeurtenis resultaat vorm die relais hints en resource sidecars kan dragen, koppelen aan NAPRESOURCE. Publiceren is ook duidelijker: expliciete outbox, inbox, en relais fanout regels. Netto-effect: minder dubbelzinnigheid, betere interoperabiliteit.
Napplet Toolchain scherpt protocolafstemming aan en brengt zijn CLI uit
Deze week verhuisde Napplets pakketten van gebruiksvriendelijke SDK Het grote verhaal is uitlijning met de live NAP specs: NAP-COUNT-queryondersteuning, OUTBOX en RelayEventResult sidecars allemaal geland, waardoor shell-gemedieerde leest en abonnementen nauwkeuriger. Verschillende domeinen werden ook aangescherpt: CVM registry support, DM error envelopes, MEDIA sessie context, LISTS count velden, GEMEENSCHAPPELIJK profiel resultaten, en de htree: RESOURCE regeling. Op het gebied van tooling, de nieuwe @napplet/cli is een belangrijke mijlpaal, het toevoegen van configuratie ontdekking, implementatie planning, ondertekening, Blossom uploads, en manifest generatie. Ten slotte maakten de host-injectable shim prelude en JSR-voorbereiding de stack gemakkelijker te injecteren, publiceren en verifiëren.
amber-android breidt het oppervlak voor afstandsbediening uit
Primale Android heeft 18 PR’s in het venster samengevoegd. Aan de Nostr kant implementeert PR #1075 switch_relays en logout methoden voor de externe rol van de app, waardoor Primal’s NIP-46-tekenoppervlak wordt uitgebreid. PR #1083 voegt een splash-gated lokale app-migratie framework toe, en PR #1080 implementeert note-feed prefetching in het splash view-model. De rest is UI polish over de Home top en bottom bar, Explore hints, en het profiel scherm.
Wisp voegt een multi-accountwisselaar en Blossom-parsertests toe
Wisp heeft 9 PR’s samengevoegd. PR #604 voegt een multi-account switcher met een expliciete annulering pad op de add-account flow. PR #613 voegt unit tests voor Blossom.parseServerList toe, waardoor de Blossom server-lijstparser aanscherpt. PR #574 herschrijft de zap-sheet voor iOS-lay-out met een instant-zap-instellingen oppervlak, PR #605 verandert transactiegeschiedenis in een swipe-up onderblad, PR #611 ontleedt hashtags met niet-ASCII Unicode letters, PR #609 houdt de profielnotities feed paginating en rendert inline gallery media, en PR #603 behoudt lege regels voor inline profiel en hashtag segmenten.
TAO en Wired verhogen het PoW-signaal naar 21 bits en tonen bronnen met recente PoW
smolgrrr/ TAO en smolgrrr/Wired (dezelfde commit set landde in beide repo’s) fuseerden 13 PR’s. PR #84 verhoogt de standaard post-signaal proof-of-work target naar 21 leading zero bits, en PR #80 oppervlakken voeden wortels van verse PoW activiteit, zodat een client kan rangschikken de tijdlijn door recente NIP-13 werk; de vorige rangschikking was rauwe gebeurtenis leeftijd. PR #75 herstelt een aangepaste emoji picker en PR #65 voegt eerste-frame video previews. Dit is de tweede Nostr client deze week om te leunen op NIP-13 als een eersteklas filter voor door de gebruiker gegenereerde inhoud, als aanvulling op Bitchat’s kanaal-gescoopde PoW.
keychat-android verfijnt de NIP-46-UX en verhelpt een TOCTOU-probleem
privkeyio/keep-android verscheept v1.1.5 naast 13 samengevoegde PR’s, vervolgens v1.1.6 op 8 juli waarin de onderliggende keep core wordt gepind tot v0.5.0. Keep is een mobiele identiteitskluis (bedekt in Issue #29 als CustID). v1.1.5 was UX polish op de NIP-46 challenge flow. v1.1.6 sluit een check-then-set (TOCTOU) race in set_active_share af van de onderliggende keep-mobile krate, geeft de URL en methode die zijn geautoriseerd op de NIP-98 HTTP-auth goedkeuring prompt, zodat een gebruiker kan zien wat ze ondertekenen, en schakelt de RNG gezondheidscontrole om te mislukken gesloten (terugkeer een fout) in plaats van paniek. Een geinstrumenteerde test heeft betrekking op de NIP-55-goedkeuringsstroomkillschakelaar. De v0.5.0 CLI functies die kwam met de onderliggende release (dreshold-OPRF ontgrendelen, software DKG, HD FROST portefeuilles) zijn nog niet opgedoken in de Android-app; v1.1.6 levert alleen de security fixes.
Heartwood brengt de relay-naar-serieel-ondertekenbrug uit
gesmede/harthout v0.7.0 landt de relais-naar-serial signeerbrug die vorige week in de vlucht was, bekabelt het HSM-modus datavlak voor Bray’s seriële-ondertekenaar pad. PR #11 is de brug zelf, PR #13 voegt seriële-frame dekking en lost het apparaat read_frame lading offset, en PR #14 haalt de seriële frame codec in een gedeelde heartwood-frame krat.
SafeBox publiceert een voortgangsrapport voor fase 3 en een FreeBSD-jail-runbook
SafeBox is een privé portable data kluis op Nostr die NIP-47 Nostr Wallet Connect, nAuth, nembed en relais-gemedieerde record overdracht over QR en NFC combineert tot één operator-deployable service. Een Voortgangsverslag juli 2026 gepubliceerd op 6 juli, fase 3 als substantieel voltooid: 49 commits landden sinds het rapport van april, waardoor de repository op 1,136 commits kwam, en de vier fase 3 engineering commitments (harde fase 2 experimenten, ondersteunen interoperabele instanties, voorbereiden op schaal, toevoegen van commerciële-product discipline) zijn grotendeels geleverd. Het rapport frames de volgende stap als een begrensde piloot, en onthult dat een telecommunicatieprovider onder NDA is het verkennen van een gezondheid-records pilot op SafeBox.
Het concrete Nostr-georiënteerde werk landde eerder in Fase 3 en wordt samengevat in het rapport: muteren NWC acties worden nu in de wachtrij geplaatst om bewijsraces te voorkomen, mislukte Bliksem smelten beschermen bewijzen voordat terugkeer, langlevende NWC luisteraars nu proactief vernieuwen zodat een sessie overleeft voorbij zijn stationaire drempel; het vorige gedrag was een stille stal, en LNURL callbacks gebruiken canonieke oorsprongen met expliciete JSON en CORS reacties. QR en NFC record exchange verkregen een unified flow spec covering recipient-presented, sender-presented, en cross-device presentatie modes met duidelijker KEM (Key Encapsulation Mechanism) behandeling en replay bescherming via de Open Quantum Safe bibliotheek. De in-window commit is 6866dae, die een FreeBSD jail deployment en liboqs bouwen runbook naast een Specificatie van FreeBSD-apparaat, het documenteren van ZFS snapshots, jail isolatie, rc.d service management, host-level reverse proxy configuratie, en rollback procedure voor een SafeBox implementatie op FreeBSD/ARM hardware.
Het rapport kondigt ook OpenETR aan als een duidelijke spin-off waarbij SafeBox’s cryptografische-control-plus-portable-records architectuur wordt toegepast op elektronische overdraagbare records: cognossementen, pakhuisbonnen, promissory notes en certificaten. OpenETR’s repo zag 7 commits op 7 juli inclusief ea612a9 scheidingsattest van de core record, ca153a3 op mandature-versus-effect handling, en ba84b61 toevoegen van een vergelijking met verifieerbare-credentiële formaten.
Protocolwerk en NIP-updates
Samengevoegd: NIP-51 en NIP-37 stemmen de naam van kind 10013 af
PR #2404 is een prose-only consistentie fix. In NIP-37 wordt type 10013 Relay List for Private Content genoemd; in NIP-51 onder Draft relays werd hetzelfde soort beschreven met verschillende formuleringen. NIP-51 gebruikt nu de NIP-37 naam voor hetzelfde evenementtype. Geen wire gedrag verandert en geen nieuwe tag semantiek; de waarde is dat NIP-51 is de paraplu spec voor lijst-vormige gebeurtenissen en NIP-37 is de private-content follow-up, en verkeerd afgestemde naamgeving tussen de twee maakt het gemakkelijk om te missen dat ze beschrijven hetzelfde soort.
Open: NIP-AD Nostr Web Addresses via .well-known-lookup
PR #2406 opent als opvolger van een gesloten PR #2393 met een volledige specificatie op AD.md. NIP-AD definieert web-URL’s met een optionele Nostr tegenhanger. Een client die een URL ziet zoals https://golf.com/players vraagt om https://golf.com/.well-known/nostr.json?ad=/players, die een JSON object mapping paden teruggeeft aan {filter, relays} paren. Het geretourneerde filter is een standaard NIP-01 filter (kinds, auteurs, #d, limit, enz.), en de relais array namen die de client moet vragen. Met "limit": 1 gaat de URL over tot één evenement; zonder dat, naar een lijst. In een normale webbrowser maakt de URL HTML zoals elke andere URL, zodat hetzelfde domein webgebruikers en Nostr clients van één canonisch pad kan bedienen. De vermelde use cases omvatten NIP-29 groepsnamen die oplossen op een soort 39000 evenement op een specifieke relais (het verwijderen van de noodzaak voor groeps-id farming), NIP-5A nsite lookups, gehoste feeds die een {"ids": [...]}-filter publiceren, native rendering van geplaste njump.me/nevent1... en klantspecifieke event-URL’s, en Nostr-getankte blogs die zowel native binnen Nostr en bezoekers buiten bestaan. De .well-known/nostr.json hergebruik plus path-as-object-key layout is gekozen zodat de resolver een statisch bestand kan zijn.
Open: NIP-86-claimbeheer voor uitnodigingscodes
PR #2408 stelt voor om drie methoden toe te voegen aan NIP-86: listclaims (params [], geeft een reeks NIP-43 uitnodigingscodes terug), createclaim (params [claim], geeft true) en deleteclaim (params [claim], geeft true terug). Vandaag laat NIP-86 een relais admin gebruikers en rolopdrachten beheren maar heeft geen uitnodigingscode oppervlak. De use case van de PR auteur is community-relay onboarding: een admin maakt een uitnodiging code geassocieerd met een rol, verzamelt betaling voordat de identiteit van de gebruiker wordt gemaakt, geeft de uitnodiging code aan de gebruiker, en een bot luistert voor de resulterende soort 28935 claim evenement op het relais en automatisch wijst de rol. De drie methoden laten die stroom volledig door de relay management RPC lopen.
Open: rolkleur als (h, s, l)-tuple
PR #2402 verandert het rolkleurformaat in NIP-43 van een enkele hue waarde (0 tot 360) naar een tupel hue (0 tot 360), saturation (0 tot 1), en lightness (0 tot 1). Lege strings zijn toegestaan voor elk onderdeel zodat clients hun eigen standaards kunnen leveren voor een coherent palet, en de spec tekst raadt alleen hue aan tenzij een specifieke kleur zoals zilver gewenst is. De verandering threads door NIP-86 in dezelfde PR: createrole en editrole nu nemen [id, label, description, [h, s, l], order]; de vorige handtekening droeg een enkele kleur parameter in hetzelfde slot. De motivatie is dat tint alleen klanten dwingt om verzadiging en lichtheid te kiezen voor de operator, zodat verschillende klanten dezelfde rol op zichtbaar verschillende intensiteiten geven.
Open: NIP-80 voor hardware-geattesteerde mediaherkomst
PR #2409 opent NIP-80, een evenementformaat voor media herkomst verankerd in capture hardware. Een camera tekent elke foto op het moment van de vangst en publiceert het bewijs van relais door de inhoud zelf, zodat verificatie overleeft metadata strippen, re-hosting, en platform takedowns. In het voorstel worden zes nieuwe soorten evenementen gedefinieerd: type 1080 voor vangstattesten, type 1081 voor afleidingsattesten die betrekking hebben op grootte, gewas, recompress, of redact (met een onthulde modus of nul-kennis optie), soort 1082 voor intrekkingen (regelmatige gebeurtenissen, permanente, auteur-gescoopde, monotone), soort 11080 voor mededelingen van apparaten, soort 31080 voor de goedkeuring van apparaten, en type 31081 voor een apparaat voor anonieme attesten (gemarkeerd experimenteel en eventueel opgesplitst in een metgezel NIP). Hergebruikte primitieven zijn NIP-94 x-tag semantiek, NIP-92 imeta, NIP-65 voor ontdekking van intrekking, Blossom voor opslag van media en optionele NIP-03 tijdstempel verankering. Het ondertekeningsmodel koppelt een BIP-340 apparaatsleutel met een hardware ECDSA sleutel omdat mainstream beveiligde elementen nog geen BIP-340 handtekeningen produceren (Microchip ATECC608 ondersteunt P-256, NXP SE050 ondersteunt secp256k1 maar alleen ECDSA, TPM 2.0 modules en Infineon OPTIGA Trust M cover P-256/RSA, Apple Secure Enclave en Android StrongBox gebruiken P-256). Het genoemde toepassingsgebied probeert niet om de scène echt te bewijzen: een attest bewijst dat dit exacte beeld op ongeveer dit moment van dit apparaat kwam en werd alleen gewijzigd op verklaarde, bewijsbare manieren, en de specificatie verbiedt klanten om de resultaten in te storten in een kale “authentieke” badge. Een werkend prototype OpenVeilCam, een Rust camera runtime voor Raspberry Pi met behulp van de ATECC608 beveiligde element, wordt bijgewerkt om de voorgestelde evenement soorten naast een standalone verificateur te publiceren.
Open: robuustere NIP-01-paginatie
PR #2407 voegt een “Paginatie & limieten” subsectie toe aan NIP-01. De concrete regels: een relais die een maximum limit MOET het hoger instellen dan het grootste aantal evenementen dat een enkele created_at in zijn database deelt, zodat geen enkele seconde een pagina kan vullen en de paginatie kan vertragen. Cliënten die achteruit piepen MUST verzoeken herhalen met until = oldest (inclusive) en MUST dedupliceren door id (aangezien de oudste seconde elke ronde opnieuw wordt gehaald), en paging is voltooid wanneer een ronde geen nieuwe gebeurtenissen oplevert na deduplicatie. Als een volledige pagina heeft oudste en nieuwste evenementen delen van een created_at, de client MOET die tweede opnieuw proberen met een grotere limit, en als het relais klemt de grotere limit en nog steeds een pagina beperkt tot een seconde, de client MOET ofwel vooruit met until = oldest - 1 (behandelen van niet-vervallen gebeurtenissen als gedaald) of afbreken. Normale paging MOET NIET limit instellen; het relaismaximum is gezaghebbend, en een kleinere waarde herstart de stal. Het verhogen van limit om een vastzittende seconde te draineren is de enige uitzondering. Deze fix is belangrijk omdat een naïeve since/until cursor gebeurtenissen mist met dubbele tijdstempels of ze opnieuw verwerkt, en de huidige NIP-01 tekst vertelt geen van beide kanten hoe te ontsnappen aan de val.
NIP-verdieping: NIP-13 (proof-of-work)
NIP-13 definieert een proof-of-work mechanisme voor Nostr gebeurtenissen. Het bestaat omdat e-mail-stijl spam is triviaal om te produceren op een openbaar relais netwerk: iedereen kan een keypair genereren en een onderwerp overspoelen, en er is geen economische kosten per evenement. NIP-13 laat een gebeurtenis auteur een rekenkosten per gebeurtenis die een spammer zou moeten betalen in geaggregeerde maar een regelmatige afzender betaalt slechts eenmaal per bericht. Relais en klanten kunnen dan eisen of liever gebeurtenissen die voldoen aan een moeilijkheidsdrempel.
Het mechanisme
Een gebeurtenis auteur kiest een moeilijkheid doel uitgedrukt in bits en mijnt de gebeurtenis id (de sha256 hash van de geserialiseerde gebeurtenis) totdat het heeft tenminste dat veel leidende nul bits. Omdat het evenement id bevat de created_at tijdstempel, de tags, en de inhoud, mijnbouw vereist het veranderen van iets in het evenement lichaam om de hash ruimte te zoeken. NIP-13 definieert een nonce-tag voor precies dit doel:
["nonce", "<nonce_value>", "<target_bits>"]
De nonce_value is elke tekenreeks die de mijnwerker kiest; de target_bits is de moeilijkheid waarvoor de mijnwerker zich inzet. Een verificateur telt de eerste nul bits van de gebeurtenis-id en vergelijkt met target_bits. De target_bits in de tag is een claim, en een verificateur meet de werkelijke leading-zero telling van de id om het te bevestigen.
Het aantal voorste nul bits in een willekeurige sha256 output volgt een geometrische verdeling: elke extra bit verdubbelt het verwachte werk. 8 bits gemiddeld 256 hash pogingen, 20 bits gemiddeld ongeveer een miljoen, en 28 bits gemiddeld ongeveer 268 miljoen. Bitchat’s 8-bits doel voor geohash-kanaalberichten kost minder dan een milliseconde van de CPU op moderne hardware en vult onder elke waarneembare latentie. TAO en Wired’s 21-bit standaard is ongeveer twee miljoen hash pogingen per post, die snel op een laptop, maar duur op schaal voor een bot boerderij. NIP-13 heeft geen problemen; elke relais en client kiest zijn eigen.
Voorbeeld
Een minimale NIP-13-gemijnde soort-1 noot ziet eruit als:
{
"id": "000000000e9d97a1ab09fc381030b346cdd7a1a8a6f27c9c88f68c8b9d0f6c8a",
"pubkey": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2",
"created_at": 1720368000,
"kind": 1,
"tags": [
["nonce", "72847", "28"]
],
"content": "hello, this cost me 28 bits of PoW",
"sig": "b1a5c9c74cff59f8a48e5c3b3d8e1c8e7e2c1d4a8e2b9f7d1c3e8b4f6a2c8d1e9f4b3c7a1d8e5b2f9c6a3d7e1b8f4c9a2d6e3b7f1c8a4d9e2b5f8c1a7d4e6b9f3c2"
}
De id begint met zeven hex nullen (28 leading zero bits, die overeenkomen met de target_bits in de nonce tag). De mijnwerker varieerde de nonce_value 72847 totdat de id het doel bereikte. Een verificateur hasht de geserialiseerde gebeurtenis en bevestigt dat de ID minstens 28 voorsprong nul bits heeft, en controleert dan de handtekening. NIP-13 voegt geen nieuwe velden toe; het voegt de nonce-tag toe en beperkt het nul-bit aantal id’s.
Wanneer het wordt gebruikt
Bitchat’s 1.5.4 release maakt gebruik van 8-bit PoW op soort 20000 geohash-channel berichten: uitgaande stuurt de mijne de tag voordat het publiceren en inkomende gebeurtenissen met gevalideerde PoW ontspannen de per-sender intake rate limiet. TAO en Wired gebruiken 21-bit PoW als de standaard post-signaal drempel en oppervlakte voeden wortels van verse PoW activiteit, het behandelen van PoW als een tijdlijn rangschikking signaal. cagliostr dwingt NIP-13 op de relaislaag af, waardoor gebeurtenissen onder een drempel worden afgewezen. NoStrudel stelt een client-side PoW mijnbouw setting bloot voor auteurs die willen signaal om klanten te filteren. Damus en Amethyst berekenen leading-zero bits bij het weergeven van gebeurtenissen, zodat een gebruiker de PoW commitment op notities ziet. Coracle stelt PoW zowel voor mijnbouw als filtering bloot. NDK en nostr-tools stellen PoW mijnbouwhelpers bloot aan bibliotheekconsumenten.
De design eigenschap die vorm geeft NIP-13’s implementatie is dat PoW is onvergetelijk: een claim van target_bits telt alleen als bewijs wanneer de id heeft dat veel toonaangevende nullen, en een vervalsing vereist het opnieuw doen van het werk. Dat eigendom laat Bitchat gebruik maken van inkomende PoW als een tarief-limit relaxer zelfs wanneer een spammer beweert een hoge moeilijkheid; de controle is een hash tellen, geen vertrouwen beslissing. De complementaire eigenschap is dat PoW de mijnwerker niet commit aan een specifieke pubkey of inhoud; een spammer kan nog steeds kiezen om te mijnen bij 8 bits en te branden rekenen, maar de berekening is een echte kosten. NIP-13 verplaatst het spamprobleem van “onmogelijk” naar “kwantifieerbaar” en laat klanten hun eigen prijs bepalen.
NIP-verdieping: NIP-40 (vervaltijdstip)
NIP-40 definieert een expiration-tag die een relais en een client instrueren dat een gebeurtenis moet worden beschouwd als verlopen na een gegeven Unix-tijdstempel. Het bestaat omdat Nostr evenementen zijn anders permanent: zodra een ondertekende evenement landt op een relais, de enige manier om het te verwijderen is een NIP-09 delete event, en zelfs dan kan een relais het origineel behouden. NIP-40 laat een auteur op het moment van publicatie verklaren dat een evenement van korte duur is, en vraagt relais om te stoppen met het bedienen en clients om het na het tijdstempel niet meer te tonen.
Het mechanisme
Een auteur voegt een expiration-tag toe aan een evenement:
["expiration", "<unix_timestamp>"]
De tijdstempel is Unix seconden. Een relais MAG gebeurtenissen waarvan het verloop reeds in het verleden op het moment van inname is verworpen, MAG stoppen met het dienen van gebeurtenissen waarvan het verloop is verstreken, en MOET respect hebben voor de door de auteur opgegeven vervaldatum. Een klant moet verlopen gebeurtenissen verbergen voor de gebruiker. NIP-40 heeft het relais niet nodig om het evenement te verwijderen, en het overruled NIP-70 protected-event semantics niet; het is een hint plus een soft contract.
De tag leeft op de gebeurtenis zelf (of in het geval van verpakte berichten, op de buitenste wrap). NIP-40 definieert geen semantiek verwijderen; het evenement blijft een ondertekende gebeurtenis die iedereen die het heeft nog kan lezen. Wat NIP-40 geeft, is een gecoördineerde verwachting dat het relais en de client na de deadline stoppen met het evenement te benaderen. Dit maakt NIP-40 nuttig voor efemerale berichten, getimede aankondigingen, live-event notities die moeten stoppen met worden geserveerd na het evenement, en NIP-17 directe berichten die niet moeten blijven voorbij een aangegeven horizon.
Interactie met geschenkverpakking
De rust-nostr PR die deze week is geland (PR #1384) is een case study in hoe NIP-40 interactie heeft met NIP-59 gift wrap. NIP-59 definieert een twee-laagse envelop: een soort:13 “seal” gebeurtenis ondertekend door de echte sleutel van de afzender, en een soort:1059 “geschenk wrap” gebeurtenis ondertekend door een kortstondige sleutel. Beide lagen hebben de created_at-waarden willekeurig gemaakt, tot 48 uur voor de werkelijke verzendtijd, zodat een relaiswaarnemer de werkelijke verzendtijdstempel niet kan herstellen. NIP-59 geeft opdracht dat het zegel lege tags heeft.
Dat mandaat is waarom de vervaldatum tag moet gaan op de gift wrap en blijf van de zegel, en waarom het verankeren van de tag aan de echte verzenden tijd zou verslaan gift wrap timing privacy: als een beller passeert een absolute vervaldatum, een waarnemer trekt de beoogde TTL van de beller af en herstelt de werkelijke zendtijd. De ontwerpbeslissing van rust-nostr is om de API te ontmaskeren als een Duration van de beller en dan expiration = wrap.created_at + duration te berekenen in de bibliotheek. De created_at van de wrap is al willekeurig in de bibliotheek, dus de expiration timestamp erft dezelfde randomisatie en lekt niet de echte verzendtijd.
Voorbeeld
Een minimaal NIP-40 voorbeeld op een soort-1-noot:
{
"id": "1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b",
"pubkey": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2",
"created_at": 1720368000,
"kind": 1,
"tags": [
["expiration", "1720454400"]
],
"content": "this note expires in 24 hours",
"sig": "d2e5b8a1c4f7b0d3e6a9c2f5b8d1e4a7c0f3b6d9e2a5c8f1b4d7e0a3c6f9b2d5e8a1c4f7b0d3e6a9c2f5b8d1e4a7c0f3b6d9e2a5c8f1b4d7e0a3c6f9b2d5e8a1"
}
created_at is de Unix tijdstempel van publicatie; de vervaldatum tag zegt dat de gebeurtenis moet stoppen te worden geserveerd 86.400 seconden (24 uur) later. Een relais dat NIP-40 respecteert stopt met het terugsturen van deze gebeurtenis naar REQS na 1720454400, en een client die NIP-40 respecteert verbergt het na die tijd voor de gebruiker.
Wanneer het wordt gebruikt
De bouwers van rust-nostr (GiftWrapBuilder, PrivateDirectMessageBuilder) stellen nu het verval bloot als een eersteklas Duration parameter. NDK stelt een expiration helper voor type-1 en DM bouwers bloot. nostr-tools heeft een getExpiration en isExpired paar voor het lezen en handhaven van de tag. strfry, nostr-rs-relay, khatru en andere relaisimplementaties respecteren NIP-40 bij REQ-behandeling (verwerpen of weglaten van verlopen gebeurtenissen afhankelijk van het beleid van de exploitant). Damus, Amethyst, noStrudel, Cracle en Primal alle filter verlopen gebeurtenissen uit hun tijdlijn rendering. Live-activiteit clients zoals zap.stream gebruiken NIP-40 op de bijbehorende type-1311 chat events, zodat een live chat stopt na de stroom eindigt.
De ontwerpeigenschap die NIP-40 schoon landt in de meeste implementaties is dat het opt-in per evenement is en geen gecoördineerde implementatie vereist. Een auteur kan vandaag de tag toevoegen; een relais die het eert krijgt een schonere werkende set; een relais die het negeert doet niet slechter dan voorheen; en een client die verlopen gebeurtenissen verbergt geeft de auteur waar ze om vroegen. De rust-nostr verandering deze week versterkt dat de plaatsing van de tag net zo belangrijk is als de aanwezigheid ervan: in een privacy-besparende envelop zoals NIP-59 cadeau wrap, de tag zit op de laag waarvan de tijdstempel is al gerandomiseerd, en de API oppervlak voorkomt dat een beller per ongeluk lekken van een real timestamp terug in de wrap.
Dat is het voor deze week. Iets bouwen of nieuws delen? Bereik via NIP-17 DM of vind ons op Nostr.