package main import ( "fmt" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcrpcclient" ) func explore(client *btcrpcclient.Client, blockHash string) { var realBlocks int for blockHash != "" { //generate hash from string bh, err := chainhash.NewHashFromStr(blockHash) check(err) block, err := client.GetBlockVerbose(bh) check(err) var newBlock BlockModel newBlock.Hash = block.Hash newBlock.Height = block.Height newBlock.Confirmations = block.Confirmations //get Fee value th, err := chainhash.NewHashFromStr(block.Tx[0]) check(err) tx, err := client.GetRawTransactionVerbose(th) check(err) var totalFee float64 for _, Vo := range tx.Vout { totalFee = totalFee + Vo.Value } newBlock.Fee = totalFee //for each Tx, get the Tx value var totalAmount float64 /*inside each block, there are []Tx inside each Tx, if is the Tx[0], is the Fees in the Tx[n] where n>0, each Tx is independent, and inside each Tx there are []Vout. Usually Vout[0] is the real Tx value and the Vout[1] is the rest of the amount in the original wallet. Each Tx moves all the wallet amount, and the realTx amount is sent to the destination and the rest of the wallet amount, is send to another owned wallet */ for k, txHash := range block.Tx { //first Tx is the Fee //after first Tx is the Sent Amount if k > 0 { th, err := chainhash.NewHashFromStr(txHash) check(err) tx, err := client.GetRawTransactionVerbose(th) check(err) var originAddress string for _, Vi := range tx.Vin { th, err := chainhash.NewHashFromStr(Vi.Txid) check(err) txVi, err := client.GetRawTransactionVerbose(th) check(err) if len(txVi.Vout[0].ScriptPubKey.Addresses) > 0 { originAddress = txVi.Vout[0].ScriptPubKey.Addresses[0] } } for _, Vo := range tx.Vout { totalAmount = totalAmount + Vo.Value var blockTx TxModel blockTx.Txid = tx.Txid blockTx.Amount = Vo.Value blockTx.From = originAddress blockTx.To = Vo.ScriptPubKey.Addresses[0] newBlock.Tx = append(newBlock.Tx, blockTx) } } } if totalAmount > 0 { newBlock.Amount = totalAmount saveBlock(blockCollection, newBlock) fmt.Print("Height: ") fmt.Println(newBlock.Height) fmt.Print("Amount: ") fmt.Println(newBlock.Amount) fmt.Print("Fee: ") fmt.Println(newBlock.Fee) fmt.Println("-----") realBlocks++ } //set the next block blockHash = block.NextHash //analyze block creator for _, t := range newBlock.Tx { var n1 NodeModel var n2 NodeModel n1.Id = t.From n1.Label = t.From n1.Value = 1 n1.Shape = "dot" n2.Id = t.To n2.Label = t.To n2.Value = 1 n2.Shape = "dot" var e EdgeModel e.From = t.From e.To = t.To e.Label = t.Amount e.Txid = t.Txid saveNode(nodeCollection, n1) saveNode(nodeCollection, n2) saveEdge(edgeCollection, e) } } fmt.Print("realBlocks (blocks with Fee and Amount values): ") fmt.Println(realBlocks) fmt.Println("reached the end of blockchain") }