Skip to content

Commit d8e5de0

Browse files
authored
update block validator (#547)
Signed-off-by: turuslan <[email protected]>
1 parent 1f8cfe5 commit d8e5de0

Some content is hidden

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

61 files changed

+793
-1706
lines changed

core/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ add_subdirectory(markets)
1818
add_subdirectory(miner)
1919
add_subdirectory(node)
2020
add_subdirectory(paych)
21-
add_subdirectory(power)
2221
add_subdirectory(primitives)
2322
add_subdirectory(proofs)
2423
add_subdirectory(remote_worker)

core/api/full_node/make.cpp

Lines changed: 15 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
#include "adt/stop.hpp"
1313
#include "api/version.hpp"
14+
#include "blockchain/block_validator/eligible.hpp"
15+
#include "blockchain/block_validator/win_sectors.hpp"
1416
#include "blockchain/production/block_producer.hpp"
1517
#include "cbor_blake/ipld_version.hpp"
1618
#include "common/logger.hpp"
@@ -21,6 +23,7 @@
2123
#include "markets/retrieval/protocols/retrieval_protocol.hpp"
2224
#include "node/node_version.hpp"
2325
#include "node/pubsub_gate.hpp"
26+
#include "primitives/block/rand.hpp"
2427
#include "primitives/tipset/chain.hpp"
2528
#include "proofs/impl/proof_engine_impl.hpp"
2629
#include "storage/car/car.hpp"
@@ -60,10 +63,6 @@
6063
namespace fc::api {
6164
using connection_t = boost::signals2::connection;
6265
using InterpreterResult = vm::interpreter::Result;
63-
using common::Logger;
64-
using crypto::randomness::DomainSeparationTag;
65-
using crypto::signature::BlsSignature;
66-
using libp2p::peer::PeerId;
6766
using markets::retrieval::DealProposalParams;
6867
using markets::retrieval::QueryResponse;
6968
using node::kNodeVersion;
@@ -95,14 +94,6 @@ namespace fc::api {
9594
using vm::toolchain::Toolchain;
9695
using vm::version::getNetworkVersion;
9796

98-
// TODO (turuslan): reuse for block validation
99-
inline bool minerHasMinPower(const StoragePower &claim_qa,
100-
size_t min_power_miners) {
101-
return min_power_miners < kConsensusMinerMinMiners
102-
? !claim_qa.is_zero()
103-
: claim_qa > kConsensusMinerMinPower;
104-
}
105-
10697
void beaconEntriesForBlock(const DrandSchedule &schedule,
10798
Beaconizer &beaconizer,
10899
ChainEpoch epoch,
@@ -168,53 +159,6 @@ namespace fc::api {
168159
}
169160
};
170161

171-
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
172-
outcome::result<std::vector<SectorInfo>> getSectorsForWinningPoSt(
173-
NetworkVersion network,
174-
const Address &miner,
175-
const MinerActorStatePtr &state,
176-
const Randomness &post_rand,
177-
const IpldPtr &ipld) {
178-
std::vector<SectorInfo> sectors;
179-
RleBitset sectors_bitset;
180-
OUTCOME_TRY(deadlines, state->deadlines.get());
181-
for (const auto &deadline_cid : deadlines.due) {
182-
OUTCOME_TRY(deadline, deadline_cid.get());
183-
OUTCOME_TRY(deadline->partitions.visit([&](auto, auto &part) {
184-
for (auto sector : part->sectors) {
185-
if (network >= NetworkVersion::kVersion7) {
186-
if (part->terminated.has(sector) || part->unproven.has(sector)) {
187-
continue;
188-
}
189-
}
190-
if (!part->faults.has(sector)) {
191-
sectors_bitset.insert(sector);
192-
}
193-
}
194-
return outcome::success();
195-
}));
196-
}
197-
if (!sectors_bitset.empty()) {
198-
OUTCOME_TRY(miner_info, state->getInfo());
199-
OUTCOME_TRY(
200-
win_type,
201-
getRegisteredWinningPoStProof(miner_info->window_post_proof_type));
202-
static auto proofs{std::make_shared<proofs::ProofEngineImpl>()};
203-
OUTCOME_TRY(
204-
indices,
205-
proofs->generateWinningPoStSectorChallenge(
206-
win_type, miner.getId(), post_rand, sectors_bitset.size()));
207-
std::vector<uint64_t> sector_ids{sectors_bitset.begin(),
208-
sectors_bitset.end()};
209-
for (auto &i : indices) {
210-
OUTCOME_TRY(sector, state->sectors.sectors.get(sector_ids[i]));
211-
sectors.push_back(
212-
{sector.seal_proof, sector.sector, sector.sealed_cid});
213-
}
214-
}
215-
return sectors;
216-
}
217-
218162
// NOLINTNEXTLINE(hicpp-function-size,readability-function-cognitive-complexity,readability-function-size,google-readability-function-size)
219163
std::shared_ptr<FullNodeApi> makeImpl(
220164
std::shared_ptr<FullNodeApi> api,
@@ -635,19 +579,19 @@ namespace fc::api {
635579
}
636580
OUTCOME_CB(auto miner_state,
637581
getCbor<MinerActorStatePtr>(lookback, actor->head));
638-
OUTCOME_CB(auto seed, codec::cbor::encode(miner));
639-
auto post_rand{crypto::randomness::drawRandomness(
640-
info.beacon().data,
641-
DomainSeparationTag::WinningPoStChallengeSeed,
582+
const BlockRand rand{
583+
miner,
642584
epoch,
643-
seed)};
585+
info.beacons,
586+
info.prev_beacon,
587+
*context.tipset,
588+
};
644589
OUTCOME_CB(info.sectors,
645590
getSectorsForWinningPoSt(
646591
getNetworkVersion(context.tipset->epoch()),
647592
miner,
648593
miner_state,
649-
post_rand,
650-
lookback));
594+
rand.win));
651595
if (info.sectors.empty()) {
652596
return cb(boost::none);
653597
}
@@ -658,8 +602,11 @@ namespace fc::api {
658602
OUTCOME_CB(auto miner_info, miner_state->getInfo());
659603
OUTCOME_CB(info.worker, context.accountKey(miner_info->worker));
660604
info.sector_size = miner_info->sector_size;
661-
info.has_min_power = minerHasMinPower(
662-
claim->qa_power, power_state->num_miners_meeting_min_power);
605+
OUTCOME_CB(info.has_min_power,
606+
minerEligibleToMine(miner,
607+
lookback.tipset,
608+
context.tipset,
609+
context.state_tree));
663610
cb(std::move(info));
664611
});
665612
};

core/blockchain/block_validator/CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44
#
55

66
add_library(block_validator
7-
impl/block_validator_impl.cpp
8-
impl/syntax_rules.cpp
9-
impl/consensus_rules.cpp
7+
validator.cpp
108
)
119
target_link_libraries(block_validator
1210
bls_provider
1311
outcome
1412
address
1513
clock
1614
interpreter
15+
map_prefix
1716
tipset
18-
power_table
1917
)

core/blockchain/block_validator/block_validator.hpp

Lines changed: 0 additions & 33 deletions
This file was deleted.

core/blockchain/block_validator/block_validator_scenarios.hpp

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/**
2+
* Copyright Soramitsu Co., Ltd. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#pragma once
7+
8+
#include "cbor_blake/ipld_version.hpp"
9+
#include "primitives/tipset/tipset.hpp"
10+
#include "vm/actor/builtin/states/miner/miner_actor_state.hpp"
11+
#include "vm/actor/builtin/states/storage_power/storage_power_actor_state.hpp"
12+
#include "vm/actor/builtin/types/storage_power/policy.hpp"
13+
#include "vm/state/impl/state_tree_impl.hpp"
14+
15+
namespace fc::blockchain::block_validator {
16+
using primitives::address::Address;
17+
using primitives::tipset::TipsetCPtr;
18+
using vm::actor::kStoragePowerAddress;
19+
using vm::actor::builtin::states::Claim;
20+
using vm::actor::builtin::states::MinerActorStatePtr;
21+
using vm::actor::builtin::states::PowerActorStatePtr;
22+
using vm::state::StateTreeImpl;
23+
24+
inline bool minerHasMinPower(const PowerActorStatePtr &state,
25+
const Claim &claim) {
26+
const auto &power{state.actor_version == ActorVersion::kVersion0
27+
? claim.qa_power
28+
: claim.raw_power};
29+
return state->num_miners_meeting_min_power < kConsensusMinerMinMiners
30+
? !power.is_zero()
31+
: power > vm::actor::builtin::types::storage_power::
32+
kConsensusMinerMinPower;
33+
}
34+
35+
inline outcome::result<bool> minerEligibleToMine(const Address &miner,
36+
const TipsetCPtr &lookback,
37+
const TipsetCPtr &parent,
38+
StateTreeImpl &parent_tree) {
39+
StateTreeImpl lookback_tree{
40+
withVersion(parent_tree.getStore(), lookback->height()),
41+
lookback->getParentStateRoot()};
42+
OUTCOME_TRY(lookback_power_actor, lookback_tree.get(kStoragePowerAddress));
43+
OUTCOME_TRY(lookback_power,
44+
getCbor<PowerActorStatePtr>(lookback_tree.getStore(),
45+
lookback_power_actor.head));
46+
OUTCOME_TRY(lookback_claim, lookback_power->getClaim(miner));
47+
if (!minerHasMinPower(lookback_power, *lookback_claim)) {
48+
return false;
49+
}
50+
if (vm::version::getNetworkVersion(parent->height())
51+
<= vm::version::NetworkVersion::kVersion3) {
52+
return true;
53+
}
54+
OUTCOME_TRY(parent_power_actor, parent_tree.get(kStoragePowerAddress));
55+
OUTCOME_TRY(parent_power,
56+
getCbor<PowerActorStatePtr>(parent_tree.getStore(),
57+
parent_power_actor.head));
58+
OUTCOME_TRY(parent_claim, parent_power->tryGetClaim(miner));
59+
if (!parent_claim || (**parent_claim).qa_power <= 0) {
60+
return false;
61+
}
62+
OUTCOME_TRY(parent_miner_actor, parent_tree.get(miner));
63+
OUTCOME_TRY(parent_miner,
64+
getCbor<MinerActorStatePtr>(parent_tree.getStore(),
65+
parent_miner_actor.head));
66+
if (!parent_miner->fee_debt.is_zero()) {
67+
return false;
68+
}
69+
OUTCOME_TRY(parent_miner_info, parent_miner->getInfo());
70+
if (parent->height() <= parent_miner_info->consensus_fault_elapsed) {
71+
return false;
72+
}
73+
return true;
74+
}
75+
} // namespace fc::blockchain::block_validator
76+
77+
namespace fc {
78+
using blockchain::block_validator::minerEligibleToMine;
79+
} // namespace fc

0 commit comments

Comments
 (0)