4 gennaio 2018

Esempio Linqpad per Bitcoin Cash via BitcoinLib

L'ottima libreria c# BitcoinLib permette di accedere e interrogare la rete Bitcoin Cash  e anche BTC, DASH e altre.

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