6
6
#pragma once
7
7
8
8
#include < libp2p/peer/protocol.hpp>
9
+ #include " codec/cbor/cbor_codec.hpp"
9
10
#include " codec/cbor/streams_annotation.hpp"
10
11
#include " crypto/signature/signature.hpp"
11
12
#include " primitives/address/address.hpp"
15
16
#include " primitives/types.hpp"
16
17
17
18
namespace fc ::markets::storage {
18
-
19
+ using codec::cbor::CborDecodeStream;
20
+ using codec::cbor::CborEncodeStream;
19
21
using crypto::signature::Signature;
20
22
using primitives::ChainEpoch;
21
23
using primitives::TokenAmount;
22
24
using primitives::address::Address;
23
25
using primitives::piece::PaddedPieceSize;
24
26
25
- const libp2p::peer::Protocol kAskProtocolId0 = " /fil/storage/ask/1.0.1" ;
26
- const libp2p::peer::Protocol kAskProtocolId = " /fil/storage/ask/1.1.1" ;
27
+ const libp2p::peer::Protocol kAskProtocolId_v1_0_1 = " /fil/storage/ask/1.0.1" ;
28
+
29
+ /* * Protocol 1.1.1 uses named cbor */
30
+ const libp2p::peer::Protocol kAskProtocolId_v1_1_0 = " /fil/storage/ask/1.1.0" ;
27
31
32
+ /* *
33
+ * StorageAsk defines the parameters by which a miner will choose to accept or
34
+ * reject a deal.
35
+ */
28
36
struct StorageAsk {
29
37
// Price per GiB / Epoch
30
38
TokenAmount price;
31
39
TokenAmount verified_price;
32
40
PaddedPieceSize min_piece_size;
33
41
PaddedPieceSize max_piece_size;
34
42
Address miner;
35
- ChainEpoch timestamp;
36
- ChainEpoch expiry;
37
- uint64_t seq_no;
43
+ ChainEpoch timestamp{} ;
44
+ ChainEpoch expiry{} ;
45
+ uint64_t seq_no{} ;
38
46
};
39
47
40
- CBOR_TUPLE (StorageAsk,
48
+ /* * StorageAsk used in V1.0.1 */
49
+ struct StorageAskV1_0_1 : public StorageAsk {};
50
+
51
+ CBOR_TUPLE (StorageAskV1_0_1,
41
52
price,
42
53
verified_price,
43
54
min_piece_size,
@@ -47,12 +58,101 @@ namespace fc::markets::storage {
47
58
expiry,
48
59
seq_no)
49
60
61
+ /* * StorageAsk used in V1.1.0. Cbores with field names. */
62
+ struct StorageAskV1_1_0 : public StorageAsk {};
63
+
64
+ inline CBOR2_ENCODE (StorageAskV1_1_0) {
65
+ auto m{CborEncodeStream::orderedMap ()};
66
+ m[" Price" ] << v.price ;
67
+ m[" VerifiedPrice" ] << v.verified_price ;
68
+ m[" MinPieceSize" ] << v.min_piece_size ;
69
+ m[" MaxPieceSize" ] << v.max_piece_size ;
70
+ m[" Miner" ] << v.miner ;
71
+ m[" Timestamp" ] << v.timestamp ;
72
+ m[" Expiry" ] << v.expiry ;
73
+ m[" SeqNo" ] << v.seq_no ;
74
+ return s << m;
75
+ }
76
+
77
+ inline CBOR2_DECODE (StorageAskV1_1_0) {
78
+ auto m{s.map ()};
79
+ CborDecodeStream::named (m, " Price" ) >> v.price ;
80
+ CborDecodeStream::named (m, " VerifiedPrice" ) >> v.verified_price ;
81
+ CborDecodeStream::named (m, " MinPieceSize" ) >> v.min_piece_size ;
82
+ CborDecodeStream::named (m, " MaxPieceSize" ) >> v.max_piece_size ;
83
+ CborDecodeStream::named (m, " Miner" ) >> v.miner ;
84
+ CborDecodeStream::named (m, " Timestamp" ) >> v.timestamp ;
85
+ CborDecodeStream::named (m, " Expiry" ) >> v.expiry ;
86
+ CborDecodeStream::named (m, " SeqNo" ) >> v.seq_no ;
87
+ return s;
88
+ }
89
+
50
90
struct SignedStorageAsk {
91
+ virtual ~SignedStorageAsk () = default ;
92
+
51
93
StorageAsk ask;
52
94
Signature signature;
95
+
96
+ /* * Returns response digset */
97
+ virtual outcome::result<Bytes> getDigest () const = 0;
53
98
};
54
99
55
- CBOR_TUPLE (SignedStorageAsk, ask, signature)
100
+ /* * SignedStorageAsk used in V1.0.1 */
101
+ struct SignedStorageAskV1_0_1 : public SignedStorageAsk {
102
+ SignedStorageAskV1_0_1 () = default ;
103
+ explicit SignedStorageAskV1_0_1 (StorageAsk ask) {
104
+ this ->ask = std::move (ask);
105
+ }
106
+ SignedStorageAskV1_0_1 (StorageAsk ask, Signature signature) {
107
+ this ->ask = std::move (ask);
108
+ this ->signature = std::move (signature);
109
+ }
110
+
111
+ outcome::result<Bytes> getDigest () const override {
112
+ return codec::cbor::encode (StorageAskV1_0_1{this ->ask });
113
+ };
114
+ };
115
+
116
+ inline CBOR2_ENCODE (SignedStorageAskV1_0_1) {
117
+ return s << (CborEncodeStream::list ()
118
+ << StorageAskV1_0_1{v.ask } << v.signature );
119
+ }
120
+ inline CBOR2_DECODE (SignedStorageAskV1_0_1) {
121
+ auto cbor_list{s.list ()};
122
+ v.ask = cbor_list.get <StorageAskV1_0_1>();
123
+ cbor_list >> v.signature ;
124
+ return s;
125
+ }
126
+
127
+ /* * SignedStorageAsk used in V1.1.0 with named fields. */
128
+ struct SignedStorageAskV1_1_0 : public SignedStorageAsk {
129
+ SignedStorageAskV1_1_0 () = default ;
130
+ explicit SignedStorageAskV1_1_0 (StorageAsk ask) {
131
+ this ->ask = std::move (ask);
132
+ }
133
+ SignedStorageAskV1_1_0 (StorageAsk ask, Signature signature) {
134
+ this ->ask = std::move (ask);
135
+ this ->signature = std::move (signature);
136
+ }
137
+
138
+ outcome::result<Bytes> getDigest () const override {
139
+ return codec::cbor::encode (StorageAskV1_1_0{this ->ask });
140
+ };
141
+ };
142
+
143
+ inline CBOR2_ENCODE (SignedStorageAskV1_1_0) {
144
+ auto m{CborEncodeStream::orderedMap ()};
145
+ m[" Ask" ] << StorageAskV1_1_0{v.ask };
146
+ m[" Signature" ] << v.signature ;
147
+ return s << m;
148
+ }
149
+
150
+ inline CBOR2_DECODE (SignedStorageAskV1_1_0) {
151
+ auto m{s.map ()};
152
+ v.ask = CborDecodeStream::named (m, " Ask" ).get <StorageAskV1_1_0>();
153
+ CborDecodeStream::named (m, " Signature" ) >> v.signature ;
154
+ return s;
155
+ }
56
156
57
157
/* *
58
158
* AskRequest is a request for current ask parameters for a given miner
@@ -61,16 +161,95 @@ namespace fc::markets::storage {
61
161
Address miner;
62
162
};
63
163
64
- CBOR_TUPLE (AskRequest, miner)
164
+ /* * AskRequest used in V1.0.1 */
165
+ struct AskRequestV1_0_1 : public AskRequest {};
166
+
167
+ CBOR_TUPLE (AskRequestV1_0_1, miner)
168
+
169
+ /* * AskRequest used in V1.1.0. Cbores with field names. */
170
+ struct AskRequestV1_1_0 : public AskRequest {};
171
+
172
+ inline CBOR2_ENCODE (AskRequestV1_1_0) {
173
+ auto m{CborEncodeStream::orderedMap ()};
174
+ m[" Miner" ] << v.miner ;
175
+ return s << m;
176
+ }
177
+
178
+ inline CBOR2_DECODE (AskRequestV1_1_0) {
179
+ auto m{s.map ()};
180
+ CborDecodeStream::named (m, " Miner" ) >> v.miner ;
181
+ return s;
182
+ }
65
183
66
184
/* *
67
185
* AskResponse is the response sent over the network in response to an ask
68
186
* request
69
187
*/
70
188
struct AskResponse {
71
- SignedStorageAsk ask;
189
+ virtual ~AskResponse () = default ;
190
+
191
+ virtual const SignedStorageAsk &ask () const = 0;
192
+ };
193
+
194
+ struct AskResponseV1_0_1 : public AskResponse {
195
+ AskResponseV1_0_1 () = default ;
196
+
197
+ explicit AskResponseV1_0_1 (SignedStorageAskV1_0_1 ask)
198
+ : ask_(std::move(ask)) {}
199
+
200
+ const SignedStorageAsk &ask () const override {
201
+ return ask_;
202
+ }
203
+
204
+ private:
205
+ friend CborEncodeStream &operator <<(CborEncodeStream &,
206
+ const AskResponseV1_0_1 &);
207
+ friend CborDecodeStream &operator >>(CborDecodeStream &,
208
+ AskResponseV1_0_1 &);
209
+
210
+ SignedStorageAskV1_0_1 ask_;
72
211
};
73
212
74
- CBOR_TUPLE (AskResponse, ask)
213
+ inline CBOR2_ENCODE (AskResponseV1_0_1) {
214
+ auto cbor_list = CborEncodeStream::list ();
215
+ cbor_list << v.ask_ ;
216
+ return s << cbor_list;
217
+ }
218
+ inline CBOR2_DECODE (AskResponseV1_0_1) {
219
+ auto cbor_list{s.list ()};
220
+ cbor_list >> v.ask_ ;
221
+ return s;
222
+ }
223
+
224
+ struct AskResponseV1_1_0 : public AskResponse {
225
+ AskResponseV1_1_0 () = default ;
226
+
227
+ explicit AskResponseV1_1_0 (SignedStorageAskV1_1_0 ask)
228
+ : ask_(std::move(ask)) {}
229
+
230
+ const SignedStorageAsk &ask () const override {
231
+ return ask_;
232
+ }
233
+
234
+ private:
235
+ friend CborEncodeStream &operator <<(CborEncodeStream &,
236
+ const AskResponseV1_1_0 &);
237
+ friend CborDecodeStream &operator >>(CborDecodeStream &,
238
+ AskResponseV1_1_0 &);
239
+
240
+ SignedStorageAskV1_1_0 ask_;
241
+ };
242
+
243
+ inline CBOR2_ENCODE (AskResponseV1_1_0) {
244
+ auto m{CborEncodeStream::orderedMap ()};
245
+ m[" Ask" ] << v.ask_ ;
246
+ return s << m;
247
+ }
248
+
249
+ inline CBOR2_DECODE (AskResponseV1_1_0) {
250
+ auto m{s.map ()};
251
+ CborDecodeStream::named (m, " Ask" ) >> v.ask_ ;
252
+ return s;
253
+ }
75
254
76
255
} // namespace fc::markets::storage
0 commit comments