| Internet-Draft | SCITT-VCP | October 2026 |
| Kamimura | Expires 27 April 2027 | [Page] |
This document defines a profile of the SCITT (Supply Chain Integrity, Transparency, and Trust) architecture for creating tamper-evident audit trails of AI-driven algorithmic trading decisions and executions. The VeritasChain Protocol (VCP) applies the SCITT framework to address the specific requirements of financial markets, including high-precision timestamps, considerations arising from recordkeeping regimes such as the EU AI Act and MiFID II, and a crypto-shredding mechanism intended to support erasure obligations such as those under the GDPR. This profile specifies how VCP events are encoded as SCITT Signed Statements, registered with Transparency Services, and verified using COSE Receipts. It further defines SCITT conformance profiles for interoperability and an ERASURE event type that records crypto-shredding operations as append-only audit events. The profile makes trading records auditable and attributable after the fact; it does not prevent or block any trading activity, and it does not warrant the correctness of any recorded decision.¶
This note is to be removed before publishing as an RFC.¶
The latest version of this document, along with implementation resources and test vectors, can be found at https://github.com/veritaschain/vcp-spec.¶
Discussion of this document takes place on the SCITT Working Group mailing list (scitt@ietf.org).¶
Changes from -04 are listed in Appendix C, and changes from -03 in Appendix D. The principal changes in -04 align this profile with the VCP v1.2 release (tag v1.2.0): external anchoring is REQUIRED at every tier, and ERASURE uses the released ErasureDetails encoding.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 27 April 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The SCITT (Supply Chain Integrity, Transparency, and Trust) architecture [RFC9943] provides a framework for creating tamper-evident logs of digital artifacts through Transparency Services. While SCITT was initially designed for software supply chain use cases, its core primitives--Signed Statements, Receipts, and Transparency Services--are applicable to any domain requiring verifiable audit trails.¶
This document specifies a SCITT profile for AI-driven algorithmic trading systems in financial markets. The VeritasChain Protocol (VCP) applies the SCITT architecture with domain-specific extensions:¶
VCP serves as an "AI Flight Recorder" for algorithmic trading, supporting post-incident reconstruction of recorded system behavior with cryptographic evidence that the records were not altered after commitment. It cannot reconstruct events that were never recorded.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This document is a profile of the SCITT architecture. It:¶
This profile does not define a new SCITT protocol or new Transparency Service interactions; it specifies how existing SCITT primitives are applied to VCP events in the financial trading domain. The VCP event format and integrity layer are defined in [VCP-SPEC].¶
This document specifies:¶
This document does not specify:¶
This document uses terminology from [RFC9943]. The following terms are specific to this profile:¶
The following table maps VCP concepts to SCITT terminology:¶
| VCP Concept | SCITT Equivalent | Notes |
|---|---|---|
| VCP Event | Signed Statement | VCP Event is the payload of a Signed Statement |
| VCP Issuer | Issuer | Trading system or AI model |
| VCP Transparency Service | Transparency Service | With VCP Registration Policy |
| VCP Receipt | Receipt | COSE Receipt with Merkle inclusion proof |
| Hash Chain (Optional) | Append-only Log | VCP optionally adds per-Actor chaining |
| External Anchor | Merkle Tree Root | Periodic commitment supporting completeness verification |
VCP builds upon the SCITT architecture with domain-specific extensions for financial trading:¶
+------------------+ +-------------------------+
| VCP Issuer | | VCP Transparency |
| (Trading System) | | Service |
+--------+---------+ +------------+------------+
| |
| 1. Create VCP Event |
| 2. Sign as COSE_Sign1 |
| |
+------ Signed Statement ----->|
| (via SCRAPI) |
| | 3. Validate against
| | Registration Policy
| |
| | 4. Append to Log
| |
|<-------- VCP Receipt --------+
| (COSE Receipt) |
| |
+--------+---------+ +------------+------------+
| Verifier | | External Anchor |
| (Auditor/Regul.) | | (Timestamp/Blockchain) |
+------------------+ +-------------------------+
¶
VCP MAY maintain per-Actor hash chains in addition to SCITT's global append-only log. When implemented, each VCP Event includes a PrevHash field containing the hash of the previous event from the same Actor. This enables efficient verification of a single Actor's event sequence without downloading the entire log.¶
Note: Per-Actor hash chains are OPTIONAL. External anchoring of batch roots provides the primary mechanism for completeness verification at batch granularity. Hash chains serve as a complementary local integrity mechanism.¶
Actor A: Event_A1 --hash--> Event_A2 --hash--> Event_A3 Actor B: Event_B1 --hash--> Event_B2 Global Log: [Event_A1, Event_B1, Event_A2, Event_B2, Event_A3, ...]¶
VCP defines a three-layer architecture that separates concerns and clarifies where each integrity property originates:¶
| Layer | Component | Property | Protocol Requirement |
|---|---|---|---|
| Layer 1 | Event Integrity | Individual event authenticity via digital signature | REQUIRED |
| Layer 2 | Collection Integrity | Merkle tree over event collection | REQUIRED |
| Layer 3 | External Verifiability | Merkle root anchored to external system | REQUIRED |
Note: Layer 3 (External Verifiability) is REQUIRED at every tier, as in VCP v1.2 [VCP-SPEC]. Revisions -02 and -03 of this document described it as OPTIONAL at the protocol level; that description did not match the VCP specification and is withdrawn. Lightweight or delegated anchoring mechanisms are acceptable at the Silver tier.¶
External anchoring makes post-anchor omission detectable: without it, a log producer could rebuild a batch and publish a different Merkle root. Anchoring lets third parties check a presented root against an independently recorded commitment, supporting the "Verify, Don't Trust" principle. It does not reveal events that were never included in a batch.¶
Layer 1: Event Integrity
+--------+ +--------+ +--------+
| Event1 | | Event2 | | Event3 |
| (sig) | | (sig) | | (sig) |
+---+----+ +---+----+ +---+----+
| | |
v v v
Layer 2: Collection Integrity (Merkle Tree)
+------------------------------------------+
| Merkle Root |
+---------------------+--------------------+
|
v (REQUIRED)
Layer 3: External Verifiability
+------------------------------------------+
| External Anchor (Blockchain/TSA/etc.) |
+------------------------------------------+
¶
A VCP Event is encoded as the payload of a SCITT Signed Statement. The payload MUST be a JSON object conforming to the following schema:¶
The Header contains metadata common to all VCP Events:¶
{
"Header": {
"EventID": "01961e5f-5c0d-7000-8000-123456789abc",
"TimestampISO": "2026-03-15T09:30:00.123456789Z",
"TimestampInt": 1742034600123456789,
"EventType": "ORD",
"ActorID": "algo-momentum-001",
"ChainID": "chain-actor-001",
"SequenceNum": 42,
"PolicyID": "org.veritaschain.policy:silver-v1-2"
}
}
¶
The Payload contains domain-specific data organized into modules:¶
{
"Payload": {
"VCP-TRADE": {
"OrderID": "ord-2026-001",
"Symbol": "AAPL",
"Side": "BUY",
"Quantity": "100",
"Price": "185.50",
"OrderType": "LIMIT"
},
"VCP-GOV": {
"AlgoID": "momentum-v2.3",
"DecisionFactors": ["RSI_oversold", "volume_spike"],
"ConfidenceScore": "0.87"
}
}
}
¶
The Security object contains integrity and chaining information:¶
{
"Security": {
"EventHash": "sha256:a1b2c3d4...",
"PrevHash": "sha256:f6e5d4c3...",
"MerkleRoot": "sha256:1234abcd...",
"SignAlgo": "ED25519",
"AnchorRef": "eth:0x1234...@12345678"
}
}
¶
VCP v1.2 [VCP-SPEC] defines an OPTIONAL SCITTAlignment object carried in the Header. It makes the binding between a VCP Event and its SCITT artifacts (Signed Statement, Transparency Service, Receipt) explicit and machine-readable.¶
Field presence is governed by conformance profiles:¶
| Profile | SCITTAlignment | Intended Use |
|---|---|---|
| VCP_BASE | OPTIONAL | Standard VCP deployment |
| VCP_SCITT | REQUIRED | SCITT Transparency Service interoperability |
| VCP_REGULATORY | RECOMMENDED | Regulatory reporting scenarios |
Implementations claiming the VCP_SCITT profile MUST include the SCITTAlignment object in every registered event; this profile-based approach avoids partial-implementation ambiguity.¶
{
"Header": {
"SCITTAlignment": {
"Version": "1.2",
"ConformanceProfile": "VCP_SCITT",
"StatementID": "stmt-01961e5f-5c0d-7000",
"TransparencyServiceID": "ts.veritaschain.example",
"ReceiptFormat": "COSE_RECEIPT",
"RegistrationPolicy": {
"PolicyID": "org.veritaschain.policy:gold-v1-2",
"Issuer": "org.veritaschain",
"IssuedAt": 1767225600000000000
}
}
}
}
¶
| Code | Name | Description |
|---|---|---|
| INIT | Initialization | Chain initialization, no PrevHash |
| SIG | Signal | Trading signal generated |
| ORD | Order | Order submitted |
| ACK | Acknowledgment | Order acknowledged by venue |
| EXE | Execution | Order executed (fill) |
| CXL | Cancellation | Order cancelled |
| MOD | Modification | Order modified |
| RSK | Risk | Risk event or limit breach |
| ERR | Error | System error |
| ERR_* | Error subtypes | ERR_CONN, ERR_AUTH, ERR_TIMEOUT, ERR_REJECT, ERR_PARSE, ERR_SYNC, ERR_RISK, ERR_SYSTEM, ERR_RECOVER |
| HBT | Heartbeat | Periodic liveness signal |
| CLS | Close | Position closed |
| ANC | Anchor | Merkle anchor event |
| ERASURE | Erasure | Crypto-shredding record (VCP v1.2, see Section 6.3) |
| SYS_RECOVERY_ANNOUNCE | Recovery announcement | Planned CHECKPOINT notice (Payload.VCP-RECOVERY.Announcement) |
| SYS_CHECKPOINT | Checkpoint | Recorded chain reset with authorized recovery action (Payload.VCP-RECOVERY) |
| SYS_AUDIT | Audit | Post-incident review (Payload.VCP-GOV.AuditDetails) |
| SYS_ANCHOR_MIGRATION | Anchor migration | Anchor transition and phase (Payload.VCP-ANCHOR.MigrationDetails) |
| SYS_ANCHOR_FAILOVER | Anchor failover | Anchor failover and queued-event inventory (Payload.VCP-ANCHOR.FailoverDetails) |
The five SYS_* codes were registered by the VCP v1.2 release; their structured payload locations and runtime requirements are defined in the normative annex of [VCP-SPEC]. Validators written against pre-release v1.2 artifacts need updating to accept them.¶
A VCP Transparency Service MUST enforce a Registration Policy that validates incoming Signed Statements.¶
The PolicyID field MUST be explicitly included in the VCP Event Header. The Transparency Service MUST validate the registration request against the referenced Registration Policy and MUST NOT infer, select, or substitute a policy on its own.¶
PolicyID values SHOULD follow the Issuer Domain + Local ID convention defined in VCP v1.2 [VCP-SPEC]: the reverse DNS notation of the Issuer's domain, a colon, and an issuer-defined local identifier. Examples:¶
Uniqueness derives from domain ownership; no central PolicyID registry is operated. Organizations without a domain MAY use a "local:" prefix at the cost of weaker uniqueness.¶
Conformance tiers (Silver, Gold, Platinum) represent additional verification depth and operational requirements applied on top of the same core Registration Policy, and do not define separate or incompatible registration policies.¶
The Registration Policy MUST verify:¶
This specification distinguishes timestamp resolution from clock accuracy. Nanosecond-resolution timestamps represent the storage format capability, while actual clock accuracy is explicitly recorded and enforced per tier.¶
| Requirement | Silver | Gold | Platinum |
|---|---|---|---|
| Timestamp Resolution | Millisecond | Microsecond | Nanosecond |
| Clock Synchronization | Best-effort | NTP (<1ms) | PTPv2 (<1 microsecond) |
| External Anchoring (REQUIRED) | Every 24 hours | Every hour | Every 10 minutes |
| Signature Algorithm | Ed25519 | Ed25519 | Ed25519 + Dilithium (OPTIONAL) |
| Key Storage | Software | Software/HSM | HSM Required |
| PrevHash Chain | OPTIONAL | OPTIONAL | RECOMMENDED |
Note: Silver tier is NOT intended for regulatory-grade algorithmic trading systems subject to MiFID II RTS 25, SEC Rule 17a-4, or equivalent clock synchronization requirements. Silver tier is appropriate for development, testing, backtesting analysis, and non-regulated trading scenarios.¶
This document does not mandate a specific external anchoring service; it requires anchoring at the frequency of each tier. Each AnchorRecord binds the batch Merkle root, event count, first and last event identifiers, and PolicyID (see Section 9 on the scope of the AnchorRecord signature). Implementations retain local copies of all AnchorRecords and document an anchor continuity plan, as defined in [VCP-SPEC].¶
Certification programs may impose requirements beyond this profile, such as multiple independent anchors. Certification requirements are defined separately from this document and may evolve independently of it. Implementations may conform to this profile without obtaining certification.¶
Acceptable anchor targets include:¶
A time-stamping authority attests existence time; by itself it does not show that the same root was presented to every verifier.¶
VCP supports crypto-shredding as a technical mechanism that can support erasure obligations while preserving audit trail integrity. It renders protected plaintext irrecoverable without invalidating cryptographic proofs. Whether it satisfies a specific legal obligation is not determined by this document.¶
{
"VCP-PRIVACY": {
"EncryptedFields": ["VCP-TRADE.ClientID", "VCP-TRADE.AccountID"],
"KeyID": "dek-2026-001-subject-12345",
"Algorithm": "AES-256-GCM",
"RetentionPolicy": "GDPR-5Y"
}
}
¶
VCP v1.2 [VCP-SPEC] defines the ERASURE event type to reconcile erasure obligations (such as GDPR Article 17) with append-only, tamper-evident audit trails. An ERASURE event does not delete or rewrite any prior event. It records, as a new append-only event, that the plaintext of specified protected fields has been rendered irrecoverable through crypto-shredding (destruction of the Data Encryption Key), while the EventHash, Merkle inclusion, and external anchor of the target events remain verifiable.¶
In the VCP v1.2 release, an ERASURE event MUST carry its details in Payload.VCP-PRIVACY.ErasureDetails, with the seven REQUIRED members below. ErasureDetails at the event root or directly under Payload is invalid. The flat ERASURE fields described in -03 of this document (ErasureTargetEventIDs, ErasureReason, KeyDestructionProof, RetentionExemption, OperatorID) reflected pre-release artifacts and are not a v1.2 encoding. Historical signed data is not rewritten. The normative annex of [VCP-SPEC] states how pre-release records are handled; it defines no lossless automatic conversion to the v1.2 encoding.¶
| Member | Content |
|---|---|
| Version | The literal "1.2" |
| TargetIdentifier | Type (ACCOUNT, SESSION or EVENT_RANGE), salted SHA-256 Hash, and Salt |
| Scope | AffectedEventCount, FirstAffectedEventID, LastAffectedEventID and AffectedFields; EventIDs MAY enumerate the exact affected set |
| Reason | Code, Description, LegalBasis and a SHA-256 RequestReferenceHash |
| Authorization | Authorizing role, signature, nanosecond timestamp and DPO notification |
| CryptoShredding | SHA-256 hash of the key identifier, key algorithm, destruction method and nanosecond destruction timestamp |
| Verification | PreErasureEventHash and PostErasureChainHash |
Reason codes are GDPR_ART_17_1A, GDPR_ART_17_1B, GDPR_ART_17_1C, GDPR_ART_17_1D, RETENTION_EXPIRED, SUBJECT_REQUEST, COURT_ORDER and ERROR_CORRECTION. Destruction methods are HSM_ZEROIZE, SECURE_DELETE and CLOUD_KMS_DESTROY. Authorization MUST precede or equal destruction, which MUST precede or equal the ERASURE event timestamp. The ERASURE event's own Merkle inclusion proof is detached (Evidence Pack or Receipt), not embedded in its hashed payload. Schema validation checks the structure of this evidence, not the truth of the destruction.¶
The following abbreviated example follows the structure of the release fixture; hashes, signatures and certificates are placeholders:¶
{
"Header": {
"EventID": "019eaf10-0000-7000-8000-000000000001",
"TimestampISO": "2026-10-09T00:00:00Z",
"TimestampInt": 1791504000000000000,
"EventType": "ERASURE",
"ActorID": "operator-example",
"ChainID": "chain-example",
"SequenceNum": 1,
"PolicyID": "org.example:fixture"
},
"Payload": {
"VCP-PRIVACY": {
"ErasureDetails": {
"Version": "1.2",
"TargetIdentifier": {
"Type": "ACCOUNT",
"Hash": "bbbb...",
"Salt": "example-salt"
},
"Scope": {
"AffectedEventCount": 1,
"FirstAffectedEventID":
"019eaf10-0000-7000-8000-000000000002",
"LastAffectedEventID":
"019eaf10-0000-7000-8000-000000000002",
"AffectedFields": ["ClientID"]
},
"Reason": {
"Code": "SUBJECT_REQUEST",
"Description": "Data subject request",
"LegalBasis": "Applicable erasure obligation",
"RequestReferenceHash": "cccc..."
},
"Authorization": {
"AuthorizedByRoleID": "privacy-role",
"AuthorizerSignature": "...",
"AuthorizationTimestamp": 1791503999999998000,
"DPONotified": true
},
"CryptoShredding": {
"KeyIDHash": "dddd...",
"KeyAlgorithm": "AES-256-GCM",
"DestructionMethod": "CLOUD_KMS_DESTROY",
"DestructionTimestamp": 1791503999999999000,
"DestructionCertificate": "..."
},
"Verification": {
"PreErasureEventHash": "sha256:eeee...",
"PostErasureChainHash": "sha256:ffff..."
}
}
}
},
"Security": {
"EventHash": "sha256:aaaa...",
"SignAlgo": "ED25519"
}
}
¶
ERASURE provides a technical mechanism that supports erasure obligations; it is not a legal determination. Whether crypto-shredding qualifies as erasure under a given regime is jurisdiction- and case-dependent. Deployments subject to reproduction-oriented recordkeeping rules (such as SEC Rule 17a-4 audit-trail controls) should note that once a DEK is destroyed the original plaintext is, by design, not re-creatable. Where a retention duty prevents deletion, a successful ERASURE event is not emitted for data that remains decryptable. The legal basis and any retention override recorded with an erasure require verification outside the event schema [VCP-SPEC].¶
VCP Transparency Services MUST implement SCRAPI [I-D.ietf-scitt-scrapi] with the following VCP-specific considerations:¶
VCP Events are submitted as COSE_Sign1 Signed Statements:¶
POST /entries HTTP/1.1 Host: vcp-ts.example.com Content-Type: application/cose <COSE_Sign1 containing VCP Event payload>¶
The Transparency Service validates the VCP Registration Policy and returns a COSE Receipt on success.¶
Retrieve a specific VCP Event by its entry ID (derived from EventID).¶
Retrieve the COSE Receipt for a registered VCP Event, containing the Merkle inclusion proof.¶
Retrieve the anchor status for a Merkle root, including the external reference (e.g., blockchain transaction ID or TSA token).¶
VCP's three-layer architecture provides defense in depth:¶
The optional per-Actor hash chain provides additional local integrity checks but is not required for external verifiability.¶
Mitigations against key compromise:¶
Ed25519 signatures are vulnerable to attacks by cryptographically relevant quantum computers. VCP provides crypto-agility to address future threats:¶
Implementers requiring post-quantum assurance SHOULD monitor CFRG and PQUIP working group outputs for updated guidance on algorithm selection and migration timelines.¶
Clock manipulation can enable backdating of events. Mitigations:¶
VCP Events may contain sensitive trading information. Operators SHOULD:¶
SCITT provides inclusion proofs but does not by itself establish completeness (i.e., that no events have been omitted). VCP adds the following:¶
These mechanisms make omission detectable at batch granularity and within the anchoring window; they do not establish that every event that occurred was recorded. An event that was never recorded is detectable only through another record that implies it, such as an order without a corresponding acknowledgment or a counterparty record. The completeness window implied by the tier's anchoring frequency should be disclosed when records are presented.¶
A comparison of the VCP v1.2 integrity layer with the VAP v1.2 framework requirements, published as an unadopted research observation record [VCP-VAP-OBS], identified the following discrepancies. They are not resolved by this revision.¶
Note to the RFC Editor: please remove this section before publication.¶
This section records the status of known implementations at the time of posting, following [RFC7942]. The listing of any individual implementation here does not imply endorsement by the IETF, and the information presented here has not been verified by the IETF. Other implementations may exist.¶
This document has no IANA actions at this time.¶
Future versions of this specification may request:¶
The following is a complete VCP v1.2 Event encoded as JSON, ready to be wrapped in a COSE_Sign1 Signed Statement:¶
{
"Header": {
"EventID": "01961e5f-5c0d-7000-8000-123456789abc",
"TimestampISO": "2026-03-15T09:30:00.123456789Z",
"TimestampInt": 1742034600123456789,
"EventType": "ORD",
"ActorID": "algo-momentum-001",
"ChainID": "chain-actor-001",
"SequenceNum": 42,
"PolicyID": "org.veritaschain.policy:gold-v1-2",
"SCITTAlignment": {
"Version": "1.2",
"ConformanceProfile": "VCP_SCITT",
"TransparencyServiceID": "ts.veritaschain.example",
"ReceiptFormat": "COSE_RECEIPT"
}
},
"Payload": {
"VCP-TRADE": {
"OrderID": "ord-2026-001",
"Symbol": "AAPL",
"Side": "BUY",
"Quantity": "100",
"Price": "185.50",
"OrderType": "LIMIT",
"TimeInForce": "DAY"
},
"VCP-GOV": {
"AlgoID": "momentum-v2.3",
"DecisionFactors": ["RSI_oversold", "volume_spike"],
"ConfidenceScore": "0.87",
"RiskCheckPassed": true
}
},
"Security": {
"EventHash": "sha256:a1b2c3...",
"PrevHash": "sha256:f6e5d4...",
"SignAlgo": "ED25519"
}
}
¶
Note: PrevHash is OPTIONAL. AnchorRef is populated once the batch containing the event has been anchored. Numeric values other than the integer Header fields are encoded as strings.¶
The complete JSON Schema for VCP Events is available at:¶
This section summarizes the changes from version -02 to -03. All changes align this profile with VCP Specification v1.2 [VCP-SPEC].¶
This section summarizes the changes from version -01 to -02:¶
The authors thank the members of the VeritasChain Standards Organization Technical Committee for their contributions to this specification. This work builds upon the SCITT architecture developed by the IETF SCITT Working Group, and the Certificate Transparency work in [RFC6962].¶
Special thanks to the SCITT WG participants who provided feedback on draft-kamimura-scitt-vcp-01, which informed the improvements in this version.¶