Changeset View
Changeset View
Standalone View
Standalone View
src/avalanche/delegationbuilder.cpp
Show All 30 Lines | bool DelegationBuilder::importDelegation(const Delegation &d) { | ||||
for (auto &l : d.levels) { | for (auto &l : d.levels) { | ||||
levels.back().sig = l.sig; | levels.back().sig = l.sig; | ||||
levels.push_back({l.pubkey, {}}); | levels.push_back({l.pubkey, {}}); | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
bool DelegationBuilder::addLevel(const CKey &key, const CPubKey &master) { | bool DelegationBuilder::addLevel(const CKey &delegatorKey, | ||||
const CPubKey &delegatedPubKey) { | |||||
// Ensures that the private key provided is the one we need. | // Ensures that the private key provided is the one we need. | ||||
if (levels.back().pubkey != key.GetPubKey()) { | if (levels.back().pubkey != delegatorKey.GetPubKey()) { | ||||
return false; | return false; | ||||
} | } | ||||
CHashWriter ss(SER_GETHASH, 0); | CHashWriter ss(SER_GETHASH, 0); | ||||
ss << dgid; | ss << dgid; | ||||
ss << master; | ss << delegatedPubKey; | ||||
auto hash = ss.GetHash(); | auto hash = ss.GetHash(); | ||||
if (!key.SignSchnorr(hash, levels.back().sig)) { | if (!delegatorKey.SignSchnorr(hash, levels.back().sig)) { | ||||
return false; | return false; | ||||
} | } | ||||
dgid = DelegationId(hash); | dgid = DelegationId(hash); | ||||
levels.push_back({master, {}}); | levels.push_back({delegatedPubKey, {}}); | ||||
return true; | return true; | ||||
} | } | ||||
Delegation DelegationBuilder::build() const { | Delegation DelegationBuilder::build() const { | ||||
std::vector<Delegation::Level> dglvls; | std::vector<Delegation::Level> dglvls; | ||||
for (size_t i = 1; i < levels.size(); i++) { | for (size_t i = 1; i < levels.size(); i++) { | ||||
dglvls.push_back({levels[i].pubkey, levels[i - 1].sig}); | dglvls.push_back({levels[i].pubkey, levels[i - 1].sig}); | ||||
} | } | ||||
return Delegation(proofid, dgid, std::move(dglvls)); | return Delegation(proofid, dgid, std::move(dglvls)); | ||||
} | } | ||||
} // namespace avalanche | } // namespace avalanche |