forked from zcash/zcash
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of zcash#1105 - bitcartel:zc.v0.11.2.z6_issue_424, r=ebfull
New private/public key pairs for broadcasting alert messages Implements zcash#424 Fixes and integrates method of sending alerts as described by upstream here: - https://gist.github.com/laanwj/0e689cfa37b52bcbbb44 To send an alert: - Copy private keys into alertkeys.h. - Modify alert parameters and message found in sendalert.cpp - Build and run to send the alert e.g. ./zcashd -printtoconsole -sendalert Tested and verified with local nodes on alpha 6 testnet.
- Loading branch information
Showing
7 changed files
with
340 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef BITCOIN_ALERTKEYS_H | ||
#define BITCOIN_ALERTKEYS_H | ||
|
||
// REMINDER: DO NOT COMMIT YOUR PRIVATE KEYS TO THE GIT REPOSITORY! | ||
|
||
const char* pszPrivKey = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; | ||
const char* pszTestNetPrivKey = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; | ||
|
||
#endif | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
// Copyright (c) 2016 The Zcash developers | ||
// Original code from: https://gist.github.com/laanwj/0e689cfa37b52bcbbb44 | ||
|
||
/* | ||
To set up a new alert system | ||
---------------------------- | ||
Create a new alert key pair: | ||
openssl ecparam -name secp256k1 -genkey -param_enc explicit -outform PEM -out data.pem | ||
Get the private key in hex: | ||
openssl ec -in data.pem -outform DER | tail -c 279 | xxd -p -c 279 | ||
Get the public key in hex: | ||
openssl ec -in data.pem -pubout -outform DER | tail -c 65 | xxd -p -c 65 | ||
Update the public keys found in chainparams.cpp. | ||
To send an alert message | ||
------------------------ | ||
Copy the private keys into alertkeys.h. | ||
Modify the alert parameters, id and message found in this file. | ||
Build and run with -sendalert or -printalert. | ||
./zcashd -printtoconsole -sendalert | ||
One minute after starting up, the alert will be broadcast. It is then | ||
flooded through the network until the nRelayUntil time, and will be | ||
active until nExpiration OR the alert is cancelled. | ||
If you make a mistake, send another alert with nCancel set to cancel | ||
the bad alert. | ||
*/ | ||
|
||
#include "main.h" | ||
#include "net.h" | ||
#include "alert.h" | ||
#include "init.h" | ||
|
||
#include "util.h" | ||
#include "utiltime.h" | ||
#include "key.h" | ||
#include "clientversion.h" | ||
#include "chainparams.h" | ||
|
||
#include "alertkeys.h" | ||
|
||
|
||
static const int64_t DAYS = 24 * 60 * 60; | ||
|
||
void ThreadSendAlert() | ||
{ | ||
if (!mapArgs.count("-sendalert") && !mapArgs.count("-printalert")) | ||
return; | ||
|
||
MilliSleep(60*1000); // Wait a minute so we get connected | ||
|
||
// | ||
// Alerts are relayed around the network until nRelayUntil, flood | ||
// filling to every node. | ||
// After the relay time is past, new nodes are told about alerts | ||
// when they connect to peers, until either nExpiration or | ||
// the alert is cancelled by a newer alert. | ||
// Nodes never save alerts to disk, they are in-memory-only. | ||
// | ||
CAlert alert; | ||
alert.nRelayUntil = GetTime() + 15 * 60; | ||
alert.nExpiration = GetTime() + 365 * 60 * 60; | ||
alert.nID = 1000; // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs | ||
alert.nCancel = 0; // cancels previous messages up to this ID number | ||
|
||
// These versions are protocol versions | ||
// 70002 : 0.11.2.* | ||
alert.nMinVer = 70002; | ||
alert.nMaxVer = 70002; | ||
|
||
// | ||
// main.cpp: | ||
// 1000 for Misc warnings like out of disk space and clock is wrong | ||
// 2000 for longer invalid proof-of-work chain | ||
// Higher numbers mean higher priority | ||
alert.nPriority = 5000; | ||
alert.strComment = ""; | ||
alert.strStatusBar = "URGENT: Upgrade required: see https://z.cash"; | ||
|
||
// Set specific client version/versions here. If setSubVer is empty, no filtering on subver is done: | ||
// alert.setSubVer.insert(std::string("/Satoshi:0.7.2/")); | ||
|
||
// Sign | ||
const CChainParams& chainparams = Params(); | ||
std::string networkID = chainparams.NetworkIDString(); | ||
bool fIsTestNet = networkID.compare("test") == 0; | ||
std::vector<unsigned char> vchTmp(ParseHex(fIsTestNet ? pszTestNetPrivKey : pszPrivKey)); | ||
CPrivKey vchPrivKey(vchTmp.begin(), vchTmp.end()); | ||
|
||
CDataStream sMsg(SER_NETWORK, CLIENT_VERSION); | ||
sMsg << *(CUnsignedAlert*)&alert; | ||
alert.vchMsg = std::vector<unsigned char>(sMsg.begin(), sMsg.end()); | ||
CKey key; | ||
if (!key.SetPrivKey(vchPrivKey, false)) | ||
{ | ||
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(SER_NETWORK, CLIENT_VERSION); | ||
sBuffer << alert; | ||
CAlert alert2; | ||
sBuffer >> alert2; | ||
if (!alert2.CheckSignature(chainparams.AlertKey())) | ||
{ | ||
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()); | ||
printf("%s\n", alert2.ToString().c_str()); | ||
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 && !ShutdownRequested()) | ||
MilliSleep(500); | ||
if (ShutdownRequested()) | ||
return; | ||
|
||
// Send | ||
printf("ThreadSendAlert() : Sending alert\n"); | ||
int nSent = 0; | ||
{ | ||
LOCK(cs_vNodes); | ||
BOOST_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); | ||
} |
Oops, something went wrong.