-
Notifications
You must be signed in to change notification settings - Fork 258
/
parse.go
96 lines (83 loc) · 2.35 KB
/
parse.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
package shares
import (
"bytes"
"fmt"
"github.com/celestiaorg/celestia-app/pkg/appconsts"
coretypes "github.com/tendermint/tendermint/types"
)
// ParseTxs collects all of the transactions from the shares provided
func ParseTxs(shares []Share) (coretypes.Txs, error) {
// parse the shares
rawTxs, err := parseCompactShares(shares, appconsts.SupportedShareVersions)
if err != nil {
return nil, err
}
// convert to the Tx type
txs := make(coretypes.Txs, len(rawTxs))
for i := 0; i < len(txs); i++ {
txs[i] = coretypes.Tx(rawTxs[i])
}
return txs, nil
}
// ParseBlobs collects all blobs from the shares provided
func ParseBlobs(shares []Share) ([]coretypes.Blob, error) {
blobList, err := parseSparseShares(shares, appconsts.SupportedShareVersions)
if err != nil {
return []coretypes.Blob{}, err
}
return blobList, nil
}
// ParseShares parses the shares provided and returns a list of ShareSequences.
// If ignorePadding is true then the returned ShareSequences will not contain
// any padding sequences.
func ParseShares(shares []Share, ignorePadding bool) ([]ShareSequence, error) {
sequences := []ShareSequence{}
currentSequence := ShareSequence{}
for _, share := range shares {
if err := share.Validate(); err != nil {
return sequences, err
}
isStart, err := share.IsSequenceStart()
if err != nil {
return sequences, err
}
ns, err := share.Namespace()
if err != nil {
return sequences, err
}
if isStart {
if len(currentSequence.Shares) > 0 {
sequences = append(sequences, currentSequence)
}
currentSequence = ShareSequence{
Shares: []Share{share},
Namespace: ns,
}
} else {
if !bytes.Equal(currentSequence.Namespace.Bytes(), ns.Bytes()) {
return sequences, fmt.Errorf("share sequence %v has inconsistent namespace IDs with share %v", currentSequence, share)
}
currentSequence.Shares = append(currentSequence.Shares, share)
}
}
if len(currentSequence.Shares) > 0 {
sequences = append(sequences, currentSequence)
}
for _, sequence := range sequences {
if err := sequence.validSequenceLen(); err != nil {
return sequences, err
}
}
result := []ShareSequence{}
for _, sequence := range sequences {
isPadding, err := sequence.isPadding()
if err != nil {
return nil, err
}
if ignorePadding && isPadding {
continue
}
result = append(result, sequence)
}
return result, nil
}