Skip to content

Commit 25ac16d

Browse files
Feature/fip 0027 market label (#670)
* FIP-0027 Label type for utf-8 encoding in markets Signed-off-by: Alexey-N-Chernyshov <[email protected]>
1 parent 7e7ab00 commit 25ac16d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+918
-582
lines changed

cmake/dependencies.cmake

+3
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ find_package(libarchive CONFIG REQUIRED)
8989
hunter_add_package(prometheus-cpp)
9090
find_package(prometheus-cpp CONFIG REQUIRED)
9191

92+
hunter_add_package(utf8)
93+
find_package(utf8 CONFIG REQUIRED)
94+
9295
# Add filecoin_ffi target if building without git submodules
9396
if (NOT BUILD_INTERNAL_DEPS)
9497
find_package(filecoin_ffi REQUIRED)

core/api/full_node/make.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
#include "vm/actor/builtin/v5/miner/monies.hpp"
3838
#include "vm/message/impl/message_signer_impl.hpp"
3939
#include "vm/message/message.hpp"
40-
#include "vm/runtime/impl/tipset_randomness.hpp"
4140
#include "vm/runtime/make_vm.hpp"
4241
#include "vm/state/impl/state_tree_impl.hpp"
4342
#include "vm/toolchain/toolchain.hpp"

core/api/rpc/json.hpp

+30
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "primitives/cid/cid_of_cbor.hpp"
2727
#include "primitives/json_types.hpp"
2828
#include "vm/actor/builtin/types/market/deal.hpp"
29+
#include "vm/actor/builtin/types/market/deal_proposal.hpp"
2930
#include "vm/actor/builtin/types/miner/miner_info.hpp"
3031

3132
namespace fc::common {
@@ -976,6 +977,35 @@ namespace fc::vm::actor::builtin::types {
976977
Get(j, "SlashEpoch", v.slash_epoch);
977978
}
978979

980+
JSON_ENCODE(Universal<DealProposal>) {
981+
Value j{rapidjson::kObjectType};
982+
Set(j, "PieceCID", v->piece_cid, allocator);
983+
Set(j, "PieceSize", v->piece_size, allocator);
984+
Set(j, "VerifiedDeal", v->verified, allocator);
985+
Set(j, "Client", v->client, allocator);
986+
Set(j, "Provider", v->provider, allocator);
987+
Set(j, "StartEpoch", v->start_epoch, allocator);
988+
Set(j, "EndEpoch", v->end_epoch, allocator);
989+
Set(j, "StoragePricePerEpoch", v->storage_price_per_epoch, allocator);
990+
Set(j, "ProviderCollateral", v->provider_collateral, allocator);
991+
Set(j, "ClientCollateral", v->client_collateral, allocator);
992+
return j;
993+
}
994+
995+
JSON_DECODE(Universal<DealProposal>) {
996+
v.actor_version = ActorVersion::kVersion0;
997+
Get(j, "PieceCID", v->piece_cid);
998+
Get(j, "PieceSize", v->piece_size);
999+
Get(j, "VerifiedDeal", v->verified);
1000+
Get(j, "Client", v->client);
1001+
Get(j, "Provider", v->provider);
1002+
Get(j, "StartEpoch", v->start_epoch);
1003+
Get(j, "EndEpoch", v->end_epoch);
1004+
Get(j, "StoragePricePerEpoch", v->storage_price_per_epoch);
1005+
Get(j, "ProviderCollateral", v->provider_collateral);
1006+
Get(j, "ClientCollateral", v->client_collateral);
1007+
}
1008+
9791009
JSON_ENCODE(DealProposal) {
9801010
Value j{rapidjson::kObjectType};
9811011
Set(j, "PieceCID", v.piece_cid, allocator);

core/codec/cbor/streams_annotation.hpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,10 @@
145145
_CBOR_TUPLE_1) \
146146
(op, __VA_ARGS__)
147147

148-
#define CBOR_ENCODE_TUPLE(T, ...) \
149-
CBOR_ENCODE(T, t) { \
150-
return s << (s.list() _CBOR_TUPLE(<<, __VA_ARGS__)); \
148+
#define CBOR_ENCODE_TUPLE(T, ...) \
149+
CBOR_ENCODE(T, t) { \
150+
auto l{s.list()}; \
151+
return s << (l _CBOR_TUPLE(<<, __VA_ARGS__)); \
151152
}
152153

153154
#define CBOR_TUPLE(T, ...) \

core/markets/storage/client/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ target_link_libraries(storage_market_client
1717
logger
1818
piece
1919
signature
20+
market_types
2021
message
2122
tipset
2223
memory_indexed_car

core/markets/storage/client/impl/storage_market_client_impl.cpp

+22-21
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ namespace fc::markets::storage::client {
132132
OUTCOME_EXCEPT(bytes, codec::cbor::encode(deal->proposal_cid));
133133
OUTCOME_CB(
134134
auto signature,
135-
api_->WalletSign(deal->client_deal_proposal.proposal.client, bytes));
135+
api_->WalletSign(deal->client_deal_proposal.proposal->client, bytes));
136136
DealStatusRequestV1_1_0 req{{deal->proposal_cid, signature}};
137137
status_streams_->open({
138138
deal->miner,
@@ -192,7 +192,7 @@ namespace fc::markets::storage::client {
192192
OUTCOME_TRY(all_deals, api_->StateMarketDeals(chain_head->key));
193193
std::vector<StorageDeal> client_deals;
194194
for (const auto &deal : all_deals) {
195-
if (deal.second.proposal.client == address) {
195+
if (deal.second.proposal->client == address) {
196196
client_deals.emplace_back(deal.second);
197197
}
198198
}
@@ -282,19 +282,20 @@ namespace fc::markets::storage::client {
282282
provider_collateral = bigdiv(bounds.min * 12, 10);
283283
}
284284

285-
DealProposal deal_proposal{
286-
.piece_cid = comm_p,
287-
.piece_size = piece_size.padded(),
288-
.verified = verified_deal,
289-
.client = client_address,
290-
.provider = provider_info.address,
291-
.label = {},
292-
.start_epoch = start_epoch,
293-
.end_epoch = end_epoch,
294-
.storage_price_per_epoch = price,
295-
.provider_collateral = provider_collateral,
296-
.client_collateral = 0,
297-
};
285+
// TODO (a.chernyshov) change to v8 and label_v8
286+
auto deal_proposal = UniversalDealProposal(ActorVersion::kVersion0);
287+
deal_proposal->piece_cid = comm_p;
288+
deal_proposal->piece_size = piece_size.padded();
289+
deal_proposal->verified = verified_deal;
290+
deal_proposal->client = client_address;
291+
deal_proposal->provider = provider_info.address;
292+
deal_proposal->label_v0 = {};
293+
deal_proposal->start_epoch = start_epoch;
294+
deal_proposal->end_epoch = end_epoch;
295+
deal_proposal->storage_price_per_epoch = price;
296+
deal_proposal->provider_collateral = provider_collateral;
297+
deal_proposal->client_collateral = 0;
298+
298299
OUTCOME_TRY(signed_proposal, signProposal(client_address, deal_proposal));
299300
auto proposal_cid{signed_proposal.cid()};
300301

@@ -366,7 +367,7 @@ namespace fc::markets::storage::client {
366367
}
367368

368369
outcome::result<ClientDealProposal> StorageMarketClientImpl::signProposal(
369-
const Address &address, const DealProposal &proposal) const {
370+
const Address &address, const UniversalDealProposal &proposal) const {
370371
OUTCOME_TRY(chain_head, api_->ChainHead());
371372
OUTCOME_TRY(key_address, api_->StateAccountKey(address, chain_head->key));
372373
OUTCOME_TRY(proposal_bytes, codec::cbor::encode(proposal));
@@ -380,9 +381,9 @@ namespace fc::markets::storage::client {
380381
OUTCOME_TRY(
381382
maybe_cid,
382383
api_->MarketReserveFunds(
383-
deal->client_deal_proposal.proposal.client,
384-
deal->client_deal_proposal.proposal.client,
385-
deal->client_deal_proposal.proposal.clientBalanceRequirement()));
384+
deal->client_deal_proposal.proposal->client,
385+
deal->client_deal_proposal.proposal->client,
386+
deal->client_deal_proposal.proposal->clientBalanceRequirement()));
386387
return std::move(maybe_cid);
387388
}
388389

@@ -411,7 +412,7 @@ namespace fc::markets::storage::client {
411412
OUTCOME_TRY(publish_message, api_->ChainGetMessage(deal->publish_message));
412413
OUTCOME_TRY(
413414
miner_info,
414-
api_->StateMinerInfo(deal->client_deal_proposal.proposal.provider,
415+
api_->StateMinerInfo(deal->client_deal_proposal.proposal->provider,
415416
msg_state.tipset));
416417
OUTCOME_TRY(from_id_address,
417418
api_->StateLookupID(publish_message.from, msg_state.tipset));
@@ -645,7 +646,7 @@ namespace fc::markets::storage::client {
645646
StorageDealStatus from,
646647
StorageDealStatus to) {
647648
chain_events_->onDealSectorCommitted(
648-
deal->client_deal_proposal.proposal.provider,
649+
deal->client_deal_proposal.proposal->provider,
649650
deal->deal_id,
650651
[self{shared_from_this()}, deal](auto _r) {
651652
SELF_FSM_HALT_ON_ERROR(_r, "onDealSectorCommitted error", deal);

core/markets/storage/client/impl/storage_market_client_impl.hpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "markets/storage/client/client_events.hpp"
2121
#include "markets/storage/client/import_manager/import_manager.hpp"
2222
#include "markets/storage/client/storage_market_client.hpp"
23+
#include "vm/actor/builtin/types/market/deal_proposal.hpp"
24+
#include "vm/actor/builtin/types/universal/universal.hpp"
2325

2426
namespace fc::markets::storage::client {
2527
using api::FullNodeApi;
@@ -37,6 +39,9 @@ namespace fc::markets::storage::client {
3739
using Datastore = fc::storage::face::PersistentMap<Bytes, Bytes>;
3840
using data_transfer::DataTransfer;
3941
using libp2p::connection::StreamOpenQueue;
42+
using vm::actor::builtin::types::Universal;
43+
using UniversalDealProposal =
44+
Universal<vm::actor::builtin::types::market::DealProposal>;
4045

4146
class StorageMarketClientImpl
4247
: public StorageMarketClient,
@@ -97,7 +102,7 @@ namespace fc::markets::storage::client {
97102
const DataRef &data_ref) const;
98103

99104
outcome::result<ClientDealProposal> signProposal(
100-
const Address &address, const DealProposal &proposal) const;
105+
const Address &address, const UniversalDealProposal &proposal) const;
101106

102107
/**
103108
* Ensure client has enough funds. In case of lack of funds add funds

core/markets/storage/mk_protocol.hpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "primitives/types.hpp"
1717
#include "storage/filestore/path.hpp"
1818
#include "vm/actor/builtin/types/market/deal.hpp"
19+
#include "vm/actor/builtin/types/market/deal_proposal.hpp"
20+
#include "vm/actor/builtin/types/universal/universal.hpp"
1921

2022
namespace fc::markets::storage {
2123
using codec::cbor::CborDecodeStream;
@@ -27,6 +29,7 @@ namespace fc::markets::storage {
2729
using primitives::TokenAmount;
2830
using primitives::address::Address;
2931
using primitives::piece::UnpaddedPieceSize;
32+
using vm::actor::builtin::types::Universal;
3033
using vm::actor::builtin::types::market::ClientDealProposal;
3134
using vm::actor::builtin::types::market::DealProposal;
3235
using vm::actor::builtin::types::market::DealState;
@@ -171,7 +174,7 @@ namespace fc::markets::storage {
171174
* StorageDeal is a local combination of a proposal and a current deal state
172175
*/
173176
struct StorageDeal {
174-
DealProposal proposal;
177+
Universal<DealProposal> proposal;
175178
DealState state;
176179
};
177180

core/markets/storage/provider/impl/provider_impl.cpp

+25-25
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,15 @@ namespace fc::markets::storage::provider {
183183

184184
auto unpadded{proofs::padPiece(car_path)};
185185
if (unpadded.padded()
186-
!= deal_context->deal->client_deal_proposal.proposal.piece_size) {
186+
!= deal_context->deal->client_deal_proposal.proposal->piece_size) {
187187
return StorageMarketProviderError::kPieceCIDDoesNotMatch;
188188
}
189189
OUTCOME_TRY(registered_proof, api_->GetProofType(miner_actor_address_, {}));
190190
OUTCOME_TRY(piece_commitment,
191191
piece_io_->generatePieceCommitment(registered_proof, car_path));
192192

193193
if (piece_commitment.first
194-
!= deal_context->deal->client_deal_proposal.proposal.piece_cid) {
194+
!= deal_context->deal->client_deal_proposal.proposal->piece_cid) {
195195
return StorageMarketProviderError::kPieceCIDDoesNotMatch;
196196
}
197197
deal_context->deal->piece_path = car_path.string();
@@ -216,7 +216,7 @@ namespace fc::markets::storage::provider {
216216

217217
// verify client's signature
218218
OUTCOME_TRY(bytes, request.getDigest());
219-
const auto &client_address = deal.client_deal_proposal.proposal.client;
219+
const auto &client_address = deal.client_deal_proposal.proposal->client;
220220
OUTCOME_TRY(verified,
221221
api_->WalletVerify(client_address, bytes, request.signature));
222222
if (!verified) {
@@ -267,23 +267,23 @@ namespace fc::markets::storage::provider {
267267
OUTCOME_TRY(proposal_bytes, codec::cbor::encode(proposal));
268268
OUTCOME_TRY(
269269
verified,
270-
api_->WalletVerify(proposal.client,
270+
api_->WalletVerify(proposal->client,
271271
proposal_bytes,
272272
deal->client_deal_proposal.client_signature));
273273
if (!verified) {
274274
deal->message = "Deal proposal verification failed, wrong signature";
275275
return false;
276276
}
277277

278-
if (proposal.provider != miner_actor_address_) {
278+
if (proposal->provider != miner_actor_address_) {
279279
deal->message =
280280
"Deal proposal verification failed, incorrect provider for deal";
281281
return false;
282282
}
283283

284284
OUTCOME_TRY(chain_head, api_->ChainHead());
285285
if (chain_head->epoch()
286-
> proposal.start_epoch - kDefaultDealAcceptanceBuffer) {
286+
> proposal->start_epoch - kDefaultDealAcceptanceBuffer) {
287287
deal->message =
288288
"Deal proposal verification failed, deal start epoch is too soon "
289289
"or deal already expired";
@@ -292,43 +292,43 @@ namespace fc::markets::storage::provider {
292292

293293
OUTCOME_TRY(ask, stored_ask_->getAsk(miner_actor_address_));
294294
auto min_price = bigdiv(
295-
ask.ask.price * static_cast<uint64_t>(proposal.piece_size), 1 << 30);
296-
if (proposal.storage_price_per_epoch < min_price) {
295+
ask.ask.price * static_cast<uint64_t>(proposal->piece_size), 1 << 30);
296+
if (proposal->storage_price_per_epoch < min_price) {
297297
std::stringstream ss;
298298
ss << "Deal proposal verification failed, storage price per epoch less "
299299
"than asking price: "
300-
<< proposal.storage_price_per_epoch << " < " << min_price;
300+
<< proposal->storage_price_per_epoch << " < " << min_price;
301301
deal->message = ss.str();
302302
return false;
303303
}
304304

305-
if (proposal.piece_size < ask.ask.min_piece_size) {
305+
if (proposal->piece_size < ask.ask.min_piece_size) {
306306
std::stringstream ss;
307307
ss << "Deal proposal verification failed, piece size less than minimum "
308308
"required size: "
309-
<< proposal.piece_size << " < " << ask.ask.min_piece_size;
309+
<< proposal->piece_size << " < " << ask.ask.min_piece_size;
310310
deal->message = ss.str();
311311
return false;
312312
}
313-
if (proposal.piece_size > ask.ask.max_piece_size) {
313+
if (proposal->piece_size > ask.ask.max_piece_size) {
314314
std::stringstream ss;
315315
ss << "Deal proposal verification failed, piece size more than maximum "
316316
"allowed size: "
317-
<< proposal.piece_size << " > " << ask.ask.max_piece_size;
317+
<< proposal->piece_size << " > " << ask.ask.max_piece_size;
318318
deal->message = ss.str();
319319
return false;
320320
}
321321

322322
// This doesn't guarantee that the client won't withdraw / lock those
323323
// funds but it's a decent first filter
324324
OUTCOME_TRY(client_balance,
325-
api_->StateMarketBalance(proposal.client, chain_head->key));
325+
api_->StateMarketBalance(proposal->client, chain_head->key));
326326
TokenAmount available = client_balance.escrow - client_balance.locked;
327-
if (available < proposal.getTotalStorageFee()) {
327+
if (available < proposal->getTotalStorageFee()) {
328328
std::stringstream ss;
329329
ss << "Deal proposal verification failed, client market available "
330330
"balance too small: "
331-
<< available << " < " << proposal.getTotalStorageFee();
331+
<< available << " < " << proposal->getTotalStorageFee();
332332
deal->message = ss.str();
333333
return false;
334334
}
@@ -342,11 +342,11 @@ namespace fc::markets::storage::provider {
342342
OUTCOME_TRY(chain_head, api_->ChainHead());
343343
auto proposal = deal->client_deal_proposal.proposal;
344344
OUTCOME_TRY(worker_info,
345-
api_->StateMinerInfo(proposal.provider, chain_head->key));
345+
api_->StateMinerInfo(proposal->provider, chain_head->key));
346346
OUTCOME_TRY(maybe_cid,
347347
api_->MarketReserveFunds(worker_info.worker,
348-
proposal.provider,
349-
proposal.provider_collateral));
348+
proposal->provider,
349+
proposal->provider_collateral));
350350
return std::move(maybe_cid);
351351
}
352352

@@ -355,7 +355,7 @@ namespace fc::markets::storage::provider {
355355
OUTCOME_TRY(chain_head, api_->ChainHead());
356356
OUTCOME_TRY(
357357
worker_info,
358-
api_->StateMinerInfo(deal->client_deal_proposal.proposal.provider,
358+
api_->StateMinerInfo(deal->client_deal_proposal.proposal->provider,
359359
chain_head->key));
360360
market::PublishStorageDeals::Params params{{deal->client_deal_proposal}};
361361
OUTCOME_TRY(encoded_params, codec::cbor::encode(params));
@@ -441,9 +441,9 @@ namespace fc::markets::storage::provider {
441441
locations[deal->ref.root] = {};
442442
}
443443
OUTCOME_TRY(piece_storage_->addPayloadLocations(
444-
deal->client_deal_proposal.proposal.piece_cid, locations));
444+
deal->client_deal_proposal.proposal->piece_cid, locations));
445445
OUTCOME_TRY(piece_storage_->addDealForPiece(
446-
deal->client_deal_proposal.proposal.piece_cid,
446+
deal->client_deal_proposal.proposal->piece_cid,
447447
DealInfo{.deal_id = deal->deal_id,
448448
.sector_id = piece_location.sector,
449449
.offset = piece_location.offset,
@@ -673,12 +673,12 @@ namespace fc::markets::storage::provider {
673673
FSM_HANDLE_DEFINITION(StorageProviderImpl::onProviderEventDealPublished) {
674674
auto &proposal{deal_context->deal->client_deal_proposal.proposal};
675675
auto maybe_piece_location = sector_blocks_->addPiece(
676-
proposal.piece_size.unpadded(),
676+
proposal->piece_size.unpadded(),
677677
deal_context->deal->piece_path,
678678
mining::types::DealInfo{deal_context->deal->publish_cid,
679679
deal_context->deal->deal_id,
680680
proposal,
681-
{proposal.start_epoch, proposal.end_epoch},
681+
{proposal->start_epoch, proposal->end_epoch},
682682
deal_context->deal->is_fast_retrieval});
683683
FSM_HALT_ON_ERROR(
684684
maybe_piece_location, "Unable to locate piece", deal_context);
@@ -689,7 +689,7 @@ namespace fc::markets::storage::provider {
689689

690690
FSM_HANDLE_DEFINITION(StorageProviderImpl::onProviderEventDealHandedOff) {
691691
chain_events_->onDealSectorCommitted(
692-
deal_context->deal->client_deal_proposal.proposal.provider,
692+
deal_context->deal->client_deal_proposal.proposal->provider,
693693
deal_context->deal->deal_id,
694694
[=](auto _r) {
695695
FSM_HALT_ON_ERROR(_r, "onDealSectorCommitted error", deal_context);

0 commit comments

Comments
 (0)