MarginCue
Cómo funcionaEl motorPor dentroPreciosBlog
Iniciar sesiónEmpezar gratis
Cómo funcionaEl motorPor dentroPreciosBlogIniciar sesiónEmpezar gratis
Inicio/Transparencia
Compromiso 5

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.

chain_hash c2fd1ca853f60ec1aee515ab1c1eac626dbed4c748dcb4334e4c1303f4e77c75
prev_checkpoint_hash d6132041d8c84dce24872faabbb1ec318299cc893b85b89354805c1b55b5ddf0
signature eNn0dMqIZ0fUCKYs1ZnRZ76lCD0dGABfYc4J9kbJuQ_ZJkPtlrVh5frzLCXwh5TI…
signature_kid ci4oPof2c8U
algo sha256+rs256

Endpoint: /v1/public/transparency/checkpoint/latest

Últimos 5 checkpoints

FechaEventosTenantschain_hashprev_hash
10 de mayo de 2026 a las 0:4700c2fd1ca8…f4e77c75d6132041…55b5ddf0
9 de mayo de 2026 a las 0:4700d6132041…55b5ddf0b86826cb…441aa181
8 de mayo de 2026 a las 0:3100b86826cb…441aa1811dba323e…c058cc5c
7 de mayo de 2026 a las 0:28001dba323e…c058cc5c28170209…18609caf
6 de mayo de 2026 a las 18:550028170209…18609caf—

Cómo verificar un checkpoint

Cualquiera puede verificar la integridad de un checkpoint sin pedirnos permiso. La receta:

  1. Pide el último (o uno por hash) a /v1/public/transparency/checkpoint/latest o /v1/public/transparency/checkpoint/{chain_hash}.
  2. Re-canonicaliza el campo public_payload con JCS (RFC 8785).
  3. Calcula sha256 de los bytes canonicalizados — debe coincidir con el campo chain_hash.
  4. Pide la clave pública en /v1/public/auth/jwks y busca la clave con el kid que coincide con signature_kid.
  5. Decodifica la signature (base64url-no-padding) y verifica que es un RS256 válido sobre chain_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_count eventos. 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.

MarginCue

Hacemos que cada mesa te deje un poco más. Propuestas de precio cada semana, reservas con depósito y referencia de cómo cobra tu zona. Construido en España, para restaurantes de España.

Producto

  • Cómo funciona
  • El motor
  • Por dentro
  • Precios
  • Probar con tu carta

Recursos

  • Blog
  • Preguntas frecuentes
  • Política de precios

Compañía

  • Contacto
  • Iniciar sesión
© 2026 MarginCue · España
Nada pasa sin tu OK