diff --git a/src/avalanche/processor.h b/src/avalanche/processor.h --- a/src/avalanche/processor.h +++ b/src/avalanche/processor.h @@ -289,7 +289,7 @@ bool registerVotes(NodeId nodeid, const Response &response, std::vector &updates); - bool addNode(NodeId nodeid, const Proof &proof, + bool addNode(NodeId nodeid, const std::shared_ptr &proof, const Delegation &delegation); bool forNode(NodeId nodeid, std::function func) const; diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -138,7 +138,7 @@ } struct Processor::PeerData { - Proof proof; + std::shared_ptr proof; Delegation delegation; }; @@ -154,8 +154,7 @@ if (m_processor->mustRegisterProof && !::ChainstateActive().IsInitialBlockDownload()) { - m_processor->peerManager->getPeerId( - std::make_shared(m_processor->peerData->proof)); + m_processor->peerManager->getPeerId(m_processor->peerData->proof); m_processor->mustRegisterProof = false; } @@ -216,14 +215,15 @@ } peerData = std::make_unique(); - if (!Proof::FromHex(peerData->proof, argsman.GetArg("-avaproof", ""), + peerData->proof = std::make_shared(); + if (!Proof::FromHex(*peerData->proof, argsman.GetArg("-avaproof", ""), error)) { // error is set by FromHex return nullptr; } ProofValidationState proof_state; - if (!peerData->proof.verify(proof_state)) { + if (!peerData->proof->verify(proof_state)) { switch (proof_state.GetResult()) { case ProofValidationResult::NO_STAKE: error = _("the avalanche proof has no stake"); @@ -250,8 +250,8 @@ } // Generate the delegation to the session key. - DelegationBuilder dgb(peerData->proof); - if (sessionKey.GetPubKey() != peerData->proof.getMaster()) { + DelegationBuilder dgb(*peerData->proof); + if (sessionKey.GetPubKey() != peerData->proof->getMaster()) { dgb.addLevel(masterKey, sessionKey.GetPubKey()); } peerData->delegation = dgb.build(); @@ -442,11 +442,10 @@ return true; } -bool Processor::addNode(NodeId nodeid, const Proof &proof, +bool Processor::addNode(NodeId nodeid, const std::shared_ptr &proof, const Delegation &delegation) { LOCK(cs_peerManager); - return peerManager->addNode(nodeid, std::make_shared(proof), - delegation); + return peerManager->addNode(nodeid, proof, delegation); } bool Processor::forNode(NodeId nodeid, diff --git a/src/avalanche/test/processor_tests.cpp b/src/avalanche/test/processor_tests.cpp --- a/src/avalanche/test/processor_tests.cpp +++ b/src/avalanche/test/processor_tests.cpp @@ -129,7 +129,7 @@ bool addNode(NodeId nodeid) { auto proof = GetProof(); - return m_processor->addNode(nodeid, *proof, + return m_processor->addNode(nodeid, proof, DelegationBuilder(*proof).build()); } diff --git a/src/rpc/avalanche.cpp b/src/rpc/avalanche.cpp --- a/src/rpc/avalanche.cpp +++ b/src/rpc/avalanche.cpp @@ -80,19 +80,20 @@ const NodeId nodeid = request.params[0].get_int64(); const CPubKey key = ParsePubKey(request.params[1]); - avalanche::Proof proof; + auto proof = std::make_shared(); bilingual_str error; - if (!avalanche::Proof::FromHex(proof, request.params[2].get_str(), error)) { + if (!avalanche::Proof::FromHex(*proof, request.params[2].get_str(), + error)) { throw JSONRPCError(RPC_INVALID_PARAMETER, error.original); } - if (key != proof.getMaster()) { + if (key != proof->getMaster()) { // TODO: we want to provide a proper delegation. return false; } return g_avalanche->addNode(nodeid, proof, - avalanche::DelegationBuilder(proof).build()); + avalanche::DelegationBuilder(*proof).build()); } static UniValue buildavalancheproof(const Config &config,