github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/btc/block_test.go (about)

     1  package btc
     2  
     3  import (
     4  	"io/ioutil"
     5  	"net/http"
     6  	"os"
     7  	"testing"
     8  )
     9  
    10  const block_hash = "0000000000000000000884ad62c7036a7e2022bca3f0bd68628414150e8a0ea6"
    11  
    12  var _block_filename = ""
    13  
    14  func block_filename() string {
    15  	if _block_filename == "" {
    16  		_block_filename = os.TempDir() + string(os.PathSeparator) + block_hash
    17  	}
    18  	return _block_filename
    19  }
    20  
    21  // fetch_block downloads a block from blockchain.info and stores it in the TEMP folder.
    22  func fetch_block(b *testing.B) {
    23  	url := "https://blockstream.info/api/block/" + block_hash + "/raw"
    24  	r, er := http.Get(url)
    25  	if er == nil {
    26  		if r.StatusCode == 200 {
    27  			raw, er := ioutil.ReadAll(r.Body)
    28  			r.Body.Close()
    29  			if er == nil {
    30  				er = ioutil.WriteFile(block_filename(), raw, 0600)
    31  				if er != nil {
    32  					b.Fatal(er.Error())
    33  				}
    34  			} else {
    35  				b.Fatal(er.Error())
    36  			}
    37  		} else {
    38  			b.Fatal("Unexpected HTTP Status code", r.StatusCode, url)
    39  		}
    40  	} else {
    41  		b.Fatal(er.Error())
    42  	}
    43  	return
    44  }
    45  
    46  func BenchmarkBuildTxList(b *testing.B) {
    47  	raw, e := ioutil.ReadFile(block_filename())
    48  	if e != nil {
    49  		fetch_block(b)
    50  		if raw, e = ioutil.ReadFile(block_filename()); e != nil {
    51  			b.Fatal(e.Error())
    52  		}
    53  	}
    54  	b.SetBytes(int64(len(raw)))
    55  	bl, e := NewBlock(raw)
    56  	if e != nil {
    57  		b.Fatal(e.Error())
    58  	}
    59  	b.ResetTimer()
    60  	for i := 0; i < b.N; i++ {
    61  		bl.TxCount = 0
    62  		bl.BuildTxList()
    63  	}
    64  }
    65  
    66  func BenchmarkCalcMerkle(b *testing.B) {
    67  	raw, e := ioutil.ReadFile(block_filename())
    68  	if e != nil {
    69  		fetch_block(b)
    70  		if raw, e = ioutil.ReadFile(block_filename()); e != nil {
    71  			b.Fatal(e.Error())
    72  		}
    73  	}
    74  	bl, e := NewBlock(raw)
    75  	if e != nil {
    76  		b.Fatal(e.Error())
    77  	}
    78  	bl.BuildTxList()
    79  	mtr := make([][32]byte, len(bl.Txs), 3*len(bl.Txs)) // make the buffer 3 times longer as we use append() inside CalcMerkle
    80  	for i, tx := range bl.Txs {
    81  		mtr[i] = tx.Hash.Hash
    82  	}
    83  	b.ResetTimer()
    84  	for i := 0; i < b.N; i++ {
    85  		CalcMerkle(mtr)
    86  	}
    87  }