Per provarla ho creato un esempio in LinqPad.
Per cominciare bisogna installare nella query LinqPad la libreria BitcoinLib da NuGet (basta premere F4 in LinqPad e poi il pulsante Add Nuget ) .
Ora potete aggiungere la prima riga di codice:
// Create a coinservice ICoinService CoinService = new BitcoinService(useTestnet: true);
Se la lanciate così non può funzionare! Infatti la libreria in realtà per funzionare deve essere configurata premendo di nuovo F4 e mettendo in app.config questo xml:
<configuration> <startup> <supportedruntime sku=".NETFramework,Version=v4.6.1" version="v4.0"> </supportedruntime></startup> <appsettings> <!-- BitcoinLib settings start --> <!-- Shared RPC settings start --> <add key="RpcRequestTimeoutInSeconds" value="60" /> <!-- Shared RPC settings end --> <!-- Bitcoin settings start --> <add key="Bitcoin_DaemonUrl" value="http://localhost:8332" /> <add key="Bitcoin_DaemonUrl_Testnet" value="http://localhost:18332" /> <add key="Bitcoin_WalletPassword" value=""/> <add key="Bitcoin_RpcUsername" value="USERNAME" /> <add key="Bitcoin_RpcPassword" value="Pwd_cambia_questo" /> <!-- Bitcoin settings end --> <!-- Demo client settings start --> <add key="ExtractMyPrivateKeys" value="false" /> <!-- Demo client settings end --> <!-- BitcoinLib settings end --> </appsettings> </configuration>
Ancora non funziona! Infatti come si intuisce dal file di configurazione la libreria necessita di un nodo della rete Bitcoin a cui puntare per funzionare. Niente di più facile! :D Basta scaricare un client Bitcoin, io ad esempio ho scaricato Bitcoin ABC della blockchain Bitcoin Cash.
Se si fa partire sulla rete "main" richiede giorni per sincronizzarsi e occupa 120 giga sul disco ma per i test è sufficiente lanciarlo sulla rete "testnet" e salvare solo gli ultimi giorni di transazioni sul disco.
Per lanciarlo il comando è:
bitcoin-qt.exe -prune=560 -testnet -server
e bisogna aggiungere in bitcoin.conf la stessa pwd configurata nell'app.config
rpcuser=USERNAME rpcpassword=Pwd_cambia_questo
In un paio di ore o meno dovrebbe sincronizzarsi.
Ora possiamo provare a aggiungere qualche cosa al codice di più interessante:
// ecco il balance del wallet! var myBalance = CoinService.GetBalance(minConf: 1);
myBalance.Dump("Balance");
se vi servono soldi sulla rete testnet basta andare su un faucet bitcoin cash e farseli mandare, yeah magic internet money.
oppure possiamo elencare la lista di transazioni:
CoinService.ListTransactions(null, int.MaxValue, 0) .Select(t => new { Account = t.Account, // account receiving Address = t.Address, Category = t.Category, // receiving or sending Amount = t.Amount, Fee = t.Fee, Confirmation = t.Confirmations, TxId = new Hyperlinq("https://www.blocktrail.com/tBCC/tx/" + t.TxId,"check") , Time = t.Time + "-" + UnixTime.UnixTimeToDateTime(t.TimeReceived), CoinService.GetTransaction(t.TxId).Details.First().Label // ?? can have more than one ? }).Dump("Transactions");
Sono affascinato dalla "meccanica" della blockchain e riuscire ad accederci tramite LinqPad e C# in maniera semplice e moderna la rende ancora più appetibile.
Esempio completo: Bitcoin Cash Linqpad example using BitcoinLib
Se non avete ancora Linqpad scaricatelo subito!
La pagina github da cui è tratto questo esempio: https://github.com/GeorgeKimionis/BitcoinLib/blob/master/demo/Program.cs
Se volete stimolare il mio lavoro potete mandarmi qualche frazione di Bitcoin Cash a questo indirizzo:
1GovBxD4ZFThbWX9Bjw16AksxJq8D4PDQX
Oppure usare questo qrCode (BCH mi raccomando):