-
Notifications
You must be signed in to change notification settings - Fork 0
/
mempoolreader.go
113 lines (96 loc) · 2.36 KB
/
mempoolreader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package btc
import (
"bufio"
"encoding/binary"
"errors"
"fmt"
"io"
"os"
"github.com/btcsuite/btcd/wire"
)
// ReadMempoolFromPath reads a mempool file from a given path and returns a Mempool type
func ReadMempoolFromPath(path string) (mem Mempool, err error) {
file, err := os.Open(path)
if err != nil {
return mem, fmt.Errorf("read mempool file fail: %s" + err.Error())
}
defer file.Close()
r := bufio.NewReader(file)
header, err := readFileHeader(r)
if err != nil {
return mem, fmt.Errorf("read header fail: %s", err.Error())
}
mem.header = header
var entries []MempoolEntry
for i := int64(0); i < header.numTx; i++ {
mementry, err := readMempoolEntry(r)
if err != nil {
return mem, fmt.Errorf("read mempoolEntry fail at index %d : %s", i, err.Error())
}
entries = append(entries, mementry)
}
mem.entries = entries
var feeDelta []byte
for {
remainingBytes, err := r.ReadByte()
if err == io.EOF {
break
} else if err != nil {
return mem, fmt.Errorf("read feeDelta fail: %s" + err.Error())
}
feeDelta = append(feeDelta, remainingBytes)
}
mem.mapDeltas = feeDelta
return
}
func readFileHeader(r *bufio.Reader) (header FileHeader, err error) {
fileVersion, err := readLEint64(r)
if err != nil {
return header, err
}
switch fileVersion {
case MEMPOOL_DUMP_VERSION_NO_XOR_KEY:
fmt.Println("Leave XOR-key empty")
case MEMPOOL_DUMP_VERSION:
_, err := readLEint64(r)
if err != nil {
return header, err
}
default:
return header, errors.New("mempool dat file version error")
}
numberOfTx, err := readLEint64(r)
if err != nil {
return header, err
}
header = FileHeader{fileVersion, numberOfTx}
return
}
func readMempoolEntry(r *bufio.Reader) (mementry MempoolEntry, err error) {
msgTx := &wire.MsgTx{}
err = msgTx.Deserialize(r)
if err != nil {
return mementry, err
}
timestamp, err := readLEint64(r)
if err != nil {
return mementry, err
}
feeDelta, err := readLEint64(r)
if err != nil {
return mementry, err
}
mementry = MempoolEntry{msgTx, timestamp, feeDelta}
return
}
// reads the next 64bit in Little Endian and returns a int64
// get the mempoolEntry's timestamp and feeDelta
func readLEint64(r *bufio.Reader) (res int64, err error) {
next64Bit := make([]byte, 8)
_, err = io.ReadFull(r, next64Bit)
if err != nil {
return 0, err
}
res = int64(binary.LittleEndian.Uint64(next64Bit))
return
}