qub samskiptareglulýsing

qub er samskiptaregla fyrir dulritaðar tímaskuldbindingar: kerfi til að innsigla orð við framtíðardagsetningu og sanna, þegar sá dagur rennur upp, nákvæmlega hvað var sagt og hvenær.

Þrjár grunneiningar gera þetta mögulegt. drand er dreifður tilviljanaviti — birtingardagsetningin er framkvæmd af eðlisfræðinni sjálfri, ekki af velvild neins aðila. Varanleg opinber geymsla er breytingarþolin opinber geymsla — enginn aðili getur breytt eða eytt qub eftir að það hefur verið innsiglað. ML-DSA-65 er eftir-skammtafræðileg stafræn undirskrift — hvert qub er bundið lyklapari þar sem leyndarlykillinn yfirgefur aldrei tæki höfundarins.

Saman gera þessar grunneiningar yfirlýsingu sem er tímalæst, augljós ef átt er við, og rekjanleg — kvittun sem verður verðmætari eftir því sem geta heimsins til að falsa fortíðina batnar.

Það sem eftir er af þessu skjali er hin staðlaða útfærsluforskrift sem þarf til samvirkrar útfærslu.


qub samskiptareglu-forskrift

Reitur Gildi
Útgáfa 1.0 (samskiptareglu-útgáfa 0x01, ytri umbúðir útgáfa 0x01)
Dagsetning 2026-05-01
Staða Drög
Yfirfarið til 2026-05-01

Þetta skjal er staðlaða samskiptareglu-forskriftin fyrir qub tímaskuldbindingakerfið. Það skilgreinir gagnabyggingar, raðtalningarreglur, afleiðsluformúlur og staðfestingaraðferðir sem nauðsynlegar eru fyrir samvirka útfærslu.

Umfang: samskiptareglulagið er viljandi tungumálahlutlaust — qub líkaminn er ógagnsær texti / markdown / sáttmála bitar, og staðlingameðvituð birting er á ábyrgð lesandans (qub.social vefforrit, <qub-embed> iframe, MCP biðlarar, o.s.frv.).


1. Táknun og venjur

Táknun Merking
u8, u64, i64 Óformerktar/formerktar heiltölur með tilgreindri bitabreidd
[u8; N] Bætafylki af fastri lengd N bæta
Vec<u8> Bætafylki af breytilegri lengd
Option<T> Gildi af gerð T, eða fjarverandi
String UTF-8 textastrengur, NFC staðlaður
`
SHA3-256(x) NIST SHA3-256 hashgildi af bætastreng x (FIPS 202)
ceil(x) Þaksvörun: minnsta heiltala ≥ x
CBOR Concise Binary Object Representation (RFC 8949)
big-endian Mikilvægasta bætið fyrst

Allar heiltölur í forhneppingum eru kóðaðar sem big-endian bætafylki af fastri breidd (i64 → 8 bæti, u8 → 1 bæti) nema annað sé tilgreint.

Allir tímastimplar eru Unix sekúndur í UTC.


2. Gagnabyggingar

2.1 ComposeQub (staða höfundar í minni)

Ekki raðtalin í CBOR. Ekki skrifuð í varanlega geymslu. Staðbundin höfundarforritinu.

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,              // 0x01 = public (only value in MVP)
    content_type:   u8,              // 0x01 = text (only value in MVP)
    plaintext:      Vec<u8>,         // UTF-8 qub body
    sender_label:   Option<String>,  // Decorative display name; not authenticated
    status:         DraftStatus,     // Composing | Sealed | Uploaded | Failed
}

2.2 QubEnvelope (afkóðaður burður)

Raðtalin með kanónískri CBOR (§3). Dulkóðuð innan SealedQub. Þetta er byggingin sem sannar heilleika innihalds eftir afkóðun.

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>,     // V1.1 — when reality renders judgment (verdict-uplift-plan §3.1)
    sender_label:        Option<String>,  // Decorative; not authenticated in MVP
    reply_to:            Option<[u8; 32]>,// Parent qub_id for reply chains; not in qub_id preimage; not signed (see §9.3)
    body:                Vec<u8>,         // Content payload (UTF-8 for text, CBOR for pact)
    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
}

Grunngerð (óundirritað text qub): version = 0x01, content_type = 0x01, sig_alg = 0x00, allir Option reitir fjarverandi.

Aðrar v1 stillingar: content_type = 0x03 (sáttmála líkami, sjá §6.1); sig_alg = 0x01 (ML-DSA-65) með author_signature og author_pubkey til staðar (sjá §9.3); cosigner_pubkey og cosigner_signature saman til staðar fyrir meðundirritaða sáttmála (sjá §9.7); reply_to sett á qub_id foreldris fyrir svar-keðjur (sjá §9.3 fyrir afleiðingar á undirskriftarumfangi).

2.3 SealedQub (kanóníska þráðarsnið)

Raðtalin með kanónískri CBOR (§3). Skrifað í varanlega geymslu. Þetta er gripurinn á keðjunni.

SealedQub {
    version:           u8,              // Protocol major version (0x01 for v1)
    qub_id:            [u8; 32],        // Same as QubEnvelope.qub_id
    visibility:        u8,              // 0x01 = public; v1 viewers reject other values
    unlock_at:         i64,             // Unix seconds UTC
    outcome_at:        Option<i64>,     // V1.1 — 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
    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 control characters.
}

2.4 RevealedQub (lesandi forritsstaða)

Ekki raðtalin í CBOR. Staðbundin lesandaforritinu. Smíðuð eftir vel heppnaða afkóðun og staðfestingu.

RevealedQub {
    qub_id:              [u8; 32],
    arweave_tx_id:       String,
    visibility:          u8,
    content_type:        u8,
    created_at:          i64,
    unlock_at:           i64,
    outcome_at:          Option<i64>,       // V1.1 — flutt áfram úr QubEnvelope.outcome_at / SealedQub.outcome_at; knýr úrskurðar-bið blokkina á birtingarsíðunni (verdict-uplift-plan §5.1)
    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. Kanónískt CBOR snið

Öll raðtalning SealedQub og QubEnvelope SKAL fylgja þessu sniði. Tvær útfærslur, gefin sama rökrétta bygging, SKULU framleiða eins bæti.

3.1 Kóðunarreglur

Regla Forskrift
Staðall RFC 8949 §4.2.1 (Core Deterministic Encoding Requirements)
Röðun korta-lykla Raðað eftir kóðaðri bætalengd fyrst (styttri á undan lengri), síðan stafrófsröð (bæti fyrir bæti fyrir kóðanir af sömu lengd)
Kóðun heiltalna Stysta form: 0–23 í upphafsbæti; 24–255 í 2 bætum; 256–65535 í 3 bætum; o.s.frv.
Lengdarkóðun Aðeins ákveðnar lengdir. Engir óákveðnir fylkislengdar, kort, bætastrengir eða textastrengir (viðbótarinformation = 31 er bannað).
Merki Engin CBOR merki (aðalgerð 6 er bönnuð).
Fljótandi tölupunktur Engar fleytitölur (aðalgerðir 7 gildi 0xF9–0xFB eru bönnuð).
Textastrengir UTF-8 kóðaðir, NFC staðlaðir (Unicode Normalization Form C).
Bætastrengir Hrá bæti. Engin base64 kóðun á CBOR laginu.
Tvíteknir lyklar Hafna með villu. Þáttarar MEGA EKKI samþykkja tvítekna kort-lykla þegjandi.
Einföld gildi Aðeins true (0xF5), false (0xF4), og null (0xF6) eru leyfileg.
Valfrjálsir reitir Fjarverandi valfrjálsir reitir eru felldir út alveg úr CBOR kortinu (ekki kóðaðir sem null). Til staðar valfrjálsir reitir eru með í raðaðri lyklaröð.

3.2 Staðfestar kanónískar lyklaraðir

Þessar lyklaraðir eru staðlaðar. Útfærslur SKULU senda lykla nákvæmlega í þessari röð. Aflúsunarstaðhæfingar ÆTTU að staðfesta röðunina í non-release smíðum.

QubEnvelope (útgáfa 0x01, óundirritað, allir valfrjálsir reitir fjarverandi):

"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 (V1.1 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)

Afleiðsla lyklaraðar QubEnvelope: hver lykill er CBOR textastrengur. Kóðuð lengd = 1 bæti haus + lengd strengs (fyrir strengi undir 24 bætum). Raða eftir heildar kóðaðri lengd fyrst, síðan stafrófsröð fyrir lykla af sömu lengd.

SealedQub (útgáfa 0x01, opinber, enginn móttakandi):

"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 (V1.1 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)

PactTerms (sáttmála líkami, 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 (röð í terms fylki):

"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 Tilvísun bæta-kóðunar

Gerð CBOR kóðun Dæmi
SHA3-256 hash (32 bæti) 0x58 0x20 + 32 bæti body_hash, qub_id
Tímastimplar (i64) Aðalgerð 0 (jákvætt) eða 1 (neikvætt), stysta kóðun Unix sekúndur
Útgáfa (u8, gildi 1) 0x01 (eitt bæti)
Innihaldsgerð (u8, gildi 1) 0x01 (eitt bæti)
sig_alg (u8, gildi 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 opinber lykill (1.952 bæti) 0x59 0x07 0xA0 + 1.952 bæti author_pubkey, cosigner_pubkey

4. Staðlaðar afleiðslur

4.1 qub_id

qub_id auðkennir qub einkvæmt og bindur QubEnvelope við SealedQub. Það er afleitt á ákveðinn hátt frá innihaldi umslagsins.

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

Kóðun lénsskiljara: Strengurinn "QUB_ID_V2" er 9 ASCII bæti. Einu 0x00 fyllingarbæti er bætt við til að ná 10 bætum í jöfnun. Útfærslur SKULU nota nákvæmlega þessi 10 bæti: [0x51, 0x55, 0x42, 0x5F, 0x49, 0x44, 0x5F, 0x56, 0x32, 0x00].

Kóðun outcome_at: V1.1 lengdi forhassið úr 92 bætum í 100 bæti til að fella valfrjálsa reitinn outcome_at inn í bindinguna. Fjarverandi outcome_at er kóðað sem 8 núllbæti; samskiptaregluvottendur hafna outcome_at <= 0 alls staðar, þannig að þetta merkigildi getur ekki rekist á við lögmætt gildi. Sjá §3.2 (þráðarsnið) og innanhúss-skjalið tasks/verdict-uplift-plan.md fyrir niðurstöðumekanismann sem hvetur til þessa reits.

Eiginleikar:

4.2 body_hash

body_hash = SHA3-256(body)

Þar sem body er hrár Vec<u8> innihaldsburður. Fyrir textaqub er þetta UTF-8 kóðaður qub líkami.

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

Þar sem title er valfrjáls hrein-texti titill sem birtist á niðurtalningu lesandans fyrir birtingu (sjá §3.2). NFC stöðlun keyrir á hash-tíma svo digestið sé stöðugt yfir sjónrænt jafngildar kóðapunktaraðir. Allt-núll sjenta er frátekið fyrir fjarverandi tilfellið; tómur strengur er hafnað á kanónísku CBOR mörkunum sem ókanónísk kóðun á "fjarverandi" (kanóníska kóðunin sleppir reitnum alveg).

4.3 Vörpun aflæsingarumferðar

drand_round = ceil((unlock_at - chain_genesis_time) / chain_period_seconds)
Færibreyta Heimild Dæmi
unlock_at Notenda-valdar Unix sekúndur UTC 1735689600 (2025-01-01 00:00:00 UTC)
chain_genesis_time drand keðju upplýsingar (genesis_time) 1595431050
chain_period_seconds drand keðju upplýsingar (period) 30

ceil() aðgerðin velur fyrstu drand umferð þar sem birtingartími er ≥ unlock_at. Þetta tryggir að qub verður ekki afkóðanlegt fyrir valinn aflæsingartíma.

Jaðartilfelli: ef (unlock_at - chain_genesis_time) er nákvæmlega deilanlegt með chain_period_seconds, er útkoman sú nákvæma umferð — qub aflæsist nákvæmlega við birtingartíma þeirrar umferðar.

Staðfesting: unlock_at SKAL vera í framtíðinni á innsiglunartíma. unlock_at SKAL EKKI vera meira en 10 ár frá created_at (til að takmarka langtíma drand áhættu; notendaviðmótið ÆTTI að vara við aflæsingardagsetningum lengra en 2 ár í burtu).


5. Þráðarsniða nýtegundir

Þráðarsniða nýtegundir veita öryggi á þýðingartíma gegn því að rugla CBOR bætum saman við JSON, hreinan texta, eða aðrar bætakóðanir.

Gerð Inniheldur Framleidd af Neytt af
SealedQubCbor Kanónísk CBOR af SealedQub serialize_sealed_qub() Upphlaðning í varanlega geymslu, lesandasókn
QubEnvelopeCbor Kanónísk CBOR af QubEnvelope serialize_qub_envelope() tlock dulkóðunarinntak, tlock afkóðunarúttak

5.1 Smíðareglur

// 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 Staðfesting við smíði

from_encoded() ÆTTI að staðfesta að inntakið byrji á gildum CBOR korta-haus. Full byggingarleg staðfesting gerist á þátta-tíma, ekki smíða-tíma, til að forðast tvíþáttun.


6. Skráning innihaldsgerða

Gildi Gerð Hámarks líkamsstærð Athugasemdir
0x00 Frátekið (ógilt) SKAL EKKI nota
0x01 Hreinn texti (UTF-8, takmarkað Markdown) 50 KB greitt / 10 KB ókeypis Sjá §10 fyrir birtingarreglur. Skiptingin á milli ókeypis / greitts er framfylgd af upphlaðningarþjónustunni; samskiptareglu-lagsins harða þak er 50 KB.
0x02 Frátekið (framtíð) Úthlutað fyrir framtíðar innihaldsgerð; ekki gilt í v1. Lesendur SKULU hafna samkvæmt reglunni hér að neðan.
0x03 Sáttmáli (tvíhliða samkomulag, CBOR líkami) 100 KB Líkami er kanónísk CBOR PactTerms (§6.1). Meðundirritun samkvæmt §9.7.
0x04 Úrskurður (sjálfsmat höfundar, CBOR líkami) 8 KB Líkami er kanónísk CBOR VerdictBody (§6.2). Aðeins gefið út af kerfis-hliðar verdict ætlun. Foreldris-tengsl eru á Parent-Tx-Id Arweave merkinu, ekki á líkamanum. Sjá verdict-uplift-plan §3.4.

Lesendur SKULU hafna óþekktum innihaldsgerðum með skýrri notenda-sýnilegri villu. Lesendur SKULU EKKI reyna að birta óþekktar gerðir sem texta.

6.1 Sáttmála líkami (content_type = 0x03)

Sáttmála líkami er kanóníska CBOR kóðun á PactTerms gildi:

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), value: String (≤ 2,000) }   // NFC on both sides
PartyIdentifier{ label: String (≤ 100), contact: Option<String (≤ 320)> }

Kanónískar CBOR lyklaraðir fyrir öll þrjú kortin eru gefnar í §3.2. Heildar raðtalaður sáttmála CBOR SKAL EKKI fara yfir 100 KB (passar við §6).

Hluttegundargreinir. Fyrsta röðin í terms fyrir structured/v1 sáttmála SKAL vera { key: "pact_schema", value: "structured/v1" }. Raðir án þessa merkis eru "sérsniðnir" sáttmálar og fá enga byggingarstaðfestingu eða hluttegundarmeðvitaða birtingu.

Frystar viðurkenningarrifur. structured/v1 sáttmálar bera nákvæmlega fjórar viðurkenningarraðir undir þessum lyklum:

"initiator_standard_terms"
"initiator_capacity_terms"
"counterparty_standard_terms"
"counterparty_capacity_terms"

value fyrir hvern er einn af átta frystum enskum strengjum valinn eftir (role, kind) pari, þar sem role ∈ { seller, buyer, provider, client } og kind ∈ { standard, capacity }. Strengirnir sjálfir eru stöðluð samskiptareglu-gögn — ML-DSA-65 undirskriftir beggja aðila skuldbinda sig við nákvæmu bætin í gegnum body_hash. Þeir eru EKKI staðfærðir; undirritaður líkami er tungumálahlutlaus. Allar orðabreytingar krefjast nýrrar hluttegundarútgáfu (structured/v2).

Strengirnir átta, uppfletting þeirra (acknowledgement_for(role, kind)), og rökstuðningur fyrir hverjum eru festir af viðmiðunarútfærslunni. Samsvarandi útfærslur SKULU senda byte-eins viðurkenningargildi; gulu-festu SHA3-256 body-hash prófanir sem hylja öll fjögur hlutverkasambönd grípa allan flutning.

Birtingarröð lesandans. Viðurkenningarstrengirnir innihalda orðasambönd eins og "lýst að ofan", sem gera ráð fyrir að lýsingar / umfangs raðir birtist á undan viðurkenningunum. Lesendur SKULU birta terms fylkið í CBOR röð; endurröðun brýtur merkingu textans.

Móttakanda samband. Þegar contact Party B er gilt tölvupóstfang, sendir qub upphlaðningarþjónustan sjálfkrafa skoðunar- / meðundirritunarboðspóst á sviðsetningartíma og bindur að lokum meðundirritunina við staðfestingu sama heimilisfangs (§9.7). Sáttmálar þar sem samband Party B er fjarverandi geta enn verið meðundirritaðir, en aðeins um band-utan rás — þjónustan hafnar meðundirritunarbeiðnum sem geta ekki framleitt samsvarandi 15-mínútna tölvupóst-staðfestingarmerki.

6.2 Úrskurðar líkami (content_type = 0x04)

Úrskurðar líkami er kanóníska CBOR kóðun á VerdictBody gildi:

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
}

Kanónísk CBOR lyklaröð:

"outcome"          (8 encoded bytes)
"reflection"       (11 encoded bytes)  ← only if present
"evidence_url"     (13 encoded bytes)  ← only if present
"verdict_version"  (16 encoded bytes)

Heildar raðtalaður úrskurðar CBOR SKAL EKKI fara yfir 8 KB (passar við skráningarröðina hér að ofan).

Útkomu-enum. Vír-bætið er ætlunarhlutlaust; flokkarnir fjórir Right / Partial / Wrong / Unfalsifiable ná yfir útkomurými sérhverrar úrskurðar-berandi ætlunar. Per-ætlun merkingar ("Rétt spáð" / "Stóð við það" / "Afgreitt" / "Staðfest" fyrir Right, o.s.frv.) eru birtingaratriði lesandans, leyst gagnvart ætlun foreldris-qub-sins — vírinn helst tungumáls- og ætlunarhlutlaus. Gildum utan 1..=4 SKAL hafnað við afkóðun.

Foreldris-tengsl. Úrskurðar-qub ber EKKI foreldris-tilvísunina í líkama sínum. Arweave-færslu-auðkenni foreldris-qub-sins er gefið út sem Parent-Tx-Id geymslumerki á upphlaðningartíma (§7 geymslumerkja-lag). Þetta heldur líkamanum sem sjálfstæðri undirritaðri yfirlýsingu um sjálfsmat; endurskoðunarkeðjan ("rétt um hvað?") er staðfest með Arweave-merkja uppflettingu.

Öryggi sönnunar-URL (skuldbindandi). Þegar evidence_url er til staðar, SKULU staðfestar (innsiglunarhlið, vír-hlið, Worker brún) framfylgja:

  1. Aðeins HTTPS. Strengurinn SKAL byrja á bæta-runu https://. Allar aðrar samskiptareglur — http, ftp, javascript, data, file, o.s.frv. — er hafnað.
  2. Lengdarþak. ≤ 2.048 bæti (vafraskráhámark í reynd).
  3. NFC + óvinveittra-kóðapunkta athugun. Sama regla og fyrir title og reflection — bidi-yfirskrift / núll-breidd / merkjablokk / BOM / C0 / C1 kóðapunktum er hafnað. Skilgreining passar við Rust crate::handle::contains_hostile_text_codepoint og TS workers/api/src/utils/unicode.ts::isHostileCodepoint (haldið í samspili).
  4. Engin auðstaf, engin ASCII stýring. Auðstaf / DEL / undir-0x20 bætum hvar sem er í URL-inu er hafnað — lokar \n/\t innspýtingar-vektornum sem bidi reglan nær ekki yfir.
  5. Ekki-tómt hýsil-hluti. Allt á milli https:// og fyrsta /, ?, eða # SKAL vera ekki-tómt.

Engin þjóns-hliðar sókn. Worker SKAL EKKI proxa, sækja, eða forskoða URL-ið. Samskiptareglan geymir streng; birting gerist lesanda-megin með rel="nofollow noopener noreferrer" target="_blank" og sýnilegum hýsil birtum samhliða tengill-texta.

Íhugun. Valfrjáls höfundar-ritaður íhugunartexti ("hvað breyttist, hvað lærðir þú"). Sama NFC + óvinveittra-kóðapunkta staðfesting og fyrir title. Tómt / aðeins-auðstafa inntak fellur niður í fjarverandi á smíðatíma.

Hluttegundarútgáfa. v1 styður aðeins verdict_version = 0x01. Framtíðar hluttegundarendurskoðanir hækka þetta bæti og lenda samhliða nýrri samskiptareglu-útgáfu samkvæmt §12.


7. Innsiglunarregla

Full innsiglunarröð. Hvert skref er staðlað.

 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.
 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 = ceil((unlock_at - chain_genesis_time) / chain_period_seconds).
    (Computed here, before qub_id, because drand_round is bound into the qub_id
    preimage — §4.1, V1.2.)
 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,
    unlock_at, drand_chain_id, drand_round.
12. Serialise SealedQub using canonical CBOR → SealedQubCbor.
12a. Generate K = 32 random bytes (CSPRNG) and N = 12 random bytes (CSPRNG).
     Compute W = wrap_sealed_qub(SealedQubCbor, qub_id=qub_id, key=K, nonce=N)
     per §13. The bytes uploaded to permanent storage are the OuterWrapper CBOR W,
     never the bare SealedQubCbor. K leaves the device only as the URL
     fragment in step 16.
13. Display seal-time disclosure. User confirms.
14. Validate upload eligibility via the qub upload service (bot-detection, entitlement, rate limits).
15. Submit W (the OuterWrapper bytes) to the qub upload service; the service
    signs and uploads to permanent storage. The service is byte-blind to the inner
    SealedQubCbor and never receives K.
16. Receive arweave_tx_id from the service. Construct delivery URL as
    `<origin>/c/<arweave_tx_id>#<base64url(K)>` (or `<origin>/s/<short_code>#<base64url(K)>`
    when a short code is allocated). Browsers do not transmit URL fragments
    to servers, so K is never observed by qub.social or any storage gateway.

Geymslumerkjalag (utan bands). qub upphlaðningarþjónustan festir vísvitandi lítið mengi af geymslufærslumerkjum við hlið hins pakkaða burðar. Content-Type=application/octet-stream er staðlað krafa. Viðmiðunarþjónustan festir auk þess þrjú valfrjáls merki þegar höfundur velur að sýna þau: Intent (heimilislisti-staðfestur samsetningarásetningur — t.d. quote, reply, commitment), Author (§9.3 opinber lykilfingrafar höfundar sem 64-stafa lágstafa hex), og Parent-Tx-Id (geymslufærsluauðkenni foreldris qub fyrir svar-keðjur, 43-stafa base64url).

Author merkið er opt-in fyrir hvert qub: viðmiðunar höfundarforritið festir það aðeins þegar notandi virkar opinbera rekjanleika beinlínis á innsiglunartíma. Þegar rofinn er af — sjálfgildið — er ekkert Author merki skrifað og qub er órekjanlegt á keðjunni: ekkert í varanlegri geymslu tengir upphlaðninguna við handle, tölvupóst, eða önnur qub höfundar. Þegar rofinn er á, leysist Author fingrafarið í valinn @handle höfundar í gegnum §9.5 staðfestingakeðjuna. Svar-keðju sambönd og Intent eru ekki auðkennandi. Ytri umbúðirnar (§13) vernda innri líkamann gegn dulkóðunarsamsvörun — koma í veg fyrir að uppskerumaður þekki og fjöldaafkóði qub-laga upphlaðningar eftir að drand umferð þeirra birtist.

Viðmiðunarþjónustan festir vísvitandi EKKI App-Name, App-Version, eða Type merki: hvert slíkt einnar gildis sía myndi skila öllum qub korpus til GraphQL fyrirspurnar, sem stangast á við líkamans-eingöngu trúnaðarumfang umbúðanna.

Samsvarandi staðfestingaraðili SKAL EKKI byggja á neinu geymslumerki fyrir §11 þriðju aðila staðfestingu; líkamstæti / qub_id / undirskrift skuldbindur sig aðeins við innri CBOR, aldrei merkjamengið.


8. Aflæsingarregla

Full aflæsingarröð. Hvert skref er staðlað.

 1. Viewer opens delivery URL. Extract arweave_tx_id from path AND
    K = base64url_decode(fragment) from the URL fragment. If the fragment
    is absent or malformed → display "this URL is missing its decryption
    key" and stop; the viewer MUST NOT contact the storage gateway
    without K, since fetching wrapped bytes the viewer cannot decrypt
    serves no purpose and only leaks the access attempt.
 2. Check denylist. If tx_id is denylisted → display block message. Stop.
 3. Fetch OuterWrapper bytes from permanent storage (with multi-gateway fallback).
 3a. Unwrap: parse the bytes as OuterWrapper (§13), verify the wrapper
    `version` byte is `0x01`, and compute SealedQubCbor =
    unwrap_sealed_qub(OuterWrapper, key=K). Any AEAD authentication
    failure (wrong K, tampered ciphertext, swapped qub_id-as-AAD,
    swapped nonce) → display "this URL's decryption key does not match
    the stored qub" and stop. Authentication failures are
    indistinguishable to the viewer per §13.5.
 4. Parse SealedQubCbor → SealedQub.
 5. Validate: SealedQub.version is known (0x01). Reject unknown versions.
 6. If current time < SealedQub.unlock_at → display countdown. Poll or wait.
 6a. Round-binding check (V1.2). Recompute expected_round =
    ceil((SealedQub.unlock_at - chain_genesis_time) / chain_period_seconds).
    Reject unless SealedQub.drand_round == expected_round AND the round baked
    into the tlock ciphertext stanza (read via the age/tlock header, no signature
    required) == expected_round. 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.
13. Verify: QubEnvelope.content_type is known and renderable.
    Known values: 0x01 (text), 0x03 (pact). 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 appropriate renderer (see §10 for text, §6 for pact).
17. Construct RevealedQub for display.

9. Höfundar-undirritun

9.1 Rökstuðningur

qub eru geymd í varanlegri geymslu. Höfundar-undirskriftir verða að halda áfram að vera ófalsanlegar að eilífu, sem er ástæðan fyrir því að v1.0 notar eftir-skammtafræðilegu ML-DSA-65 aðferðina (FIPS 204) frekar en klassíska aðferð þar sem öryggi gæti rýrnað innan varanlegrar líftíma qub.

9.2 Skráning algríms

sig_alg Aðferð Lyklastærð Undirskriftarstærð
0x00 Engin undirskrift (óundirritað)
0x01 ML-DSA-65 (FIPS 204) 1.952 bæti 3.309 bæti

Lesendur SKULU hafna óþekktum sig_alg gildum.

9.3 Smíði undirritaðs forhneppingar

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

signature = Sign(author_secret_key, sig_input)

Lénsskiljari: "QUB_AUTHOR_SIG_V1" er 17 ASCII bæti: [0x51, 0x55, 0x42, 0x5F, 0x41, 0x55, 0x54, 0x48, 0x4F, 0x52, 0x5F, 0x53, 0x49, 0x47, 0x5F, 0x56, 0x31]. Engin fylling.

Endabæti: 91. forhneppingarbæti SKAL vera 0x00. Viðmiðunarútfærslan birtir þetta sem fastann ORG_ID_PRESENT_INDIVIDUAL = 0x00 í crates/qub-core/src/signing.rs; lesendur sem endurbyggja sig_input fyrir staðfestingu SKULU senda sama bætið.

Umfang undirskriftar — hvað er hulið og hvað ekki. sig_input skuldbindur sig við fjóra umslagsreiti: version, qub_id, body_hash, unlock_at (auk fasta lénsskiljarans og org_id_present bætisins). Þrír af þessum fjórum eru byggingarlegir invariantar: qub_id er sjálft afleitt frá version, content_type, created_at, unlock_at, outcome_at, drand_round, og body_hash í gegnum §4.1 forhneppinguna, svo öll breyting á þessum reitum framleiðir annað qub_id og ógildir undirskriftina yfir tilfærslu. Beint-staðfest yfirborðið er því:

Reitur Staðfest af undirskrift Hvernig
version Bein inntak í sig_input
qub_id Bein inntak
body_hash Bein inntak
unlock_at Bein inntak
content_type Yfir tilfærslu, í gegnum qub_id forhneppingu
created_at Yfir tilfærslu, í gegnum qub_id forhneppingu
body Yfir tilfærslu, í gegnum body_hash = SHA3-256(body)
author_pubkey — (gefið) Lykillinn sem staðfesti undirskriftina er höfundurinn, samkvæmt skilgreiningu
sender_label Aðeins birtingar texti; breytanlegt án að brjóta undirskrift
reply_to Þráðunarbendi; breytanlegt án að brjóta undirskrift
cosigner_pubkey / cosigner_signature Sjálfstætt undirritað yfir sama sig_input (sjá §9.7)
drand_chain_id, tlock_ciphertext, visibility Ytri SealedQub reitir, ekki innan umslagsins — huldir eigin byggingarinvariöntum (umferð / keðju samkvæmni) en ekki af höfundar-undirskriftinni. (drand_round er nú bundið yfir tilfærslu í gegnum qub_id forhneppinguna — sjá að ofan.)

Öryggisafleiðingar reita sem ekki eru staðfestar.

Útfærslur sem birta sender_label eða reply_to til endanotenda SKULU sýna staðfest auðkenni (opinber lykils fingrafar, staðfesting) sem aðal auðkennismerki, ekki merkimiðann.

9.4 Staðfestingaraðferð

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 (same formula as §9.3).
6. Verify(author_pubkey, sig_input, author_signature).
7. If verification succeeds → display "signed by [key fingerprint]."
8. If verification fails → display "signature verification failed."

Staðfesting undirskriftar er dýrasta aðgerðin (sérstaklega ML-DSA-65). Hún ÆTTI að vera framkvæmd eftir að allar ódýrari athuganir (tæti, qub_id, unlock_at) hafa staðist.

9.5 Auðkennisstaðfestingar

Auðkennisstaðfestingar — vörpun á author_pubkey í mannlæsileg auðkenniskröfur eins og qub handle, tölvupóstfang, samfélagsmiðla handle, eða passkey skilríki — eru lesanda-megin framsækin viðbót og eru ekki nauðsynlegar fyrir undirskriftarstaðfestingu. Lesendur sem leysa staðfestingar í birtingarauðkenni SKULU beita forgangi:

handle > email > social > fingerprint

Fingrafars varaleið er lágstafa hex af SHA3-256(author_pubkey); það er alltaf tiltækt fyrir hvert undirritað qub. Lesendur MEGA stytta það fyrir birtingu — viðmiðunarlesandinn birtir qub: og þar á eftir fyrstu og síðustu fjögur bætin (qub:<8 hex>…<8 hex>).

Samsvarandi staðfestingaraðili getur lokið hverri athugun í §9.4 án þess að hafa samband við qub API, án nokkurs netkerfis umfram varanlega geymslu og drand, og án nokkurrar miðlara-megin uppflettingar. Staðfestingaúrlausn er aðskilið besta-átaks skref framkvæmt aðeins eftir að undirskriftarstaðfesting hefur tekist.

9.6 Stærðaráhrif

Ed25519 ML-DSA-65
Undirskrift 64 bæti 3.309 bæti
Opinber lykill 32 bæti 1.952 bæti
Heild á hvert qub 96 bæti 5.261 bæti
Geymslukostnaðarmunur (við ~$5/MB) ~$0,0005 ~$0,026

Fyrir textaqub upp á 500–2.000 bæti þrefaldar ML-DSA-65 nokkurnveginn geymda stærðina. Heildarkostnaður er hverfandi.

9.7 Staðfesting meðundirritara (sáttmála tvíhliða samkomulag)

Fyrir tvíhliða samkomulag (content_type = 0x03), sannar annað undirskriftarlag að báðir aðilar samþykktu sömu skilmála.

Umslagsreitir:

Báðir reitir SKULU vera til staðar saman eða báðir fjarverandi. Ef nákvæmlega einn er til staðar SKULU lesendur tilkynna heilleikavillu.

Staðfestingaraðferð:

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.
5. Verify(cosigner_pubkey, sig_input, cosigner_signature).
6. Success → display "co-signed by [cosigner fingerprint]."
7. Failure → display "co-signature verification failed."

Eiginleikar:

Tölvupósts-bindingar hlið (rekstrarlegt). Þegar sviðsetur sáttmáli ber Party B tölvupóst tengilið (§6.1), SKAL qub upphlaðningarþjónustan hafna meðundirritunarbeiðninni nema skammlíft tölvupósts-staðfestingarmerki sé til samsvarandi bæði sviðsetningar-id og staðlað-tölvupósts hash þess tengiliðs. Merkið er skrifað af /api/v1/auth/verify þegar magic-link auðkennið ber staging_id og staðfest heimilisfang passar við SHA-256(normalise_email(party_b.contact)) — þar sem normalise_email(addr) viðheldur hástafsstöðu staðar-hluta og lágstafar aðeins lén hlutann (samkvæmt RFC 5321 §2.3.11), og SHA-256 hér er NIST FIPS 180-4 hash (aðgreint frá SHA3-256 sem notað er í §4 afleiðslum) — og rennur út 900 sekúndum (15 mínútum) eftir útgáfu. Þetta er rekstrarleg and-yfirgjafa hlið, EKKI hluti af qub sönnun á keðjunni — þriðji aðila staðfestingaraðili sem endurspilar §11 þarf aðeins varanlega geymslu og drand, án nokkurrar miðlara-megin uppflettingar. Merkið er aðeins til miðlara-megin og er aldrei hluti af undirrituðum líkamanum.

Stærðaráhrif (ML-DSA-65 höfundur + meðundirritari):

Hluti Stærð
Höfundar-undirskrift 3.309 bæti
Höfundar opinber lykill 1.952 bæti
Meðundirritara undirskrift 3.309 bæti
Meðundirritara opinber lykill 1.952 bæti
Heildar dulkóðunaryfirvinna 10.522 bæti
Geymslukostnaðarmunur ~$0,05

10. Markdown birting og hreinsun

Þessi hluti er öryggis-mikilvægur. Lesandinn birtir textaqub (content_type = 0x01) með takmarkað Markdown hlutmengi.

10.1 Leyfðir þættir

10.2 Bannaðir þættir

Þáttur Meðhöndlun
Hrátt HTML (<div>, <script>, o.s.frv.) Strípað alveg. Ekkert HTML kemst í gegn.
Myndir (![alt](url)) Strípaðar. Mynd-málskipan er fjarlægð úr úttaki.
Tenglar ([texti](url)) URL birt sem sýnilegur hreinn texti. Ekki sjálfvirkt tengt. Ekki smelltanlegt án skýrrar notenda-aðgerðar.
Hættulegar URL áætlanir javascript:, data:, vbscript:, file: — strípaðar.
Iframes, ívofnir, hlutir Strípuð.
HTML einingar Afkóðaðar í birtingarstafi aðeins ef öruggar.

10.3 Útfærsla

Útfærslur SKULU nota strangan heimilislista-þáttara, ekki bannlista. Mælt með aðferð:

  1. Þátta Markdown með pulldown-cmark (eða jafngildu).
  2. Gangaðu yfir AST og slepptu öllum hnúti sem er ekki á heimilislistanum (§10.1).
  3. Fyrir tengla-hnúta: sendu URL sem sýnilegan texta, ekki sem smelltanlegan <a> þátt.
  4. Breyttu síaða AST yfir í tegundavarið milliform (t.d. MarkdownNode enum með aðeins öruggum afbrigðum). Hrátt HTML er byggingarlega ósýnilegt í þessu IR.
  5. Birttu frá tegundavarna IR yfir í markaðsýn (t.d. viðbragðs view-hluti, DOM hnúti). Engin HTML strengjasamtenging eða innerHTML á neinum tímapunkti.

Bannlista aðferðir eru viðkvæmar vegna þess að nýjar Markdown viðbætur eða þáttarasvíkjur geta innleitt ósíaða þætti. Tegundavarin-AST aðferðin gerir XSS byggingarlega ómögulegt — það er ekkert afbrigði sem getur borið handahófskennt HTML.

10.4 Stærðar- og byggingartakmörk


11. Þriðju aðila staðfesting

Hver þriðji aðili getur staðfest opinbert qub án qub samvinnu. Staðfestingaraðferð:

1. Obtain arweave_tx_id (from delivery URL or direct knowledge).
2. Fetch SealedQubCbor from any storage gateway.
3. Confirm storage block inclusion (block height, block timestamp).
4. Parse SealedQubCbor → SealedQub.
5. Fetch drand round signature for SealedQub.drand_round.
6. tlock_decrypt(tlock_ciphertext, round_signature) → QubEnvelope CBOR bytes.
7. Parse → QubEnvelope.
8. Verify SHA3-256(body) == body_hash.
9. Verify QubEnvelope.qub_id == SealedQub.qub_id.
10. Verify QubEnvelope.unlock_at == SealedQub.unlock_at.
11. If sig_alg != 0x00: verify author_signature (see §9.4).
12. All checks pass → qub is verified.

Hvað staðfesting sannar:

Sönnun Hvað hún setur fram
Skuldbinding Dulkóðaði textinn var til við geymslu-blokka-tímastimpil.
Heilleiki Hreinn-texti líkaminn passar við skuldbundna hashið og hefur ekki verið breytt.
Tímasetning Innihaldið var ólæsilegt þar til drand umferðin, sem samsvarar völdum aflæsingartíma (háð tlock og drand öryggisforsendum).

Hvað staðfesting EKKI sannar:

Ekki-sönnun Af hverju
Höfundarréttur sender_label er skreyting. Án sig_alg0x01, hefði hver sem er getað innsiglað þetta innihald.
Ásetningur qub sannar innihald og tímasetningu, ekki hvað höfundurinn meinti huglægt.
Tímasetning fyrir atburð Geymslu-blokka-innifel getur dregist um mínútur frá raunverulegri upphlaðningu. Skuldbindingar tímastimpillinn er blokka-tími, ekki augnablikið þegar notandi ýtti á „innsigla.“

12. Útgáfustjórnun

12.1 Samskiptareglu-útgáfa

version reiturinn (u8) í bæði SealedQub og QubEnvelope auðkennir aðal-útgáfu samskiptareglunnar.

12.2 Útgáfusaga

Útgáfa Gildi Lýsing
v1 0x01 Opinber textaqub (content_type 0x01), sáttmála tvíhliða samkomulag (0x03, structured/v1 hluttegund, ML-DSA-65 höfundur + meðundirritari), tlock, SHA3-256

12.3 Framvirk samhæfni

v1 lesandi sem rekst á QubEnvelope með óþekkta valfrjálsa CBOR korta-lykla (lyklum ekki í §3.2 kanónísku röðinni) ÆTTI að hunsa þá lykla og halda áfram með staðfestingu með þekktum reitum. Þetta leyfir framtíðar smávægilegar viðbætur (t.d. ný lýsigögn) án þess að krefjast aðal-útgáfu hækkunar.

v1 lesandi sem rekst á sig_alg = 0x01 (ML-DSA-65) en skortir ML-DSA-65 staðfestingarstuðning ÆTTI að birta qub innihaldið með „undirskrift til staðar en ekki staðfestanleg“ tilkynningu, ekki að hafna qub alveg. Viðmiðunarútfærslan í dag hafnar hverju sig_alg gildi öðru en 0x00 og 0x01 vegna þess að v1 skráningin inniheldur ekkert annað gilt algrím — strangt höfnun og mjúk-bilun eru athugunarlega eins þangað til þriðja algrími er skráð. Mjúk-bilunarhegðunin að ofan verður burðar-berandi þegar §9.2 viðurkennir nýja færslu, og viðmiðunarlesandinn verður uppfærður til að mjúk-bila á þeim tímapunkti.

12.4 Ytri umbúða útgáfa

OuterWrapper sem lýst er í §13 ber sitt eigið version bæti, sjálfstætt frá SealedQub.version og QubEnvelope.version. Útgáfu-rýmin tvö þróast aðskild: framtíðar eftir-skammtafræðilega-örugg samhverf útskipting hækkar umbúða bætið án þess að snerta innri samskiptareglu-útgáfuna, og framtíðar samskiptareglu-lags viðbót (t.d. nýr umslagsreitur) hækkar innri útgáfuna án þess að snerta umbúða bætið.

OUTER_WRAPPER_VERSION_* Gildi Algrími Staða
OUTER_WRAPPER_VERSION_1 0x01 AES-256-GCM með 12-bæta nonce, 16-bæta sönnunarmerki, AAD bundið qub_id v1 sjálfgildi
0x020xFF Frátekið Framtíð

Lesendur SKULU hafna óþekktum umbúða útgáfum með skýrri villu. Samskiptareglan heldur vísvitandi umbúða útgáfu-rýminu þröngu þar til áþreifanlegur flutnings drifkraftur birtist (t.d. NIST leiðbeiningar sem hygla annarri AEAD); 0x02 rifa verður úthlutuð í sömu endurskoðun og innleiðir algrímið.


13. Ytri dulkóðunar umbúðir

13.1 Rökstuðningur

Samskiptareglu-lögin (QubEnvelope → tlock → SealedQub) gera innsiglað qub tímalæst: líkaminn er ólæsilegur þar til unlock_at og drand umferðar undirskriftin hefur verið birt. Eftir aflæsingu er hins vegar umferðar undirskriftin opinber og kanóníska CBOR lögun SealedQub þekkjanleg, svo uppskerumaður sem flokkaði geymslufærslur gæti fjöldaafkóðað allan qub korpus.

Ytri dulkóðunar umbúðirnar loka þeirri rás með því að setja inn aukið samhverft AEAD lag á milli kanóníska SealedQubCbor og bætanna sem skrifuð eru í varanlega geymslu. 256-bita lykillinn K býr aðeins í URL brotinu á afhendingar URL og á notenda tækjum; vafrar senda ekki URL brot til miðlara, svo qub.social, hver geymslugátt, og hver CDN fyrir framan annað hvort eru athugunarlega blind fyrir K. Hvert qub í varanlegri geymslu er því ógagnsær dulkóðaður texti þar sem hreinn-texti er óendurheimtanlegur án URL sem höfundurinn valdi að deila.

Nettóáhrif:

13.2 Lögun

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
  ↓ AES-256-GCM(K, nonce, AAD=qub_id) (§7 step 12a, this section)
OuterWrapper CBOR bytes              ← uploaded to permanent storage (§7 step 15)

Innsiglun og aflæsing á samskiptareglu-laginu (§7, §8) eru óbreytt undir umbúða-mörkunum; umbúðirnar festast við kallstað seal() og losna við kallstað unlock().

13.3 OuterWrapper gagnabygging

struct OuterWrapper {
    version:    u8,           // 0x01, see §12.4
    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
}

Reita-invariantar.

CBOR kóðun. Kanónísk CBOR samkvæmt §3, með sömu lyklaröðunarreglu (raðað eftir kóðaðri bætalengd hækkandi, síðan stafrófsröð). Fjórir lyklarnir eru:

Lykill Kóðuð bæti Röð
nonce 6 1
qub_id 7 2
version 8 3
ciphertext 11 4

Fyrsta bæti OuterWrapper CBOR er því ákveðin-lengdar korta haus fyrir 4-færslu kort (0xA4).

13.4 AAD binding við qub_id

Umbúðirnar binda qub_id sem AEAD viðbótar staðfest gögn. Þetta er burðar-berandi byggingarvörnin gegn þremur árásarflokkum:

Árás Vörn
Færa dulkóðunartexta undir annan qub_id reit í umbúðunum AAD ósamsvörun → AEAD staðfesting mistekst
Blanda saman URL broti qub A við varanlegrar-geymslu bæti qub B AAD ósamsvörun → AEAD staðfesting mistekst
Eiga við qub_id reit umbúðanna eftir upphlaðningu AAD ósamsvörun → AEAD staðfesting mistekst

Að bera qub_id í umbúða hreinum texta veikir ekki talningar-ónæmi merkjanlega — qub_id er sjálft SHA3-256 hash af §4.1 forhneppingu án endurheimtanlegrar forhneppingar úr digestinu, og talningarmaður sem þegar hefur uppskorið umbúða bætin lærir ekkert af sýnilega qub_id sem þeir gætu ekki ályktað út frá tilvist upphlaðningarinnar sjálfrar.

13.5 Umbúða og af-umbúða algrími

wrap_sealed_qub(SealedQubCbor S, qub_id Q, key K, nonce N):
    require K.len() == 32 and N.len() == 12 and Q.len() == 32
    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.4
    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
    return P                            // P is the inner SealedQubCbor

Bilunar-hams samhrun. Rangt K, rangt nonce, AAD ósamsvörun, og átta dulkóðunartexti framleiða allt sömu DECRYPT_FAILED villu. Þetta er vísvitandi AEAD eiginleiki: að aðgreina bilunar-haminn myndi skapa hliðar rás sem fjar árásarmaður gæti rannsakað með því að senda gallaðar umbúðir og tímamæla viðbragðið. Viðmiðunarútfærslur SKULU hrynja allar AEAD bilanir saman í eina villu lögun.

13.6 Lyklaefni og dreifing

Umbúða lykillinn K er 256-bita einsleitt handahófskennt gildi framleitt fyrir hvert qub af CSPRNG. Viðmiðunarútfærslurnar fá það frá:

Dreifing: K SKAL kóðað sem URL-örugg base64 (RFC 4648 §5, engin fylling) og bætt við afhendingar URL sem brot íhlut:

delivery_url = <origin>/c/<arweave_tx_id>#<base64url(K)>

Brotið er aldrei sent til neins miðlara af samsvarandi vafra. Endurheimtarrásir (miðlara-megin saga skrá, opt-in tölvupósts sjálfsending) sem viðhalda fullum afhendingartengli — þar með talið brotinu — utan tækis notandans eru skýrt skipti á sjálfgefnu dulkóðun-tætings stöðunni og SKULU vera bundnar við skýrt samþykki notanda.

Tap brots. Ef notandi tapar URL brotinu og hefur enga endurheimtarrás, er qub ólæsilegt. Þetta er burðar-berandi skipti hönnunarinnar og SKAL upplýst um til notandans á innsiglunartíma. MVP styrkir innsiglunar-tíma upplýsingarnar með skýru "geyma þessa URL" texta og staðfest-tölvupósts endurheimtarrás fyrir notendur sem skrá sig inn.

13.7 Utan-umfangs fyrir þennan hluta

13.8 Opinber qub (umbúðum sleppt)

Ytri umbúðirnar eru valfrjálsar á afhendingarlaginu. Höfundur má innsigla qub sem opinbert, í hvaða tilfelli kanóníska SealedQubCbor er skrifað í varanlega geymslu beint, án OuterWrapper lags og án lykils K:

SealedQubCbor bytes  ──(public)──▶  uploaded to permanent storage as-is
SealedQubCbor bytes  ──(private)─▶  AES-256-GCM(K, …) ▶ OuterWrapper ▶ uploaded

Opinbert qub er tímalæst en ekki tengla-stýrt: það helst ólæsilegt þar til drand umferð þess birtist (tlock lagið er óbreytt), en eftir aflæsingu getur hver sá sem hefur arweave_tx_id afkóðað það — ekkert URL brot er krafist, því það er ekkert K. Þetta eru vísvitandi skiptin fyrir fleti sem miðlarinn verður að knýja: birtingar-tilkynningar tölvupóstar, þriðja-aðila innfellingar, og ríkari eftir-birtingar SEO þurfa öll tengil sem virkar án leyndarmáls sem miðlarinn heldur aldrei (§13.6).

Afleiðingar sem framleiðandi SKAL gera ráð fyrir:

Einka (pakkað) helst sjálfgildið; opinbert er skýrt val höfundar fyrir hvert qub.


14. Prófunarvigrar

14.1 qub_id afleiðsla

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  = 4695445  (= (1736294400 - 1595431050) / 30, 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 — V1.2):
  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)
  0x000000000047A595 ||  // drand_round as u64 big-endian (4695445)
  body_hash          ||  // 32 bytes
  title_hash             // 32 bytes (all-zeros sentinel; title absent)

Expected output:
  qub_id = SHA3-256(preimage)
         = 3a9fcb31b750d985c262fada6d4f777f
           d6a28be831d941d85c131f5a4bbaf8a4

Útfærslur SKULU framleiða eins body_hash og qub_id gildi fyrir þetta inntak. Þessi prófunarvigur ÆTTI að vera fyrsta einingaprófið skrifað. Kanónísku gildin að ofan voru reiknuð af viðmiðunarútfærslunni og SKULU passa bit-fyrir-bit. Sögulegar forhneppingar (fyrir-ræsing — engin lifandi qub voru háð þeim): 92-bæta V1.0 qub_id var 3d9fc2390eab043d38a1669ed3b71be76f9eefe872b9569ab1aaa027b88392b0; 100-bæta V1.1 qub_id (eftir að outcome_at_or_zero var fellt inn) var b0d032898ad629795150fdcb3f84e518f59ed05b7a2a82bc24ebdb87f52144ed. V1.2 fellir drand_round inn og hækkar lénsskiljarann í QUB_ID_V2.

14.2 Vörpun aflæsingarumferðar

Input:
  unlock_at           = 1735689600
  chain_genesis_time  = 1595431050
  chain_period_seconds = 30

Calculation:
  (1735689600 - 1595431050) / 30 = 4675285.0
  ceil(4675285.0) = 4675285

drand_round = 4675285

14.3 Kanónísk CBOR hringferð

Útfærslur SKULU staðfesta að serialize(parse(serialize(qub))) == serialize(qub) fyrir öll gild inntök. Þetta er eiginleika-próf, ekki einn vigur.

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)

Kanónísku CBOR bætin og SHA3-256 body_hash eru reiknuð af viðmiðunarútfærslunni. Útfærslur SKULU framleiða byte-eins CBOR fyrir þetta inntak.

Útfærslur SKULU einnig staðfesta að serialize(parse(serialize(pact))) == serialize(pact) fyrir öll gild PactTerms inntök (eiginleika-próf).

14.5 Ytri umbúða þvert-á-tungumál vigrar

Ytri umbúðirnar (§13) hafa sérstaka kanóníska fastingu á crates/qub-core/tests/vectors/wrapper_v1.json. Hvert tilvik festir (key, nonce, qub_id, sealed_cbor) túplu sem ógagnsæ hex inntök og staðfestir tiltekið expected_wrapper_hex úttak. Báðar viðmiðunarútfærslur neyta sömu JSON skrár:

Festingin festir nú þrjú tilvik:

Tilvik Þekja
basic-text-public Minnsta raunhæfa SealedQub lögun; engir valfrjálsir reitir. Festir kanóníska umbúða lögun fyrir v1.0-dæmigert qub.
with-recipient-pubkey SealedQub með recipient_pubkey sett (Phase 2 leið). Önnur innri CBOR lykla mengi, annað qub_id.
longer-body ~4 KiB líkami — æfir margbæta CBOR lengdarforskeyti innan bæði innra umslags og ytri dulkóðunartexta.

Útfærslur SKULU framleiða byte-eins expected_wrapper_hex fyrir skráð inntök. Að endurskapa festinguna krefst QUB_REGEN_VECTORS=1 cargo test -p qub-core --test wrapper_vectors og er frátekið fyrir vísvitandi sniða breytingar.


15. Stjórnun dulkóðunar-sniðs (framtíð)

Þessi hluti er upplýsandi fyrir v1 og verður staðlaður í fyrsta sinn þegar annað algrími kemur inn í einhverja af dulkóðunar grunneiningum qub.

15.1 Núverandi staða

Samskiptaregla v1 bindur nákvæmlega eitt algrími á grunneiningu:

Staðfestingaraðilar hörð-kóða nú lykla- og undirskriftarstærðir á grunneiningu. Engin liðleika yfirborð er sýnt af þráðarsniðinu.

15.2 Ætluð lögun

Þegar annað algrími kemur inn í samskiptaregluna, verður staðfestingaraðilinn stilltur fyrir nafngreint CryptoProfile (t.d. ExqubV1) sem lista nákvæma mengi af leyfðum gildum á grunneiningu — sig_algs, drand keðjur, umbúða útgáfur, innihaldsgerðir. Sniðið er fast á staðfestingartíma, aldrei samið í-bandi. Hvert gildi utan virka sniðsins er hafnað.

Þetta tryggir að það að bæta við ML-DSA-87 eða virkja Ed25519 getur ekki aftursækt veikt fyrirliggjandi staðfestingar-stillingar: v1 staðfestingaraðili er enn v1 staðfestingaraðili jafnvel eftir að v2 snið er birt.

15.3 Kveikju skilyrði

Stigjaðu §15 upp í staðlaða stöðu þegar eitthvað af eftirfarandi er stungið upp á:

Þangað til er §15 staðsetningarmerki sem festir flutnings lögunina svo framtíðar PRs lendi á þekktum markmiði frekar en að endurræða samningayfirborðið frá grunni.