Glossario / Nodi e software
RPC
Noto anche come JSON-RPC, Remote procedure call.
- Che cos'è RPC?
- RPC è l'interfaccia a comandi che un nodo bitcoin espone ad altri programmi, e permette a un wallet, al back end di un exchange o al tuo terminale di rivolgergli domande e impartire istruzioni.
Tutto ciò che automatizza bitcoin parla con un nodo in questo modo. Bitcoin Core resta in ascolto sulla porta 8332 per le richieste HTTP che trasportano JSON, risponde a una chiamata alla volta e per impostazione predefinita accetta connessioni solo dalla macchina su cui è in esecuzione. Se un servizio ti ha mai dato una stima delle commissioni o ti ha detto che un prelievo era confermato, qualche chiamata RPC ha prodotto quella risposta.
Come funziona
Una chiamata RPC è una richiesta HTTP POST il cui corpo indica un metodo ed elenca i suoi argomenti.
Chiedi getblockchaininfo e ricevi il nome della catena, l'altezza attuale, l'avanzamento della verifica e la dimensione su disco. Chiedi listunspent o sendtoaddress e stai gestendo il wallet del nodo. Chiedi getrawtransaction e ottieni dei byte. Il programma bitcoin-cli incluso è un sottile involucro che costruisce il JSON, lo invia e stampa la risposta, quindi tutto ciò che puoi digitare a una riga di comando un programma può farlo tramite un socket.
L'autenticazione ha una storia che vale la pena conoscere. Bitcoin Core ha rimosso il supporto SSL integrato nella versione 0.12.0, quindi l'interfaccia parla HTTP non cifrato e nient'altro. Quella stessa versione ha introdotto il file cookie, una credenziale casuale scritta nella directory dei dati all'avvio e sostituita a ogni riavvio, ed è per questo che bitcoin-cli funziona sulla tua macchina senza che tu debba mai impostare una password. Per i chiamanti remoti c'è rpcauth, che memorizza nel file di configurazione un hash con salt anziché un segreto in chiaro. Non c'è ancora alcuna cifratura del trasporto, quindi raggiungere un nodo attraverso una rete richiede un tunnel SSH, una VPN o un servizio nascosto Tor, e nient'altro va bene.
Ogni rete ha la propria porta, così più demoni possono condividere una stessa macchina: 8332 sulla mainnet, 18332 sulla testnet3, 48332 sulla testnet4, 38332 sulla signet e 18443 sulla regtest. La porta RPC della mainnet sta subito sotto la porta peer-to-peer 8333, e confondere le due è un errore comune da principianti.
Il dialetto è cambiato lentamente. Bitcoin Core ha risposto a una variante tollerante di JSON-RPC 1,0 per ben più di un decennio, e la versione 28.0 ha insegnato al server a riconoscere le richieste JSON-RPC 2,0 e a rispondere in stretta conformità con quella specifica, continuando comunque ad accettare lo stile più vecchio. Le chiamate specifiche del wallet sono indirizzate per percorso, quindi un nodo che contiene più wallet le instrada tramite /wallet/ seguito dal nome del wallet.
Dove lo vedi
RPC è la giuntura tra bitcoin stesso e ogni prodotto costruito sopra di esso.
Un'implementazione Lightning chiede blocchi a un nodo e vi spinge le transazioni di chiusura. Gli explorer di blocchi, le dashboard della mempool e i processori di pagamento come BTCPay Server si appoggiano a un'istanza di bitcoind e l'avvolgono in qualcosa di più amichevole. Il sistema di prelievi di un exchange è, in fondo allo stack, una coda di chiamate sendrawtransaction. Quando le nostre recensioni degli exchange notano che una piattaforma raggruppa i prelievi, quel raggruppamento avviene in un codice che finisce qui.
È anche qui che le installazioni self-hosted vengono compromesse. La porta 8332 viene scansionata di continuo, e un nodo pubblicato su internet aperto con una password indovinabile e un wallet carico è un wallet che verrà svuotato. Tieni l'interfaccia vincolata alla macchina locale e accedi tramite un tunnel se ti serve da altrove.
RPC vs ordine dei byte RPC
RPC e ordine dei byte RPC condividono un acronimo e nulla più, e questo causa bug reali. RPC è l'interfaccia. L'ordine dei byte RPC è una convenzione di visualizzazione: gli hash dei blocchi e delle transazioni vengono calcolati e trasmessi in una direzione e stampati dal livello RPC in quella inversa, ed è per questo che un txid copiato da un explorer di blocchi risulta al contrario rispetto agli stessi 32 byte dentro una transazione grezza. Passa un txid copiato direttamente a un parser a livello di byte senza invertirlo e la ricerca semplicemente non troverà mai corrispondenza.