@@ -121,6 +121,7 @@ void CUnsignedVGPMessage::SetNull()
121
121
nTimeStamp = 0 ;
122
122
nRelayUntil = 0 ;
123
123
vchMessageData.clear ();
124
+ nNonce = 0 ;
124
125
}
125
126
126
127
std::string CUnsignedVGPMessage::ToString () const
@@ -135,6 +136,8 @@ std::string CUnsignedVGPMessage::ToString() const
135
136
" nTimeStamp = %d\n "
136
137
" nRelayUntil = %d\n "
137
138
" Message Size = %d\n "
139
+ " nNonce = %d\n "
140
+ " Hash = %s\n "
138
141
" )\n " ,
139
142
nVersion,
140
143
SubjectID.ToString (),
@@ -143,7 +146,17 @@ std::string CUnsignedVGPMessage::ToString() const
143
146
stringFromVch (vchWalletPubKey),
144
147
nTimeStamp,
145
148
nRelayUntil,
146
- vchMessageData.size ());
149
+ vchMessageData.size (),
150
+ nNonce,
151
+ GetHash ().ToString ()
152
+ );
153
+ }
154
+
155
+ uint256 CUnsignedVGPMessage::GetHash () const
156
+ {
157
+ CDataStream dsMessageData (SER_NETWORK, PROTOCOL_VERSION);
158
+ dsMessageData << *this ;
159
+ return hash_Argon2d (dsMessageData.begin (), dsMessageData.end (), 1 );
147
160
}
148
161
149
162
bool CUnsignedVGPMessage::EncryptMessage (const std::vector<unsigned char >& vchType, const std::vector<unsigned char >& vchMessage, const std::vector<unsigned char >& vchSenderFQDN,
@@ -249,6 +262,14 @@ CVGPMessage::CVGPMessage(CUnsignedVGPMessage& unsignedMessage)
249
262
unsignedMessage.Serialize (vchMsg);
250
263
}
251
264
265
+ int CVGPMessage::Version () const
266
+ {
267
+ if (vchMsg.size () == 0 )
268
+ return -1 ;
269
+
270
+ return CUnsignedVGPMessage (vchMsg).nVersion ;
271
+ }
272
+
252
273
void CVGPMessage::SetNull ()
253
274
{
254
275
vchMsg.clear ();
@@ -262,7 +283,11 @@ bool CVGPMessage::IsNull() const
262
283
263
284
uint256 CVGPMessage::GetHash () const
264
285
{
265
- return Hash (this ->vchMsg .begin (), this ->vchMsg .end ());
286
+ CUnsignedVGPMessage unsignedMessage (vchMsg);
287
+ if (unsignedMessage.nVersion == 1 )
288
+ return Hash (this ->vchMsg .begin (), this ->vchMsg .end ());
289
+
290
+ return unsignedMessage.GetHash ();
266
291
}
267
292
268
293
bool CVGPMessage::IsInEffect () const
@@ -366,6 +391,12 @@ int CVGPMessage::ProcessMessage(std::string& strErrorMessage) const
366
391
strErrorMessage = " VGP message has an invalid signature. Adding 100 to ban score." ;
367
392
return 100 ; // this will add 100 to the peer's ban score
368
393
}
394
+ if (unsignedMessage.nVersion > 1 && UintToArith256 (unsignedMessage.GetHash ()) > UintToArith256 (VGP_MESSAGE_MIN_HASH_TARGET))
395
+ {
396
+ LogPrintf (" %s -- message %s\n " , __func__, unsignedMessage.ToString ());
397
+ strErrorMessage = " Message proof of work is invalid and under the target." ;
398
+ return 100 ; // this will add 100 to the peer's ban score
399
+ }
369
400
// check if message is for me. if, validate MessageID. If MessageID validates okay, store in memory map.
370
401
int nMyLinkStatus = pLinkManager->IsMyMessage (unsignedMessage.SubjectID , unsignedMessage.MessageID , unsignedMessage.nTimeStamp );
371
402
if (nMyLinkStatus == 1 )
@@ -403,6 +434,30 @@ bool CVGPMessage::RelayTo(CNode* pnode, CConnman& connman) const
403
434
return true ;
404
435
}
405
436
437
+ void CVGPMessage::MineMessage ()
438
+ {
439
+ int64_t nStart = GetTimeMillis ();
440
+ CUnsignedVGPMessage message (vchMsg);
441
+ message.nNonce = 0 ;
442
+ arith_uint256 besthash = UintToArith256 (uint256S (" ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" ));
443
+ arith_uint256 hashTarget = UintToArith256 (VGP_MESSAGE_MIN_HASH_TARGET);
444
+ arith_uint256 newhash = UintToArith256 (message.GetHash ());
445
+ while (newhash > hashTarget) {
446
+ message.nNonce ++;
447
+ if (message.nNonce == 0 ) {
448
+ ++message.nTimeStamp ;
449
+ ++message.nRelayUntil ;
450
+ }
451
+ if (newhash < besthash) {
452
+ besthash = newhash;
453
+ LogPrint (" bdap" , " %s -- New best: %s\n " , __func__, newhash.GetHex ());
454
+ }
455
+ newhash = UintToArith256 (message.GetHash ());
456
+ }
457
+ message.Serialize (vchMsg);
458
+ LogPrintf (" %s -- Milliseconds %d, nNonce %d, Hash %s\n " , __func__, GetTimeMillis () - nStart, message.nNonce , GetHash ().ToString ());
459
+ }
460
+
406
461
bool GetSecretSharedKey (const std::string& strSenderFQDN, const std::string& strRecipientFQDN, CKeyEd25519& key, std::string& strErrorMessage)
407
462
{
408
463
if (!pLinkManager)
0 commit comments