Nostr Compass #30
Benvenuti a Nostr Compass, la vostra guida settimanale a Nostr.
Questa settimana: il Marmot spec è contrassegnato adottato attraverso 42 file come MDK taglia v0.9.0 tramite v0.9.3 con avatar di gruppo crittografato, supporto di firma esterna, e MarmotKit iOS e attacchi Android. Mostro navi Trasporto v2 su NIP-44 messaggi diretti con cancelli anti-spam e una finestra di coesistenza in entrambi mostrod v0.18.0 e Mobile v1.3.0. [Bitchat 1.6.0 aggiunge ZXQ0054QXXXC Amber applica gli abbonamenti del profilo per account, fetches NIP-65 elenchi di relè prima dei metadati del profilo, e aggiunge una notifica di stato Tor live con un’azione di riavvio. rust-nostr aggiunge la scadenza NIP-40 alla confezione regalo e ai costruttori NIP-17 DM, ancorati al timestamp randomizzato dell’involucro. Amethyst unisce 43 PR di indurimento di sincronizzazione negentropia, NIP-50 infrastruttura di ricerca full-text, e tipi di eventi per verticali di nicchia. Nostrord navi v2.0.0 e v2.1.0 con una piscina a relè piegata, il rilevamento WebSocket zombie, e una cucitura completa della cache del disco-primo. [ZXQ00] (ZXXXXXX) Il repository NIPs si fonde con un NIP-51 e allineamento del nome NIP-37 e apre cinque proposte: NIP-AD Nostr Web Addresses, [ZXQ0065QXXZ] Copertura profonda delle immersioni NIP-13 (protezione del lavoro) e NIP-40 (tempri di scadenza).
Marmot segna la spec adottata e MDK taglia v0.9.x
Il Marmot protocol repository fuso PR #170 il 3 luglio, cambiando 42 file da Status: draft for internal review (e experimental draft) a Status: adopted. Il titolo README si è spostato dall’inquadratura del repo come lavoro in corso a “Marmot Protocol” come testo adottato, i documenti dell’era MIP sono stati ri-framezzati come la versione deprecata del protocollo, e la sezione “Review Status” (“Questo non è ancora adottato testo spec”) è diventata “Review Guidance” per la modifica della corrente spec. L’etichetta v2 scompare in tutto: MIP-contrast phrasing (“new in v2”, “the v2 spec keep”) viene sostituita con “this spec” e “under this spec”. Due documenti mantengono il loro progetto di stato per disegno: implementation-model.md rimane non-normativo, e il documento della funzione multi-dispositivo rimane una bozza.
Lo stesso repository è atterrato PR #171 allineando la politica di amministrazione, l’appartenenza e gli invarianti di cambiamento di ruolo. Il controllo cross-component che un Remove non può orfano un amministratore è ora dichiarato come una proprietà di ogni epoca risultante, valutata contro il set di amministrazione dell’epoca precedente quando un commit non porta un aggiornamento di amministrazione-policy. La regola candidato-branch di Convergence è serrata in modo da “validates” significa piena validità di commit, compresi i controlli cross-component risultante-epoch, che impedisce un commit invariante-violante di creare un bordo candidato su qualsiasi ramo. Le notifiche di stato derivate da un commit superato devono essere ritirate quando la selezione di ramo lo sostituisce, che chiude il “perdere rinomina rende come un messaggio di sistema di successo” bug a livello spec. Una nuova sezione “Realizzare la rimozione” in member-departure.md definisce l’ingresso di realizzazione primaria (l’impegno canonico accettato rimuovendo l’ultima foglia) e il fallback per i clienti che non hanno mai applicato il commit di rimozione: le prove autenticate post-evizione ora superano come risultato SelfEvicted con semantica inattiva per la copia del gruppo rimossa. PR #236 quindi serrata convalida a filo-boundary, pinning KeyPackage accettazione a vita a 84 giorni più un margine di skew di un’ora, aggiungendo una tabella Nostr tag-cardinality per gruppo h, dono-wrap p, benvenuto e e ZXQ0005QQXQXQXQXQ
A valle, lo spazio di lavoro MDK tagliato v0.9.0 il 6 luglio con un urto di versione full workspace, seguito da v0.9.1, v0.9.2) e [v0.9. v0.9.0 ruota le voci di keyring stale quando viene creato un nuovo database SQLite e atterra la disciplina di convalida-prima-mutata attraverso lo strato di archiviazione. v0.9.1 tratta ogni connessione in uscita attraverso un Chokepoint dial host-safety tramite PR #732, chiudendo la classe di bug in cui diversi siti di chiamata hanno raggiunto la rete con una validazione diversa. v0.9.3 espone gli avatar di gruppo crittografati ai binding uniffi attraverso download_group_image e image_hash_hex tramite PR #771, aggiunge il supporto di segnale esterno, e segna wn-opencode produzione-ready via PR #781. Oltre ai tagli MDK, MarmotKit spedisce attacchi iOS e Android ad ogni versione (un MarmotKit.xcframework più binding Swift per attacchi iOS e Kotlin più librerie JNI per Android, entrambi generati da un bugnato MDK commit hash), e un nuovo canale di rilascio di wn-agent fornisce installatori di shell che pin la versione WN
Mostro v0.18.0 e Mobile v1.3.0 nave Trasporto v2 su NIP-44
Mostro è il protocollo di trading peer-to-peer Bitcoin che esegue libri di ordine, escrow e risoluzione delle controversie sugli eventi di Nostr, coordinato da un daemon (mostrod) che i clienti parlano a DM più crittografati. Fino a questa settimana il protocollo di migrazione tra i client e mostrod è stato Transport v1. Mostro v0.18.0 atterra Trasporto v2, cablaggio del protocollo su NIP-44 messaggi diretti con cancelli antispam e dual-receive Un relativo PR #782 fissa un tag info NIP-33 rinominando protocol_versions al singolare protocol_version. Oltre al lavoro di trasporto, il rilascio atterra un percorso live-quote unificato di Fase 4 con l’applicazione della cache-e-staleness (PR #783) e un fornitore di cross El Toque che copre le coppie cubane di CUP e MLC (PR #778).
[ZXQ0008QXXZ v1.3.0] (https://github.com/MostroP2P/mobile/releases/tag/v1.3.0) è la metà client della migrazione. PR #613 migra l’app a ZXQ0009QX37XZ 3.x, Fase A (PR #620) aggiunge il supporto dual-receive per ZXQ0012 Il rilascio aggiunge anche la copertura del metodo di pagamento africano: [PR #625] (https://github.com/MostroP2P/mobile/pull/625) aggiunge i metodi di pagamento del Malawi Kwacha e [PR #627] (https://github.com/MostroP2P/mobile/pull/627) aggiunge KES (Kenyan Shilling), MZN (Mozambican Metical), TZS (Tanzanian Shilling), UGX (Ugandan Shilling), ZAR Un flusso di ripristino ora aspetta la connettività dei nodi prima di emettere richieste di ripristino, e la gestione di causa-consapevole distingue uno slash obbligazionario guidato da una timeout-driven.
Bitchat 1.6.0 aggiunge NIP-13 proof-of-work e un gateway opt-in mesh-to-Nostr
[Bitchat 1.6.0] (https://github.com/permissionlesstech/bitchat/releases/tag/v1.6.0) è l’applicazione di chat Bluetooth-mesh che utilizza Nostr per i suoi canali geohash e handoff DM. PR #1382 aggiunge NIP-13 (proof-of-work) ai messaggi di canale geohash in uscita (tipo 20000 eventi effimeri): ogni mina un tag ["nonce", "<value>", "<target>"] in uscita ha un bit di 8 secondi. Gli eventi in entrata con validato PoW rilassano il limite di aspirazione per-sender, quindi uno spammer paga la computazione per messaggio mentre un mittente regolare non sente il costo. Scope è volutamente stretto: solo i messaggi di canale di tipo 20000 mine PoW, e i battiti cardiaci di presenza (kind 20001), le note di posizione gentili-1, e DMs sono intatti.
PR #1384 aggiunge la modalità gateway, un uplink mesh-to-Nostr opt-in per i canali geohash. Quando un utente mesh-only (nessun internet, nessun relè raggiungibile) invia in un canale geohash e un altro peer sulla rete pubblicizza la capacità .gateway, il tipo firmato 20000 evento è avvolto in una nuova busta MessageType.nostrCarrier = 0x28 TLV e inviato diretto a un gateway. Il gateway peer pubblica l’evento a Nostr per conto del mittente e rebroadcast traffico canale in entrata sulla rete con TTL predefinito. I depositi di uplink cavalcano il percorso della busta del corriere (diretto, relayed multi-hop); downlink cavalca in onda. La firma avviene prima che l’evento lasci il mittente, in modo che il gateway può decidere se pubblicare ma non può forgiare l’attribuzione. La motivazione dichiarata è disastro e scenari di protesta in cui un telefono collegato in una folla è sufficiente per dare l’intero canale geohash un uplink Nostr funzionante.
PR #1381 aggiunge i fasci prechiavi per il primo contatto asincrono sul percorso della posta del corriere, in modo che un mittente possa comporre un messaggio a un pari che è offline e consegnarlo alla rete senza aver fatto prima una stretta live di Noise. PR #1380 aggiunge la verifica transitoria: un peer che ha completato la stretta di mano del rumore con qualcuno che hai già verificato è ora garantito per over the Noise session, quindi il grafico di fiducia propaga un hop alla volta invece di richiedere una nuova verifica in persona firmata per ogni nuovo contatto. Bitchat 1.5.4 spedito primario nella settimana con i preferiti end-to-end fix in PR #1367 che pulisce i duplicati di peer-list, la sincronizzazione Nostr e la corruzione chiave /fav.
Tagged releases
Amber v6.2.3 presenta gli abbonamenti del profilo e aggiunge una notifica di stato Tor
Amber v6.2.3 è un segnale di prestazioni e correttezza sul segnale Android NIP-46 e le PR unite nella settimana intorno a esso puntano a un tema coerente. Il rilascio stesso aggiunge un’impostazione dell’intervallo fetch del profilo configurabile con opzioni mai e sempre (PR #492), mostra un’immagine del profilo nel foglio inferiore dell’interruttore dell’account, e gli abbonamenti del profilo dell’account corrente in modo che un firmatario che tiene più account smetta di esaurire gli abbonamenti per gli account che l’utente non sta firmando con. Bunker permesso parsing guadagna esplicito errore di gestione su fallimenti parse. Numerose violazioni StrictMode sono fissate: un DiskReadViolation dalla registrazione di Coil onSuccess, una violazione di keytore dal caricamento dell’account sul thread principale, lettura main-thread per il nome dell’account e l’immagine nel foglio dell’interruttore dell’account, e desiderosi di KeyPair() costruzione sul login e schermi di registrazione ora spostato fuori il thread principale. Nei giorni dopo v6.2.3 spedito, PR #493 riordinato il percorso di avvio per recuperare l’utente NIP-65 elenco di relè prima dei metadati del profilo (così il profilo fetch interroga i relè che l’utente pubblica a), e [PR #494Q](ZXQ0007 PR #495 ha abilitato Android Lint in modalità avvisi-as-errors rigorosi attraverso la base di codice.
Jumble v26.7.1 rende Blossom il servizio di upload predefinito in un taglio focalizzato su DM
Jumble v26.7.1 è un client web Nostr tagliato focalizzato su messaggi e supporti diretti. Il rilascio ridisegna le impostazioni di caricamento dei media e rende [Blossom] (/it/topics/blossom/) il servizio di upload predefinito, sostituendo il precedente default NIP-96. La gestione di DM ottiene un menu di messaggi mobili, migliorato le azioni dei messaggi desktop, un pulsante “scroll to più recenti”, reazioni a lunga pressione sui media DM, e un percorso di riprovazione per i DM non riusciti in uscita dalla lista dei messaggi. L’editing personalizzato di emoji guadagna una vista dettagliata, il dimensionamento della bolla del messaggio migliora per le fatture e il contenuto incorporato, diversi problemi di scorrimento e di ordinazione dei messaggi di DM sono fissi, e i problemi post-editor relativi all’inserimento emoji, copia del testo e trascinamento dei file vengono ripuliti. L’orientamento dell’immagine viene corretto quando i metadati vengono rimossi su upload e i download di Linux ARM64 vengono aggiunti alla matrice di rilascio.
## Applesauce signers 6.2.2 scende una dipendenza nbunksec
applesauce-signers@6.2.2 abbassa la dipendenza @sandwichfarm/encoded-entities del sottopacchetto a favore di un built-in nbunksec helper via commit d654349. La codifica della sessione di bunker di Applesauce NIP-46, aggiunta la scorsa settimana, non richiede più la libreria di codifica esterna, tagliando una superficie della catena di fornitura per i clienti a valle che consumano il pacchetto dei firmatari.
Ngit v2.6.2 interrompe gli eventi duplicati di stato PR sulla pressione di default-branch
Ngit v2.6.2 è un bug-fix release per il git-over-Nostr CLI. git push al ramo di default smette di pubblicare duplicati eventi di stato PR merge/applied per le PR che sono già contrassegnate applicate, perché la rilevazione di fusione ora legge il pre-push Nostr repo stato (la fonte di verità per se un PR è stato già risolto sul lato NIP-34 del flusso di lavoro); il precedente evento euristico basato su git interno. I repository attivi che utilizzano ngit per i flussi git-over-Nostr smettono di emettere eventi di stato del tipo-1621 duplicati nel loro pubblico.
Bray v1.33.0 CLI raccoglie un profilo bunker, persona e Tor in uscita
Bray v1.33.0 è un rilascio Nostr SDK-plus-CLI. bunker --profile <name> ottiene una chiave di connessione auto-stabile e fallback relè in modo che un profilo salvato possa sopravvivere a un outage relè; bunker --persona <name> segni come un’identità derivata nsec-tree, lasciando un segnale agire come più pubkeys da un singolo albero derivato; e tutte le fetches HTTP possono essere instradate tramite un proxy ZXQ0027QX Il rilascio aggiunge sottocomandi portafogli per NIP-47 NWC, NIP-29 gruppo di gestione delle operazioni di scrittura (creare, aggiornare, add-user, remove-user, set-roles), NIP-86 e [ZX13X00 Publishing verbs pick up --jsonl, --csv, e --tsv bandiere di uscita, un verbo req generico per domande filtro NIP-01, un verbo event per la costruzione di eventi arbitrari, un comando publish-raw Il lavoro di sicurezza copre tre lotti di deferrals di audit: disciplina di zeroizzazione segreta, HTTP di trasporto di orso-auth e l’indurimento dei limiti di tasso, e convalida SSRF sugli URL di relè. Le npm tarball navi a 533.844 byte con un byte-identico edificio riproducibile verificato in due corridori CI indipendenti.
Deepmarks 1.0.0 indurisce la superficie di bookmarking Nostr
Deepmarks 1.0.0 è una pietra miliare di sicurezza per un servizio pubblico di bookmarking Nostr. Ogni segnalibro è ancora un evento firmato Nostr che qualsiasi cliente può leggere. Lo API e il lavoratore di archivio siedono in una posizione di rete privilegiata (può raggiungere Redis interno, il percorso di relè del bunker e i metadati del cloud), quindi la protezione SSRF è portante di carico, e il rilascio fissa un bypass critico IPv6-litterale in isPrivateIp: staffato IPv6 literals sono stati classificati come pubblico, quindi La guardia ora spoglia staffe e piega IPv4-mapped e IPv4-compatibile IPv6 fino al v4 incorporato prima del controllo a banda privata su entrambe le caselle. I profili kind:0 da relè esterni sono ora marcati al lavandino in modo che un relè ostile non possa forgiare un nip05 o lud16 per una vittima arbitraria pubkey, e gli URL del bookmark sono controllati da ogni lavandino di render in modo da un segnalibro kind:39701 Le ricevute di Zap sono ora sopravvissute a un outage del bunker transitorio: il gestore del regolamento sostiene atomicamente lo zap in sospeso, finalizza solo dopo la firma riesce, e rilascia il reclamo sul fallimento in modo che uno invoice_updated riprova. Lo scarico fan-out /publish utilizza BLMOVE in una lista di elaborazione per-lavoratore con recupero acuto-gated in modo che un lavoratore crashato preserva un evento firmato che il cliente era già 202’d.
## Bitcredit Core v0.5.13 unencrypts block metadatas on the Nostr wire
Bitcredit Core v0.5.13 rimuove uno strato di crittografia dagli eventi pubblici Nostr utilizzati dal protocollo di trasferimento di credito. Bloccare i metadati (bloccare id, hash, firma) è ora non crittografato sul filo Nostr; solo i dati del blocco rimangono crittografati con la chiave di fattura corrispondente. Le nuove applicazioni elaborano vecchie catene, le vecchie applicazioni non elaborano nuove catene. Il rilascio aggiunge anche una funzione di fattura-servizio per recuperare la catena di bolletta, e passa la pubblicazione ad un modello di soglia ottimista: una volta che una soglia di relè configurata (una di default) accetta una pubblicazione, rimanenti relè ricevono l’evento asincronicamente così la pubblicazione non è più bloccata dal relè più lento.
Coop Mobile v0.2.3 e v0.2.4
Coop Mobile spedito [v0.2.3] (https://git.reya.su/reya/coop-mobile/releases/tag/v0.2.3) il 4 luglio e v0.2.4 il 7 luglio, continuando il Android NIP-17 cadenza di rilascio costante del client di messaggio. v0.2.3 aggiunge l’immagine in linea e il rendering del collegamento in messaggi di chat, allegati di immagine, input vocale-to-text e una finestra di dialogo di conferma per la rimozione dei contatti. v0.2.4 fissa un indicatore che è rimasto bloccato per sempre, migliora il handshake Nostr Connect, e aggiunge l’importazione ncryptsec1 (il formato NIP-49 crittografato-private-chiave) insieme a una schermata di identità di importazione ridisegnata.
Granary v11.0 aggiunge supporto per eventi video NIP-71
Granary v11.0 è la libreria di conversione multi-protocollo che alimenta il bridging cross-network di Bridgy Fed. Il modulo Nostr ottiene tre modifiche visibili. NIP-71 eventi video (atti 21, 22, 34235 e 34236) ora convertiti in note ActivityStreams 1 con allegati video, e il convertitore estrae l’immagine imeta (thumbnail), la durata del video, il tag published_at, e il tag ZXQ Sul lato API, sign viene rinominato hash_and_sign e verify ora solleva ValueError sul guasto; il costruttore Nostr solleva ValueError su un URL di relè non valido e Nostr.query Una correzione di conversione di follow-up si blocca quando un oggetto Nostr article arriva senza id. Qualsiasi ponte o lettore che consumano eventi video NIP-71 attraverso Granary può ora esporli nel formato che il lettore di destinazione si aspetta.
Nostr-relay v0.0.244 aggiunge un backend Firestore
mattn/nostr-relay v0.0.244 aggiunge un backend Firestore tramite PR #12, estendendo lo strato di archiviazione del relè Go con un’opzione Google Cloud Firestore accanto ai suoi backend esistenti. Il cambiamento è piccolo ma apre Firestore come opzione di database gestita senza server per un operatore di relè.
Manent v1.4.0 corregge NIP-42 AUTH e aggiunge flussi di clipboard media
[Manent v1.4.0] (https://github.com/dtonon/manent/releases/tag/v1.4.0) è l’app di archiviazione crittografata costruita su Nostr con la crittografia [NIP-44] (/it/topics/nip-44/) e [ZXQ000QXZ] (ZXQ000QXX) Il rilascio corregge l’autenticazione a relè NIP-42 (precedentemente rotto), corregge i caricamenti Blossom agli host http:// (precedentemente maltrattati), e riscrive il flusso di compressione. Sul lato dei supporti, gli utenti possono ora copiare un’immagine sul clipboard, incollare un’immagine dal clipboard, trascinare e rilasciare file, ritagliare e ruotare immagini, riprodurre video e gif, e prendere un video con una lunga pressione sull’icona della fotocamera. Su Linux, il clipboard primario è accessibile tramite mouse middle-click. Il caricamento e lo scorrimento delle note ricevono diverse ottimizzazioni.
Routstrd v0.3.7 rende l’evento Nostr memorizzare la fonte persistente di verità
Routstrd v0.3.7 è il daemon locale per la rete di inferenza AI decentralizzata Routstr, che tratta le richieste LLM tramite Nostr tipo 38421 provider di scoperta e recensioni tipo 38425 LGTM. Il rilascio aggiunge un sottocomando routstrd update che scarica nuovi binari sia per routstrd che per cocod e riavvia con grazia i daemon in esecuzione; il daemon ora chiama refreshNostrEvents() all’avvio e ogni 21 minuti in modo da la scoperta e le recensioni dei fornitori rimangono fresche senza intervento manuale. Il bundle @routstr/sdk aggiorna da 0.3.12 a 0.3.15, rimuovendo lo strato ProviderRegistry in favore dell’uso diretto DiscoveryAdapter, pulendo i modelli da provider Nostr scomparsi in modo da non trapelare più nelle classifiche, e trattando il negozio di eventi Nostr come fonte persistente di verità (l’erroneo 210-minuto TTL sugli eventi cached è andato). La gestione del rimborso Xcashu stringe: i token di rimborso sono provati prima che gli originali nel percorso di errore, la riprovazione di 404s 3× con intervalli di due minuti, e 425 Too Early viene gestito senza gettare.
Nymchat 1.0.1 lancia come app Progressive Web su NIP-17
[Nymchat 1.0.1] (https://github.com/Spl0itable/NYM) (noto anche come NYM, Nostr Ynstant Messenger) è un Progressive Web App e nativo iOS / Android messenger per chat effimera su Nostr, pontificato con Bitchat. I canali utilizzano eventi effimeri tipo 20000 per canali geohash e tipo 23333 per canali nominati; messaggi privati e chat di gruppo cavalcare NIP-17 eventi dotati (tipo 1059) con chiavi a destinatario effimeri rotanti e recupero post-compromesso automatico. Gli utenti possono generare un keypair ephemeral per sessione senza registrazione o log-in con un’identità persistente tramite NIP-07 estensioni del browser, un NIP-46 segnale remoto, o un nsec. La crittografia opzionale dell’identità del dispositivo-local utilizza password, PIN, password o sblocco biometrico tramite WebAuthn PRF (passkey e biometrico) o PBKDF2 (password e PIN), con la chiave di testo normale non scritta mai su disco mentre la crittografia è attiva. Le chiamate vocali e video utilizzano i pacchetti regalo NIP-17 per la segnalazione e WebRTC per il percorso dei media. Le reazioni dei messaggi usano NIP-25, l’uso di emoji personalizzato NIP-30, e l’applicazione web viene servita come file statici e Cloudflare Pages Funzioni che agiscono come proxy di privacy per relè e media.
21Meetup 1.1.0 lancia i distintivi di presenze firmati Nostr
21Meetup 1.1.0 è un app Flutter per la comunità tedesca Einundzwanzig Bitcoin che registra la frequenza di incontro tramite tag NFC e codici QR rolling. Ogni badge di frequenza è un evento Nostr (kind 21000) firmato dall’organizzatore di incontri utilizzando BIP-340 Schnorr, quindi un partecipante accumula una serie di eventi firmati che attestano incontri specifici a specifiche altezze di blocco. Il codice QR rotante ruota ogni 10 secondi, quindi un badge non può essere coniato da remoto, e il tag NFC è leggibile solo in prossimità fisica. Un punteggio di fiducia viene calcolato localmente dai distintivi raccolti; il punteggio può essere presentato come un codice QR per la verifica durante i trade peer-to-peer. L’app si rivolge alla reputazione della comunità Bitcoin, non a livello generale Nostr social, ma gli eventi distinti sono eventi ordinari Nostr che qualsiasi lettore può verificare.
Nostrord v2.0.0 e v2.1.0 piegare la piscina di relè e guarire zombie WebSockets
Nostrord v2.0.0 è un taglio importante della KMP/WASM Il client Nostr che parla NIP-29, NIP-42, NIP-44, NIP-46, NIP-57, NIP-65 e NIP-98.
v2.1.0 seguito il 7 luglio con la “rimozione della piscina” (PR #176), che unifica la presa di relè concentrata NIP-29 precedentemente separata nella piscina condivisa. Un programma di ricollegamento ora copre tutti i relè, NIP-42 La firma di AUTH è delimitata con la riprovazione, pubblica il fallimento chiuso e riprova sulle razze di richiesta-scarica richiesta in requestPrivateGroupData e fetchGroupPreviews sono chiusi, tipo-10009 utente-gruppo-elenco di fetches batch per relx Le modifiche laterali dell’interfaccia utente sostituiscono la riga “Sending…” con un’icona in linea di controllo dell’orologio e si trasformano in una riga di riprova esplicita. PR #179 è atterrato lo stesso giorno per rilevare zombie WebSockets su Android: reti mobili e modalità Doze uccidere TCP senza una cornice chiusa, così scrive nel buffer socket morto localmente senza gettare e isConnected() rimane vero anche se nulla sarà mai ricevuto. NostrGroupClient ora timbra lastInboundAtMs su ogni frame, acquisisce markDead() (che cancella il frame loop in modo che il normale ricollegamento e resubscribe path run), e probeLiveness() (un REQ qualsiasi relè deve rispondere entro 5 secondi), attivato su OK timeout con zero frame inbound o su mux stale plus socket frame Silence. v2.1.1 spedito un giorno dopo via PR #178 aggiungendo effetti della piattaforma iOS, supporto di test nativo e icone app accanto al lavoro v2.1.0 zombie-WebSocket.
Cambiamenti inediti
rust-nostr aggiunge la scadenza NIP-40 alla confezione regalo e ai costruttori privati di DM
rust-nostr fuso PR #1384 aggiungendo un’opzione expiration a GiftWrapBuilder e PrivateDirectMessageBuilder. La libreria prende un Duration dal chiamante: il tag di scadenza NIP-40 è ancorato al pacchetto regalo randomizzato created_at (created at + durata), che lo decouples dal tempo reale di invio. Lasciare un caller passare un timestamp assoluto trapelare il tempo di invio a un osservatore di relè (sottotrarre la durata e recuperare il tempo di invio originale), in modo che la libreria costruisce il tag internamente dal timestamp di involucro randomizzato. Il tag di scadenza va sull’evento del pacchetto regalo, non sul tipo: 13 sigillo (che NIP-59 richiede di avere tag vuoti). NIP-17 consegna lo stesso valore fino al costruttore di pacchetti regalo di PrivateDirectMessageBuilder. Il cambiamento si chiude problema #1381 e atterra attraverso lo stesso modello di costruttore rust-nostr utilizza per extra_tags. rust-nostr si unì anche PR #1387 consolidando nostr-relay-builder in nostr-sdk, una mossa di workspace-flattening.
Amethyst trascorre la settimana indurendo la sincronizzazione negentropia e aggiungendo la ricerca NIP-50
Amethyst fermello principale ha unito 43 PR in tre temi coerenti. Il filetto più grande è negentropy sincronizza sul limite geode-to-strfry: una modalità di guasto rifiutata che ha usato per tempestare il cliente in un loop di finestra-split ora torna in modo pulito (PR #3480), la dipendenza negentropyKmp si sposta a v1.1.1 ([PR #3475](ZXQ000Q000Q Le collezioni concorrenti senza serrature sostituiscono il precedente modello mutex-per-relè e un UDP socket fix cavalca lungo (PR #3459).
Il secondo thread è NIP-50 infrastruttura di ricerca full-text. Un’interfaccia SearchableEvent atterra in modo che gli eventi possono trasportare i metadati indice direttamente (PR #3452) e le estensioni di ricerca NIP-50 sono ora spogliate prima di querying SQLite FTS in modo che il motore di ricerca locale non singhiozzi più sulla sintassi dell’estensione lato server (PR #3464. I relè di ricerca predefinito vengono centralizzati ([PR #3446] (https://github.com/vitorpamplona/amethyst/pull/3446)).
Il terzo thread è l’integrazione del protocollo per i verticali di nicchia. Il supporto per gli eventi di bird-detection Birdstar (kind 2473) raggiunge un client Android (PR #3473 e gli stati di salvataggio della scheda di memoria PS1 possono essere pubblicati come eventi firmati sul tipo 38192 (PR #3482). Arrotondando la settimana: una impostazione di scrittura auto-applica il testo personalizzato ai messaggi (PR #3450), la visualizzazione delle notifiche desktop viene ridisegnata con i toast nativi del sistema operativo e un filtro condiviso (PR #3457), la colonna dei messaggi raccoglie un blocco della privacy ([PR #3432](ZXQ000
Buzz continua ad indurire il relè e definisce il tipo 44200 per le metriche di svolta dell’agente
Buzz (il progetto precedentemente chiamato Sprout) ha atterrato 123 PR si è fuso nella finestra dal 1 luglio al 7 luglio. Due fili portano la maggior parte del peso. Il primo è un nuovo tipo di evento per la telemetria dell’agente: [PR #1441] (https://github.com/block/buzz/pull/1441) definisce le metriche di rotazione dell’agente crittografato di NIP-AM durevoli come 44200, che atterrano la telemetria come evento firmato gli archivi di relè dell’utente, mantenendo metriche sull’infrastruttura di proprietà dell’utente. Un archivio locale per il tipo segue (PR #1555), il percorso di rimozione è fatto atomico (PR #1562), e il nome del modello è filettato attraverso il percorso di emissione in modo che i lettori a valle possano distinguere quale modello prodotto che gira (PR #1564.
Il secondo thread è le prestazioni del relè. La spedizione post-commissione è differita e viene evitato un clone di verifica (PR #1453), i viaggi rotondi DB ingeriti e fan-out sono in batch con gocce di ack misurate di p99 del 7 al 16 per cento e gocce di coda di p999 del 29 al 53 per cento rispetto alla punta precedente ([PR #1454] (ZXQ0001QXQXQXQ))) Oltre al lavoro perf, un set di icone dello spazio di lavoro per comunità che gli amministratori configurano e il relè serve tramite NIP-11 estende il documento di informazioni di NIP-11 con una superficie di personalizzazione per comunità (PR #1463), i proprietari di agenti possono eliminare i messaggi del loro agente in corrispondenza
Divine Video collega la verifica della firma del relè e un’estrazione NostrConnect
L’applicazione mobile di Divine Video (https://github.com/divinevideo/divine-mobile) ha unito 97 PR nella finestra, e il thread di Nostr-facing è l’indurimento del limite di fiducia più la pulizia dell’autenticazione. PR #5774 verifica le firme degli eventi di relè in entrata, chiudendo una classe di bug trust-in-the-relay; PR #5828 crittografa il token di spinta FCM nel tipo di evento di deregistrazione tipo di tipo di tipo di 3080, in modo che il dispositivo dell’utente token di token di token di token di cancellazione si blocca appare in chiaro Sul lato di autenticazione, PR #5826 estrae una NostrConnectCoordinator per il flusso nostrconnect://, pulendo il NIP-46 percorso di codice del bunker inizializzato del client prima di un più ampio refattore auth tracciato sotto [problema #4741](ZXQ000QXQ
Zap Cooking corregge il login del bunker NIP-46 e aggiunge la ricerca della ricetta NIP-50
Zap Cooking frontend ha unito 18 PR nella finestra lungo un tema: rendere le superfici Nostr auth recuperare dal fallimento. PR #503 corregge il login del bunker con un handshake di connessione esplicita, la gestione di authUrl e la navigazione degli errori in modo che un utente che collega un segnale esterno veda un messaggio di errore reale sul fallimento in cui il taglio precedente ha appeso la schermata di login. Un filetto di funzionalità separato atterra NIP-50 ricerca di ricette full-text tramite il retro del relè di ricerca dei nostrirchives (PR #483), lasciando un’interrogazione utente ricette attraverso il relè corpus senza un indice client-side. Contenuti-rendering polacco navi insieme: contenuto citato-nota e media ora si espongono direttamente nella nota principale sostituendo il precedente fallback sepolto-link (PR #491), le anteprime del link e il terreno di dimensionamento dell’hashtag (PR #492), le domande di ricerca multi-parola funzionano ([PR #482](X
swift-nostr-client v0.6.0 progredisce verso un primo taglio stabile
yysskk/swift-nostr-client spedito v0.6.0 insieme a 30 PR unite. La libreria Swift Nostr si avvicina ad una prima superficie stabile API per i client Swift Nostr che evitano di collegare gli strumenti MDK o MarmotKit.
Nostr Applet Protocol (NAPS) stringe NAP-OUTBOX Routing e Fanout
NAPS ha avuto una settimana di pulizia significativa, soprattutto in NAP-OUTBOX. L’intestazione è confini più stretti: meno routing controllato dal chiamante, meno dettagli del relè trapelato, e una forma di risultato evento condivisa che può trasportare suggerimenti relè e sidecar delle risorse, digitando NAP-RESOURCE. Anche la pubblicazione è più chiara: regole esplicite di outbox, inbox e relay fanout. Effetto netto: meno ambiguità, migliore interoperabilità.
Napplet Toolchain Tightens Protocol Alignment and Ships its CLI
Questa settimana, i pacchetti di Napplet si sono spostati da “utile SDK” verso una catena di strumenti di protocollo più stretta. La grande storia è allineamento con le specifiche NAP dal vivo: NAP-COUNT query support, Il ciclo di vita runtime di OutBOX, e RelayEventResult sidecars tutte atterrate, rendendo le letture e gli abbonamenti più precisi. Diversi domini sono stati affinati anche: supporto del registro CVM, buste di errore DM, contesto di sessione MEDIA, campi di conteggio LISTS, risultati del profilo COMMON e lo schema htree: RESOURCE. Su tooling, il nuovo @napplet/cli è una pietra miliare importante, aggiungendo la scoperta della configurazione, implementando la pianificazione, firmando, caricamenti Blossom e la generazione manifesta. Infine, il preludio shim iniettabile host e lavoro di prontezza JSR hanno reso lo stack piÃ1 facile da iniettare, pubblicare e verificare.
primal-android estende la superficie del segnale remoto
Primal Android ha unito 18 PR nella finestra. Sul lato Nostr, PR #1075 implementa i metodi switch_relays e logout per il ruolo del segnale remoto dell’app, estendendo la superficie del segnale NIP-46 di Primal. Il resto è UI lucidare attraverso la barra superiore e inferiore Home, Esplora suggerimenti e la schermata del profilo.
Wisp aggiunge un commutatore multi-account e test di parser Blossom
Wisp ha unito 9 PR. PR #604 aggiunge un switcher multi-account con un percorso di cancellazione esplicito sul flusso del conto aggiuntivo.
TAO e Wired sollevano il segnale PoW a 21 bit e le radici di superficie fresca-PoW
smolgrrr/TAO e smolgrr/Wired (lo stesso set di commit è atterrato in entrambe le repos) ha unito 13 PR. Questo è il secondo client Nostr questa settimana per appoggiarsi su NIP-13 come filtro di prima classe per il contenuto generato dall’utente, che completa il PoW canalizzato di Bitchat.
keep-android lucida NIP-46 UX e atterra una correzione TOCTOU
privkeyio/keep-android spedito v1.1.5 insieme a 13 PR fusi, poi v1.1.6 l'8 luglio pinning the sottostante mantenere il nucleo di v0.5.0. Keep è una volta mobile (copertaX29 v1.1.5 era UX polish sul flusso di sfida NIP-46. v1.1.6 chiude una gara di check-then-set (TOCTOU) in set_active_share dalla cassa di mantenimento sottostante, supera l’URL e il metodo che sono autorizzati sul NIP-98 HTTP-auth richiesta di approvazione in modo che un utente possa vedere quello che stanno firmando e commuta l’errore ZXQ0014QXXXXXXXZturn Un test strumentato copre l’interruttore di eliminazione del flusso di approvazione NIP-55. Le caratteristiche CLI v0.5.0 che sono arrivate con il rilascio sottostante (threshold-OPRF sbloccare, software DKG, HD FROST portafogli) non sono ancora in superficie nell’applicazione Android; v1.1.6 fornisce solo le correzioni di sicurezza.
Heartwood spedisce il ponte di firma relay-to-serial
forgesworn/heartwood v0.7.0 atterra il ponte di firma relay-to-serial che è stato in volo la scorsa settimana, cablaggio del piano dati HSM-mode per Bray’s serial-signer path PR #11 è il ponte stesso, [PR #13](XQXQXQX000
SafeBox pubblica un report sul progresso di Fase 3 e un runbook della prigione FreeBSD
SafeBox è una volta di dati portatile privata su Nostr che combina [NIP-47] (/it/topics/nip-47/) Nostr Wallet Connect, nAuth, nembed, e trasferimento di record via relè su QR e NFC in un servizio gestibile dall’operatore. A July 2026 progress report pubblicato il 6 luglio segna la Fase 3 come sostanzialmente completa: 49 commit sono atterrati dal rapporto di aprile, portando il repository a 1,136 commit, e i quattro impegni di ingegneria di Fase 3 (indurire gli esperimenti di Fase 2, sostenere istanze interoperabili, preparare per scala, aggiungere la disciplina di prodotto commerciale) sono ampiamente forniti. Il rapporto inquadra il prossimo passo come pilota delimitato, e rivela che un fornitore di telecomunicazioni sotto NDA sta esplorando un pilota di registri sanitari su SafeBox.
Il concreto Nostr-facing lavoro è atterrato in precedenza in Fase 3 ed è riassunto nel rapporto: mutando le azioni NWC sono ora in coda per evitare le razze di prova, Lightning fallito fonde protegge le prove prima di tornare, NWC ascoltatori di lunga durata aggiorna proattivamente in modo che una sessione sopravviva alla sua soglia di idle; il comportamento precedente è stato uno stallone ZXX Lo scambio record di QR e NFC ha ottenuto una specifica di flusso unificata che copre le modalità di presentazione, rappresentate dal mittente, e cross-device con la più chiara gestione KEM (Key Encapsulation Mechanism) e la riproduzione di protezione attraverso la libreria Open Quantum Safe. Il commit in-window è 6866dae, che aggiunge un FreeBSD dispiegamento della prigione e liboq costruiscono runbook accanto a una specificazione dell’apparecchio FreeBSD, che documenta le istantanee ZFS, l’isolamento del jail
Il rapporto annuncia inoltre [OpenETR] (https://github.com/trbouma/openetr) come un spin-off distinto che applica l’architettura crittografica-control-plus-portable-records di SafeBox ai record trasferibili elettronici: fatture di lading, ricevute di magazzino, note promissory e certificati. Il repo di OpenETR ha visto 7 commit il 7 luglio compreso ea612a9 che separa l’attestazione dal core record, ca153a3 sulla gestione dei mandati contro gli effetti, e ba84b61
Protocollo lavoro e aggiornamenti NIP
Merged: NIP-51 e NIP-37 allineano il nome tipo 10013
PR #2404 è una soluzione di consistenza solo prosa. In NIP-37, il tipo 10013 è chiamato Relay List for Private Content; in [NIP-51] (/it/topics/nip-51/) sotto Draft relays, lo stesso tipo è stato descritto con parole diverse. NIP-51 utilizza ora il nome NIP-37 per lo stesso tipo di evento. Nessun cambiamento di comportamento del filo e nessun nuovo tag semantics; il valore è che NIP-51 è la spec dell’ombrello per gli eventi a forma di lista e NIP-37 è il follow-up del contenuto privato e il nome sallineato tra i due rende facile da perdere che descrivono lo stesso tipo.
Aperto: NIP-AD Nostr Web Indirizzi tramite la ricerca ben nota
PR #2406 si apre come il successore di un PR chiuso #2393 con una bozza di spec completa a AD.md. NIP-AD definisce gli URL web che portano una controparte Nostr opzionale. Un client che vede un URL come https://golf.com/players richiede https://golf.com/.well-known/nostr.json?ad=/players, che restituisce un percorso di mappatura degli oggetti JSON a coppie {filter, relays}. Il filtro restituito è un filtro standard NIP-01 (generi, autori, #d, limit, ecc.), e i nomi di array relays che relays il client dovrebbe query. Con "limit": 1 l’URL si risolve in un singolo evento; senza di esso, in un elenco. In un normale browser web l’URL rende HTML come qualsiasi altro URL, quindi lo stesso dominio può servire utenti web e clienti Nostr da un percorso canonico. I casi di utilizzo indicati includono NIP-29 nomi di gruppo che risolvano ad un evento di tipo 39000 su un relè specifico (rimozione della necessità di un’agricoltura di gruppo id), NIP-5A nsite lookups, feed ospitati che pubblicano un filtro {"ids": [...]}, rendering nativo di eventi Il riuso .well-known/nostr.json più il layout path-as-object-key è scelto in modo che il risolutore possa essere un file statico.
Aperto: NIP-86 gestione del reclamo per i codici di invito
PR #2408 propone l’aggiunta di tre metodi a NIP-86: listclaims (parami [], restituisce una serie di NIP-43 codici di invito), ZXQ000Q000 Oggi NIP-86 permette ad un amministratore relè di gestire gli utenti e gli incarichi di ruolo, ma non ha una superficie di codice invito. Il caso di utilizzo dell’autore PR è onboarding community-relay: un amministratore crea un codice di invito associato a un ruolo, raccoglie il pagamento prima che l’identità dell’utente sia creata, consegna il codice di invito all’utente, e un robot ascolta per il tipo risultante 28935 evento di rivendicazione sul relè e auto-assegna il ruolo. I tre metodi permettono che il flusso avvenga interamente attraverso la gestione del relè RPC.
Aperto: colore del ruolo come (h, s, l) tuple
PR #2402 cambia il formato di colore del ruolo in NIP-43 da un singolo valore hue (0 a 360) a una tupla di hue (0 a 360), saturation (0 a 1), e lightness (0 a 1). Le stringhe vuote sono consentite per qualsiasi componente in modo che i clienti possano fornire i propri default per una tavolozza coerente, e il testo spec raccomanda di fornire solo hue a meno che non si desideri un colore specifico come l’argento. I filetti di cambiamento attraverso NIP-86 nello stesso PR: createrole e editrole ora prendere [id, label, description, [h, s, l], order]; la firma precedente ha portato un parametro a singolo colore nella stessa slot. La motivazione è che l’hue da solo costringe i clienti a scegliere saturazione e leggerezza per l’operatore, così diversi clienti rendono lo stesso ruolo a intensità visibilmente diverse.
Open: NIP-80 comprovata provenienza dei media
PR #2409 apre NIP-80, formato evento per la provenienza dei media ancorata nell’hardware di cattura. Una fotocamera firma ogni foto al momento della cattura e pubblica la prova per relè keyed dal contenuto stesso, quindi la verifica sopravvive a metadati stripping, re-hosting e takedown della piattaforma. La proposta definisce sei nuovi tipi di eventi: tipo 1080 per le attestazioni di cattura, tipo 1081 per le attestazioni di derivazione che coprono le operazioni di ridimensionamento, coltura, ricompressione o riformulazione (con modalità di rivelazione o opzione zero-knowledge), tipo 1082 per le revocazioni (eventi normari, permanenti, auto-scoped, monotonici), tipo 11080 per gli annunci di dispositivo, tipo 31080 per le suddivisioni anonimesse e tipo di dispositivo, e tipo sperimentale 31081 per un dispositivo per una specie per un dispositivo per un tipo di attestazioni per un insieme per un tipo sperimentale per un tipo di attestazioni per un tipo di corrispondenza per un insieme di attestazioni. I primitivi riutilizzati includono NIP-94 x-tag semantics, NIP-92 imeta, NIP-65 per la scoperta della revoca, [Blossom](XQX000 Il modello di firma accoppia una chiave di dispositivo BIP-340 con una chiave di ECDSA hardware perché gli elementi di sicurezza tradizionali non producono ancora firme BIP-340 (Microchip ATECC608 supporta P-256, NXP SE050 supporta secp256k1 ma solo moduli ECDSA, TPM 2.0 e Infineon OPTIGA Trust M cover P-256/RSA, Apple SecureBox Pnclave e Android6). L’ambito dichiarato esplicitamente non tenta di dimostrare che la scena è reale: un’attestazione dimostra che questa immagine esatta è venuta da questo dispositivo a circa questo tempo ed è stata modificata solo in modi dichiarati, provabili, e la specifica vieta ai clienti di collassare i risultati in un distintivo “autentico”. Un prototipo di lavoro OpenVeilCam, una fotocamera Rust runtime per Raspberry Pi utilizzando l’elemento sicuro ATECC608, è in fase di aggiornamento per pubblicare i tipi di evento proposti insieme a un verificatore standalone.
Aperto: Indurimento paginazione NIP-01
PR #2407 aggiunge una sottosezione “Pagination & limit” a NIP-01. Le regole concrete: un relè che impone un massimo limit MUST lo imposta più grande del maggior numero di eventi che condividono un singolo created_at nel suo database, quindi nessun secondo può riempire una pagina e la paginazione dello stallo. I clienti che riprendono le richieste MUST ripetono con until = oldest (inclusive) e MUST deduplicate da id (dal momento che il secondo più vecchio è ri-fetched ogni round), e la paging è completa quando un round non produce nuovi eventi dopo la deduplica. Se una pagina completa ha eventi più vecchi e più recenti che condividono uno created_at, il client DOVE riprovare che secondo con un limit più grande, e se il relè blocca il più grande limit e restituisce ancora una pagina limitata a un secondo, il client DEVE o avanzare con until = oldest - 1 (trattando eventi non recuperati come caduto) o aborti. Normale paging NON impostare limit; il massimo relè è autorevole, e un valore più piccolo reintroduce la stalla. Aumentare limit per drenare un secondo bloccato è l’unica eccezione. Questo problema è risolto perché un ingenuo since/until cursore manca o eventi con timestamp duplicati o li rielaborazione, e l’attuale testo NIP-01 non dice a entrambi i lati come sfuggire alla trappola.
NIP Deep Dive: NIP-13 (Proof of Work)
NIP-13 definisce un meccanismo di prova di lavoro per gli eventi Nostr. Esiste perché lo spam in stile e-mail è banale per produrre su una rete di relè pubblico: chiunque può generare un keypair e inondare un argomento, e non c’è alcun costo economico per evento. NIP-13 permette a un autore di eventi di imporre un costo computazionale per caso che uno spammer dovrebbe pagare in aggregato ma un mittente regolare paga solo una volta per messaggio. I relè e i clienti possono quindi richiedere o preferire eventi che soddisfano una soglia di difficoltà.
Il meccanismo
Un autore di eventi sceglie un target di difficoltà espresso in bit e mine l’id dell’evento (l’hash sha256 dell’evento serializzato) fino a quando non ha almeno che molti puntali zero. Poiché l’ID dell’evento include il timestamp created_at, i tag e il contenuto, l’estrazione mineraria richiede di cambiare qualcosa nel corpo dell’evento per cercare lo spazio hash. NIP-13 definisce un tag nonce per esattamente questo scopo:
["nonce", "<nonce_value>", "<target_bits>"]
La nonce_value è qualsiasi stringa che sceglie il minatore; la target_bits è la difficoltà a cui il minatore si è impegnato. Un verificatore conta i principali zero bit dell’evento id e confronta target_bits. Lo target_bits nel tag è un reclamo, e un verificatore misura l’effettivo numero di primo zero dell’id per confermarlo.
Il numero di bit zero leader in un output casuale sha256 segue una distribuzione geometrica: ogni bit aggiuntivo raddoppia il lavoro previsto. 8 bit media 256 hash tentativi, 20 bit media circa un milione, e 28 bit media circa 268 milioni. L’obiettivo 8 bit di Bitchat per i messaggi geohash-channel costa sotto un millisecondo di CPU sull’hardware moderno e completa sotto qualsiasi latenza percettibile. Il default di TAO e Wired è di circa due milioni di tentativi di hash per post, che è veloce su un computer portatile ma costoso in scala per una fattoria del robot. NIP-13 non richiede una difficoltà; ogni relè e cliente sceglie la propria.
Esempio evento
Un minimo NIP-13-mined tipo-1 nota sembra:
{
"id": "000000000e9d97a1ab09fc381030b346cdd7a1a8a6f27c9c88f68c8b9d0f6c8a",
"pubkey": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2",
"created_at": 1720368000,
"kind": 1,
"tags": [
["nonce", "72847", "28"]
],
"content": "hello, this cost me 28 bits of PoW",
"sig": "b1a5c9c74cff59f8a48e5c3b3d8e1c8e7e2c1d4a8e2b9f7d1c3e8b4f6a2c8d1e9f4b3c7a1d8e5b2f9c6a3d7e1b8f4c9a2d6e3b7f1c8a4d9e2b5f8c1a7d4e6b9f3c2"
}
Lo id inizia con sette zero esadesi (28 bit zero principali, corrispondenti allo target_bits nel tag nonce). Il minatore ha variato la nonce_value 72847 fino a quando l’id ha raggiunto l’obiettivo. Un verificatore hash l’evento serializzato e conferma che l’id ha almeno 28 bit zero principali, quindi verifica la firma. NIP-13 non aggiunge nuovi campi; aggiunge il tag nonce e limita il conteggio a zero bit dell’id.
Dove viene utilizzato
La versione 1.5.4 di Bitchat utilizza PoW a 8 bit su messaggi geohash-channel tipo 20000: in uscita invia il tag prima di pubblicare e in entrata eventi con convalidato PoW rilassare il limite di assunzione per-sender. TAO e Wired utilizzano PoW a 21 bit come la soglia di default post-segnale e le radici di mangimi di superficie da attività PoW fresca, trattando PoW come segnale di graduazione della linea temporale. cagliostr applica NIP-13 allo strato di relè, rifiutando gli eventi sotto una soglia. NoStrudel espone un’impostazione di estrazione client PoW per gli autori che vogliono segnalare il filtraggio dei clienti. Damus e Amethyst calcolano i bit dello zero durante la visualizzazione degli eventi, permettendo a un utente di vedere l’impegno PoW sulle note. Coracle espone PoW sia per l’estrazione mineraria che per il filtraggio. NDK e nostr-tools espongono PoW ai consumatori di biblioteche.
La proprietà di progettazione che modella l’implementazione di NIP-13 è che PoW è impercettibile: una pretesa di target_bits conta come prova solo quando l’id ha molti zeri principali, e una contraffazione richiede di ridare il lavoro. Questa proprietà consente a Bitchat di utilizzare in entrata PoW come un relax tasso-limite anche quando uno spammer rivendica un’alta difficoltà; il controllo è un conteggio hash, non una decisione di fiducia. La proprietà complementare è che PoW non impegna il minatore a qualsiasi specifico pubkey o contenuto; uno spammer può ancora scegliere di mine a 8 bit e masterizzare la computazione, ma la computazione è un costo reale. NIP-13 sposta il problema spam da “impossibile” a “quantificabile” e consente ai clienti di impostare il proprio prezzo.
NIP Deep Dive: NIP-40 (Expiration Timestamp)
NIP-40 definisce un tag expiration che istruisce un relè e un client che un evento dovrebbe essere considerato scaduto dopo una data timestamp Unix. Esiste perché gli eventi Nostr sono altrimenti permanenti: una volta che un evento firmato atterra su un relè, l’unico modo per rimuoverlo è un evento di cancellazione NIP-09, e anche allora un relè può mantenere l’originale. NIP-40 permette a un autore di dichiarare in tempo di pubblicazione che un evento è di breve durata, e chiede relè per smettere di servire e clienti per smettere di visualizzarlo dopo il timestamp.
Il meccanismo
Un autore aggiunge un tag expiration a un evento:
["expiration", "<unix_timestamp>"]
Il timestamp è Unix secondi. Un relè MAY rifiuta eventi la cui scadenza è già in passato all’ingestione, MAY smettere di servire eventi la cui scadenza è passata, e SHOULD rispettare la scadenza dichiarata dell’autore. Un client SHOULD nascondere gli eventi scaduti dall’utente. NIP-40 non richiede il relè per eliminare l’evento, e non sovrappone NIP-70 semantica protetta-evento; è un suggerimento più un contratto morbido.
Il tag vive sull’evento stesso (o nel caso di messaggistica avvolta, sull’involucro esterno). NIP-40 non definisce la semantica cancellata; l’evento rimane un evento firmato che chiunque lo abbia può ancora leggere. Ciò che NIP-40 offre è un’attesa coordinata che il relè e il cliente smetteranno di navigare dopo la scadenza. Questo rende NIP-40 utile per i post effimeri, annunci tempestivi, note di evento dal vivo che dovrebbero smettere di essere serviti dopo l’evento, e messaggi diretti NIP-17 che non dovrebbero soffermarsi oltre un orizzonte dichiarato.
Interazione con confezione regalo
Il PR rust-nostr che è atterrato questa settimana ([PR #1384] (https://github.com/rust-nostr/nostr/pull/1384)) è uno studio di caso in come NIP-40 interagisce con NIP-59 confezione regalo. NIP-59 definisce una busta a due strati: un evento tipo: 13 “seal” firmato dalla chiave reale del mittente e un evento tipo:1059 “gift wrap” firmato da una chiave effimera. Entrambi gli strati hanno randomizzato i valori created_at, fino a 48 ore prima del tempo reale di invio, quindi un osservatore di relè non può recuperare il vero timestamp di invio. NIP-59 manda che il sigillo ha tag vuoti.
Questo mandato è il motivo per cui il tag di scadenza deve andare sul pacco regalo e rimanere fuori dal sigillo, e perché ancorare il tag al tempo reale di invio sarebbe sconfiggere la privacy dei tempi del pacco regalo: se un chiamante passa un timestamp di scadenza assoluta, un osservatore sottrae il TTL previsto del chiamante e recupera il tempo reale di invio. La decisione di progettazione di rust-nostr è di esporre lo API come Duration dal chiamante, quindi calcolare expiration = wrap.created_at + duration all’interno della libreria. created_at dell’involucro è già randomizzato all’interno della libreria, quindi il timestamp di scadenza eredita la stessa randomizzazione e non perde il vero tempo di invio.
Esempio evento
Un esempio minimo di NIP-40 su una nota tipo-1:
{
"id": "1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b",
"pubkey": "82341f882b6eabcd2ba7f1ef90aad961cf074af15b9ef44a09f9d2a8fbfbe6a2",
"created_at": 1720368000,
"kind": 1,
"tags": [
["expiration", "1720454400"]
],
"content": "this note expires in 24 hours",
"sig": "d2e5b8a1c4f7b0d3e6a9c2f5b8d1e4a7c0f3b6d9e2a5c8f1b4d7e0a3c6f9b2d5e8a1c4f7b0d3e6a9c2f5b8d1e4a7c0f3b6d9e2a5c8f1b4d7e0a3c6f9b2d5e8a1"
}
created_at è il timestamp Unix della pubblicazione; il tag di scadenza dice che l’evento dovrebbe smettere di essere servito 86.400 secondi (24 ore) più tardi. Un relè che rispetta NIP-40 smette di restituire questo evento a REQs dopo 1720454400, e un client che rispetta NIP-40 lo nasconde dall’utente dopo quel tempo.
Dove viene utilizzato
I costruttori rust-nostr (GiftWrapBuilder, PrivateDirectMessageBuilder) ora espongono la scadenza come parametro Duration di prima classe. NDK espone un helper di scadenza per i costruttori di tipo 1 e DM. nostr-tools ha una coppia getExpiration e isExpired per la lettura e il rafforzamento del tag. strfry, nostr-rs-relay, khatru e altre implementazioni di relè rispettano NIP-40 nella gestione di REQ (rigettura o o omissione di eventi scaduti a seconda della politica dell’operatore). Damus, Amethyst, noStrudel, Coracle e Primal tutti gli eventi scaduti dal loro rendering timeline. client di Live-attività come zap.stream utilizzare NIP-40 sugli eventi di chat tipo-1311 associati in modo che una chat dal vivo si ferma persistente dopo la fine del flusso.
La proprietà di progettazione che atterra NIP-40 pulito nella maggior parte delle implementazioni è che è opt-in per evento e non richiede distribuzione coordinata. Un autore può aggiungere il tag oggi; un relè che onora che ottiene un set di lavoro più pulito; un relè che lo ignora non fa peggio di prima; e un cliente che nasconde eventi scaduti dà all’autore ciò che hanno chiesto. Il cambiamento rust-nostr di questa settimana rafforza che il posizionamento del tag è importante tanto quanto la sua presenza: in una busta di conservazione della privacy come l’involucro regalo NIP-59, il tag siede sullo strato il cui timestamp è già randomizzato, e la superficie API impedisce a un chiamante di perdere accidentalmente un vero timestamp di nuovo nella fascia.
E’ tutto per questa settimana. Costruire qualcosa o avere notizie da condividere? Raggiungere via NIP-17 DM o trovarci su Nostr.