Testa o croce, a distanza
Scrivi la domanda, scegli quando atterra la moneta e manda il link a chi deve decidere con te. Finché è in aria nessuno può sapere come cadrà, nemmeno noi: il risultato arriva da drand, una rete di organizzazioni indipendenti che pubblica un numero casuale ogni 30 secondi.
[[ mode === 'flip' ? t.form_title_another : t.form_title ]]
Meglio dire cosa vuol dire testa e cosa croce. [[ questionLeft ]]
[[ formError ]]
Il link vale come prova solo se arriva agli altri prima che la moneta atterri. Per questo c'è qualche minuto di margine.
[[ t.q_open + question + t.q_close ]]
[[ t.status_air ]]
[[ fmt(t.lands_at, { when: whenText(at) }) ]]
[[ countdown ]]
[[ t.status_landing ]]
[[ t.landing_note ]]
[[ t.status_landed ]] [[ sideName ]]
[[ mode === 'minute' ? fmt(t.landed_at_minute, { when: whenText(at, true) }) : fmt(t.landed_at, { when: whenText(at) }) ]]
[[ fmt(t.next_minute, { s: nextMinuteIn }) ]]
[[ linkError ? t.error_link_title : signature === 'bad' ? t.error_beacon_title : t.error_network_title ]]
[[ linkError ? t['error_' + linkError] : signature === 'bad' ? t.error_beacon : t.error_network ]]
[[ justCreated ? fmt(t.share_title_created, { left: countdown }) : fmt(t.share_title_air, { left: countdown }) ]]
[[ t.share_help_air ]]
[[ t.share_title_landed ]]
[[ fmt(t.share_help_landed, { when: whenText(at) }) ]]
[[ fmt(t.share_preview, { text: shareText }) ]]
[[ t.verify_title ]] [[ t.verify_badge_ok ]] [[ t.verify_badge_bad ]]
- [[ t.verify_round ]]
- [[ round ]] · [[ whenText(at) ]]
- randomness
- [[ beacon.randomness ]]
- [[ t.verify_question ]]
- [[ question ? t.q_open + question + t.q_close : t.verify_no_question ]]
- [[ t.verify_digest ]]
- [[ digest.slice(0, -1) ]][[ lastDigit ]]
- [[ t.verify_result ]]
- [[ fmt(t.verify_rule, { digit: lastDigit, parity: parseInt(lastDigit, 16) % 2 ? t.odd : t.even, side: sideName }) ]]
- [[ t.verify_signature ]]
- [[ t['verify_sig_' + signature] ]]
Come funziona
Lanciare una moneta in videochiamata non convince nessuno: chi la lancia può ripetere finché non gli piace il risultato. Qui la moneta la lancia una rete esterna, a un'ora decisa prima, e il risultato si ricalcola da capo con dati pubblici.
Da dove viene il risultato
drand è il servizio di numeri casuali della League of Entropy, un gruppo di organizzazioni indipendenti tra cui Cloudflare, Protocol Labs, l'EPFL e diverse università. Dal 2020 pubblica un numero ogni 30 secondi, firmato insieme dai nodi della rete: per produrlo serve la collaborazione di molti di loro, e nessuno da solo può prevederlo o sceglierlo. Ogni numero resta consultabile per sempre, e la firma si può controllare con la chiave pubblica della rete. È quello che fa questa pagina, nel tuo browser.
Perché il link va condiviso prima
Il link contiene la domanda e l'ora dell'atterraggio. Se lo ricevi mentre la moneta è ancora in aria, chi l'ha creato non poteva sapere come sarebbe caduta. Se te lo mandano dopo, invece, non prova niente: chiunque può creare un link con un orario passato, dopo aver visto il risultato.
- La prova è l'orario del messaggio in chat: se il link è arrivato prima dell'ora di atterraggio, il lancio è valido.
- Se qualcuno ti manda un lancio già atterrato, chiedigli di farne uno nuovo.
- Quando condividi dal bottone, il testo del messaggio dice già che la moneta è in aria e quando atterra. L'anteprima del link, invece, è quella generica della pagina.
Il calcolo, per chi vuole rifarlo
t è l'ora di atterraggio in secondi Unix (UTC), sempre un minuto intero. Il round di drand di quell'istante dà la firma e il numero casuale:
round = (t − 1595431050) / 30 + 1
randomness = sha256(signature)
digest = sha256(randomness + domanda)
ultima cifra di digest pari → testa, dispari → croce
La domanda entra nel calcolo così com'è scritta nel link: due domande diverse alla stessa ora danno lanci indipendenti, la stessa domanda alla stessa ora dà sempre lo stesso risultato. Nel riquadro "Verifica" sotto la moneta trovi tutti i valori, con il link al dato originale di drand.