@@ -77,14 +77,22 @@ void ProcessSpork(CNode* pfrom, std::string& strCommand, CDataStream& vRecv)
77
77
uint256 hash = spork.GetHash ();
78
78
if (mapSporksActive.count (spork.nSporkID )) {
79
79
if (mapSporksActive[spork.nSporkID ].nTimeSigned >= spork.nTimeSigned ) {
80
- if (fDebug ) LogPrintf (" spork - seen %s block %d \n " , hash.ToString (), chainActive.Tip ()->nHeight );
80
+ if (fDebug ) LogPrintf (" %s : seen %s block %d \n " , __func__ , hash.ToString (), chainActive.Tip ()->nHeight );
81
81
return ;
82
82
} else {
83
- if (fDebug ) LogPrintf (" spork - got updated spork %s block %d \n " , hash.ToString (), chainActive.Tip ()->nHeight );
83
+ if (fDebug ) LogPrintf (" %s : got updated spork %s block %d \n " , __func__ , hash.ToString (), chainActive.Tip ()->nHeight );
84
84
}
85
85
}
86
86
87
- LogPrintf (" spork - new %s ID %d Time %d bestHeight %d\n " , hash.ToString (), spork.nSporkID , spork.nValue , chainActive.Tip ()->nHeight );
87
+ LogPrintf (" %s : new %s ID %d Time %d bestHeight %d\n " , __func__, hash.ToString (), spork.nSporkID , spork.nValue , chainActive.Tip ()->nHeight );
88
+
89
+ if (spork.nTimeSigned >= Params ().NewSporkStart ()) {
90
+ if (!sporkManager.CheckSignature (spork, true )) {
91
+ LogPrintf (" %s : Invalid Signature\n " , __func__);
92
+ Misbehaving (pfrom->GetId (), 100 );
93
+ return ;
94
+ }
95
+ }
88
96
89
97
if (!sporkManager.CheckSignature (spork)) {
90
98
LogPrintf (" spork - invalid signature\n " );
@@ -130,7 +138,7 @@ int64_t GetSporkValue(int nSporkID)
130
138
if (nSporkID == SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2) r = SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2_DEFAULT;
131
139
if (nSporkID == SPORK_16_ZEROCOIN_MAINTENANCE_MODE) r = SPORK_16_ZEROCOIN_MAINTENANCE_MODE_DEFAULT;
132
140
133
- if (r == -1 ) LogPrintf (" GetSpork:: Unknown Spork %d\n " , nSporkID);
141
+ if (r == -1 ) LogPrintf (" %s : Unknown Spork %d\n " , __func__ , nSporkID);
134
142
}
135
143
136
144
return r;
@@ -176,13 +184,23 @@ void ReprocessBlocks(int nBlocks)
176
184
}
177
185
}
178
186
179
- bool CSporkManager::CheckSignature (CSporkMessage& spork)
187
+ bool CSporkManager::CheckSignature (CSporkMessage& spork, bool fCheckSigner )
180
188
{
181
189
// note: need to investigate why this is failing
182
190
std::string strMessage = boost::lexical_cast<std::string>(spork.nSporkID ) + boost::lexical_cast<std::string>(spork.nValue ) + boost::lexical_cast<std::string>(spork.nTimeSigned );
183
191
CPubKey pubkeynew (ParseHex (Params ().SporkKey ()));
184
192
std::string errorMessage = " " ;
185
- if (obfuScationSigner.VerifyMessage (pubkeynew, spork.vchSig , strMessage, errorMessage)) {
193
+ if (fCheckSigner && !obfuScationSigner.VerifyMessage (pubkeynew, spork.vchSig ,strMessage, errorMessage))
194
+ return false ;
195
+
196
+ if (GetAdjustedTime () < Params ().RejectOldSporkKey ()) {
197
+ CPubKey pubkeyold (ParseHex (Params ().SporkKeyOld ()));
198
+ if (obfuScationSigner.VerifyMessage (pubkeynew, spork.vchSig , strMessage, errorMessage) ||
199
+ obfuScationSigner.VerifyMessage (pubkeyold, spork.vchSig , strMessage, errorMessage)) {
200
+ return true ;
201
+ }
202
+ }
203
+ else if (obfuScationSigner.VerifyMessage (pubkeynew, spork.vchSig , strMessage, errorMessage)) {
186
204
return true ;
187
205
}
188
206
@@ -247,7 +265,7 @@ bool CSporkManager::SetPrivKey(std::string strPrivKey)
247
265
248
266
Sign (msg);
249
267
250
- if (CheckSignature (msg)) {
268
+ if (CheckSignature (msg, true )) {
251
269
LogPrintf (" CSporkManager::SetPrivKey - Successfully initialized as spork signer\n " );
252
270
return true ;
253
271
} else {
@@ -288,4 +306,3 @@ std::string CSporkManager::GetSporkNameByID(int id)
288
306
289
307
return " Unknown" ;
290
308
}
291
-
0 commit comments