]> Git Repo - VerusCoin.git/blob - src/sendalert.cpp
Fix exception
[VerusCoin.git] / src / sendalert.cpp
1 // Copyright (c) 2016 The Zcash developers
2 // Original code from: https://gist.github.com/laanwj/0e689cfa37b52bcbbb44
3
4 /*
5
6 To set up a new alert system
7 ----------------------------
8
9 Create a new alert key pair:
10 openssl ecparam -name secp256k1 -genkey -param_enc explicit -outform PEM -out data.pem
11
12 Get the private key in hex:
13 openssl ec -in data.pem -outform DER | tail -c 279 | xxd -p -c 279
14
15 Get the public key in hex:
16 openssl ec -in data.pem -pubout -outform DER | tail -c 65 | xxd -p -c 65
17
18 Update the public keys found in chainparams.cpp.
19
20
21 To send an alert message
22 ------------------------
23
24 Copy the private keys into alertkeys.h.
25
26 Modify the alert parameters, id and message found in this file.
27
28 Build and run with -sendalert or -printalert.
29
30 ./zcashd -printtoconsole -sendalert
31
32 One minute after starting up, the alert will be broadcast. It is then
33 flooded through the network until the nRelayUntil time, and will be
34 active until nExpiration OR the alert is cancelled.
35
36 If you make a mistake, send another alert with nCancel set to cancel
37 the bad alert.
38
39 */
40
41 #include "main.h"
42 #include "net.h"
43 #include "alert.h"
44 #include "init.h"
45
46 #include "util.h"
47 #include "utiltime.h"
48 #include "key.h"
49 #include "clientversion.h"
50 #include "chainparams.h"
51
52 #include "alertkeys.h"
53
54
55 static const int64_t DAYS = 24 * 60 * 60;
56
57 void ThreadSendAlert()
58 {
59     if (!mapArgs.count("-sendalert") && !mapArgs.count("-printalert"))
60         return;
61
62     MilliSleep(60*1000); // Wait a minute so we get connected
63
64     //
65     // Alerts are relayed around the network until nRelayUntil, flood
66     // filling to every node.
67     // After the relay time is past, new nodes are told about alerts
68     // when they connect to peers, until either nExpiration or
69     // the alert is cancelled by a newer alert.
70     // Nodes never save alerts to disk, they are in-memory-only.
71     //
72     CAlert alert;
73     alert.nRelayUntil   = GetTime() + 15 * 60;
74     alert.nExpiration   = GetTime() + 12 * 30 * 24 * 60 * 60;
75     alert.nID           = 1004;  // use https://github.com/zcash/zcash/wiki/specification#assigned-numbers to keep track of alert IDs
76     alert.nCancel       = 1001;  // cancels previous messages up to this ID number
77
78     // These versions are protocol versions
79     // 170002 : 1.0.0
80     alert.nMinVer       = 170002;
81     alert.nMaxVer       = 170002;
82
83     //
84     // main.cpp:
85     //  1000 for Misc warnings like out of disk space and clock is wrong
86     //  2000 for longer invalid proof-of-work chain
87     //  Higher numbers mean higher priority
88     //  4000 or higher will put the RPC into safe mode
89     alert.nPriority     = 4000;
90     alert.strComment    = "";
91     alert.strStatusBar  = "Your client version 1.0.10 has degraded networking behavior. Please update to the most recent version of Zcash (1.0.10-1 or later).";
92     alert.strRPCError   = alert.strStatusBar;
93
94     // Set specific client version/versions here. If setSubVer is empty, no filtering on subver is done:
95     // alert.setSubVer.insert(std::string("/MagicBean:0.7.2/"));
96     const std::vector<std::string> useragents = {"MagicBean", "BeanStalk", "AppleSeed", "EleosZcash"};
97
98     BOOST_FOREACH(const std::string& useragent, useragents) {
99         alert.setSubVer.insert(std::string("/"+useragent+":1.0.10/"));
100     }
101
102     // Sanity check
103     assert(alert.strComment.length() <= 65536); // max length in alert.h
104     assert(alert.strStatusBar.length() <= 256);
105     assert(alert.strRPCError.length() <= 256);
106
107     // Sign
108     const CChainParams& chainparams = Params();
109     std::string networkID = chainparams.NetworkIDString();
110     bool fIsTestNet = networkID.compare("test") == 0;
111     std::vector<unsigned char> vchTmp(ParseHex(fIsTestNet ? pszTestNetPrivKey : pszPrivKey));
112     CPrivKey vchPrivKey(vchTmp.begin(), vchTmp.end());
113
114     CDataStream sMsg(SER_NETWORK, CLIENT_VERSION);
115     sMsg << *(CUnsignedAlert*)&alert;
116     alert.vchMsg = std::vector<unsigned char>(sMsg.begin(), sMsg.end());
117     CKey key;
118     if (!key.SetPrivKey(vchPrivKey, false))
119     {
120         printf("ThreadSendAlert() : key.SetPrivKey failed\n");
121         return;
122     }
123     if (!key.Sign(Hash(alert.vchMsg.begin(), alert.vchMsg.end()), alert.vchSig))
124     {
125         printf("ThreadSendAlert() : key.Sign failed\n");
126         return;
127     }
128
129     // Test
130     CDataStream sBuffer(SER_NETWORK, CLIENT_VERSION);
131     sBuffer << alert;
132     CAlert alert2;
133     sBuffer >> alert2;
134     if (!alert2.CheckSignature(chainparams.AlertKey()))
135     {
136         printf("ThreadSendAlert() : CheckSignature failed\n");
137         return;
138     }
139     assert(alert2.vchMsg == alert.vchMsg);
140     assert(alert2.vchSig == alert.vchSig);
141     alert.SetNull();
142     printf("\nThreadSendAlert:\n");
143     printf("hash=%s\n", alert2.GetHash().ToString().c_str());
144     printf("%s\n", alert2.ToString().c_str());
145     printf("vchMsg=%s\n", HexStr(alert2.vchMsg).c_str());
146     printf("vchSig=%s\n", HexStr(alert2.vchSig).c_str());
147
148     // Confirm
149     if (!mapArgs.count("-sendalert"))
150         return;
151     while (vNodes.size() < 1 && !ShutdownRequested())
152         MilliSleep(500);
153     if (ShutdownRequested())
154         return;
155
156     // Send
157     printf("ThreadSendAlert() : Sending alert\n");
158     int nSent = 0;
159     {
160         LOCK(cs_vNodes);
161         BOOST_FOREACH(CNode* pnode, vNodes)
162         {
163             if (alert2.RelayTo(pnode))
164             {
165                 printf("ThreadSendAlert() : Sent alert to %s\n", pnode->addr.ToString().c_str());
166                 nSent++;
167             }
168         }
169     }
170     printf("ThreadSendAlert() : Alert sent to %d nodes\n", nSent);
171 }
This page took 0.03332 seconds and 4 git commands to generate.