Auditoría pública del ledger.
Cada día publicamos un snapshot firmado del estado del ledger encadenado de MarginCue. Cualquiera puede guardar el hash de hoy y, mañana, retarnos a demostrar que sigue ahí. Si hubiéramos reescrito una sola decisión, la cadena de hashes se rompería — matemáticamente.
Firmado con RS256 con la misma clave pública que publicamos en /v1/public/auth/jwks. Tú no necesitas confiar en nosotros para verificar — puedes hacerlo tú mismo con cualquier librería estándar.
Snapshot actual
Capturado el 10 de mayo de 2026 a las 0:47. Total de eventos en el ledger: 0 a través de 0 restaurantes activos.
Últimos 5 checkpoints
| Fecha | Eventos | Tenants | chain_hash | prev_hash |
|---|---|---|---|---|
| 10 de mayo de 2026 a las 0:47 | 0 | 0 | c2fd1ca8…f4e77c75 | d6132041…55b5ddf0 |
| 9 de mayo de 2026 a las 0:47 | 0 | 0 | d6132041…55b5ddf0 | b86826cb…441aa181 |
| 8 de mayo de 2026 a las 0:31 | 0 | 0 | b86826cb…441aa181 | 1dba323e…c058cc5c |
| 7 de mayo de 2026 a las 0:28 | 0 | 0 | 1dba323e…c058cc5c | 28170209…18609caf |
| 6 de mayo de 2026 a las 18:55 | 0 | 0 | 28170209…18609caf | — |
Cómo verificar un checkpoint
Cualquiera puede verificar la integridad de un checkpoint sin pedirnos permiso. La receta:
- Pide el último (o uno por hash) a
/v1/public/transparency/checkpoint/latesto/v1/public/transparency/checkpoint/{chain_hash}. - Re-canonicaliza el campo
public_payloadcon JCS (RFC 8785). - Calcula
sha256de los bytes canonicalizados — debe coincidir con el campochain_hash. - Pide la clave pública en /v1/public/auth/jwks y busca la clave con el
kidque coincide consignature_kid. - Decodifica la
signature(base64url-no-padding) y verifica que es un RS256 válido sobrechain_hash.
Snippet de verificación en Python (60 líneas, sólo depende de cryptography):
import json, hashlib, base64, requests
from cryptography.hazmat.primitives.asymmetric import padding, rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicNumbers
API = "https://margincue.com"
cp = requests.get(f"{API}/v1/public/transparency/checkpoint/latest").json()
jwks = requests.get(cp["jwks_url"]).json()
# 1. Canonicalize the payload (JCS RFC 8785) and hash.
def jcs(v):
if isinstance(v, dict):
return "{" + ",".join(f'{json.dumps(k)}:{jcs(v[k])}' for k in sorted(v)) + "}"
if isinstance(v, list):
return "[" + ",".join(jcs(x) for x in v) + "]"
return json.dumps(v, separators=(",", ":"))
canon = jcs(cp["public_payload"]).encode()
expected = hashlib.sha256(canon).hexdigest()
assert expected == cp["chain_hash"], "chain_hash mismatch"
# 2. Verify signature using JWKS.
key = next(k for k in jwks["keys"] if k["kid"] == cp["signature_kid"])
n = int.from_bytes(base64.urlsafe_b64decode(key["n"] + "==="), "big")
e = int.from_bytes(base64.urlsafe_b64decode(key["e"] + "==="), "big")
pub = RSAPublicNumbers(e, n).public_key()
sig = base64.urlsafe_b64decode(cp["signature"] + "===")
pub.verify(sig, cp["chain_hash"].encode(), padding.PKCS1v15(), hashes.SHA256())
print("✓ signature verified — checkpoint", cp["chain_hash"][:16], "is authentic")Qué proves esto, exactamente
El checkpoint demuestra que en el momento captured_at:
- El ledger tenía exactamente
event_counteventos. Si añadimos uno retroactivamente al pasado y lo intentamos publicar como histórico, el contador del checkpoint nuevo no encajará con el del checkpoint del día siguiente. - El último evento se registró en
last_event_at. Inserciones retroactivas con timestamps anteriores serían detectables. - El estado deriva del checkpoint anterior cuyo hash se incluye en el payload firmado. Para reescribir una decisión vieja sin que se note, tendríamos que generar de nuevo todos los checkpoints intermedios — y la firma del checkpoint diario más antiguo (que terceros ya han guardado) ya no validaría.
No proves quién hizo qué, ni qué decisiones tomó el motor. Eso es deliberado: tus datos de negocio no se publican. Lo público es la integridad estructural de la cadena, no su contenido.
El resto de los compromisos
Esta página materializa el quinto compromiso de nuestra política de precios. Los otros cuatro son igualmente públicos y verificables: precio único por local y momento, precio cerrado durante el servicio, cero discriminación por perfil de comensal, y cap del ±15% por semana sobre el precio de referencia.