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:
- Breyting á einhverjum reit í QubEnvelope (body, tímastimplum, innihaldsgerð, útgáfu) framleiðir annan qub_id.
- qub_id er reiknað fyrir dulkóðun. Bæði QubEnvelope og SealedQub bera sama qub_id. Lesandinn staðfestir að þeir passi saman eftir afkóðun.
- qub_id er ekki háð
sender_label,author_signature, eðaauthor_pubkey. Þetta þýðir að sama innihald innsiglað á sama tíma framleiðir sama qub_id óháð því hver undirritar. - Breyting á SealedQub
title(með öllu öðru föstu) breytirqub_idí gegnumtitle_hash. Gátt getur því ekki skipt út hreina-texta titlinum sem birtist á niðurtalningunni án þess að ógilda qub auðkennið. - Breyting á SealedQub
outcome_at(með öllu öðru föstu) breytirqub_idí gegnum forhassið. Gátt getur ekki skipt út niðurstöðudagsetningunni sem birtist á niðurtalningunni fyrir birtingu án þess að ógilda qub auðkennið. - Breyting á
drand_round(með öllu öðru föstu) breytirqub_idí gegnum forhassið. Gátt getur ekki endurbundið tímalás-dulkóðunartextann við aðra lotu án þess að ógilda qub auðkennið; ásamt stanza-lotu-athuguninni við aflæsingu í §8 er birtiunlock_atsú lota sem raunverulega stýrir afkóðun.
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:
- Aðeins HTTPS. Strengurinn SKAL byrja á bæta-runu
https://. Allar aðrar samskiptareglur —http,ftp,javascript,data,file, o.s.frv. — er hafnað. - Lengdarþak. ≤ 2.048 bæti (vafraskráhámark í reynd).
- NFC + óvinveittra-kóðapunkta athugun. Sama regla og fyrir
titleogreflection— bidi-yfirskrift / núll-breidd / merkjablokk / BOM / C0 / C1 kóðapunktum er hafnað. Skilgreining passar við Rustcrate::handle::contains_hostile_text_codepointog TSworkers/api/src/utils/unicode.ts::isHostileCodepoint(haldið í samspili). - Engin auðstaf, engin ASCII stýring. Auðstaf / DEL / undir-
0x20bætum hvar sem er í URL-inu er hafnað — lokar\n/\tinnspýtingar-vektornum sem bidi reglan nær ekki yfir. - 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.
- Aðili með skrifaðgang að geymdum bætum gæti skipt um
sender_label("Alice" → "Mallory") án þess að ógilda höfundar-undirskriftina.author_pubkeyinnan umslagsins er enn raunverulegt auðkennisakkeri — lesendur SKULU leiða birtingarauðkenni afauthor_pubkey(í gegnum §9.5 staðfestingarlagið) frekar en treystasender_label. reply_toreit má sömuleiðis breyta eftir undirritun. Vegna þess aðqub_ider innihalds-vísað, getur árásarmaður ekki bentreply_toá ó-tilvitnað skotmark, en þeir geta þegjandi endur-foreldrað svar í annað fyrirliggjandi qub.
Ú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:
cosigner_pubkey: ML-DSA-65 opinber lykill meðundirritarans (Party B).cosigner_signature: Undirskrift yfir samasig_inputog höfundur (§9.3).
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:
- Meðundirritarinn undirritar sama
sig_inputog höfundurinn — báðir aðilar skuldbinda sig við samaqub_id,body_hash, ogunlock_at. qub_idafleiðsla (§4.1) inniheldur EKKI meðundirritarreiti. Að bæta meðundirritara við fyrirliggjandi umslag breytir ekkiqub_id.- Sáttmáli getur verið aðeins höfundar-undirritaður (einhliða skuldbinding), aðeins meðundirritari (óvenjulegt), eða bæði (full tvíhliða sönnun).
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
- Fyrirsagnir:
#til####(ekki#####eða######) - Áhersla: feitletrun (
**), skáletrun (*), yfirstrik (~~) - Listar: númeraðir (
1.) og ónúmeraðir (-,*) - Tilvitnanir (
>) - Kóði: innbyggðar línur (```) og afmarkaðar blokkir (`````)
- Lóðréttar línur (
---) - Línuskil (tvö lokabil eða auð lína)
- Málsgreinar
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 () |
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ð:
- Þátta Markdown með
pulldown-cmark(eða jafngildu). - Gangaðu yfir AST og slepptu öllum hnúti sem er ekki á heimilislistanum (§10.1).
- Fyrir tengla-hnúta: sendu URL sem sýnilegan texta, ekki sem smelltanlegan
<a>þátt. - Breyttu síaða AST yfir í tegundavarið milliform (t.d.
MarkdownNodeenum með aðeins öruggum afbrigðum). Hrátt HTML er byggingarlega ósýnilegt í þessu IR. - 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
- Hámarks birt fyrirsagnardýpt:
####(H4).#####og dýpri eru birt sem feitletraður texti. - Engin takmörk á málsgreinafjölda (líkamsstærðartakmörk í §6 eru hindrunin).
- Afmarkaðar kóða blokkir: engin málfræðisliturarmerking í MVP. Birtar sem fastbreiddur forformaður texti.
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_alg ≥ 0x01, 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.
- Lesendur SKULU hafna óþekktum aðal-útgáfum með skýrri villu.
- Þekktar aðal-útgáfur MEGA þola óþekkta valfrjálsa reiti ef framvirkar samhæfnisreglur leyfa (valfrjálsir reitir fjarverandi úr kanónísku lyklaröðinni eru hunsaðir).
- Innihaldsgerðir (
content_type) og undirskriftaraðferðir (sig_alg) eru útgáfu-bundnar: nýjum gildum má aðeins koma fyrir samhliða nýrri samskiptareglu-útgáfu eða skýrri skráningar-uppfærslu.
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 |
| — | 0x02–0xFF |
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:
- Talningar-ónæmi sjálfgefið. Pakkaðir bætir í varanlegri geymslu eru bæta-aðgreinanlegir frá handahófs dulkóðuðum texta. Uppskerustrategía af "GraphQL-fyrirspurn fyrir qub-laga upphlaðningar, fjöldaafkóðun með opinberum drand undirskriftum" endar ekki með hreinum texta.
- Dulkóðun-tætings einkalífsstaða. qub.social getur bókstaflega ekki afkóðað sinn eigin korpus. Stefnur ná dulkóðuðum texta, ekki hreinum texta.
- Tveggja-laga trúnaðar stigi. Sjálfgildi = tengla-stýrður aðgangur (þessi hluti). Móttakanda-dulkóðuð einka qub (frátekinn eiginleiki í áfanga 2, enn óskilgreindur) leggjast ofan á sem annað lag.
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.
versionSKAL vera jafnt0x01fyrir v1.0 umbúða bæti.qub_idSKAL vera jafntqub_idreit SealedQub sem endurheimtist eftir afpökkun. Afpökkunarskrefið framfylgir þessu ekki beint (AEAD AAD binding gerir byte-stigs flutning ómögulegan), en aflæsingarlagið athugar sambandið yfir tilfærslu: ef höfundur pakkarSealedQubCborþar sem innraqub_idpassar ekki við umbúðaqub_id, mistekst §8 skref 11.nonceSKAL vera 96 bita (12 bæti), framleitt ferskt af CSPRNG fyrir hverja umbúða aðgerð. Að endurnýta nonce undir sama lykli leyfir AEAD nonce-endurnýtingar árásir sem endurheimta hreinan texta; framleiðendur SKULU meðhöndla (key,nonce) pör sem eins-skotsupphæð.ciphertexter AES-256-GCM úttak: dulkóðunar bæti samtengd 16-bæta sönnunarmerkinu.ciphertext.len() == SealedQubCbor.len() + 16nákvæmlega.
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á:
- WASM höfundur:
getrandom(WebCrypto undirwasm_jsbakenda). - Worker miðlara-megin innsiglunarleið:
crypto.getRandomValues.
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
- Höfundar-undirritun (§9) er óbreytt: undirskriftir eru reiknaðar innan innra
QubEnvelopeog endurheimtist eftir af-umbúð → tlock afkóðun → CBOR þáttun. - Móttakanda-dulkóðuð einka qub (frátekinn eiginleiki í áfanga 2, enn óskilgreindur) eru samsett ofan á þessar umbúðir sem annað trúnaðarlag; bæði lögin geta verið virk samtímis.
- Sáttmálar (§6, content_type
0x03) eru pakkaðir nákvæmlega eins og textaqub; umbúðirnar eru byte-blindar gagnvart innri innihaldsgerð.
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:
- Ekkert talningar-ónæmi. Opinber qub afsala sér §13.1 talningar-ónæmis eiginleikanum með smíðinni. Viðmiðunar-upphlaðningarþjónustan stimplar
Visibility: publicvaranlegrar-geymslu merki á þau (og aðeins þau) svo þau séu vísvitandi uppgötvanleg; einka qub bera ekkert slíkt merki og halda bæta-aðgreinanleika sínum. - Hreinn-texti titill afhjúpaður á innsiglunartíma. §3.2
titlereiturinn er hreinn texti inni íSealedQubCbor. Undir umbúðunum er hann falinn þar til lesandi leggur framK; án umbúðanna er hann heims-læsilegur í varanlegri geymslu frá augnabliki upphlaðningar, fyrir aflæsingu. Samræmd höfundar-forrit SKULU upplýsa um þetta á innsiglunartíma. - Greining er byggingarleg. Samræmdur lesandi/innfelling aðgreinir lögunina tvær með þáttun: bæti sem þáttast sem
OuterWrappertaka af-umbúðun-með-Kleiðina; bæti sem þáttast sem berSealedQubCboreru samþykkt beint. Ekkert víra-flagg er krafist, ogqub_idbindur ekki sýnileika — sama innihald er byte-eins áSealedQublaginu hvort sem það er innsiglað opinbert eða einka.
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:
- 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).
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:
- Undirskrift: ML-DSA-65 (
sig_alg = 0x01; 1952-bæta opinber lykill, 3309-bæta undirskrift) og óundirritað (sig_alg = 0x00). Skráningin í §9.2 skilgreinir engin önnur gildi; v1 staðfestingaraðili SKAL hafna hverjusig_algutan{0x00, 0x01}. Framtíðar Ed25519 færsla er fyrirhuguð (§15.3) en er ekki úthlutuð í v1. - Tímalás: drand quicknet aðeins — keðju hash, opinber lykill, upphafstími og tímabil eru föst netbreytur sem viðmiðunin
DrandTimelockProvider::quicknet()(crates/qub-core/src/tlock.rs) ogconfig/drand-endpoints.jsonbera. - Ytri umbúðir: AES-256-GCM v1 aðeins (§13).
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 á:
- Annað
sig_algbæti (Ed25519 virkjun, ML-DSA-87, eða ný færsla í §9 skráningu). - Önnur drand keðja í framleiðslu notkun.
- Önnur ytri-umbúða útgáfa.
Þ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.