Il Bitcoin Button Game @Binance (ita)

Daniele De Faveri
13 min readJan 8, 2024

--

Come ho creato un Robot Software per provare a vincere un Bitcoin

English Version Available HERE; Versione inglese dell’articolo disponibile qui.

La pagina del Bitcoin Button Game di Binance

*Questo articolo è stato inizialmente pubblicato a Giugno 2022

TL;DR; si può vincere un bitcoin al gioco di Binance creando un robot software che giochi al posto mio?

Questo articolo racconta come ho cercato di vincere un bitcoin al gioco di @binance The Bitcoin Button Game, che è un gioco di strategia al quale vince l’ultimo giocatore che schiaccia il bottone.
Ho costruito un robot software (scritto in R con le librerie di Selenium) che guarda la pagina del gioco pronto a partecipare al gioco premendo il pulsante al momento giusto ed integrato con un telegram Bot per gli alert real time quando decideva di giocare schiacciando il pulsante.

Poco importa se sono riuscito effettivamente a vincere, ma l’ideazione del robot è davvero interessante.

Qui i dettagli del gioco, il modello di quanto sarebbe durato il gioco ed il codice del robot.

INDICE

Il #Bitcoinbuttongame di Binance

Il Bitcoin Button Game di Binance è un gioco di strategia in cui l’ultima persona che schiaccia il bottone vince 1 Bitcoin; il gioco è legato ad un timer con un conto alla rovescia da 60.00 secondi a 00.00, quando il timer arriva a zero il gioco termina, ma ogni volta che un giocatore schiaccia il pulsante il timer ricomincia il conto alla rovescia da 60 secondi.

Per vincere nel gioco quindi è sufficiente che dopo che un giocatore ha schiacciatoil pulsante nessun altro giocatore schiacci il pulsante per 60 secondi.

Ogni giocatore ha 1 solo tentativo quindi deve scegliere il momento migliore perquando giocare la propria possibilità di vincita.

Qual’è la tattica migliore per cercare di vincere il bitcoin?
L’unico modo è riuscire a schiacciare il pulsante quando c’è poca attività sul gioco eincrociare le dita per 60 secondi, sperando che la poca attività significhi che tutti glialtri giocatori abbiano già usato tutti la propria possibilità.

L’unico modo è, quindi, schiacciare il pulsante quando il timer è estremamente vicino allo 00.00, sperando che questo significhi che tutti i giocatori che volevanogiocare lo abbiano già fatto e nessuno che abbia ancora la possibilità di schiacciare il pulsante sia presente e attento nei 60 secondi successivi.

Ma non si può pensare di stare guardare la pagina del timer per giorni e giornifacendo click quando si avvicina a 00.00 e inoltre secondo la legge di Hick ( vedi wikipedia Hick’s Law ) che modella l’interazione uomo-macchina descrivendo iltempo che impiega un utente a prendere una decisione in base al numero di scelte aloro disposizione, il minimo tempo di reazione a uno stimolo visivo in cui il soggettoè completamente concentrato segue la legge

che nel caso del bitcoin button game porta il tempo di reazione all’incirca a 2 decimidi secondo, quindi è alto il rischio di cercare di schiacciare il pulsante quando èvicino allo 0 e non reagire in tempo e quindi perdere l’opportunità di vincerefacendo vincere il giocatore precedente.

Tempo di reazione al crescere delle possibilità di scelta

Serve Un Robot!
Questo è quindi un lavoro più adatto ad una macchina ed è qui che mi è venutal’idea di creare un robot software che rimanesse a guardare la pagina al posto mio efosse pronto a fare click sul pulsante al momento più opportuno.

Ho già costruito programmi che interagissero in modo “umano” con le pagine webed ho quindi pensato di riutilizzare questa esperienza in quest’ambito; per farequesto ho utilizzato R (non sarebbe cambiato molto in altri linguaggi come adesempio Python, ma per confidenza e velocità di sviluppo che ho verso l’ambiente Rho deciso di implementarlo in questo linguaggio anche se non è il suo ambito diutilizzo specifico).

Quanto durerà il gioco?
La prima domanda che mi sono posto è: “Avrò abbastanza tempo per costruire etestare il robot? Quanto a lungo potrebbe durare il gioco?”

Ricordo che il gioco termina quando il timer arriva a 00.00, ovvero quando nessungiocatore fa click sul pulsante per 60 secondi, oppure se il timer ancora non èarrivato a 0 dopo 90 giorni dall’inizio del gioco.

Facciamo quindi una prima approssimazione di quanto tempo potremmo avere adisposizione per costruire il nostro Robot; per giocare bisogna avere un accountBinance o un Account Twitter già attivo al momento di avvio del gioco e che segua l’account di Binance; Binance alla data ha circa 28.5 Milioni di clienti sulla suapiattaforma ed ha 8 Milioni di followers su twitter.

Il gioco è iniziato il 15 Marzo 2022 Ho scoperto il gioco il 22 Marzo 2022 ed il numerodi giocatori in questo periodo è stato di circa 521K giocatori, il che vuol dire unamedia di 1.3 secondi per ogni click; c’è ovviamente una certa varianza su questovalore, ma anche a vista i primi giorni di gioco non ho mai visto il timer andare ameno di 56 secondi.

Perchè i giocatori schiaccino così il pulsante sinceramente non lo capisco, forse nonhanno chiare le regole per vincere o semplicemente preferiscono avere subito l’NFTdi partecipazione, chissà…

Qualunque sia il motivo che spinge i giocatori a schiacciare il pulsante, ipotizzandoche comunque con l’andare del tempo i giocatori comincino ad essere meno equindi ad allargare gradualmente il tempo fra un click e l’altro; possiamo ipotizzare(senza nessuna pretesa di modellazione formale del fenomeno) che l’incrementodel tempo medio tra un click e l’altro segua una funzione esponenziale del tipo:

dove alpha= 1,3 Secondi e beta=0,1

Stima Delta tempo tra un click e l’altro al passare dei giorni fino alla soglia dei 60 secondi

Graficando l’andamento del tempo possiamo ricavare che, secondo questo modello,il tempo tra un click e l’altro dovrebbe arrivare ai fatidici 60 secondi intorno al 46esimo giorno dall’inizio del gioco con un totale di partecipanti al gioco di circa 1Milione e 141 mila giocatori pari ad una redemption del 3,1% dei potenziali giocatori.

Stima del numero di giocatori al passare dei giorni sulla base dell’incremento del delta tempo tra un click e l’altro

Ovviamente questi parametri sono parzialmente empirici sui primi giorni di gioco eparzialmente aprioristici (tipo di curva di crescita e 10% di crescita), estrapolatidall’andamento dei primi giorni di gioco, ma non avendo serie temporali più lungheda analizzare è la miglior proxy che possiamo fare al momento; vedremo almomento della conclusione del gioco se risulteranno realistici.

In ogni caso la cosa che ci interessa ai nostri fini, è che abbiamo circa 40 giorni percostruire e mettere online il nostro robot e che probabilmente il gioco termineràprima dell’arrivo ai 90 giorni limite previsti dal regolamento.

Costruiamo il robot
Appurato che dovrebbe esserci il tempo sufficiente per sviluppare un Robotsoftware per partecipare al gioco possiamo ora ideare le componenti fondamentali che il nostro software dovrà avere.

Il nostro Robot dovrà essere in grado di fare le seguenti cose:

  • Aprire un browser e navigare fino alla pagina del Bitcoin Button Game
  • Accettare Privacy, cookies regolamenti etc.
  • Effettuare login alla piattaforma
  • Restare in ascolto fino al momento di cliccare
  • Cliccare il bottone al momento opportuno
  • Rieseguire il click in caso di errore
  • Inviare una notifica tramite Telegram
  • Monitorare i 60 secondi dopo il click per capire se il click è andato a buon fine

Per fare questo, come detto in precedenza, utilizzeremo R nonchè la versione per R di Selenium chè è un progetto che include una serie di tool e librerie per la browserautomation; qui Selenium verrà utilizzato per guidare il nostro browser e interagirecon lui tramite script per i nostri scopi; Costruiremo inoltre un piccolo BotTelegram comandato dal programma R per inviare un alert sul cellulare appenasarà fatto il click così da essere avvertiti con facilità in qualsiasi momento.

Il tutto sarà deployato su un servizio di hosting in cloud in modo da tenerlo accessoper tutto il tempo del gioco.

Utilizzeremo un ambiente Linux Debian, con un R versione 3.6.1 ed un
R studio 2022.02.1–46.

Nell’installazione su debian dovranno essere presenti anche le librerie ssl, curl, xml etc.

libssl1.0.2
libcurl4-openssl-dev
libxml2-dev

Nonchè serviranno i geckodriver per permettere a Selenium di interagire con il browser.

sudo wget
https://github.com/mozilla/geckodriver/releases/download/v0.30.0/geckodriver-v0.30.0-linux64.tar.gz
sudo sh -c ‘tar -x geckodriver -zf geckodriver-v0.30.0-linux64.tar.gz -O > /usr/bin/geckodriver’
sudo chmod +x /usr/bin/geckodriver

Creazione del telegram Bot per gli alert
Creiamo il nostro Telegram Bot, così da usarlo come canale di comunicazione; percreare un Bot Telegram bisogna contattare il
@BotFather ed inviare i messaggi \start e quindi \newbot .

Il BotFather chiederà uno username e un nome e genererà un authentication tokenche salevremo in una variabile.

La mia Chat con il mio Telegram Bot

Il Telegram bot è pronto, andiamo a recuperare l’id della chat che utilizzeremo permandare i messaggi, facciamo una getUpdates() per recuperare la chat id

bot = Bot(token = bot_token)
# The first time, you will need the chat id (which is the chat where you will get the notifications)
updates = bot$getUpdates()
# Sending text
message_to_bot=sprintf(‘Hi Bro’)
bot$sendMessage(chat_id = Chat_Id_num , text = message_to_bot)
Il Bot Telegram riesce a mandarmi messaggi

Il bot non resterà in ascolto di messaggi provenienti dalle chat, in modo passivomanderà informazioni tramite il robot che giocherà al bitcoin button.

Costruiamo il robot per giocare
A questo punto dovremo installare le librerie R per Selenium e Telegram

library(rvest)
library(xml2)
library(RSelenium)
library(dplyr)
library(rlist)
library(telegram.bot)

Iniziamo ora a far Aprire il browser e navigare alla pagina del bitcoin button game

##++++++++++++++++++++++++++++ LOAD Selenium Drivers
rD <- rsDriver(browser = “firefox”, port = 6768L)
remDr <- rD[[“client”]]
## — — — — — — — — — — — — — — END LOAD Selenium Drivers
##++++++++++++++++++++++++++++ Navigate to URL
url <- "https://www.binance.com/en/activity/bitcoin-button-game"
remDr$navigate(url)
Sys.sleep(2)
## — — — — — — — — — — — — — — END Navigate to URL

Utilizziamo spesso delle attese nel codice che consentano al browser di caricarsi,aggiornarsi ed essere a disposizione di selenium per essere eseguito

Il Browser è ora controllato dal robot

come si vede dall’immagine il browser è ora controllato dal nostro Robot, l’icona del robot nella barra degli indirizzi ci fa capire che sta interagendo col robot, nulla peròimpedirebbe di interagire contemporaneamente anche con una interazione umana.

Per individuare le varie componenti della pagina con cui interagire utilizzeremoalcuni metodi differenti per comodità e semplicità andando a individuare i singolielementi della pagina, o tramite l’ xpath dell’elemento che permette di puntare unsingolo elemento tramite il percorso html dell’elemento, o tramite il riferimentodella classe css o tramite l’id del singolo elemento.

Questi metodi sono molto potenti e permettono di interagire con qualsiasi elementodella pagina; per ritrovare l’elemento servirà analizzare il codice html della pagina eidentificare i codici e percorsi di interesse della pagina.

Una volta che abbiamo navigato fino alla pagina di interesse, dobbiamo prima ditutto accettare il disclaimer sui cookies, facciamo premere il pulsante accetta al browser:

##+++++++++++++++++++++++++++++++ ACCEPT COOKIE DISCLAIMER
#accettiamo i cookies
webEle <-remDr$findElements(using = ‘xpath’, “//*[@id=\”onetrust-accept-btn-handler\”]”)
webEle[[1]]$clickElement()
Sys.sleep(1)
## — — — — — — — — — — — — — — — END ACCEPT COOKIE DISCLAIMER

Individuato l’elemento facciamo click sul pulsante ( clickElement() ) ed attendiamo che il messaggio scompaia.

Login con twitter tramite il robot
Abbiamo ora un passaggio fondamentale, ossia fare login per poter giocare con ilnostro account; il gioco prevede la possibilità di utilizzare due tipi di account, Twitter o Binance; avendo il dual factor authentication attivo sul mio account Binance che rende necessaria l’interazione esterna con l’authenticator ho deciso diutilizzare il social login tramite Twitter che richiede solo l’invio tramite form diutenza e password; Twitter fa comunque delle verifiche se vi è un login da un nuovodevice o location, sarà, quindi, prima necessario fare un login manuale dalla macchina su cui deplyeremo il nostro robot e fare la procedura di verifica eautorizzazione via mail; una volta effettuata la verifica del nostro account leprossime volte sarà sufficiente effettuare il login con utenza e password rendendo ilnostro robot autonomo.

Bottone di login che il robot deve schiacciare
#click on login link
webEle <-remDr$findElements(using = “css”,value = “.btn-sign-in”)
webEle[[1]]$clickElement()
Sys.sleep(2)

Ci ritroviamo nella pagina di scelta del tipo di account per fare il login tra twitter eBinance, facciamo fare click su twitter e inoltre mettiamo il flag sulle term and conditions

Pagina di login del #BitcoinButtonGame
# Accept term and conditions
webEle <-remDr$findElements(using = “css”,value = “.css-3kwgah”)
webEle[[1]]$clickElement()
# Click Sign In
webEle <-remDr$findElements(using = “css”,value = “.btn-sign-in-twitter > div:nth-child(4)”)
webEle[[1]]$clickElement()
Sys.sleep(2)

Ci ritroviamo quindi nella pagina di social login di twitter, inseriamo Utenza e Password (con la funzione sendKeysToElement) che abbiamo precedentemente salvato in delle apposite variabili nei campi del form e inviamo il form per accedere.

Twitter Social Login Page
#send username
username <- remDr$findElement(using = “id”, value = “username_or_email”)
username$sendKeysToElement(list(twitter_user))
#send password and Enter
passwd <- remDr$findElement(using = “id”, value = “password”)
passwd$sendKeysToElement(list(twitter_pass, “\uE007”))
Sys.sleep(3)

Mettiamo il robot in ascolto, pronto a schiacciare il pulsante
Abbiamo quindi fatto il login, e siamo pronti a mettere in ascolto il robot perattendere il momento opportuno per fare click sul pulsante. Per prima cosadobbiamo fare un minimo di analisi di quant’è il tempo minimo di reazione delnostro robot, quindi simuliamo il funzionamento del click senza fare click pervedere quanto passa da quando il robot vede il momento giusto sul timer e quanto ciimpiega a reagire e schiacciare il pulsante; dai test effettuati (mettendoci a 55secondi come se fosse lo zero di riferimento) vediamo che il tempo di esecuzione dei vari step fino ad arrivare al click varia da 0 a 4 centesimi di secondo; persicurezza ed avere un minimo di margine impostiamo che il Robot effettui il clicksul bottone quando vede 00 secondi, avendo ancora qualche decimo di secondo percompletare il click.

L’altro punto da tenere in considerazione è il conflitto di click; se due giocatoripremono il pulsante contemporaneamente, il gioco li blocca, invitandoli ariprovare:

Alert visualizzato dall’applicazione quando più utenti schiacciano il pulsante contemporaneamente

Per gestire questa casistica impostiamo un certo numero di retry (senza particolarelogica, il robot riproverà a fare click se vede nuovamente lo 00) in modo da nonperderci il caso in cui si sia fatto click insieme a un altro giocatore, ma essere prontia fare nuovamente click all’occasione successiva.

Ora dobbiamo recuperare i puntatori ai due oggetti fondamentali della pagina ossiail timer ed il bitcoin button, puntiamo quindi i due elementi con il metodo findelements e ci mettiamo in ascolto:

#Total Partecipants
partecipants <-remDr$findElements(using = ‘xpath’, “*//div[contains(@class,\”th68ec\”)]”)
print(paste(“Already Clicked at Start: “, partecipants[[2]]$getElementText()))
## Point to the Bitcoin Timer
BitcoinTimer <-remDr$findElements(using = ‘xpath’, “*//div[contains(@class,\”w39bvu\”)]”)
#Point To The Bitcoin Button
BitcoinButton <-remDr$findElements(using = “css”,value = “.bitcoin-btn-core > path:nth-child(5)”) #BITCOIN BUTTON
print(“Listening…”)

Il Timer è una lista di 4 oggetti, in cui ogni oggetto indica un numero del timer ossiadecine di secondi, secondi, decimi di secondo, centesimi di secondo.
Per simulare una persona che guarda in continuazione il timer ci mettiamo in unloop infinito, ad ogni giro di loop leggiamo il valore del timer e aspettiamo chedecine di secondi e secondi siano a 00, a quel punto procediamo con il click sulbottone.

while (Click_Try < max_Try){
Sec1 <- as.numeric(BitcoinTimer[[1]]$getElementText())
Sec2 <- as.numeric(BitcoinTimer[[2]]$getElementText())
Sec3 <- as.numeric(BitcoinTimer[[3]]$getElementText())
Sec4 <- as.numeric(BitcoinTimer[[4]]$getElementText())
if (Sec1==0 & Sec2 == 0) {
BitcoinButton[[1]]$clickElement()
print (“NOW Click!”)
print(paste(BitcoinTimer[[1]]$getElementText(),BitcoinTimer[[2]]$getElementText(),BitcoinTimer[[3]]$getElementText(),BitcoinTimer[[4]]$getElementText()))
print(paste(“partecipants at Click: “, partecipants[[2]]$getElementText()))
Click_Try <- Click_Try + 1
########## Screenshot log
remDr$screenshot(file = paste0(root_dir,’RSchreenshot/Screenshot_At_1_Click_try’,Click_Try,’.png’))
############ Send screenshot through telegram Bot
bot$sendPhoto(chat_id = Chat_Id_num, photo = paste0(root_dir,’RSchreenshot/Screenshot_At_1_Click_try’,Click_Try,’.png’))
Sys.sleep(4)
}
}

Nella procedura abbiamo quindi inserito dei log del numero di partecipanti almomento del click e uno screenshot del momento del click.

Lo screenshot viene quindi inviato dal nostro telegram bot sulla chat che abbiamocreato.

Chiudiamo lo script facendo logoff e chiudendo il browser.

#logout from Twitter
webEle <-remDr$findElements(using = “css”,value = “.btn-log-out-twitter”)
webEle[[1]]$clickElement()
Sys.sleep(1)
remDr$close()
rD$server$stop()

Vai Robot! Gioca e vinci!
Quindi com’è andata con il nostro robot? Ha avuto problemi?

Ho avviato il robot il 6 aprile al 22esimo giorno dall’avvio del gioco, con circa 700K giocatori che già avevano cliccato il pulsante, secondo il nostro modello dovremmoessere circa a metà del gioco con ancora circa 24 giorni di attesa, quindi ciaspettiamo che il bot ci contatti tra una ventina di giorni sul nostro telegram.

Il 19 Aprile la prima sorpresa, mi sveglio al mattino e trovo un messaggio del miobot sulla chat, verificando lo screenshot ricevuto vedo che il bot ha avuto un errore:

Il robot ha schiacciato il pulsante, ma qualcosa è andato storto, riproviamo

Qualcosa è andato storto, subito verifico il gioco online, e il contatore è ancora liche fa il conto alla rovescia.

Apro subito il mio server temendo di aver cliccato il pulsante nel momentosbagliato, ma noto che il browser è andato in crash, quindi nessun click vero, ma un click “finto” perchè probabilmente il browser ha avuto qualche problema e il nostrobot ha visto un timer a 0 che non era vero.

Ok per fortuna siamo ancora in gioco, puliamo l’ambiente e riavviamo il nostro bot.

Il mio robot non si fa più sentire per giorni e giorni, ci stiamo avvicinando al46esimo giorno che il modello prevedeva come completamento del gioco..

Superiamo anche il 46esimo giorno senza che il bot si faccia sentire…

Dopo qualche giorno ricevo la notifica del mio click! Questa volta senza errori, ilmio bot ha davvero fatto click…

Avrò vinto?

Il gioco si è concluso il 7 Maggio 2022, 7 giorni dopo il giorno che il modello prevedeva con 1,142,779 giocatori, molto vicino al valore previsto dal modello iniziale.

il Tweet di Binance: #BitcoinButtonGame è terminato

Sarà stato il mio robot a vincere il bitcoin?

Non è questa la sede per rivelarlo, ma il gioco e la costruzione del bot è stata moltodivertente e costruttiva e chissà che non possa tornare utile anche in altri concorsi!

--

--

Daniele De Faveri

Explorer of Web3's Transformative Realm, Data Strategist and Chartered Blockchain Analyst