From bf2ce95cb5b1da5d894e5302a7c4de0894c1cce2 Mon Sep 17 00:00:00 2001 From: Sunny King Date: Sun, 29 Jul 2012 22:09:43 +0100 Subject: [PATCH] PPCoin: Replace RPC command 'setcheckpointkey' with option '-checkpointkey' --- src/bitcoinrpc.cpp | 30 +++--------------------------- src/checkpoints.cpp | 20 ++++++++++++++++++++ src/checkpoints.h | 1 + src/init.cpp | 7 +++++++ 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index 04faea9..e650eb0 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -2024,7 +2024,9 @@ Value getcheckpoint(const Array& params, bool fHelp) pindexCheckpoint = mapBlockIndex[Checkpoints::hashSyncCheckpoint]; result.push_back(Pair("height", pindexCheckpoint->nHeight)); result.push_back(Pair("timestamp", DateTimeStrFormat(pindexCheckpoint->GetBlockTime()).c_str())); - + if (mapArgs.count("-checkpointkey")) + result.push_back(Pair("checkpointmaster", true)); + return result; } @@ -2211,31 +2213,6 @@ Value sendalert(const Array& params, bool fHelp) return result; } -// ppcoin: set checkpoint key -Value setcheckpointkey(const Array& params, bool fHelp) -{ - if (fHelp || params.size() != 1) - throw runtime_error( - "setcheckpointkey \n" - " is hex string of checkpoint master private key\n"); - - CSyncCheckpoint checkpoint; - checkpoint.hashCheckpoint = hashGenesisBlock; - CDataStream sMsg(SER_NETWORK, PROTOCOL_VERSION); - sMsg << (CUnsignedSyncCheckpoint)checkpoint; - checkpoint.vchMsg = vector(sMsg.begin(), sMsg.end()); - - vector vchPrivKey = ParseHex(params[0].get_str()); - CKey key; - key.SetPrivKey(CPrivKey(vchPrivKey.begin(), vchPrivKey.end())); // if key is not correct openssl may crash - if (!key.Sign(Hash(checkpoint.vchMsg.begin(), checkpoint.vchMsg.end()), checkpoint.vchSig)) - throw runtime_error( - "Unable to sign checkpoint, check private key?\n"); - - CSyncCheckpoint::strMasterPrivKey = params[0].get_str(); - - return "checkpoint master key has been set."; -} // @@ -2298,7 +2275,6 @@ static const CRPCCommand vRPCCommands[] = { "repairwallet", &repairwallet, false}, { "makekeypair", &makekeypair, false}, { "sendalert", &sendalert, false}, - { "setcheckpointkey", &setcheckpointkey, false}, }; CRPCTable::CRPCTable() diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp index 5bb9df6..7de5883 100644 --- a/src/checkpoints.cpp +++ b/src/checkpoints.cpp @@ -288,6 +288,26 @@ namespace Checkpoints pfrom->AskFor(CInv(MSG_BLOCK, hashPendingCheckpoint)); } + bool SetCheckpointPrivKey(std::string strPrivKey) + { + // Test signing a sync-checkpoint with genesis block + CSyncCheckpoint checkpoint; + checkpoint.hashCheckpoint = hashGenesisBlock; + CDataStream sMsg(SER_NETWORK, PROTOCOL_VERSION); + sMsg << (CUnsignedSyncCheckpoint)checkpoint; + checkpoint.vchMsg = std::vector(sMsg.begin(), sMsg.end()); + + std::vector vchPrivKey = ParseHex(strPrivKey); + CKey key; + key.SetPrivKey(CPrivKey(vchPrivKey.begin(), vchPrivKey.end())); // if key is not correct openssl may crash + if (!key.Sign(Hash(checkpoint.vchMsg.begin(), checkpoint.vchMsg.end()), checkpoint.vchSig)) + return false; + + // Test signing successful, proceed + CSyncCheckpoint::strMasterPrivKey = strPrivKey; + return true; + } + bool SendSyncCheckpoint(uint256 hashCheckpoint) { CSyncCheckpoint checkpoint; diff --git a/src/checkpoints.h b/src/checkpoints.h index be18c79..f14e610 100644 --- a/src/checkpoints.h +++ b/src/checkpoints.h @@ -43,6 +43,7 @@ namespace Checkpoints bool WantedByPendingSyncCheckpoint(uint256 hashBlock); bool ResetSyncCheckpoint(); void AskForPendingSyncCheckpoint(CNode* pfrom); + bool SetCheckpointPrivKey(std::string strPrivKey); bool SendSyncCheckpoint(uint256 hashCheckpoint); } diff --git a/src/init.cpp b/src/init.cpp index 8635ace..62b6103 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -10,6 +10,7 @@ #include "init.h" #include "util.h" #include "ui_interface.h" +#include "checkpoints.h" #include #include #include @@ -595,6 +596,12 @@ bool AppInit2(int argc, char* argv[]) } } + if (mapArgs.count("-checkpointkey")) // ppcoin: checkpoint master priv key + { + if (!Checkpoints::SetCheckpointPrivKey(GetArg("-checkpointkey", ""))) + ThreadSafeMessageBox(_("Unable to sign checkpoint, wrong checkpointkey?\n"), _("PPCoin"), wxOK | wxMODAL); + } + // // Start the node // -- 1.7.1