Skip to content

Commit

Permalink
Commits based initial full sync
Browse files Browse the repository at this point in the history
Signed-off-by: Stanislav Frolov <[email protected]>
  • Loading branch information
frolosofsky committed Mar 7, 2019
1 parent 66aa548 commit f59760f
Show file tree
Hide file tree
Showing 19 changed files with 1,592 additions and 205 deletions.
8 changes: 6 additions & 2 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ UNITE_CORE_H = \
esperanza/walletextension_deps.h \
esperanza/walletstate.h \
extkey.h \
finalization/p2p.h \
finalization/state_processor.h \
finalization/state_repository.h \
finalization/vote_recorder.h \
Expand Down Expand Up @@ -165,6 +164,9 @@ UNITE_CORE_H = \
noui.h \
p2p/embargoman.h \
p2p/embargoman_init.h \
p2p/finalizer_commits.h \
p2p/finalizer_commits_impl.h \
p2p/finalizer_commits_types.h \
policy/feerate.h \
policy/fees.h \
policy/policy.h \
Expand Down Expand Up @@ -295,7 +297,6 @@ libunite_server_a_SOURCES = \
esperanza/checks.cpp \
esperanza/finalizationstate.cpp \
esperanza/validator.cpp \
finalization/p2p.cpp \
finalization/state_processor.cpp \
finalization/state_repository.cpp \
finalization/vote_recorder.cpp \
Expand All @@ -311,6 +312,9 @@ libunite_server_a_SOURCES = \
noui.cpp \
p2p/embargoman.cpp \
p2p/embargoman_init.cpp \
p2p/finalizer_commits.cpp \
p2p/finalizer_commits_impl.cpp \
p2p/finalizer_commits_types.cpp \
policy/fees.cpp \
policy/policy.cpp \
policy/rbf.cpp \
Expand Down
1 change: 1 addition & 0 deletions src/Makefile.test.include
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ UNITE_TESTS = \
test/esperanza/finalizationstate_utils.cpp \
test/finalization/state_processor_tests.cpp \
test/finalization/state_repository_tests.cpp \
test/finalization/commits_tests.cpp \
test/finalization/vote_recorder_tests.cpp \
test/getarg_tests.cpp \
test/hash_tests.cpp \
Expand Down
11 changes: 8 additions & 3 deletions src/chain.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ class CBlockIndex
uint256 stake_modifier;

//! Vector of commits. If it's not set, node hasn't received commits for this block header
boost::optional<std::vector<CTransactionRef>> commits;
mutable boost::optional<std::vector<CTransactionRef>> commits;

//! last justified epoch counting from this block index
boost::optional<uint32_t> last_justified_epoch;
Expand Down Expand Up @@ -389,8 +389,13 @@ class CBlockIndex
commits.reset();
}

void ResetCommits(const std::vector<CTransactionRef> &_commits) {
commits = _commits;
bool HasCommits() const {
return static_cast<bool>(commits);
}

const std::vector<CTransactionRef> &GetCommits() const {
assert(HasCommits());
return *commits;
}
};

Expand Down
4 changes: 4 additions & 0 deletions src/esperanza/finalizationstate.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,10 @@ class FinalizationState : public FinalizationStateData {

inline uint32_t GetEpoch(const CBlockIndex &blockIndex) { return FinalizationState::GetState()->GetEpoch(blockIndex); }
inline uint32_t GetEpoch(blockchain::Height blockHeight) { return FinalizationState::GetState()->GetEpoch(blockHeight); }
inline blockchain::Height GetEpochStartHeight(uint32_t epoch) { return FinalizationState::GetState()->GetEpochStartHeight(epoch); }
inline uint32_t GetLastFinalizedEpoch() { return FinalizationState::GetState()->GetLastFinalizedEpoch(); }
inline uint32_t GetCurrentEpoch() { return FinalizationState::GetState()->GetCurrentEpoch(); }
inline bool IsCheckpoint(blockchain::Height block_height) { return FinalizationState::GetState()->IsCheckpoint(block_height); };

} // namespace esperanza

Expand Down
152 changes: 0 additions & 152 deletions src/finalization/p2p.cpp

This file was deleted.

6 changes: 6 additions & 0 deletions src/injector.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <blockchain/blockchain_rpc.h>
#include <finalization/state_processor.h>
#include <finalization/state_repository.h>
#include <p2p/finalizer_commits.h>
#include <settings.h>
#include <staking/active_chain.h>
#include <staking/block_validator.h>
Expand Down Expand Up @@ -62,6 +63,11 @@ class UnitEInjector : public Injector<UnitEInjector> {
finalization::StateRepository,
staking::ActiveChain)

COMPONENT(FinalizerCommits, p2p::FinalizerCommits, p2p::FinalizerCommits::New,
staking::ActiveChain,
finalization::StateRepository,
finalization::StateProcessor)

#ifdef ENABLE_WALLET

COMPONENT(TransactionPicker, staking::TransactionPicker, staking::TransactionPicker::New)
Expand Down
45 changes: 35 additions & 10 deletions src/net_processing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <consensus/validation.h>
#include <hash.h>
#include <init.h>
#include <injector.h>
#include <validation.h>
#include <merkleblock.h>
#include <netmessagemaker.h>
Expand All @@ -31,7 +32,6 @@
#include <utilstrencodings.h>
#include <snapshot/p2p_processing.h>
#include <snapshot/state.h>
#include <finalization/p2p.h>

#include <memory>

Expand Down Expand Up @@ -381,6 +381,8 @@ void ProcessBlockAvailability(NodeId nodeid) {
}
}

} // namespace

/** Update tracking information about which blocks a peer is assumed to have. */
void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) {
CNodeState *state = State(nodeid);
Expand All @@ -399,6 +401,8 @@ void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash) {
}
}

namespace {

void MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid, CConnman* connman) {
AssertLockHeld(cs_main);
CNodeState* nodestate = State(nodeid);
Expand Down Expand Up @@ -463,11 +467,16 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<con
if (count == 0)
return;

vBlocks.reserve(vBlocks.size() + count);

if (GetComponent<p2p::FinalizerCommits>()->FindNextBlocksToDownload(nodeid, count, vBlocks)) {
return;
}

if (snapshot::FindNextBlocksToDownload(nodeid, vBlocks)) {
return;
}

vBlocks.reserve(vBlocks.size() + count);
CNodeState *state = State(nodeid);
assert(state != nullptr);

Expand Down Expand Up @@ -608,6 +617,8 @@ void PeerLogicValidation::FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTim
assert(g_outbound_peers_with_protect_from_disconnect == 0);
}
LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);

GetComponent<p2p::FinalizerCommits>()->OnDisconnect(nodeid);
}

bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) {
Expand Down Expand Up @@ -2830,22 +2841,28 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
}

else if (strCommand == NetMsgType::GETCOMMITS) {
finalization::p2p::CommitsLocator locator;
p2p::FinalizerCommitsLocator locator;
vRecv >> locator;

LogPrint(BCLog::NET, "received: %s\n", locator.ToString());
return finalization::p2p::ProcessGetCommits(pfrom, locator, msgMaker, chainparams);

GetComponent<p2p::FinalizerCommits>()->OnGetCommits(*pfrom, locator, chainparams.GetConsensus());
}

else if (strCommand == NetMsgType::COMMITS) {
finalization::p2p::CommitsResponse commits;
p2p::FinalizerCommitsResponse commits;
vRecv >> commits;
LogPrint(BCLog::NET, "received: %d headers+commits, satus=%d\n", commits.data.size(), static_cast<uint8_t>(commits.status));

LogPrint(BCLog::NET, "received: %d headers+commits, status=%d\n", commits.data.size(), static_cast<uint8_t>(commits.status));

CValidationState validation_state;
uint256 failed_block;
bool ok = finalization::p2p::ProcessNewCommits(commits, chainparams, validation_state, &failed_block);

const bool ok = GetComponent<p2p::FinalizerCommits>()->OnCommits(*pfrom, commits, chainparams, validation_state, &failed_block);
if (ok) {
return true;
}

int dos;
if (validation_state.IsInvalid(dos)) {
Misbehaving(pfrom->GetId(), dos);
Expand Down Expand Up @@ -3255,8 +3272,11 @@ bool PeerLogicValidation::SendMessages(CNode* pto, size_t node_index, size_t tot
pindexBestHeader = chainActive.Tip();
bool fFetch = state.fPreferredDownload || (nPreferredDownload == 0 && !pto->fClient && !pto->fOneShot); // Download if this is a nice peer, or we have no nice peers and this one might do.
if (!state.fSyncStarted && !pto->fClient && !fImporting && !fReindex) {
const auto *fin_state = GetComponent<finalization::StateRepository>()->GetTipState();
assert(fin_state != nullptr);
// Only actively request headers from a single peer, unless we're close to today.
if ((nSyncStarted == 0 && fFetch) || pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) {
if (((nSyncStarted == 0 && fFetch) || pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) &&
(fin_state->GetEpoch(pto->nStartingHeight) >= fin_state->GetLastFinalizedEpoch())) {
state.fSyncStarted = true;
state.nHeadersSyncTimeout = GetTimeMicros() + HEADERS_DOWNLOAD_TIMEOUT_BASE + HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER * (GetAdjustedTime() - pindexBestHeader->GetBlockTime())/(consensusParams.nPowTargetSpacing);
nSyncStarted++;
Expand All @@ -3270,8 +3290,13 @@ bool PeerLogicValidation::SendMessages(CNode* pto, size_t node_index, size_t tot
got back an empty response. */
if (pindexStart->pprev)
pindexStart = pindexStart->pprev;
LogPrint(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), pto->nStartingHeight);
connman->PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexStart), uint256()));
if (snapshot::IsISDEnabled()) {
LogPrint(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), pto->nStartingHeight);
connman->PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexStart), uint256()));
} else {
LogPrint(BCLog::NET, "initial getcommits (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), pto->nStartingHeight);
connman->PushMessage(pto, msgMaker.Make(NetMsgType::GETCOMMITS, GetComponent<p2p::FinalizerCommits>()->GetFinalizerCommitsLocator(*pindexStart, nullptr)));
}
}
}

Expand Down
9 changes: 9 additions & 0 deletions src/net_processing.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <net.h>
#include <validationinterface.h>
#include <consensus/params.h>
#include <netmessagemaker.h>

/** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
Expand Down Expand Up @@ -83,4 +84,12 @@ bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats);
/** Increase a node's misbehavior score. */
void Misbehaving(NodeId nodeid, int howmuch);

void UpdateBlockAvailability(NodeId nodeid, const uint256 &hash);

template <typename... Args>
void PushMessage(CNode &to, const std::string &command, Args&&... args) {
const CNetMsgMaker msg_maker(to.GetSendVersion());
g_connman->PushMessage(&to, msg_maker.Make(command, std::forward<Args>(args)...));
}

#endif // UNITE_NET_PROCESSING_H
Loading

0 comments on commit f59760f

Please sign in to comment.