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 }