diff --git a/src/avalanche/delegationbuilder.h b/src/avalanche/delegationbuilder.h --- a/src/avalanche/delegationbuilder.h +++ b/src/avalanche/delegationbuilder.h @@ -6,7 +6,7 @@ #define BITCOIN_AVALANCHE_DELEGATIONBUILDER_H #include -#include +#include #include #include @@ -15,17 +15,15 @@ namespace avalanche { -class Proof; - class DelegationBuilder { LimitedProofId limitedProofid; - ProofId proofid; DelegationId dgid; std::vector levels; public: - explicit DelegationBuilder(const Proof &p); + explicit DelegationBuilder(const LimitedProofId &limitedProofIdIn, + const CPubKey &proofMaster); bool importDelegation(const Delegation &d); diff --git a/src/avalanche/delegationbuilder.cpp b/src/avalanche/delegationbuilder.cpp --- a/src/avalanche/delegationbuilder.cpp +++ b/src/avalanche/delegationbuilder.cpp @@ -8,13 +8,16 @@ namespace avalanche { -DelegationBuilder::DelegationBuilder(const Proof &p) - : limitedProofid(p.getLimitedId()), proofid(p.getId()), dgid(proofid) { - levels.push_back({p.getMaster(), {}}); +DelegationBuilder::DelegationBuilder(const LimitedProofId &limitedProofIdIn, + const CPubKey &proofMaster) + : limitedProofid(limitedProofIdIn), + dgid(limitedProofIdIn.computeProofId(proofMaster)) { + levels.push_back({proofMaster, {}}); } bool DelegationBuilder::importDelegation(const Delegation &d) { - if (d.getProofId() != proofid) { + if (d.getProofId() != + limitedProofid.computeProofId(levels.front().pubkey)) { return false; } diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -249,7 +249,8 @@ } // Generate the delegation to the session key. - DelegationBuilder dgb(peerData->proof); + DelegationBuilder dgb(peerData->proof.getLimitedId(), + peerData->proof.getMaster()); if (sessionKey.GetPubKey() != peerData->proof.getMaster()) { dgb.addLevel(masterKey, sessionKey.GetPubKey()); } diff --git a/src/avalanche/test/delegation_tests.cpp b/src/avalanche/test/delegation_tests.cpp --- a/src/avalanche/test/delegation_tests.cpp +++ b/src/avalanche/test/delegation_tests.cpp @@ -35,7 +35,7 @@ key.MakeNewKey(true); const Proof p = buildRandomProof(123456, key.GetPubKey()); - DelegationBuilder dgb(p); + DelegationBuilder dgb(p.getLimitedId(), p.getMaster()); { Delegation dg = dgb.build(); diff --git a/src/avalanche/test/peermanager_tests.cpp b/src/avalanche/test/peermanager_tests.cpp --- a/src/avalanche/test/peermanager_tests.cpp +++ b/src/avalanche/test/peermanager_tests.cpp @@ -163,13 +163,15 @@ // One peer, we always return it. Proof proof0 = buildRandomProof(MIN_VALID_PROOF_SCORE); - Delegation dg0 = DelegationBuilder(proof0).build(); + Delegation dg0 = + DelegationBuilder(proof0.getLimitedId(), proof0.getMaster()).build(); pm.addNode(node0, proof0, dg0); BOOST_CHECK_EQUAL(pm.selectNode(), node0); // Two peers, verify ratio. Proof proof1 = buildRandomProof(2 * MIN_VALID_PROOF_SCORE); - Delegation dg1 = DelegationBuilder(proof1).build(); + Delegation dg1 = + DelegationBuilder(proof1.getLimitedId(), proof1.getMaster()).build(); pm.addNode(node1, proof1, dg1); std::unordered_map results = {}; @@ -183,7 +185,8 @@ // Three peers, verify ratio. Proof proof2 = buildRandomProof(MIN_VALID_PROOF_SCORE); - Delegation dg2 = DelegationBuilder(proof2).build(); + Delegation dg2 = + DelegationBuilder(proof2.getLimitedId(), proof2.getMaster()).build(); pm.addNode(node2, proof2, dg2); results.clear(); @@ -206,8 +209,9 @@ for (int i = 0; i < 4; i++) { Proof p = buildRandomProof(100); peerids[i] = pm.getPeerId(p); - BOOST_CHECK( - pm.addNode(InsecureRand32(), p, DelegationBuilder(p).build())); + BOOST_CHECK(pm.addNode( + InsecureRand32(), p, + DelegationBuilder(p.getLimitedId(), p.getMaster()).build())); } BOOST_CHECK_EQUAL(pm.getSlotCount(), 400); @@ -239,8 +243,9 @@ for (int i = 0; i < 4; i++) { Proof p = buildRandomProof(100); peerids[i + 4] = pm.getPeerId(p); - BOOST_CHECK( - pm.addNode(InsecureRand32(), p, DelegationBuilder(p).build())); + BOOST_CHECK(pm.addNode( + InsecureRand32(), p, + DelegationBuilder(p.getLimitedId(), p.getMaster()).build())); } BOOST_CHECK_EQUAL(pm.getSlotCount(), 700); @@ -282,8 +287,9 @@ for (int i = 0; i < 4; i++) { Proof p = buildRandomProof(100); peerids[i] = pm.getPeerId(p); - BOOST_CHECK( - pm.addNode(InsecureRand32(), p, DelegationBuilder(p).build())); + BOOST_CHECK(pm.addNode( + InsecureRand32(), p, + DelegationBuilder(p.getLimitedId(), p.getMaster()).build())); } // Remove all peers. @@ -309,7 +315,8 @@ // Create one peer. Proof proof = buildRandomProof(10000000 * MIN_VALID_PROOF_SCORE); - Delegation dg = DelegationBuilder(proof).build(); + Delegation dg = + DelegationBuilder(proof.getLimitedId(), proof.getMaster()).build(); BOOST_CHECK_EQUAL(pm.selectNode(), NO_NODE); // Add 4 nodes. @@ -348,7 +355,9 @@ // Move a node from a peer to another. This peer has a very low score such // as chances of being picked are 1 in 10 million. Proof altproof = buildRandomProof(MIN_VALID_PROOF_SCORE); - Delegation altdg = DelegationBuilder(altproof).build(); + Delegation altdg = + DelegationBuilder(altproof.getLimitedId(), altproof.getMaster()) + .build(); BOOST_CHECK(pm.addNode(3, altproof, altdg)); int node3selected = 0; 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,14 +129,16 @@ bool addNode(NodeId nodeid) { Proof proof = GetProof(); - return m_processor->addNode(nodeid, proof, - DelegationBuilder(proof).build()); + return m_processor->addNode( + nodeid, proof, + DelegationBuilder(proof.getLimitedId(), proof.getMaster()).build()); } std::array ConnectNodes() { avalanche::PeerManager &pm = getPeerManager(); Proof proof = GetProof(); - Delegation dg = DelegationBuilder(proof).build(); + Delegation dg = + DelegationBuilder(proof.getLimitedId(), proof.getMaster()).build(); std::array nodes; for (CNode *&n : nodes) { @@ -745,7 +747,8 @@ // Create enough nodes so that we run into the inflight request limit. avalanche::PeerManager &pm = getPeerManager(); Proof proof = GetProof(); - Delegation dg = DelegationBuilder(proof).build(); + Delegation dg = + DelegationBuilder(proof.getLimitedId(), proof.getMaster()).build(); std::array nodes; for (auto &n : nodes) { diff --git a/src/rpc/avalanche.cpp b/src/rpc/avalanche.cpp --- a/src/rpc/avalanche.cpp +++ b/src/rpc/avalanche.cpp @@ -91,8 +91,10 @@ return false; } - return g_avalanche->addNode(nodeid, proof, - avalanche::DelegationBuilder(proof).build()); + return g_avalanche->addNode( + nodeid, proof, + avalanche::DelegationBuilder(proof.getLimitedId(), proof.getMaster()) + .build()); } static UniValue buildavalancheproof(const Config &config, @@ -344,7 +346,7 @@ const CPubKey pubkey = ParsePubKey(request.params[2]); - avalanche::DelegationBuilder dgb(proof); + avalanche::DelegationBuilder dgb(proof.getLimitedId(), proof.getMaster()); CPubKey auth; if (request.params.size() >= 4 && !request.params[3].isNull()) { avalanche::Delegation dg;