Manyleb Protocol qub
Mae qub yn brotocol ar gyfer ymrwymiadau amserol cryptograffig: system ar gyfer selio geiriau tan ddyddiad yn y dyfodol ac yna dilysu’n union beth a seliwyd, pa rownd drand a reolodd ei ryddhau, a—phan fo trafodiad storfa neu brawf log tryloywder ar gael—derfyn uchaf wedi’i stampio’n annibynnol ar yr amser yr ymrwymwyd y seiferdestun.
Mae tri phrimitif yn gwneud iddo weithio. Mae drand yn oleudy hapusrwydd datganoledig—mae’r dyddiad datgelu’n cael ei orfodi’n gryptograffig yn hytrach na thrwy ewyllys da qub. Mae storfa wydn ynghyd â log tryloywder atodi-yn-unig yn cadw’r beitiau seliedig ac yn angori ymrwymiadau swp i storfa gyhoeddus barhaol; mae llwybr T3 taledig hefyd yn ysgrifennu trafodiad storfa barhaol unigol. Mae ML-DSA-65 yn lofnod digidol ôl-gwantwm—pan fydd awduriaeth wedi’i galluogi, mae’r qub wedi’i glymu wrth bâr o allweddi nad yw eu cyfrinach byth yn gadael dyfais yr awdur.
Gyda’i gilydd, mae’r primitifau hyn yn gwneud datganiad sydd wedi’i gloi gan amser ac yn dystiolaeth o ymyrraeth, y gellir priodoli awduriaeth iddo’n ddewisol, ac y gellir rhoi stamp amser annibynnol iddo—derbynneb y mae ei gwerth yn tyfu wrth i allu’r byd i ffugio’r gorffennol wella.
Mae gweddill y ddogfen hon yn fanyleb normadol sy'n ofynnol ar gyfer gweithrediadau rhyngweithredadwy.
Manyleb Protocol qub
| Maes | Gwerth |
|---|---|
| Rhyddhad y ddogfen | 1.0.0 (protocol-v1.0.0) |
| Protocol gwifren | 0x01 |
| Lapiwr allanol | 0x01 |
| Dyddiad effeithiol | 2026-09-23 |
| Statws | Cyfredol |
| Adolygwyd hyd at | 2026-09-23 |
Y ddogfen hon yw'r fanyleb protocol normadol ar gyfer system ymrwymiad amserol qub. Mae'n diffinio strwythurau data, rheolau cyfresoli, fformiwlâu deilliad, a gweithdrefnau dilysu sy'n ofynnol ar gyfer gweithrediadau rhyngweithredadwy.
Cwmpas: mae haen y protocol yn fwriadol-niwtral o ran iaith — bytes plaen / markdown / cytundeb yw corff y qub yn ddi-ddehongli, ac mae rendro ymwybodol-o-leoliad yn gyfrifoldeb y gwyliwr (ap gwe qub.social, iframe <qub-embed>, cleientiaid MCP, ac ati).
1. Nodiant a Chonfensiynau
| Nodiant | Ystyr |
|---|---|
u8, u64, i64 |
Cyfanrifau anarwyddedig/arwyddedig o led bit penodol |
[u8; N] |
Arae byte o hyd sefydlog N bytes |
Vec<u8> |
Arae byte o hyd amrywiol |
Option<T> |
Gwerth o fath T, neu absennol |
String |
Llinyn testun UTF-8, wedi'i normaleiddio NFC |
| ` | |
SHA3-256(x) |
Hash NIST SHA3-256 o linyn byte x (FIPS 202) |
ceil(x) |
Swyddogaeth nenfwd: cyfanrif lleiaf ≥ x |
| CBOR | Concise Binary Object Representation (RFC 8949) |
| big-endian | Y byte mwyaf arwyddocaol yn gyntaf |
Mae pob cyfanrif mewn strwythurau preimage wedi'u hamgodio fel araeau byte big-endian o led sefydlog (i64 → 8 byte, u8 → 1 byte) oni nodir fel arall.
Mae pob amserlin yn eiliadau Unix yn UTC.
2. Strwythurau Data
2.1 ComposeQub (Cyflwr Yn-Cof y Crëwr)
Heb ei gyfresoli i CBOR. Heb ei ysgrifennu i storfa parhaol. Lleol i ap y crëwr.
ComposeQub {
draft_id: [u8; 16], // Random, generated locally
created_at: i64, // Unix seconds UTC
unlock_at: Option<i64>, // Unix seconds UTC; None while composing
visibility: u8, // 0x00 = private; 0x01 = public
content_type: u8, // 0x01 text; 0x03 pact; 0x04 verdict
plaintext: Vec<u8>, // Raw body bytes (UTF-8 for text)
sender_label: Option<String>, // Display name; V2-signed when authorship is enabled
title: Option<String>, // Plaintext countdown title; bound via title_hash
reply_to: Option<[u8; 32]>,// Parent qub_id; V2-signed when authorship is enabled
outcome_at: Option<i64>, // Optional future judgment time; bound to qub_id
status: DraftStatus, // Composing | Sealed | Uploaded | Failed
}
2.2 QubEnvelope (Llwyth Tâl wedi'i Ddatgryptio)
Wedi'i gyfresoli gan ddefnyddio CBOR safonol (§3). Wedi'i amgryptio y tu mewn i'r SealedQub. Dyma'r strwythur sy'n profi cywirdeb cynnwys ar ôl datgryptio.
QubEnvelope {
version: u8, // Protocol major version (0x01 for v1)
qub_id: [u8; 32], // Derived (see §4.1)
content_type: u8, // Content type registry (see §6)
created_at: i64, // Unix seconds UTC
unlock_at: i64, // Unix seconds UTC
outcome_at: Option<i64>, // When reality renders judgment; bound to qub_id
sender_label: Option<String>, // Not in qub_id; V2-signed when authorship is enabled
reply_to: Option<[u8; 32]>,// Parent qub_id; not in qub_id; V2-signed when present
body: Vec<u8>, // UTF-8 text or canonical CBOR pact/verdict body
body_hash: [u8; 32], // SHA3-256(body) (see §4.2)
sig_alg: u8, // Signature algorithm (see §9.2)
author_signature: Option<Vec<u8>>, // Set when sig_alg != 0x00
author_pubkey: Option<Vec<u8>>, // Set when sig_alg != 0x00
cosigner_pubkey: Option<Vec<u8>>, // Set for cosigned pact bilateral agreements
cosigner_signature: Option<Vec<u8>>, // Set for cosigned pact bilateral agreements
}
Sylfaen (qub testun heb ei lofnodi): version = 0x01, content_type = 0x01, sig_alg = 0x00; mae’r meysydd llofnod a chyd-lofnodwr yn absennol. Gall meysydd metadata dewisol eraill fod yn bresennol.
Cyfluniadau v1 eraill: content_type = 0x03 (corff cytundeb, gweler §6.1); sig_alg = 0x01 (ML-DSA-65) gydag author_signature ac author_pubkey yn bresennol (gweler §9.3); cosigner_pubkey a cosigner_signature yn bresennol gyda'i gilydd ar gyfer cytundebau wedi'u cyd-arwyddo (gweler §9.7); reply_to wedi'i osod i qub_id y qub rhiant ar gyfer qubs cadwyn-ateb (gweler §9.3 am oblygiadau cwmpas y llofnod).
2.3 SealedQub (Fformat Gwifren Safonol)
Wedi'i gyfresoli gan ddefnyddio CBOR safonol (§3). Dyma'r arteffact gwifren mewnol: mae dosbarthiad cyhoeddus yn storio'r beitiau hyn yn noeth, tra bod dosbarthiad preifat yn eu hamlapio mewn OuterWrapper cyn eu storio (§13).
SealedQub {
version: u8, // Protocol major version (0x01 for v1)
qub_id: [u8; 32], // Same as QubEnvelope.qub_id
visibility: u8, // 0x00 = private/wrapped; 0x01 = public/bare
unlock_at: i64, // Unix seconds UTC
outcome_at: Option<i64>, // Surfaced on the verdict-watch CTA
// before reveal; mirrors QubEnvelope.outcome_at;
// bound to qub_id via the §4.1 preimage.
drand_chain_id: String, // drand chain hash (hex string)
drand_round: u64, // Target drand round number
drand_chain_version: Option<u8>, // W3 — chain-migration version. Absent / 0 = quicknet
// (the only chain today). Lets a future chain swap
// be expressed on the wire without a breaking format
// change. NOT part of the §4.1 qub_id preimage, so its
// addition never alters an existing qub's identity.
tlock_ciphertext: Vec<u8>, // tlock-encrypted QubEnvelope CBOR bytes
recipient_pubkey: Option<[u8; 32]>,// Reserved field; accepted by canonical CBOR
// but not interpreted by the v1 reference viewer
title: Option<String>, // Plaintext title surfaced on the viewer
// countdown before reveal. Bound to qub_id
// via title_hash (§4.1). 1..=100 NFC code
// points, no hostile/control code points.
}
2.4 RevealedQub (Cyflwr Cymhwysiad y Gwyliwr)
Heb ei gyfresoli i CBOR. Lleol i ap y gwyliwr. Adeiladwyd ar ôl datgryptio a dilysu llwyddiannus.
RevealedQub {
qub_id: [u8; 32],
arweave_tx_id: String,
visibility: u8,
content_type: u8,
created_at: i64,
unlock_at: i64,
outcome_at: Option<i64>, // Carried from both wire layers; drives the verdict-watch block
drand_chain_id: String,
drand_round: u64,
sender_label: Option<String>,
title: Option<String>, // Carried forward from SealedQub.title
reply_to: Option<[u8; 32]>,
body: Vec<u8>,
body_hash: [u8; 32],
body_hash_verified: bool,
author_signature: Option<Vec<u8>>,
author_pubkey: Option<Vec<u8>>,
signature_verified: Option<bool>,
cosigner_pubkey: Option<Vec<u8>>,
cosigner_signature: Option<Vec<u8>>,
cosigner_verified: Option<bool>,
}
3. Proffil CBOR Safonol
RHAID i bob cyfresoli SealedQub a QubEnvelope gydymffurfio â'r proffil hwn. RHAID i ddau weithrediad sy'n derbyn yr un strwythur rhesymegol gynhyrchu bytes union yr un fath.
3.1 Rheolau Amgodio
| Rheol | Manyleb |
|---|---|
| Safon | RFC 8949 §4.2.1 (Core Deterministic Encoding Requirements) |
| Trefnu allweddi map | Wedi'i drefnu yn ôl hyd byte wedi'i amgodio yn gyntaf (byrrach cyn hwy), yna'n lecsicograffig (byte-wrth-byte ar gyfer amgodiadau o'r un hyd) |
| Amgodio cyfanrifau | Y ffurf fyrraf: 0–23 yn y byte cychwynnol; 24–255 mewn 2 byte; 256–65535 mewn 3 byte; ac ati. |
| Amgodio hyd | Hyd pendant yn unig. Dim araeau, mapiau, llinynnau byte, na llinynnau testun o hyd amhendant (gwybodaeth ychwanegol = 31 wedi'i gwahardd). |
| Tagiau | Dim tagiau CBOR (math mawr 6 wedi'i wahardd). |
| Pwynt-arnofiol | Dim arnofiolion (gwerthoedd math mawr 7 0xF9–0xFB wedi'u gwahardd). |
| Llinynnau testun | UTF-8 wedi'i amgodio, wedi'i normaleiddio NFC (Ffurflen Normaleiddio Unicode C). |
| Llinynnau byte | Bytes amrwd. Dim amgodio base64 yn yr haen CBOR. |
| Allweddi dyblyg | Gwrthod gyda gwall. RHAID i barseyddion BEIDIO â derbyn allweddi map dyblyg yn dawel. |
| Allweddi anhysbys | Gwrthod gyda gwall. RHAID i barseyddion BEIDIO â goddef allweddi map y tu allan i set allweddi safonol y math — rhaid i ddau linyn byte safonol gwahanol beidio byth â dadgodio i'r un gwerth (encode(decode(x)) == x), ac ar gyfer llwythi tâl wedi'u llofnodi byddai allwedd ychwanegol yn gynnwys cudd y mae'r ddau lofnod yn ymrwymo iddo. Mae esblygiad sgema yn mynd trwy version, byth trwy allweddi ychwanegol. |
| Gwerthoedd syml | Dim ond true (0xF5), false (0xF4), a null (0xF6) a ganiateir. |
| Meysydd dewisol | Mae meysydd dewisol absennol yn cael eu hepgor yn llwyr o'r map CBOR (heb eu hamgodio fel null). Mae meysydd dewisol presennol yn cael eu cynnwys yn nhrefn allweddi wedi'i didoli. |
3.2 Trefn Allweddi Safonol wedi'u Dilysu
Mae'r trefnau allweddi hyn yn normadol. RHAID i weithrediadau allyrru allweddi yn union y drefn hon. DYLAI haeriadau dadfygio ddilysu trefnu mewn adeiladau di-ryddhad.
QubEnvelope (fersiwn 0x01, heb ei lofnodi, pob maes dewisol yn absennol):
"body" (5 encoded bytes)
"qub_id" (7 encoded bytes)
"sig_alg" (8 encoded bytes)
"version" (8 encoded bytes)
"reply_to" (9 encoded bytes) ← only if present (reply chains)
"body_hash" (10 encoded bytes)
"unlock_at" (10 encoded bytes)
"created_at" (11 encoded bytes)
"outcome_at" (11 encoded bytes) ← only if present (verdict mechanic)
"content_type" (13 encoded bytes)
"sender_label" (13 encoded bytes) ← only if present
"author_pubkey" (14 encoded bytes) ← only if present
"cosigner_pubkey" (16 encoded bytes) ← only if present (pact cosign)
"author_signature" (17 encoded bytes) ← only if present
"cosigner_signature" (19 encoded bytes) ← only if present (pact cosign)
Deilliad trefn allwedd QubEnvelope: mae pob allwedd yn llinyn testun CBOR. Hyd amgodedig = pennawd 1 byte + hyd y llinyn (ar gyfer llinynnau o dan 24 byte). Trefnwch yn ôl cyfanswm hyd amgodedig yn gyntaf, yna'n lecsicograffig ar gyfer allweddi o'r un hyd.
SealedQub (fersiwn 0x01, cyhoeddus, dim derbynnydd):
"title" (6 encoded bytes) ← only if present
"qub_id" (7 encoded bytes)
"version" (8 encoded bytes)
"unlock_at" (10 encoded bytes)
"outcome_at" (11 encoded bytes) ← only if present (verdict mechanic)
"visibility" (11 encoded bytes)
"drand_round" (12 encoded bytes)
"drand_chain_id" (15 encoded bytes)
"recipient_pubkey" (17 encoded bytes) ← only if present
"tlock_ciphertext" (17 encoded bytes)
"drand_chain_version" (20 encoded bytes) ← only if present (W3; absent = quicknet)
PactTerms (corff cytundeb, 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 (rhes o'r arae terms):
"key" (4 encoded bytes)
"value" (6 encoded bytes)
PartyIdentifier (map party_a / party_b):
"label" (6 encoded bytes)
"contact" (8 encoded bytes) ← only if present
3.3 Cyfeirnod Amgodio Byte
| Math | Amgodiad CBOR | Enghraifft |
|---|---|---|
| Hash SHA3-256 (32 byte) | 0x58 0x20 + 32 byte |
body_hash, qub_id |
| Amserlinau (i64) | Math mawr 0 (positif) neu 1 (negatif), amgodiad byrraf | Eiliadau Unix |
| Fersiwn (u8, gwerth 1) | 0x01 (un byte) |
|
| Math cynnwys (u8, gwerth 1) | 0x01 (un byte) |
|
| sig_alg (u8, gwerth 0) | 0x00 (un byte) |
|
| Llofnod ML-DSA-65 (3,309 byte) | 0x59 0x0C 0xED + 3,309 byte |
author_signature, cosigner_signature |
| Allwedd gyhoeddus ML-DSA-65 (1,952 byte) | 0x59 0x07 0xA0 + 1,952 byte |
author_pubkey, cosigner_pubkey |
4. Deilliadau Normadol
4.1 qub_id
Mae'r qub_id yn adnabod qub yn unigryw ac yn rhwymo'r QubEnvelope i'r SealedQub. Mae'n cael ei ddeillio'n benderfynol o gynnwys yr amlen.
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
Amgodio gwahanydd parth: Mae'r llinyn "QUB_ID_V2" yn 9 byte ASCII. Caiff un byte padin 0x00 ei atodi i gyrraedd 10 byte ar gyfer aliniad. RHAID i weithrediadau ddefnyddio'r 10 byte union hyn: [0x51, 0x55, 0x42, 0x5F, 0x49, 0x44, 0x5F, 0x56, 0x32, 0x00].
Amgodio outcome_at: Estynnodd diwygiad gweithredu cyn rhyddhau y rhagddelw o 92 i 100 beit er mwyn plygu’r maes outcome_at dewisol i’r rhwymo. Caiff outcome_at absennol ei amgodio fel 8 beit sero; mae dilyswyr y protocol yn gwrthod outcome_at <= 0 ym mhob man fel na all y sentinêl hwn wrthdaro â gwerth dilys. Gweler §3.2 (fformat gwifren) a’r tasks/verdict-uplift-plan.md yn y goeden am y mecanwaith dyfarniad sy’n cymell y maes hwn.
Amgodio drand_round: Estynnodd diwygiad gweithredu cyn rhyddhau diweddarach y rhagddelw o 100 i 108 beit er mwyn plygu drand_round (y rownd drand darged, §4.3) i’r rhwymo, a chodi’r gwahanydd parth i QUB_ID_V2. Mae hyn yn rhwymo rownd y clo amser i hunaniaeth y qub: ni all porth ail-rwymo’r seiferdestun i rownd wahanol (e.e. un sydd eisoes wedi pasio) i’r hyn y mae’r unlock_at a ddangosir yn ei awgrymu. Mae’r weithdrefn datgloi (§8) hefyd yn dilysu bod y rownd sydd wedi’i phobi i bennawd seiferdestun tlock yn cyfateb i unlock_round(unlock_at), felly rownd sy’n rheoli’r datgryptio mewn gwirionedd yw’r amser datgloi a ddangosir.
Priodweddau:
- Mae newid unrhyw faes sydd wedi’i rwymo gan y rhagddelw—
version,content_type,created_at,unlock_at,outcome_at,drand_round, beitiau amrwdbody(drwybody_hash), neutitle(drwytitle_hash)—yn cynhyrchuqub_idgwahanol. - Caiff y qub_id ei gyfrifo cyn amgryptio. Mae'r QubEnvelope a'r SealedQub yn cario'r un qub_id. Mae'r gwyliwr yn dilysu eu bod yn cyfateb ar ôl datgryptio.
- Nid yw
qub_idyn dibynnu arsender_label,reply_to, beitiau llofnod, nac allweddi cyhoeddus llofnodi. Fodd bynnag, o dan y lluniad llofnodi V2 cyfredol maesender_labelareply_toyn cael eu dilysu’n uniongyrchol gansender_label_hashareply_to_or_zero(§9.3) pan fo llofnodion yn bresennol. - Mae newid
titley SealedQub (gyda phopeth arall wedi'i sefydlogi) yn newidqub_idtrwytitle_hash. Felly ni all porth (gateway) gyfnewid y teitl plaen a ddangosir ar y cyfrif i lawr heb ddilysu hunaniaeth y qub. - Mae newid
outcome_aty SealedQub (gyda phopeth arall wedi'i sefydlogi) yn newidqub_idtrwy'r preimage. Ni all porth gyfnewid y dyddiad dyfarniad cyn-datgelu a ddangosir ar y cyfrif i lawr heb ddilysu hunaniaeth y qub. - Mae newid
drand_round(gyda phopeth arall wedi'i sefydlogi) yn newidqub_idtrwy'r preimage. Ni all porth ail-rwymo cyphertext y clo amser i rownd wahanol heb annilysu hunaniaeth y qub; ynghyd â gwiriad rownd-stanza amser-datgloi §8, mae'runlock_ata ddangosir yn rownd sy'n gatio'r datgryptio mewn gwirionedd.
4.2 body_hash
body_hash = SHA3-256(body)
Ble mae body yn llwyth tâl cynnwys Vec<u8> amrwd. Ar gyfer qubs testun, dyma yw corff y qub wedi'i amgodio UTF-8.
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
Ble mae title yn deitl plaen dewisol a wynebir ar gyfrif i lawr y gwyliwr cyn datgelu (gweler §3.2). Mae normaleiddio NFC yn rhedeg ar amser hash fel bod y crynodeb yn sefydlog ar draws dilyniannau pwyntiau côd sy'n weledol-gyfartal. Mae'r sentinel cyfan-zerod wedi'i gadw ar gyfer yr achos absennol; mae llinyn gwag yn cael ei wrthod ar ffin CBOR safonol fel amgodiad an-safonol o "absennol" (mae'r amgodiad safonol yn hepgor y maes yn gyfan gwbl).
4.3 Mapio Rownd-Datgloi
drand_round = floor((unlock_at - chain_genesis_time) / chain_period_seconds) + 1
| Paramedr | Ffynhonnell | Enghraifft |
|---|---|---|
unlock_at |
Eiliadau Unix UTC a ddewiswyd gan y defnyddiwr | 1735689600 (2025-01-01 00:00:00 UTC) |
chain_genesis_time |
gwybodaeth cadwyn drand (genesis_time) |
1595431050 |
chain_period_seconds |
gwybodaeth cadwyn drand (period) |
30 |
Dyma fapio tlock cyfeirio (CurrentRound drand). Mae drand yn cyhoeddi rownd N ar chain_genesis_time + (N - 1) * chain_period_seconds, felly mae’r fformiwla yn dewis y rownd sy’n gyfredol ar unlock_at—y rownd y gall gwyliwr sy’n cyrraedd ar unlock_at ddefnyddio ei llofnod gyntaf.
Priodwedd alinio (yr achos sy’n bwysig yn ymarferol): pan fydd (unlock_at - chain_genesis_time) yn union ranadwy gan chain_period_seconds, cyhoeddir llofnod y rownd a ddewiswyd yn union ar unlock_at, byth cyn hynny. Mae hyn bob amser yn wir am y gosodiad cyfeirio: mae amser genesis quicknet (1692803367) yn rhanadwy gan ei gyfnod 3 eiliad, ac mae’r apiau cyfeirio yn pinio amseroedd datgloi i funudau cyfan. Ar gyfer unlock_at heb ei alinio, cyhoeddir llofnod y rownd a ddewiswyd lai nag un cyfnod cyn unlock_at—un cyfnod golau yw manwl gywirdeb amserol yr ymrwymiad.
Mapio cyn-rhyddhau etifeddol a goddefiant wrth ddatgloi: y mapio gwreiddiol oedd ceil((unlock_at - chain_genesis_time) / chain_period_seconds), a ddewisodd—ar gyfer yr achos wedi’i alinio uchod—y rownd a gyhoeddwyd un cyfnod llawn cyn unlock_at, gan wneud y seiferdestun yn ddadgryptadwy’n gynnar o union un cyfnod. Mae’r ddau fapio’n wahanol o union +1 pan fo’r delta’n rhanadwy gan y cyfnod, ac yn cytuno fel arall. Gan fod drand_round wedi’i blygu i ragddelw digyfnewid qub_id (§4.1), ni ellir ail-ddeillio arteffactau a seliwyd o dan y mapio etifeddol; felly RHAID i ddilyswyr sy’n cyflawni croeswiriad rownd cam 6a §8 dderbyn drand_round wedi’i storio sy’n hafal i naill ai y rownd ddeilliedig neu y rownd ddeilliedig minws un (a RHAID iddynt fynnu bod rownd pennawd tlock yn hafal yn union i’r rownd wedi’i storio). Mae’r goddefiant yn ehangu’r llofnod gatio cynharaf o ddim mwy nag un cyfnod. Mae gwasanaeth llwyfannu cytundebau yn defnyddio’r un goddefiant wrth ail-ddeillio qub_id cytundeb wedi’i lwyfannu (wrth lwyfannu ac wrth gyd-arwyddo): os nad yw rownd y mapio cyfredol yn atgynhyrchu’r qub_id ymrwymedig a bod y delta’n rhanadwy gan y cyfnod, mae’n ailgeisio gyda’r rownd minws un, ac yn selio’r cytundeb terfynol i ba rownd bynnag y mae’r qub_id yn ei rhwymo—byth yn ddall i’r rownd wedi’i hailgyfrifo, a fyddai’n gwneud yr arteffact yn barhaol anneilladwy.
Dilysu: RHAID i unlock_at fod yn y dyfodol ar amser selio. RHAID i unlock_at BEIDIO â bod yn fwy na 10 mlynedd o created_at (i gyfyngu risg dibyniaeth drand-hir-orwel; DYLAI'r UI rybuddio ar gyfer dyddiadau datgloi y tu hwnt i 2 flynedd).
5. Newtypes Fformat Gwifren
Mae newtypes fformat gwifren yn darparu diogelwch amser-crynhoi rhag cymysgu bytes CBOR â JSON, testun plaen amrwd, neu amgodiadau byte eraill.
| Math | Yn Cynnwys | Cynhyrchwyd Gan | Defnyddir Gan |
|---|---|---|---|
SealedQubCbor |
CBOR safonol y SealedQub | serialize_sealed_qub() |
Arteffact gwifren mewnol; wedi’i storio’n noeth ar gyfer dosbarthiad cyhoeddus neu wedi’i lapio ar gyfer dosbarthiad preifat, yna ei adfer gan y gwyliwr |
QubEnvelopeCbor |
CBOR safonol y QubEnvelope | serialize_qub_envelope() |
Mewnbwn amgryptio tlock, allbwn datgryptio tlock |
5.1 Rheolau Adeiladu
// 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 Dilysu ar Adeiladu
DYLAI from_encoded() ddilysu bod y mewnbwn yn dechrau gyda phennawd map CBOR dilys. Mae dilysu strwythurol llawn yn digwydd ar amser parsio, nid amser adeiladu, er mwyn osgoi parsio-dwbl.
6. Cofrestrfa Math Cynnwys
| Gwerth | Math | Maint Corff Mwyaf | Nodiadau |
|---|---|---|---|
0x00 |
Wedi'i gadw (annilys) | — | RHAID PEIDIO â'i ddefnyddio |
0x01 |
Testun plaen (UTF-8, Markdown cyfyngedig) | 50 KB taledig / 10 KB am ddim | Gweler §10 am reolau rendro. Mae'r rhaniad rhad ac am ddim / taledig yn cael ei orfodi gan y gwasanaeth uwchlwytho; mae'r nenfwd caled-haen-protocol yn 50 KB. |
0x02 |
Wedi'i gadw (dyfodol) | — | Wedi'i ddyrannu ar gyfer math cynnwys yn y dyfodol; nid yw'n ddilys yn v1. RHAID i wylwyr ei wrthod fesul y rheol isod. |
0x03 |
Cytundeb (cytundeb dwyochrog, corff CBOR) | 100 KB | Mae'r corff yn PactTerms CBOR safonol (§6.1). Llofnodi cyd-arwyddwr fesul §9.7. |
0x04 |
Dyfarniad (hunan-raddio gan y crëwr, corff CBOR) | 8 KB | Mae'r corff yn VerdictBody CBOR safonol (§6.2). Allyrrir gan y bwriad verdict ochr-system yn unig. Mae'r berthynas rhiant ar y tag Arweave Parent-Tx-Id, nid ar y corff. Gweler verdict-uplift-plan §3.4. |
RHAID i wylwyr wrthod mathau cynnwys anhysbys gyda gwall clir-weladwy i'r defnyddiwr. RHAID i wylwyr BEIDIO â cheisio rendro mathau anhysbys fel testun.
6.1 Corff Cytundeb (content_type = 0x03)
Mae corff cytundeb yn amgodiad CBOR safonol o werth PactTerms:
PactTerms {
pact_version: u8, // 0x01 for structured/v1
title: String, // ≤ 200 bytes, NFC
terms: Vec<PactTerm>, // ≤ 20 rows
party_a: PartyIdentifier, // initiator
party_b: PartyIdentifier, // counter-signer
notes: Option<String>, // ≤ 5,000 bytes, NFC; absent key if none
}
PactTerm { key: String (≤ 100 bytes), value: String (≤ 2,000 bytes) } // NFC
PartyIdentifier{ label: String (≤ 100 bytes), contact: Option<String (≤ 320 bytes)> }
Rhoddir trefnau allwedd CBOR safonol y tri map yn §3.2. RHAID i gyfanswm CBOR cytundeb wedi'i gyfresoli BEIDIO â mynd y tu hwnt i 100 KB (yn cyfateb â §6).
Gwahaniaethydd sgema. RHAID i'r rhes gyntaf yn terms ar gyfer cytundeb structured/v1 fod yn { key: "pact_schema", value: "structured/v1" }. Mae rhesi heb yr arwydd hwn yn gytundebau "personol" ac nid ydynt yn derbyn dilysu strwythuredig na rendro sgema-ymwybodol.
Tyllau cydnabyddiaeth wedi'u rhewi. Mae cytundebau structured/v1 yn cario'n union bedair rhes cydnabyddiaeth o dan yr allweddi hyn:
"initiator_standard_terms"
"initiator_capacity_terms"
"counterparty_standard_terms"
"counterparty_capacity_terms"
Mae'r value ar gyfer pob un yn un o wyth llinyn Saesneg wedi'u rhewi a ddewiswyd gan y pâr (rôl, math), ble mae rôl ∈ { seller, buyer, provider, client } a math ∈ { standard, capacity }. Mae'r llinynnau eu hunain yn ddata protocol normadol — mae llofnodion ML-DSA-65 y ddau barti yn ymrwymo i'r bytes union trwy body_hash. NID ydynt wedi'u lleoleiddio; mae'r corff wedi'i lofnodi yn iaith-niwtral. Mae unrhyw newid geiriad yn gofyn am fersiwn sgema newydd (structured/v2).
Mae'r wyth llinyn, eu chwilio (acknowledgement_for(role, kind)), a'r rhesymeg ar gyfer pob un wedi'u pinio gan y gweithrediad cyfeirio. RHAID i weithrediadau cydymffurfiol allyrru gwerthoedd cydnabyddiaeth byte-fath; mae profion hash-corff SHA3-256 ffigwr-aur sy'n cwmpasu pob un o'r pedwar cyfuniad rôl yn dal unrhyw ddrifft.
Trefn arddangos y gwyliwr. Mae'r llinynnau cydnabyddiaeth yn cynnwys ymadroddion fel "described above", sy'n rhagdybio bod y rhesi disgrifiad / cwmpas yn rendro o flaen y cydnabyddiaethau. RHAID i wylwyr rendro'r arae terms yn nhrefn CBOR; mae ail-drefnu yn torri semanteg y rhyddiaith.
Cyswllt y gwrthbarti. Pan fydd contact Parti B yn gyfeiriad e-bost dilys, mae'r gwasanaeth uwchlwytho qub yn anfon e-bost gwahoddiad adolygu / cyd-arwyddo yn awtomatig ar amser llwyfannu ac yn rhwymo'r cyd-arwydd terfynol i ddilysu'r un cyfeiriad hwnnw (§9.7). Gellir cyd-arwyddo cytundebau y mae cyswllt Parti B yn absennol ynddynt, ond dim ond trwy sianel allan-o-fand — mae'r gwasanaeth yn gwrthod ceisiadau cyd-arwyddo na allant gynhyrchu marciwr dilysu-e-bost 15-munud cyfatebol.
6.2 Corff Dyfarniad (content_type = 0x04)
Mae corff dyfarniad yn amgodiad CBOR safonol o werth VerdictBody:
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
}
Trefn allwedd CBOR safonol:
"outcome" (8 encoded bytes)
"reflection" (11 encoded bytes) ← only if present
"evidence_url" (13 encoded bytes) ← only if present
"verdict_version" (16 encoded bytes)
RHAID i gyfanswm CBOR dyfarniad wedi'i gyfresoli BEIDIO â mynd y tu hwnt i 8 KB (yn cyfateb â'r rhes gofrestrfa uchod).
Enwm canlyniad. Mae'r byte gwifren yn fwriad-niwtral; mae'r pedwar bwced Right / Partial / Wrong / Unfalsifiable yn cwmpasu gofod canlyniad pob bwriad sy'n dwyn dyfarniad. Mae labeli fesul-bwriad ("Wedi'i alw'n iawn" / "Fe'i cedwais" / "Wedi'i gyflenwi" / "Wedi'i gadarnhau" ar gyfer Right, ac yn y blaen) yn fater rendro ochr-y-gwyliwr a ddatrysir yn erbyn bwriad y qub rhiant — mae'r wifren yn aros yn iaith- a bwriad-niwtral. RHAID gwrthod gwerthoedd y tu allan i 1..=4 wrth ddatgodio.
Cyswllt â'r rhiant. NID yw qub dyfarniad yn cario'r cyfeirnod rhiant yn ei gorff. Allyrrir id trafodiad Arweave y qub rhiant fel y tag storio Parent-Tx-Id ar amser uwchlwytho (haen tag storio §7). Mae hyn yn cadw'r corff yn ddatganiad llofnodedig hunangynhwysol o hunan-asesiad; sefydlir y gadwyn archwilio ("iawn am beth?") trwy'r chwiliad-tag Arweave.
Diogelwch URL tystiolaeth (normadol). Pan fydd evidence_url yn bresennol, RHAID i ddilyswyr (ochr-cyfansoddi, ochr-wifren, ymyl y Worker) orfodi:
- HTTPS yn unig. RHAID i'r llinyn ddechrau gyda'r dilyniant beit
https://. Caiff unrhyw gynllun arall —http,ftp,javascript,data,file, ac yn y blaen — ei wrthod. - Cap hyd. ≤ 2,048 beit (terfyn URL ymarferol y porwr).
- Gwiriad NFC + nodbwynt gelyniaethus. Yr un rheol â
titleareflection— gwrthodir nodbwyntiau bidi-override / lled-sero / tag-bloc / BOM / C0 / C1. Mae'r diffiniad yn cyfateb i'rcrate::handle::contains_hostile_text_codepointRust ac i'rworkers/api/src/utils/unicode.ts::isHostileCodepointTS (cadwch nhw mewn cydgam). - Dim gofod gwyn, dim rheolyddion ASCII. Gwrthodir gofod gwyn / DEL / beitiau is-
0x20unrhyw le yn yr URL — yn cau'r fector chwistrellu\n/\tnad yw'r rheol bidi yn ei orchuddio. - Segment gwesteiwr nad yw'n wag. RHAID i bopeth rhwng
https://a'r/,?, neu#cyntaf fod yn anwag.
Dim nôl ochr-gweinydd. RHAID i'r Worker BEIDIO â dirprwyo, nôl, na rhagolygu'r URL. Mae'r protocol yn storio llinyn; mae'r rendro'n digwydd ochr-y-gwyliwr gyda rel="nofollow noopener noreferrer" target="_blank" a gwesteiwr gweladwy wedi'i arddangos ochr yn ochr â thestun y ddolen.
Myfyrdod. Testun myfyrdod dewisol wedi'i ysgrifennu gan y crëwr ("beth a newidiodd, beth a ddysgoch"). Yr un dilysu NFC + nodbwynt gelyniaethus â title. Mae mewnbwn gwag / gofod-gwyn yn unig yn cwympo i absennol ar amser adeiladu.
Fersiwn sgema. Mae v1 yn cefnogi verdict_version = 0x01 yn unig. Mae diwygiadau sgema yn y dyfodol yn codi'r beit hwn ac yn glanio ochr yn ochr â fersiwn protocol newydd fesul §12.
7. Protocol Selio
Y dilyniant selio cyflawn. Mae pob cam yn normadol.
1. User composes plaintext and metadata in ComposeQub.
2. Validate:
a. body is non-empty.
b. body size ≤ max for content_type and user tier (see §6).
c. unlock_at is in the future.
d. unlock_at ≤ created_at + 10 years.
e. content_type is a known, supported value.
f. visibility is 0x00 (private) or 0x01 (public).
3. Compute body_hash = SHA3-256(body).
4. Set created_at = current Unix seconds UTC.
5. Select drand chain. Load chain_genesis_time and chain_period_seconds, and
compute drand_round = floor((unlock_at - chain_genesis_time) / chain_period_seconds) + 1
(§4.3). (Computed here, before qub_id, because drand_round is bound into the
qub_id preimage—§4.1.)
6. Compute qub_id (see §4.1), folding in drand_round from step 5.
7. Construct QubEnvelope with all fields.
8. Serialise QubEnvelope using canonical CBOR → bytes B.
Assert: serialised output matches canonical profile (§3).
9. Compute C = tlock_encrypt(B, drand_round, drand_chain_public_key).
10. Construct SealedQub with tlock_ciphertext = C and matching qub_id, version,
visibility, unlock_at, drand_chain_id, and drand_round.
11. Serialise SealedQub using canonical CBOR → SealedQubCbor.
12. Select the delivery shape from visibility:
a. Private (0x00): generate K = 32 random bytes and N = 12 random bytes
using a CSPRNG. Compute W = wrap_sealed_qub(SealedQubCbor,
qub_id=qub_id, key=K, nonce=N) per §13. Upload payload = W.
b. Public (0x01): upload payload = bare SealedQubCbor; do not generate K.
13. Display seal-time disclosure. User confirms.
14. Validate upload eligibility via the qub upload service (bot-detection, entitlement, rate limits).
15. Submit the selected upload payload to the qub upload service. For a private
browser seal, the service is byte-blind to the inner SealedQubCbor and never
receives K. The Builder `/api/v1/seal` route is an explicit exception: it
receives plaintext and caller-supplied K in memory, then persists neither.
16. Receive arweave_tx_id from the service. For private delivery, construct
`<origin>/c/<arweave_tx_id>#<base64url(K)>` (or the equivalent short-code
path). For public delivery, omit the fragment. Browsers do not transmit URL
fragments to servers, so K from the browser-seal path is not observed by
qub.social or any storage gateway.
Haen tagiau storfa (allan-o-fand). Mae'r gwasanaeth uwchlwytho qub yn atodi set o dagiau trafodion storfa sydd wedi'u cadw'n fwriadol fach ochr yn ochr â'r llwyth tâl uwchlwytho a ddewiswyd. Mae Content-Type=application/octet-stream yn ofynnol yn normadol. Mae'r gwasanaeth cyfeirio yn atodi tri thag dewisol ychwanegol pan fydd y crëwr yn dewis eu wynebu: Intent (bwriad cyfansoddi wedi'i ddilysu yn erbyn rhestr ganiataol — union un o announcement, thesis, prediction, letter, secret, commitment, proof, neu verdict a allyrrir gan y system), Author (ôl-bys allwedd-gyhoeddus §9.3 y crëwr fel hecs llythrennau bach 64-cymeriad), a Parent-Tx-Id (ID trafodyn storfa y qub rhiant ar gyfer cadwyni ateb, base64url 43-cymeriad).
Mae'r tag Author yn dewis-i-mewn fesul qub: mae ap creu cyfeirio yn ei atodi dim ond pan fydd y defnyddiwr yn galluogi priodoli cyhoeddus yn benodol ar amser selio. Pan fydd y togl i ffwrdd — y rhagosodiad — nid oes tag Author yn cael ei ysgrifennu ac mae'r qub yn anbriodol ar y gadwyn: nid oes dim mewn storfa parhaol yn cysylltu'r uwchlwythiad â handlen, e-bost, na qubs eraill crëwr. Pan fydd y togl ymlaen, mae ôl-bys Author yn datrys i @handle dewisedig y crëwr trwy gadwyn dystiolaeth §9.5. Mae perthnasoedd cadwyn-ateb ac Intent yn an-adnabyddol. Ar gyfer trosglwyddo preifat, mae'r lapiwr allanol (§13) yn amgryptio'r arteffact mewnol SealedQub adnabyddadwy, felly nid yw cynaeafu lapwyr wedi'u storio a chael llofnodion drand cyhoeddus yn ddigon i adfer y corff heb K; mae tagiau storfa yn parhau'n fetadata cyhoeddus yn fwriadol.
NID yw'r gwasanaeth cyfeirio yn atodi tagiau App-Name, App-Version, neu Type yn fwriadol: byddai unrhyw hidlydd gwerth-unigol o'r fath yn dychwelyd y corpws qub cyfan i ymholiad GraphQL, sy'n anghyson â chwmpas cyfrinachedd-corff-yn-unig yr amlapio.
RHAID i ddilyswr cydymffurfiol BEIDIO â dibynnu ar unrhyw dag storfa ar gyfer dilysu trydydd-parti §11; mae'r hash corff / qub_id / llofnod yn ymrwymo dim ond i'r CBOR mewnol, byth i'r set tagiau.
8. Protocol Datgloi
Y dilyniant datgloi cyflawn. Mae pob cam yn normadol.
1. Viewer opens delivery URL. Extract arweave_tx_id from the path and retain
the optional URL fragment. Do not assume a missing fragment is an error:
public/bare delivery intentionally has no K.
2. Check denylist. If tx_id is denylisted → display block message. Stop.
3. Fetch the stored bytes (with multi-gateway fallback).
3a. Resolve the delivery shape structurally:
a. If the bytes parse as OuterWrapper, require a well-formed 32-byte K in
the URL fragment, require wrapper version 0x01, and unwrap per §13.
Any missing/malformed K or AEAD failure is a terminal error.
b. Otherwise require the bytes to parse as bare SealedQubCbor; no K is
required. If neither shape parses, report an integrity error.
4. Parse SealedQubCbor → SealedQub.
5. Validate: SealedQub.version is known (0x01), visibility is known, and the
delivery shape matches it (wrapped = 0x00 private; bare = 0x01 public).
Reject any mismatch or unknown value.
6. If current time < SealedQub.unlock_at → display countdown. Poll or wait.
6a. Round-binding check. Recompute expected_round from
SealedQub.unlock_at per §4.3. Reject unless SealedQub.drand_round ==
expected_round OR SealedQub.drand_round == expected_round - 1 (the
legacy pre-release mapping—see §4.3), AND the round baked into the tlock
ciphertext stanza (read via the age/tlock header, no signature required)
== SealedQub.drand_round exactly. The stanza round is the one that
actually gates decryption; without this check a malicious creator could
bind the ciphertext to an already-past round while displaying a future
countdown, so anyone reading the stored bytes could decrypt before
unlock_at. Implementations with no chain identity (test mocks) skip this
check.
7. Once current time ≥ SealedQub.unlock_at:
a. Fetch drand round signature for SealedQub.drand_round from drand network.
b. Compute B = tlock_decrypt(SealedQub.tlock_ciphertext, round_signature).
8. Parse B → QubEnvelope.
9. Validate QubEnvelope.version is known.
10. Verify: SHA3-256(QubEnvelope.body) == QubEnvelope.body_hash.
Fail → integrity error.
11. Verify: QubEnvelope.qub_id == SealedQub.qub_id.
Fail → integrity error.
12. Verify: QubEnvelope.unlock_at == SealedQub.unlock_at.
Fail → integrity error.
12a. Verify: QubEnvelope.outcome_at == SealedQub.outcome_at (both absent, or
both present and equal). Fail → integrity error.
12b. Content re-derivation. Recompute qub_id per §4.1 from the decrypted
fields — (QubEnvelope.version, content_type, created_at, unlock_at,
outcome_at, SealedQub.drand_round, QubEnvelope.body_hash,
title_hash(SealedQub.title)) — and verify it equals SealedQub.qub_id.
Fail → integrity error. The pairwise checks in steps 10-12a only prove
the two layers agree with EACH OTHER; a forger who rewrites a bound
field consistently on both surfaces (a pre-reveal title swap, or a
post-round body swap with a recomputed body_hash re-encrypted to the
same round under the same qub_id) passes them all. Only re-deriving
the identity from content closes this.
13. Verify: QubEnvelope.content_type is known and renderable.
Known values: 0x01 (text), 0x03 (pact), 0x04 (verdict).
Unknown → display error.
14. If QubEnvelope.sig_alg != 0x00 → verify author signature (see §9.4).
15. If cosigner_pubkey or cosigner_signature present → verify cosigner (see §9.7).
16. Render content using the appropriate renderer (see §10 for text and §6 for pact/verdict).
17. Construct RevealedQub for display.
9. Llofnodi Awduriaeth
9.1 Rhesymeg
Caiff qubs eu storio mewn storfa parhaol. RHAID i lofnodion awduriaeth aros yn anffugadwy yn ddiderfyn, sef pam mae v1.0 yn defnyddio'r cynllun ôl-gwantwm ML-DSA-65 (FIPS 204) yn hytrach na chynllun clasurol y gallai ei ddiogelwch ddirywio o fewn oes parhaol y qub.
9.2 Cofrestrfa Algorithm
sig_alg |
Cynllun | Maint allwedd | Maint llofnod | Statws |
|---|---|---|---|---|
0x00 |
Dim llofnod (heb ei lofnodi) | — | — | Gweithredol |
0x01 |
ML-DSA-65 (FIPS 204) | 1,952 beit | 3,309 beit | Gweithredol |
0x02 |
Ed25519 | 32 beit | 64 beit | Cysonyn wedi’i gadw; heb gefnogaeth ym mhrotocol v1 |
RHAID i wylwyr protocol v1 wrthod pob gwerth y tu allan i {0x00, 0x01}, gan gynnwys y gwerth cadw 0x02. Mae’r cadw’n atal ailddefnydd damweiniol; nid yw’n actifadu’r algorithm. Mae ei actifadu’n gofyn am y newid llywodraethedig a ddisgrifir yn §15.
9.3 Adeiladu Preimage wedi'i Lofnodi
Mae dwy fersiwn o'r preimage wedi bodoli. RHAID i bob llofnod ddefnyddio V2, a RHAID i ddilyswyr dderbyn V2 yn unig. Cafodd hen preimage V1 (a ddogfennir isod er cyfeirnod hanesyddol) ei dderbyn fel ôl-gwymp dilysu-yn-unig yn ystod y mudo i V2; mae'r ôl-gwymp hwnnw wedi'i dynnu'n ôl a chaiff llofnod V1-yn-unig ei wrthod bellach.
V2 (cyfredol — a gynhyrchir gan bob llofnodi awdur newydd, a gan ddau lofnod llif llwyfannu / cyd-arwyddo'r cytundeb):
sig_input = SHA3-256(
"QUB_AUTHOR_SIG_V2" || // domain separator (17 bytes)
version || // u8 (1 byte)
qub_id || // [u8; 32] (32 bytes)
body_hash || // [u8; 32] (32 bytes)
unlock_at || // i64 big-endian (8 bytes)
0x00 || // u8 (1 byte): MUST be 0x00 in v1.x
sender_label_hash || // [u8; 32]: SHA3-256(NFC(sender_label)),
// or 32 zero bytes when absent
reply_to_or_zero // [u8; 32]: parent qub_id, or 32 zero
// bytes when absent
)
// Total preimage: 155 bytes → 32-byte hash
signature = Sign(author_secret_key, sig_input)
Mae sender_label_hash yn dilyn yr un confensiwn sentinel-absennol â title_hash (§4.2.1): nid yw 32 byte sero yn allbwn SHA3-256 dilys, felly ni all "absennol" byth wrthdaro â label sy'n bresennol. Mae pob maes o led sefydlog, felly mae'r preimage yn ddiamwys heb ragddodiaid hyd.
V1 (hen — WEDI'I DYNNU'N ÔL; ni chynhyrchir mwyach ac ni dderbynnir mwyach wrth ddilysu):
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
Roedd preimage V1 yn hepgor sender_label a reply_to. Cafodd ei dderbyn fel ôl-gwymp dilysu-yn-unig yn ystod y mudo i V2; mae'r ôl-gwymp hwnnw wedi'i dynnu'n ôl ers hynny — RHAID i ddilyswyr dderbyn preimage V2 yn unig. Cedwir y diffiniad yma er cyfeirnod hanesyddol ac i egluro'r gwahanydd parth isod. RHAID trin llofnod sy'n dilysu yn erbyn V1 yn unig fel methiant dilysu.
Gwahanyddion parth: mae "QUB_AUTHOR_SIG_V1" / "QUB_AUTHOR_SIG_V2" yn 17 byte ASCII yr un ([0x51, 0x55, 0x42, 0x5F, 0x41, 0x55, 0x54, 0x48, 0x4F, 0x52, 0x5F, 0x53, 0x49, 0x47, 0x5F, 0x56, 0x31/0x32]). Dim padin. Mae'r gwahanydd gwahanol yn gwahanu'r ddau preimage yn ôl parth, felly ni all llofnod dros un preimage byth ddilysu fel y llall.
Byte org_id_present: RHAID i'r byte sy'n dilyn unlock_at fod yn 0x00. Mae'r gweithrediad cyfeirio yn datgelu hyn fel y cysonyn ORG_ID_PRESENT_INDIVIDUAL = 0x00 yn crates/qub-core/src/signing.rs; RHAID i wylwyr sy'n ailadeiladu sig_input ar gyfer dilysu allyrru'r un byte.
Cwmpas llofnod — beth sydd ac nad yw'n cael ei orchuddio. Mae sig_input V2 yn ymrwymo'n uniongyrchol i version, qub_id, body_hash, unlock_at, sender_label, a reply_to (yn ogystal â'r gwahanydd parth sefydlog a'r byte org_id_present). Mae qub_id ei hun yn deillio o version, content_type, created_at, unlock_at, outcome_at, drand_round, a body_hash trwy preimage §4.1, felly mae unrhyw newid i'r meysydd hynny yn cynhyrchu qub_id gwahanol ac yn annilysu'r llofnod yn drosglwyddadwy. Felly'r wyneb wedi'i ardystio yw:
| Maes | Wedi'i ardystio gan lofnod | Sut |
|---|---|---|
version |
✓ | Mewnbwn uniongyrchol i sig_input |
qub_id |
✓ | Mewnbwn uniongyrchol |
body_hash |
✓ | Mewnbwn uniongyrchol |
unlock_at |
✓ | Mewnbwn uniongyrchol |
sender_label |
✓ | Mewnbwn uniongyrchol trwy sender_label_hash (preimage V2 — yr unig ffurf a dderbynnir) |
reply_to |
✓ | Mewnbwn uniongyrchol trwy reply_to_or_zero (preimage V2 — yr unig ffurf a dderbynnir) |
content_type |
✓ | Yn drosglwyddadwy, trwy preimage qub_id |
created_at |
✓ | Yn drosglwyddadwy, trwy preimage qub_id |
outcome_at |
✓ | Yn drosglwyddadwy, trwy preimage qub_id |
drand_round |
✓ | Yn drosglwyddadwy, trwy preimage qub_id |
body |
✓ | Yn drosglwyddadwy, trwy body_hash = SHA3-256(body) |
author_pubkey |
— (ymhlyg) | Yr allwedd a ddilysodd y llofnod yw'r awdur, drwy ddiffiniad |
cosigner_pubkey / cosigner_signature |
— | Wedi'u llofnodi'n annibynnol dros yr un sig_input (gweler §9.7) |
drand_chain_id, tlock_ciphertext, visibility |
— | Meysydd allanol SealedQub, nid o fewn yr amlen — wedi'u gorchuddio gan eu di-ymyriadau strwythurol eu hunain (cysondeb rownd / cadwyn) ond nid gan lofnod yr awdur. (Mae drand_round bellach wedi'i rwymo'n drosglwyddadwy trwy preimage qub_id — gweler uchod.) |
Pam mai V2 yw'r unig preimage a dderbynnir.
- O dan y preimage V1 a dynnwyd yn ôl, gallai parti gyda mynediad ysgrifennu i'r bytes wedi'u storio gyfnewid
sender_label("Alice" → "Mallory") neu ail-rienireply_to— a'i ail-amgryptio ar ôl y rownd — heb annilysu llofnod yr awdur, oherwydd nad oedd yr un o'r ddau faes yn y preimage wedi'i lofnodi. Mae V2 yn gorchuddio'r ddau, felly mae unrhyw newid i'r naill faes neu'r llall yn troi'r dilysu yn "fethiant". Gan fod dilyswyr bellach yn derbyn V2 yn unig, mae'r cyfnewid hwn ar gau ar gyfer pob llofnod: caiff llofnod nad yw'n rhwymo'r un o'r ddau faes (h.y. sydd ond yn dilysu yn erbyn V1) ei wrthod yn llwyr yn hytrach na chael ei israddio iddo. - Mae'r
author_pubkeyy tu mewn i'r amlen yn parhau i fod yn angor hunaniaeth gwirioneddol — RHAID i wylwyr ddeillio'r hunaniaeth arddangos oauthor_pubkey(trwy haen dystiolaeth §9.5) yn hytrach na thrystiosender_label.
RHAID i weithrediadau sy'n arddangos sender_label neu reply_to i ddefnyddwyr terfynol wynebu'r hunaniaeth wedi'i hardystio (ôl-bys allwedd gyhoeddus, tystiolaeth) fel y prif arwydd hunaniaeth, nid y label.
9.4 Gweithdrefn Dilysu
1. Read sig_alg from QubEnvelope.
2. If sig_alg == 0x00 → unsigned. No verification. Display "unsigned qub."
3. If sig_alg is unknown → reject. Display "unrecognised signature scheme."
4. Extract author_signature and author_pubkey. If either is absent → integrity error.
5. Reconstruct sig_input using fields from QubEnvelope (V2 formula, §9.3).
6. Verify(author_pubkey, sig_input, author_signature). The V2 preimage is the
only accepted form — the legacy V1 fallback is retired (§9.3), so a
signature that does not verify against V2 fails, full stop.
7. If verification succeeds → display "signed by [key fingerprint]."
8. If verification fails → display "signature verification failed."
Dilysu llofnod yw'r weithred ddrutaf (yn enwedig ML-DSA-65). DYLAI gael ei berfformio ar ôl i'r holl wiriadau rhatach (hash, qub_id, unlock_at) basio.
9.5 Tystiolaethau Hunaniaeth
Mae tystiolaethau hunaniaeth — mapio'r author_pubkey i honiadau hunaniaeth dynol-adnabyddadwy fel dolen qub, cyfeiriad e-bost, dolen gymdeithasol, neu gymhwyster passkey — yn welliant cynyddol ochr-gwyliwr ac NID yn ofynnol ar gyfer dilysu llofnod. RHAID i wylwyr sy'n datrys tystiolaethau i hunaniaeth arddangos roi'r flaenoriaeth:
handle > email > social > fingerprint
Mae'r ôl-gwymp ôl-bys yn hecs llythrennau bach SHA3-256(author_pubkey); mae bob amser ar gael ar gyfer unrhyw qub wedi'i lofnodi. CAIFF gwylwyr ei dalfyrru ar gyfer ei arddangos — mae'r gwyliwr cyfeirio yn rendro qub: wedi'i ddilyn gan y pedwar byte cyntaf a'r pedwar byte olaf (qub:<8 hex>…<8 hex>).
Gall dilyswr cydymffurfiol gwblhau pob gwiriad yn §9.4 heb gysylltu â'r API qub, heb unrhyw rwydwaith y tu hwnt i storfa parhaol a drand, a heb unrhyw chwilio ochr-gweinydd. Mae datrys tystiolaeth yn gam ymdrech-orau ar wahân a berfformir dim ond ar ôl i ddilysu llofnod lwyddo.
9.6 Effaith Maint
| Ed25519 | ML-DSA-65 | |
|---|---|---|
| Llofnod | 64 byte | 3,309 byte |
| Allwedd gyhoeddus | 32 byte | 1,952 byte |
| Cyfanswm fesul qub | 96 byte | 5,261 byte |
| Delta cost storfa (ar ~$5/MB) | ~$0.0005 | ~$0.026 |
Ar gyfer qub testun o 500–2,000 byte, mae ML-DSA-65 yn treblu'r maint wedi'i storio yn fras. Mae'r gost absoliwt yn ddibwys.
9.7 Dilysu Cyd-arwyddwr (Cytundebau Dwyochrog Cytundeb)
Ar gyfer cytundebau dwyochrog (content_type = 0x03), mae ail haen lofnod yn profi bod y ddau barti wedi cydsynio i'r un telerau.
Meysydd amlen:
cosigner_pubkey: Allwedd gyhoeddus ML-DSA-65 y cyd-arwyddwr (Parti B).cosigner_signature: Llofnod dros yr unsig_inputâ'r awdur (§9.3).
RHAID i'r ddau faes fod yn bresennol gyda'i gilydd neu'r ddau yn absennol. Os yw union un yn bresennol, RHAID i wylwyr riportio gwall cywirdeb.
Gweithdrefn dilysu:
1. If cosigner_pubkey absent and cosigner_signature absent → no cosigner. Done.
2. If exactly one is present → integrity error.
3. Verify cosigner_pubkey != author_pubkey (prevent self-cosigning).
Fail → display "cosigner pubkey must differ from author."
4. Reconstruct sig_input using the same formula as §9.3 (V2 only — the
legacy V1 fallback is retired; all pact clients produce V2 signatures).
5. Verify(cosigner_pubkey, sig_input, cosigner_signature).
6. Success → display "co-signed by [cosigner fingerprint]."
7. Failure → display "co-signature verification failed."
Priodweddau:
- Mae'r cyd-arwyddwr yn llofnodi'r un
sig_inputâ'r awdur — mae'r ddau barti'n ymrwymo i'r unqub_id,body_hash, acunlock_at(ac, o dan V2, yr unsender_label_hashareply_to_or_zero). - Er mwyn galluogi'r cyd-arwyddwr i ailadeiladu preimage V2 heb fynediad i fytiau amrwd yr amlen, mae'r gwasanaeth llwyfannu yn gorfodi ar amser llwyfannu fod
sender_labelamlen cytundeb yn hafal ipact_terms.party_a.labela bodreply_toyn absennol. Mae'r ddau amod yn wir ar gyfer pob cytundeb cleient-cyfeirio; caiff amlenni sy'n torri hyn eu gwrthod wrth lwyfannu. - NID yw deilliad
qub_id(§4.1) yn cynnwys meysydd cyd-arwyddwr. Nid yw ychwanegu cyd-arwyddwr at amlen sy'n bodoli yn newid yqub_id. - Gall cytundeb fod wedi'i lofnodi gan yr awdur yn unig (ymrwymiad un-ochrog), cyd-arwyddwr yn unig (anarferol), neu'r ddau (prawf dwyochrog llawn).
Gât-rhwymo-e-bost (gweithredol). Pan fydd cytundeb wedi'i lwyfannu yn cario cyswllt e-bost Parti B (§6.1), RHAID i'r gwasanaeth uwchlwytho qub wrthod y cais cyd-arwyddo oni bai bod marciwr dilysu-e-bost byrhoedlog yn bodoli sy'n cyfateb i'r ID llwyfannu a hash-e-bost-wedi'i-normaleiddio'r cyswllt hwnnw. Caiff y marciwr ei ysgrifennu gan /api/v1/auth/verify pan fydd y tocyn dolen-hud yn cario staging_id a bod y cyfeiriad wedi'i ddilysu yn cyfateb i SHA-256(normalise_email(party_b.contact)) — ble mae normalise_email(addr) yn cadw cas y rhan leol ac yn lleihau'r rhan parth yn unig (yn unol â RFC 5321 §2.3.11), ac mae SHA-256 yma yn hash NIST FIPS 180-4 (gwahanol i'r SHA3-256 a ddefnyddir mewn deilliadau §4) — ac yn dod i ben 900 eiliad (15 munud) ar ôl cyhoeddi. Mae hyn yn gât gwrth-ddynwarediad gweithredol, NID yn rhan o brawf qub ar-y-gadwyn — mae dilyswr trydydd-parti sy'n ailchwarae §11 angen dim ond storfa parhaol a drand, heb unrhyw chwilio ochr-gweinydd. Mae'r marciwr yn bodoli ar yr ochr gweinydd yn unig ac nid yw byth yn rhan o'r corff wedi'i lofnodi.
Effaith maint (awdur ML-DSA-65 + cyd-arwyddwr):
| Cydran | Maint |
|---|---|
| Llofnod awdur | 3,309 byte |
| Allwedd gyhoeddus awdur | 1,952 byte |
| Llofnod cyd-arwyddwr | 3,309 byte |
| Allwedd gyhoeddus cyd-arwyddwr | 1,952 byte |
| Cyfanswm gorbenion crypto | 10,522 byte |
| Delta cost storfa | ~$0.05 |
10. Rendro a Glanhau Markdown
Mae'r adran hon yn ddiogelwch-feirniadol. Mae'r gwyliwr yn rendro qubs testun (content_type = 0x01) gan ddefnyddio is-set Markdown cyfyngedig.
10.1 Elfennau a Ganiateir
- Penawdau:
#trwy####(dim#####nac######) - Pwyslais: trwm (
**), italig (*), trwy-rwygiad (~~) - Rhestrau: trefnedig (
1.) ac anhrefnedig (-,*) - Dyfynfeydd (
>) - Côd: rhychwantau mewnlinell (```) a blociau wedi'u ffensio (`````)
- Llinellau llorweddol (
---) - Toriadau llinell (dwy ofod olynol neu linell wag)
- Paragraffau
10.2 Elfennau Gwaharddedig
| Elfen | Trin |
|---|---|
HTML amrwd (<div>, <script>, ac ati) |
Wedi'i ddileu'n gyfan gwbl. Nid oes HTML yn pasio drwodd. |
Delweddau () |
Wedi'u dileu. Mae cystrawen delweddau yn cael ei dynnu o'r allbwn. |
Dolenni ([text](url)) |
URL wedi'i rendro fel testun plaen gweladwy. Heb ei auto-gysylltu. Heb fod yn glic-adwy heb gamau defnyddiwr penodol. |
| Cynlluniau URL peryglus | javascript:, data:, vbscript:, file: — wedi'u dileu. |
| Iframes, embeds, gwrthrychau | Wedi'u dileu. |
| Endidau HTML | Wedi'u datgodio i nodau arddangos dim ond os yw'n ddiogel. |
10.3 Gweithrediad
RHAID i weithrediadau ddefnyddio parseu rhestr ganiataol llym, nid rhestr-bloc. Y dull a argymhellir:
- Parsio Markdown gan ddefnyddio
pulldown-cmark(neu gyfwerth). - Cerdded yr AST a gollwng unrhyw nod nad yw yn y rhestr ganiataol (§10.1).
- Ar gyfer nodau dolen: allyrru'r URL fel testun gweladwy, nid fel elfen
<a>y gellir ei chlicio. - Trosi'r AST wedi'i hidlo i gynrychioliad canol-gam wedi'i deipio (e.e., enum
MarkdownNodegydag amrywiadau diogel yn unig). Mae HTML amrwd yn strwythurol an-gynrychioliadwy yn y IR hwn. - Rendro o'r IR wedi'i deipio i'r haen olwg targed (e.e., cydrannau golwg adweithiol, nodau DOM). Dim cydgysylltiad llinyn HTML na
innerHTMLar unrhyw bwynt.
Mae dulliau rhestr-bloc yn fregus oherwydd gall estyniadau Markdown newydd neu cwirciau parser gyflwyno elfennau heb eu hidlo. Mae'r dull AST-wedi'i-deipio yn gwneud XSS yn strwythurol amhosibl — nid oes amrywiad sy'n gallu cario HTML mympwyol.
10.4 Cyfyngiadau Maint a Strwythur
- Dyfnder pennawd a renderir mwyaf:
####(H4). Mae#####a dyfnach yn cael eu rendro fel testun trwm. - Dim cyfyngiad ar nifer paragraffau (cyfyngiadau maint corff yn §6 yw'r cyfyngiad).
- Blociau côd wedi'u ffensio: dim amlygu cystrawen yn MVP. Wedi'u rendro fel testun cyn-fformatiedig monospace.
11. Dilysu Trydydd Parti
Gall unrhyw drydydd parti sydd â’r beitiau wedi’u storio (a K ar gyfer qub preifat/lapiedig) ddilysu’r arteffact cryptograffig heb gydweithrediad qub. Mae honiad bodolaeth sydd wedi’i stampio’n annibynnol hefyd yn gofyn am naill ai gynhwysiad storfa barhaol fesul qub wedi’i ddilysu neu brawf log tryloywder §16 wedi’i ddilysu.
1. Obtain the stored bytes. For a private delivery, also obtain K from the
delivery-link fragment.
2. Resolve the delivery shape (§8 step 3a): unwrap OuterWrapper with K, or
accept bare SealedQubCbor. Require shape/visibility agreement.
3. Parse SealedQubCbor → SealedQub; validate protocol version, visibility,
content type, chain identity, and structural bounds.
4. Recompute expected_round from unlock_at (§4.3); require the stored round
(allowing the documented legacy minus-one case) and ciphertext-stanza round
to agree exactly as §8 step 6a specifies.
5. Obtain the drand signature for SealedQub.drand_round and verify its BLS
signature against the pinned chain public key.
6. tlock_decrypt(tlock_ciphertext, round_signature) → QubEnvelope CBOR bytes.
7. Parse → QubEnvelope.
8. Verify SHA3-256(body) == body_hash.
9. Verify envelope/sealed equality for qub_id, unlock_at, and outcome_at.
10. Recompute qub_id from the decrypted fields, sealed drand_round, and title;
require it to equal the carried qub_id (§4.1).
11. If sig_alg != 0x00, verify the V2 author signature (§9.4). If cosigner
fields are present, verify their pairing, key separation, and signature
(§9.7).
12. For an existence-time claim, independently verify either:
a. the permanent-storage transaction's data-to-id binding, owner, block
inclusion, and block timestamp; or
b. a §16 inclusion proof through its pinned anchor and anchor block time.
13. Report each verified claim separately; do not collapse an absent storage
or anchor proof into a successful timing verdict.
Beth mae dilysu yn ei brofi:
| Mewnbwn prawf | Beth y mae’n ei sefydlu |
|---|---|
| Bwndel dilys / arteffact seliedig + llofnod drand | Mae’r corff a adferwyd yn cyfateb i body_hash; mae’r metadata wedi’i rwymo i qub_id yn gyflawn; mae’r seiferdestun wedi’i rwymo i’r rownd drand ddatganedig; ac mae’r rownd honno wedi mynd heibio. Nid yw hyn yn sefydlu pryd y crëwyd y seiferdestun. |
| Llofnod awdur/cyd-arwyddwr V2 dilys | Dilysodd deiliad/deiliaid yr allwedd/allweddi gyfrinachol gyfatebol yr wyneb llofnodedig yn §9.3. |
| Trafodiad storfa fesul qub wedi’i ddilysu’n annibynnol | Roedd yr union seiferdestun wedi’i storio yn bodoli heb fod yn hwyrach nag amser ei floc. |
| Prawf log tryloywder angoredig dilys | Yr honiad penodol i fath y ddeilen yn §16.11, gan gynnwys amser ymrwymo terfyn uchaf o floc yr angor. |
Beth NAD yw dilysu yn ei brofi:
| An-brawf | Pam |
|---|---|
| Awduriaeth | Mae'r sender_label yn addurnol. Heb sig_alg ≥ 0x01, gallai unrhyw un fod wedi selio'r cynnwys hwn. |
| Bwriad | Mae’r arteffact yn profi beitiau a pherthnasoedd cryptograffig, nid yr hyn a olygai’r crëwr yn oddrychol. |
Ymrwymiad a oedd yn bodoli eisoes o .qub yn unig |
Gall crëwr gydosod bwndel dilys ar ôl i’r rownd rwymedig fynd heibio. Mae’r llofnod drand mewnblanedig yn profi bod y rownd wedi mynd heibio, nid bod y seiferdestun yn bodoli cyn hynny. |
| Union amser botwm selio | Mae stamp amser bloc storfa neu angor yn derfyn uchaf y gellir ei ddilysu’n annibynnol, a gall fod ar ôl gweithred leol y defnyddiwr. Nid yw honiadau sealed_at / received_at yn dystiolaethol. |
Mae’r log tryloywder a weithredir (§16) yn estyn y dilysu ar draws qubs gyda threfn sy’n dystiolaeth o ymyrraeth ac amser ymrwymo terfyn uchaf di-ymddiried (amser bloc yr angor), wedi’i gwmpasu gan fath y ddeilen (§16.11). Nid yw’n ychwanegu awduriaeth na bwriad; ar gyfer y llwybr uwchlwytho dall i feitiau diofyn nid yw ynddo’i hun yn profi body_hash na drand_round, sy’n parhau i ddod o wiriadau’r arteffact.
12. Fersiynu a rheoli rhyddhau
Mae rhyddhadau dogfennau, y protocol gwifren mewnol, a’r lapiwr allanol yn ofodau fersiwn ar wahân. Felly nid yw eglurhad dogfen yn unig yn newid beitiau’n dawel, ac ni all mudo gwifren yn y dyfodol esgus bod yn ddiwygiad golygyddol.
12.1 Fersiwn rhyddhau’r ddogfen
Mae’r fanyleb hon yn defnyddio rhyddhadau dogfen semantig (MAJOR.MINOR.PATCH) a thag Git digyfnewid o’r enw protocol-v<release>.
- PATCH: cywiriad cywirdeb neu olygyddol nad yw’n newid beitiau cydymffurfiol nac ymddygiad gofynnol.
- MINOR: ychwanegiad normadol cydnaws yn ôl, cofnod cofrestrfa newydd, neu fformat ochr-gar newydd sydd â’i fersiwn annibynnol ei hun.
- MAJOR: newid normadol anghydnaws, gan gynnwys dehongliad gwifren gofynnol newydd.
Mae statws rhyddhad yn un o Drafft (nid yw’n normadol eto), Cyfredol (yr unig darged gweithredu a argymhellir), neu Disodledig (wedi’i gadw ar gyfer dilysu hanesyddol). Mae’r llwybr /y-protocol heb fersiwn yn dangos y rhyddhad Cyfredol; mae’r tag rhyddhau yn cadw ei union ffynhonnell a phob locale a gyhoeddwyd gydag ef. Mae newid statws neu rif rhyddhau yn gofyn am ddiweddaru’r tabl hwn a hanes y rhyddhad yn yr un newid wedi’i adolygu.
| Rhyddhad y ddogfen | Dyddiad effeithiol | Statws | Protocol gwifren | Lapiwr | Ffynhonnell |
|---|---|---|---|---|---|
| 1.0.0 | 2026-09-23 | Cyfredol | 0x01 |
0x01 |
protocol-v1.0.0 |
12.2 Fersiwn protocol
Mae'r maes version (u8) yn SealedQub a QubEnvelope yn adnabod prif fersiwn y protocol.
- RHAID i wylwyr wrthod prif fersiynau anhysbys gyda gwall clir.
- O fewn prif fersiwn hysbys, RHAID i ddadgodyddion wrthod allweddi map anhysbys (§3.1) — mae esblygiad sgema yn digwydd trwy gyflwyno
versionnewydd, nid trwy ychwanegu allweddi y byddai dadgodyddion presennol yn eu hanwybyddu. (Roedd diwygiadau cynharach o'r fanyleb hon yn caniatáu goddef meysydd dewisol anhysbys; mae'r cymal hwnnw wedi'i dynnu'n ôl — roedd yn gwneudencode(decode(x))yn anfewnsaethol ac yn agor fector cynnwys-cudd-wedi'i-lofnodi ar lwythi tâl cytundeb.) - Mae mathau cynnwys (
content_type) a chynlluniau llofnod (sig_alg) wedi'u gatio gan fersiwn: gellir cyflwyno gwerthoedd newydd dim ond ochr yn ochr â fersiwn protocol newydd neu ddiweddariad cofrestrfa penodol.
12.3 Hanes fersiynau’r protocol
| Fersiwn | Gwerth | Disgrifiad |
|---|---|---|
| v1 | 0x01 |
Trosglwyddo preifat/lapiedig a chyhoeddus/noeth; cyrff testun (0x01), cytundeb (0x03), a dyfarniad (0x04); llofnodi awdur/cyd-arwyddwr V2 ML-DSA-65; tlock quicknet drand; SHA3-256. |
12.4 Cydnawsedd ymlaen
RHAID i wyliwr v1 sy'n dod ar draws QubEnvelope gydag allweddi map CBOR anhysbys (allweddi nad ydynt yn y drefn safonol §3.2) ei wrthod gyda gwall dadgodio (§3.1). Mae cydnawsedd ymlaen yn dibynnu ar y maes version, nid ar oddefiant allweddi: mae ychwanegiadau yn y dyfodol — hyd yn oed metadata bach — yn glanio o dan werth version newydd, y mae gwyliwr v1 yn ei wrthod gyda gwall "protocol mwy newydd" clir yn hytrach na gollwng yn dawel gynnwys y mae'r llofnodion yn ymrwymo iddo.
DYLAI gwyliwr v1 sy'n dod ar draws sig_alg = 0x01 (ML-DSA-65) ond heb gefnogaeth dilysu ML-DSA-65 arddangos cynnwys y qub gyda hysbysiad "llofnod yn bresennol ond nid yn ddilysadwy", nid gwrthod y qub yn gyfan gwbl. Mae'r gweithrediad cyfeirio heddiw yn gwrthod pob gwerth sig_alg heblaw 0x00 ac 0x01 oherwydd nad oes algorithm dilys arall yn y gofrestrfa v1 — mae gwrthodiad llym a meddal-fethu yn arsylladwy-fath nes bod trydydd algorithm yn cael ei gofrestru. Mae'r ymddygiad meddal-fethu uchod yn dod yn lwyth-eredig unwaith y mae §9.2 yn derbyn cofnod newydd, ac fe ddiweddarir y gwyliwr cyfeirio i feddal-fethu ar y pwynt hwnnw.
12.5 Fersiwn y lapiwr allanol
Mae'r OuterWrapper a ddisgrifir yn §13 yn cario ei byte version ei hun, annibynnol ar SealedQub.version a QubEnvelope.version. Mae'r ddau ofod fersiwn yn esblygu ar wahân: mae amnewid cymesur diogel-ôl-gwantwm yn y dyfodol yn codi'r byte amlapio heb gyffwrdd â fersiwn y protocol mewnol, ac mae ychwanegiad haen-protocol yn y dyfodol (e.e., maes amlen newydd) yn codi'r fersiwn fewnol heb gyffwrdd â'r byte amlapio.
OUTER_WRAPPER_VERSION_* |
Gwerth | Algorithm | Statws |
|---|---|---|---|
OUTER_WRAPPER_VERSION_1 |
0x01 |
AES-256-GCM gyda nonce 12-byte, tag dilysu 16-byte, AAD wedi'i rwymo i qub_id |
Gweithredol ar gyfer trosglwyddo preifat |
| — | 0x02–0xFF |
Wedi'u cadw | Dyfodol |
RHAID i wylwyr wrthod fersiynau amlapio anhysbys gyda gwall clir. Mae'r protocol yn cadw'r gofod fersiwn amlapio yn fwriadol gul nes bod gyrrwr ymfudo concrid yn ymddangos (e.e., arweiniad NIST yn ffafrio AEAD gwahanol); dyrannir slot 0x02 yn yr un diwygiad sy'n cyflwyno'r algorithm.
13. Amlapio Amgryptio Allanol
13.1 Rhesymeg
Mae haenau'r protocol (QubEnvelope → tlock → SealedQub) yn gwneud qub wedi'i selio yn wedi'i gloi-amser: mae'r corff yn anddarllenadwy tan unlock_at ac mae llofnod rownd drand wedi'i gyhoeddi. Ar ôl datgloi, fodd bynnag, mae llofnod y rownd yn gyhoeddus ac mae siâp CBOR safonol SealedQub yn adnabyddadwy, felly gallai cynaeafwr a fynegeiodd drafodion storfa parhaol swmp-ddatgryptio'r corpws qub cyfan.
Ar gyfer trosglwyddo preifat, mae’r lapiwr amgryptio allanol yn cau’r sianel honno drwy osod haen AEAD gymesur ychwanegol rhwng y SealedQubCbor canonaidd a’r beitiau wedi’u storio. Yn llwybr selio’r porwr, mae’r allwedd 256-did K yn byw dim ond yn narn URL y ddolen drosglwyddo ac ar ddyfeisiau defnyddwyr; nid yw porwyr yn trosglwyddo darnau URL i weinyddion, felly mae qub.social, pob porth storfa, a phob CDN o flaen y naill neu’r llall yn ddall i K. Felly mae cynrychiolaeth wedi’i storio qub preifat yn seiferdestun anhryloyw na ellir adfer ei destun plaen heb yr URL y dewisodd y crëwr ei rannu. Mae trosglwyddo cyhoeddus yn hepgor yr haen hon yn fwriadol (§13.8).
Effaith net:
- Gwrthiant rhifo ar gyfer trosglwyddo preifat. Mae
OuterWrapperyn parhau'n CBOR strwythuredig adnabyddadwy—nid yw'n llythrennol anwahaniaethol oddi wrth feitiau ar hap—ond mae ei faes seiferdestun yn cuddio siâp mewnol adnabyddadwySealedQub. Nid yw'r strategaeth gynaeafu ddogfenedig o “ymholi GraphQL am uwchlwythiadau qub noeth, yna swmp-ddadgryptio â llofnodion drand cyhoeddus” yn cyrraedd testun plaen heb K. - Safiad preifatrwydd crypto-malu ar gyfer llif preifat diofyn y porwr. Ni all qub.social ddadgryptio'r arteffactau hynny sydd wedi'u storio o'i ddata diofyn ar ochr y gweinydd. Mae gan adferiad penodol, trosglwyddo cyhoeddus a selio dibynadwy ar ochr y gweinydd ffiniau ymddiriedaeth gwahanol sydd wedi'u datgelu.
- Ysgol cyfrinachedd dwy-haen. Rhagosodiad = mynediad wedi'i reoli gan ddolen (yr adran hon). Mae qubs preifat wedi'u hamgryptio i'r derbynnydd (nodwedd Cam 2 wedi'i chadw, heb ei manylu eto) yn haenu ar ben fel yr ail haen.
13.2 Haenu
plaintext body ← QubEnvelope.body (§2.2)
↓ canonical CBOR (§3)
envelope CBOR
↓ tlock encrypt to drand round (§7 step 10)
tlock_ciphertext (inside SealedQub) (§2.3)
↓ canonical CBOR (§3)
SealedQubCbor bytes ← inner wire artifact
├─ public (visibility=0x01) ───────────────▶ stored directly (§13.8)
└─ private (visibility=0x00)
↓ AES-256-GCM(K, nonce, AAD=qub_id) (§7 step 12, this section)
OuterWrapper CBOR bytes ← stored private payload
Mae selio a datgloi yn yr haen protocol (§7, §8) yn ddigyfnewid o dan ffin yr amlapio; mae'r amlapio yn ymgysylltu ar safle galwad seal() ac yn datgysylltu ar safle galwad unlock().
13.3 Strwythur Data OuterWrapper
struct OuterWrapper {
version: u8, // 0x01, see §12.5
qub_id: [u8; 32], // copied from inner SealedQub; AEAD AAD
nonce: [u8; 12], // 96-bit AEAD nonce
ciphertext: Vec<u8>, // AES-256-GCM(K, nonce, SealedQubCbor, AAD=qub_id) || 16-byte tag
}
Diymyriadau maes.
- RHAID i
versionfod yn0x01ar gyfer bytes amlapio v1.0. - RHAID i
qub_idgyfateb i faesqub_idy SealedQub a adferir ar ôl dadamlapio. Maewrap_sealed_qubaunwrap_sealed_quby gweithrediad cyfeirio ill dau yn parsio'r CBOR mewnol ac yn gorfodi'r hafaledd hwn yn uniongyrchol; mae'r rhwymiad AAD ar wahân yn peri i ymyrryd â'rqub_idallanol ar ôl lapio fethu'r dilysiad. - RHAID i
noncefod yn 96 bit (12 byte), wedi'i gynhyrchu o'r newydd gan CSPRNG ar gyfer pob gweithred amlapio. Mae ailddefnyddio nonce o dan yr un allwedd yn caniatáu ymosodiadau ailddefnyddio-nonce AEAD sy'n adfer y testun plaen; RHAID i gynhyrchwyr drin parau (key,nonce) fel un-saethiad. - Mae
ciphertextyn allbwn AES-256-GCM: bytes cyphertext wedi'u cydgysylltu gyda thag dilysu 16-byte.ciphertext.len() == SealedQubCbor.len() + 16yn union.
Amgodio CBOR. CBOR safonol fesul §3, gyda'r un rheol trefnu-allweddi (wedi'i drefnu yn ôl hyd byte amgodedig yn esgynnol, yna'n lecsicograffig). Y pedair allwedd yw:
| Allwedd | Bytes amgodedig | Trefn |
|---|---|---|
nonce |
6 | 1 |
qub_id |
7 | 2 |
version |
8 | 3 |
ciphertext |
11 | 4 |
Mae byte cyntaf CBOR y OuterWrapper felly'n bennawd map o hyd pendant ar gyfer map 4-cofnod (0xA4).
13.4 Rhwymo AAD i qub_id
Mae'r amlapio yn rhwymo qub_id fel data ardystiedig ychwanegol AEAD. Dyma'r amddiffyn strwythurol llwyth-eredig yn erbyn tair dosbarth o ymosodiad:
| Ymosodiad | Amddiffyn |
|---|---|
Symud cyphertext o dan faes qub_id gwahanol yn yr amlapio |
Annhebygrwydd AAD → mae dilysu AEAD yn methu |
| Cymysgu ffragment URL qub A â beitiau storiedig qub B | Allwedd anghywir (ac AAD wedi'i rwymo'n annibynnol) → mae dilysu AEAD yn methu |
Ymyrryd â maes qub_id yr amlapio ar ôl uwchlwytho |
Annhebygrwydd AAD → mae dilysu AEAD yn methu |
Nid yw cario qub_id yn nhestun plaen yr amlapio yn gwanhau imiwnedd rhifo'n ystyrlon — mae qub_id ei hun yn hash SHA3-256 o preimage §4.1 heb preimage adferadwy o'r crynodeb, ac mae rhifwr a gynaeafodd y bytes amlapio yn barod yn dysgu dim o'r qub_id gweladwy na allent fynd amdano o fodolaeth yr uwchlwythiad ei hun.
13.5 Algorithmau Amlapio a Dadamlapio
wrap_sealed_qub(SealedQubCbor S, qub_id Q, key K, nonce N):
require K.len() == 32 and N.len() == 12 and Q.len() == 32
I := canonical_cbor_decode(S) as SealedQub
require I.qub_id == Q // reject mismatched caller AAD
C := AES_256_GCM_encrypt(key=K, nonce=N, msg=S, aad=Q)
// C includes the 16-byte authentication tag at the end
return canonical_cbor_encode(OuterWrapper{
version: 0x01,
qub_id: Q,
nonce: N,
ciphertext: C,
})
unwrap_sealed_qub(OuterWrapper bytes W, key K):
require K.len() == 32
O := canonical_cbor_decode(W) as OuterWrapper
require O.version == 0x01 // §12.5
P := AES_256_GCM_decrypt(
key=K, nonce=O.nonce, ciphertext=O.ciphertext, aad=O.qub_id
)
// any AEAD failure → DECRYPT_FAILED, indistinguishable to caller
S := canonical_cbor_decode(P) as SealedQub
require S.qub_id == O.qub_id // explicit inner/outer cross-check
return P // P is the validated SealedQubCbor
Cwymp modd-methiant. Mae K anghywir, nonce anghywir, annhebygrwydd AAD, a cyphertext sydd wedi'i ymyrryd â hi, i gyd yn cynhyrchu'r un gwall DECRYPT_FAILED. Priodwedd AEAD bwriadol yw hwn: byddai gwahaniaethu'r modd methiant yn creu sianel ochr y gallai ymosodwr o bell ei brofio trwy anfon amlapiadau anffurfiol ac amseru'r ymateb. RHAID i weithrediadau cyfeirio gwympo pob methiant AEAD i un siâp gwall.
13.6 Deunydd Allwedd a Dosbarthu
Mae'r allwedd amlapio K yn werth hap-unffurf 256-bit a gynhyrchwyd fesul-qub gan CSPRNG. Mae'r gweithrediadau cyfeirio yn ei ffynonellu o:
- Crëwr WASM:
getrandom(WebCrypto o dan y backendwasm_js). - Galwr yr API selio ochr-gweinydd: ei CSPRNG lleol; mae'r galwr yn cyflenwi ac yn cadw
Kfelwrapper_key_b64url. Mae'r Worker yn defnyddioKyn y cof ar gyfer yr amlapio ond RHAID iddo BEIDIO â'i chadw'n barhaol. Mae hyn yn galluogi ailgais idempotent i adfer ymateb wedi'i olygu gan ddefnyddio gallu cadwedig y galwr yn hytrach na dibynnu ar gyfrinach un-saethiad a gynhyrchwyd gan y gweinydd.
Dosbarthu: RHAID amgodio K fel base64 diogel-URL (RFC 4648 §5, dim padin) a'i atodi i'r ddolen drosglwyddo fel y cydran ffragment:
delivery_url = <origin>/c/<arweave_tx_id>#<base64url(K)>
Nid yw'r ffragment byth yn cael ei drosglwyddo i unrhyw weinydd gan borwr cydymffurfiol. Mae sianeli adfer (mynegai hanes ochr-gweinydd, anfon-awtomatig e-bost dewis-i-mewn) sy'n cadw'r ddolen drosglwyddo lawn — gan gynnwys y ffragment — y tu hwnt i ddyfais y defnyddiwr yn fasnach benodol yn erbyn yr ystum crypto-malu rhagosodedig a RHAID iddynt gael eu gatio ar gydsyniad defnyddiwr penodol.
Colled ffragment. Os bydd defnyddiwr yn colli ffragment yr URL ac nad oes ganddo unrhyw sianel adfer, mae'r qub yn anddarllenadwy. Hwn yw'r fasnach llwyth-eredig yn y dyluniad a RHAID iddo gael ei ddatgelu i'r defnyddiwr ar amser selio. Mae'r MVP yn cryfhau'r datgeliad amser-selio gyda chopi "cadwch yr URL hwn" penodol a sianel adfer e-bost-wedi'i-ddilysu i ddefnyddwyr sy'n dewis i mewn.
13.7 Allan-o-Gwmpas ar gyfer yr Adran Hon
- Mae llofnodi awduriaeth (§9) yn ddigyfnewid: caiff llofnodion eu cyfrifo y tu mewn i'r
QubEnvelopemewnol ac maent yn cael eu hadfer ar ôl dadamlapio → datgryptio tlock → parsio CBOR. - Mae amgryptio allwedd gyhoeddus y derbynnydd (y maes
recipient_pubkeya gadwyd) yn nodwedd yn y dyfodol sy’n wahanol i ddull lapiwr preifat heddiw sydd wedi’i reoli gan allu’r ddolen. - Mae llif cyd-arwyddo cytundeb ochr-gweinydd presennol yn allyrru
SealedQubCborcyhoeddus/noeth gyda gwelededd0x01; ni all fodloni model cyfrinachedd K y porwr yn unig oherwydd bod y selio terfynol yn digwydd ar ôl cyd-arwyddo wedi’i gyfryngu gan y gweinydd. Gall cynhyrchydd cytundeb preifat yn y dyfodol ddefnyddio’r un lapiwr, sy’n ddall i feitiau’r math cynnwys mewnol.
13.8 qubs cyhoeddus (hepgor amlapio)
Mae'r amlapio allanol yn ddewisol ar yr haen drosglwyddo. Gall crëwr selio qub fel un cyhoeddus, ac yn yr achos hwnnw mae'r SealedQubCbor safonol yn mynd yn uniongyrchol i'r biblinell storio, heb unrhyw haen OuterWrapper a heb unrhyw allwedd K:
SealedQubCbor bytes ──(public)──▶ stored as-is
SealedQubCbor bytes ──(private)─▶ AES-256-GCM(K, …) ▶ OuterWrapper ▶ stored
Mae qub cyhoeddus wedi'i gloi-amser ond heb ei gatio gan ddolen: mae'n aros yn anddarllenadwy tan i'w rownd drand gyhoeddi (mae'r haen tlock yn ddigyfnewid), ond ar ôl datgloi gall unrhyw un sydd ag ID y trafodiad storio ei ddatgryptio — nid oes angen ffragment URL, oherwydd nad oes K. Hon yw'r cyfaddawd bwriadol ar gyfer arwynebau y mae'n rhaid i'r gweinydd eu gyrru: mae e-byst hysbysu-datgelu, dolenni oEmbed/mewnblannu awtomatig heb ffragment, a SEO cyfoethocach ar ôl datgelu i gyd angen dolen sy'n gweithio heb gyfrinach nad yw'r gweinydd byth yn ei dal (§13.6). Gall qub preifat barhau i ddefnyddio'r ffurf benodol <qub-embed src="full_delivery_url"> pan fo'r cyhoeddwr yn darparu ei allu cyflawn sy'n cynnwys y ffragment.
Canlyniadau y mae'n RHAID i gynhyrchydd eu hystyried:
- Dim imiwnedd rhifo. Mae qubs cyhoeddus yn fforffedu priodwedd imiwnedd-rhifo §13.1 trwy adeiladwaith. Mae'r gwasanaeth uwchlwytho cyfeirio yn stampio tag storfa parhaol
Visibility: publicarnynt (ac arnynt hwy yn unig) fel eu bod yn ddarganfyddadwy yn fwriadol; nid yw qubs preifat yn cario tag o'r fath ac maent yn cadw eu hanwahaniaethedd o ran byte. - Teitl plaen wedi'i ddinoethi ar amser selio. Mae maes
title§3.2 yn destun plaen y tu mewn iSealedQubCbor. O dan yr amlapio mae wedi'i guddio tan i wyliwr gyflenwiK; heb yr amlapio mae'n ddarllenadwy gan y byd ar storfa parhaol o eiliad yr uwchlwytho, cyn datgloi. RHAID i apiau crëwr cydymffurfiol ddatgelu hyn ar amser selio. - Mae canfod yn strwythurol ac yn cael ei groeswirio. Mae gwyliwr/mewnblaniad cydymffurfiol yn gwahaniaethu’r ddau siâp wedi’u storio drwy barsio: mae beitiau sy’n parsio fel
OuterWrapperyn cymryd y llwybr dadlapio gydaK; mae beitiau sy’n parsio felSealedQubCbornoeth yn cael eu derbyn yn uniongyrchol. RHAID i’r gwerth mewnol a adferir gytuno (0x00ar gyfer lapiedig/preifat,0x01ar gyfer noeth/cyhoeddus). Nid ywqub_idyn rhwymo gwelededd, ond mae beitiau canonaiddSealedQubyn ei gario, felly nid yw’r amgodiadau mewnol cyhoeddus a phreifat yn unfath o ran beitiau.
Mae preifat (wedi'i amlapio) yn aros yn rhagosodiad; mae cyhoeddus yn ddewis crëwr penodol fesul-qub.
14. Fectorau Prawf
14.1 Deilliad qub_id
Input:
version = 0x01
content_type = 0x01
created_at = 1735689600 (2025-01-01 00:00:00 UTC)
unlock_at = 1736294400 (2025-01-08 00:00:00 UTC)
outcome_at = absent
drand_round = 4695446 (= floor((1736294400 - 1595431050) / 30) + 1, §4.3 mapping, drand mainnet params §14.2)
body = "Hello, future." (UTF-8, 14 bytes)
title = absent
Intermediate:
body_hash = SHA3-256("Hello, future.")
= 76ab8b3f843c6ed4f2d0fd75b9f457b4
ad49dd4450f9c22723ae430e3af3211d
title_hash = [0u8; 32] (title absent — §4.2.1 sentinel)
Domain separator (10 bytes):
[0x51, 0x55, 0x42, 0x5F, 0x49, 0x44, 0x5F, 0x56, 0x32, 0x00]
Preimage (108 bytes—current protocol v1):
domain_separator || // 10 bytes
0x01 || // version
0x01 || // content_type
0x0000000067748580 || // created_at as i64 big-endian (1735689600)
0x00000000677DC000 || // unlock_at as i64 big-endian (1736294400)
0x0000000000000000 || // outcome_at_or_zero (outcome_at absent)
0x000000000047A596 || // drand_round as u64 big-endian (4695446)
body_hash || // 32 bytes
title_hash // 32 bytes (all-zeros sentinel; title absent)
Expected output:
qub_id = SHA3-256(preimage)
= 4a84e3dfaec32954949c30073f8e6506
fd3204c1bb97f9162b81c7587afe412e
RHAID i weithrediadau gynhyrchu gwerthoedd body_hash a qub_id union yr un fath ar gyfer y mewnbwn hwn. DYLAI’r fector prawf hwn fod y prawf uned cyntaf a ysgrifennir. Cyfrifwyd y gwerthoedd canonaidd uchod gan y gweithrediad cyfeirio a RHAID iddynt gyfateb beit-am-beit. Defnyddiodd cynlluniau prototeip cyn lansio hanesyddol (nid oedd unrhyw qubs byw yn dibynnu ar y ddau gyntaf) 92 beit cyn outcome_at (3d9fc2390eab043d38a1669ed3b71be76f9eefe872b9569ab1aaa027b88392b0) a 100 beit ar ôl ychwanegu outcome_at_or_zero (b0d032898ad629795150fdcb3f84e518f59ed05b7a2a82bc24ebdb87f52144ed). Yna ychwanegodd y cynllun 108-beit cyfredol drand_round a’r gwahanydd parth QUB_ID_V2. Defnyddiodd fector 108-beit cynnar y mapio ceil etifeddol (drand_round = 4695445) a chynhyrchu 3a9fcb31b750d985c262fada6d4f777fd6a28be831d941d85c131f5a4bbaf8a4—sy’n dal yn qub_id dilys ar gyfer y mewnbwn rownd hwnnw, tra bo’r enghraifft uchod yn dilyn mapio cyfredol §4.3.
14.2 Mapio Rownd-Datgloi
Input:
unlock_at = 1735689600
chain_genesis_time = 1595431050
chain_period_seconds = 30
Calculation:
(1735689600 - 1595431050) / 30 = 4675285.0
floor(4675285.0) + 1 = 4675286
drand_round = 4675286
Cyhoeddir rownd 4675286 ar 1595431050 + (4675286 - 1) * 30 = 1735689600—yn union ar unlock_at, byth cyn hynny. (Rhoddodd y mapio ceil cyn-rhyddhau etifeddol 4675285, a gyhoeddwyd ar 1735689570—30 eiliad yn gynnar; mae dilyswyr yn derbyn y rownd etifeddol honno fesul §4.3.)
14.3 Tro Cylch CBOR Safonol
RHAID i weithrediadau ddilysu bod serialize(parse(serialize(qub))) == serialize(qub) ar gyfer pob mewnbwn dilys. Mae hwn yn brawf priodwedd, nid yn fector sengl.
14.4 CBOR PactTerms (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)
Cyfrifir y bytes CBOR safonol a'r body_hash SHA3-256 gan y gweithrediad cyfeirio. RHAID i weithrediadau gynhyrchu CBOR byte-fath ar gyfer y mewnbwn hwn.
RHAID i weithrediadau hefyd ddilysu bod serialize(parse(serialize(pact))) == serialize(pact) ar gyfer pob mewnbwn PactTerms dilys (prawf priodwedd).
14.5 Fectorau Traws-Iaith Amlapio Allanol
Mae gan yr amlapio allanol (§13) ffigwr safonol ar wahân ar crates/qub-core/tests/vectors/wrapper_v1.json. Mae pob achos yn sefydlogi tupl (key, nonce, qub_id, sealed_cbor) fel mewnbynnau hecs di-ddehongli ac yn haeru allbwn expected_wrapper_hex penodol. Mae'r ddau weithrediad cyfeirio'n defnyddio'r un ffeil JSON:
- 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).
Mae'r ffigwr ar hyn o bryd yn pinio tri achos amlapio lefel isel. Maent yn profi amgodio OuterWrapper penderfyniaethol a rhyngweithredu AEAD yn annibynnol ar invariant siâp dosbarthiad §13.8; yn benodol, nid yw'r enw hanesyddol basic-text-public na'i visibility = 0x01 mewnol yn gwneud y beitiau amlapiedig canlyniadol yn ddosbarthiad cyhoeddus sy'n cydymffurfio. RHAID i gynhyrchydd barhau i storio beitiau mewnol cyhoeddus yn noeth ac amlapio beitiau mewnol preifat (0x00) yn unig.
| Achos | Cwmpas |
|---|---|
basic-text-public |
Enw ffigwr lefel isel hanesyddol. Y siâp SealedQub realistig lleiaf, heb feysydd dewisol; mae'n profi beitiau'r amlap yn unig ac nid yw'n ddosbarthiad storio §13.8 sy'n cydymffurfio. |
with-recipient-pubkey |
SealedQub gyda recipient_pubkey wedi'i osod (llwybr y dyfodol a gadwyd). Yn ymarfer set allweddi CBOR mewnol wahanol; mae cynnwys penodol ei ffigwr yn cynhyrchu qub_id gwahanol yn annibynnol (nid yw recipient_pubkey ei hun yn rhagddelwedd §4.1). |
longer-body |
Corff ~4 KiB — yn ymarfer ragddodiaid hyd CBOR aml-byte y tu mewn i'r amlen mewnol a'r cyphertext allanol. |
RHAID i weithrediadau gynhyrchu expected_wrapper_hex byte-fath ar gyfer y mewnbynnau a recordiwyd. Mae adfywio'r ffigwr yn gofyn QUB_REGEN_VECTORS=1 cargo test -p qub-core --test wrapper_vectors ac mae wedi'i gadw ar gyfer newidiadau fformat bwriadol.
15. Llywodraethu Proffil Crypto (Dyfodol)
Mae'r adran hon yn wybodaethol ar gyfer v1 ac yn dod yn normadol y tro cyntaf y mae ail algorithm yn dod i mewn i unrhyw un o primitifau cryptograffig qub.
15.1 Ystum Cyfredol
Mae protocol v1 yn rhwymo'n union un algorithm fesul primitif:
- Llofnod: ML-DSA-65 (
sig_alg = 0x01; allwedd gyhoeddus 1952-beit, llofnod 3309-beit) a heb ei lofnodi (sig_alg = 0x00). Mae’r cod yn cadw0x02ar gyfer Ed25519, ond nid yw protocol v1 yn ei actifadu; RHAID i ddilysydd v1 wrthod pobsig_algy tu allan i{0x00, 0x01}. - Cloi-amser: drand quicknet yn unig — mae hash y gadwyn, yr allwedd gyhoeddus, amser geni a chyfnod yn baramedrau rhwydwaith sefydlog a gariwyd gan y
DrandTimelockProvider::quicknet()cyfeirio (crates/qub-core/src/tlock.rs) aconfig/drand-endpoints.json. - Amlapio allanol: AES-256-GCM v1 yn unig (§13).
Mae dilyswyr ar hyn o bryd yn caled-godio hydoedd allwedd a llofnod fesul primitif gweithredol. Mae beitiau sig_alg a fersiwn y lapiwr yn ddetholwyr penodol, ond nid yw v1 yn negodi mewn band ac mae’n derbyn dim ond y gwerthoedd gweithredol uchod.
15.2 Siâp Bwriadedig
Pan fydd ail algorithm yn dod i mewn i'r protocol, caiff y dilyswr ei gyflunio ar gyfer CryptoProfile enwedig (e.e., ExqubV1) sy'n rhestru'r set union o werthoedd a ganiateir fesul primitif — sig_algs, cadwyni drand, fersiynau amlapio, mathau cynnwys. Mae'r proffil yn sefydlog ar amser dilysu, byth wedi'i negodi yn-band. Mae unrhyw werth y tu allan i'r proffil gweithredol yn cael ei wrthod.
Mae hyn yn gwarantu na all ychwanegu ML-DSA-87 nac actifadu Ed25519 wanhau cyfluniadau dilysu sy'n bodoli yn ôl-weithredol: mae dilyswr v1 yn aros yn ddilyswr v1 hyd yn oed ar ôl i broffil v2 gael ei gyhoeddi.
15.3 Amodau Sbarduno
Hyrwyddwch §15 i statws normadol pan gynigir unrhyw un o'r canlynol:
- Ail byte
sig_alg(actifadu Ed25519, ML-DSA-87, neu unrhyw gofnod newydd yn y gofrestrfa §9). - Ail gadwyn drand mewn defnydd cynhyrchu.
- Ail fersiwn amlapio allanol.
- Cylchdroi gwreiddyn ymddiriedaeth y log tryloywder—cyfeiriad
LogProfile.anchor_ownerneu allwedd gyhoeddus yr allwedd dderbynneb wedi’i phinio (§16.6). Mae’rLogProfileyn ymuno ag wyneb proffil §15.2 fel primitif llywodraethedig: mae cylchdroi’n godiadLogProfilewedi’i lofnodi sy’n cael ei ryddhau mewn diweddariad dilysydd (mae cylchdroadau cynlluniedig yn traws-lofnodi allanol → mewnol; ni all cylchdroadau a yrrir gan gyfaddawd wneud hynny, ac maent yn dibynnu ar y codiad hwn gyda’r gwiriad fforch angor blaenorol yn cyfyngu difrod dros dro). Mae gofodau fersiwn y log tryloywder (LOG_VERSION,ANCHOR_FORMAT) yn esblygu fel brodyr annibynnol, yn union fel y mae fersiwn lapiwr §12.5 yn annibynnol ar fersiwn y protocol.
Hyd hynny mae §15 yn ddalwr lle sy'n sefydlogi siâp yr ymfudo fel bod PRs y dyfodol yn glanio yn erbyn targed hysbys yn hytrach nag ail-ddadlau'r wyneb negodi o'r dechrau.
16. Log Tryloywder a Haenau Gwydnwch (Gweithredu — adolygiad wedi'i gwblhau)
Statws. Mae'r adran hon wedi'i weithredu (W5/UP-B1, Camau 1–8), gyda'r cwmpas cynhyrchydd a gwraidd ymddiriedaeth wedi'i nodi yma. Mae'r fformatau gwifren, hashing, a llwybrau gwirio yn fyw: y mathau craidd Merkle + canonical-CBOR (
qub-core), y drych TypeScript + bwndelwr ANS-104 (workers/api/src/crypto/), y storfa nod R2LogDOysgrifennwr sengl + allwedd cyfesuryn, yr ymgais log-atodi/upload, y crons angor dyddiol + bwndelwr-draen, y terfynauGET /api/v1/qub/:tx_id/proof(cynhwysiant) aGET /api/v1/log/consistency(RFC 9162), y prawf cynhwysiant wedi'i deipio a gariwyd yn y bwndel.qub(§17.5), y dilysydd angor ANS-104 brodorol (tools/qub-verify), a'r bachyn pennau hunan-gyhoeddedig deuol (§16.6). Mae/uploadllwyddiannus bob amser yn R2-wydn ond dim ond pan fyddLOG_DOwedi'i ffurfweddu a'r atodiad mewnol yn llwyddo; dim ond wedyn y mae ei ymateb yn cariolog_seq,receipt, aanchor_status. OsRECEIPT_SKyn absennol neu'n annilys, maesig_b64urly dderbynneb honno yn wag ac nid yw'n cyflenwi unrhyw beidio â gwrthod. Mae'r llwybrau cyhoeddi/seala chytundeb cyfredol yn amserlennu trafodion Arweave unigol ond nid ydynt yn atodi deilen log. Ar hyn o bryd nid oes unrhyw god yn perfformio cysoni diweddarach arfaethedig y sylw/uploadar ôl methiant atodi. Mae'r adolygiad allanol W5 wedi'i gwblhau: §16.15 yn cofnodi penderfyniadau dylunio a chyfyngiadau lansio, ond nid yw'r cyfyngiadau hynny'n ehangu'r cwmpas cynhyrchydd sydd newydd ei nodi. ** Mae tair eitem ymddiriedolaeth / defnyddio yn parhau i fod wedi'i gated**: (a) y waled angor pwrpasol (ANCHOR_JWK;LogProfile.anchor_owneryw'r deiliad lle[0xAB; 32]o hyd); (b) yr allwedd llofnodi derbynneb ** a pin allwedd gyhoeddus cyfatebol ** (RECEIPT_SKyn ddewisol ac mae'rLogProfile.receipt_pubkeyyn wag ar hyn o bryd); ac (c) y storfa GitHub hunan-gyhoeddedig + tocyn (§16.6). Hyd nes y darparir y pinnau angor / proffil, mae dilysydd annibynnol yn adrodd statws prawf yn onest yn hytrach na hawlio gwirio wedi'i angori'n llawn. Mae'r dyluniad yn gwbl ychwanegol ac nid oes unrhyw newid i'r fformat gwifrenSealedQub/QubEnvelope.
16.1 Haenau Rhesymeg a Gwydnwch
Mae'r llwybrau cyhoeddi cyfredol yn datgysylltu cydnabyddiaeth oddi wrth gadarnhad Arweave: maent yn deillio ac yn llofnodi trafodiad unigol, yn parhau â'r arteffact a'r union gyflwr cyflwyno yn R2, yna postio'n asyncronaidd. Mae'r log tryloywder yn ychwanegu haen archebu wedi'i angori'n annibynnol ar gyfer yr is-set o geisiadau /upload cyffredinol y mae eu LogDO atodiad yn llwyddo:
| Haen | Enw | Gwarant | Pryd |
|---|---|---|---|
| Haen T1 | R2-rachymychol cydamserol | Llawr gwydnwch — caiff baytiau wedi’u selio a statws cyhoeddi manwl eu hysgrifennu i storfa wydn cyn i lwyddiant gael ei ddychwelyd. | Wedi’i weithredu ar draws llwybrau cyhoeddi presennol. |
| Haen T2 | Cynnwys log tryloywder wedi’i grwpio | Ychwanegu yn unig, ymrwymiad sy’n dangos ymyrraeth + trefn gyfanswm pan fydd wedi’i gynnwys ac wedi’i selio. | Cynhyrchydd presennol: Ychwanegiadau llwyddiannus o LogDO app o /upload; mae’r ymateb yn cario'r batrwm derbyn. Nid yn univesal. |
| Haen T3 | Permanedd Arweave fesul qub | Trafodyn Arweave unigol ar gyfer y qub. | Ar hyn o bryd yn cael ei baratoi ar gyfer pob cyhoeddiad a dderbynnir ac yn cael ei bostio’n anghydamserol; mae’r trafodyn llofnodi manwl yn aros yn y blwch allanol i’w ddosbarthu. |
Mae’r haenau yn disgrifio tystiolaeth ar wahân a nodweddion gwydnwch, nid y cynllun masnachol presennol. Mae'r cod cyfredol yn dal i drefnu trafodyn Arweave unigol ar gyfer pob cyhoeddiad a dderbynnir; nid yw’n dangos T3 fel uwchwerth talu yn unig. Mae uchafswm allwedd API / cyfradd cyfrif yn aros yn reolau cais ar wahân.
Gwirionedd gwydnwch. Mae’r ysgrifennu T1 yn gydamserol, felly mae ymateb llwyddiannus yn sefydlu gwydnwch ar lefel y cais heb aros am giât Arweave. Nid yw’n sefydlu amserlennu annibynnol ei hun. Mae trafodyn unigol wedi’i gadarnhau yn darparu’r terfyn uchaf amser-bloc. Ar gyfer ymateb sy’n cario'r batrwm derbyn T2 llawn, gall yr ancra cadarnhaol nesaf ddarparu’r prawf log a ddisgrifiwyd isod. Os nad yw’r batrwm ar gael, nid oes unrhyw wyneb a all awgrymu bod y qub hwn eisoes yn y log tryloywder. Nid oes SLA rhifol ar lefel protocol ar gyfer ancra a hwyrni cyhoeddi.
16.2 Strwythur LogLeaf (dau siâp wedi’u hymrwymo)
Mae cofnod log yn LogLeaf, wedi'i amgodio fel CBOR canonig a ysgrifennwyd â llaw o dan y proffil §3.1 (hyd-diffiniol, dim tagiau, dim rhifau degol, cyfanrifau ffurf-gyrych, testun NFC, caeau dewisol wedi'u hepgor pan fo absent, allweddi wedi'u trefnu yn ôl hyd y bys a amgodwyd yn cynyddol ac yna'n bysadwy). Mae gard canonig §3.1 parse → re-encode → compare yn cael ei gymhwyso ar y llwybr amgodio cyn creu hash (nid yn unig ar ddatgodio), felly ni all dau weithredwr anghytuno ar yr bys dail drwy wahaniaeth lled-integer neu drefn allwedd. Mae pob integer yn u8 / u64 / i64; mae pob digest yn llinynnau bys 32-baid (bstr[32]). Mae id trafodiad Arweave wedi'i storio yn digest SHA-256 32-baid crai a gario fel bstr[32], byth yn llinyn testun base64url (yn cyd-fynd â §3.3).
Mae gan y daill dwy siap a ddewisir gan bys kind, gan fod y llwybr lwytho cyffredinol yn anhysbys i bys: POST /api/v1/upload yn ymdrin yn fwriadol â'r ddwy siap payload a dderbynnir fel drych ac yn derbyn qub_id a unlock_at fel dim ond datganiadau cleient dibynadwy. Ar y llwybr preifat diofyn, body_hash, drand_round, created_at, a drand_chain_version yn cael eu cuddio yn ychwanegol o fewn y pecyn allanol §13, na ddal unrhyw bys gan y Gweithiwr. Mae'r system math hefyd yn diffinio siap ardystiedig ar gyfer cynhyrchydd sy'n deillio body_hash / drand_round ei hun. Mae'r llwybr /seal presennol yn cadw'r gwerthoedd hynny ond nid yw'n galw LogDO, felly mae cynhyrchu ar hyn o bryd yn cynhyrchu ond dail sydd wedi'u datgan (0x02) o atodiadau llwytho cyffredinol llwyddiannus. Mae'r rhaniad yn cadw pob gwerth a ymrwymwyd yn deg heb efelychu bod y cynhyrchydd ardystiedig wedi'i blygu:
| Allweddol | Enc. len | Math | Presenoldeb | Ystyr |
|---|---|---|---|---|
seq |
4 | u64 |
ofynnol | mynegai dail seiliedig ar 0 Byd-eang; y sefyllfa y mae'r prawf cynhwysiant yn ymrwymo iddi. |
kind |
5 | u8 |
angen | 0x01 ardystiedig-alluog (diffinio, heb ei allyrru ar hyn o bryd) neu 0x02 honni (cleient-sêl / llwytho i fyny beit-ddall). |
ref |
4 | bstr[32] |
yn ofynnol | id cyfeirnod Leaf. Ardystiwyd → qub_id amrwd. Honnwyd → SHA3-256(qub_id ‖ log_blind_secret) id dall (§16.2.1). |
chash |
6 | bstr[32] |
angen | Cynnwys yn mynd i'r afael â SHA3-256(stored_bytes) - yr un clymu cynnwys y gall y Gweithiwr bob amser gyfrifo yn onest, ar y ddau lwybr. |
unlock_at |
10 | i64 |
ofynnol | Copïo (ardystiedig) neu honni (honni); dilysu > 0 cyn iddo fynd i mewn i'r ddeilen. |
received_at |
12 | i64 |
ofynnol | Cloc wal Gweithiwr yn R2-ack. Heb fod yn dystiolaeth (gweithredwr-honnir; §16.6). Yn bresennol ar gyfer hunan-ddisgrifiad, byth yn brawf. Dilysu > 0. |
body_hash |
10 | bstr[32] |
kind=0x01 dim ond |
wedi'i hepgor ar 0x02 — nid yw'r Gweithiwr yn ei hepgor o dan §13. |
drand_round |
12 | u64 |
kind=0x01 dim ond |
wedi'i hepgor ar 0x02. |
Nid yw deilen kind=0x02 yn ymrwymo body_hash nac drand_round yn fwriadol: mae'n tystio ymrwymiad a threfn testun seiffr anhryloyw yn chash cyfeiriad cynnwys, gan hawlio qub_id a unlock_at - nid ei destun plaen na'i grwn. Mae'r coesau testun plaen/crwn ar gyfer qub honedig yn dod o'r gwiriad .qub-bwndel §11 presennol, nid o'r log (§16.11). Nid yw drand_chain_version yn y ddeilen (mae y tu mewn i'r lapiwr ar y llwybr diofyn); mae gronynnogrwydd cadwyn yn byw ar yr angor (§16.7). Disgyblaeth encoder: gwrthod ref neu chash sero i gyd, a gwrthod unlock_at / received_at nad yw'n gadarnhaol, gan adlewyrchu'r gwarchodwr outcome_at > 0 yn cbor.rs.
16.2.1 Dallu preifat-qub
Rhaid i'r log beidio â dod yn oracl rhifo y mae'r lapiwr allanol §13 yn bodoli i'w atal (§13.1). Ar gyfer qub preifat (wedi'i lapio), mae'r asserted ddeilen yn ymrwymo'r SHA3-256(qub_id ‖ log_blind_secret) dynodwr dall, lle mae log_blind_secret yn gyfrinach a ddelir gan y gweinydd, ac yn hepgor body_hash. Ni all trydydd parti glymu deilen o'r fath i qub_id benodol; gall deiliad y qub, sydd â'r URL cyflwyno ac felly qub_id, ailgyfrifo'r dall i gadarnhau eu cynhwysiant eu hunain. Mae qub cyhoeddus (sydd eisoes yn cael ei gyfrif, eisoes yn cario'r tag Visibility: public Arweave fesul §13.8) yn ymrwymo'r qub_id amrwd. Dyma'r un lle mae dilysrwydd annibynnol yn ildio'n fwriadol i invariant preifatrwydd sy'n dwyn llwyth; y tei annibynnol ar gyfer qubs preifat yw chash (§16.9).
log_blind_secret ddalfa (wedi'i ddatrys - §16.15 C4). Mae'r dall yn amddiffyn dail unlinkability, nid cyfrinachedd testun plaen (mae'r deunydd lapio §13 yn dal hynny'n annibynnol). Ar gyfaddawd log_blind_secret, ar gyfer unrhyw qub_id y mae'r gwrthwynebydd eisoes yn dal neu'n gallu ailadeiladu (pob qub y mae ei fwndel/URL ganddo, ynghyd ag unrhyw entropi isel neu qub_id cyhoeddus) mae'n ailgyfrifo'r ref dail mewn un hash a'i gysylltu - mae hyn yn gysylltiad uniongyrchol poblogaeth hysbys, nid grym creulon dros ofod anhysbys. Dosbarthu log_blind_secret fel cyfrinach cydberthynas / gradd Sybil yn yr un haen ddalfa â chyfrinachau gweinydd eraill, a chylchdroi ymlaen yn unig (cylchdro ail-ddallu dail yn y dyfodol; ni all ddatgysylltu rhai sydd eisoes wedi'u hangori'n ôl-weithredol).
16.3 Hashing Dail a Nod
RFC 6962 §2.1 hashing wedi'i wahanu gan barth gyda SHA-256 wedi'i ddisodli gan SHA3-256:
leaf_hash = SHA3-256(0x00 || canonical_cbor(LogLeaf))
node_hash(l,r) = SHA3-256(0x01 || l || r)
empty tree = SHA3-256("") // defined but never anchored
Mae beitiau rhagddodiad parth 0x02 (cadwyn mynediad, §16.4) a 0x03 (hash STH, §16.6) wedi'u cadw ac yn datgysylltu o'r rhain. Maent yn beit sengl ac felly ni allant wrthdaro â'r gwahanwyr parth ASCII 10-beit presennol (QUB_ID_V2, ac ati). Y goeden yw'r goeden RFC 6962 chwith-llawn anghytbwys (pob rhaniad mewnol ar y pŵer mwyaf o ddau yn llym llai na'r cyfrif dail is-goeden), sy'n caniatáu i brofion cynhwysiant a chysondeb rannu un algorithm llwybr archwilio. Mae'r fanyleb gyfeirio yn cario ffuggod deilliant chwith / dde penodol ac yn pinio fector prawf **nad yw'n bŵer-o-dau (5-dail) ** felly mae'r achos hyrwyddo ymyl dde - y mae fector 4-deilen yn ei guddio - yn cael ei ymarfer.
16.4 Cadwyn Hash (mewnol)
Mae'r LogDO yn cynnal cadwyn mynediad fewnol ar gyfer cysondeb damwain yn unig. Nid yw byth wedi'i gyhoeddi a byth yn wynebu gwiriwr:
entry_chain[seq] = SHA3-256(0x02 || entry_chain[seq-1] || leaf_hash[seq])
entry_chain[-1] = SHA3-256("QUB_TLOG_GENESIS_V1")
Yr awdurdod atodiad yn unig a gyhoeddwyd yw'r **gwreiddyn Merkle cronnus + ei angor ** (§16.5–16.6), byth y drefn amrwd y mae'r gweithredwr yn digwydd gwasanaethu yn gadael: mae'r gadwyn yn ailgyfrifo ar gyfer unrhyw orchymyn a wasanaethir, felly dim ond y gwreiddiau angori yn gosod safle canonaidd.
16.5 Cronnus Merkle Tree a Swpio
Mae un goeden RFC 6962 sy'n tyfu'n barhaus dros yr holl ddail yn seq drefn - nid coed ynysig fesul swp. (Gwrthodwyd adeiladwaith carry-leaf-chained fesul swp: nid yw'n berthynas rhagddodiad go iawn, felly mae ei "brawf cysondeb" yn anghyson.) Mae'r goeden gronnus yn rhoi prawf cysondeb RFC 9162 dilys ac yn gadael i un angor diweddar brofi cynhwysiant ar gyfer unrhyw qub hŷn.
Y LogDO Gwrthrych Gwydn yw'r ysgrifennwr sengl (blockConcurrencyWhile, adlewyrchu QuotaDO / EntitlementDO) - atodi i log a rennir yw darllen-addasu-ysgrifennu ar gyflwr a rennir ac felly RHAID mynd trwy DO, byth KV. Mae'n caches ffin ymyl dde'r goeden (O(log n) hashes) felly mae cau swp yn O(batch). A swp yw'r set o ddail wedi'u hangori gyda'i gilydd; mae ei sbardunau gweithredu yn tree_size ymlaen llaw o LOG_BATCH_MAX_LEAVES o leiaf (diofyn 4096), oedran sy'n cyrraedd y cadence angor, neu rym gweinyddol / cron penodol. root_i yw'r Hash Coed Merkle cronnus dros ddail 0 .. tree_size_i.
16.6 Pen Coeden wedi'i lofnodi trwy Arweave Anchor
Mae'r trafodiad angor Arweave yw y Pen Coeden Llofnodedig ac yn disodli llofnod gweithredwr ar gyfer pen y goeden ei hun: nid oes angen allwedd qub ar yr angor dyddiol oherwydd owner tx Arweave yw'r llofnod. Mae'r traethawd ffos yn dal - mae'r swbstrad annewidiol, nid cyfrinach a ddelir gan qub, yn dwyn llwyth ar gyfer y gwreiddyn angori.
The log design calls for one warm-successful-append receipt key (§16.10), pinned in LogProfile and cross-signed by anchor_owner. The current implementation has not completed that trust-root provisioning: RECEIPT_SK is optional, an absent/invalid key yields sig_b64url: "", and the compiled LogProfile.receipt_pubkey is empty. Such a receipt can describe the appended leaf but is not a non-repudiable signed receipt. The stronger design claim applies only after a verifier release pins the matching public key and the anchor owner cross-signed it. A publication response without the complete receipt tuple makes no log-acceptance claim; one with an empty signature makes an append-position claim but no signature-verification claim.
Mae'r SignedTreeHead yn CBOR canonaidd (allweddi yn ôl hyd wedi'i amgodio): size:u64, root:bstr[32], batch:u64, prev:bstr[32] (cyn sth_hash; genesis = 32 beit sero), log_id:bstr[32], first_seq:u64, anchored_at:i64. Ei hash yw sth_hash = SHA3-256(0x03 || canonical_cbor(SignedTreeHead)).
Gwraidd ymddiried pinned. log_id = SHA3-256("QUB_TLOG_V1" || anchor_owner_address). Rhaid i wiriwr cydymffurfio ofyn am anchor_tx.owner == LogProfile.anchor_owner, lle mae anchor_owner (a'r allwedd gyhoeddus derbynneb) wedi'i integreiddio i qub_core fel LogProfile — ochr yn ochr â'r cysonion quicknet sydd eisoes yn DrandTimelockProvider::quicknet() — ac wedi'u dosbarthu gyda'r ffeil ddosbarthu gwirwr. Rhaid hefyd i'r gwirwr wirio'r data → id_tx Arweave yn lleol yn hytrach na dibynnu ar ymateb /raw/ o ddrws mynediad. Mae hyn yn cau'r twll cyfnewid walet dwbl: nid yw “wedi'i glymu ar Arweave” yn gwneud synnwyr tan fod y gwirwr yn pinio pa walet.
Mae cylchdroi yn §15 estyniad llywodraethu, nid ailddefnyddio (datrys — §16.15 C3). Arwyneb proffil §15.2 ar hyn o bryd yn rhestru dim ond sig_algs / cadwyni drand / fersiynau lapio / mathau o gynnwys, a rhestr triger §15.3 ddim un o'r rhain — nid yw LogProfile / anchor_owner wedi ymddangos ar arwyneb §15 eto. Felly, rhaid adeiladu llywodraethu'r cylchdroi: mae §15.3 wedi cael ei estyn (isod) i ychwanegu'r triger LogProfile, a chylchdroi yw cynnydd ar LogProfile wedi'i lofnodi a'i anfon mewn diweddariad gwirwr. Mae cylchdroi yn cynlluniedig yn cario llofnod groes allan → mewnol; ni all cylchdroi achosi gan weithredu camdriniaeth (nid yw'r allwedd allanol wedi'i hyddysgrifio/nid ar gael ar y pryd) ac yn ddychwelyd i'r cynnydd a lywodraethir gan §15, gyda'r gwirio fforc anchor blaenorol (isod) i gyfyngu ar y difrod yn y cyfnod interim.
Ffenestr cyfnewid (paramedr ymddiried lefel cyntaf). Mae dail yn wrthsefyll cyfnewid dim ond ar ôl i'r anchor sy'n ei gorchuddio gael ei gadarnhau gan Arweave. Mae'r ffenestr yn received_at → anchor confirmation (cadans + terfynoldeb Arweave, heb unrhyw warant o oedi protocol). Cyn darparu gwraidd ymddiried, mae'r gweithrediad presennol yn darparu cywirdeb gweithredol qub yn ogystal ag unrhyw metadata ychwanegol heb ei lofnodi sydd ar gael; nid yw'n darparu'r warant heb dwyll a gynlluniwyd. Mae tri chrefft cyfrifoldeb yn diffinio'r cynllun cwblhau (model tyst yw penderfyniad §16.15 C2):
- Derbynneb sêl (yn ddibynnol ar ddarpariaeth) - mae'r analog SCT a ddychwelwyd pan fydd atodiad log uwchlwytho yn llwyddo (§16.10). Dim ond pan nad yw'r
sig_b64urlyn wag y mae'n dod yn ddiwrthodadwy **a ** mae'r berthynas allwedd gyhoeddus / angor-perchennog cyfatebol wedi'i phinio yn y dilysydd. Ni all y pin proffil cynhyrchu gwag ar hyn o bryd gefnogi'r dyfarniad hwnnw. Nid yw'r rheolaeth hon yn berthnasol i dderbynneb wedi'i hepgor neu dderbynneb heb ei lofnodi. - Methodoleg monitor cyhoeddedig + cerdded cadwyn flaenorol - mae'r angor
prevgadwyn yn cael ei gerdded pen→genesis; mae fforc (dau angor ar unsizegydarootgwahanol, neuprevwedi torri) yn brawf cyhoeddadwy o gamymddygiad. Mae canfod equivocation yn ymrwymiad gweithredol datganedig, nid rhagdybiaeth dawel. - ** Penaethiaid hunan-gyhoeddedig deuol** - mae pob
{sth_hash, tree_size}pen newydd yn cael ei bostio i ystorfa GitHub pwrpasol sy'n eiddo i qub ** cyhoeddus, atodi yn unig ** (y goes hunan-gyhoeddi amlwg sy'n dwyn llwyth), gyda swydd gymdeithasol fel cadarnhad ymdrech orau yn unig. Tudalen postio methu (nid methu yn dawel). * Gweithredu (Cam 8) fel y bachynpublishHeadar y cron angor (workers/api/src/utils/heads-publish.ts): maePUTi'r API cynnwys hebshayn atodi yn unig (mae422yn golygu bod y pen eisoes wedi'i gyhoeddi, byth yn drosysgrifo); optio i mewn / defnyddio-gated arPUBLISH_HEAD_GITHUB_{TOKEN,OWNER,REPO}ac anadweithiol nes bod yr ystorfa yn cael ei ddarparu. Mae methiant GitHub caled yn tudalennau trwy'r sianelhealth_alertac yn taro metrig methiant gwydn (m:tlog_publish_head_fail); nid yw'r angor Arweave ei hun byth yn rholio yn ôl ar fethiant cyhoeddi. Mae "Peidiwch â methu'n dawel" yn cael ei warantu gan y metrig gwydn hwnnw - y mae'n rhaid rhybuddio dangosfwrdd arno - hyd yn oed os na ellir cyflwyno'r dudalen e-bost ymdrech orau. Mae dau gyfyngiad gonest yn dilyn o "angori-ar-ymlaen llaw" (mae'r cron yn cyhoeddi dim ond pan fydd y maint yn symud ymlaen): mae methiant GitHub dros dro yn gadael bwlch yn y dilyniant pennau cyhoeddedig ar gyfer y maint hwnnw - wedi'i ffinio, nid yn dawel (tudalennau it), ac oherwydd bod pob pen yn ymrwymo coeden uwch-set, mae prawf cysondeb §16.9 yn pontio'r bwlch; yn hanfodol, mae'r prawf cysondeb hwnnw'n cael ei gyfrifo o'r goeden awdurdodol wedi'i angori Arweave, nid o wyneb GitHub, felly nid yw bwlch GitHub byth yn gwanhau dilysrwydd. Mae ôl-lenwi dal i fyny sy'n llenwi bylchau pennau cyhoeddedig yn welliant gohiriedig.*
Gonestrwydd rhwymo (cyfyngiad rhwymol). Oherwydd bod qub yn rheoli'r ddau arwyneb postio wedi'i gynllunio, mae hyn yn hunan-gyhoeddedig, nid yw'n dyst annibynnol. Ni all unrhyw gynnyrch, marchnata, neu arwyneb cyfreithiol honni bod y log yn cael ei "dystiolaeth annibynnol". Ar ôl darparu'r derbynneb / proffil / gatiau pen, yr hawliad a ganiateir yw bod **equivocation yn ganfyddadwy ac mae atodiad wedi'i lofnodi'n llwyddiannus yn gadael derbynneb na ellir ei wrthod **. Cyn hynny, nid yw'r hawliad hwnnw ar gael. Mae gwir dyst trydydd parti annibynnol yn cael ei ohirio i bump llywodraethu §15 yn y dyfodol.
received_at yn cael ei honni gan weithredwr ac ni all unrhyw hawliad bwyso arno** - nid yw byth yn wynebu fel prawf neu fel cadarnhad anghydfod ar unrhyw arwyneb cynnyrch / cyfreithiol / API / prawf-rendro arwyneb. Y T amser bloc angor Arweave yw'r unig stamp amser di-ymddiriedaeth (ffin uchaf ar "fewngofnodi gan"). Unrhyw wiriad sanity monitor ar received_at RHAID cymharu yn erbyn T, nid yn erbyn y maes anchored_at STH a reolir gan y gweithredwr; mae gwiriad o'r fath yn warchodiad yn erbyn nam cloc gweithredwr gonest yn unig, **nid ** rheolaeth atebolrwydd yn erbyn gweithredwr maleisus (§16.15 C5).
16.7 Fformat Trafodiad Angor a Cadence
Y AnchorBundle yw'r corff trafodiad canonaidd-CBOR Arweave, a ysgrifennwyd trwy'r bwndelwr §16.8: ver:u8, sth:bstr (beitiau SignedTreeHead canonaidd), prev_anchor:bstr (beitiau amrwd tx id angor blaenorol; wedi'i hepgor yn genesis), chain_hash:tstr (y gadwyn drand mewn grym - quicknet), a llif dail CBOR y **swp yn seq drefn ** felly mae'r angor yn hunangynhwysol: mae monitor yn ail-ddeillio root o'r corff gyda dibyniaeth sero qub. (Os yw'r llif dail yn dod yn fawr ar gyfaint uchel, gall adolygiad yn y dyfodol ymrwymo ystod dail yn unig trwy gyfeirio; nodwyd, heb ei fabwysiadu yn v1.)
Mae tagiau Arweave yn fwriadol yn cael eu cyfrif - mae'r log wedi'i fwriadu i'w ddarganfod, yn wahanol i qubs preifat: App-Name: qub-tlog, Anchor-Format: 1, Log-Id: <hex>, Batch: <n>, Tree-Size: <n>, Root: <hex>, Prev-Anchor: <tx>, Content-Type: application/cbor. Mae tagiau yn awgrymiadau dibynadwy ynddynt; y corff CBOR yw'r unig awdurdod.
Cadence: bob dydd yn ddiofyn, wedi'i ailymweld â chyfaint (mae'r sbardun maint yn awtomatig yn byrhau'r cadence effeithiol o dan lwyth). Nid yw'r cynhyrchydd presennol yn gweithredu bachyn grym-angor sêl taledig. Mae'r waled angor yn ymroddedig ac yn isel-gyflymder, ar wahân i'r waled uwchlwytho - RHAID iddo fod ei **JWK ei hun ** (allwedd wahanol, nid rôl resymegol ar y waled uwchlwytho) felly ni all cyfaddawd waled llwytho i fyny ffugio angorau - gyda chyllideb angor-trafodion caled fesul dydd. Mae'r ystum cadw wedi'i nodi'n glir: allwedd boeth cul-cwmpas gyda thorri cylched tynn a chydbwysedd isel, nid "oer" - waled sy'n auto-arwyddo bob dydd ni all fod yn oer, ac nid yw'r spec yn esgus fel arall.
16.8 ANS-104 Bwndelwr
Encoder ANS-104 DataItem mewnol a llofnodwr hash dwfn, tua 300 llinell, **Web Crypto yn unig, dibyniaethau sero npm ** (mae'r ddau SDK Turbo yn methu'r giât cadwyn gyflenwi npm ci --ignore-scripts). Cynllun beit DataItem:
signatureType (2, LE) || raw_signature || owner || target(flag+0|32) || anchor(flag+0|32) || num_tags(8, LE) || tags_len(8, LE) || avro_tags || data
Llofnodi yw Arweave deepHash - crynodeb ailadroddus SHA-384 (gofyniad gwifren Arweave, crypto.subtle.digest("SHA-384")) dros ["dataitem", "1", sig_type, owner, target, anchor, encoded_tags, data] - yna RSA-PSS dros yr hash dwfn gyda'r waled JWK trwy crypto.subtle; id = base64url(SHA-256(signature)). Mae'r SHA-384 yma wedi'i **gwarantîn fel cyntefig gwifren Arweave yn unig, byth yn gyntefig ymddiriedolaeth qub ** (§15 yn cofnodi'r ffens; hashing ymddiriedolaeth qub yw SHA3-256 drwyddi draw).
Mae'r llwybr cod ANS-104 yn gwasanaethu'r peiriannau wrth gefn / draen gohiriedig ac yn ysgrifennu AnchorBundle DataItems. Mae'r llwybr cyhoeddi cyffredin yn gyntaf yn creu trafodiad Arweave wedi'i lofnodi yn union ac yn cadw ei JSON mewn blwch allan gwydn; mae postio uniongyrchol yn optimeiddio hwyrni, ac mae'r llwybr draen yn ail-geisio'r un trafodiad cyn cymhwyso ei bwndelwr wrth gefn. Cynllun llofnod (wedi'i ddatrys - §16.15 C8): arwyddion v1 gyda RSA-PSS (math o lofnod 1) ailddefnyddio'r mecanwaith JWK waled Arweave presennol (dim cadw allwedd hirhoedlog newydd, sy'n gwasanaethu'r traethawd "un llai cyfrinachol"); Mae Ed25519 yn cael ei ohirio i'r llwybr mudo PQ §15.
Y hash dwfn wedi'i rolio â llaw yw'r cod sylw risg uchaf, naturiol isaf yn W5, felly mae ei gatiau yn ** annegodi ** (§16.15 C8):
- Mae'r
tlog_v1.jsongêm gêm traws-iaith (Rust + TS, y patrwmwrapper_v1.json§14.5) yn cwmpasu hash dwfn, beitiau DataItem + id, hashes dail, gwraidd 5-ddeilen + llwybr archwilio, hash STH, prawf cynhwysiant, a phrawf cysondeb - yn **y cyfarwyddiadau arwydd a'r gwirio ** (mae'r cyfeiriad gwirio yn bwysig oherwydd bod gwiriad → tx_id tx lleol §16.6 yn tynnu'r hash dwfn i bob * dilyswr annibynnol *, nid dim ond yr ysgrifennwr). - Taith gron rhyngweithiol un-amser trwy fwndelwr ANS-104 cyfeirio, wedi'i ddefnyddio'n ** data prawf statig yn unig - byth yn ddibyniaeth ar amser rhedeg npm ** (mae'r ystum Web-Crypto-yn unig / dim gosod-sgriptiau yn sefyll).
- Rhaid i'r llwybr deep-hash + RSA-PSS rownd drwy'r defnyddiau cynhyrchu ** un
crypto.subtlecyntefig **, felly mae'r encoder mewnol yn gydnaws â beit. - Mae monitor derbyn ôl-fwndel parhaus ** yn cadarnhau bod pob DataItem angor / wrth gefn yn cyflawni derbyniad Arweave mewn gwirionedd, gyda larwm + torrwr cylched - oherwydd bod yr hash dwfn hefyd yn gwasanaethu'r ciw wrth gefn Arweave-unavailability, felly byddai atchweliad tawel yn llenwi'r ciw hwnnw gydag eitemau a wrthodwyd gan y rhwydwaith yn ystod yr union doriad y mae'n bodoli i'w gwmpasu.
16.9 Cynhwysiant a Phrawf Cysondeb
Mae'r ddau yn RFC 9162, SHA3-256, a wasanaethwyd fel CBOR canonaidd.
InclusionProof - GET /api/v1/qub/:tx_id/proof: ver:u8, leaf:bstr (yr union ddeilen CBOR - mae'r dilysydd yn ailgyfrifo leaf_hash ei hun ac nid yw byth yn ymddiried mewn hash a gyflenwi), index:u64, size:u64, audit:[bstr[32]], root:bstr[32], anchor:{ txid:bstr[32], batch:u64, sth:bstr[32], log_id:bstr[32], block_height?:u64, anchored_at?:i64 }.
ConsistencyProof - GET /api/v1/log/consistency?first=<size_a>&second=<size_b>: ver:u8, first_size:u64, second_size:u64, first_root:bstr[32], second_root:bstr[32], nodes:[bstr[32]], first_anchor, second_anchor. Un rhestr allweddi ddiamwys, wedi'i phinio gan fector prawf.
Gwirio annibynnol (dim gweinydd qub, yn ymestyn §11):
1. Parse .qub bundle → SealedQub; recompute qub_id (§4.1).
2. Read leaf.kind.
3a. kind=0x01 (attested):
assert leaf.ref == qub_id
assert leaf.body_hash == SHA3-256(body)
assert leaf.drand_round == unlock_round(unlock_at)
3b. kind=0x02 (asserted):
assert leaf.ref == SHA3-256(qub_id || blind) // holder supplies blind
OR treat ref as opaque and bind via leaf.chash == SHA3-256(stored_bytes)
4. Recompute leaf_hash = SHA3-256(0x00 || leaf); fold `audit` per RFC 6962
using index/size; require derived root == proof.root.
5. Fetch anchor.txid from any gateway; verify the tx data → tx_id binding
(do not trust a gateway /raw/ response); REQUIRE anchor_tx.owner ==
LogProfile.anchor_owner.
6. Parse AnchorBundle; require committed root == proof.root and size ==
proof.size; read the Arweave block time T.
7. Emit the claim scoped by leaf.kind (§16.11).
** Rhaid i storio sy'n gwasanaethu prawf fod wedi'i gyfelynu (wedi'i ddatrys - §16.15 C7, rhagamod blocio).** Mae cynhyrchu prawf dail oer yn niwtral o ran cywirdeb dim ond os yw y deunydd archwilio R2 yn storfa Merkle-nod parhaus wedi'i allweddu gan (level, index) cyfesuryn coeden absoliwt ** - nid deltas nod fesul batch. Gyda storfa allwedd gyfesurynnau, mae unrhyw lwybr archwilio (leaf i, size N) yn set o O(log N) uniongyrchol R2 GETs gyda dim ailgyfrifo ar draws ffiniau swp; gyda storfa allwedd swp nid yw, sef y bwlch cynllun storio y mae'r penderfyniad hwn yn cau. Mae'r cyrff dail hefyd yn cynnwys y gellir eu cyfeirio gan seq. RHAID i fector prawf W5 brofi dail oer genesis-era yn erbyn gwreiddyn llawer diweddarach gan ddefnyddio dim ond R2 + Arweave gyda'r storio LogDO wedi'i sychu, felly mae'r hawliad diogelwch adfer yn §16.13 yn cael ei gefnogi yn hytrach na'i haeru. Mae'r O(log N) R2 GETs dilyniannol yn perthyn yn unig ar y diweddbwynt prawf asyncronig - byth ar lwybr poeth y sêl (§16.10) neu cron fesul tic.
16.10 R2-Archebu Ack Cyntaf
Y dilyniant POST /api/v1/upload gweithredu yw:
- Gatiau hanner blaen (auth, dilysu, allwedd shard idempotency) - heb newid.
- Creu, tagio a llofnodi'r union drafodiad Arweave unigol. Mae hyn yn deillio
tx_idyn lleol, er y gall creu trafodion nôl metadata gwobr / angor o borth. Mae methiant paratoi yn dal i fethu'r cais cyn cydnabyddiaeth. - Synchronously ysgrifennwch yr arteffact a ddewiswyd yn
qub-cache/<tx_id>a pharhau y cofnodion creu sefydlog / blwch allan. Dyma'r gwydnwch a'r llawr ail-geisio; methiannau cyn dychwelyd setliad 503. - Pan fydd
LOG_DOwedi'i ffurfweddu, mae ymgais gydamserolLogDO.append(leaf). Mae'r ysgrifennwr sengl yn aseinioseq, yn ymestyn y gadwyn mynediad, ac yn diweddaru'r ffin. Mae'r RPC atodi yn gwneud hynny yn unig; mae cau swp yn rhedeg oddi ar y llwybr ar y larwm. Ar hyn o bryd mae methiant cludiant / cais yn methu-feddal: gall yr ymateb lwyddo o hyd heblog_seq,receipt, neuanchor_status. Er gwaethaf sylw gweithredu, nid oes unrhyw gysoni log diweddarach awtomatig wedi'i wirio heddiw. - Dychwelwch y gydnabyddiaeth. Cynhwyswch
{ log_seq, anchor_status: "pending", receipt }dim ond pan ddychwelodd yr atodiad llwyddiannus cyflawn.receipt.sig_b64urlyn wag pan nad yw'r llofnodwr derbynneb ar gael; RHAID i gleientiaid beidio â galw'r gwerth hwnnw wedi'i lofnodi neu nad yw'n wrthod. Mae absenoldeb y tuple yn golygu cyhoeddiad gwydn yn unig, nid derbyn log tryloywder. - Defnyddiwch un dasg ohiriedig i bostio'r union drafodiad wedi'i lofnodi. Mae llwyddiant yn dileu'r blwch allan; mae methiant yn ei adael ar gyfer y cron draen ffinedig ac ni ddylai newid y
tx_ida gydnabyddir eisoes. Mae metadata dros dro a sidecars ymdrech orau eraill hefyd yn cael eu gohirio.
Ffin hwyrni. Mae'r llwybr cais yn cynnwys gwaith awdurdod / cwota hanner blaen, paratoi / llofnodi trafodion, ysgrifeniadau R2 gwydn, a (pan fydd wedi'i ffurfweddu) yr ymgais LogDO. < 300 ms yn ymddangos yn yr adolygiad dylunio fel targed gweithredol, nid gwarant protocol; gall y cam paratoi trafodiad cyfredol berfformio cais metadata porth. Mae larymau latency a gatiau lansio yn reolaethau gweithredol, nid tystiolaeth sydd ar gael i ddilysuwr.
16.11 Model Ymddiriedolaeth — yr union hawliad, wedi'i gwmpasu yn ôl math o ddeilen
Ar gyfer kind=0x01 (ardystiedig): *"Roedd y cynnwys hwn - body_hash cyfatebol corff, a nodwyd gan qub_id - wedi'i ymrwymo i log atodiad yn unig qub yn safle seq ac roedd yn bodoli dim hwyrach nag amser bloc Arweave T; roedd yn annarllenadwy yn cryptograffig tan drand rownd R = unlock_round(unlock_at)." * Dyma'r triphlyg {tlock round binding + Merkle inclusion + anchored root} llawn.
For kind=0x02 (asserted, the default): *"An anhloyw ciphertext with content-address chash, claiming qub_id and unlock_at, was committed to the append-only log at position seq and existed not later than Arweave block time T." * The round and body legs are provided by the existing §11 .qub-bundle verify (qub_core::unlock), not by the log; what the log adds over a bare per-qub transaction is tamper-evident ordering, a trustless upper-bound commitment time, and equivocation resistance.
Mae'r ddau hawliad yn eithrio, yn ôl §11: awduraeth heb sig_alg ≥ 0x01, bwriad, ac amseru is-angor-gronynnog. Nid yw'r naill na'r llall yn gadael i unrhyw hawliad bwyso ar received_at.
Hawlio nenfwd (cyfyngiad lansio rhwymol - datrys §16.15 C1). Ar gyfer deilen honedig (kind=0x02), yr hawliad cwmpas uchod yw'r nenfwd ar yr hyn y gall unrhyw gynnyrch, marchnata, telerau, neu arwyneb rendro prawf ei honni. Ni chaiff unrhyw arwyneb ddatgan neu awgrymu bod y log yn profi'r cynnwys neu'r rownd datgloi o uwchlwytho beit-ddall - mae'r log yn profi * archebu + amser ymrwymiad uwch-ffin dibynadwy o destun seiffr anhryloyw *. Daw'r cynnwys a'r prawf crwn yn unig o'r dilysu §11 .qub-bwndel presennol, sy'n annibynnol ar log. Nid oes gan gyhoeddiad heb atodiad / derbyniad llwyddiannus unrhyw hawliad log o gwbl.
16.12 Fersiwn a Chydlynu W3
Nid oes unrhyw bwmp gwifren SealedQub ac felly dim bwmp fersiwn protocol (§12.2): mae'r log yn sidecar sy'n ymrwymo i feysydd a beitiau presennol, felly nid yw'n mynd i mewn i hanes fersiwn protocol §12.3. Mae drand_chain_version dewisol W3 heb ei gyffwrdd ac mae'n parhau i fod yr unig faes SealedQub dewisol. Yn lle hynny, mae'r log yn cyflwyno ei fannau fersiwn annibynnol ei hun - LOG_VERSION_1, ANCHOR_FORMAT_1, InclusionProof.ver - gan adlewyrchu annibyniaeth fersiwn lapio §12.5 (mae'r lapiwr yn cario beit fersiwn annibynnol ar y fersiwn protocol, ac mae'r fersiynau log yn dilyn yr un gwahaniad).
** Mae cyflwyno prawf yn cael ei nôl yn ddiofyn, gyda reidio dewisol. ** Ni all prawf fodoli ar amser sêl (nid yw'r angor wedi'i ysgrifennu eto), felly mae'r bwndel .qub amser sêl yn aros yn rhydd o brawf. Mae gwiriwr W7 yn cael GET …/proof unwaith, neu yn y modd cwbl all-lein yn ailadeiladu'r prawf o'r AnchorBundle cyhoeddus trwy ymholiad Arweave ar Log-Id. Mae'r bwndel .qub (W7) yn cadw aelod inclusion_proof dewisol ** - absennol ar sêl, wedi'i boblogi gan ail-allforio ôl-angor ar gyfer archif oer - yn dilyn yr un patrwm "dewisol, wedi'i hepgor yn ddiofyn, ychwanegol" â drand_chain_version W3.
16.13 Cadw
Mae ffenestri cadw ar gyfer cynffon agored LogDO, y swbstrad prawf R2, y cownteri torrwr cylched angor, a'r ciw wrth gefn bwndelwr wedi'u nodi yn docs/DATA-RETENTION.md. Egwyddor: mae storio poeth fesul mynediad y log (LogDO) yn ôl-angor y gellir ei adfer; mae ei ddeunydd archwilio - y storfa nod Merkle (level, index) cyfesurynnau + y cyrff dail seq (§16.9) + yr angorau Arweave - yn barhaol. Nid yw adennill deilen oer o'r DO byth yn annilysu prawf a gyhoeddwyd, oherwydd mae prawf yn datrys yn erbyn y storfa nod R2 parhaol honno a'r angor Arweave, nid y DO (ac mae'r fector prawf §16.9 wedi'i sychu-DO yn ei brofi).
16.14 Fectorau Prawf
Mae W5 yn llongau'r tlog_v1.json ffitiad traws-iaith (§16.8) ynghyd â fectorau wedi'u gweithio: kind=0x01 a → leaf_hash deilen kind=0x02; y gwreiddyn cronnus 5-dail; un prawf cynhwysiant; un prawf cysondeb; un AnchorBundle; ac un id DataItem. Mae'r rhain yn byw ochr yn ochr â'r fectorau lapio allanol §14.5 ac fe'u hymarferir gan y gweithrediadau Rust (qub-core) a TypeScript (Worker).
16.15 Adolygu Penderfyniadau (W5 — wedi'u penderfynu)
Mae'r adolygiad allanol W5 (pas dylunio gwrthwynebol + llofnodi perchennog) wedi'i gwblhau. Mae pob penderfyniad isod yn cael ei setlo a'i adlewyrchu yn y testun §16 uchod; mae'r cyfyngiadau lansio rhwymol yn cael eu hailddatgan ar y diwedd. Gall gweithredu fynd rhagddo oddi tanynt.
- Gonestrwydd dail ** llwybr diofyn (
kind=0x02) - DATRYS. ** Llongwch y rhaniad dwy ddeilen fel y nodwyd:kind=0x02yn ymrwymobody_hashnadrand_round. Dim maes*_body_hashar y llwybr beit-ddall (byddai'n signal "wedi'i wirio" ffug mwyaf darllenadwy ar gyfer integreiddwyr ac mae'n gyfleustra §11 eisoes yn ei ddarparu o'r bwndel). Peidiwch â bod angen sêl gweinydd ar gyfer qubs wedi'u tystio gan log (a fyddai'n gorfodi testun plaen trwy'r Gweithiwr ac yn dinistrio'r ffos crypto-rhwygo). Mae unrhyw gylched byr hunan-ddisgrifio yn perthyn i'r amlen bwndel / prawf.qubfel maes wedi'i ailgyfrifo, byth maes deilen. Uchafswm hawlio wedi'i gadarnhau gan berchennog: §16.11. - Atebolrwydd anghysondeb / hepgor - DYLUNIAD WEDI'I DDATRYS, DARPARIAETH ANGHYFLAWN. Mae'r dyluniad yn ei gwneud yn ofynnol i'r allwedd derbyn sêl gael ei phinio yn
LogProfilea'i chroeslofnodi gananchor_owner, ynghyd â methodoleg fonitro, taith gerdded gadwyn flaenorol, a phenaethiaid hunan-gyhoeddedig deuol. Mae'r bachau proffil a defnyddio wedi'u llunio yn dal i fod yn placeholders/optional fel y manylir yn §16.6, felly nid yw'r hawliad cryfach * canfyddadwy + derbyniwyd * yn gyfredol nes bod y gatiau hynny yn cau. Ni ddylid byth ei farchnata fel * tystiolaeth annibynnol *. Mae gwir dyst trydydd parti yn cael ei ohirio i bump llywodraethu §15. - **Gwraidd + cylchdro ymddiriedolaeth perchennog angor wedi'i binio - DATRYS. ** Mabwysiadu'r pin
LogProfile(§16.6); Mae'r dilysydd yn gwirioanchor_tx.owner == anchor_ownerac yn gwirio'r data TX → tx_id rhwymo yn lleol. Mae llywodraethu cylchdro yn §15 estyniad i adeiladu (ychwanegwyd sbardun §15.3), nid ailddefnyddio; cylchdroi wedi'u cynllunio yn croes-arwydd, cylchdroi wedi'u gyrru gan gyfaddawd yn disgyn yn ôl i'r bwmp §15 gyda'r difrod ffiniau gwirio fforc. - Dallu dail preifat-qub - DATRYS. Cadwch ddallu ar gyfer qubs preifat (
ref = SHA3-256(qub_id ‖ log_blind_secret)),qub_idamrwd ar gyfer qubs cyhoeddus (eisoes §16.2.1),chashfel y tei annibynnol.log_blind_secretyn gyfrinach cydberthynas / gradd Sybil, cylchdroi-ymlaen yn unig (§16.2.1). received_at— DATRYS. Cadwch ef yn y ddeilen, ymrwymedig ond yn benodol nad yw'n dystiolaeth; byth yn dod i'r amlwg fel prawf neu gadarnhad anghydfod ar unrhyw wyneb. Mae unrhyw wiriad sanity monitor yn cymharu âTamser bloc Arweave, nid yanchored_ata reolir gan y gweithredwr (§16.6).- Amseru profiadwy haenog - DATRYSIAD DYLUNIO, NID LLWYBRO CYFREDOL. Mae'r dyluniad adolygedig yn aseinio amseru bloc angor i'r haen swp a phrawf awr union i T3 taledig, heb unrhyw SLA rhifol ar gyfer y cyntaf. Nid yw'r llwybrau cyfredol wedi gwifrau'r gwahaniaeth masnachol hwnnw: maent yn amserlennu trafodiad unigol ar gyfer pob cyhoeddiad a dderbynnir, ac mae cwmpas log yn parhau i fod yn amodol fel y nodir yn §16.1 / §16.10. Rhaid i gopi cynnyrch ddisgrifio'r gweithrediad, nid y rhaniad haen hwn yn y dyfodol.
- Coeden gyniferol ar Weithwyr — DATBLYGWYD. Coeden RFC 9162 gyniferol sengl + LogDO ysgrifennydd-sengl wedi'i gadw'n ffin (man penodol cyfforddus yn erbyn y llawr ~1k ysgrifenni/sec DO; oedi rannu Merkle-of-shard-roots nes agos at hynny). Mae storfa nod R2
(level, index)gyd-drefnedig + vector prawf dail oer DO wedi'i dileu wedi'i gweithredu (§16.9). Mae< 300 msyn parhau i fod yn darged dylunio/operation, nid adduned protocol (§16.10). - Cynllun llofnod ANS-104 + hash-deep — DATBLYGWYD. RSA-PSS (math sig 1, yn ail-ddefnyddio JWK poced-anchor penodol); Ed25519 wedi'i oedi i lwybr PQ §15. Mae'r hash dwfn SHA-384 wedi'i wneud â llaw wedi'i gadw ar gwifrau croes-impl o'r ddwy ochr, gwirio rhyngweithio bundler cyfeiriadol yn unig, cylchrediad-
crypto.subtlewedi'i rannu, a monitro Arweave-derbyn ar ôl y bwnsl (§16.8).
Cyfyngiadau lansio rhwymol (cario i weithredu + adolygiad cynnyrch/cyfreithiol):
- Nenfwd hawlio (C1/C6). Ni all unrhyw arwyneb ddweud mae'r log yn profi cynnwys neu rownd datgloi deilen honedig; mae'r hawliad a ganiateir ar gyfer deilen
kind=0x02wedi'i angori'n llwyddiannus yn cael ei *archebu, yn amlwg, gydag amser ymrwymiad terfyn uchaf di-ddibynadwy *. Nid oes gan ymateb heb dderbynneb hawliad log. Nid oes unrhyw gopi stamp amser yn cario gwarant latency rhifol. - Gonestrwydd tyst (C2). Anghysondeb y farchnad fel canfyddadwy + derbynnydd, byth yn annibynnol.
- Derbyn + allweddi angor (C2 / C8). Cyn i'r hawliadau di-wrthod / angori-ddilysu llongio, darpariaeth a chlunio-pin yr allwedd gyhoeddus derbynneb, ei groeslofnodi gyda'r perchennog angor a ddarparwyd, a chadw'r waled angor fel ei JWK ei hun ar wahân i'r waled uwchlwytho.
- Giât dwfn-hash (C8). Dim angor na llongau tx T3 nes bod y gêm ddau-gyfeiriad + gwiriad rhyngweithiol yn pasio; y tudalennau monitor derbyn ar fethiant.
- Rhagamod storio (C7). Mae storfa nod allweddol cyfesurynnau + fector dail oer wedi'i sychu yn rhagofynion ar gyfer y warant "adfer byth yn annilysu prawf".
17. Bwndel dilysu cludadwy (.qub)
Statws. Mae’r adran hon wedi’i gweithredu (W7 / UP-C2): mae
qub_core::exportyn cynhyrchu ac yn parsio’r bwndel, ac maetools/qub-verifyyn CLI cyhoeddus, hunangynhwysol sy’n dilysu un all-lein. Mae §11 a §16.9 eisoes yn cyfeirio at “y bwndel.qub” fel yr uned y mae dilysydd annibynnol yn ei defnyddio; mae’r adran hon yn pennu ei feitiau a’r weithdrefn ddilysu. Mae’n gwbl adiol—mae’r bwndel yn pecynnu mewnbynnau presennol §11 ac nid yw’n newid unrhyw fformat gwifren ar-gadwyn.
17.1 Diben
Mae §11 yn sefydlu y gall unrhyw drydydd parti ddilysu arteffact cryptograffig qub heb gydweithrediad qub. Mae’r bwndel .qub yn gwneud y dilysu hwnnw’n gludadwy ac all-lein: mae’n pecynnu’r CBOR seliedig a llofnod y rownd drand sy’n ei ddatgloi mewn un arteffact hunangynhwysol, fel y gall derbynnydd ddilysu uniondeb cynnwys, rhwymo rownd, ac unrhyw lofnodion awduriaeth heb unrhyw alwad rhwydwaith (dim nôl o’r storfa, dim cais drand byw, dim API qub). Nid yw bwndel ar ei ben ei hun yn profi pryd y crëwyd ei seiferdestun; mae trafodiad storfa wedi’i ddilysu’n annibynnol neu brawf log angoredig yn darparu’r honiad amser-bodolaeth ar wahân hwnnw (§11, §17.5).
17.2 Fformat y bwndel
Mae QubBundle yn CBOR canonaidd wedi’i ysgrifennu â llaw o dan broffil §3.1 (hyd pendant, dim tagiau, dim rhifau arnofiol, cyfanrifau ffurf fyrraf, testun NFC, meysydd dewisol wedi’u hepgor pan fyddant yn absennol, allweddi wedi’u trefnu yn ôl hyd beit wedi’i amgodio yn esgynnol ac yna fesul beit). Mae’r tair allwedd 15 nod yn trefnu d < i < s. Ffeil .qub amrwd yw’r union feitiau hyn; ar gyfer cludiant URL neu gopïo-gludo, mae’r un beitiau’n base64url(heb badin).
| Allwedd | Hyd amg. | Math | Presenoldeb | Ystyr |
|---|---|---|---|---|
version |
8 | u8 |
gofynnol | Fersiwn fformat y bwndel (0x01). |
sealed_at |
10 | i64 |
dewisol | Amser selio a honnir gan y crëwr (eiliadau Unix); hunanddisgrifiadol, an-dystiolaethol. |
drand_round |
12 | u64 |
gofynnol | Y rownd y mae’r qub wedi’i gloi iddi. Tafluniad o’r qub seliedig mewnblanedig. |
arweave_tx_id |
14 | tstr |
gofynnol | ID y trafodiad y cafodd y beitiau seliedig eu storio oddi tano (pwyntydd tarddiad). |
drand_chain_id |
15 | tstr |
gofynnol | Y gadwyn drand (hecs). Tafluniad o’r qub seliedig mewnblanedig. |
drand_signature |
16 | bstr |
gofynnol | Llofnod golau drand ar gyfer drand_round—y gwerth sy’n datgloi’r seiferdestun. |
inclusion_proof |
16 | bstr |
dewisol | Prawf cynhwysiad Merkle log tryloywder §16, unwaith y bydd y log wedi’i ryddhau (§17.5). |
sealed_qub_cbor |
16 | bstr |
gofynnol | Beitiau mewnol SealedQubCbor (ar ôl dadlapio §13), h.y. mewnbwn dilysu §11. |
Mae drand_round a drand_chain_id yn dafluniadau cyfleustra o sealed_qub_cbor, wedi’u cario fel y gall offer eu darllen heb barsio’r CBOR mewnol. Cânt eu deillio wrth lunio a’u hailwirio wrth ddadgodio yn erbyn y qub seliedig wedi’i barsio; caiff bwndel y mae ei faes lefel uchaf yn anghytuno â’i lwyth ei wrthod. Mae disgyblaeth yr amgodydd yn adlewyrchu gweddill fformat y wifren: gwrthod drand_signature neu arweave_tx_id gwag, a chyfyngu pob maes hyd amrywiol.
17.3 Yr hyn y mae’r llofnod drand mewnblanedig yn ei brofi
Mae’r bwndel yn cario’r llofnod drand yn hytrach na mynnu bod y dilysydd yn ei nôl. Dim ond gyda llofnod golau dilys y rownd rwymedig y gall dadgryptio clo-amser (tlock dros y gadwyn drand, §8) lwyddo—gwerth nad yw’r gadwyn yn ei gyhoeddi nes i’r rownd honno fynd heibio, ac sy’n llofnod BLS dilys o dan allwedd gyhoeddus y gadwyn. Mae llofnod ffug neu anghywir yn methu dilysiad BLS neu ddadgryptio IBE/AEAD. Felly mae bwndel sy’n dadgryptio’n profi: mae’r seiferdestun wedi’i rwymo i rownd R, ac mae rownd R wedi mynd heibio. Mae’r dilysydd yn pinio’r gadwyn (DrandTimelockProvider::quicknet()) ac yn defnyddio gwiriad rhwymo rownd §11, felly ni all bwndel honni rownd nad yw ei seiferdestun wedi’i rwymo iddi.
Prawf o gyflwr rhyddhau yw hwn, nid stamp amser creu. Ar ôl i rownd R fynd heibio, gall unrhyw un greu seiferdestun newydd ar gyfer R a phecynnu ei lofnod sydd eisoes yn gyhoeddus. Felly RHAID PEIDIO â disgrifio’r bwndel ar ei ben ei hun fel prawf bod y seiferdestun neu’r cynnwys yn bodoli cyn R, cyn unlock_at, neu cyn unrhyw ddigwyddiad.
17.4 Gweithdrefn ddilysu all-lein
Mae qub-verify <file.qub> yn rhedeg gweithdrefn safonol §11 yn gyfan gwbl o’r bwndel, gan yrru qub_core::unlock::unlock gyda DrandTimelockProvider piniedig:
1. Parse the .qub bytes → QubBundle (canonical-CBOR guard; bound every field;
re-check drand_round / drand_chain_id against the embedded sealed qub).
2. BLS-verify bundle.drand_signature for the pinned chain and round, then
tlock_decrypt(sealed.tlock_ciphertext, bundle.drand_signature) → QubEnvelope.
3. Verify SHA3-256(body) == body_hash (§11 step 8).
4. Verify QubEnvelope.qub_id == SealedQub.qub_id (§11 step 9).
5. Verify QubEnvelope.unlock_at == SealedQub.unlock_at (§11 step 10).
6. Verify ciphertext round == unlock_round(unlock_at) and the chain binding.
7. If sig_alg != 0x00: verify author_signature (and any cosigner; §9.4).
8. Report integrity, round-elapsed/round-binding, authorship, and cosigner
verdicts separately, plus the recovered body. Do not report a commitment
timestamp unless step 9 succeeds.
9. Optional existence-time leg: verify an included §16 proof through its pinned
anchor, or independently verify the referenced storage transaction. Report
its block time as an upper bound on ciphertext existence.
Mae’r CLI yn gadael gyda 0 (dilyswyd), 1 (methodd y dilysu—dal wedi’i gloi, anghysondeb stwnsh corff, rhwymo rownd/cadwyn wedi’i dorri, neu lofnod sy’n methu dilysu), neu 2 (defnydd / bwndel camffurfiedig). Mae adroddiad --json yn cario’r un dyfarniadau ar gyfer awtomeiddio. Gan fod y bwndel yn hunangynhwysol, y crêt dilysydd (qub-core) a’r CLI (qub-verify) yw’r unig feddalwedd sydd ei hangen ar drydydd parti; mae’r ddau’n gyhoeddus ac yn ailddefnyddio llwybr dilysu presennol y protocol—dim cryptograffeg bwrpasol.
17.5 Perthynas â’r log tryloywder
Slot dewisol ar gyfer prawf cynhwysiad Merkle §16 yw inclusion_proof. Mae dilysu bwndel yn unig (§17.4) yn gyflawn ar gyfer uniondeb, rhwymo rownd / rownd wedi mynd heibio, ac awduriaeth opsiynol, ond yn fwriadol nid oes ganddo honiad bodolaeth wedi’i stampio’n annibynnol. Mae inclusion_proof wedi’i boblogi ac wedi’i ddilysu’n llawn hyd at yr angor yn ychwanegu’r ymrwymiad penodol i fath y ddeilen a’r amser terfyn uchaf o §16.11 heb newid fersiwn fformat y bwndel. Nid yw prawf absennol ond yn golygu “dim prawf wedi’i gynnwys”—nid “annilys” ac nid o reidrwydd “heb ei angori”.
Yn y gweithrediad cyfeirio mae’r slot bellach wedi’i deipio: mae qub_core::export::QubBundle::inclusion_proof_typed() yn dychwelyd Option<InclusionProof> sy’n cario strwythur llawn §16.9 (deilen, llwybr archwilio, gwreiddyn wedi’i angori, ac AnchorRef) drwy’r un maes CBOR anhryloyw—dim codiad fersiwn fformat bwndel. Mae’r CLI annibynnol qub-verify yn ei ddefnyddio drwy ei goes --anchor, a—nes i’r waled angor gael ei darparu (§16, Statws)—yn adrodd bod prawf wedi’i boblogi ond gyda pherchennog dalfan yn gynhwysiad-yn-unig yn hytrach na’i fod wedi’i ddilysu’n angoredig yn llawn.