Skip to content

Commit 1169a5c

Browse files
authored
fixes (#448)
Signed-off-by: turuslan <[email protected]>
1 parent 4fd60c2 commit 1169a5c

32 files changed

+446
-1599
lines changed

CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ set(
1818

1919
include("cmake/Hunter/init.cmake")
2020
HunterGate(
21-
URL "https://github.com/soramitsu/soramitsu-hunter/archive/tags/v0.23.257-soramitsu7.tar.gz"
22-
SHA1 "24f3cae2b6b3212b87daf643cdaad0f9afc1b54b"
21+
URL "https://github.com/soramitsu/soramitsu-hunter/archive/tags/v0.23.257-soramitsu13.tar.gz"
22+
SHA1 "8c88d8bac2dee771926b84a6e28642a267f88ea8"
2323
LOCAL
2424
)
2525

cmake/Hunter/config.cmake

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ hunter_config(
1717
)
1818

1919
hunter_config(libp2p
20-
URL https://github.com/soramitsu/cpp-libp2p/archive/7c9d83bf0760a5f653d86ddbb00645414c61d4fc.tar.gz
21-
SHA1 f4408541230f4953678d1871096786cba2f5fcef
20+
URL https://github.com/soramitsu/cpp-libp2p/archive/91d58f28bb8cbce06fd717082fa2b4274a33ae07.tar.gz
21+
SHA1 84563a18f0725258550b1d1f576d6b2ceb87660f
2222
CMAKE_ARGS TESTING=OFF EXAMPLES=OFF EXPOSE_MOCKS=ON
2323
KEEP_PACKAGE_SOURCES
2424
)

core/api/full_node/make.cpp

+113-65
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "node/pubsub_gate.hpp"
2222
#include "primitives/tipset/chain.hpp"
2323
#include "proofs/impl/proof_engine_impl.hpp"
24+
#include "storage/car/car.hpp"
2425
#include "storage/hamt/hamt.hpp"
2526
#include "vm/actor/builtin/states/account/account_actor_state.hpp"
2627
#include "vm/actor/builtin/states/init/init_actor_state.hpp"
@@ -35,6 +36,7 @@
3536
#include "vm/actor/builtin/v0/market/market_actor.hpp"
3637
#include "vm/actor/builtin/v5/market/validate.hpp"
3738
#include "vm/actor/builtin/v5/miner/monies.hpp"
39+
#include "vm/actor/builtin/v5/miner/state.hpp"
3840
#include "vm/interpreter/interpreter.hpp"
3941
#include "vm/message/impl/message_signer_impl.hpp"
4042
#include "vm/message/message.hpp"
@@ -163,6 +165,7 @@ namespace fc::api {
163165
};
164166

165167
outcome::result<std::vector<SectorInfo>> getSectorsForWinningPoSt(
168+
NetworkVersion network,
166169
const Address &miner,
167170
const MinerActorStatePtr &state,
168171
const Randomness &post_rand,
@@ -174,6 +177,11 @@ namespace fc::api {
174177
OUTCOME_TRY(deadline, deadline_cid.get());
175178
OUTCOME_TRY(deadline->partitions.visit([&](auto, auto &part) {
176179
for (auto sector : part->sectors) {
180+
if (network >= NetworkVersion::kVersion7) {
181+
if (part->terminated.has(sector) || part->unproven.has(sector)) {
182+
continue;
183+
}
184+
}
177185
if (!part->faults.has(sector)) {
178186
sectors_bitset.insert(sector);
179187
}
@@ -205,6 +213,7 @@ namespace fc::api {
205213
std::shared_ptr<FullNodeApi> makeImpl(
206214
std::shared_ptr<FullNodeApi> api,
207215
std::shared_ptr<ChainStore> chain_store,
216+
IpldPtr markets_ipld,
208217
const std::string &network_name,
209218
std::shared_ptr<WeightCalculator> weight_calculator,
210219
const EnvironmentContext &env_context,
@@ -357,6 +366,43 @@ namespace fc::api {
357366
return weight_calculator->calculateWeight(*tipset);
358367
}};
359368

369+
auto retrievalQuery{[=](const Address &miner,
370+
const CID &root,
371+
const boost::optional<CID> &piece,
372+
auto cb) {
373+
OUTCOME_CB(auto minfo, api->StateMinerInfo(miner, {}));
374+
RetrievalPeer peer;
375+
peer.address = miner;
376+
OUTCOME_CB(peer.peer_id, PeerId::fromBytes(minfo.peer_id));
377+
retrieval_market_client->query(peer, {root, {piece}}, [=](auto _res) {
378+
OUTCOME_CB(auto res, _res);
379+
std::string error;
380+
switch (res.response_status) {
381+
case markets::retrieval::QueryResponseStatus::kQueryResponseAvailable:
382+
break;
383+
case markets::retrieval::QueryResponseStatus::
384+
kQueryResponseUnavailable:
385+
error = "retrieval query offer was unavailable: " + res.message;
386+
break;
387+
case markets::retrieval::QueryResponseStatus::kQueryResponseError:
388+
error = "retrieval query offer errored: " + res.message;
389+
break;
390+
}
391+
cb(QueryOffer{
392+
error,
393+
root,
394+
piece,
395+
res.item_size,
396+
res.unseal_price + res.min_price_per_byte * res.item_size,
397+
res.unseal_price,
398+
res.payment_interval,
399+
res.interval_increase,
400+
res.payment_address,
401+
peer,
402+
});
403+
});
404+
}};
405+
360406
api->ClientFindData = waitCb<std::vector<QueryOffer>>(
361407
[=](auto &&root_cid, auto &&piece_cid, auto &&cb) {
362408
OUTCOME_CB(auto peers, market_discovery->getPeers(root_cid));
@@ -371,71 +417,40 @@ namespace fc::api {
371417
}
372418

373419
auto waiter = std::make_shared<
374-
AsyncWaiter<RetrievalPeer, outcome::result<QueryResponse>>>(
420+
AsyncWaiter<RetrievalPeer, outcome::result<QueryOffer>>>(
375421
peers.size(), [=](auto all_calls) {
376422
std::vector<QueryOffer> result;
377423
for (const auto &[peer, maybe_response] : all_calls) {
378424
if (maybe_response.has_error()) {
379425
logger->error("Error when query peer {}",
380426
maybe_response.error().message());
381427
} else {
382-
auto response{maybe_response.value()};
383-
std::string error_message;
384-
switch (response.response_status) {
385-
case markets::retrieval::QueryResponseStatus::
386-
kQueryResponseAvailable:
387-
break;
388-
case markets::retrieval::QueryResponseStatus::
389-
kQueryResponseUnavailable:
390-
error_message =
391-
"retrieval query offer was unavailable: "
392-
+ response.message;
393-
break;
394-
case markets::retrieval::QueryResponseStatus::
395-
kQueryResponseError:
396-
error_message = "retrieval query offer errored: "
397-
+ response.message;
398-
break;
399-
}
400-
401-
result.emplace_back(QueryOffer{
402-
error_message,
403-
root_cid,
404-
piece_cid,
405-
response.item_size,
406-
response.unseal_price
407-
+ response.min_price_per_byte * response.item_size,
408-
response.unseal_price,
409-
response.payment_interval,
410-
response.interval_increase,
411-
response.payment_address,
412-
peer});
428+
result.emplace_back(maybe_response.value());
413429
}
414430
}
415431
cb(result);
416432
});
417433
for (const auto &peer : peers) {
418-
OUTCOME_CB1(retrieval_market_client->query(
419-
peer, {root_cid, {piece_cid}}, waiter->on(peer)));
434+
retrievalQuery(peer.address, root_cid, piece_cid, waiter->on(peer));
420435
}
421436
});
422437

423438
// TODO(turuslan): FIL-165 implement method
424439
api->ClientHasLocal = {};
425-
// TODO(turuslan): FIL-165 implement method
426-
api->ClientImport = {};
427-
// TODO(turuslan): FIL-165 implement method
428-
api->ClientListImports = {};
440+
api->ClientMinerQueryOffer = waitCb<QueryOffer>(retrievalQuery);
429441
// TODO(turuslan): FIL-165 implement method
430442
api->ClientQueryAsk = {};
431443

432444
/**
433445
* Initiates the retrieval deal of a file in retrieval market.
434446
*/
435-
api->ClientRetrieve = waitCb<None>(
436-
[retrieval_market_client](auto &&order, auto &&file_ref, auto &&cb) {
447+
api->ClientRetrieve =
448+
waitCb<None>([=](auto order, auto &&file_ref, auto &&cb) {
449+
if (!file_ref.is_car) {
450+
return cb(ERROR_TEXT("ClientRetrieve unixfs not implemented"));
451+
}
437452
if (order.size == 0) {
438-
cb(ERROR_TEXT("Cannot make retrieval deal for zero bytes"));
453+
return cb(ERROR_TEXT("Cannot make retrieval deal for zero bytes"));
439454
}
440455
auto price_per_byte = bigdiv(order.total, order.size);
441456
DealProposalParams params{
@@ -445,22 +460,28 @@ namespace fc::api {
445460
.payment_interval = order.payment_interval,
446461
.payment_interval_increase = order.payment_interval_increase,
447462
.unseal_price = order.unseal_price};
463+
if (!order.peer) {
464+
OUTCOME_CB(auto info, api->StateMinerInfo(order.miner, {}));
465+
OUTCOME_CB(auto id, PeerId::fromBytes(info.peer_id));
466+
order.peer = RetrievalPeer{order.miner, std::move(id), {}};
467+
}
448468
OUTCOME_CB1(retrieval_market_client->retrieve(
449469
order.root,
450470
params,
451471
order.total,
452-
order.peer,
472+
*order.peer,
453473
order.client,
454474
order.miner,
455-
[cb{std::move(cb)}](outcome::result<void> res) {
475+
[=, cb{std::move(cb)}](outcome::result<void> res) {
456476
if (res.has_error()) {
457477
logger->error("Error in ClientRetrieve {}",
458478
res.error().message());
459-
cb(res.error());
460-
} else {
461-
logger->info("retrieval deal proposed");
462-
cb(outcome::success());
479+
return cb(res.error());
463480
}
481+
logger->info("retrieval deal done");
482+
OUTCOME_CB1(storage::car::makeSelectiveCar(
483+
*markets_ipld, {{order.root, {}}}, file_ref.path));
484+
cb(outcome::success());
464485
}));
465486
});
466487

@@ -472,12 +493,18 @@ namespace fc::api {
472493
api->GasEstimateGasPremium = {[=](auto max_blocks, auto &, auto, auto &) {
473494
return mpool->estimateGasPremium(max_blocks);
474495
}};
475-
api->GasEstimateMessageGas = {
476-
[=](auto msg, auto &spec, auto &) -> outcome::result<UnsignedMessage> {
477-
OUTCOME_TRY(mpool->estimate(
478-
msg, spec ? spec->max_fee : storage::mpool::kDefaultMaxFee));
479-
return msg;
480-
}};
496+
api->GasEstimateMessageGas = [=](auto msg, auto &spec, auto &tsk)
497+
-> outcome::result<UnsignedMessage> {
498+
if (msg.from.isId()) {
499+
OUTCOME_TRY(context, tipsetContext(tsk));
500+
OUTCOME_TRYA(msg.from,
501+
vm::runtime::resolveKey(
502+
context.state_tree, context, msg.from, false));
503+
}
504+
OUTCOME_TRY(mpool->estimate(
505+
msg, spec ? spec->max_fee : storage::mpool::kDefaultMaxFee));
506+
return msg;
507+
};
481508

482509
api->MarketReserveFunds = {[=](const Address &wallet,
483510
const Address &address,
@@ -573,7 +600,11 @@ namespace fc::api {
573600
seed)};
574601
OUTCOME_CB(info.sectors,
575602
getSectorsForWinningPoSt(
576-
miner, miner_state, post_rand, lookback));
603+
getNetworkVersion(context.tipset->epoch()),
604+
miner,
605+
miner_state,
606+
post_rand,
607+
lookback));
577608
if (info.sectors.empty()) {
578609
return cb(boost::none);
579610
}
@@ -761,14 +792,15 @@ namespace fc::api {
761792
OUTCOME_TRY(power_state, context.powerState());
762793
return power_state->claims.keys();
763794
}};
764-
api->StateListActors = {
765-
[=](auto &tipset_key) -> outcome::result<std::vector<Address>> {
766-
OUTCOME_TRY(context, tipsetContext(tipset_key));
767-
OUTCOME_TRY(root, context.state_tree.flush());
768-
adt::Map<Actor, adt::AddressKeyer> actors{root, ipld};
795+
api->StateListActors =
796+
[=](auto &tsk) -> outcome::result<std::vector<Address>> {
797+
OUTCOME_TRY(context, tipsetContext(tsk));
798+
OUTCOME_TRY(root, context.state_tree.flush());
799+
OUTCOME_TRY(info, getCbor<StateTreeImpl::StateRoot>(context, root));
800+
adt::Map<Actor, adt::AddressKeyer> actors{info.actor_tree_root, context};
769801

770-
return actors.keys();
771-
}};
802+
return actors.keys();
803+
};
772804
api->StateMarketBalance = {
773805
[=](auto &address, auto &tipset_key) -> outcome::result<MarketBalance> {
774806
OUTCOME_TRY(context, tipsetContext(tipset_key));
@@ -834,6 +866,22 @@ namespace fc::api {
834866
}
835867
return sectors;
836868
};
869+
api->StateMinerAvailableBalance =
870+
[=](auto &miner, auto &tsk) -> outcome::result<TokenAmount> {
871+
OUTCOME_TRY(context, tipsetContext(tsk));
872+
OUTCOME_TRY(actor, context.state_tree.get(miner));
873+
OUTCOME_TRY(state, getCbor<MinerActorStatePtr>(context, actor.head));
874+
// TODO(m.tagirov): older miner actor versions
875+
OUTCOME_TRY(vested,
876+
vm::actor::builtin::v5::miner::checkVestedFunds(
877+
state, context.tipset->height()));
878+
auto available{vm::actor::builtin::v5::miner::getAvailableBalance(
879+
state, actor.balance)};
880+
if (!available) {
881+
return ERROR_TEXT("negative unlocked balance");
882+
}
883+
return vested + *available;
884+
};
837885
api->StateMinerDeadlines = {
838886
[=](auto &address,
839887
auto &tipset_key) -> outcome::result<std::vector<Deadline>> {
@@ -955,7 +1003,7 @@ namespace fc::api {
9551003
OUTCOME_TRY(context, tipsetContext(tsk));
9561004
OUTCOME_TRY(sector_size, getSectorSize(precommit.registered_proof));
9571005
OUTCOME_TRY(market, context.marketState());
958-
// TODO(turuslan): older market actor versions
1006+
// TODO(m.tagirov): older market actor versions
9591007
OUTCOME_TRY(
9601008
weights,
9611009
vm::actor::builtin::v5::market::validate(market,
@@ -970,7 +1018,7 @@ namespace fc::api {
9701018
weights.space_time_verified)};
9711019
OUTCOME_TRY(power, context.powerState());
9721020
OUTCOME_TRY(reward, context.rewardState());
973-
// TODO(turuslan): older miner actor versions
1021+
// TODO(m.tagirov): older miner actor versions
9741022
return kInitialPledgeNum
9751023
* vm::actor::builtin::v5::miner::preCommitDepositForPower(
9761024
reward->this_epoch_reward_smoothed,
@@ -985,7 +1033,7 @@ namespace fc::api {
9851033
OUTCOME_TRY(context, tipsetContext(tsk));
9861034
OUTCOME_TRY(sector_size, getSectorSize(precommit.registered_proof));
9871035
OUTCOME_TRY(market, context.marketState());
988-
// TODO(turuslan): older market actor versions
1036+
// TODO(m.tagirov): older market actor versions
9891037
OUTCOME_TRY(
9901038
weights,
9911039
vm::actor::builtin::v5::market::validate(market,
@@ -1005,7 +1053,7 @@ namespace fc::api {
10051053
env_context.circulating->circulating(
10061054
std::make_shared<StateTreeImpl>(std::move(context.state_tree)),
10071055
context.tipset->epoch()));
1008-
// TODO(turuslan): older miner actor versions
1056+
// TODO(m.tagirov): older miner actor versions
10091057
return kInitialPledgeNum
10101058
* vm::actor::builtin::v5::miner::initialPledgeForPower(
10111059
circ,

core/api/full_node/make.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ namespace fc::api {
3939
std::shared_ptr<FullNodeApi> makeImpl(
4040
std::shared_ptr<FullNodeApi> api,
4141
std::shared_ptr<ChainStore> chain_store,
42+
IpldPtr markets_ipld,
4243
const std::string &network_name,
4344
std::shared_ptr<WeightCalculator> weight_calculator,
4445
const EnvironmentContext &env_context,

0 commit comments

Comments
 (0)