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):

