Wiki de ZooBC
Apps y desarrollo sobre ZooBC

Apps de canal

En la cadena, cada movimiento de una partida cuesta una transacción y algo de espera hasta un bloque. Una app de canal elimina ese coste para dos jugadores: pagan sus apuestas en la cadena, intercambian los movimientos directamente como comprobantes firmados y ponen una sola liquidación en la cadena al final. Después, cada nodo reproduce los movimientos firmados con el mismo motor de reglas que juzga el juego en la cadena.

Abrir un canal

Una partida de canal se crea con CreateApp y el indicador channel a 1. Requiere exactamente dos asientos, y ambas apuestas se pagan en la cadena como de costumbre. A partir de ahí los movimientos viajan fuera de la cadena: un AppMove, ResignApp o ClaimAppTimeout enviado para una partida de canal es una operación nula pagada.

Movimientos firmados

Cada movimiento es un comprobante firmado por el asiento que lo hace, sobre este resumen:

SHA3-256(app id (LE8) ‖ seq (LE4) ‖ SHA3-256(state before) ‖ move)

La firma se comprueba según el tipo de cuenta de ese jugador (claves y tipos de cuenta). Como el resumen cubre el id de la app, el número de secuencia del movimiento y el estado anterior al movimiento, un movimiento firmado no puede reutilizarse en otra partida ni en otra posición. En la billetera oficial, los comprobantes viajan entre los dos jugadores a través de un relay, el mismo servicio que transporta las llamadas (relays).

Liquidar

Cualquiera de los dos jugadores puede presentar un SettleApp (tipo 39). Su cuerpo contiene el id de la app y final_seq, que debe ser igual al número de comprobantes, seguido de cada comprobante: el asiento, la longitud del movimiento, el movimiento y una firma de 64 bytes. Una liquidación lleva como máximo 1024 comprobantes.

Cada nodo reproduce los comprobantes desde el estado de la partida con el mismo motor, comprobando cada firma y cada turno, y registra el resultado. Un SettleApp que falla, porque no puede analizarse, nombra la app equivocada, viene de alguien que no está sentado o lleva un comprobante incorrecto, es una operación nula gratuita: no se cobra nada. Solo los dos jugadores sentados pueden presentar uno.

Los movimientos firmados entran en un solo SettleApp; cada nodo los reproduce; una cadena firmada más larga puede anular la reclamación dentro de 240 bloques.
Los movimientos firmados entran en un solo SettleApp; cada nodo los reproduce; una cadena firmada más larga puede anular la reclamación dentro de 240 bloques.

La ventana de impugnación

Una liquidación es una reclamación, registrada con un plazo de 240 bloques. Durante esa ventana, cualquiera de los dos jugadores puede presentar un SettleApp con un final_seq mayor, es decir, una cadena válida de movimientos más larga. Cada anulación aceptada sustituye a la reclamación y reinicia los 240 bloques. Cuando se cierra la ventana, se aplica la última reclamación:

  • si la partida se ganó: el ganador recibe el bote menos el rake del 1 %;
  • si la partida terminó en empate: se reembolsan ambas apuestas;
  • si la partida seguía en curso: el asiento que tenía el reloj en marcha pierde por abandono, y el bote menos el rake va al otro jugador.
Si Bob no hace nada, pierde por abandono; si presenta a tiempo una cadena más larga, la ventana se reinicia y se aplica el resultado reproducido.
Si Bob no hace nada, pierde por abandono; si presenta a tiempo una cadena más larga, la ventana se reinicia y se aplica el resultado reproducido.

Jugar con seguridad

  • Guarda cada movimiento firmado que recibas. La última posición firmada es tu protección frente a una liquidación que se detiene antes de tiempo.
  • Vigila la cadena en busca de liquidaciones de tus partidas: una reclamación que nadie responde en 240 bloques se mantiene.
  • No esperes privacidad ni descuento. Los canales son para exactamente dos asientos, el resultado es público una vez liquidado, y una partida con un ganador paga el mismo rake del 1 % que el juego en la cadena.

Véase también