qub Protokollýsing
qub er ein protokoll fyri kryptografiskar tíðarbundnar bindingar: ein skipan til at innsigla orð til ein framtíðardag og seinni vátta nágreiniliga, hvat varð innsiglað, hvør drand-umfar stýrdi útgávuni, og—tá ein goymslutransaktión ella eitt prógv úr gjøgnumskygni-logginum er tøkt—eitt sjálvstøðugt tíðarstemplað evsta mark fyri, nær dulmálsteksturin varð bundin.
Tríggjar grundeindir fáa tað at virka. drand er ein desentraliseraður tilvildarviti—avdúkingardagurin verður framfylgdur dulmálsliga heldur enn av góðvilja qubs. Varandi goymsla saman við einum gjøgnumskygni-loggi, sum bara kann vaksa, varðveitir innsiglaðu bætini og ankrar bólkaðar bindingar í varandi almennari goymslu; tann goldna T3-leiðin skrivar eisini eina einstaka varandi goymslutransaktión. ML-DSA-65 er ein post-kvanta talgild undirskrift—tá ið høvundskapur er virkin, er qubið bundið at einum lyklapari, hvørs loyndarmál ongantíð fer av eind høvundans.
Saman gera hesar grundeindir eina frágreiðing, sum er tíðarlæst og manipulatiónsávísandi, kann hava høvund og kann tíðarstemplast sjálvstøðugt—ein kvittan, hvørs virði veksur, so hvørt sum førleikin hjá heiminum at smíða fortíðina batnar.
Restin av hesum skjali er tann normativa fyriskipanin, sum krevst fyri samvirkandi ímótkomningar.
qub Protokoll Fyriskipan
| Teigur | Virði |
|---|---|
| Skjalaútgáva | 1.0.0 (protocol-v1.0.0) |
| Tráðaprotokollur | 0x01 |
| Ytri umbúgving | 0x01 |
| Gildiskomudagur | 2026-09-23 |
| Støða | Galdandi |
| Eftirkannað fram til | 2026-09-23 |
Hetta skjalið er tann normativa protokollfyriskipanin fyri qub tíðarbundnu bindingarskipanina. Hon ásetir dátubygnaðir, raðfestingarreglur, avleiðingarformlar og verifikatiónsmannagongdir, sum krevjast fyri samvirkandi ímótkomningar.
Umfang: protokollagið er við vilja málneutralt — qub-likamið er ógjøgnumskygt reintekstur / markdown / pakt-bæti, og staðbundin framsýning er ábyrgd vísarans (qub.social vevtænasta, <qub-embed> iframe, MCP-klientar, o.s.fr.).
1. Teknleiðing og Vanir
| Teknleiðing | Merking |
|---|---|
u8, u64, i64 |
Tekn-/tekleys heiltøl við ásettari bitabreidd |
[u8; N] |
Fastlongdar bætibrá av N bætum |
Vec<u8> |
Broytilig-longdar bætibrá |
Option<T> |
Virði av slag T, ella fráverandi |
String |
UTF-8 tekstrein, NFC-normaliserað |
| ` | |
SHA3-256(x) |
NIST SHA3-256 stytting av bætisreini x (FIPS 202) |
ceil(x) |
Loftfunksjón: minsta heiltal ≥ x |
| CBOR | Concise Binary Object Representation (RFC 8949) |
| big-endian | Mest týðandi bæti fyrst |
Øll heiltøl í forímyndabygningum verða raðfest sum big-endian fastbreiddar bætibráir (i64 → 8 bæti, u8 → 1 bæti) uttan so at annað er ásett.
Øll tíðarmerki eru Unix-sekund í UTC.
2. Dátubygnaðir
2.1 ComposeQub (innminnisstøða hjá høvundi)
Ikki raðfest til CBOR. Ikki skrivað til varandi goymslupláss. Staðbundið hjá høvundaappini.
ComposeQub {
draft_id: [u8; 16], // Random, generated locally
created_at: i64, // Unix seconds UTC
unlock_at: Option<i64>, // Unix seconds UTC; None while composing
visibility: u8, // 0x00 = private; 0x01 = public
content_type: u8, // 0x01 text; 0x03 pact; 0x04 verdict
plaintext: Vec<u8>, // Raw body bytes (UTF-8 for text)
sender_label: Option<String>, // Display name; V2-signed when authorship is enabled
title: Option<String>, // Plaintext countdown title; bound via title_hash
reply_to: Option<[u8; 32]>,// Parent qub_id; V2-signed when authorship is enabled
outcome_at: Option<i64>, // Optional future judgment time; bound to qub_id
status: DraftStatus, // Composing | Sealed | Uploaded | Failed
}
2.2 QubEnvelope (Avkrypterað Nýttulast)
Raðfest við kanoniskum CBOR (§3). Krypterað innan í SealedQub. Hetta er bygnaðurin, sum prógvar innihaldsheild eftir avkryptering.
QubEnvelope {
version: u8, // Protocol major version (0x01 for v1)
qub_id: [u8; 32], // Derived (see §4.1)
content_type: u8, // Content type registry (see §6)
created_at: i64, // Unix seconds UTC
unlock_at: i64, // Unix seconds UTC
outcome_at: Option<i64>, // When reality renders judgment; bound to qub_id
sender_label: Option<String>, // Not in qub_id; V2-signed when authorship is enabled
reply_to: Option<[u8; 32]>,// Parent qub_id; not in qub_id; V2-signed when present
body: Vec<u8>, // UTF-8 text or canonical CBOR pact/verdict body
body_hash: [u8; 32], // SHA3-256(body) (see §4.2)
sig_alg: u8, // Signature algorithm (see §9.2)
author_signature: Option<Vec<u8>>, // Set when sig_alg != 0x00
author_pubkey: Option<Vec<u8>>, // Set when sig_alg != 0x00
cosigner_pubkey: Option<Vec<u8>>, // Set for cosigned pact bilateral agreements
cosigner_signature: Option<Vec<u8>>, // Set for cosigned pact bilateral agreements
}
Grundlinja (óundirskrivaður tekst-qub): version = 0x01, content_type = 0x01, sig_alg = 0x00, allir Option-teigar fráverandi.
Aðrar v1-uppsetingar: content_type = 0x03 (pakt-likam, sí §6.1); sig_alg = 0x01 (ML-DSA-65) við author_signature og author_pubkey til staðar (sí §9.3); cosigner_pubkey og cosigner_signature til staðar saman fyri samundirskrivaðar paktir (sí §9.7); reply_to sett til foreldur-qubsins qub_id fyri svarkeðju-qub-ar (sí §9.3 fyri avleiðingarnar fyri undirskriftarumfangið).
2.3 SealedQub (Kanoniskt Tráðasnið)
Raðfest við kanoniskum CBOR (§3). Hetta er innara tráðartefaktið: almenn veiting goymir hesi bætini ber, meðan privat veiting pakkar tey inn í OuterWrapper undan goymslu (§13).
SealedQub {
version: u8, // Protocol major version (0x01 for v1)
qub_id: [u8; 32], // Same as QubEnvelope.qub_id
visibility: u8, // 0x00 = private/wrapped; 0x01 = public/bare
unlock_at: i64, // Unix seconds UTC
outcome_at: Option<i64>, // Surfaced on the verdict-watch CTA
// before reveal; mirrors QubEnvelope.outcome_at;
// bound to qub_id via the §4.1 preimage.
drand_chain_id: String, // drand chain hash (hex string)
drand_round: u64, // Target drand round number
drand_chain_version: Option<u8>, // W3 — chain-migration version. Absent / 0 = quicknet
// (the only chain today). Lets a future chain swap
// be expressed on the wire without a breaking format
// change. NOT part of the §4.1 qub_id preimage, so its
// addition never alters an existing qub's identity.
tlock_ciphertext: Vec<u8>, // tlock-encrypted QubEnvelope CBOR bytes
recipient_pubkey: Option<[u8; 32]>,// Reserved field; accepted by canonical CBOR
// but not interpreted by the v1 reference viewer
title: Option<String>, // Plaintext title surfaced on the viewer
// countdown before reveal. Bound to qub_id
// via title_hash (§4.1). 1..=100 NFC code
// points, no hostile/control code points.
}
2.4 RevealedQub (Vísara Applikatiónsstøða)
Ikki raðfest til CBOR. Staðbundið hjá vísaraappini. Bygt eftir væleydnaða avkryptering og verifikatión.
RevealedQub {
qub_id: [u8; 32],
arweave_tx_id: String,
visibility: u8,
content_type: u8,
created_at: i64,
unlock_at: i64,
outcome_at: Option<i64>, // Carried from both wire layers; drives the verdict-watch block
drand_chain_id: String,
drand_round: u64,
sender_label: Option<String>,
title: Option<String>, // Carried forward from SealedQub.title
reply_to: Option<[u8; 32]>,
body: Vec<u8>,
body_hash: [u8; 32],
body_hash_verified: bool,
author_signature: Option<Vec<u8>>,
author_pubkey: Option<Vec<u8>>,
signature_verified: Option<bool>,
cosigner_pubkey: Option<Vec<u8>>,
cosigner_signature: Option<Vec<u8>>,
cosigner_verified: Option<bool>,
}
3. Kanoniska CBOR-Profilið
Øll SealedQub- og QubEnvelope-raðfesting MÁ samsvara hesum profili. Tveir ímótkomningar, sum fáa sama logiska bygnaðin, MÚGVA framleiða eins bæti.
3.1 Raðfestingarreglur
| Regla | Fyriskipan |
|---|---|
| Støðil | RFC 8949 §4.2.1 (Core Deterministic Encoding Requirements) |
| Kortlyklaraðseting | Raðað eftir raðfestari bætilongd fyrst (stytri fyri longri), so leksikografiskt (bæti fyri bæti fyri raðfestingar av sömu longd) |
| Heiltalsraðfesting | Stytsta formi: 0–23 í byrjanarbæti; 24–255 í 2 bætum; 256–65535 í 3 bætum; o.s.fr. |
| Longdarraðfesting | Bert ávísar longdir. Ongar óávísar-longdar brár, kort, bætisreinir ella tekstreinir (eyka-upplýsing = 31 er forboðin). |
| Tag | Ongi CBOR-tag (høvuðsslag 6 er forboðið). |
| Flótipunkt | Ongi flótitøl (høvuðsslag 7 virði 0xF9–0xFB eru forboðin). |
| Tekstreinir | UTF-8-raðfestar, NFC-normaliseraðar (Unicode Normalization Form C). |
| Bætisreinir | Rá bæti. Ongin base64-raðfesting á CBOR-laginum. |
| Tvífaldir lyklar | Avvís við feili. Tólkarar MÚGVA IKKI tigandi taka ímóti tvífaldum kortlyklum. |
| Ókendir lyklar | Avvís við feili. Tólkarar MÚGVA IKKI tola kortlyklar uttan fyri slagsins kanoniska lyklasett — tvær ymiskar kanoniskar bætisreinir mugu ongantíð avkoda til sama virði (encode(decode(x)) == x), og fyri undirskrivað likam hevði ein eyka lykil verið fjalt innihald, sum báðar undirskriftirnar binda seg at. Skemamenning fer ígjøgnum version, ongantíð gjøgnum eyka lyklar. |
| Einføld virði | Bert true (0xF5), false (0xF4) og null (0xF6) eru loyvd. |
| Valfríir teigar | Fráverandi valfríir teigar verða slept burtur úr CBOR-kortinum heilt og holt (ikki raðfestir sum null). Tilstaðarverandi valfríir teigar verða tiknir við í raðaðari lyklaraðseting. |
3.2 Verifiseraðar Kanoniskar Lyklaraðsetingar
Hesar lyklaraðsetingar eru normativar. Ímótkomningar MÚGVA senda lyklar út í júst hesi raðseting. Avlúsingar-staðfestingar EIGA at verifisera raðsetingina í ikki-útgávubygdum.
QubEnvelope (útgáva 0x01, óundirskrivaður, allir valfríir teigar fráverandi):
"body" (5 encoded bytes)
"qub_id" (7 encoded bytes)
"sig_alg" (8 encoded bytes)
"version" (8 encoded bytes)
"reply_to" (9 encoded bytes) ← only if present (reply chains)
"body_hash" (10 encoded bytes)
"unlock_at" (10 encoded bytes)
"created_at" (11 encoded bytes)
"outcome_at" (11 encoded bytes) ← only if present (verdict mechanic)
"content_type" (13 encoded bytes)
"sender_label" (13 encoded bytes) ← only if present
"author_pubkey" (14 encoded bytes) ← only if present
"cosigner_pubkey" (16 encoded bytes) ← only if present (pact cosign)
"author_signature" (17 encoded bytes) ← only if present
"cosigner_signature" (19 encoded bytes) ← only if present (pact cosign)
QubEnvelope lyklaraðsetingaravleiðing: hvør lykil er ein CBOR-tekstrein. Raðfest longd = 1 bæti høvur + reinlongd (fyri reinir undir 24 bætum). Raða eftir samlaðari raðfestari longd fyrst, so leksikografiskt fyri lyklar av sömu longd.
SealedQub (útgáva 0x01, alment, eingin móttakari):
"title" (6 encoded bytes) ← only if present
"qub_id" (7 encoded bytes)
"version" (8 encoded bytes)
"unlock_at" (10 encoded bytes)
"outcome_at" (11 encoded bytes) ← only if present (verdict mechanic)
"visibility" (11 encoded bytes)
"drand_round" (12 encoded bytes)
"drand_chain_id" (15 encoded bytes)
"recipient_pubkey" (17 encoded bytes) ← only if present
"tlock_ciphertext" (17 encoded bytes)
"drand_chain_version" (20 encoded bytes) ← only if present (W3; absent = quicknet)
PactTerms (pakt-likam, content_type 0x03):
"notes" (6 encoded bytes) ← only if present
"terms" (6 encoded bytes)
"title" (6 encoded bytes)
"party_a" (8 encoded bytes)
"party_b" (8 encoded bytes)
"pact_version" (13 encoded bytes)
PactTerm (rað í terms-bránni):
"key" (4 encoded bytes)
"value" (6 encoded bytes)
PartyIdentifier (party_a / party_b kort):
"label" (6 encoded bytes)
"contact" (8 encoded bytes) ← only if present
3.3 Bætiraðfestingarúrtak
| Slag | CBOR-raðfesting | Dømi |
|---|---|---|
| SHA3-256 stytting (32 bæti) | 0x58 0x20 + 32 bæti |
body_hash, qub_id |
| Tíðarmerki (i64) | Høvuðsslag 0 (positivt) ella 1 (negativt), stytsta raðfesting | Unix-sekund |
| Útgáva (u8, virði 1) | 0x01 (eitt bæti) |
|
| Innihaldsslag (u8, virði 1) | 0x01 (eitt bæti) |
|
| sig_alg (u8, virði 0) | 0x00 (eitt bæti) |
|
| ML-DSA-65 undirskrift (3.309 bæti) | 0x59 0x0C 0xED + 3.309 bæti |
author_signature, cosigner_signature |
| ML-DSA-65 alment lyklað (1.952 bæti) | 0x59 0x07 0xA0 + 1.952 bæti |
author_pubkey, cosigner_pubkey |
4. Normativar Avleiðingar
4.1 qub_id
qub_id eyðmerkir ein qub einstaknliga og bindir QubEnvelope at SealedQub. Hann verður avleiddur deterministiskt úr brævainnihaldinum.
qub_id = SHA3-256(
"QUB_ID_V2" || // domain separator: ASCII bytes [0x51 0x55 0x42 0x5F 0x49 0x44 0x5F 0x56 0x32] (9 bytes) + 0x00 padding (1 byte) = 10 bytes
version || // u8 (1 byte)
content_type || // u8 (1 byte)
created_at || // i64 big-endian (8 bytes)
unlock_at || // i64 big-endian (8 bytes)
outcome_at_or_zero || // i64 big-endian (8 bytes; 0 when outcome_at is absent)
drand_round || // u64 big-endian (8 bytes)
body_hash || // [u8; 32] (32 bytes)
title_hash // [u8; 32] (32 bytes; absent-sentinel = [0u8; 32])
)
// Total preimage: 108 bytes → 32-byte output
Økisskiljara-raðfesting: Reinurin "QUB_ID_V2" er 9 ASCII-bæti. Eitt einstakt 0x00 fyllibæti verður lagt aftanat at náa 10 bæti fyri samrøðing. Ímótkomningar MÚGVA brúka júst hesi 10 bæti: [0x51, 0x55, 0x42, 0x5F, 0x49, 0x44, 0x5F, 0x56, 0x32, 0x00].
outcome_at-raðfesting: V1.1 víðkaði forímyndina úr 92 til 100 bæti fyri at fella tann valfría outcome_at-teigin inn í bindingina. Fráverandi outcome_at verður raðfest sum 8 núll-bæti; protokoll-váttararnir avvísa outcome_at <= 0 allastaðni, so hetta varðveitslin kann ikki rekast saman við einum lógligum virði. Sí §3.2 (tráðasnið) og tað innantrægra tasks/verdict-uplift-plan.md fyri tann dóma-mekanismin, sum krevur hendan teig.
drand_round-raðfesting: V1.2 víðkaði forímyndina úr 100 til 108 bæti fyri at fella drand_round (tann ætlaða drand-rundu, §4.3) inn í bindingina, og økti økisskiljaran til QUB_ID_V2. Hetta bindur tíðarlás-rundina inn í qub-samleikan: ein gátt kann ikki binda dulorðstekstin aftur til eina aðra rundu (t.d. eina longu gingna) enn tað, sum vístu unlock_at ímplikerar. Avlæsingarprotokollurin (§8) váttar harumframt, at tann runda, sum er bakað inn í tlock-dulorðstekstins stanza, samsvarar unlock_round(unlock_at), so tann vístu avlæsingartíðin er prógvanliga tann runda, sum gáttar avkrypteringina.
Eginleikar:
- At broyta nakran teig í QubEnvelope (likam, tíðarmerki, innihaldsslag, útgáva) framleiðir ein annan qub_id.
- qub_id verður roknaður áðrenn krypteringina. Bæði QubEnvelope og SealedQub bera sama qub_id. Vísarin verifiserar, at teir samsvara, eftir avkryptering.
- qub_id veltur ikki á
sender_label,author_signatureellaauthor_pubkey. Hetta merkir, at sama innihald innsiglað á sama tíðspunkti framleiðir sama qub_id, óansæð hvør undirskrivar tað. - At broyta SealedQub
title(við øllum øðrum fastsettum) broytirqub_idgjøgnumtitle_hash. Ein gátt kann tí ikki skifta reintekst-heitið, sum verður víst á niðurteljingini, uttan at gera qub-eyðmerkingina ógilduga. - At broyta SealedQub
outcome_at(við øllum øðrum fastsettum) broytirqub_idgjøgnum forímyndina. Ein gátt kann ikki skifta tann dóma-dagin, sum verður vístur á niðurteljingini áðrenn avdúkingina, uttan at gera qub-eyðmerkingina ógilduga. - At broyta
drand_round(við øllum øðrum fastsettum) broytirqub_idgjøgnum forímyndina. Ein gátt kann ikki binda tíðarlás-dulorðstekstin aftur til eina aðra rundu uttan at gera qub-eyðmerkingina ógilduga; saman við §8 avlæsingartíðar-stanza-rundu-kanningini er tann vístuunlock_attann runda, sum veruliga gáttar avkrypteringina.
4.2 body_hash
body_hash = SHA3-256(body)
Har body er tann ráa Vec<u8> innihaldsnýttulastin. Fyri tekst-qub-ar er hetta tann UTF-8-raðfesta qub-likamið.
4.2.1 title_hash
title_hash = SHA3-256(NFC(title).utf8_bytes) if title is present
title_hash = [0u8; 32] if title is absent
Har title er tað valfría reintekst-heitið, sum verður víst á vísara-niðurteljingini áðrenn avdúkingina (sí §3.2). NFC-normalisering koyrir á styttingartíðspunkti, so styttingin er støðug yvir sjónliga-javnvirði kodupunkt-raðir. Allir-núll varðveitslin er varðveitt fyri fráverandi førið; ein tómur reinur verður avvístur á kanoniska CBOR-markinum sum ein ikki-kanonisk raðfesting av "fráverandi" (tann kanoniska raðfestingin sleppir teiginum heilt burtur).
4.3 Avlæsingarrunda-Kortlegging
drand_round = floor((unlock_at - chain_genesis_time) / chain_period_seconds) + 1
| Parametur | Kelda | Dømi |
|---|---|---|
unlock_at |
Brúkara-valdar Unix-sekund UTC | 1735689600 (2025-01-01 00:00:00 UTC) |
chain_genesis_time |
drand keðju-upplýsing (genesis_time) |
1595431050 |
chain_period_seconds |
drand keðju-upplýsing (period) |
30 |
ceil()-atgerðin velur fyrstu drand-rundu, hvørs avdúkingartíð er ≥ unlock_at. Hetta tryggjar, at qub ikki verður avkrypteranligur, áðrenn tann valda avlæsingartíðin.
Útjaðaraføri: um (unlock_at - chain_genesis_time) er júst deilibart við chain_period_seconds, er úrslitið júst tann runda — qub avlæsist beint á avdúkingartíð teirrar rundu.
Vátting: unlock_at MÁ vera í framtíðini á innsiglingartíð. unlock_at MÁ IKKI vera meira enn 10 ár frá created_at (fyri at avmarka langtíðar drand-veltingarvanda; brúkaramótið EIGUR at vára fyri avlæsingardøgum lengri enn 2 ár burtur).
5. Tráðasniðs-Nýggjslag
Tráðasniðs-nýggjslag veita samanseting-tíðar trygd ímóti at blanda CBOR-bæti saman við JSON, rátt reintekst ella aðrar bætiraðfestingar.
| Slag | Inniheldur | Framleitt av | Brúkað av |
|---|---|---|---|
SealedQubCbor |
Kanoniskt CBOR av SealedQub | serialize_sealed_qub() |
Innara tráðartefakt; goymt bert fyri almenna veiting ella innpakkað fyri privata veiting og síðani endurfingið av vísaranum |
QubEnvelopeCbor |
Kanoniskt CBOR av QubEnvelope | serialize_qub_envelope() |
tlock-krypteringar-inntak, tlock-avkrypteringarúttak |
5.1 Samanseting-Reglur
// Production code — only through CBOR serialisers:
let sealed = SealedQubCbor::from_encoded(cbor_bytes);
// There is deliberately NO From<Vec<u8>> implementation.
// You cannot accidentally wrap arbitrary bytes in a wire format type.
// Accessing raw bytes:
let bytes: &[u8] = sealed.as_bytes();
let bytes: Vec<u8> = sealed.into_bytes();
5.2 Vátting við Samanseting
from_encoded() EIGUR at vátta, at inntakið byrjar við einum gildugum CBOR-kort-høvri. Full bygnaðarvátting hendir á tólkingartíð, ikki samanseting-tíð, fyri at sleppa undan tvítólking.
6. Innihaldsslags-Skráseting
| Virði | Slag | Mest Likamsstødd | Viðmerkingar |
|---|---|---|---|
0x00 |
Varðveitt (ógildugt) | — | MÁ IKKI brúkast |
0x01 |
Reintekstur (UTF-8, avmarkað Markdown) | 50 KB rindað / 10 KB frítt | Sí §10 fyri framsýningarreglur. Frítt / rindað býti verður framfylgt av upphalanartænastuni; harðtakið á protokollaginum er 50 KB. |
0x02 |
Varðveitt (framtíðar) | — | Tillutað fyri eitt framtíðar innihaldsslag; ikki gildugt í v1. Vísarar MÚGVA avvísa tað sambært reglini niðanfyri. |
0x03 |
Pakt (tvíhliða semja, CBOR-likam) | 100 KB | Likamið er kanoniskt CBOR PactTerms (§6.1). Samundirskrivara-undirskriving sambært §9.7. |
0x04 |
Úrskurður (eginmeting hjá høvundi, CBOR-likam) | 8 KB | Likamið er kanoniskt CBOR VerdictBody (§6.2). Bara givið út av skipanarætlanini verdict. Foreldrasambandið er á Arweave-merkinum Parent-Tx-Id, ikki á likaminum. Sí verdict-uplift-plan §3.4. |
Vísarar MÚGVA avvísa ókend innihaldsslag við einum greiðum brúkara-sjónligum feili. Vísarar MÚGVA IKKI royna at framsýna ókend slag sum tekst.
6.1 Pakt-Likam (content_type = 0x03)
Eitt pakt-likam er tann kanoniska CBOR-raðfestingin av einum PactTerms-virði:
PactTerms {
pact_version: u8, // 0x01 for structured/v1
title: String, // ≤ 200 bytes, NFC
terms: Vec<PactTerm>, // ≤ 20 rows
party_a: PartyIdentifier, // initiator
party_b: PartyIdentifier, // counter-signer
notes: Option<String>, // ≤ 5,000 bytes, NFC; absent key if none
}
PactTerm { key: String (≤ 100 bytes), value: String (≤ 2,000 bytes) } // NFC
PartyIdentifier{ label: String (≤ 100 bytes), contact: Option<String (≤ 320 bytes)> }
Kanoniskar CBOR-lyklaraðsetingar fyri øll trý kort eru givnar í §3.2. Samlað raðfest pakt-CBOR MÁ IKKI fara um 100 KB (samsvarar §6).
Skema-skiljari. Fyrsta raðin í terms fyri ein structured/v1-pakt MÁ vera { key: "pact_schema", value: "structured/v1" }. Raðir uttan hesa merking eru "egindefineraðir" paktir og fáa onga bygda vátting ella skema-vitandi framsýning.
Frystir váttanarpláss. structured/v1-paktir bera júst fýra váttanarraðir undir hesum lyklum:
"initiator_standard_terms"
"initiator_capacity_terms"
"counterparty_standard_terms"
"counterparty_capacity_terms"
value fyri hvønn er ein av átta frystum enskum reinum, vald av (role, kind)-parinum, har role ∈ { seller, buyer, provider, client } og kind ∈ { standard, capacity }. Sjálvir reinirnir eru normativ protokoll-dáta — báðir parta ML-DSA-65-undirskriftir binda seg at júst teimum bætum gjøgnum body_hash. Teir verða IKKI staðbundnir; tann undirskrivaða likamið er málneutralt. Onkur orðingarbroyting krevur eina nýggja skemaútgávu (structured/v2).
Teir átta reinirnir, teirra uppfletting (acknowledgement_for(role, kind)) og grundgevingin fyri hvønn eru fastsett av tilvísingar-ímótkomningini. Samsvarandi ímótkomningar MÚGVA senda út bæti-eins váttanarvirði; gulligrundar SHA3-256 likams-styttingar-roynir, sum fevna um allar fýra hlutverka-samansetingar, fanga onkra reki.
Vísara-framsýningarraðseting. Váttanarreinirnir innihalda orðingar sum "lýst omanfyri", sum áseta, at lýsingar- / umfangsraðir verða framsýndar undan váttanunum. Vísarar MÚGVA framsýna terms-bráina í CBOR-raðseting; umraðseting brýtur prosa-merkingina.
Mótpartsamband. Tá ið Parts B contact er eitt gildugt teldupost-adressu, sendir qub-upphalanartænastan sjálvvirkandi eitt eftirkanningar- / samundirskrivingar-boð á sviðstíð og bindur eventuella samundirskriving at vátting av sama adressu (§9.7). Paktir, hvørs Parts B-samband er fráverandi, kunnu framvegis verða samundirskrivaðir, men bert gjøgnum ein utanteldupost-kanal — tænastan noktar samundirskrivingar-umbønir, sum ikki kunnu framleiða eina samsvarandi 15-minuttu teldupost-váttingarmerking.
6.2 Dóma-Likam (content_type = 0x04)
Eitt dóma-likam er tann kanoniska CBOR-raðfestingin av einum VerdictBody-virði:
VerdictBody {
verdict_version: u8, // 0x01 for structured/v1
outcome: u8, // 1=Right · 2=Partial · 3=Wrong · 4=Unfalsifiable
reflection: Option<String>, // ≤ 2,000 bytes NFC; "what changed, what did you learn"
evidence_url: Option<String>, // ≤ 2,048 bytes; HTTPS only; absent key when omitted
}
Kanonisk CBOR-lyklaraðseting:
"outcome" (8 encoded bytes)
"reflection" (11 encoded bytes) ← only if present
"evidence_url" (13 encoded bytes) ← only if present
"verdict_version" (16 encoded bytes)
Samlað raðfest dóma-CBOR MÁ IKKI fara um 8 KB (samsvarar skrásetingar-raðnum omanfyri).
Úrslits-enum. Tráðabætið er ætlanar-neutralt; teir fýra bólkarnir Right / Partial / Wrong / Unfalsifiable fevna um úrslits-rúmið hjá hvørjari dóma-berandi ætlan. Per-ætlanar-merkir ("Sá tað fyri" / "Helt tað" / "Sendi avstað" / "Vátta" fyri Right, o.s.fr.) eru ein vísara-sniðs-spurningur, ið verður loystur ímóti ætlanini hjá foreldra-qubinum — tráðurin verður mál- og ætlanar-neutralur. Virði uttan fyri 1..=4 MUGU verða avvíst í avkodingini.
Foreldra-samband. Eitt dóma-qub ber IKKI foreldra-tilvísingina í sínum likami. Arweave-veksil-eyðmerkin hjá foreldra-qubinum verður givin út sum Parent-Tx-Id-goymslumerki á upphaldsstundini (§7 goymslumerkislag). Hetta letur likamið vera eina sjálvberandi undirskrivaða lýsing av sjálvsdøming; eftirlitskeðjan ("rættur um hvat?") verður grundað við Arweave-merkis-uppfletting.
Trygd hjá vitnisburðar-URL (normativt). Tá ið evidence_url er til staðar, MUGU váttararnir (samanseting-síðan, tráðasíðan, Worker-jaðarin) framfylgja:
- Bert HTTPS. Reinurin MÁ byrja við bætirøðini
https://. Onkur annar háttur —http,ftp,javascript,data,file, o.s.fr. — verður avvístur. - Longdarmark. ≤ 2.048 bæti (praktiska URL-mark hjá kagaranum).
- NFC + fíggindarliga-bætis-kanning. Sama regla sum
titleogreflection— bidi-yvirskriving / núll-vídd / merkis-blokkur / BOM / C0 / C1-bæti verða avvíst. Skilamarkið samsvarar Rustcrate::handle::contains_hostile_text_codepointog TSworkers/api/src/utils/unicode.ts::isHostileCodepoint(haldist í takt). - Onki millumrúm, ongi ASCII-stýristekn. Millumrúm / DEL / sub-
0x20-bæti hvar sum helst í URL-num verða avvíst — letur niður tann\n/\t-inntrokings-vektorin, sum bidi-reglan ikki tekur við. - Ikki-tómt vert-stykki. Alt millum
https://og fyrsta/,?ella#MÁ vera ikki-tómt.
Ongin tænara-síðis heinting. Workeren MÁ IKKI fyriumboða, heinta ella framvísa URL-ina. Protokollin goymir ein streng; framsýningin hendir á vísara-síðuni við rel="nofollow noopener noreferrer" target="_blank" og einum sjónligum verti vístan saman við leinkju-tekstinum.
Umhugsan. Valfrítt umhugsanartekst skrivað av høvundinum ("hvat broyttist, hvat lærdi tú"). Sama NFC + fíggindarliga-bætis-vátting sum title. Tómt / bert-millumrúms inntak fellur saman til fráverandi á samansetingarstundini.
Skema-útgáva. v1 stuðlar bert verdict_version = 0x01. Komandi skema-broytingar økja hetta bætið og koma saman við einari nýggjari protokoll-útgávu sambært §12.
7. Innsiglingarprotokollur
Tann fullkomna innsiglingarrøðin. Hvørt stig er normativt.
1. User composes plaintext and metadata in ComposeQub.
2. Validate:
a. body is non-empty.
b. body size ≤ max for content_type and user tier (see §6).
c. unlock_at is in the future.
d. unlock_at ≤ created_at + 10 years.
e. content_type is a known, supported value.
f. visibility is 0x00 (private) or 0x01 (public).
3. Compute body_hash = SHA3-256(body).
4. Set created_at = current Unix seconds UTC.
5. Select drand chain. Load chain_genesis_time and chain_period_seconds, and
compute drand_round = floor((unlock_at - chain_genesis_time) / chain_period_seconds) + 1
(§4.3). (Computed here, before qub_id, because drand_round is bound into the
qub_id preimage—§4.1.)
6. Compute qub_id (see §4.1), folding in drand_round from step 5.
7. Construct QubEnvelope with all fields.
8. Serialise QubEnvelope using canonical CBOR → bytes B.
Assert: serialised output matches canonical profile (§3).
9. Compute C = tlock_encrypt(B, drand_round, drand_chain_public_key).
10. Construct SealedQub with tlock_ciphertext = C and matching qub_id, version,
visibility, unlock_at, drand_chain_id, and drand_round.
11. Serialise SealedQub using canonical CBOR → SealedQubCbor.
12. Select the delivery shape from visibility:
a. Private (0x00): generate K = 32 random bytes and N = 12 random bytes
using a CSPRNG. Compute W = wrap_sealed_qub(SealedQubCbor,
qub_id=qub_id, key=K, nonce=N) per §13. Upload payload = W.
b. Public (0x01): upload payload = bare SealedQubCbor; do not generate K.
13. Display seal-time disclosure. User confirms.
14. Validate upload eligibility via the qub upload service (bot-detection, entitlement, rate limits).
15. Submit the selected upload payload to the qub upload service. For a private
browser seal, the service is byte-blind to the inner SealedQubCbor and never
receives K. The Builder `/api/v1/seal` route is an explicit exception: it
receives plaintext and caller-supplied K in memory, then persists neither.
16. Receive arweave_tx_id from the service. For private delivery, construct
`<origin>/c/<arweave_tx_id>#<base64url(K)>` (or the equivalent short-code
path). For public delivery, omit the fragment. Browsers do not transmit URL
fragments to servers, so K from the browser-seal path is not observed by
qub.social or any storage gateway.
Goymslumerkjalag (uttan fyri sniðið). Uppleggingartænastan hjá qub leggur eitt tilvitað lítið sett av goymslutransaktiónsmerkjum afturat valdu uppleggingarnýttulastini. Content-Type=application/octet-stream er normativt kravt. Tilvísingartænastan leggur harumframt trý valfrí merki afturat, tá ið høvundurin velur at vísa tey: Intent (loyvilista-váttað samansetingarætlan—announcement, thesis, prediction, letter, secret, commitment, proof ella skipanarútgivið verdict), Author (høvundans §9.3 almenn-lykla fingramerki sum 64 lágstavs hex-tekn) og Parent-Tx-Id (goymslutransaktiónskenni hjá foreldraqubinum fyri svarkeðjur, 43-tekna base64url).
Author-merkið er valfrítt fyri hvønn qub: tilvísingar-høvundaappin leggur tað bara afturat, tá ið brúkarin greitt virkjar almenna høvundatilskriving við innsigling. Tá skiftarin er sløktur—sum standard—verður einki Author-merki skrivað, og qubið er uttan høvundatilskriving í varandi goymslu: einki har bindur uppleggingina at handfangi, telduposti ella øðrum qub-um hjá høvundinum. Tá skiftarin er virkin, loysist Author-fingramerkið til valda @handle hjá høvundinum gjøgnum §9.5-váttanarkeðjuna. Svarkeðjusambond og Intent eru ikki eyðmerkjandi. Fyri privata veiting krypterar ytra umbúgvingin (§13) kenniliga innara SealedQub-artefaktið, so innheysting av goymdum umbúgvingum saman við almennum drand-undirskriftum framvegis ikki er nóg mikið til at endurfáa likamið uttan K; goymslumerkini eru tilvitað almenn metadáta.
Tilvísingartænastan leggur við vilja IKKI App-Name-, App-Version- ella Type-tag afturat: nakar slíkur einvirðis-filtur fór at skilað øllum qub-savninum aftur til eina GraphQL-fyrispurning, sum ikki samsvarar umbúgvingarinnar likams-bert loyndarumfang.
Ein samsvarandi verifiserari MÁ IKKI velta á nakað goymslupláss-tag fyri §11 triðjapartsverifikatión; likams-styttingin / qub_id / undirskriftin binda seg bert at innra CBOR, ongantíð at tag-settinum.
8. Avlæsingarprotokollur
Tann fullkomna avlæsingarrøðin. Hvørt stig er normativt.
1. Viewer opens delivery URL. Extract arweave_tx_id from the path and retain
the optional URL fragment. Do not assume a missing fragment is an error:
public/bare delivery intentionally has no K.
2. Check denylist. If tx_id is denylisted → display block message. Stop.
3. Fetch the stored bytes (with multi-gateway fallback).
3a. Resolve the delivery shape structurally:
a. If the bytes parse as OuterWrapper, require a well-formed 32-byte K in
the URL fragment, require wrapper version 0x01, and unwrap per §13.
Any missing/malformed K or AEAD failure is a terminal error.
b. Otherwise require the bytes to parse as bare SealedQubCbor; no K is
required. If neither shape parses, report an integrity error.
4. Parse SealedQubCbor → SealedQub.
5. Validate: SealedQub.version is known (0x01), visibility is known, and the
delivery shape matches it (wrapped = 0x00 private; bare = 0x01 public).
Reject any mismatch or unknown value.
6. If current time < SealedQub.unlock_at → display countdown. Poll or wait.
6a. Round-binding check. Recompute expected_round from
SealedQub.unlock_at per §4.3. Reject unless SealedQub.drand_round ==
expected_round OR SealedQub.drand_round == expected_round - 1 (the
legacy pre-release mapping—see §4.3), AND the round baked into the tlock
ciphertext stanza (read via the age/tlock header, no signature required)
== SealedQub.drand_round exactly. The stanza round is the one that
actually gates decryption; without this check a malicious creator could
bind the ciphertext to an already-past round while displaying a future
countdown, so anyone reading the stored bytes could decrypt before
unlock_at. Implementations with no chain identity (test mocks) skip this
check.
7. Once current time ≥ SealedQub.unlock_at:
a. Fetch drand round signature for SealedQub.drand_round from drand network.
b. Compute B = tlock_decrypt(SealedQub.tlock_ciphertext, round_signature).
8. Parse B → QubEnvelope.
9. Validate QubEnvelope.version is known.
10. Verify: SHA3-256(QubEnvelope.body) == QubEnvelope.body_hash.
Fail → integrity error.
11. Verify: QubEnvelope.qub_id == SealedQub.qub_id.
Fail → integrity error.
12. Verify: QubEnvelope.unlock_at == SealedQub.unlock_at.
Fail → integrity error.
12a. Verify: QubEnvelope.outcome_at == SealedQub.outcome_at (both absent, or
both present and equal). Fail → integrity error.
12b. Content re-derivation. Recompute qub_id per §4.1 from the decrypted
fields — (QubEnvelope.version, content_type, created_at, unlock_at,
outcome_at, SealedQub.drand_round, QubEnvelope.body_hash,
title_hash(SealedQub.title)) — and verify it equals SealedQub.qub_id.
Fail → integrity error. The pairwise checks in steps 10-12a only prove
the two layers agree with EACH OTHER; a forger who rewrites a bound
field consistently on both surfaces (a pre-reveal title swap, or a
post-round body swap with a recomputed body_hash re-encrypted to the
same round under the same qub_id) passes them all. Only re-deriving
the identity from content closes this.
13. Verify: QubEnvelope.content_type is known and renderable.
Known values: 0x01 (text), 0x03 (pact), 0x04 (verdict).
Unknown → display error.
14. If QubEnvelope.sig_alg != 0x00 → verify author signature (see §9.4).
15. If cosigner_pubkey or cosigner_signature present → verify cosigner (see §9.7).
16. Render content using the appropriate renderer (see §10 for text and §6 for pact/verdict).
17. Construct RevealedQub for display.
9. Høvundaundirskriving
9.1 Grundgeving
qub-ar verða goymdir í varandi goymslupláss. Høvundaundirskriftir mugu verða ófalsanligar í alla framtíð, sum er orsøkin til, at v1.0 brúkar tað post-kvantum ML-DSA-65 skemað (FIPS 204) heldur enn eitt klassiskt skema, hvørs trygd kann minka innan qubsins varandi lívskeið.
9.2 Algoritmu-Skráseting
sig_alg |
Skema | Lyklastødd | Undirskriftarstødd | Støða |
|---|---|---|---|---|
0x00 |
Eingin undirskrift (óundirskrivað) | — | — | Virkið |
0x01 |
ML-DSA-65 (FIPS 204) | 1.952 bæti | 3.309 bæti | Virkið |
0x02 |
Ed25519 | 32 bæti | 64 bæti | Frátekin fasti; ikki stuðlað í protokoll v1 |
Vísarar fyri protokoll v1 MÚGVA avvísa øll virði uttan fyri {0x00, 0x01}, íroknað frátikna virðið 0x02. Frátøkan forðar óvart endurnýtslu; hon er ikki virking. Virking krevur stýrdu broytingina í §15.
9.3 Undirskrivað Forímynda-Bygning
Tvær forímynda-útgávur hava verið til. Allar undirskriftir MÚGVA brúka V2, og verifiserarar MÚGVA bert góðtaka V2. Tann gamla V1-forímyndin (skjalfest niðanfyri sum søgulig tilvísing) varð góðtikin sum ein loysn, ið bert varð brúkt til verifikatión, undir flytingini til V2; henda loysnin er nú avtikin, og ein undirskrift, sum bert byggir á V1, verður nú avvíst.
V2 (núverandi — framleidd av allari nýggjari høvundaundirskriving, og av báðum undirskriftum í pakt-sviðsetingar- / samundirskrivingar-gongdini):
sig_input = SHA3-256(
"QUB_AUTHOR_SIG_V2" || // domain separator (17 bytes)
version || // u8 (1 byte)
qub_id || // [u8; 32] (32 bytes)
body_hash || // [u8; 32] (32 bytes)
unlock_at || // i64 big-endian (8 bytes)
0x00 || // u8 (1 byte): MUST be 0x00 in v1.x
sender_label_hash || // [u8; 32]: SHA3-256(NFC(sender_label)),
// or 32 zero bytes when absent
reply_to_or_zero // [u8; 32]: parent qub_id, or 32 zero
// bytes when absent
)
// Total preimage: 155 bytes → 32-byte hash
signature = Sign(author_secret_key, sig_input)
sender_label_hash fylgir sömu fráverandi-sentinel-venju sum title_hash (§4.2.1): 32 null-bæti eru ikki eitt gildugt SHA3-256-úttak, so „fráverandi" kann ongantíð stoyta saman við eitt til staðar verandi heiti. Allir teigar eru fastbreiddir, so forímyndin er ótvíræð uttan longdarforskoyti.
V1 (gomul — AVTIKIN; ikki longur framleidd og ikki longur góðtikin við verifikatión):
sig_input = SHA3-256(
"QUB_AUTHOR_SIG_V1" || // domain separator (17 bytes)
version || // u8 (1 byte)
qub_id || // [u8; 32] (32 bytes)
body_hash || // [u8; 32] (32 bytes)
unlock_at || // i64 big-endian (8 bytes)
0x00 // u8 (1 byte): MUST be 0x00 in v1.0
)
// Total preimage: 91 bytes → 32-byte hash
V1-forímyndin vantaði sender_label og reply_to. Hon varð góðtikin sum ein loysn, ið bert varð brúkt til verifikatión, undir flytingini til V2; henda loysnin er síðani avtikin — verifiserarar MÚGVA bert góðtaka V2-forímyndina. Skilgreiningin verður varðveitt her sum søgulig tilvísing og til at greiða frá økisskiljaranum niðanfyri. Ein undirskrift, sum bert verifiserar móti V1, MÁ verða viðgjørd sum ein verifikatiónsfeilur.
Økisskiljarar: "QUB_AUTHOR_SIG_V1" / "QUB_AUTHOR_SIG_V2" eru hvør 17 ASCII-bæti ([0x51, 0x55, 0x42, 0x5F, 0x41, 0x55, 0x54, 0x48, 0x4F, 0x52, 0x5F, 0x53, 0x49, 0x47, 0x5F, 0x56, 0x31/0x32]). Eingin fylling. Tann ymiski skiljarin økisskilir báðar bygningarnar, so ein undirskrift yvir eina forímynd kann ongantíð verifisera sum hin.
org_id_present-bæti: bætið eftir unlock_at MÁ vera 0x00. Tilvísingar-ímótkomningin vísir hetta sum fastvirðið ORG_ID_PRESENT_INDIVIDUAL = 0x00 í crates/qub-core/src/signing.rs; vísarar, sum endurbyggja sig_input fyri verifikatión, MÚGVA senda út sama bæti.
Undirskriftarumfang — hvat er og er ikki fevnt. V2-sig_input bindur seg beinleiðis at version, qub_id, body_hash, unlock_at, sender_label og reply_to (umframt tann fasta økisskiljaran og org_id_present-bætið). qub_id verður sjálvur avleiddur úr version, content_type, created_at, unlock_at, outcome_at, drand_round og body_hash gjøgnum §4.1-forímyndina, so ein og hvør broyting á hesum teigum framleiðir ein annan qub_id og ger undirskriftina ógilduga transitivt. Tann beinleiðis-váttaða yvirvøddin er tí:
| Teigur | Váttaður av undirskrift | Hvussu |
|---|---|---|
version |
✓ | Beinleiðis inntak til sig_input |
qub_id |
✓ | Beinleiðis inntak |
body_hash |
✓ | Beinleiðis inntak |
unlock_at |
✓ | Beinleiðis inntak |
sender_label |
✓ | Beinleiðis inntak gjøgnum sender_label_hash (V2-forímynd — tann einasta góðtikna formin) |
reply_to |
✓ | Beinleiðis inntak gjøgnum reply_to_or_zero (V2-forímynd — tann einasta góðtikna formin) |
content_type |
✓ | Transitivt, gjøgnum qub_id-forímynd |
created_at |
✓ | Transitivt, gjøgnum qub_id-forímynd |
outcome_at |
✓ | Transitivt, gjøgnum qub_id-forímyndina |
drand_round |
✓ | Transitivt, gjøgnum qub_id-forímyndina (V1.2) |
body |
✓ | Transitivt, gjøgnum body_hash = SHA3-256(body) |
author_pubkey |
— (undirskilt) | Lykilin, sum verifiseraði undirskriftina, er høvundurin, sambært skilgreining |
cosigner_pubkey / cosigner_signature |
— | Sjálvstøðugt undirskrivað yvir sama sig_input (sí §9.7) |
drand_chain_id, tlock_ciphertext, visibility |
— | Ytri SealedQub-teigar, ikki innan í brævinum — fevndir av teirra egnu bygnaðar-stødufeingjum (runda / keðju-samsvar), men ikki av høvundaundirskriftini. (drand_round er nú bundið transitivt gjøgnum qub_id-forímyndina — sí omanfyri.) |
Hví V2 er tann einasta góðtikna forímyndin.
- Undir tí avtiknu V1-forímyndini kundi ein partur við skrivirættindum til goymdu bætini skift
sender_label("Alice" → "Mallory") ella um-foreldraðreply_to— og krypterað aftur eftir umfarið — uttan at gera høvundaundirskriftina ógilduga, tí hvørgin teigurin var í tí undirskrivaðu forímyndini. V2 fevnir um báðar, so ein og hvør broyting á øðrumhvørjum teiginum flytir verifikatiónina til "miseydnaða". Av tí at verifiserarar nú bert góðtaka V2, er hetta skiftið afturlatið fyri hvørja undirskrift: ein undirskrift, sum bindur hvørgin teigin (t.e. bert verifiserar móti V1), verður reint avvíst, ikki lækkað niður til V1. author_pubkeyinnan í brævinum verður verandi tann sanna samleikaakkerið — vísarar MÚGVA avleiða framsýningarsamleikan úrauthor_pubkey(gjøgnum §9.5 váttanarlagið) heldur enn at líta ásender_label.
Ímótkomningar, sum framsýna sender_label ella reply_to fyri endabrúkarum, MÚGVA vísa tann váttaða samleikan (alment-lyklað fingramerki, váttan) sum tað fremsta samleikasignalið, ikki heitið.
9.4 Verifikatiónsmannagongd
1. Read sig_alg from QubEnvelope.
2. If sig_alg == 0x00 → unsigned. No verification. Display "unsigned qub."
3. If sig_alg is unknown → reject. Display "unrecognised signature scheme."
4. Extract author_signature and author_pubkey. If either is absent → integrity error.
5. Reconstruct sig_input using fields from QubEnvelope (V2 formula, §9.3).
6. Verify(author_pubkey, sig_input, author_signature). The V2 preimage is the
only accepted form — the legacy V1 fallback is retired (§9.3), so a
signature that does not verify against V2 fails, full stop.
7. If verification succeeds → display "signed by [key fingerprint]."
8. If verification fails → display "signature verification failed."
Undirskriftarverifikatión er tann dýrasta atgerðin (serliga ML-DSA-65). Hon EIGUR at verða gjørd eftir, at allar bíligari kanningar (stytting, qub_id, unlock_at) eru væleydnaðar.
9.5 Samleika-Váttanir
Samleika-váttanir — kortleggingin av author_pubkey til mennisklig-kennaligar samleikakrøv sum eitt qub-handil, teldupostadressu, sosialt handil ella passlyklareingisbevís — eru ein vísara-síðu progressiv betran og verða ikki kravdar fyri undirskriftarverifikatión. Vísarar, sum loysa váttanir upp til ein framsýningarsamleika, MÚGVA brúka raðfestingina:
handle > email > social > fingerprint
Fingramerki-uppgávan er tann lágstavur hex av SHA3-256(author_pubkey); hon er altíð tøk fyri nakran undirskrivaðan qub. Vísarar KUNNU stytta hana fyri framsýning — tilvísingar-vísarin framsýnir qub: fylgt av tey fyrstu og tey síðstu fýra bætini (qub:<8 hex>…<8 hex>).
Ein samsvarandi verifiserari kann fullføra hvørja kanning í §9.4 uttan at samband við qub-API, uttan nakað net umframt varandi goymslupláss og drand, og uttan nakra ambætara-síðu uppfletting. Váttanarloysing er eitt skilt besta-royndar stig, sum bert verður gjørt eftir, at undirskriftarverifikatión hevur eydnast.
9.6 Støddaráhrørsla
| Ed25519 | ML-DSA-65 | |
|---|---|---|
| Undirskrift | 64 bæti | 3.309 bæti |
| Alment lyklað | 32 bæti | 1.952 bæti |
| Tilsamans fyri hvønn qub | 96 bæti | 5.261 bæti |
| Goymslupláss-kostnaðarmunur (við ~$5/MB) | ~$0.0005 | ~$0.026 |
Fyri ein tekst-qub av 500–2.000 bætum tríðfaldar ML-DSA-65 grovt tann goymdu støddina. Tann absoluti kostnaðurin er ómunaligur.
9.7 Samundirskrivara-Verifikatión (Pakt Tvíhliða Semjur)
Fyri tvíhliða semjur (content_type = 0x03) prógvar eitt annað undirskriftarlag, at báðir partar samtyktu somu treytir.
Brævateigar:
cosigner_pubkey: ML-DSA-65 alment lyklað hjá mótundirskrivaranum (Partur B).cosigner_signature: Undirskrift yvir samasig_inputsum høvundurin (§9.3).
Báðir teigar MÚGVA vera til staðar saman ella báðir fráverandi. Um júst ein er til staðar, MÚGVA vísarar fráboða ein heildarfeil.
Verifikatiónsmannagongd:
1. If cosigner_pubkey absent and cosigner_signature absent → no cosigner. Done.
2. If exactly one is present → integrity error.
3. Verify cosigner_pubkey != author_pubkey (prevent self-cosigning).
Fail → display "cosigner pubkey must differ from author."
4. Reconstruct sig_input using the same formula as §9.3 (V2 only — the
legacy V1 fallback is retired; all pact clients produce V2 signatures).
5. Verify(cosigner_pubkey, sig_input, cosigner_signature).
6. Success → display "co-signed by [cosigner fingerprint]."
7. Failure → display "co-signature verification failed."
Eginleikar:
- Samundirskrivarin undirskrivar tann eins
sig_inputsum høvundurin — báðir partar binda seg at samaqub_id,body_hashogunlock_at(og, undir V2, samasender_label_hashogreply_to_or_zero). - Til at lata mótundirskrivaran endurbyggja V2-forímyndina uttan atgongd til rá brævabætini, tryggjar sviðsetingartænastan á sviðsetingartíð, at eitt pakt-brævs
sender_labeler líktpact_terms.party_a.labelog atreply_toer fráverandi. Bæði halda fyri hvønn tilvísingar-klient pakt; brøv, sum bróta hetta, verða avvíst við sviðseting. qub_id-avleiðing (§4.1) inniheldur IKKI samundirskrivara-teigar. At leggja ein samundirskrivara afturat einum tilstaðarverandi brævi broytir ikkiqub_id.- Ein paktur kann vera bert høvundaundirskrivaður (einhliða binding), bert-samundirskrivara (óvanligt), ella bæði (full tvíhliða prógv).
Teldupost-bindingar-gátt (rakstrarlig). Tá ið ein sviðsettur paktur ber ein Parts B-teldupostsamband (§6.1), MÁ qub-upphalanartænastan nokta samundirskrivingar-umbønini, uttan so at ein stuttlívd teldupost-váttingarmerking finst, sum samsvarar bæði sviðsetingareyðmerkingini og normaliseraða-teldupost-styttingini av tí sambandinum. Merkingin verður skrivað av /api/v1/auth/verify, tá ið maginlink-teknið ber eitt staging_id og tað verifiseraða adressuið samsvarar SHA-256(normalise_email(party_b.contact)) — har normalise_email(addr) varðveitir lokala-partsins stavstødd og lágstavar bert økispartin (sambært RFC 5321 §2.3.11), og SHA-256 her er NIST FIPS 180-4 styttingin (ymisk frá tí SHA3-256, sum verður brúkt í §4-avleiðingum) — og rennur út 900 sekund (15 minuttir) eftir útgávu. Hetta er ein rakstrarlig anti-eftirlíkingar-gátt, IKKI partur av tí á-keðju qub-prógvi — ein triðjaparts-verifiserari, sum endurspælir §11, tørvar bert varandi goymslupláss og drand, uttan nakra ambætara-síðu uppfletting. Merkingin finst bert ambætara-síðu og er ongantíð partur av tí undirskrivaða likami.
Støddaráhrørsla (ML-DSA-65 høvundur + samundirskrivari):
| Eind | Stødd |
|---|---|
| Høvundaundirskrift | 3.309 bæti |
| Høvunda alment lyklað | 1.952 bæti |
| Samundirskrivara-undirskrift | 3.309 bæti |
| Samundirskrivara alment lyklað | 1.952 bæti |
| Tilsamans kryptografisk eyka-byrði | 10.522 bæti |
| Goymslupláss-kostnaðarmunur | ~$0.05 |
10. Markdown Framsýning og Reinsing
Hesin parturin er trygdar-avgerðandi. Vísarin framsýnir tekst-qub-ar (content_type = 0x01) við einum avmarkaðum Markdown-undirsetti.
10.1 Loyvd Eind
- Yvirskriftir:
#gjøgnum####(einki#####ella######) - Áherðsla: feitt (
**), skástreingur (*), gjøgnumstrikað (~~) - Listar: raðaðir (
1.) og óraðaðir (-,*) - Sitatblokkar (
>) - Kotur: innanlínju-spennir (```) og innteknaðar blokkar (`````)
- Vatnrættar reglur (
---) - Línubrot (tvey slóðandi millanrúm ella tóm lína)
- Reglubrot
10.2 Forboðin Eind
| Eind | Viðgerð |
|---|---|
Ráur HTML (<div>, <script>, o.s.fr.) |
Strikað heilt og holt. Ongin HTML sleppur ígjøgnum. |
Myndir () |
Strikaðar. Mynda-syntaks verður tikið burtur úr úttaki. |
Leinkjur ([text](url)) |
URL framsýnd sum sjónligur reintekstur. Ikki sjálvleinkjað. Ikki klikkilig uttan uttrýkiliga brúkaraatgerð. |
| Vandamiklir URL-skemar | javascript:, data:, vbscript:, file: — strikaðir. |
| Iframes, innteknaðir, lutir | Strikaðir. |
| HTML-eindir | Avkodaðar til framsýningartekn bert um trygt. |
10.3 Ímótkoming
Ímótkomningar MÚGVA brúka ein strangan loyvilista-tólkara, ikki ein avvísingarlista. Tann viðmæltu atgerðin:
- Tólka Markdown við
pulldown-cmark(ella javnvirði). - Gang gjøgnum AST og slepp nakran node, sum ikki er á loyvilistanum (§10.1).
- Fyri leinkju-nodes: send út URL sum sjónligan tekst, ikki sum eitt klikkiligt
<a>-element. - Umset tann filtreraða AST til eina slag-defineraða millumframsetting (t.d., ein
MarkdownNode-enum við bert tryggum variantum). Ráur HTML er bygnaðarliga ófyriskipanligur í hesi IR. - Framsýn úr tí slag-defineraðu IR til mál-vísarlagið (t.d., reaktiv vísarkomponentir, DOM-nodes). Eingin HTML-rein-samanseting ella
innerHTMLá nøkrum tíðspunkti.
Avvísingarlista-atgerðir eru veikar, av tí at nýggj Markdown-víðkanir ella tólkara-eyðkenni kunnu innføra ófiltreraðar eindir. Tann slag-defineraða AST-atgerðin gerð XSS bygnaðarliga ómøguligt — har er eingin variantur, sum kann bera tilvildarligan HTML.
10.4 Størri- og Bygnaðarmark
- Mest framsýnd yvirskriftardýpd:
####(H4).#####og dýpri verða framsýnd sum feitur tekstur. - Einki mark á reglutali (likamsstødd-mørk í §6 eru avmarkingin).
- Innteknaðir kotublokkar: eingin syntaks-lýsmáting í MVP. Framsýndir sum einbreiddar fyrirsniðaður tekstur.
11. Triðjapartsverifikatión
Ein og hvør triðjipartur, sum hevur goymdu bætini (og K fyri eitt privat/innpakkað qub), kann vátta dulmálsliga artefaktið uttan samstarv frá qub. Ein sjálvstøðugt tíðarstemplað fullyrðing um tilveru krevur harumframt antin váttaða íroknan í varandi goymslu fyri tað einstaka qubið ella eitt váttað prógv úr §16-gjøgnumskygni-logginum.
1. Obtain the stored bytes. For a private delivery, also obtain K from the
delivery-link fragment.
2. Resolve the delivery shape (§8 step 3a): unwrap OuterWrapper with K, or
accept bare SealedQubCbor. Require shape/visibility agreement.
3. Parse SealedQubCbor → SealedQub; validate protocol version, visibility,
content type, chain identity, and structural bounds.
4. Recompute expected_round from unlock_at (§4.3); require the stored round
(allowing the documented legacy minus-one case) and ciphertext-stanza round
to agree exactly as §8 step 6a specifies.
5. Obtain the drand signature for SealedQub.drand_round and verify its BLS
signature against the pinned chain public key.
6. tlock_decrypt(tlock_ciphertext, round_signature) → QubEnvelope CBOR bytes.
7. Parse → QubEnvelope.
8. Verify SHA3-256(body) == body_hash.
9. Verify envelope/sealed equality for qub_id, unlock_at, and outcome_at.
10. Recompute qub_id from the decrypted fields, sealed drand_round, and title;
require it to equal the carried qub_id (§4.1).
11. If sig_alg != 0x00, verify the V2 author signature (§9.4). If cosigner
fields are present, verify their pairing, key separation, and signature
(§9.7).
12. For an existence-time claim, independently verify either:
a. the permanent-storage transaction's data-to-id binding, owner, block
inclusion, and block timestamp; or
b. a §16 inclusion proof through its pinned anchor and anchor block time.
13. Report each verified claim separately; do not collapse an absent storage
or anchor proof into a successful timing verdict.
Hvat váttan prógvar:
| Prógvinntak | Hvat tað staðfestir |
|---|---|
| Gildugur búnti / innsiglað artefakt + drand-undirskrift | Endurfingna likamið samsvarar body_hash; metadáta, sum eru bundin í qub_id, eru óskalað; dulmálsteksturin er bundin at uppgivna drand-umfarinum; og umfarið er farið. Hetta staðfestir ikki, nær dulmálsteksturin varð gjørdur. |
| Gildug V2-høvunda-/samundirskrift | Eigari/eigarar av samsvarandi loynilykli/lyklum váttaðu undirskrivaðu yvirflatuna í §9.3. |
| Sjálvstøðugt váttað goymslutransaktión fyri einstaka qubið | Nákvæmi goymdi dulmálsteksturin var til í seinasta lagi við blokktíðarmerkið. |
| Gildugt ankrað prógv úr gjøgnumskygni-logginum | Fullyrðingin fyri slagið av blaði í §16.11, íroknað eitt evsta bindingartíðarmark frá ankarblokkinum. |
Hvat váttan IKKI prógvar:
| Ikki-prógv | Hví |
|---|---|
| Høvundaskapur | sender_label er pyntandi. Uttan sig_alg ≥ 0x01 kundi nakar hava innsiglað hetta innihaldið. |
| Ætlan | Artefaktið prógvar bæti og dulmálslig sambond, ikki hvat høvundurin hugsaði. |
Undanfarandi binding úr .qub einsamøllum |
Ein høvundur kann gera ein gildugan búnta eftir, at bundna umfarið er farið. Innbygda drand-undirskriftin prógvar, at umfarið er farið, ikki at dulmálsteksturin var til áðrenn. |
| Nákvæm tíð fyri innsiglingarknøttin | Eitt goymslu- ella ankarblokktíðarmerki er eitt sjálvstøðugt váttanarligt evsta mark og kann koma eftir staðbundnu atgerð brúkarans. sealed_at / received_at-fullyrðingar eru ikki próvfastar. |
Íverksetti gjøgnumskygni-loggurin (§16) víðkar váttan tvørtur um qub-ar við manipulatiónsávísandi raðseting og einum álitsleysum evsta bindingartíðarmarki (ankarblokktíðin), avmarkað eftir blaðslagi (§16.11). Hann leggur ikki høvundskap ella ætlan afturat; fyri vanligu bæti-blindu uppleggingarleiðina prógvar hann ikki sjálvur body_hash ella drand_round, sum framvegis koma úr artefaktkanningunum.
12. Útgávu- og útgávustýring
Skjalaútgávur, innari tráðaprotokollur og ytri umbúgving eru trý ymisk útgávurúm. Ein greiðing, sum bara broytir skjalið, broytir tí ikki tigandi bætini, og ein framtíðar tráðaflyting kann ikki látast vera ein ritstjórnarlig rætting.
12.1 Skjalaútgáva
Henda fyriskipanin nýtir semantiskar skjalaútgávur (MAJOR.MINOR.PATCH) og eitt óbroytiligt Git-merki við navninum protocol-v<release>.
- PATCH: nákvæmnis- ella ritstjórnarrætting, sum ikki broytir samsvarandi bæti ella kravda atferð.
- MINOR: afturvirkandi samsvarandi normativ viðbót, nýggj skrásetingarinnførsla ella nýtt sjálvstøðugt útgávustýrt síðusnið.
- MAJOR: ósamsvarandi normativ broyting, íroknað nýggj kravd tráðat tulking.
Útgávustøðan er ein av Uppkast (enn ikki normativ), Galdandi (eina viðmælda málið fyri íverksetan) ella Avloyst (varðveitt fyri søguliga váttan). Leiðin /protokoll uttan útgávunummar vísir galdandi útgávu; útgávumerkið varðveitir nágreiniligu kelduna og hvørt mál, sum varð útgivið saman við henni. Broyting av støðu ella útgávunummari krevur, at henda talvan og útgávusøgan verða dagførdar í somu endurskoðaðu broyting.
| Skjalaútgáva | Gildiskomudagur | Støða | Tráðaprotokollur | Umbúgving | Kelda |
|---|---|---|---|---|---|
| 1.0.0 | 2026-09-23 | Galdandi | 0x01 |
0x01 |
protocol-v1.0.0 |
Skjalaútgávan verður ikki raðfest inn í protokollartefakt og er ikki tann sama sum SealedQub.version.
12.2 Protokollútgáva
version-teigurin (u8) í bæði SealedQub og QubEnvelope eyðmerkir høvuðs-protokollútgávuna.
- Vísarar MÚGVA avvísa ókendar høvuðsútgávur við einum greiðum feili.
- Innan fyri eina kenda høvuðsútgávu MÚGVA avkodarar avvísa ókendar kortlyklar (§3.1) — skemamenning fer fram við at innføra eina nýggja
version, ikki við at leggja lyklar afturat, sum verandi avkodarar høvdu hjáleitt. (Fyrri endurskoðanir av hesi lýsing loyvdu at tola ókendar valfríar teigar; tann ásetingin er tikin aftur — hon gjørdiencode(decode(x))ikki-injektivt og opnaði ein vektor fyri fjalt undirskrivað innihald á pakt-likamum.) - Innihaldsslag (
content_type) og undirskriftarskemar (sig_alg) eru útgávu-gátta: nýggj virði kunnu bert verða innførd saman við eini nýggjari protokollútgávu ella uttrýkiligari skrásetingaruppdatering.
12.3 Protokollútgávusøga
| Útgáva | Virði | Lýsing |
|---|---|---|
| v1 | 0x01 |
Privat/innpakkað og alment/bert veiting; tekst- (0x01), sáttmála- (0x03) og úrskurðarlikam (0x04); ML-DSA-65 V2 høvunda-/samundirskriving; drand quicknet tlock; SHA3-256. |
12.4 Framkompatibilitetur
Ein v1-vísari, sum møtir einum QubEnvelope við ókendum CBOR-kortlyklum (lyklar ikki í §3.2-kanonisku raðsetingini), MÁ avvísa tað við einum avkodingarfeili (§3.1). Framkompatibilitetur hvílir á version-teiginum, ikki á toli fyri ókendum lyklum: framtíðar viðbøtur — sjálvt smá metadáta — verða givnar út undir einum nýggjum version-virði, sum ein v1-vísari avvísir við einum greiðum "nýggjari protokollur"-feili, heldur enn tigandi at sleppa innihaldi burtur, sum undirskriftirnar binda seg at.
Ein v1-vísari, sum møtir sig_alg = 0x01 (ML-DSA-65) men manglar ML-DSA-65-verifikatiónsstuðul, EIGUR at framsýna qub-innihaldið við einum "undirskrift til staðar men ikki verifiserandi"-fráboðan, ikki at avvísa qub-in heilt. Tilvísingar-ímótkomningin í dag avvísir hvørt sig_alg-virði annað enn 0x00 og 0x01, av tí at v1-skrásetingin inniheldur ongan annan gildugan algoritm — strangt avvísing og bløyt-feilur eru observatiónsliga eins, fram til ein triði algoritmur verður skrásettur. Tann bløyt-feilar-atferðin omanfyri verður byrðiberandi, tá ið §9.2 sleppir inn eini nýggjari innfeti, og tilvísingar-vísarin verður dagførdur til at bløyt-feila á tí tíðspunkti.
12.5 Ytri Umbúgvingsútgáva
Tann OuterWrapper, sum er lýstur í §13, ber sína egnu version-bæti, óheft av SealedQub.version og QubEnvelope.version. Tey tvey útgávuríini menast hvør sær: ein framtíðar post-kvantum-tryggur symmetriskur avloysari lyftir umbúgvingar-bætið uttan at nerta innra protokollútgávuna, og ein framtíðar protokollag-viðbót (t.d., ein nýggjur brævateigur) lyftir innra útgávuna uttan at nerta umbúgvingar-bætið.
OUTER_WRAPPER_VERSION_* |
Virði | Algoritmur | Støða |
|---|---|---|---|
OUTER_WRAPPER_VERSION_1 |
0x01 |
AES-256-GCM við 12-bæti nonce, 16-bæti váttanartag, AAD bundið at qub_id |
Virkin fyri privata veiting |
| — | 0x02–0xFF |
Varðveitt | Framtíð |
Vísarar MÚGVA avvísa ókendar umbúgvingsútgávur við einum greiðum feili. Protokollurin heldur við vilja umbúgvingsútgávuríið smátt, fram til ein nakanligur flytingar-fyrisláttur kemur fram (t.d., NIST-vegleiðing, sum yndir ein annan AEAD); eitt 0x02-pláss verður tillutað í somu broyting, sum innførir algoritmin.
13. Ytri Krypteringarumbúgving
13.1 Grundgeving
Protokollagini (QubEnvelope → tlock → SealedQub) gera ein innsiglaðan qub tíðarlæstan: likamið er ólesiligt fram til unlock_at og drand-runda-undirskriftin hevur verið útgivin. Eftir avlæsing er runda-undirskriftin tó alment, og tann kanoniska CBOR-lagin av SealedQub er kennilig, so ein høstari, sum skrásetti varandi-goymslupláss handlar, kundi masseavkrypterað alt qub-savnið.
Fyri privata veiting stongir ytra krypteringarumbúgvingin hesa rásina við einum eyka symmetriskum AEAD-lagi millum kanoniska SealedQubCbor og goymdu bætini. Á innsiglingarleiðini í kagaranum livir 256-bita lykilin K bara í URL-brotinum av veitingar-URL'ini og á brúkaraeindum; kagar senda ikki URL-brot til ambætarar, so qub.social, allar goymslugáttir og øll CDN frammanfyri eru blind fyri K. Goymda umboðan hjá einum privatum qubi er tí ógjøgnumskyggjur dulmálstekstur, hvørs reintekstur ikki kann endurfáast uttan URL'ina, sum høvundurin valdi at deila. Almenn veiting letur við vilja hetta lagið vera burtur (§13.8).
Net-úrslit:
- Mótstøða móti uppteljing fyri privata veiting.
OuterWrapperer framvegis kenniligt skipað CBOR—ikki bókstavliga óskiljandi frá tilvildarligum bætum—men dulmálstekstteigurin fjalir kenniliga innaraSealedQub-skapið. Lýsta innheystingarleiðin "GraphQL-fyrispyr ber qub-laga uppleggingar og fjøld-avkryptera við almennum drand-undirskriftum" endar ikki við reinteksti uttan K. - Krypto-smildra privatlív fyri vanligu privatu kagaleiðina. qub.social kann ikki avkryptera hesi goymdu artefaktini úr vanligum ambætaradátum. Greitt vald endurfáing, almenn veiting og álítandi innsigling á ambætarasíðu hava onnur upplýst álitsmørk.
- Tvey loyndarstig. Vanliga støðan er leinkju-stýrd atgongd (hesin parturin). Móttakara-almenn-lykla kryptering er ein framtíðar eginleiki, sum er øðrvísi enn núverandi privata umbúgvingarháttur.
13.2 Lagaseting
plaintext body ← QubEnvelope.body (§2.2)
↓ canonical CBOR (§3)
envelope CBOR
↓ tlock encrypt to drand round (§7 step 10)
tlock_ciphertext (inside SealedQub) (§2.3)
↓ canonical CBOR (§3)
SealedQubCbor bytes ← inner wire artifact
├─ public (visibility=0x01) ───────────────▶ stored directly (§13.8)
└─ private (visibility=0x00)
↓ AES-256-GCM(K, nonce, AAD=qub_id) (§7 step 12, this section)
OuterWrapper CBOR bytes ← stored private payload
Innsigling og avlæsing á protokollaginum (§7, §8) eru óbroyttar undir umbúgvingar-markinum; umbúgvingin festist á kallstaðnum hjá seal() og loysist á kallstaðnum hjá unlock().
13.3 OuterWrapper Dátubygnaður
struct OuterWrapper {
version: u8, // 0x01, see §12.5
qub_id: [u8; 32], // copied from inner SealedQub; AEAD AAD
nonce: [u8; 12], // 96-bit AEAD nonce
ciphertext: Vec<u8>, // AES-256-GCM(K, nonce, SealedQubCbor, AAD=qub_id) || 16-byte tag
}
Teig-stødufeingi.
versionMÁ vera javnt við0x01fyri v1.0 umbúgvingsbæti.qub_idMÁ vera javnt viðqub_id-teigin í SealedQub, sum verður endurfingið eftir avumbúgving. Bæðiwrap_sealed_qubogunwrap_sealed_qubí tilvísingarverkinum tulka innara CBOR og krevja hendan javnleikan beinleiðis; AAD-bindingin fær harumframt manipulering av ytraqub_ideftir innpakking at falla í váttan.nonceMÁ vera 96 bitar (12 bæti), nýframleitt av einum CSPRNG fyri hvørja umbúgvingaratgerð. At endurnýta eitt nonce undir sama lykli loyvir AEAD nonce-endurnýtingar-álop, sum endurfáa reintekstin; framleiðarar MÚGVA viðgera (key,nonce)-pør sum einskots.ciphertexter AES-256-GCM-úttakið: dulorðsbæti samanbundin við 16-bæti váttanartagi.ciphertext.len() == SealedQubCbor.len() + 16júst.
CBOR-raðfesting. Kanoniskt CBOR sambært §3, við somu lyklaraðsetingar-regluni (raðað eftir raðfestari bætilongd vaksandi, so leksikografiskt). Teir fýra lyklarnir eru:
| Lykil | Raðfest bæti | Raðseting |
|---|---|---|
nonce |
6 | 1 |
qub_id |
7 | 2 |
version |
8 | 3 |
ciphertext |
11 | 4 |
Tað fyrsta bæti av OuterWrapper-CBOR er tí tann ávísa-longdar kort-høvur fyri eitt 4-innfetis kort (0xA4).
13.4 AAD-Binding at qub_id
Umbúgvingin bindur qub_id sum AEAD eyka váttaða dáta. Hetta er tann byrðiberandi bygnaðarliga vørnin móti trimum sløgum av álopum:
| Álop | Vørn |
|---|---|
Flyt dulorð undir ein annan qub_id-teig í umbúgvingini |
AAD-misrætt → AEAD-vátting dettur |
| Blanda URL-brotið av qub A við goymdu bætini av qub B | Skeivur lykil (og sjálvstøðugt bundið AAD) → AEAD-vátting dettur |
Manipulera qub_id-teigin í umbúgvingini eftir upphalan |
AAD-misrætt → AEAD-vátting dettur |
At bera qub_id í umbúgvingar-reintekstinum veikir ikki uppteljingar-ónæmi munandi — qub_id er sjálvur ein SHA3-256-stytting av §4.1-forímyndini uttan nakra endurfáanliga forímynd úr styttingini, og ein uppteljari, sum longu hevur høstað umbúgvingar-bætini, lærir einki av tí sjónliga qub_id, sum hann ikki kundi sluttað sær til frá tilveruni av sjálvari upphalanini.
13.5 Umbúgvingar- og Avumbúgvingar-Algoritmar
wrap_sealed_qub(SealedQubCbor S, qub_id Q, key K, nonce N):
require K.len() == 32 and N.len() == 12 and Q.len() == 32
I := canonical_cbor_decode(S) as SealedQub
require I.qub_id == Q // reject mismatched caller AAD
C := AES_256_GCM_encrypt(key=K, nonce=N, msg=S, aad=Q)
// C includes the 16-byte authentication tag at the end
return canonical_cbor_encode(OuterWrapper{
version: 0x01,
qub_id: Q,
nonce: N,
ciphertext: C,
})
unwrap_sealed_qub(OuterWrapper bytes W, key K):
require K.len() == 32
O := canonical_cbor_decode(W) as OuterWrapper
require O.version == 0x01 // §12.5
P := AES_256_GCM_decrypt(
key=K, nonce=O.nonce, ciphertext=O.ciphertext, aad=O.qub_id
)
// any AEAD failure → DECRYPT_FAILED, indistinguishable to caller
S := canonical_cbor_decode(P) as SealedQub
require S.qub_id == O.qub_id // explicit inner/outer cross-check
return P // P is the validated SealedQubCbor
Feilstøðu-samanfall. Skeivur K, skeivt nonce, AAD-misrætt og manipulerað dulorð framleiða øll sama DECRYPT_FAILED-feil. Hetta er ein viljaður AEAD-eginleiki: at skilja feilstøðuna fór at gjørt eina síðukanal, sum ein fjar-álopsmaður kundi probað við at senda misformaðar umbúgvingar og taka tíð á svarinum. Tilvísingar-ímótkomningar MÚGVA samanfella allar AEAD-feilir til eina einasta feil-formi.
13.6 Lyklatilfar og Útbýti
Umbúgvingar-lykilin K er eitt 256-bita javnt tilvildarvirði, framleitt fyri hvønn qub av einum CSPRNG. Tilvísingar-ímótkomningarnar fáa hann frá:
- WASM-høvundur:
getrandom(WebCrypto undirwasm_js-bakendanum). - Ambætara-síðu innsiglingar-API-kallari: sín lokali CSPRNG; kallarin veitir og varðveitir
Ksumwrapper_key_b64url. Workeren nýtirKí minni fyri umbúgvingina, men MÁ IKKI varðveita hann. Hetta letur eina idempotenta endurroynd endurfáa eitt yvirstrikað svar við kallarans varðveitta førleika í staðin fyri at velta á eitt einskots ambætara-framleitt loyndarmál.
Útbýti: K MÁ verða raðfest sum URL-trygt base64 (RFC 4648 §5, eingin fylling) og lagt afturat avgreiðslu-URL sum brot-eindina:
delivery_url = <origin>/c/<arweave_tx_id>#<base64url(K)>
Brotið verður ongantíð sent til nakan ambætara av einum samsvarandi kaga. Endurfáanarkanalar (ambætara-síðu søguskráseting, valfríur teldupost-sjálvsending), sum varðveita tann fulla avgreiðslu-URL — íroknað brotið — út um brúkarans tóleind, eru eitt skilt skifti móti tí sjálvsettu krypto-smildru-støðuni og MÚGVA verða gátta á uttrýkiligu brúkarasamtykki.
Brot-tap. Um ein brúkari missir URL-brotið og hevur ongan endurfáanarkanal, er qub ólesiligur. Hetta er tað byrðiberandi skiftið í sniðnum og MÁ verða greitt frá fyri brúkaranum á innsiglingartíð. MVP styrkir innsiglingartíðar-frágreiðingina við uttrýkiligum "goym hendan URL"-tekst og einum verifiseraðum-teldupost endurfáanarkanali fyri brúkarar, sum velja tað.
13.7 Utanmark fyri Hendan Partin
- Høvundaundirskriving (§9) er óbroytt: undirskriftir verða roknaðar innan í tí innra
QubEnvelopeog verða endurfingnar eftir avumbúgving → tlock-avkryptering → CBOR-tólking. - Kryptering við almennum lykli hjá móttakara (frátikni
recipient_pubkey-teigurin) er ein framtíðar eginleiki, sum er øðrvísi enn núverandi privata umbúgvingarháttur við leinkjuførleika. - Núverandi samundirskrivingarleið á ambætarasíðu fyri sáttmálar gevur alment/bert
SealedQubCborviðvisibility = 0x01; hon kann ikki lúka kagabundna K-loyndarmyndilin, tí endaliga innsiglingin hendir eftir samundirskriving umvegis ambætaran. Ein framtíðar framleiðari av privatum sáttmálum kann nýta somu umbúgving, sum er bæti-blind fyri innara innihaldsslagi.
13.8 Almennir qub-ar (umbúgvingar-burturlating)
Tann ytri umbúgvingin er valfrí á avgreiðslulaginum. Ein høvundur kann innsigla ein qub sum almennan, og í tí føri fer tann kanoniski SealedQubCbor beinleiðis inn í goymslutilgongdina, uttan nakað OuterWrapper-lag og uttan nakran lykil K:
SealedQubCbor bytes ──(public)──▶ stored as-is
SealedQubCbor bytes ──(private)─▶ AES-256-GCM(K, …) ▶ OuterWrapper ▶ stored
Ein almennur qub er tíðarlæstur men ikki leinkju-stýrdur: hann verður verandi ólesiligur fram til drand-runda hansara verður útgivin (tlock-lagið er óbroytt), men eftir avlæsing kann hvør, sum hevur samleikan hjá goymsluhandlinum, avkryptera hann — eingin URL-brot-eind er kravd, tí einki K er. Hetta er tað viljaða skiftið fyri yvirbríkar, sum ambætarin má dríva: avdúkingar-fráboðanar-teldupostar, fragmentleysir oEmbed-/sjálvvirknir embed-leinkjur og ríkari eftir-avdúkingar-SEO krevja øll eina leinkju, sum riggar uttan ein loyndarleynd, sum ambætarin ongantíð heldur (§13.6). Ein privatur qub kann framvegis nýta tað úttrykkiliga sniðið <qub-embed src="full_delivery_url">, tá útgevarin letur fulla førleikan við brotinum fylgja.
Avleiðingar, sum ein framleiðari MÁ taka hædd fyri:
- Eingin mótstøða móti uppteljing. Almenn qub geva frá sær §13.1-mótstøðuna við skapi. Tey beru innarabætini eru kennilig og kunnu lesast við almennum drand-undirskriftum eftir umfarið; privat qub varðveita eyka leinkjuførleikalagið K.
- Reintekst-heiti útsett á innsiglingartíð. §3.2-
title-teigurin er reintekstur innan íSealedQubCbor. Undir umbúgvingini er hann fjaldur, til ein lesari letur uppK; uttan umbúgvingina er hann heimslesiligur á varandi goymslupláss frá tí løtu hann verður upphalaður, áðrenn avlæsing. Samsvarandi høvunda-appar MÚGVA greiða frá hesum á innsiglingartíð. - Uppdaging er bygnaðarlig og verður krosskannað. Ein samsvarandi lesari/embed skilir goymdu skapini sundur við tólking: bæti, sum tulkast sum
OuterWrapper, taka avumbúgvingar-við-K-leiðina; bæti, sum tulkast sum berurSealedQubCbor, verða góðtikin beinleiðis. Endurfingna innara virðið MÁ samsvara (0x00fyri innpakkað/privat,0x01fyri bert/alment).qub_idbindur ikkivisibility, men kanoniskuSealedQub-bætini bera teigin, so almennar og privatar innara enkodingar eru ikki bitaeins.
Privatur (umbúgvdur) verður verandi sjálvsettur; almennur er eitt uttrýkiligt høvunda-val fyri hvønn qub.
14. Royndarvektorir
14.1 qub_id Avleiðing
Input:
version = 0x01
content_type = 0x01
created_at = 1735689600 (2025-01-01 00:00:00 UTC)
unlock_at = 1736294400 (2025-01-08 00:00:00 UTC)
outcome_at = absent
drand_round = 4695446 (= floor((1736294400 - 1595431050) / 30) + 1, §4.3 mapping, drand mainnet params §14.2)
body = "Hello, future." (UTF-8, 14 bytes)
title = absent
Intermediate:
body_hash = SHA3-256("Hello, future.")
= 76ab8b3f843c6ed4f2d0fd75b9f457b4
ad49dd4450f9c22723ae430e3af3211d
title_hash = [0u8; 32] (title absent — §4.2.1 sentinel)
Domain separator (10 bytes):
[0x51, 0x55, 0x42, 0x5F, 0x49, 0x44, 0x5F, 0x56, 0x32, 0x00]
Preimage (108 bytes—current protocol v1):
domain_separator || // 10 bytes
0x01 || // version
0x01 || // content_type
0x0000000067748580 || // created_at as i64 big-endian (1735689600)
0x00000000677DC000 || // unlock_at as i64 big-endian (1736294400)
0x0000000000000000 || // outcome_at_or_zero (outcome_at absent)
0x000000000047A596 || // drand_round as u64 big-endian (4695446)
body_hash || // 32 bytes
title_hash // 32 bytes (all-zeros sentinel; title absent)
Expected output:
qub_id = SHA3-256(preimage)
= 4a84e3dfaec32954949c30073f8e6506
fd3204c1bb97f9162b81c7587afe412e
Ímótkomningar MÚGVA framleiða eins body_hash- og qub_id-virði fyri hetta inntakið. Hesin royndarvektorin EIGUR at vera tann fyrsta eindarroyndin, sum verður skrivað. Tey kanonisku virðini omanfyri vórðu roknað av tilvísingar-ímótkomningini og MÚGVA samsvara bita fyri bita. Søguligar forímynd-skipanir (fyrr-byrjan — eingir livandi qub-ar veltu á hesum): tann 92-bæta V1.0 qub_id var 3d9fc2390eab043d38a1669ed3b71be76f9eefe872b9569ab1aaa027b88392b0; tann 100-bæta V1.1 qub_id (eftir at outcome_at_or_zero varð felt inn) var b0d032898ad629795150fdcb3f84e518f59ed05b7a2a82bc24ebdb87f52144ed. V1.2 fellir drand_round inn og økir økisskiljaran til QUB_ID_V2.
14.2 Avlæsingarrunda-Kortlegging
Input:
unlock_at = 1735689600
chain_genesis_time = 1595431050
chain_period_seconds = 30
Calculation:
(1735689600 - 1595431050) / 30 = 4675285.0
floor(4675285.0) + 1 = 4675286
drand_round = 4675286
14.3 Kanoniskt CBOR Hringferð
Ímótkomningar MÚGVA vátta, at serialize(parse(serialize(qub))) == serialize(qub) fyri øll gildug inntøk. Hetta er ein eginleikaroynd, ikki ein einstakur vektorur.
14.4 PactTerms CBOR (content_type 0x03)
Input:
pact_version = 1
title = "Scooter deposit"
terms = [
{ key: "Item", value: "Honda Metropolitan scooter" },
{ key: "Price", value: "$100" },
{ key: "Deposit", value: "$10" }
]
party_a = { label: "Alice" }
party_b = { label: "Bob", contact: "bob@example.com" }
notes = absent
Canonical CBOR key order (PactTerms):
"notes"(6) < "terms"(6) < "title"(6) < "party_a"(8) < "party_b"(8) < "pact_version"(13)
Canonical CBOR key order (PactTerm):
"key"(4) < "value"(6)
Canonical CBOR key order (PartyIdentifier):
"label"(6) < "contact"(8)
Tey kanonisku CBOR-bætini og SHA3-256 body_hash verða roknað av tilvísingar-ímótkomningini. Ímótkomningar MÚGVA framleiða bæti-eins CBOR fyri hetta inntakið.
Ímótkomningar MÚGVA eisini vátta, at serialize(parse(serialize(pact))) == serialize(pact) fyri øll gildug PactTerms-inntøk (eginleikaroynd).
14.5 Ytri Umbúgving Tvørmáls-Vektorir
Tann ytri umbúgvingin (§13) hevur eina sjálvstøðuga kanoniska grundgrein á crates/qub-core/tests/vectors/wrapper_v1.json. Hvørt føri fastsetur eitt (key, nonce, qub_id, sealed_cbor)-tupul sum ógjøgnumskygd hex-inntøk og áseta eitt ávíst expected_wrapper_hex-úttak. Báðar tilvísingar-ímótkomningarnar nýta sama JSON-fílu:
- Rust:
crates/qub-core/tests/wrapper_vectors.rs(cargo test -p qub-core --test wrapper_vectors). - TypeScript:
workers/api/src/crypto/__tests__/wrapper.test.ts(npm test).
Grundgreinin fastsetur í løtuni trý lágtøknilig umbúgvingarføri. Tey royna deterministiska OuterWrapper-enkoding og AEAD-samsvar óheft av veitingarskapstreytini í §13.8; serliga gera søguliga navnið basic-text-public og innara visibility = 0x01 ikki tey innpakkaðu bætini til eina samsvarandi almenna veiting. Ein framleiðari MÁ framvegis goyma almenn innarabæti ber og bara pakka privat (0x00) innarabæti inn.
| Føri | Fevjing |
|---|---|
basic-text-public |
Søguligt lágtøkniligt navn. Minsta veruliga SealedQub-skapið, uttan valfríar teigar; roynir bara umbúgvingarbæti og er ikki ein samsvarandi §13.8-goymd veiting. |
with-recipient-pubkey |
SealedQub við recipient_pubkey settum (frátekin framtíðarleið). Roynir eitt annað innara CBOR-lyklasett; serstaka innihaldið í grundgreinini gevur sjálvstøðugt eitt annað qub_id (recipient_pubkey er ikki sjálvur í §4.1-forímyndini). |
longer-body |
~4 KiB likam — royna fleirbæti CBOR-longdar-forskriftir innan í bæði innra brævinum og ytra dulorðinum. |
Ímótkomningar MÚGVA framleiða bæti-eins expected_wrapper_hex fyri tey skrásettu inntøkini. At endurgenera grundgreinina krevur QUB_REGEN_VECTORS=1 cargo test -p qub-core --test wrapper_vectors og er varðveitt fyri skildar snið-broytingar.
15. Krypto-Profil Stýring (Framtíð)
Hesin parturin er upplýsandi fyri v1 og verður normativur fyrstu ferð, eitt annað algoritmur fer inn í nakra av qubs kryptografisku grundleggjandi eindunum.
15.1 Núverandi Støða
Protokollur v1 bindur júst ein algoritm fyri hvørt grundleggjandi eind:
- Undirskrift: ML-DSA-65 (
sig_alg = 0x01; 1952-bæta almennur lykil, 3309-bæta undirskrift) og óundirskrivað (sig_alg = 0x00). Kotugrunnurin tekur0x02frá til Ed25519, men protokoll v1 virkjar tað ikki; ein v1-váttari MÁ avvísa øllsig_alguttan fyri{0x00, 0x01}. - Tíðarlás: drand quicknet bert — keðju-styttingin, almenni lykilin, upprunatíðin og tíðarbilið eru fast netverksparametrar, sum tilvísingar-
DrandTimelockProvider::quicknet()(crates/qub-core/src/tlock.rs) ogconfig/drand-endpoints.jsonbera. - Ytri umbúgving: AES-256-GCM v1 bert (§13).
Váttararnir fastkoda í dag lykla- og undirskriftslongdir fyri hvørja virkna grundeind. Bætini fyri sig_alg og umbúgvingsútgávu eru greiðir veljarar, men v1 samráðist ikki um tey í bandinum og loyvir bara virknu virðunum omanfyri.
15.2 Ætlaða Lag
Tá ið eitt annað algoritmur fer inn í protokollin, verður verifiserarin settur upp fyri ein nevndan CryptoProfile (t.d., ExqubV1), sum listir tað júst settið av loyvdum virðum fyri hvørt grundleggjandi eind — sig_algs, drand-keðjur, umbúgvingsútgávur, innihaldsslag. Profilið er fastsett á verifikatiónstíð, ongantíð samhandlað í-band. Hvørt virði uttanfyri tað virkna profilið verður avvíst.
Hetta tryggjar, at at leggja ML-DSA-87 afturat ella at virkja Ed25519 kann ikki afturvirkandi veikja tilstaðarverandi verifiserara-uppsetingar: ein v1-verifiserari verður verandi ein v1-verifiserari, sjálvt eftir at eitt v2-profil er útgivið.
15.3 Útloysingartreytir
Lyft §15 til normativa støðu, tá ið nakað av tí fylgjandi verður fyriskotið:
- Eitt annað
sig_alg-bæti (Ed25519-virkjan, ML-DSA-87, ella nøkur nýggj innfeting í §9-skrásetingina). - Ein onnur drand-keðja í framleiðslu-nýtslu.
- Ein onnur ytri-umbúgvingsútgáva.
Til tá er §15 ein staðhaldari, sum fastsetur flytingar-lagið, so framtíðar PRar lenda móti einum kendum máli heldur enn at endurmeta samhandlingar-yvirvøddina frá byrjan.
16. Flogavísari fyri gagnsæi og haldføri stig (Innført — gjøgnumgangur liðugur)
Støða. Hetta kapituli er framkvæmd (W5/UP-B1, Stig 1–8), við framleiðaranum og trúðarrotarspørkinum nevnt her. Teinformatiónirnar, hash-ingar, og virknarleiðirnar eru livandi: kjarnan Merkle + kanoniska CBOR-typurnar (
qub-core), TypeScript-spegl + ANS-104 bólingarveitari (workers/api/src/crypto/), tann einstaka rithøvundurinLogDO+ samansett R2 knútavøra við kordinataleysing, tann/uploadlog-append roynd, dagligu akker + bundler-drain crons, taGET /api/v1/qub/:tx_id/proof(innihald) ogGET /api/v1/log/consistency(RFC 9162) próv-endpoint, tað týpda viðfaringarpróvið ið verður borið í.qubpakki (§17.5), tann innføddi ANS-104 akkerispróvarin (tools/qub-verify), og teir báðu sjálvútgivnu høvdingarnir kroka (§16.6). Ein eydnusamur/uploader altíð R2-viðhaldsfastur, men er bert logg-dekkaður táLOG_DOer stillað upp og inline-viðførsla eydnast; bert tá ber svar hennaralog_seq,receipt, oganchor_status. UmRECEIPT_SKer fjarverandi ella ógyldig, tann kvittansig_b64urler tóm og veitir onga trygging fyri, at tað ikki kann batast. Núverandi/sealog sáttmálans útgávustíggið skrásetir einstakar Arweave-transaktiónir, men leggur ikki afturat ein log-bløð. Onkur kóði fremur í løtuni ikki/uploadviðmerking umframtlagt seinni sáttmála eftir eitt viðbótarbrest. W5 uttanlands kanning er liðug: §16.15 skrivar hönnunaravgerðir og startmøguleikar, men hesi avmarkingar víðka ikki framleiðaradekningina sum fyrr er sagt. Trý trúnaðar-/útflytingarliðir eru framvegis avmarkaðir: (a) tann serstaka akkerispungin (ANCHOR_JWK;LogProfile.anchor_ownerer framvegis tað[0xAB; 32]plásshildari); (b) kvittan undirskriftarlykilin og samsvarandi almenn-lyklapin (RECEIPT_SKer valfrøðiligur ogLogProfile.receipt_pubkeyer í løtuni tómur); og (c) GitHub-útgáva-høvda-sjálv-gjørt goymslu + token (§16.6). Innan tær tíðir sum akker/profil pinna eru tøkar, ber ein sjálvstøðugur prógviefdarar til frágreiða próvstatus sannførandi í staðin fyri at staðfesta eina fullkomiliga akkeraða, pinnaða próvtøku. Hönanin er strangliga eyka og er einki broyting til taðSealedQub/QubEnvelopestrengjuformat.
16.1 Røktargrundarlag og tryggingarløg
Tey núverandi útgávuvegirnir skera sambandi millum viðurkenning og Arweave staðfesting: tey framleiða og undirskriva eina einstaka viðgerð, varðveita listaverkið og nágreiniliga innsendingarstøðu í R2, og leggja síðani út ósamstundis. Transparency logfiletið leggur eina sjálvstøðugt forankraða raðfestingarlag fyri undirbýtið av almenna /upload fyrrispurningar, sum LogDO legg til eydnast:
| Stig | Navn | Trygd | Tá |
|---|---|---|---|
| T1 | R2-fyrsti samtíða staðfesting | Tíðarhalds gólf — løgd bíta og nágreinilig útgávustøða verða skrivað til varandi goymslu áðrenn eydnaður verður vístur. | Sett í verk tvørtur um núverandi útgávuleiðir. |
| T2 | Batchað gjøgnumskygni-logg innlegging | Bert við viðfesti, manipulerað ábyrgd + samlað bílegging, tá ið tað er viðgjørt og fest. | Núverandi framleiðari: eydnusamur LogDO leggur afturat frá /upload; svarið ber við kvittanaratuplið. Einki universelt. |
| T3 | Per-qub Arweave varan | Ein einstøk Arweave-viðgerð fyri qub. | Liggur nú klárur til hvørt góðkent útgávu og verður sendur ósamankoplað; tann nágreinliga undirskrivaða sendingin liggur í tømiligum útsendingarkassa til hon er latin. |
Stigini lýsa ymisk vavið og halda eigindir, ikki tað núverandi vinnuliga ætlan. Núverandi kodin skrásetur framvegis eina einstaka Arweave-transaktión fyri hvørja góðtaka útgávu; hon vísur ikki T3 bert sum ein gjaldsvegur til at uppsjóða. API-lykil/accounts kvotetakningar eru framvegis hvør sínar umsóknarkontroller.
Táttføri og honnesti. T1-skrivingin er samstundis, so eitt eydnumevni svar tryggjar tøkni á umsóknarstigi uttan at awaita eftir einum Arweave-gátt. Hon stovnar sjálv ikki ein sjálvstøðugan tíðarmerking. Ein váttað einstaklingur viðgerða gevur yvirmálstíðina fyri blokkina. Fyrir eitt svar, sum ber við fullkomna T2-móttøkutuppli, kann næsta váttaða ankura veita dagførda prógin sum lýst niðanfyri. Um tuppli ikki er, kann ongin yvirflata vísa á, at hendan qub longu er í gegnsktáloga. Ankura- og útgávu-tískil eru eingi protokoll-stigi tøljustandlar.
16.2 LogLeaf Strúktur (tvey bundin form)
Ein dagføring í dagbók er ein LogLeaf, kodað sum hondskrivað kanoniskt CBOR undir §3.1 prófilinum (ákveðin longd, ongar merkingar, ongar flytandi kommatøl, stytsti formur av heiltølum, NFC tekst, valfríggjar økir latnar út tá tær eru ikki til staðar, lyklar raðaðir eftir kodaðu-bytar longd stigvís síðan eftir bytewise). §3.1 parse → re-encode → compare kanonisk vakt verður framd á kóðavegin áðrenn hashing (ikki bert á avkoding), so tvey útførslur kundu ikki vera ósamdar um lauf-bytes ígjøgnum eina heiltølu-breidd ella lykil-raðfesting mun. Allar heiltølur eru u8 / u64 / i64; øll digests eru 32-býta býarstrengir (bstr[32]). Ein goymd Arweave viðgerðarskráar-ID er ein raw 32-bita SHA-256 samanrenning flutt sum bstr[32], aldri ein base64url tekststrengur (samsvarar §3.3).
Bløðið hevur tveir formur valdir av einum kind být, tí almennu upploftingargongdin er bókstavablind: POST /api/v1/upload viðvitað viðger bæði góðtikin lastarkappingarmyndir sum ógreiðanligar og mótekur qub_id og unlock_at bara sum ótryggdar tryggingarsendingar frá kundum. Á standard privatari kós. body_hash, drand_round, created_at, og drand_chain_version eru afturat fult inni í §13 ytra umbúð, ið lykilin hjá Arbeiðaranum ongantíð hevur. Slagskipanin ásetur eisini ein staðfestan skikk fyri ein framleiðara, ið fremur body_hash / drand_round seg sjálvt. Núverandi /seal leiðin hevur hesi virðini, men kallar ikki LogDO, so framleiðsla gevur í løtuni bert staðfest (“0x02) leggur frá eydnaðari almennu-upplatingar viðbøtur. Deilingin heldur hvørjum bundnum virði rættvísi uttan at lata sum um tann staðfesta framleiðarin er tengdur:
| Lykil | Heftis longd | Slag | Líkaslag | Merking |
|---|---|---|---|---|
seq |
fýra | u64 |
neyðugt | Globala 0-byggða laublendisskrá; staðsetingin sum viðurkenningarggjaldið staðfestir. |
kind |
fimm | u8 |
neyðugt | 0x01 staðfest-hæfur (avmarkaður, ikki sendur út løtuna) ella 0x02 staðfest (kundi-segl / bólt-blind uppload). |
ref |
fýra | bstr[32] |
neyðugt | Blað vísa ID. Vitnaður → reinskur qub_id. Hevdið → te blindur ið SHA3-256(qub_id ‖ log_blind_secret) (§16.2.1). |
chash |
seks | bstr[32] |
neyðugt | Innihaldsadressa SHA3-256(stored_bytes) — tann eini innihaldsbandið arbeiðarin altíð heiðarliga kann rokna, á báðum leiðunum. |
unlock_at |
tíggju | i64 |
neyðugt | Avritað (vitnað) ella staðfest (staðfest); váttað > 0 áðrenn tað fer inn í blaðið. |
received_at |
tólv | i64 |
neyðugt | Arbeiðari veggur-klukka á R2-ack. Óábyrgdaravekjandi (virkjarin-ásett; §16.6). Til staðfestingar fyri sjálvs-skriving, ongantíð prógv. Váttað > 0. |
body_hash |
tíggju | bstr[32] |
kind=0x01 bara |
Burturvald á 0x02 — arbeiðarin manglar tað sambært §13. |
drand_round |
tólv | u64 |
kind=0x01 bara |
Burturvald á 0x02. |
A kind=0x02 laufið germeinandi framvegis einki body_hash nor drand_round: tað vitnar um ábyrgdina og raðfestingina av einari ógreiðari dulkóðaðari tekst við innihalds-adrressa chash, ásakandi qub_id og unlock_at — ikki taðs plaintekst ella runding. Plaintekst/runding beinini fyri ein staðfestan qub koma frá verandi §11 .qub-pakka váttan, ikki frá skrásetingini (§16.11). drand_chain_version er ikki í blaðnum (tað er inni í umbúðini á standardleiðnum); keðjulíðinginearv virkar á ankrið (§16.7). Kodaraðarhald: avvís alt-nulla ref ella chash, og vísa frá ikki-støðugum unlock_at / received_at, speglandi tað outcome_at > 0 vaktarvakt í cbor.rs.
16.2.1 Private-qub blindandi
Dagbókin má ikki gerast teljiorakulin, sum §13 ytri umbúgvingin bert er til at forða fyri (§13.1). Fyrir ein privataðan (umbúgvin) qub asserted lauf gerir brotini blindur kennari SHA3-256(qub_id ‖ log_blind_secret), har log_blind_secret er ein server-haldið loynismál, og útlátur body_hash. Ein triðjaparti kann ikki knýta eitt slikt blað til nakað ávíst qub_id; haldarin av qubnum, sum hevur levering URL-ina og tí qub_id, kann endurreikna tey blindu fyri at vátta teirra egnu inklusjón. Ein almenn qub (longu teljanlig, longu carrying the Visibility: public Arweave-merki sambært §13.8) bindur tað ósnilda qub_id. Hetta er tann einasta staðið har sjálvstøðug verifiserbarheit viljiðande gevur vegin fyri eini byrðamikla rønartryggdarreglu; sjálvstøðuga sambandið fyri privata qubs er chash (§16.9).
log_blind_secret vernd (loyst — §16.15 K4). Tey blindu verja bladsambandsleysni, ikki reinskriftarleynsemi (§13-umbúrið heldur tað sjálvstøðugt). Á eini log_blind_secret semja, fyri nakran qub_id mótarvinurin heldur longu ella kann endurskapa (hvørt qub, sum hann hevur bundlið/URL á, viðlíkum hvørjum lágentropi ella almennum qub_id) tað endurrokna blaðið ref í eitin hash og knýtir tað — hetta er beinleiðis samankopling av einari kendari fólkatalsbólki, ikki ein brútaltáttur á ein ókendan rúm. Flokkset log_blind_secret sum ein korrelatión/Sybil-støð á sama varðhaldsstigi sum aðrar servarleyndarmál, og snara framáftur bert (ein snaring endurnýggjar komandi bløð; hon kann ikki afturverkande loysa longu festu bløð).
16.3 Laukur- og knútahashing
RFC 6962 §2.1 lénis-skilja hashing við SHA-256 skift út við SHA3-256:
leaf_hash = SHA3-256(0x00 || canonical_cbor(LogLeaf))
node_hash(l,r) = SHA3-256(0x01 || l || r)
empty tree = SHA3-256("") // defined but never anchored
Heimasíðuforstavi bítar 0x02 (inntøkukeðja, §16.4) og 0x03 (STH hash, §16.6) eru varðveitt og skiljast frá hesum. Tey eru einslig byte og kunnu tí ikki kolliða við tey núverandi 10-byte ASCII sjálvsmerktartoymið (“QUB_ID_V2, o.s.fr.). Træið er RFC 6962 vinstrumegin-fullur ójavnur tré (hvør innanfyri skipan er býtt við størsta styrkinum av tveimum, sum er striktið lægri enn talið av bløðunum í undirtrénum), sum loyvir viðurkendan og álitvirði próvtøku at deila eina eftirlitsleiðs algoritma. Reference spesifikasjónin hevur sjónligan vinstri/høgru derivatión pseudokóða og festir eina ekki-máttur-av-tvey (5-bløð) royndarvektor so tann rættarkantið kynstrarbestigningartilfarið — ið ein 4-bløðuga vektor fjalir — verður brúkt.
16.4 Hash keðjutilsing (innanhýsis)
LogDO heldur ein innanhýsis innskrivingar-keðju bert fyri tyggjunarkonsistens. Tað er aldin ikki útgivin og aldrin miðvíst móti váttara:
entry_chain[seq] = SHA3-256(0x02 || entry_chain[seq-1] || leaf_hash[seq])
entry_chain[-1] = SHA3-256("QUB_TLOG_GENESIS_V1")
Tann útgivna viðfestu-hátti myndugleikin er samanlagt Merkle-rót + hennar ankur (§16.5–16.6), ongantíð tann upprunaliga raðin, sum virkið hendir sær at tæna bløðini: keðjan roknaði aftur fyri hvørja raðfylgju, sum verður tænt, so bert tann festi rótarpinnurin setur kanoniska støðu.
16.5 Kumulative Merkle-træ og samling
Verður ein altvaksandi RFC 6962 tré yvir øll bløð í seq raðfest — ikki einsamøll træ fyri hvørt part. (Ein carry-bløð-ketaður fyri hvørt part bygging varð vísað frá: hon er ikki ein verulig fyribrúkssamband, so hennara „samlaðarbýiningarpróv“ eru ikki haldgóð.) Hið samlaða træið gevur verulig RFC 9162 samlastøðurpróv og loysir eina eina nýliga ankara at prógva inkludering fyri øll eldri qub.
Tað LogDO Virknað Objekt er einsamallur rithøvundur (blockConcurrencyWhile, spegla QuotaDO / EntitlementDO) — at føra afturat einum felags loggi er at lesa-breyta-skriva á felags støðu og skal tí MÁ ganga um ein DO, ongantíð KV. Hann cachar trætopsins hægráa spælkan (O(log n) hashes) so at lata eina pakka er O(batch). A bunti er sett av bløðum bundin saman; tey innførdi kveikjararnir eru ein tree_size fráboðan á minst LOG_BATCH_MAX_LEAVES (standardur 4096), aldur, ið nærkast til tyngdarpunkt-taktin, ella ein ávísur stýris-/cron tvangsloking. root_i er tann samlaði Merkle Træ Hash yvir bløðini 0 .. tree_size_i.
16.6 Undirskrivaður Træs Høvd via Arweave Anchor
Arweave ankurtaningin er tá Undirskrivaða Trætopp-høvd kýtir ein leiðari undirskrift fyrir sjálvan træhøvdið: dagliga ankrið hevur ongan qub lykil vegna Arweave-transaktiónina owner er undirskriftin. Miðtekin um kósin heldur — tann óbroyttur grundarlagið, ikki ein qub-hildin loyniligheit, ber lastina fyri ta festu røtini.
Dagbókaruppskriftin krevur eina heita eydnuríka-viðlegg kvittanlykill (§16.10), fest í LogProfile og tvískrivað av anchor_owner. Núverandi útgáva hevur ikki lokið tann álit-rótar-útvegan: RECEIPT_SK er valfrítt, ein fjarverandi/ógildur lykil gevur sig_b64url: "", og samanumtókta LogProfile.receipt_pubkey er tóm. Soleiðis eitt kvittan kann lýsa viðfesta blaðið, men er ikki ein ikki-frásigandi undirskrivaðar kvittan. Har sterkara sniðkravið talan er bert galdandi, eftir at ein staðfestarifríðari letur fríggjarir pinnarnar til samsvarandi almannakeys lykil, og eigarin av grunnsteininum undirskrivar tað. Ein útgávusvar uttan fulla kvittanartúplu ger ongan krav um dagførdu góðkenning; ein við tómum undirskrift ger eitt krav um viðlegsstað men einki krav um undirskriftsframhald.
Tað SignedTreeHead er kanonisk CBOR (lyklar eftir kóðaðari longd): size:u64, root:bstr[32], batch:u64, prev:bstr[32] (fyrr) sth_hash; genesis = 32 null býar) log_id:bstr[32], first_seq:u64, anchored_at:i64. Its hash is sth_hash = SHA3-256(0x03 || canonical_cbor(SignedTreeHead)).
Festur treysta rót. log_id = SHA3-256("QUB_TLOG_V1" || anchor_owner_address). Ein samsvarandi eftirmetingarhtmlari MÁ krevja anchor_tx.owner == LogProfile.anchor_owner, har anchor_owner (og kvitansulyklakynsliga lykilin) er bakaður inn í qub_core sum LogProfile — samstundis við tey skjótnet konstantini, sum longu eru inn DrandTimelockProvider::quicknet() — og útflýggjað við verifier binary. Verifier má eisini viðmerkja Arweave tx data → tx_id binding lokalt frekar enn at stóla á ein gátt /raw/ svar. Hetta lokar rovskapspungsevniverkið: „taka festi á Arweave“ hevur ongan týdning, fyrr enn sannprógvarin festir hvørja pungin.
Rokking er ein §15 stýris útvidging, ikki eina endurnýtsla (loyst — §16.15 Q3). §15.2’s profilyvirflata telur í løtuni bert sig_algs / drand-keðjur / wrapper-útgávur / innihaldstýpur, og §15.3’s tennarar lista ongan av hesum — LogProfile / anchor_owner er ikki enn á yvirflatanum í §15. Róteringsstýring má tí verða bygd: §15.3 er útbygd (niðuranfyri) fyri at leggja til ta LogProfile tóta, og ein snúningur er undirskrivaður LogProfile bump sendur í eini verifisera-uppdatering. A ætlað rótatión ber eina útfara → innkomandi kross-signatur; ein sem byggir á fíggjarnevnur rotatión kann ikki (tá útfarandi lykilin er ótryggur/ófáanligur) og fellur aftur á §15-stýrdan bump, við fyrra-anker-gaffli-eftirkanningini (niðanfyri) avmarkandi skaða í millitíðini.
Tvístøða vindeyga (hástøðuliga álitspunktur). Eitt blað er bert tvítyðnis-motstøðuført, tá taðs umfataði akkeri er Arweave-váttað. Gluggin er received_at → anchor confirmation (cadence + Arweave endaliga, við ongum protocol seinkingartrygd). Áðrenn trust-root útvegan, veitir núverandi framseting drívniintegritetin hjá qub plus hvat sum helst óundirskrivað viðfesta metadata; tað veitir ikki tann ætlaða ikki-benignligan trygd. Tríggir accountability artefaktir áseta liðugt snið (trialupart-modellin er §16.15 Q2 loysningin):
- Papírs kvit fyri sel (á sjógvaskapi) — SCT-analógurin varð endurvildir tá ið eitt upload log-innskot eydnast (§16.10). Hann gerst ikki-nevnanligur fyrr enn
sig_b64urler ikki-tóm og hin samsvarandi almenna lykil/viðfestur-eigara sambandið er fastrætt í sannførararnum. Hin nútómda framleiðsluprófílfasta kann ikki stuðla tí dóminum. Henda eftirlit áhepum ikki á ein útlitin kvittantuple ella ein undirskriftarleysan kvittan. - Almannakunngjørd monitorerings-háttur + fyrri-keðja gongutúr — akkurin
prevkeðjan verður gingin høvud→uppruni; ein gaffil (tvey akrur á einumsizevið ymiskumroot, ella brotnaprev) er útgivandi prógv fyri óheppiligum atburði. At kenda tvískalaðheit er ein ásettur arbeiðsáttur, ikki ein stillfandi antin. - Tvíbundin sjálvútgivin høvd — hvørja nýggja høvund
{sth_hash, tree_size}er sent til ein serliga qub-eigdan almennur, bert viðlagt GitHub-goðskrá (talað-bera tamper-viðkomandi sjálvprentað bein), við einum samfelagsmiðla innlegg sum besta roynd at staðfesta bert. Ein misheppnað innsending MÁ síggja síðu (ikkje lata staðleysan mistak). *Framført (Stig 8) sumpublishHeadháls á akkeri cron (workers/api/src/utils/heads-publish.ts): aPUTtil innihalds-API utan einshaer bert til at leggja afturat (ein422býtir at høvdið longu er útgivið, ongantíð ein yvurskriving); velja / útseta-trygd áPUBLISH_HEAD_GITHUB_{TOKEN,OWNER,REPO}og inertur til goymslan er útvegað. Ein harð GitHub bilan síður gjøgnumhealth_alertrás og rísar ein varandi misboðsmátari (m:tlog_publish_head_fail); Arweave-ankrið sjálvt rullar ongantíð aftur við eina útgávu-vanlukku. „Ikki at misheppnast burturlítið“ er ábyrgdað av tí varandi málinum — sum operatørar MÁ setast á dashboard-alarm fyri — ja, sjálvt um bestu-tilfeingi telda-síðan ikki kann viðmerkjast. Tvey heiðarleys takmarkingar fylgja av „ankur-på-framstig“ (cron útgevur bert tá støddin framstig): ein bráður GitHub-vanlukka eftirlætur ein bil í útgivnu-høvdini røðini fyri hesa stødd — avmarkað, ikki still (hon blaðar), og tí at hvør høv commitir ein superset-træ, eitt §16.9 samanhangarsfrøði-brúar bilið; týdningarmikið, at hesin samanhangarsfrøði verður útroknaður frá ábyrgdar Arweave-jarðbundin træ, ikki frá GitHub-yvirflatanum, so ein GitHub-gap ongantíð veikjar váttanarmáttin. Ein innfylging sum fýrurheldur útskrivaðar høvd-gap er ein útsettur menning.
Heiðarleiki bundin (bindandi avmarking). Tí at qub stýrir bæði ætlaðu útleggingarflatum, er hetta sjálvútgivin, ikki sjálvstøðugt vitnað. Einki vørur, marknaðarføring ella lóglig yvirtøka kann halda, at loggin er „sjálvstøðugt vitnað“. Eftir at kvittan/profilu/høvuðsimportgáttirnar eru útvegaðar, er loyvt at siga, at tvívur er at finna og eitt viðurkennt undirskrivað viðlegg skilur eftir eina ikki-nevndari kvittan. Áðrenn tað, er henda krøv ikki tøkkur. Ein veruligur óheftur triðju-viðkomandi vitni verður sett aftur til eina framtíðar §15 stýrisuplifting.
received_at er operator-festur og einki krav kann stuðla seg á tað — tað fer ongantíð fram sum prógv ella sum mótuverskiljandi váttan á nakað vøru- / lógar- / API- / prógv-rendering yvirflatu. Arweave festiblokk-tíðin T er einasta treystaleysa tíðarmerkja (ein ovurstak á „skrivað av“). Nakar monitor sanitetarkanning á received_at SKAL samanbera móti T, ikki ímóti framvegis stýrdum av operatørinum anchored_at STH øki; ein slík kanning er bert ein vakt móti eini klokkuvillu hjá einum ærligum virkjara, ikki ein ábyrgdarviðgerð móti einum illkvittum leiðara (§16.15 Q5).
16.7 Anchor-samskiftisformat og rytma
Tað AnchorBundle er tann kanoniska-CBOR Arweave viðskiftikroppurin, skrivaður via §16.8 bundler: ver:u8, sth:bstr (kanonisk SignedTreeHead býtar), prev_anchor:bstr (fyrrverandi akkeris-transaktión id reyð bytes; útlatin við upphavi), chain_hash:tstr (tørra keðjan í virkni — quicknet), og pakka blað-CBOR straumur inn seq bílegging so at akkern er sjálvstøðug: ein eftirlitsmaður endurhugsar root frá kroppinum við null qub-fígging. (Um blaðstreymurin verður stórur við høgan umfong, kann ein framtíðar útgáva bert skriva ein blaðraðar við reference; merkt, ikki tikin í brúk í v1.)
Arweave merki eru ætlanarliga teljandi — dagbókin er * ætlað * at verða funnin, í mun til privata qubs: App-Name: qub-tlog, Anchor-Format: 1, Log-Id: <hex>, Batch: <n>, Tree-Size: <n>, Root: <hex>, Prev-Anchor: <tx>, Content-Type: application/cbor. Merkir eru ótrygd vísbendingar; CBOR-innihaldið er eina valdið.
Taktsyn dagliga sum sjálvval, endurskoðað við ummæli (stórðutriggarin styttir sjálvir effektiva taktsturðin undir álagi). Núverandi framleiðari fremur ikki ein gjaldstimplaðan kraft-bólthaldarakroka. The ankerpláta er dedikerað og lág-ára, skiljast frá upphalsibesiðaranum — tað MÁ vera tað egna eigin JWK (ein serstøk lykil, ikki ein logiskur leiklut á viðlíkahlutaplássinum) soleiðis at eitt uppuplas-viðlíkahluta brot ikki kann falska ankra — við einans ein strangan dagligan ankraumskiftibúskap. Hugsunin um varðveitslu er greitt fráboðin: ein nákvæmur stuttur skrásetingarvegin við tættan roðari og lága jøvnvág, ikki „kaldur“ — ein veski, sum sjálvvirkandi undirskrivar dagliga, kann ikki vera kaldur, og specifikasjonin ger ikki annað vart við.
16.8 ANS-104 Bindari
Ein innanhýsis ANS-104 DataItem kodari og djúpt-hash undirskriftari, uml. 300 linjur, Bert Web Crypto, einki npm-háðing (bæði Turbo SDK-ini miseydna npm ci --ignore-scripts veitingar-ketla gátt). DataItem bóltur útgerð:
signatureType (2, LE) || raw_signature || owner || target(flag+0|32) || anchor(flag+0|32) || num_tags(8, LE) || tags_len(8, LE) || avro_tags || data
Undirskriving er Arweave deepHash — ein endurtakandi SHA-384 meltan (krøvini til snúru hjá Arweave, crypto.subtle.digest("SHA-384")) omaná ["dataitem", "1", sig_type, owner, target, anchor, encoded_tags, data] — so RSA-PSS yvir dýpu hash við veskinum JWK gjøgnum crypto.subtle; id = base64url(SHA-256(signature)). SHA-384 her er isoleraður sum ein Arweave-snúr-berur frumgrein, ongantíð ein qub álit frumgrein (§15 skrásetur hekk; qub trust hashing er SHA3-256 altíð).
ANS-104 kóðaleiðin tænir til tikna bataveitslu/útstreymismaskinuna og skrivar AnchorBundle DataItems. Vanligi útgávuvegurin skapar fyrst ein nákvæman undirskrivaðan Arweave-traðk og heldur JSON hansara í einum varandi útpósti; beinleiðis útlegging er ein seinkingar-optimalisering, og tómavegurin roynir sama traðk aftur áðrenn hann nýtir bundler fallback hansara. Undirskriftarskipan (loyst — §16.15 Q8): v1 undirskrivar við RSA-PSS (undirskriftartype 1) endurnýtað tað verandi Arweave veski JWK menniskja (ekkert nýtt langlívt lykilansvar, tænir „ein færri loyndarmál“ greiningini); Ed25519 er útsett til §15 PQ-flutningsleiðina.
Hondrullaði djúpi hashurin er kóði við hægsta váða og lægsta náttúrliga umfatan í W5, so at hann verður stýrdur óviðrøkandi (§16.15 Spurning 8):
- Tværmáls-festingin
tlog_v1.json(Rust + TS, §14.5wrapper_v1.jsonmynstur) umfatar djúphash, DataItem byte + id, blað-hashir, ein 5-blaða røtur + eftirlitsslógi, ein STH-hash, ein innløgnar prógv, og ein samanhangilig prógv — í bæði undirskriva og tryggja leiðbeiningarnar (athyglini til staðfestingarstøðuna týdningarmikil tí §16.6’s lokale tx → tx_id kanning drar dýpa hash-in inn í hvørja støðuga staðfestara, ikki bert skrivaran). - Ein einstøk interop rundferð gjøgnum ein reference ANS-104 bundler, brúkt sum støðug prógvsgögn bert — ongantíð eitt npm køri-tíðar áhugin (stillingin við bert Web-Crypto / einki-install-scripts stendur enn).
- Dýpri hash + RSA-PSS leiðin má ikki rundar-ferðast gjøgnum somu
crypto.subtlegrunnstig framleiðsluendamál, so innanhýsis kóderin er byte-samrýmdur. - Verandi eftir-pakka góðkenning eftirlitsmaður váttar, at hvørt ankra / fallback DataItem veruliga fær Arweave góðkenning, við eini alarm + kretsbrotara — tí at djúpi hash eisini tænir til Arweave-ótilgjengiligheit fallback-røðina, so eina stille afturgongd hevði fylt hesa røð við netverksavvísdum punktum í júst tey útfallið, hon er til at dekka.
16.9 Innifatan og Samsvarandi Prógv
Bæði eru RFC 9162, SHA3-256, servert sum kanonisk CBOR.
Inkluderings prógv — GET /api/v1/qub/:tx_id/proof: ver:u8, leaf:bstr (ta nákvæmu blað CBOR — staðfestarin endurreknar leaf_hash seg sjálvt og treystir ongantíð á einu veittum hash), index:u64, size:u64, audit:[bstr[32]], root:bstr[32], anchor:{ txid:bstr[32], batch:u64, sth:bstr[32], log_id:bstr[32], block_height?:u64, anchored_at?:i64 }.
Samsvarsvitni — GET /api/v1/log/consistency?first=<size_a>&second=<size_b>: ver:u8, first_size:u64, second_size:u64, first_root:bstr[32], second_root:bstr[32], nodes:[bstr[32]], first_anchor, second_anchor. Ein einstøk ótvírædd lyklalisti, fest við royndar vektori.
Støðufest vátta (einki qub servari, víðkar §11):
1. Parse .qub bundle → SealedQub; recompute qub_id (§4.1).
2. Read leaf.kind.
3a. kind=0x01 (attested):
assert leaf.ref == qub_id
assert leaf.body_hash == SHA3-256(body)
assert leaf.drand_round == unlock_round(unlock_at)
3b. kind=0x02 (asserted):
assert leaf.ref == SHA3-256(qub_id || blind) // holder supplies blind
OR treat ref as opaque and bind via leaf.chash == SHA3-256(stored_bytes)
4. Recompute leaf_hash = SHA3-256(0x00 || leaf); fold `audit` per RFC 6962
using index/size; require derived root == proof.root.
5. Fetch anchor.txid from any gateway; verify the tx data → tx_id binding
(do not trust a gateway /raw/ response); REQUIRE anchor_tx.owner ==
LogProfile.anchor_owner.
6. Parse AnchorBundle; require committed root == proof.root and size ==
proof.size; read the Arweave block time T.
7. Emit the claim scoped by leaf.kind (§16.11).
Stovnskoðilig goymsla til prógv MÁ vera samsvarandi lykil-sett (loyst — §16.15 Q7, blokkerandi forkrøv). Kalda blaðs próvvinding er rættvísis-neutral berra um R2 kanningarnevndarútgerðina er ein varandi Merkle-nútustøða goymsla við lyklum eftir absoluttum træ-koordinati (level, index) — ikki per-batch node-deltur. Við eini samanhangsliga-lyklaðu goymslu, hvørja (leaf i, size N) revfisleiðin er ein samling av O(log N) beinleiðis R2 GETvið einki endurútreiking tvørtur um bólkamark; við einum lotulyklasettum handli er tað ikki, ið er goymslulagsskeltið, sum henda loysnini stongir. Bløðkropparnir eru eisini innihaldsadressabelir við seq. Ein W5 royndarvektor MÁ prógva ein genesis-tíðar kald blað móti ein mun seinni røt við bert R2 + Arweave við LogDO goymsluna stroymda, soleiðis at endurheimingartryggingarkravið í §16.13 er grundgevitt heldur enn staðfest. O(log N) raðbundin R2 GETtilhoyra bara á tí ósambestandi próvtindinum — ongantíð á teinunum hjá seal (§16.10) ella ein per-tick cron.
16.10 R2-Fyrsta Ack raðfesting
Tað implementeraða POST /api/v1/upload røð er:
- Fremri helvtar hurðir (auth, váttan, idempotency shard lyklur) — óbroyttar.
- Stovna, merki og undirskriva tann eksakta einstaka Arweave-transaktiónina. Hetta stendst
tx_idlokalt, hóast skapan av transaktsjón kann heinta virðis-/ankur-uppslýsing frá einum gátt. Ein fyrireikingarskeiva miseydnast framvegis fyrr enn áheitan er góðkend. - Samsvarandi skriva tann valda listan á
qub-cache/<tx_id>og viðhalda tey støðugu skapanar-virksemi-/útboksugrunnskrøvini. Hetta eru haldgóðsku- og royndargólv; mistøk áðrenn gjalding gevur 503. - Tá
LOG_DOer konfigurerað, samstundis roynaLogDO.append(leaf). Einasti rithøvundurin seturseq, longar áinntøkukeðjuna og dagførir markið. Append-RPC ger bert tað; batch-close koyrir uttanfyri ávaringina. Ein append-flutnings-/umsóknar-skeinkslufall er í løtuni mistur-bjúgvin: svarið kann framvegis eydnast uttanlog_seq,receipt, ellaanchor_status. Hóast ein útførsla ummæli, er eingin sjálvvirk seinni dagbókar samsvarsupplýsing knýtt í dag. - Vís aftur staðfestingina. Taka við
{ log_seq, anchor_status: "pending", receipt }bara tá appendið vardi tær fullkomnu eydnulegu tuple'ina.receipt.sig_b64urler tómur tá kvittanarin undirskrivarin ikki er tøkur; kundar MÁTA ikki kalla ta virðið undirskrivað ella ikki-frávísandi. Frávera av tupulini merkir bert varandi útgávu, ikki góðkenning í gegnum gegnsýnisloggin. - Brúka eina útsetta uppgávu til at senda tann eksakt undirskrivaða transaksyonin. Vinna tekur burtur útboksina; mistøk lata hana vera fyri tann avmarkaða tømukronu og skulu ikki broyta tað, ið longu er staðfest.
tx_id. Bráðfeingi metadata og aðrir best-fekkast viðbótarflokkar eru eisini útsettir.
Seinkingarmark. Umsóknarstøðvegin umfatar framhálfsheimild/kvotuarbeiði, fyrireiking/undirritan av færslu, haldføra R2-skrivingar, og (tá sett upp) ta LogDO roynd. < 300 ms vísir seg í sniðendurskoðan sum eitt virkandi mál, ikki sum eitt protokoll trygging; tann núverandi fyrireikingarstøðan hjá viðskiftinum kann fremja eina gateway metadata-biðing. Latensilig alarmar og startgáttir eru virkandi stýringar, ikki prógv sum eru tøk fyri ein kannara.
16.11 Fátrað tryggingarmódel — tann nágreiniliga áheitan, avmarkað við blaðslag
Fyri kind=0x01 (váttað) Hesin innihald — kroppur samsvarandi body_hash, staðfest av qub_id — varð útint í qub's append-only log við støði seq og eksisteirði ikki seinni enn Arweave blokk tíma T; tað var kryptografiskt ólæsiligt til drand-rundan R = unlock_round(unlock_at). Hetta er tað fulla {tlock round binding + Merkle inclusion + anchored root} trífalda.
Fyri kind=0x02 (áheitt, sjálvvalið): Ein ógreiður kryptografiskur tekstur við innihalds-fyribilsadressu chash, ásakandi qub_id og unlock_at, bleiv skrásett í viðskot-nú-bert logginum á støðu seq og eksisteirði ikki seinni enn Arweave blokk tíma T. Teir rundu og kroppaskapføturnar verða veittir av verandi §11 .qub-buntu vátta (qub_core::unlock), ikki við dagbókina; tað, sum dagbókin leggur afturat á ein bert per-qub-transaktión, er brotsliga sannaðar raðfesting, eina sjálvsáttu yvirmarksbindingartíð og mótstøðuføri móti tvíburðarboðum.
Bæði krøvini undantaka, sambært §11: rithøvundaskap uttan sig_alg ≥ 0x01, ætlan, og undir-festa-nákvleika tíðarskipan. Eina síður loyvir nakar kravi at styðja seg á received_at.
Kravloft (bindandi byrjunaravmarking — loyst §16.15 K1). Fyri ein staðfestan (kind=0x02) blað, tann umfataði kravið omanfyri er loft um hvat sum helst vørum, marknaðarføring, treytum, ella próvdarútføringarmi flatur kann staðfesta. Onkur flatur kann ikki siga ella ávísa, at loggið próvar innihaldið ella avlæsingsumfar av einari byte-blindari upphøgg — loggið próvar raðfesting + eina treystleysa ovurstøðu-bundna tíð fyri ein ógjøgufráa dulkóðað tekst. Innihald og umfarprógv koma einsamalt frá verandi §11 .qub-pakka eftirlit, sum er loggunavnirkt. Ein útgáva við ongan eydnan append/móttøku hevur ongantíð nakran logg-hevd.
16.12 Útgávustýring og W3 Samráð
Verður nei SealedQub vírrubumpa og tí einki protokoll-versjón hop (§12.2): dagbókin er ein sidecar, sum gevur seg við tilverandi øki og bita, so hon gongur ikki inn í §12.3 protokollufrásøgu um útgávur. W3's valfrítt drand_chain_version er óviðgjørd og gerst hin einasta valfría SealedQub øki. Í staðin leggur skráarkervið fram síni egnu óhefta útgávurúm — LOG_VERSION_1, ANCHOR_FORMAT_1, InclusionProof.ver — speglandi §12.5 kappingar-útgávu óheftni (kappingurin ber ein útgávubyte óheftan av protokolluútgávuni, og loggútgávurnar fylgja sama skipan).
Prógvaflutningur verður tikin sum standard, við eini valfrøðari ferð við. Ein prógv kann ikki vera til á bláttíð (ankrið er enn ikki skrivað), so bláttíðin .qub pakkin verður óprógvaður. W7's sannprógvari sær GET …/proof ein ferð, ella í fullkomiliga offline hátt endurbyggir prógvini frá almenna AnchorBundle gjøgnum ein Arweave fyrispurning um Log-Id. Tann .qub pakki (W7) tryggjar eitt valfrøðiligur inclusion_proof limur — frávikandi á teim staði, fylgt av einum eftir-festi endurnýtslu til kalda arkivering — fylgjandi sama „valfrítt, úteltið sum sjálvsagt, afturatkomandi“ mynstri sum W3's drand_chain_version.
16.13 varðveiting
Goymsluvindeygdirnar fyri LogDO opnu hali, R2 próvtænastusubstrat, forankurskivumbrotstalararnar og bundlar afturfallskøina eru ásettar í docs/DATA-RETENTION.md. Prinsipp: dagbókin's heita per-innskriving goymsla (LogDO) kann endurnýggjast eftir anskar; tess endurskoðanarevni — tann koordinata-lukkutlykkta (level, index) Merkle-nodur handla + tann seq-viðvikuliga blaðkroppar (§16.9) + Arweave leysarnir — er varandi. At fáa eitt kalt blað aftur frá DO ongantíð ger eina útflutta prógv ógilda, tí ein prógv loysir seg móti tí varandi R2 knútageymslu og Arweave leysara, ikki DO (og §16.9 strokna-DO testvísið prógvar hetta).
16.14 Test vektorar
W5 flytir tvørsmánalig útgerð tlog_v1.json (§16.8) pluss virka vektorar: ein kind=0x01 og ein kind=0x02 blað → leaf_hash; tann 5-bløðaða samlaða rótin; eitt inklusions prógv; eitt samanhangsøgt prógv; eitt AnchorBundle; og ein DataItem id. Hesir liva saman við §14.5 ytra-innpakking vektorunum og verða brúktir av báðum Rust (qub-core) og TypeScript (Worker) útgávur.
16.15 Yvirlit av avgerðum (V5 — loyst)
Útgjørda útsjónarkanningin W5 (ein mótmælishugskotsskrá + eigaraviðmerking) er lidin. Hvør avgerð niðanfyri er avgjørd og endurspeglað í §16 tekstinum omaná; atkvøðubindingarkranar avmarkingar verða endurtikin í enda. Frágreiðing kann framfarast undir teimum.
- Sjálvvalin-leið (
kind=0x02) bløð heiðarleiki — AVGJORDAÐ. Sendi tvíbløðug-slagið skorið sum ásett:kind=0x02ger ikki nakaðbody_hashnordrand_round. Nei*_body_hashøki á byte-blinda stígnum (tí hevði tað verið mest lættlesna falska „vísda“ boðskapurin fyri integrerar og er eina hentleika §11 longu gevur frá pakkinum). Gera ikki krafa server-seal fyri log-attesteraðar qubs (tað skuldi tvingað plaintext gjøgnum Worker og oyðilagt crypto-shredding mýrin). All self-describing short-circuit eigur at vera í.qubpakka / prógv umsløg sum ein sannpróvdur endurreiknaður vinningur, ongantíð eitt blaðøki. Eigara- staðfest krøv topp: §16.11. - Tvísæling / undirlating ábyrgd — HØGGJING LOYST, MYNDUGØGL TÍÐINNI ÓFULLKOMIN. Umsitingin krevur, at tryggingarnøglin verður fest við
LogProfileog tvískrivað avanchor_owner, pluss monitoreraðar metodur, prev-chain walk og tvær sjálvútgivnar høvd. Tað samansetta profilið og útferðarkrókar eru framvegis plassarhaldarar/valfríir sum greitt er í §16.6, so tann sterkari upptøkuførdi + kvitteraða kravið er ikki galdandi fyrr enn hesi gáttirnar eru stongdar. Tað skal aldrin verða marknað sum undanfarandi vitni. Eitt veruligt triðjapartsvitni verður útsett til ein §15 stýrisbump. - Festur knútáar eigara treysta rót + snúningur — LOYST. Hevja
LogProfilepin (§16.6); staðfestarinn kannaranchor_tx.owner == anchor_ownerog staðfestir tx dátuna → tx_id binding lokalt. Rótatjónustustýring er ein §15 útbygging til at byggja (§15.3 trigger lagt til), ikki endurnýtt; ætlaðar snúningar kross-signa, kompromiss-drive snúningar venda aftur til §15 bump við gafla-kontrol at avmarka skaða. - Private-qub blað blindandi — LOYST. Halda fram at blindast fyri privata qubs (
ref = SHA3-256(qub_id ‖ log_blind_secret)), rávurqub_idfyrir almenna qub´s (jafnan §16.2.1),chashsum sjálvstøðugi bandið.log_blind_secreter ein samanhangur/Sybil- stig loyniligheit, bara snúa-framm (§16.2.1). received_at— AVGJORT. Halda tað í blaðnum, ásett men greinarliga ikki-sáttarfaklig; alinear ikki fram sum prógv ella mótspurn stuðul á nakran yvirflata. Allar eftirlitssansingar kanna móti Arweave blokktíðiniT, ikki tann stýriður av virkjaraanchored_at(§16.6).- Trýstað prógvað tíma — HØGGILDISLOYSN, EKKI NÚVERANDI RUTING. Hin endurskoðaða útgávan gevur ankarlás-tíð til pakknaði stigið og nágreinigt tími prógv til goldna T3, uttan nakra talgilda SLA fyri tann fyrra. Núverandi leiðir hava ikki tikið hesu vinnuligu munin: tær skráseta eina einstaka viðskiftu fyri hvørt góðkent útgávu, og logg dekkingin verður framvegis treytað sum greitt í §16.1/§16.10. Vørukopi má lýsa útføringina, ikki hesa framtíðar stigbýti.
- Kumulativt træ á arbeiðarum — LOYST. Einki samandrátt RFC 9162 træ + frontier-cached einki-skrivaari LogDO (bíligur headroom móti umleið ~1k skriv/sec DO lofti; útset Merkle-av-skervurreum rótarskervingu til nær tað). Teigur-keyed
(level, index)R2 node goymsla + strikað-DO køld-løv royndar vektori eru framdar (§16.9).< 300 mser framvegis eitt snið-/virksemi mál, ikki eitt protokollavent (§16.10). - ANS-104 undirskriftaskema + djúphash — LOYST. RSA-PSS (sig týpa 1, endurnýtaðu tað serstaka anchor-wallet JWK); Ed25519 útsett til §15 PQ leið. Hin handframaða SHA-384 djúpa hash er bundin at bæði vegir cross-impl fixture, ein statisk-bert reference-bundler samskeiðisroynd, hin deilda-
crypto.subtleferð aftur og fram, og post-pakka Arweave-godkenningar monitor (§16.8).
Atbundin útgávuskrásett trupulleikar (flyt fram í framkvæming + vøru/lógarliga ummæling):
- Krevja loft (Q1/Q6). Einki yvirflata kann siga dagbókin vísir innihaldið av eini staðfestari blað ella læsa runt; loyvda áheitanin fyri eitt væl fest yvirskot
kind=0x02bløð eru raðfest, við ávísari ávísan trygging fyri álitandi yvirhøvuð bundin tíð. Ein svaring uttan kvittan tupul hevur ongan logg krav. Ongin tíðarmerkingarkopi ber eina nummerviðurskiftiligt løgnir trygging. - Vitni sannleika (Q2). Marknaðar tvítyding sum bestanliga sæst + kvittað, aldri sjálvstøðugt vitnað.
- Kvittan + akkerislyklar (Q2/Q8). Áðrenn áheitanina um ikki-nevning/forbundna staðfesting verður send, útvega og samanseta móttøku almenna lykilin, tvítsignað hann við veitta ankureigaran, og halt ankura bólkurin sum sína egnu JWK, ymisk frá upphøggsbólkinum.
- Djúphash hurð (Q8). Einki ankurskip ella T3 sendingarskip, fyrr enn báðar-árlig fetting + samskipanarroynd eru passerað; móttøkueftirlitsmaðurin ringir við mistaki.
- Goymslukrøv (Q7). Samvalda-litla nøgdavíðgjan kóðaði knútalaðandi goymsla + strokta-DO kalda-lað vektori eru forkrøv til “endurnýtsla ongantíð ógildar próv” tryggingina.
17. Flytførur váttanarbúnti (.qub)
Støða. Hesin parturin er íverksettur (W7 / UP-C2):
qub_core::exportger og tulkar búntan, ogtools/qub-verifyer eitt alment, sjálvstøðugt CLI, sum váttar hann frástadlaust. §11 og §16.9 vísa longu til ".qub-búntan" sum eindina, ið ein sjálvstøðugur váttari brúkar; hesin parturin ásetir bætini og váttanargongdina. Hann er strangt viðbótarligur—búntin pakkar verandi §11-inntøk og broytir einki tráðasnið á keðjuni.
17.1 Endamál
§11 staðfestir, at ein og hvør triðjipartur kann vátta dulmálsliga artefaktið hjá einum qubi uttan samstarv frá qub. .qub-búntin ger hesa váttan flytføra og frástadlausa: hann pakkar innsiglaða CBOR og drand-umfarsundirskriftina, sum letur tað upp, í eitt sjálvstøðugt artefakt, so ein móttakari kann vátta innihaldsheilleika, binding til umfarið og allar høvundaundirskriftir við ongum netkalli (eingin goymsluheinting, eingin beinleiðis drand-umbøn, einki qub-API). Búntin einsamallur prógvar ikki, nær dulmálsteksturin varð gjørdur; ein sjálvstøðugt váttað goymslutransaktión ella eitt ankrað loggprógv veitir ta serstøku tilverutíðarfullyrðingina (§11, §17.5).
17.2 Búntasnið
Ein QubBundle er handskrivað kanoniskt CBOR eftir §3.1-profilinum (ásett longd, eingi tag, eingi flottøl, stytsta heiltalssnið, NFC-tekstur, valfríir teigar latnir burtur, tá teir mangla, lyklar raðaðir eftir longd á enkodaðu bætunum vaksandi og síðani bætivíst). Teir tríggir 15-tekna lyklarnir raða d < i < s. Ein rá .qub-fíla er júst hesi bætini; fyri URL ella avrita-set inn flutning eru somu bæti base64url(uttan fylling).
| Lykil | Enk. longd | Slag | Atvera | Týdningur |
|---|---|---|---|---|
version |
8 | u8 |
kravt | Útgáva av búntasniði (0x01). |
sealed_at |
10 | i64 |
valfrítt | Innsiglingartíð, sum høvundurin sjálvur uppgevur (Unix-sekund); sjálvlýsandi, ikki próvfast. |
drand_round |
12 | u64 |
kravt | Umfarið, sum qubið er læst at. Ein framskriving av innbygda innsiglaða qubinum. |
arweave_tx_id |
14 | tstr |
kravt | Transaktiónskennið, sum innsiglaðu bætini vórðu goymd undir (upprunatilvísing). |
drand_chain_id |
15 | tstr |
kravt | drand-keðjan (hex). Ein framskriving av innbygda innsiglaða qubinum. |
drand_signature |
16 | bstr |
kravt | drand-vita-undirskriftin fyri drand_round—virðið, sum letur dulmálstekstin upp. |
inclusion_proof |
16 | bstr |
valfrítt | §16 Merkle-íroknanarprógvið, tá loggurin er íverksettur (§17.5). |
sealed_qub_cbor |
16 | bstr |
kravt | Innaru SealedQubCbor-bætini (eftir §13-avumbúgving), t.e. §11-váttanarinntakið. |
drand_round og drand_chain_id eru hentleika-framskrivingar av sealed_qub_cbor, bornar so amboð kunnu lesa tær uttan at tulka innara CBOR. Tær verða leiddar av við gerð og kannaðar aftur við avkoding móti tulkaða innsiglaða qubinum; ein búnti, har ytri teigur og nýttulast eru ósamd, verður avvístur. Enkodaraagi speglar restina av tráðasniðnum: avvís tóma drand_signature ella arweave_tx_id, og set mørk á allar teigar við broytiligari longd.
17.3 Hvat innbygda drand-undirskriftin prógvar
Búntin ber drand-undirskriftina heldur enn at krevja, at váttarin heintar hana. Tíðarlásavkryptering (tlock yvir drand-keðjuna, §8) kann bara eydnast við ekta vita-undirskriftini fyri bundna umfarið—eitt virði, sum keðjan bara gevur út, tá umfarið er farið, og sum er ein gildug BLS-undirskrift undir almenna lyklinum hjá keðjuni. Ein følsk ella skeiv undirskrift fellur í BLS-váttan ella IBE/AEAD-avkryptering. Ein búnti, sum verður avkrypteraður, prógvar tí: dulmálsteksturin er bundin at umfari R, og umfar R er farið. Váttarin festir keðjuna (DrandTimelockProvider::quicknet()) og nýtir §11-umfarsbindingarkanningina, so ein búnti kann ikki siga seg hava eitt umfar, sum dulmálsteksturin ikki er bundin at.
Hetta er eitt prógv fyri útgávutreytina, ikki eitt gerðartíðarmerki. Eftir at umfar R er farið, kann ein og hvør gera ein nýggjan dulmálstekst fyri R og pakka longu almennu undirskriftina saman við honum. Tí MÁ búntin einsamallur IKKI lýsast sum prógv fyri, at dulmálsteksturin ella innihaldið var til áðrenn R, áðrenn unlock_at ella áðrenn nakra hending.
17.4 Frástadlaus váttanargongd
qub-verify <file.qub> koyrir vanligu §11-mannagongdina heilt úr búntanum og stýrir qub_core::unlock::unlock við einum festum DrandTimelockProvider:
1. Parse the .qub bytes → QubBundle (canonical-CBOR guard; bound every field;
re-check drand_round / drand_chain_id against the embedded sealed qub).
2. BLS-verify bundle.drand_signature for the pinned chain and round, then
tlock_decrypt(sealed.tlock_ciphertext, bundle.drand_signature) → QubEnvelope.
3. Verify SHA3-256(body) == body_hash (§11 step 8).
4. Verify QubEnvelope.qub_id == SealedQub.qub_id (§11 step 9).
5. Verify QubEnvelope.unlock_at == SealedQub.unlock_at (§11 step 10).
6. Verify ciphertext round == unlock_round(unlock_at) and the chain binding.
7. If sig_alg != 0x00: verify author_signature (and any cosigner; §9.4).
8. Report integrity, round-elapsed/round-binding, authorship, and cosigner
verdicts separately, plus the recovered body. Do not report a commitment
timestamp unless step 9 succeeds.
9. Optional existence-time leg: verify an included §16 proof through its pinned
anchor, or independently verify the referenced storage transaction. Report
its block time as an upper bound on ciphertext existence.
CLI'ið endar við 0 (váttað), 1 (váttan miseydnaðist—framvegis læst, body_hash samsvarar ikki, umfars-/keðjubinding brotin ella undirskrift miseydnaðist) ella 2 (nýtsla / illa skaptur búnti). Ein --json-frágreiðing ber somu úrskurðir til sjálvvirkan. Av tí at búntin er sjálvstøðugur, eru váttarakassin (qub-core) og CLI'ið (qub-verify) einasti ritbúnaðurin, ein triðjipartur tørvar; bæði eru almenn og endurnýta verandi váttanarleið í protokollini—eingin sergjørd krypto.
17.5 Sambandið við gjøgnumskygni-loggin
inclusion_proof er eitt valfrítt pláss fyri §16 Merkle-íroknanarprógvið. Váttan við búntanum einsamøllum (§17.4) er fullfíggjað fyri heilleika, umfarsbinding / farið umfar og møguligan høvundskap, men hevur við vilja onga sjálvstøðugt tíðarstemplaða tilverufullyrðing. Eitt útfylt, fult ankarváttað inclusion_proof leggur blaðslagssambundnu bindingina og evsta tíðarmarkið úr §16.11 afturat uttan at broyta útgávuna av búntasniðnum. Eitt prógv, sum manglar, merkir bara "einki prógv viðlagt"—ikki "ógildugt" og ikki neyðturviliga "ikki ankrað".
Í tilvísingarverkinum er plássið nú typað: qub_core::export::QubBundle::inclusion_proof_typed() gevur eitt Option<InclusionProof> við øllum §16.9-bygnaðinum (blað, eftirlitsleið, ankrað rót og AnchorRef) gjøgnum sama ógjøgnumskylda CBOR-teig—eingin lyfting av búntasniðsútgávuni. Sjálvstøðuga qub-verify-CLI'ið brúkar tað gjøgnum sína --anchor-leið og—til ankarveskið er útvegað (§16, Støða)—boðar eitt útfylt prógv við staðhaldaraeigara sum bara íroknan heldur enn fult ankrað-váttað.