Skip to content

Commit 51c352b

Browse files
authored
fix randomness (#497)
Signed-off-by: turuslan <[email protected]>
1 parent 6f2fb80 commit 51c352b

File tree

7 files changed

+85
-28
lines changed

7 files changed

+85
-28
lines changed

core/api/full_node/make.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ namespace fc::api {
335335
auto &entropy) -> outcome::result<Randomness> {
336336
std::unique_lock ts_lock{*env_context.ts_branches_mutex};
337337
OUTCOME_TRY(ts_branch, TsBranch::make(ts_load, tipset_key, ts_main));
338+
ts_lock.unlock();
338339
return env_context.randomness->getRandomnessFromBeacon(
339340
ts_branch, tag, epoch, entropy);
340341
};
@@ -345,6 +346,7 @@ namespace fc::api {
345346
auto &entropy) -> outcome::result<Randomness> {
346347
std::unique_lock ts_lock{*env_context.ts_branches_mutex};
347348
OUTCOME_TRY(ts_branch, TsBranch::make(ts_load, tipset_key, ts_main));
349+
ts_lock.unlock();
348350
return env_context.randomness->getRandomnessFromTickets(
349351
ts_branch, tag, epoch, entropy);
350352
};

core/const.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ namespace fc {
202202
kUpgradeNorwegianHeight = -13;
203203
kUpgradeActorsV4Height = -14;
204204
kUpgradeHyperdriveHeight = -15;
205-
kUpgradeChocolateHeight = -17;
205+
kUpgradeChocolateHeight = INT64_MAX;
206206

207207
kBreezeGasTampingDuration = 0;
208208

core/node/main/builder.cpp

+19-19
Original file line numberDiff line numberDiff line change
@@ -378,11 +378,29 @@ namespace fc::node {
378378
assert(genesis_cids.size() == 1);
379379
config.genesis_cid = genesis_cids[0];
380380

381+
const auto genesis{o.ts_load->load(*TipsetKey::make(genesis_cids)).value()};
382+
const clock::UnixTime genesis_timestamp{genesis->blks[0].timestamp};
383+
384+
log()->info("Genesis: {}, timestamp {}",
385+
config.genesis_cid.value().toString().value(),
386+
clock::unixTimeToString(genesis_timestamp));
387+
388+
const drand::ChainInfo drand_chain_info{
389+
.key = *config.drand_bls_pubkey,
390+
.genesis = std::chrono::seconds(*config.drand_genesis),
391+
.period = std::chrono::seconds(*config.drand_period),
392+
};
393+
394+
const auto drand_schedule{std::make_shared<drand::DrandScheduleImpl>(
395+
drand_chain_info,
396+
genesis_timestamp,
397+
std::chrono::seconds(kEpochDurationSeconds))};
398+
381399
o.env_context.ts_branches_mutex = ts_mutex;
382400
o.env_context.ipld = o.ipld;
383401
o.env_context.invoker = std::make_shared<vm::actor::InvokerImpl>();
384402
o.env_context.randomness = std::make_shared<vm::runtime::TipsetRandomness>(
385-
o.ts_load, o.env_context.ts_branches_mutex);
403+
o.ts_load, o.env_context.ts_branches_mutex, drand_schedule);
386404
o.env_context.ts_load = o.ts_load;
387405
o.env_context.interpreter_cache =
388406
std::make_shared<vm::interpreter::InterpreterCache>(
@@ -410,16 +428,9 @@ namespace fc::node {
410428
o.compacter->ts_main = o.ts_main;
411429
o.compacter->open();
412430

413-
OUTCOME_EXCEPT(genesis, o.ts_load->load(*TipsetKey::make(genesis_cids)));
414431
OUTCOME_TRY(initNetworkName(*genesis, o.ipld, config));
415432
log()->info("Network name: {}", *config.network_name);
416433

417-
auto genesis_timestamp = clock::UnixTime(genesis->blks[0].timestamp);
418-
419-
log()->info("Genesis: {}, timestamp {}",
420-
config.genesis_cid.value().toString().value(),
421-
clock::unixTimeToString(genesis_timestamp));
422-
423434
o.utc_clock = std::make_shared<clock::UTCClockImpl>();
424435

425436
o.chain_epoch_clock =
@@ -585,12 +596,6 @@ namespace fc::node {
585596
}
586597
}
587598

588-
drand::ChainInfo drand_chain_info{
589-
.key = *config.drand_bls_pubkey,
590-
.genesis = std::chrono::seconds(*config.drand_genesis),
591-
.period = std::chrono::seconds(*config.drand_period),
592-
};
593-
594599
if (config.drand_servers.empty()) {
595600
config.drand_servers.emplace_back("https://127.0.0.1:8080");
596601
}
@@ -603,11 +608,6 @@ namespace fc::node {
603608
config.drand_servers,
604609
config.beaconizer_cache_size);
605610

606-
auto drand_schedule = std::make_shared<drand::DrandScheduleImpl>(
607-
drand_chain_info,
608-
genesis_timestamp,
609-
std::chrono::seconds(kEpochDurationSeconds));
610-
611611
o.markets_ipld = o.ipld_leveldb;
612612
o.api = std::make_shared<api::FullNodeApi>();
613613
o.datatransfer = DataTransfer::make(o.host, o.graphsync);

core/vm/dvm/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ add_executable(dvm_main
1818
target_link_libraries(dvm_main
1919
car
2020
cids_index
21+
drand_beacon
2122
in_memory_storage
2223
interpreter
2324
ipfs_datastore_in_memory

core/vm/dvm/main.cpp

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
#include "cbor_blake/ipld_any.hpp"
7+
#include "drand/impl/beaconizer.hpp"
78
#include "primitives/tipset/chain.hpp"
89
#include "storage/car/car.hpp"
910
#include "storage/car/cids_index/util.hpp"
@@ -41,8 +42,21 @@ int main(int argc, char **argv) {
4142
std::make_shared<fc::primitives::tipset::TsLoadIpld>(envx.ipld)};
4243
envx.ts_load =
4344
std::make_shared<primitives::tipset::TsLoadCache>(ts_load_ipld, 1000);
45+
46+
const auto genesis_block{
47+
getCbor<primitives::block::BlockHeader>(envx.ipld, genesis_cid)
48+
.value()};
4449
envx.randomness = std::make_shared<vm::runtime::TipsetRandomness>(
45-
envx.ts_load, envx.ts_branches_mutex);
50+
envx.ts_load,
51+
envx.ts_branches_mutex,
52+
std::make_shared<drand::DrandScheduleImpl>(
53+
drand::ChainInfo{
54+
{},
55+
std::chrono::seconds{1595431050},
56+
std::chrono::seconds{30},
57+
},
58+
std::chrono::seconds{genesis_block.timestamp},
59+
std::chrono::seconds{kEpochDurationSeconds}));
4660
envx.interpreter_cache =
4761
std::make_shared<vm::interpreter::InterpreterCache>(
4862
std::make_shared<storage::InMemoryStorage>(),

core/vm/runtime/impl/tipset_randomness.cpp

+41-6
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,77 @@
55

66
#include "vm/runtime/impl/tipset_randomness.hpp"
77

8+
#include "drand/beaconizer.hpp"
89
#include "primitives/tipset/chain.hpp"
910

1011
namespace fc::vm::runtime {
11-
TipsetRandomness::TipsetRandomness(TsLoadPtr ts_load,
12-
SharedMutexPtr ts_branches_mutex)
12+
using drand::BeaconEntry;
13+
14+
TipsetRandomness::TipsetRandomness(
15+
TsLoadPtr ts_load,
16+
SharedMutexPtr ts_branches_mutex,
17+
std::shared_ptr<DrandSchedule> drand_schedule)
1318
: ts_load{std::move(ts_load)},
14-
ts_branches_mutex{std::move(ts_branches_mutex)} {}
19+
ts_branches_mutex{std::move(ts_branches_mutex)},
20+
drand_schedule{std::move(drand_schedule)} {}
1521

1622
outcome::result<Randomness> TipsetRandomness::getRandomnessFromTickets(
1723
const TsBranchPtr &ts_branch,
1824
DomainSeparationTag tag,
1925
ChainEpoch epoch,
2026
gsl::span<const uint8_t> seed) const {
2127
std::shared_lock ts_lock{*ts_branches_mutex};
28+
const auto network{version::getNetworkVersion(epoch)};
2229
OUTCOME_TRY(it,
2330
find(ts_branch,
2431
std::max<ChainEpoch>(0, epoch),
25-
epoch <= kUpgradeHyperdriveHeight));
32+
network < NetworkVersion::kVersion13));
2633
OUTCOME_TRY(ts, ts_load->lazyLoad(it.second->second));
2734
ts_lock.unlock();
2835

2936
return crypto::randomness::drawRandomness(
3037
ts->getMinTicketBlock().ticket->bytes, tag, epoch, seed);
3138
}
3239

40+
inline outcome::result<BeaconEntry> extractBeaconEntryForEpoch(
41+
TsLoadPtr ts_load,
42+
primitives::tipset::chain::TsBranchIter it,
43+
drand::Round round) {
44+
// magic number from lotus
45+
for (auto i{0}; i < 20; ++i) {
46+
OUTCOME_TRY(ts, ts_load->lazyLoad(it.second->second));
47+
for (const auto &beacon : ts->blks[0].beacon_entries) {
48+
if (beacon.round == round) {
49+
return beacon;
50+
}
51+
}
52+
if (it.second->first == 0) {
53+
break;
54+
}
55+
OUTCOME_TRYA(it, stepParent(it));
56+
}
57+
return primitives::tipset::TipsetError::kNoBeacons;
58+
}
59+
3360
outcome::result<Randomness> TipsetRandomness::getRandomnessFromBeacon(
3461
const TsBranchPtr &ts_branch,
3562
DomainSeparationTag tag,
3663
ChainEpoch epoch,
3764
gsl::span<const uint8_t> seed) const {
3865
std::shared_lock ts_lock{*ts_branches_mutex};
66+
const auto network{version::getNetworkVersion(epoch)};
3967
OUTCOME_TRY(it,
4068
find(ts_branch,
4169
std::max<ChainEpoch>(0, epoch),
42-
epoch <= kUpgradeHyperdriveHeight));
43-
OUTCOME_TRY(beacon, latestBeacon(ts_load, it));
70+
network < NetworkVersion::kVersion13));
71+
BeaconEntry beacon;
72+
if (network <= NetworkVersion::kVersion13 || epoch < 0) {
73+
OUTCOME_TRYA(beacon, latestBeacon(ts_load, it));
74+
} else {
75+
OUTCOME_TRYA(beacon,
76+
extractBeaconEntryForEpoch(
77+
ts_load, it, drand_schedule->maxRound(epoch)));
78+
}
4479
ts_lock.unlock();
4580

4681
return crypto::randomness::drawRandomness(beacon.data, tag, epoch, seed);

core/vm/runtime/impl/tipset_randomness.hpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
#include "vm/runtime/runtime_randomness.hpp"
1010

1111
namespace fc::vm::runtime {
12+
using drand::DrandSchedule;
13+
1214
class TipsetRandomness : public RuntimeRandomness {
1315
public:
14-
TipsetRandomness(TsLoadPtr ts_load, SharedMutexPtr ts_branches_mutex);
16+
TipsetRandomness(TsLoadPtr ts_load,
17+
SharedMutexPtr ts_branches_mutex,
18+
std::shared_ptr<DrandSchedule> drand_schedule);
1519

1620
outcome::result<Randomness> getRandomnessFromTickets(
1721
const TsBranchPtr &ts_branch,
@@ -28,6 +32,7 @@ namespace fc::vm::runtime {
2832
private:
2933
TsLoadPtr ts_load;
3034
SharedMutexPtr ts_branches_mutex;
35+
std::shared_ptr<DrandSchedule> drand_schedule;
3136
};
3237

3338
} // namespace fc::vm::runtime

0 commit comments

Comments
 (0)