diff --git a/src/avalanche/processor.h b/src/avalanche/processor.h --- a/src/avalanche/processor.h +++ b/src/avalanche/processor.h @@ -28,6 +28,7 @@ #include #include +class ArgsManager; class Config; class CBlockIndex; class CScheduler; @@ -250,6 +251,8 @@ std::optional proof; std::optional delegation; CKey sessionKey; + + static PeerData FromArgs(const ArgsManager &argsman); }; PeerData peerData; @@ -269,6 +272,8 @@ public: Processor(interfaces::Chain &chain, CConnman *connmanIn, NodePeerManager *nodePeerManagerIn); + Processor(interfaces::Chain &chain, CConnman *connmanIn, + NodePeerManager *nodePeerManagerIn, const ArgsManager &argsman); ~Processor(); void setQueryTimeoutDuration(std::chrono::milliseconds d) { diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -136,6 +136,39 @@ return true; } +Processor::PeerData Processor::PeerData::FromArgs(const ArgsManager &argsman) { + PeerData peerData; + + if (argsman.IsArgSet("-avasessionkey")) { + peerData.sessionKey = + DecodeSecret(argsman.GetArg("-avasessionkey", "")); + } else { + // Pick a random key for the session. + peerData.sessionKey.MakeNewKey(true); + } + + if (argsman.IsArgSet("-avaproof")) { + { + // The proof. + CDataStream stream(ParseHex(argsman.GetArg("-avaproof", "")), + SER_NETWORK, 0); + Proof proof; + stream >> proof; + peerData.proof = proof; + } + + // Generate the delegation to the session key. + DelegationBuilder dgb(peerData.proof.value()); + if (peerData.sessionKey.GetPubKey() != peerData.proof->getMaster()) { + dgb.addLevel(DecodeSecret(argsman.GetArg("-avamasterkey", "")), + peerData.sessionKey.GetPubKey()); + } + peerData.delegation = dgb.build(); + } + + return peerData; +} + class Processor::NotificationsHandler : public interfaces::Chain::Notifications { Processor *m_processor; @@ -162,40 +195,23 @@ : connman(connmanIn), nodePeerManager(nodePeerManagerIn), queryTimeoutDuration(AVALANCHE_DEFAULT_QUERY_TIMEOUT), round(0), peerManager(std::make_unique()) { - if (gArgs.IsArgSet("-avasessionkey")) { - peerData.sessionKey = DecodeSecret(gArgs.GetArg("-avasessionkey", "")); - } else { - // Pick a random key for the session. - peerData.sessionKey.MakeNewKey(true); - } - - if (gArgs.IsArgSet("-avaproof")) { - { - // The proof. - CDataStream stream(ParseHex(gArgs.GetArg("-avaproof", "")), - SER_NETWORK, 0); - Proof proof; - stream >> proof; - peerData.proof = proof; - - // Schedule proof registration at the first new block after IBD. - mustRegisterProof = true; - } - - // Generate the delegation to the session key. - DelegationBuilder dgb(peerData.proof.value()); - if (peerData.sessionKey.GetPubKey() != peerData.proof->getMaster()) { - dgb.addLevel(DecodeSecret(gArgs.GetArg("-avamasterkey", "")), - peerData.sessionKey.GetPubKey()); - } - peerData.delegation = dgb.build(); - } - // Make sure we get notified of chain state changes. chainNotificationsHandler = chain.handleNotifications(std::make_shared(this)); } +Processor::Processor(interfaces::Chain &chain, CConnman *connmanIn, + NodePeerManager *nodePeerManagerIn, + const ArgsManager &argsman) + : Processor(chain, connmanIn, nodePeerManagerIn) { + peerData = PeerData::FromArgs(argsman); + + if (peerData.proof) { + // Schedule proof registration at the first new block after IBD. + mustRegisterProof = true; + } +} + Processor::~Processor() { chainNotificationsHandler.reset(); stopEventLoop(); diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -2438,7 +2438,7 @@ // Step 6.5 (I guess ?): Initialize Avalanche. g_avalanche = std::make_unique( - *node.chain, node.connman.get(), node.peerman.get()); + *node.chain, node.connman.get(), node.peerman.get(), args); if (args.GetBoolArg("-enableavalanche", AVALANCHE_DEFAULT_ENABLED)) { nLocalServices = ServiceFlags(nLocalServices | NODE_AVALANCHE);