@@ -2,8 +2,9 @@ package types
2
2
3
3
import (
4
4
"context"
5
+ "crypto/sha256"
5
6
"encoding/binary"
6
- "errors "
7
+ "fmt "
7
8
"time"
8
9
9
10
btypes "github.com/initia-labs/opinit-bots/node/broadcaster/types"
@@ -39,41 +40,67 @@ const (
39
40
BatchDataTypeChunk
40
41
)
41
42
43
+ type BatchDataHeader struct {
44
+ Start uint64
45
+ End uint64
46
+ Checksums [][]byte
47
+ }
48
+
49
+ type BatchDataChunk struct {
50
+ Start uint64
51
+ End uint64
52
+ Index uint64
53
+ Length uint64
54
+ ChunkData []byte
55
+ }
56
+
57
+ func GetChecksumFromChunk (chunk []byte ) [32 ]byte {
58
+ return sha256 .Sum256 (chunk )
59
+ }
60
+
42
61
func MarshalBatchDataHeader (
43
62
start uint64 ,
44
63
end uint64 ,
45
64
checksums [][]byte ,
46
65
) []byte {
47
66
data := make ([]byte , 1 )
48
67
data [0 ] = byte (BatchDataTypeHeader )
49
- data = binary .AppendUvarint (data , start )
50
- data = binary .AppendUvarint (data , end )
51
- data = binary .AppendUvarint (data , uint64 (len (checksums )))
68
+ data = binary .BigEndian . AppendUint64 (data , start )
69
+ data = binary .BigEndian . AppendUint64 (data , end )
70
+ data = binary .BigEndian . AppendUint64 (data , uint64 (len (checksums )))
52
71
for _ , checksum := range checksums {
53
72
data = append (data , checksum ... )
54
73
}
55
74
return data
56
75
}
57
76
58
- func UnmarshalBatchDataHeader (data []byte ) (start uint64 , end uint64 , length uint64 , checksums [][] byte , err error ) {
77
+ func UnmarshalBatchDataHeader (data []byte ) (BatchDataHeader , error ) {
59
78
if len (data ) < 25 {
60
- err = errors . New ("invalid data length" )
61
- return
79
+ err := fmt . Errorf ("invalid data length: %d, expected > 25" , len ( data ) )
80
+ return BatchDataHeader {}, err
62
81
}
63
- start , _ = binary .Uvarint (data [1 :9 ])
64
- end , _ = binary .Uvarint (data [9 :17 ])
65
- length , _ = binary .Uvarint (data [17 :25 ])
66
- checksums = make ([][]byte , 0 , length )
67
-
68
- if len (data )- 25 % 32 != 0 || (uint64 (len (data )- 25 )/ 32 ) != length {
69
- err = errors .New ("invalid checksum data" )
70
- return
82
+ start := binary .BigEndian .Uint64 (data [1 :9 ])
83
+ end := binary .BigEndian .Uint64 (data [9 :17 ])
84
+ if start > end {
85
+ return BatchDataHeader {}, fmt .Errorf ("invalid start: %d, end: %d" , start , end )
71
86
}
72
87
88
+ length := binary .BigEndian .Uint64 (data [17 :25 ])
89
+ if (len (data )- 25 )% 32 != 0 || (uint64 (len (data )- 25 )/ 32 ) != length {
90
+ err := fmt .Errorf ("invalid checksum length: %d, data length: %d" , length , len (data )- 25 )
91
+ return BatchDataHeader {}, err
92
+ }
93
+
94
+ checksums := make ([][]byte , 0 , length )
73
95
for i := 25 ; i < len (data ); i += 32 {
74
96
checksums = append (checksums , data [i :i + 32 ])
75
97
}
76
- return
98
+
99
+ return BatchDataHeader {
100
+ Start : start ,
101
+ End : end ,
102
+ Checksums : checksums ,
103
+ }, nil
77
104
}
78
105
79
106
func MarshalBatchDataChunk (
@@ -85,23 +112,33 @@ func MarshalBatchDataChunk(
85
112
) []byte {
86
113
data := make ([]byte , 1 )
87
114
data [0 ] = byte (BatchDataTypeChunk )
88
- data = binary .AppendUvarint (data , start )
89
- data = binary .AppendUvarint (data , end )
90
- data = binary .AppendUvarint (data , index )
91
- data = binary .AppendUvarint (data , length )
115
+ data = binary .BigEndian . AppendUint64 (data , start )
116
+ data = binary .BigEndian . AppendUint64 (data , end )
117
+ data = binary .BigEndian . AppendUint64 (data , index )
118
+ data = binary .BigEndian . AppendUint64 (data , length )
92
119
data = append (data , chunkData ... )
93
120
return data
94
121
}
95
122
96
- func UnmarshalBatchDataChunk (data []byte ) (start uint64 , end uint64 , index uint64 , length uint64 , chunkData [] byte , err error ) {
123
+ func UnmarshalBatchDataChunk (data []byte ) (BatchDataChunk , error ) {
97
124
if len (data ) < 33 {
98
- err = errors . New ("invalid data length" )
99
- return
125
+ err := fmt . Errorf ("invalid data length: %d, expected > 33" , len ( data ) )
126
+ return BatchDataChunk {}, err
100
127
}
101
- start , _ = binary .Uvarint (data [1 :9 ])
102
- end , _ = binary .Uvarint (data [9 :17 ])
103
- index , _ = binary .Uvarint (data [17 :25 ])
104
- length , _ = binary .Uvarint (data [25 :33 ])
105
- chunkData = data [33 :]
106
- return
128
+ start := binary .BigEndian .Uint64 (data [1 :9 ])
129
+ end := binary .BigEndian .Uint64 (data [9 :17 ])
130
+ if start > end {
131
+ return BatchDataChunk {}, fmt .Errorf ("invalid start: %d, end: %d" , start , end )
132
+ }
133
+ index := binary .BigEndian .Uint64 (data [17 :25 ])
134
+ length := binary .BigEndian .Uint64 (data [25 :33 ])
135
+ chunkData := data [33 :]
136
+
137
+ return BatchDataChunk {
138
+ Start : start ,
139
+ End : end ,
140
+ Index : index ,
141
+ Length : length ,
142
+ ChunkData : chunkData ,
143
+ }, nil
107
144
}
0 commit comments