sh.E

D-KaP v1 — Python reference

stdlib-only · byte-identical to the TS impl

runtime

  • Python 3.6+ (uses hashlib.sha256 + hashlib.sha3_256)
  • No external dependencies
  • Self-test at the bottom recomputes the v25 apex byte-for-byte
dkap_v1.py download .py →
# D-KaP v1 reference implementation — Python (stdlib only)
# Mirror of TypeScript brief-seal.ts byte-for-byte.

import hashlib
from typing import Iterable, Optional

RAS_ROOT = "40668c787c463ca5"
PHI = 1.618033988749895
PHI_PAD = str(PHI)


def seal_section(body: str, bullets: Optional[Iterable[str]], kind: str) -> str:
    material = "|".join([
        f"kind:{kind}",
        f"body:{body}",
        f"bullets:{chr(10).join(bullets or [])}",
        f"ras:{RAS_ROOT}",
        f"phi:{PHI_PAD}",
    ])
    return hashlib.sha256(material.encode("utf-8")).hexdigest()


def seal_brief(section_seals: Iterable[str], recipient_fingerprint: str) -> str:
    material = "|".join([
        "sections:" + ",".join(sorted(section_seals)),
        f"recipient:{recipient_fingerprint}",
        f"ras:{RAS_ROOT}",
        f"phi:{PHI_PAD}",
    ])
    return hashlib.sha256(material.encode("utf-8")).hexdigest()


def bundle_merkle(brief_seals):
    leaves = list(brief_seals)
    if not leaves:
        return hashlib.sha256(f"empty:{RAS_ROOT}|{PHI_PAD}".encode()).hexdigest()
    layer = [hashlib.sha256(f"leaf:{s}".encode()).hexdigest()
             for s in sorted(leaves)]
    while len(layer) > 1:
        if len(layer) % 2 == 1:
            layer.append(layer[-1])
        layer = [hashlib.sha256(f"pair:{layer[i]}:{layer[i+1]}".encode()).hexdigest()
                 for i in range(0, len(layer), 2)]
    return layer[0]


def chain_apex(merkle_root: str, predecessor_apex: str, hz: float = 7777.77) -> dict:
    """Compute waterseal + apex for the next chain entry.
       v_N_waterseal = sha256(merkle || pred_apex || RAS || PHI || HZ)
       v_N_apex      = sha3_256(v_N_waterseal || str(HZ))"""
    waterseal_input = f"{merkle_root}{predecessor_apex}{RAS_ROOT}{PHI}{hz}"
    waterseal = hashlib.sha256(waterseal_input.encode()).hexdigest()
    apex = hashlib.sha3_256(f"{waterseal}{hz}".encode()).hexdigest()
    return {"waterseal": waterseal, "apex": apex}


# Test vector — the v25 chain entry should recompute byte-for-byte.
if __name__ == "__main__":
    V24_APEX = "efe714062b0a271e3b5172c11045ef43edfd923c1b658cc96ca4bbf2856f26a8"
    V25_MERKLE = "6afddc4ee7445097ed076b7fe989766e5ebbdcd0e31bb434d6b6e53b87e61154"
    EXPECTED_V25_APEX = "b0aff941712d85be283874d8e4cf1275d0d4fd4fe65e9118be503c6f88f7ba72"
    out = chain_apex(V25_MERKLE, V24_APEX)
    assert out["apex"] == EXPECTED_V25_APEX, f"mismatch: {out}"
    print(f"OK — v25 apex recomputable: {out['apex']}")