AZ-003 — Transaction Validation and State Transition Rules v1
Status
Acest document definește regulile normative pentru:
- validarea tranzacțiilor;
- ordinea validărilor;
- tranzițiile de stare;
- conflict detection;
- compunerea efectelor între Value Layer, Logic Layer și Witness Layer.
Acest document presupune că:
- structurile de date din AZ-002 sunt deja definite;
- convențiile canonice de hashing și serializare sunt deja stabilite;
- consensul ENDC complet va fi specificat separat.
Termeni:
- MUST = obligatoriu
- MUST NOT = interzis
- SHOULD = recomandat puternic
- MAY = opțional
1. Obiectiv
AZ-003 răspunde la 5 întrebări fundamentale:
- Când este o tranzacție sintactic validă?
- Când este o tranzacție semantic validă?
- În ce ordine se aplică validările?
- Cum modifică o tranzacție starea globală?
- Cum se tratează conflictele între tranzacții concurente?
2. Modelul de stare
2.1 Componentele stării
Starea protocolului la un front candidat este definită prin următoarele componente:
GlobalState {
utxo_set: Map<Hash32, Cell>
machine_registry: Map<Hash32, MachineDescriptor>
machine_state_index: Map<Hash32, MachineStateRef>
witness_index: Map<Hash32, WitnessRecord>
intent_index: Map<Hash32, IntentStatus>
policy_index: Map<Hash32, PolicyObject>
proof_index: Map<Hash32, ProofBundleRef>
spent_cell_index: Set<Hash32>
halted_machine_index: Set<Hash32>
epoch_notarization_index: Map<uint64, EpochNotarization>
protocol_param_state: ProtocolParamState
}
2.2 Separarea componentelor
utxo_seteste sursa de adevăr pentru Cells active;machine_registryconține descriptorii mașinilor deployate;machine_state_indexconține referința la ultima stare validă a fiecărei mașini;witness_indexconține Witness Records active și istorice, conform politicilor de retenție;intent_indexconține statusul intenturilor: active, parțial executate, executate, anulate, expirate;policy_indexconține politicile cunoscute sau inline-published;spent_cell_indexpoate fi derivat dinutxo_set, dar MAY fi menținut explicit pentru eficiență;halted_machine_indexmarchează mașinile oprite normativ;epoch_notarization_indexconține finalizările de epocă;protocol_param_stateconține parametrii activi ai versiunii curente.
2.3 Stare activă vs istoric
Nodurile MUST separa:
- starea activă necesară validării curente;
- istoricul necesar auditului și reconstrucției.
Un obiect scos din starea activă MAY rămâne accesibil în indexul istoric.
3. Faze de validare
Orice tranzacție MUST trece prin aceste faze, în această ordine:
- Admission checks
- Canonical decoding checks
- Integrity checks
- Authorization checks
- Reference existence checks
- Temporal checks
- Conflict checks
- Semantic checks by tx_type
- Resource/risk bound checks
- State transition derivation
- Post-transition invariant checks
Dacă o fază eșuează, validarea se oprește și tranzacția este invalidă.
4. Admission checks
4.1 Mempool / candidate front admission
Înainte de validare completă, nodul SHOULD verifica minim:
- dimensiunea totală a tranzacției;
- versiunea de protocol suportată;
tx_typecunoscut;- fee minimă estimabilă;
- lipsa unor câmpuri top-level lipsă;
- lipsa unor blob-uri imposibil de decode-at.
4.2 Eșecuri
Exemple:
- tx prea mare;
- versiune incompatibilă;
- tip necunoscut;
- body lipsă;
- blob corupt.
Acestea generează invalidare imediată.
5. Canonical decoding checks
5.1 Decodare
Nodul MUST:
- decode
Transactionîn AZ-CBOR canonical; - verifica lipsa cheilor duplicate;
- verifica ordinea canonică a cheilor;
- verifica tipurile pentru toate câmpurile;
- verifica structura specifică
tx_type.
5.2 Eșecuri tipice
- encoding necanonic;
- integer overflow;
- string invalidă;
- enum necunoscut;
- listă peste limită;
- body_blob care nu corespunde schemelor versiunii.
6. Integrity checks
6.1 Hash consistency
Nodul MUST verifica:
body_hash == H("AZ:..." || canonical_body)- hash-urile structurilor inline;
- corespondența dintre identificatori derivați și conținut.
6.2 Root consistency
Dacă tranzacția conține sub-structuri cu hash derivat, nodul MUST verifica consistența dintre:
- obiectul inline;
- hash-ul său;
- referințele care îl indică.
6.3 Bundle integrity
Pentru orice auth_bundle_ref, proof_ref, witness_ref sau machine_call_ref, nodul MUST verifica că referința:
- există în starea accesibilă sau payload-ul asociat există inline prin mecanism permis;
- corespunde conținutului canonical;
- nu este structural coruptă.
7. Authorization checks
7.1 Regula generală
Nicio tranzacție MUST NOT producă efecte fără satisfacerea completă a politicilor relevante.
7.2 Politici posibile
În funcție de tipul tranzacției, pot fi necesare:
- control pe fee inputs;
- satisfacerea
spend_policypentru Cells consumate; - satisfacerea
operator_policy/upgrade_policy/halt_policypentru mașini; - satisfacerea
issuer_policypentru witness emission; - satisfacerea
creator_policy/cancel_policypentru intenturi.
7.3 Verificare
Pentru fiecare policy cerută, nodul MUST:
- rezolva
PolicyRef; - verifica faptul că politica există și nu este expirată;
- determina payload-ul exact ce trebuia semnat / aprobat;
- verifica semnăturile, witnessurile și proof-urile cerute;
- verifica threshold-ul și fallback-urile, dacă există.
7.4 Principiu
O autorizare parțială sau ambiguă este invalidă. Nu există „aproape suficient”.
8. Reference existence checks
8.1 Regula generală
Orice referință critică MUST exista în starea candidat curentă sau în indexurile istorice permise.
8.2 Exemple de referințe critice
referenced_cell_idmachine_idprior_state_refwitness_refproof_refpolicy_refintent_idepoch_indexreferit implicit de unele operațiuni
8.3 Reguli
- O Cell consumată MUST exista în
utxo_set. - O mașină apelată MUST exista în
machine_registry. prior_state_refMUST egala exact starea curentă activă a mașinii.- Un Witness cerut MUST exista și fi accesibil.
- O politică referită MUST exista.
- Un intent anulat MUST exista și fi anulabil.
9. Temporal checks
9.1 Obiecte temporale
Nodul MUST verifica ferestrele temporale pentru:
- policy expirată;
- witness expirat;
- proof expirat;
- intent expirat;
- timelock neajuns;
- rent prepaid expirat pentru mașini, dacă regula locală o cere pentru operare.
9.2 Timpul de validare
Temporal checks MUST folosi:
- timpul logic de protocol (epoch/slot) pentru reguli de consens și stare;
unix_msdoar în limitele definite de protocol, nu timpul local arbitrar.
9.3 Toleranță
Dacă protocolul definește o toleranță de ceas, nodurile MUST aplica aceeași toleranță.
10. Conflict checks
10.1 Tipuri de conflict
A. Cell spend conflict
Două tranzacții consumă aceeași Cell.
B. Machine state conflict
Două TX_MACHINE_CALL folosesc același prior_state_ref și produc două stări alternative incompatibile.
C. Intent exclusivity conflict
Două execuții încearcă să consume același intent în mod incompatibil cu starea sa.
D. Nonce conflict
Două operațiuni folosesc același nonce în domeniul unde nonce-ul trebuie să fie unic.
E. Halt/live conflict
O tranzacție încearcă să invoce o mașină oprită sau concurent cu o tranzacție de halt în același front incompatibil.
10.2 Regula generală
Într-un front candidat compatibil, conflictele MUST fi rezolvate prin excluderea uneia sau mai multor tranzacții. Tranzacții conflictuale MAY coexista în mempool, dar MUST NOT coexista în aceeași execuție de front compatibil.
10.3 Prioritate
AZ-003 nu fixează încă ordinea de alegere a câștigătorului în toate conflictele. Aceasta este rolul consensului și/sau al motorului de clearing. Dar orice nod MUST detecta conflictul în mod identic.
11. Semantic checks by tx_type — overview
Pentru fiecare tip de tranzacție:
- există validări comune;
- există validări specifice;
- există o funcție normativă de state transition.
Tipuri:
TX_VALUE_TRANSFERTX_MACHINE_DEPLOYTX_MACHINE_CALLTX_WITNESS_EMITTX_INTENT_SUBMITTX_INTENT_CANCELTX_GUARD_HALTTX_EPOCH_NOTARIZE
12. TX_VALUE_TRANSFER
12.1 Obiectiv
Consumă un set de Cells și creează un set nou de Cells, fără logică programabilă generală.
12.2 Validări specifice
Nodul MUST verifica:
- toate
CellInputreferă Cells active; - toate politicile de cheltuire sunt satisfăcute;
- fiecare input este consumat o singură dată în tranzacție;
- fiecare output Cell este sintactic validă;
- niciun output
cell_idnu colizionează cu uncell_iddeja activ; - conservarea valorii per activ;
- politicile speciale de asset sunt respectate;
- fee inputs și fee outputs sunt coerente.
12.3 Conservarea valorii
Pentru fiecare asset_id:
sum(inputs[asset_id]) >= sum(outputs[asset_id]) + fees[asset_id] + burns_declared[asset_id]
Dacă activul este mintable sub policy specială, regula se modifică doar dacă tranzacția conține dovada explicită de mint/burn autorizat.
12.4 State transition
Dacă validarea trece:
- toate input Cells sunt scoase din
utxo_set; spent_cell_indexeste actualizat;- toate output Cells sunt adăugate în
utxo_set.
12.5 Postconditions
- niciun input nu rămâne activ;
- toate output-urile sunt active;
- conservarea valorii rămâne adevărată.
13. TX_MACHINE_DEPLOY
13.1 Obiectiv
Înregistrează o Bounded Machine nouă.
13.2 Validări specifice
Nodul MUST verifica:
machine_idderivă corect din deploy body;- mașina nu există deja;
code_hash,abi_hash,initial_state_rootsunt structurale valide;state_bound_bytes > 0;effect_boundeste coerent și non-zero;loss_envelopeexistă și este permisă de policy-ul protocolului;permission_surfacenu conține combinații interzise de versiunea curentă;- politicile
upgrade_policy,halt_policy,operator_policyexistă și sunt valide; - storage rent / fee de deploy este suficientă;
- dacă deploy-ul consumă capital de inițializare, Cells asociate sunt valide și autorizate.
13.3 State transition
- descriptorul mașinii este adăugat în
machine_registry; machine_state_index[machine_id] = initial_state_ref;- eventuale Cells de capitalizare sunt mutate conform definiției deploy-ului;
- dacă deploy-ul emite witness normativ, acesta este adăugat.
13.4 Postconditions
- mașina există exact o singură dată;
- starea inițială este activă și consistentă cu descriptorul;
- rent state este înregistrată.
14. TX_MACHINE_CALL
14.1 Obiectiv
Invocă o tranziție de stare într-o mașină existentă.
14.2 Validări specifice
Nodul MUST verifica:
- mașina există;
- mașina nu este halted;
prior_state_refegalează starea activă curentă;- selectorul este permis;
- caller-ul este autorizat pentru selector;
- toate Cells atașate există și sunt consumabile;
- toate witnessurile atașate există și sunt valide;
- toate proof-urile sunt valide;
max_exec_unitseste în limitele protocolului;- mașina executată determinist produce exact rezultatul reclamat sau reconstructibil;
- noua stare respectă
state_bound_bytes; - efectele respectă
effect_bound; loss_envelopenu este încălcat;permission_surfacepermite toate efectele observate;- conservarea valorii este respectată pentru activele conservate.
14.3 Executarea deterministă
Nodul MUST putea reconstrui:
- input-ul efectiv;
- contextul de stare;
- efectele;
- noua rădăcină de stare.
Nodul MUST NOT accepta efecte declarate care nu pot fi reproduse deterministic.
14.4 Efecte permise
Un machine call MAY:
- consuma Cells;
- crea Cells;
- emite Witness Records;
- modifica starea internă a mașinii;
- bloca sau debloca valoare în limitele declarate;
- arde valoare doar dacă
can_burn_value = true.
14.5 State transition
Dacă validarea trece:
- starea veche a mașinii este înlocuită în
machine_state_index; - Cells consumate ies din
utxo_set; - Cells emise intră în
utxo_set; - Witness Records emise intră în
witness_index; - contoarele / rent / bookkeeping-ul mașinii se actualizează.
14.6 Postconditions
- starea mașinii este unică și neambiguă;
- toate efectele sunt complet reprezentate în stare;
- nu există side effects implicite.
15. TX_WITNESS_EMIT
15.1 Obiectiv
Publică un Witness Record autonom sau derivat dintr-un proces.
15.2 Validări specifice
Nodul MUST verifica:
witness_idderivă corect;issuer_policyeste satisfăcută;statement_typeeste permis pentru issuer, dacă există astfel de restricții;subject_refeste bine formată și, dacă regula o cere, obiectul referit există;proof_bundle_ref, dacă există, este validă;ttl, dacă există, este validă;- nu există o regulă de unicitate încălcată pentru același issuer/subject/type unde protocolul sau aplicația o cere.
15.3 State transition
- Witness Record este adăugat în
witness_index.
15.4 Postconditions
- witnessul devine utilizabil imediat sau de la epoca definită, conform protocolului;
- orice revocation rule rămâne doar potențială până la emiterea unei revocări valide.
16. TX_INTENT_SUBMIT
16.1 Obiectiv
Înregistrează un intent declarativ pentru clearing ulterior.
16.2 Validări specifice
Nodul MUST verifica:
intent_idderivă corect;creator_policyeste satisfăcută;time_windoweste validă și neexpirată;risk_limiteste sintactic valid;target_domainșiaction_typesunt suportate;required_witness_refs, dacă există, sunt prezente și valide;max_fee_by_asseteste coerentă;cancel_policyeste validă;- nonce-ul intentului nu intră în conflict în domeniul creatorului, dacă schema locală cere unicitate.
16.3 State transition
- se adaugă o intrare în
intent_index:
IntentStatus {
status = ACTIVE
filled_ratio = 0
remaining_constraints = original
}
16.4 Postconditions
- intentul poate fi consumat doar de clearing/executori compatibili;
- intentul nu mută singur valoare.
17. TX_INTENT_CANCEL
17.1 Obiectiv
Anulează un intent activ.
17.2 Validări specifice
Nodul MUST verifica:
- intentul există;
- statusul său permite anularea;
cancel_policyeste satisfăcută;- intentul nu este deja fully executed;
- intentul nu este deja anulat;
- dacă protocolul cere, anularea respectă regulile de timp și fee.
17.3 State transition
intent_index[intent_id].status = CANCELLED- se înregistrează timestamp/epoch de anulare.
17.4 Postconditions
- intentul nu mai poate fi executat după momentul efectiv al anulării.
18. TX_GUARD_HALT
18.1 Obiectiv
Oprește normativ o mașină sau un domeniu logic.
18.2 Validări specifice
Nodul MUST verifica:
- ținta există și este haltable;
halt_policyeste satisfăcută;- condițiile de halt definite de protocol sau aplicație sunt îndeplinite;
- tranzacția nu încearcă să haltez un obiect deja halted în mod redundant incompatibil;
- dacă halt-ul e de urgență, contextul și dovada cerută există.
18.3 State transition
- ținta este adăugată în
halted_machine_indexsau alt index de halt relevant; - dacă există efecte asociate de freeze, acestea se aplică conform descriptorului mașinii și politicilor sale.
18.4 Postconditions
- apelurile noi către mașina halted sunt invalide până la reluare, dacă reluarea este permisă de alt document.
19. TX_EPOCH_NOTARIZE
19.1 Obiectiv
Sigilează un front compatibil și finalizează o epocă.
19.2 Validări specifice
Nodul MUST verifica:
epoch_indexnu este deja finalizat incompatibil;selected_front_block_idsdescriu un front compatibil;- execuția deterministică a frontului produce exact:
finalized_state_rootfinalized_tx_rootfinalized_witness_root
- semnăturile notarilor ating pragul cerut;
- comitetul de notari este corect pentru acea epocă;
- conflict set-ul, dacă există, este consistent;
- nu există notarizare dublă validă pentru aceeași epocă.
19.3 State transition
- intrarea
epoch_notarization_index[epoch_index]este setată; - frontul devine hard-final;
- stările anterioare nefinalizate conflictuale sunt marcate ca respinse.
19.4 Postconditions
- nodurile MUST trata epoca ca finală;
- orice tranzacție dependentă de finalitate poate continua.
20. Fee validation
20.1 Regula generală
Orice tranzacție MUST plăti fee suficientă conform:
- dimensiunii;
- exec units;
- rent impact;
- witness/proof overhead;
- priorității sau clasei de intent, dacă este cazul.
20.2 Fee assets
Protocolul MAY permite fee în mai multe active, dar v1 SHOULD favoriza activul nativ pentru simplitate.
20.3 Insuficiență
Dacă fee este sub minimul calculat, tranzacția este invalidă sau inadmisibilă, conform contextului.
21. State transition function
21.1 Definiție abstractă
ApplyTx(GlobalState S, Transaction T) -> (GlobalState S', TxReceipt R) | ProtocolError
21.2 Proprietăți
ApplyTx MUST fi:
- deterministă;
- pură conceptual (fără side effects externe);
- dependentă doar de
S,Tși parametrii activi de protocol.
21.3 TxReceipt
TxReceipt {
tx_id: Hash32
status: enum { APPLIED, REJECTED }
consumed_cell_ids: [Hash32]
created_cell_ids: [Hash32]
touched_machine_ids: [Hash32]
emitted_witness_ids: [Hash32]
touched_intent_ids: [Hash32]
fee_paid_by_asset: [(asset_id: Hash32, amount: uint128)]
exec_units_used: uint64
state_delta_hash: Hash32
error_code: uint32?
}
Dacă tranzacția este aplicată, error_code MUST lipsi.
Dacă este respinsă, receipt-ul complet MAY exista doar în contexte de audit/debug, nu în starea finală.
22. Ordinea într-un front de execuție
22.1 Principiu
Execuția unui front candidat MUST produce același rezultat pe toate nodurile.
22.2 Ordinea normativă minimă
În lipsa unui motor special de clearing, ordinea de execuție într-un pachet determinist SHOULD fi:
- topological order by dependencies;
- apoi lexicographic by
tx_idpentru conflicte altfel egale; - excluderea celor care devin invalide din cauza efectelor tranzacțiilor anterioare.
22.3 Intent clearing
Pentru TX_INTENT_SUBMIT, înscrierea intenturilor în stare este directă.
Executarea lor efectivă într-un batch special va fi definită în documentul de clearing, dar MUST urma aceleași principii de determinism.
23. Dependency rules
23.1 Dependințe explicite
O tranzacție depinde explicit de altă tranzacție dacă:
- consumă un Cell creat de ea;
- folosește un witness emis de ea;
- folosește o mașină deployată de ea;
- folosește un intent creat de ea.
23.2 Dependințe implicite
Există dependență implicită dacă:
- două tranzacții folosesc aceeași stare anterioară a unei mașini;
- două tranzacții consumă același Cell;
- o tranzacție halteză o mașină pe care alta o apelează.
23.3 Regula
Ordinea finală MUST respecta dependențele explicite și MUST rezolva dependențele implicite prin excludere sau regulă deterministă.
24. Rollback conceptual în front candidat
24.1 Mempool/front execution
Într-un front candidat nefinalizat, nodul MAY:
- aplica tranzacții speculative;
- recalcula;
- reconstrui ordinea.
24.2 După notarizare
După TX_EPOCH_NOTARIZE validă:
- rollback-ul frontului finalizat MUST NOT fi permis în execuția normală;
- orice stare alternativă devine respinsă sau istoric conflictual.
25. Resource and risk bound checks
25.1 Resource bounds
Orice tranzacție MUST respecta:
- limite de dimensiune;
- limite de număr de inputs/outputs;
- limite de witness/proof count;
- exec units;
- state write bytes;
- per-epoch caps dacă există.
25.2 Risk bounds
Pentru tranzacții ce ating Logic Layer sau intents, nodul MUST verifica:
- envelope de pierdere;
- max locked duration;
- dependency count;
- asset scope;
- contrapartide permise;
- obligații de jurnalizare/witness.
25.3 Principiu
Dacă un efect e logic permis, dar depășește un bound declarat, tranzacția este invalidă.
26. Witness validity during transition
26.1 Witness active
Un witness este activ dacă:
- există;
- nu e expirat;
- nu e revocat;
- statement-ul și subject-ul se potrivesc cerinței policy;
- dovada sa este validă.
26.2 Witness consumed vs referenced
ATLAS ZERO v1 tratează witnessurile în mod normal ca obiecte referențiale, nu consumabile.
Dar anumite statement_type MAY fi definite ulterior ca single-use.
26.3 Revocare
Dacă un witness a fost revocat valid înainte de punctul temporal relevant, el MUST NOT satisfice o condiție.
27. Machine call transition semantics
27.1 Single-state lineage
Fiecare mașină are o singură linie activă de stare.
Două stări succesoare incompatibile din același prior_state_ref nu pot coexista active.
27.2 Derived effects
Toate efectele mașinii MUST fi derivabile din:
- descriptor;
- starea veche;
- call input;
- witness/proofs;
- parametrii protocolului.
27.3 No hidden external reads
Execuția MUST NOT depinde de:
- mempool local;
- HTTP calls;
- random extern;
- ceas liber;
- stări nehash-uite și nereferențiate.
27.4 Oracle/witness reads
Citirea de date externe este permisă numai prin:
- witnessuri;
- proof bundles;
- alte obiecte protocolare validate.
28. Intent status machine
28.1 Stări
IntentLifecycleStatus =
ACTIVE
PARTIALLY_FILLED
FULLY_FILLED
CANCELLED
EXPIRED
REJECTED_BY_CLEARING
28.2 Tranziții permise
ACTIVE -> PARTIALLY_FILLEDACTIVE -> FULLY_FILLEDACTIVE -> CANCELLEDACTIVE -> EXPIREDPARTIALLY_FILLED -> FULLY_FILLEDPARTIALLY_FILLED -> CANCELLEDPARTIALLY_FILLED -> EXPIRED
FULLY_FILLED, CANCELLED, EXPIRED sunt terminale.
28.3 Regula
Nicio execuție nouă MUST NOT atinge un intent în stare terminală.
29. Error precedence
29.1 Motiv
Aceeași tranzacție poate încălca mai multe reguli. Pentru consistență, nodurile SHOULD produce aceeași clasă primară de eroare.
29.2 Ordinea recomandată
- syntax / decoding errors
- hash mismatch
- unknown reference / object missing
- expired object
- invalid authorization
- direct conflict
- semantic invalidity
- bound exceeded
- post-invariant failure
Această ordine reduce ambiguitatea între noduri.
30. Deterministic receipts
30.1 Principiu
Dacă două noduri aplică aceeași tranzacție validă la aceeași stare, ele MUST produce același TxReceipt, cu excepția câmpurilor explicit non-consensus, dacă vor exista.
30.2 Câmpuri deterministe
- consumed cells
- created cells
- touched machines
- emitted witnesses
- fees
- exec units
- state delta hash
31. Canonical state delta
31.1 Definiție
Orice tranzacție aplicată MAY fi rezumată printr-un delta canonic:
StateDelta {
removed_cells: [Hash32]
added_cells: [Hash32]
updated_machine_states: [(machine_id: Hash32, old_state: Hash32, new_state: Hash32)]
added_witnesses: [Hash32]
updated_intents: [(intent_id: Hash32, old_status: uint8, new_status: uint8)]
added_policies: [Hash32]
halted_objects: [Hash32]
}
31.2 Utilizare
Acest delta:
- ajută auditul;
- ajută calculul de
state_delta_hash; - ajută debugging și light verification.
32. Revalidation after dependency changes
32.1 Regula
Dacă o tranzacție A face invalidă semantic o tranzacție B în același front, B MUST fi revalidată sau exclusă.
32.2 Exemple
- A consumă Cell pe care B o consuma;
- A mută starea mașinii, iar B folosea
prior_state_refvechi; - A anulează intentul pe care B voia să-l execute;
- A halteză mașina apelată de B.
33. Multi-asset rules
33.1 Conservare per activ
Conservarea MUST fi evaluată per asset_id, nu global agregat.
33.2 Asset-specific logic
Anumite active MAY avea:
- transfer restrictions;
- mint/burn policy;
- freeze flags;
- regulatory tags.
Acestea trebuie verificate în plus față de regulile generale.
34. Storage rent and liveness
34.1 Mașini
O mașină cu rent expirată MAY:
- rămâne existentă istoric;
- deveni neapelabilă;
- necesita top-up;
- intra în halt economic.
Comportamentul exact final va fi fixat într-un document economic, dar nodurile MUST verifica regula activă de protocol.
34.2 Witness și alte obiecte
Witnessurile nu au rent persistent implicit, dar pot avea TTL și reguli de retenție.
35. Validation pseudocode
35.1 Generic pipeline
ValidateAndApply(S, T):
check_admission(T)
decode_canonical(T)
check_integrity(T)
check_references_exist(S, T)
check_temporal_validity(S, T)
check_authorization(S, T)
check_conflicts(S, T)
check_semantics_by_type(S, T)
check_resource_and_risk_bounds(S, T)
(delta, receipt) = derive_state_transition(S, T)
S' = apply_delta(S, delta)
check_post_invariants(S, S', T, delta, receipt)
return (S', receipt)
35.2 Observație
Ordinea exactă a check_authorization și check_references_exist MAY fi implementată intern diferit pentru optimizare, dar semantica observabilă MUST rămâne aceeași.
36. Post-transition invariant checks
După aplicare, nodul MUST verifica:
- toate Cells eliminate au dispărut din
utxo_set; - toate Cells adăugate există în
utxo_set; - toate stările de mașini actualizate sunt consistente;
- conservarea valorii rămâne adevărată;
- niciun bound nu a fost depășit;
- orice witness emis este indexat corect;
- orice intent atins are status valid;
- hash-urile de receipt și delta, dacă sunt produse, sunt consistente.
Dacă oricare dintre aceste verificări eșuează, tranzacția este invalidă, chiar dacă toate fazele anterioare au trecut.
37. Minimal rejection rules
O tranzacție MUST fi respinsă imediat dacă:
- are encoding necanonic;
- referă obiecte inexistente;
- consumă o Cell deja consumată;
- folosește o stare veche de mașină;
- violează o policy;
- violează
effect_bound; - violează
loss_envelope; - încalcă conservarea valorii;
- este expirată;
- cere efecte nepermise de
permission_surface.
38. Reorg semantics before finality
38.1 Pre-finality
Înainte de notarizare:
- nodurile MAY reconstrui frontul candidat;
- receipts speculative MAY fi invalidate;
- tranzacțiile respinse într-un front MAY redeveni eligibile într-altul.
38.2 Post-finality
După notarizare:
- receipts finalizate devin definitive;
- statusurile speculative incompatibile sunt aruncate.
39. Security consequence of validation order
Ordinea validărilor nu este doar optimizare. Este parte din securitatea protocolului.
Exemple:
- dacă verifici efecte înainte de existența referințelor, poți crea canale de ambiguitate;
- dacă verifici conservarea înainte de autorizare, poți produce inconsistență de erori;
- dacă nu verifici întâi canonical form, două noduri pot semna payload-uri semnatic egale dar binar diferite.
Prin urmare, ordinea din AZ-003 SHOULD fi tratată ca normativă de interoperabilitate.
40. Ce urmează
După AZ-003, documentul corect este:
AZ-004 — ENDC Consensus and Finality Specification
Acolo trebuie fixate:
- structura epocii;
- rolurile proposer/verifier/notary;
- alegerea comitetelor;
- regula exactă de selecție a frontului;
- pragul de finalitate;
- slashing;
- comportamentul la conflicte și latență.
41. Formula documentului
AZ-002 a fixat obiectele. AZ-003 fixează verbul protocolului:
ce se verifică, în ce ordine, și cum starea trece din S în S' fără interpretări locale.
Închidere
Un protocol devine real nu când are idei bune, ci când două noduri independente ajung inevitabil la aceeași concluzie despre aceeași tranzacție.
AZ-003 definește exact această inevitabilitate.