CORE CONCEPTS

Proof-of-Performance (PoP)

Why Commit→Reveal

Prevents hindsight edits and selective disclosure. Commits reveal nothing about content but fix the existence/time. Reveal proves content identity.

Canonical Serialization (JCS)

We use RFC 8785 JSON Canonicalization Scheme to ensure deterministic bytes:

  • UTF-8 encoding
  • Lexicographic key order
  • Minimal whitespace
  • Standard number formatting (no NaN/Inf)

Let C(payload_no_nonce) be the JCS bytes.

Hash Construction

1hash = keccak256( C(payload_no_nonce) || nonce )
  • nonce: 32-byte CSPRNG secret, revealed later.
  • payload_no_nonce excludes the nonce field to avoid self-reference.
  • Off-chain signature (optional) binds payload to publisher key.

Single vs. Batched Commits (Merkle)

  • Single: Store hash directly.
  • Batch: Compute leaf L_i = keccak256( C_i || nonce_i ) , build Merkle tree, store root R.
  • Reveal passes (payload_i, nonce_i, proof_i) ; contract verifies leaf and path to R.

Reveal Windows & Anti-Withholding

  • minRevealAt prevents immediate leakage; maxRevealAt enforces timely disclosure.
  • Missed reveal ⇒ Expired flag (analytics penalize).

Publisher Identity & Signatures

  • Metadata stores publisher address.
  • Optionally include sig (ECDSA secp256k1) over C(payload_no_nonce) in reveal payload; SDK verifies off-chain.

Worked Example

Payload (no nonce):

1{
2  "ts": "2025-08-15T18:22:43Z",
3  "pair": "BTCUSDT",
4  "tf": "5m",
5  "dir": "LONG",
6  "entry": {"from": 64250, "to": 64290},
7  "tp": [64520, 64780, 65150],
8  "sl": 63940,
9  "model": "ob-v3.2",
10  "confidence": 0.74,
11  "notes": "imbalance>30%",
12  "channel": "telegram://@chaintick",
13  "publisher": "0xPUB..."
14}
  • Nonce: 0x7fd1c3...01e3 Compute H = keccak256( JCS(payload_no_nonce) || nonce ). Store H (or leaf in batch root). On reveal, recompute and match.