66#pragma once
77
88#include < libp2p/peer/protocol.hpp>
9+ #include " codec/cbor/cbor_codec.hpp"
910#include " codec/cbor/streams_annotation.hpp"
1011#include " crypto/signature/signature.hpp"
1112#include " primitives/address/address.hpp"
1516#include " primitives/types.hpp"
1617
1718namespace fc ::markets::storage {
18-
19+ using codec::cbor::CborDecodeStream;
20+ using codec::cbor::CborEncodeStream;
1921 using crypto::signature::Signature;
2022 using primitives::ChainEpoch;
2123 using primitives::TokenAmount;
2224 using primitives::address::Address;
2325 using primitives::piece::PaddedPieceSize;
2426
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" ;
2731
32+ /* *
33+ * StorageAsk defines the parameters by which a miner will choose to accept or
34+ * reject a deal.
35+ */
2836 struct StorageAsk {
2937 // Price per GiB / Epoch
3038 TokenAmount price;
3139 TokenAmount verified_price;
3240 PaddedPieceSize min_piece_size;
3341 PaddedPieceSize max_piece_size;
3442 Address miner;
35- ChainEpoch timestamp;
36- ChainEpoch expiry;
37- uint64_t seq_no;
43+ ChainEpoch timestamp{} ;
44+ ChainEpoch expiry{} ;
45+ uint64_t seq_no{} ;
3846 };
3947
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,
4152 price,
4253 verified_price,
4354 min_piece_size,
@@ -47,12 +58,101 @@ namespace fc::markets::storage {
4758 expiry,
4859 seq_no)
4960
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+
5090 struct SignedStorageAsk {
91+ virtual ~SignedStorageAsk () = default ;
92+
5193 StorageAsk ask;
5294 Signature signature;
95+
96+ /* * Returns response digset */
97+ virtual outcome::result<Bytes> getDigest () const = 0;
5398 };
5499
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+ }
56156
57157 /* *
58158 * AskRequest is a request for current ask parameters for a given miner
@@ -61,16 +161,95 @@ namespace fc::markets::storage {
61161 Address miner;
62162 };
63163
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+ }
65183
66184 /* *
67185 * AskResponse is the response sent over the network in response to an ask
68186 * request
69187 */
70188 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_;
72211 };
73212
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+ }
75254
76255} // namespace fc::markets::storage
0 commit comments