Núm. 11Solucky
Qui pot tocar el pot
L’Alex va explicar com Solucky sorteja un guanyador. Aquesta és l’altra meitat: on són els diners dels jugadors fins llavors, qui els pot moure i qui no.
Vincent Porret
Cofundador i CEO · · 4 min de lectura
L’Alex va explicar com Solucky sorteja el seu bitllet guanyador. En riscos, el sorteig és només la meitat de la pregunta. L’altra meitat és la custòdia: on són els diners entre el primer bitllet i el pagament, qui els pot moure i què li ho impedeix. En un banc, la resposta és un conjunt de controls i les persones que els aproven. A Solucky 1.0, és un programa de vuit instruccions, i qualsevol les pot llegir totes.
El pot és la ronda
No hi ha cap caixa forta ni cap wallet de la casa al mig. Cada dia UTC és una ronda, i el mateix compte de la ronda guarda el seu pot, a més del petit saldo que Solana exigeix perquè un compte existeixi. Un bitllet és una transferència simple del comprador directament a aquest compte. El compte pertany al programa, i cap persona no té una clau que pugui signar per ell, així que els lamports només en surten quan ho diu una de les instruccions del programa.
De les vuit, dues treuen diners d’una ronda, i el codi és prou curt per citar-lo. claim_prize paga el guanyador:
let fee = fee_for(round.pot, round.fee_bps);
let payout = round.pot - fee;
ctx.accounts.round.sub_lamports(payout)?;
ctx.accounts.owner.add_lamports(payout)?;collect_fee paga la casa, i res més no treu lamports d’una ronda. Una tercera instrucció, close_ticket, només retorna el lloguer del compte d’un bitllet al jugador que el va pagar, quan la ronda ja està liquidada.
Qualsevol la pot enviar, només una persona cobra
claim_prize no necessita cap signatura. El guanyador, un amic o un script la poden enviar, però el programa comprova que el compte que paga és el propietari escrit al bitllet guanyador, i que el bitllet pertany a aquesta ronda. Si s’envia amb qualsevol altra adreça, falla. La comissió funciona igual: qualsevol pot enviar collect_fee, i només paga l’adreça de tresoreria que figura a la configuració del programa. Tampoc no hi ha termini per reclamar. Un premi sense reclamar espera a la seva ronda, i ningú més no se’l pot endur.
L’ordre importa igual. collect_fee només funciona amb una ronda liquidada, així que la comissió es queda a la ronda fins que s’ha pagat el guanyador. Una tresoreria mal configurada, o simplement lenta, no pot retenir un premi.
La casa cobra després del guanyador, mai abans.
El que pot canviar l’operador
El programa té una autoritat, i avui som nosaltres. Pot canviar el preu del bitllet, la comissió de la casa, el número de bitllet més alt i l’adreça de tresoreria, i pot pausar les vendes. Cadascun d’aquests poders té un límit. La comissió té un topall al codi del 10 %, MAX_FEE_BPS: u16 = 1_000. Una ronda copia el preu i la comissió de la configuració quan es ven el seu primer bitllet, i se’ls queda, així que un canvi només arriba a les rondes que encara no s’han obert, mai a un pot que ja s’està omplint. A més, els compradors envien el màxim que accepten pagar, així que un preu apujat entre la pantalla i la signatura fa fallar la compra en lloc de cobrar més.
Una pausa atura la venda de bitllets i res més. El tancament, el sorteig i el cobrament continuen oberts, i un comentari del codi en dona la raó: que una pausa no pugui bloquejar mai un pot. L’única palanca que l’autoritat conserva sobre els diners és l’adreça de tresoreria: una comissió va a la tresoreria que estigui configurada quan es cobra. El que no té és igual de clar. Cap instrucció no envia un pot enlloc més que al seu guanyador, ni una comissió enlloc més que a la tresoreria.
Arrodoniments i desbordaments
La comissió s’arrodoneix cap avall, així que una fracció de lamport va al guanyador, no a la casa. El nombre de bitllets i el pot se sumen amb aritmètica comprovada, i el programa es compila amb els controls de desbordament activats, així que un desbordament anul·la la transacció en lloc de tornar a començar. I un bitllet costa com a mínim 0,001 SOL: amb la comissió limitada al 10 %, un premi sempre és per sobre del saldo mínim que necessita un wallet buit a Solana, així que sempre es pot pagar.
El que el codi no cobreix
Hi ha dos límits fora de les instruccions. El programa es pot actualitzar, així que qui tingui la seva autoritat d’actualització podria substituir el codi, i cada garantia d’aquí dalt val per al codi desplegat ara. El nostre README ho diu: un programa actualitzable només és tan fiable com la seva autoritat d’actualització, i la sortida és un multisig, o fer el programa immutable quan sigui estable. I com va escriure l’Alex, el sorteig és just davant dels jugadors, no davant dels validadors. Per això l’app pública funciona en devnet, amb SOL de prova, i per això la nostra política de seguretat diu que no s’hi juguin pots amb diners reals.
En un banc, controls com aquests viuen en un document de polítiques. Aquí viuen al codi, i es comproven a cada transacció.
Vincent

