После того как
laanwj (Вова) раскрыл alert key, будет целесообразным поделиться им здесь.
Возможно кому то будет интересно поковыряться в этом фрагменте кода, вероятно последнем кусочке кода опубликованным Сатоши.
Можете просмотреть на github: https://gist.github.com/laanwj/0e689cfa37b52bcbbb44Дополнительная информация:
https://gist.github.com/jimmysong/4c72d098255b217b4c8c (для тестирования и исправления)
Compile Bitcoin with sendalert.cpp to make a CAlert broadcaster and run with -sendalert.
sendalert.cpp:
// *** CONFIDENTIAL - NOT FOR RELEASE ***
#include "headers.h"
static const int64 DAYS = 24 * 60 * 60;
void ThreadSendAlert();
class CSendAlert
{
public:
CSendAlert()
{
boost::thread(bind(ThreadSendAlert));
}
~CSendAlert()
{
}
}
instance_of_csendalert;
void ThreadSendAlert()
{
Sleep(2000);
if (!mapArgs.count("-sendalert") && !mapArgs.count("-printalert"))
return;
// Create alert -- set your parameters here
CAlert alert;
alert.nRelayUntil = GetTime() + 15 * 60;
alert.nExpiration = GetTime() + 1 * DAY;
alert.nID = 1001;
alert.nCancel = 0; // cancels previous messages up to this ID number
alert.nMinVer = 31600;
alert.nMaxVer = 31600;
alert.nPriority = 5000;
alert.strComment = "";
alert.strStatusBar = "a new version is available";
// Sign
const char* pszPrivKey = "30820113020101042053cdc1e0cfac07f7e1c312768886f4635f6bceebec0887f63a9d37a26a92e6b6a081a53081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101a14403420004fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284";
vector vchTmp(ParseHex(pszPrivKey));
CPrivKey vchPrivKey(vchTmp.begin(), vchTmp.end());
CDataStream sMsg;
sMsg << *(CUnsignedAlert*)&alert;
alert.vchMsg = vector(sMsg.begin(), sMsg.end());
CKey key;
if (!key.SetPrivKey(vchPrivKey))
{
printf("ThreadSendAlert() : key.SetPrivKey failed\n");
return;
}
if (!key.Sign(Hash(alert.vchMsg.begin(), alert.vchMsg.end()), alert.vchSig))
{
printf("ThreadSendAlert() : key.Sign failed\n");
return;
}
// Test
CDataStream sBuffer;
sBuffer << alert;
CAlert alert2;
sBuffer >> alert2;
if (!alert2.CheckSignature())
{
printf("ThreadSendAlert() : CheckSignature failed\n");
return;
}
assert(alert2.vchMsg == alert.vchMsg);
assert(alert2.vchSig == alert.vchSig);
alert.SetNull();
printf("\nThreadSendAlert:\n");
printf("hash=%s\n", alert2.GetHash().ToString().c_str());
alert2.print();
printf("vchMsg.size()=%d, vchSig.size()=%d\n", alert2.vchMsg.size(), alert2.vchSig.size());
printf("vchMsg=%s\n", HexStr(alert2.vchMsg).c_str());
printf("vchSig=%s\n", HexStr(alert2.vchSig).c_str());
// Confirm
if (!mapArgs.count("-sendalert"))
return;
while (vNodes.size() < 1 && !fShutdown)
Sleep(500);
if (fShutdown)
return;
if (ThreadSafeMessageBox("Send alert?", "ThreadSendAlert", wxYES_NO | wxNO_DEFAULT) != wxYES)
return;
if (ThreadSafeMessageBox("Send alert, are you sure?", "ThreadSendAlert", wxYES_NO | wxNO_DEFAULT) != wxYES)
{
ThreadSafeMessageBox("Nothing sent", "ThreadSendAlert", wxOK);
return;
}
// Send
printf("ThreadSendAlert() : Sending alert\n");
int nSent = 0;
CRITICAL_BLOCK(cs_vNodes)
{
foreach(CNode* pnode, vNodes)
{
if (alert2.RelayTo(pnode))
{
printf("ThreadSendAlert() : Sent alert to %s\n", pnode->addr.ToString().c_str());
nSent++;
}
}
}
printf("ThreadSendAlert() : Alert sent to %d nodes\n", nSent);
ThreadSafeMessageBox(strprintf("Alert sent to %d nodes", nSent), "ThreadSendAlert", wxOK);
}