From 80dbffe3ec72da60b7b9d5397a23b85bad1baef7 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Mon, 8 Jun 2015 18:55:07 -0700 Subject: [PATCH] Switch Alerts to use a scriptPubKey instead of a static key --- src/alert.cpp | 37 ++++++++++++++++++++++++++++--------- src/alert.h | 5 +++-- src/chainparams.cpp | 3 +-- src/chainparams.h | 5 ++--- 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/alert.cpp b/src/alert.cpp index 64399a4260..68c304973e 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -7,6 +7,7 @@ #include "chainparams.h" #include "clientversion.h" +#include "hash.h" #include "net.h" #include "pubkey.h" #include "timedata.h" @@ -86,7 +87,7 @@ void CAlert::SetNull() { CUnsignedAlert::SetNull(); vchMsg.clear(); - vchSig.clear(); + scriptSig.clear(); } bool CAlert::IsNull() const @@ -145,16 +146,34 @@ bool CAlert::RelayTo(CNode* pnode) const return false; } +namespace { +class NaiveSignatureChecker : public BaseSignatureChecker +{ +protected: + uint256 hash; + +public: + NaiveSignatureChecker(const std::vector& vchMsg) + { + CSHA256().Write(&vchMsg[0], vchMsg.size()).Finalize(hash.begin()); + } + + bool CheckSig(const std::vector& vchSig, const std::vector& vchPubKey, const CScript& scriptCode) const + { + CPubKey pubkey(vchPubKey); + if (!pubkey.IsValid()) + return false; + return pubkey.Verify(hash, vchSig); + } +}; +} + bool CAlert::CheckSignature() const { - CPubKey key(Params().AlertKey()); - if (!key.Verify(Hash(vchMsg.begin(), vchMsg.end()), vchSig)) - return error("CAlert::CheckSignature() : verify signature failed"); - - // Now unserialize the data - CDataStream sMsg(vchMsg, SER_NETWORK, PROTOCOL_VERSION); - sMsg >> *(CUnsignedAlert*)this; - return true; + const CScript& scriptPubKey = Params().AlertKey(); + NaiveSignatureChecker checker(vchMsg); + unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC | SCRIPT_VERIFY_NULLDUMMY | SCRIPT_VERIFY_SIGPUSHONLY | SCRIPT_VERIFY_MINIMALDATA | SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS; + return VerifyScript(scriptSig, scriptPubKey, flags, checker, NULL); } CAlert CAlert::getAlertByHash(const uint256 &hash) diff --git a/src/alert.h b/src/alert.h index 96c203b557..82238772d7 100644 --- a/src/alert.h +++ b/src/alert.h @@ -6,6 +6,7 @@ #ifndef BITCOIN_ALERT_H #define BITCOIN_ALERT_H +#include "script/interpreter.h" #include "serialize.h" #include "sync.h" @@ -77,7 +78,7 @@ class CAlert : public CUnsignedAlert { public: std::vector vchMsg; - std::vector vchSig; + CScript scriptSig; CAlert() { @@ -89,7 +90,7 @@ public: template inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { READWRITE(vchMsg); - READWRITE(vchSig); + READWRITE(scriptSig); } void SetNull(); diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 4fb9b6cc67..66871958d6 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -92,7 +92,7 @@ public: pchMessageStart[1] = 0xbe; pchMessageStart[2] = 0xb4; pchMessageStart[3] = 0xd9; - vAlertPubKey = ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284"); + scriptAlert = CScript() << OP_TRUE; nDefaultPort = 8333; bnProofOfWorkLimit = ~uint256(0) >> 32; nSubsidyHalvingInterval = 210000; @@ -176,7 +176,6 @@ public: pchMessageStart[1] = 0x11; pchMessageStart[2] = 0x09; pchMessageStart[3] = 0x07; - vAlertPubKey = ParseHex("04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a"); nDefaultPort = 18333; nEnforceBlockUpgradeMajority = 51; nRejectBlockOutdatedMajority = 75; diff --git a/src/chainparams.h b/src/chainparams.h index 34206100a2..6a79edaa8d 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -44,7 +44,7 @@ public: const uint256& HashGenesisBlock() const { return hashGenesisBlock; } const MessageStartChars& MessageStart() const { return pchMessageStart; } - const std::vector& AlertKey() const { return vAlertPubKey; } + const CScript& AlertKey() const { return scriptAlert; } int GetDefaultPort() const { return nDefaultPort; } const uint256& ProofOfWorkLimit() const { return bnProofOfWorkLimit; } int SubsidyHalvingInterval() const { return nSubsidyHalvingInterval; } @@ -85,8 +85,7 @@ protected: uint256 hashGenesisBlock; MessageStartChars pchMessageStart; - //! Raw pub key bytes for the broadcast alert signing key. - std::vector vAlertPubKey; + CScript scriptAlert; int nDefaultPort; uint256 bnProofOfWorkLimit; int nSubsidyHalvingInterval;