]>
Commit | Line | Data |
---|---|---|
0a61b0df | 1 | // Copyright (c) 2009-2010 Satoshi Nakamoto |
f914f1a7 | 2 | // Copyright (c) 2009-2014 The Bitcoin Core developers |
c5b390b6 | 3 | // Distributed under the MIT software license, see the accompanying |
3a25a2b9 | 4 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
51ed9ec9 | 5 | |
223b6f1b WL |
6 | #ifndef BITCOIN_MAIN_H |
7 | #define BITCOIN_MAIN_H | |
8 | ||
35b8af92 | 9 | #if defined(HAVE_CONFIG_H) |
f3967bcc | 10 | #include "config/bitcoin-config.h" |
35b8af92 CF |
11 | #endif |
12 | ||
eda37330 | 13 | #include "amount.h" |
e8b5f0d5 | 14 | #include "chain.h" |
51ed9ec9 | 15 | #include "chainparams.h" |
a0fa20a1 | 16 | #include "coins.h" |
691161d4 | 17 | #include "consensus/consensus.h" |
18 | #include "net.h" | |
d2270111 LD |
19 | #include "primitives/block.h" |
20 | #include "primitives/transaction.h" | |
c4408a6c | 21 | #include "script/script.h" |
5c1e798a | 22 | #include "script/sigcache.h" |
c4408a6c | 23 | #include "script/standard.h" |
51ed9ec9 | 24 | #include "sync.h" |
85c579e3 | 25 | #include "tinyformat.h" |
51ed9ec9 BD |
26 | #include "txmempool.h" |
27 | #include "uint256.h" | |
223b6f1b | 28 | |
51ed9ec9 BD |
29 | #include <algorithm> |
30 | #include <exception> | |
31 | #include <map> | |
32 | #include <set> | |
33 | #include <stdint.h> | |
34 | #include <string> | |
35 | #include <utility> | |
36 | #include <vector> | |
0a61b0df | 37 | |
8a41e1ed PW |
38 | #include <boost/unordered_map.hpp> |
39 | ||
0a61b0df | 40 | class CBlockIndex; |
771d5002 | 41 | class CBlockTreeDB; |
51ed9ec9 | 42 | class CBloomFilter; |
40c2614e | 43 | class CInv; |
771d5002 PK |
44 | class CScriptCheck; |
45 | class CValidationInterface; | |
46 | class CValidationState; | |
47 | ||
771d5002 | 48 | struct CNodeStateStats; |
40c2614e | 49 | |
037b4f14 | 50 | /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/ |
ad898b40 | 51 | static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000; |
037b4f14 | 52 | static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0; |
ad898b40 GA |
53 | /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/ |
54 | static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000; | |
4d9c7fe6 WL |
55 | /** Default for accepting alerts from the P2P network. */ |
56 | static const bool DEFAULT_ALERTS = true; | |
a40034f7 JG |
57 | /** Minimum alert priority for enabling safe mode. */ |
58 | static const int ALERT_PRIORITY_SAFE_MODE = 4000; | |
c5b390b6 | 59 | /** Maximum number of signature check operations in an IsStandard() P2SH script */ |
7f3b4e95 | 60 | static const unsigned int MAX_P2SH_SIGOPS = 15; |
9ee09dc6 | 61 | /** The maximum number of sigops we're willing to relay/mine in a single tx */ |
23f34359 | 62 | static const unsigned int MAX_STANDARD_TX_SIGOPS = MAX_BLOCK_SIGOPS/5; |
aa3c697e GA |
63 | /** Default for -maxorphantx, maximum number of orphan transactions kept in memory */ |
64 | static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100; | |
9d6633ac | 65 | /** The maximum size of a blk?????.dat file (since 0.8) */ |
5382bcf8 | 66 | static const unsigned int MAX_BLOCKFILE_SIZE = 0x8000000; // 128 MiB |
9d6633ac | 67 | /** The pre-allocation chunk size for blk?????.dat files (since 0.8) */ |
bba89aa8 | 68 | static const unsigned int BLOCKFILE_CHUNK_SIZE = 0x1000000; // 16 MiB |
9d6633ac | 69 | /** The pre-allocation chunk size for rev?????.dat files (since 0.8) */ |
bba89aa8 | 70 | static const unsigned int UNDOFILE_CHUNK_SIZE = 0x100000; // 1 MiB |
f9cae832 PW |
71 | /** Maximum number of script-checking threads allowed */ |
72 | static const int MAX_SCRIPTCHECK_THREADS = 16; | |
5409404d PK |
73 | /** -par default (number of script-checking threads, 0 = auto) */ |
74 | static const int DEFAULT_SCRIPTCHECK_THREADS = 0; | |
f59d8f0b | 75 | /** Number of blocks that can be requested at any given time from a single peer. */ |
341735eb PW |
76 | static const int MAX_BLOCKS_IN_TRANSIT_PER_PEER = 16; |
77 | /** Timeout in seconds during which a peer must stall block download progress before being disconnected. */ | |
78 | static const unsigned int BLOCK_STALLING_TIMEOUT = 2; | |
79 | /** Number of headers sent in one getheaders result. We rely on the assumption that if a peer sends | |
7e6d23b1 | 80 | * less than this number, we reached its tip. Changing this value is a protocol upgrade. */ |
b93c8139 | 81 | static const unsigned int MAX_HEADERS_RESULTS = 160; |
341735eb PW |
82 | /** Size of the "block download window": how far ahead of our current height do we fetch? |
83 | * Larger windows tolerate larger download speed differences between peer, but increase the potential | |
84 | * degree of disordering of blocks on disk (which make reindexing and in the future perhaps pruning | |
85 | * harder). We'll probably want to make this a per-peer adaptive value at some point. */ | |
86 | static const unsigned int BLOCK_DOWNLOAD_WINDOW = 1024; | |
67708acf PW |
87 | /** Time to wait (in seconds) between writing blocks/block index to disk. */ |
88 | static const unsigned int DATABASE_WRITE_INTERVAL = 60 * 60; | |
89 | /** Time to wait (in seconds) between flushing chainstate to disk. */ | |
90 | static const unsigned int DATABASE_FLUSH_INTERVAL = 24 * 60 * 60; | |
307f7d48 PW |
91 | /** Maximum length of reject messages. */ |
92 | static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111; | |
f59d8f0b | 93 | |
c6a7e897 DH |
94 | #define equihash_parameters_acceptable(N, K) \ |
95 | ((CBlockHeader::HEADER_SIZE + equihash_solution_size(N, K))*MAX_HEADERS_RESULTS < \ | |
96 | MAX_PROTOCOL_MESSAGE_LENGTH-1000) | |
97 | ||
8a41e1ed PW |
98 | struct BlockHasher |
99 | { | |
80765854 | 100 | size_t operator()(const uint256& hash) const { return hash.GetCheapHash(); } |
8a41e1ed | 101 | }; |
0a61b0df | 102 | |
7bf8b7c2 | 103 | extern CScript COINBASE_FLAGS; |
0a61b0df | 104 | extern CCriticalSection cs_main; |
319b1160 | 105 | extern CTxMemPool mempool; |
8a41e1ed | 106 | typedef boost::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap; |
145d5be8 | 107 | extern BlockMap mapBlockIndex; |
51ed9ec9 BD |
108 | extern uint64_t nLastBlockTx; |
109 | extern uint64_t nLastBlockSize; | |
2bc4fd60 | 110 | extern const std::string strMessageMagic; |
ff6a7af1 LD |
111 | extern CWaitableCriticalSection csBestBlock; |
112 | extern CConditionVariable cvBlockChange; | |
66b02c93 | 113 | extern bool fImporting; |
7fea4846 | 114 | extern bool fReindex; |
f9cae832 | 115 | extern int nScriptCheckThreads; |
2d1fa42e | 116 | extern bool fTxIndex; |
3da434a2 | 117 | extern bool fIsBareMultisigStd; |
3fcfbc8a | 118 | extern bool fCheckBlockIndex; |
a8cdaf5c | 119 | extern bool fCheckpointsEnabled; |
d212ba32 SB |
120 | // TODO: remove this flag by structuring our code such that |
121 | // it is unneeded for testing | |
122 | extern bool fCoinbaseEnforcedProtectionEnabled; | |
fc684ad8 | 123 | extern size_t nCoinCacheUsage; |
13fc83c7 | 124 | extern CFeeRate minRelayTxFee; |
4d9c7fe6 | 125 | extern bool fAlerts; |
0a61b0df | 126 | |
c5b390b6 | 127 | /** Best header we've seen so far (used for getheaders queries' starting points). */ |
ad6e6017 PW |
128 | extern CBlockIndex *pindexBestHeader; |
129 | ||
c5b390b6 | 130 | /** Minimum disk space required - used in CheckDiskSpace() */ |
51ed9ec9 | 131 | static const uint64_t nMinDiskSpace = 52428800; |
0a61b0df | 132 | |
f9ec3f0f | 133 | /** Pruning-related variables and constants */ |
134 | /** True if any block files have ever been pruned. */ | |
135 | extern bool fHavePruned; | |
136 | /** True if we're running in -prune mode. */ | |
137 | extern bool fPruneMode; | |
138 | /** Number of MiB of block files that we're trying to stay below. */ | |
139 | extern uint64_t nPruneTarget; | |
140 | /** Block files containing a block-height within MIN_BLOCKS_TO_KEEP of chainActive.Tip() will not be pruned. */ | |
141 | static const signed int MIN_BLOCKS_TO_KEEP = 288; | |
142 | ||
143 | // Require that user allocate at least 550MB for block & undo files (blk???.dat and rev???.dat) | |
144 | // At 1MB per block, 288 blocks = 288MB. | |
145 | // Add 15% for Undo data = 331MB | |
146 | // Add 20% for Orphan block rate = 397MB | |
147 | // We want the low water mark after pruning to be at least 397 MB and since we prune in | |
148 | // full block file chunks, we need the high water mark which triggers the prune to be | |
149 | // one 128MB block file + added 15% undo data = 147MB greater for a total of 545MB | |
150 | // Setting the target to > than 550MB will make it likely we can respect the target. | |
151 | static const signed int MIN_DISK_SPACE_FOR_BLOCK_FILES = 550 * 1024 * 1024; | |
152 | ||
501da250 EL |
153 | /** Register with a network node to receive its signals */ |
154 | void RegisterNodeSignals(CNodeSignals& nodeSignals); | |
155 | /** Unregister a network node */ | |
156 | void UnregisterNodeSignals(CNodeSignals& nodeSignals); | |
157 | ||
c5b390b6 MF |
158 | /** |
159 | * Process an incoming block. This only returns after the best known valid | |
160 | * block is made active. Note that it does not, however, guarantee that the | |
161 | * specific block passed to it has been checked for validity! | |
162 | * | |
26c16d9d | 163 | * @param[out] state This may be set to an Error state if any error occurred processing it, including during validation/connection/etc of otherwise unrelated blocks during reorganisation; or it may be set to an Invalid state if pblock is itself invalid (but this is not guaranteed even when the block is checked). If you want to *possibly* get feedback on whether pblock is valid, you must also install a CValidationInterface (see validationinterface.h) - this will have its BlockChecked method called whenever *any* block completes validation. |
c5b390b6 MF |
164 | * @param[in] pfrom The node which we are receiving the block from; it is added to mapBlockSource and may be penalised if the block is invalid. |
165 | * @param[in] pblock The block we want to process. | |
304892fc | 166 | * @param[in] fForceProcessing Process this block even if unrequested; used for non-network block sources and whitelisted peers. |
c5b390b6 MF |
167 | * @param[out] dbp If pblock is stored to disk (or already there), this will be set to its location. |
168 | * @return True if state.IsValid() | |
169 | */ | |
35915149 | 170 | bool ProcessNewBlock(int32_t height,CValidationState &state, CNode* pfrom, CBlock* pblock, bool fForceProcessing, CDiskBlockPos *dbp); |
160b028b | 171 | /** Check whether enough disk space is available for an incoming block */ |
51ed9ec9 | 172 | bool CheckDiskSpace(uint64_t nAdditionalBytes = 0); |
160b028b | 173 | /** Open a block file (blk?????.dat) */ |
5382bcf8 | 174 | FILE* OpenBlockFile(const CDiskBlockPos &pos, bool fReadOnly = false); |
160b028b | 175 | /** Open an undo file (rev?????.dat) */ |
5382bcf8 | 176 | FILE* OpenUndoFile(const CDiskBlockPos &pos, bool fReadOnly = false); |
ec7eb0fa SD |
177 | /** Translation to a filesystem path */ |
178 | boost::filesystem::path GetBlockPosFilename(const CDiskBlockPos &pos, const char *prefix); | |
160b028b | 179 | /** Import blocks from an external file */ |
7fea4846 | 180 | bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp = NULL); |
38603761 PW |
181 | /** Initialize a new block tree database + block data on disk */ |
182 | bool InitBlockIndex(); | |
160b028b | 183 | /** Load the block tree and coins database from disk */ |
7fea4846 | 184 | bool LoadBlockIndex(); |
f7f3a96b PW |
185 | /** Unload database information */ |
186 | void UnloadBlockIndex(); | |
160b028b | 187 | /** Process protocol messages received from a given node */ |
0a61b0df | 188 | bool ProcessMessages(CNode* pfrom); |
fc720207 RV |
189 | /** |
190 | * Send queued protocol messages to be sent to a give node. | |
191 | * | |
192 | * @param[in] pto The node which we are sending messages to. | |
193 | * @param[in] fSendTrickle When true send the trickled data, otherwise trickle the data until true. | |
194 | */ | |
0a61b0df | 195 | bool SendMessages(CNode* pto, bool fSendTrickle); |
f9cae832 | 196 | /** Run an instance of the script checking thread */ |
21eb5ada | 197 | void ThreadScriptCheck(); |
36cba8f1 | 198 | /** Try to detect Partition (network isolation) attacks against us */ |
fce474c9 | 199 | void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const CBlockIndex *const &bestHeader, int64_t nPowTargetSpacing); |
f0bf5fb2 | 200 | /** Check whether we are doing an initial block download (synchronizing from disk or network) */ |
0a61b0df | 201 | bool IsInitialBlockDownload(); |
160b028b | 202 | /** Format a string that describes several potential problems detected by the core */ |
223b6f1b | 203 | std::string GetWarnings(std::string strFor); |
160b028b | 204 | /** Retrieve a transaction (from memory pool, or from disk, if possible) */ |
450cbb09 | 205 | bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock, bool fAllowSlow = false); |
160b028b | 206 | /** Find the best known block, and make it the tip of the block chain */ |
92bb6f2f | 207 | bool ActivateBestChain(CValidationState &state, CBlock *pblock = NULL); |
935bd0a4 | 208 | CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams); |
aabdf9e8 | 209 | |
f9ec3f0f | 210 | /** |
211 | * Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a user-defined target. | |
212 | * The user sets the target (in MB) on the command line or in config file. This will be run on startup and whenever new | |
213 | * space is allocated in a block or undo file, staying below the target. Changing back to unpruned requires a reindex | |
214 | * (which in this case means the blockchain must be re-downloaded.) | |
215 | * | |
216 | * Pruning functions are called from FlushStateToDisk when the global fCheckForPruning flag has been set. | |
217 | * Block and undo files are deleted in lock-step (when blk00003.dat is deleted, so is rev00003.dat.) | |
218 | * Pruning cannot take place until the longest chain is at least a certain length (100000 on mainnet, 1000 on testnet, 10 on regtest). | |
219 | * Pruning will never delete a block within a defined distance (currently 288) from the active chain's tip. | |
220 | * The block index is updated by unsetting HAVE_DATA and HAVE_UNDO for any blocks that were stored in the deleted files. | |
221 | * A db flag records the fact that at least some block files have been pruned. | |
222 | * | |
223 | * @param[out] setFilesToPrune The set of file indices that can be unlinked will be returned | |
224 | */ | |
225 | void FindFilesToPrune(std::set<int>& setFilesToPrune); | |
226 | ||
227 | /** | |
228 | * Actually unlink the specified files | |
229 | */ | |
230 | void UnlinkPrunedFiles(std::set<int>& setFilesToPrune); | |
231 | ||
160b028b | 232 | /** Create a new block index entry for a given block hash */ |
2d8a4829 | 233 | CBlockIndex * InsertBlockIndex(uint256 hash); |
b2864d2f PW |
234 | /** Get statistics from node state */ |
235 | bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats); | |
f59d8f0b PW |
236 | /** Increase a node's misbehavior score. */ |
237 | void Misbehaving(NodeId nodeid, int howmuch); | |
51ce901a PW |
238 | /** Flush all state, indexes and buffers to disk. */ |
239 | void FlushStateToDisk(); | |
f9ec3f0f | 240 | /** Prune block files and flush state to disk. */ |
241 | void PruneAndFlush(); | |
857c61df | 242 | |
319b1160 GA |
243 | /** (try to) add transaction to memory pool **/ |
244 | bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, | |
1371e6f5 | 245 | bool* pfMissingInputs, bool fRejectAbsurdFee=false); |
0a61b0df | 246 | |
247 | ||
b2864d2f PW |
248 | struct CNodeStateStats { |
249 | int nMisbehavior; | |
aa815647 | 250 | int nSyncHeight; |
ad6e6017 PW |
251 | int nCommonHeight; |
252 | std::vector<int> vHeightInFlight; | |
b2864d2f PW |
253 | }; |
254 | ||
2d1fa42e PW |
255 | struct CDiskTxPos : public CDiskBlockPos |
256 | { | |
257 | unsigned int nTxOffset; // after header | |
258 | ||
3f6540ad | 259 | ADD_SERIALIZE_METHODS; |
3d796f89 | 260 | |
84881f8c | 261 | template <typename Stream, typename Operation> |
31e9a838 | 262 | inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { |
2d1fa42e PW |
263 | READWRITE(*(CDiskBlockPos*)this); |
264 | READWRITE(VARINT(nTxOffset)); | |
3d796f89 | 265 | } |
2d1fa42e PW |
266 | |
267 | CDiskTxPos(const CDiskBlockPos &blockIn, unsigned int nTxOffsetIn) : CDiskBlockPos(blockIn.nFile, blockIn.nPos), nTxOffset(nTxOffsetIn) { | |
268 | } | |
269 | ||
270 | CDiskTxPos() { | |
271 | SetNull(); | |
272 | } | |
0a61b0df | 273 | |
2d1fa42e PW |
274 | void SetNull() { |
275 | CDiskBlockPos::SetNull(); | |
276 | nTxOffset = 0; | |
277 | } | |
278 | }; | |
0a61b0df | 279 | |
280 | ||
a372168e | 281 | CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowFree); |
788536f1 | 282 | |
c5b390b6 MF |
283 | /** |
284 | * Check transaction inputs, and make sure any | |
285 | * pay-to-script-hash transactions are evaluating IsStandard scripts | |
286 | * | |
287 | * Why bother? To avoid denial-of-service attacks; an attacker | |
288 | * can submit a standard HASH... OP_EQUAL transaction, | |
289 | * which will get accepted into blocks. The redemption | |
290 | * script can be anything; an attacker could use a very | |
291 | * expensive-to-check-upon-redemption script like: | |
292 | * DUP CHECKSIG DROP ... repeated 100 times... OP_1 | |
293 | */ | |
922e8e29 | 294 | |
c5b390b6 MF |
295 | /** |
296 | * Check for standard transaction types | |
297 | * @param[in] mapInputs Map of previous transactions that have outputs we're spending | |
298 | * @return True if all inputs (scriptSigs) use only standard transaction forms | |
299 | */ | |
d0867acb | 300 | bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs); |
8d7849b6 | 301 | |
c5b390b6 MF |
302 | /** |
303 | * Count ECDSA signature operations the old-fashioned (pre-0.6) way | |
304 | * @return number of sigops this transaction's outputs will produce when spent | |
305 | * @see CTransaction::FetchInputs | |
306 | */ | |
05df3fc6 | 307 | unsigned int GetLegacySigOpCount(const CTransaction& tx); |
a206a239 | 308 | |
c5b390b6 MF |
309 | /** |
310 | * Count ECDSA signature operations in pay-to-script-hash inputs. | |
311 | * | |
312 | * @param[in] mapInputs Map of previous transactions that have outputs we're spending | |
313 | * @return maximum number of sigops required to validate this transaction's inputs | |
314 | * @see CTransaction::FetchInputs | |
05df3fc6 | 315 | */ |
d0867acb | 316 | unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& mapInputs); |
0a61b0df | 317 | |
0a61b0df | 318 | |
c5b390b6 MF |
319 | /** |
320 | * Check whether all inputs of this transaction are valid (no double spends, scripts & sigs, amounts) | |
321 | * This does not modify the UTXO set. If pvChecks is not NULL, script checks are pushed onto it | |
322 | * instead of being performed inline. | |
323 | */ | |
10df6fb3 | 324 | bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &view, bool fScriptChecks, |
c0dde76d SB |
325 | unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, |
326 | std::vector<CScriptCheck> *pvChecks = NULL); | |
0a61b0df | 327 | |
2c901fd8 | 328 | bool NonContextualCheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &view, bool fScriptChecks, |
c0dde76d SB |
329 | unsigned int flags, bool cacheStore, const Consensus::Params& consensusParams, |
330 | std::vector<CScriptCheck> *pvChecks = NULL); | |
2c901fd8 | 331 | |
c5b390b6 | 332 | /** Apply the effects of this transaction on the UTXO set represented by view */ |
d7621ccf | 333 | void UpdateCoins(const CTransaction& tx, CValidationState &state, CCoinsViewCache &inputs, int nHeight); |
8d7849b6 | 334 | |
c5b390b6 | 335 | /** Context-independent validity checks */ |
05df3fc6 | 336 | bool CheckTransaction(const CTransaction& tx, CValidationState& state); |
948d4e6c | 337 | bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidationState &state); |
450cbb09 | 338 | |
05df3fc6 | 339 | /** Check for standard transaction types |
c5b390b6 MF |
340 | * @return True if all outputs (scriptPubKeys) use only standard transaction forms |
341 | */ | |
980bfe6e | 342 | bool IsStandardTx(const CTransaction& tx, std::string& reason); |
450cbb09 | 343 | |
75a4d512 PT |
344 | /** |
345 | * Check if transaction is final and can be included in a block with the | |
346 | * specified height and time. Consensus critical. | |
347 | */ | |
348 | bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime); | |
349 | ||
350 | /** | |
351 | * Check if transaction will be final in the next block to be created. | |
352 | * | |
353 | * Calls IsFinalTx() with current block height and appropriate block time. | |
a1d3c6fb MF |
354 | * |
355 | * See consensus/consensus.h for flag definitions. | |
75a4d512 | 356 | */ |
a1d3c6fb | 357 | bool CheckFinalTx(const CTransaction &tx, int flags = -1); |
450cbb09 | 358 | |
c5b390b6 MF |
359 | /** |
360 | * Closure representing one script verification | |
361 | * Note that this stores references to the spending transaction | |
362 | */ | |
2800ce73 PW |
363 | class CScriptCheck |
364 | { | |
365 | private: | |
366 | CScript scriptPubKey; | |
367 | const CTransaction *ptxTo; | |
368 | unsigned int nIn; | |
369 | unsigned int nFlags; | |
e790c370 | 370 | bool cacheStore; |
307f7d48 | 371 | ScriptError error; |
0a61b0df | 372 | |
2800ce73 | 373 | public: |
307f7d48 | 374 | CScriptCheck(): ptxTo(0), nIn(0), nFlags(0), cacheStore(false), error(SCRIPT_ERR_UNKNOWN_ERROR) {} |
e790c370 | 375 | CScriptCheck(const CCoins& txFromIn, const CTransaction& txToIn, unsigned int nInIn, unsigned int nFlagsIn, bool cacheIn) : |
2800ce73 | 376 | scriptPubKey(txFromIn.vout[txToIn.vin[nInIn].prevout.n].scriptPubKey), |
307f7d48 | 377 | ptxTo(&txToIn), nIn(nInIn), nFlags(nFlagsIn), cacheStore(cacheIn), error(SCRIPT_ERR_UNKNOWN_ERROR) { } |
2800ce73 | 378 | |
307f7d48 | 379 | bool operator()(); |
2800ce73 PW |
380 | |
381 | void swap(CScriptCheck &check) { | |
382 | scriptPubKey.swap(check.scriptPubKey); | |
383 | std::swap(ptxTo, check.ptxTo); | |
384 | std::swap(nIn, check.nIn); | |
385 | std::swap(nFlags, check.nFlags); | |
e790c370 | 386 | std::swap(cacheStore, check.cacheStore); |
307f7d48 | 387 | std::swap(error, check.error); |
2800ce73 | 388 | } |
307f7d48 PW |
389 | |
390 | ScriptError GetScriptError() const { return error; } | |
2800ce73 | 391 | }; |
0a61b0df | 392 | |
0a61b0df | 393 | |
a6dba0fd | 394 | /** Functions for disk access for blocks */ |
e6973430 | 395 | bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos, const CMessageHeader::MessageStartChars& messageStart); |
f2dd868d | 396 | bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos); |
397 | bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex); | |
0a61b0df | 398 | |
399 | ||
5c363ed6 EL |
400 | /** Functions for validating blocks and updating the block tree */ |
401 | ||
402 | /** Undo the effects of this block (with given index) on the UTXO set represented by coins. | |
403 | * In case pfClean is provided, operation will try to be tolerant about errors, and *pfClean | |
404 | * will be true if no problems were found. Otherwise, the return value will be false in case | |
405 | * of problems. Note that in any case, coins may be modified. */ | |
406 | bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool* pfClean = NULL); | |
407 | ||
c5b390b6 | 408 | /** Apply the effects of this block (with given index) on the UTXO set represented by coins */ |
df08a626 | 409 | bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& coins, bool fJustCheck = false); |
f3ae51dc | 410 | |
c5b390b6 | 411 | /** Context-independent validity checks */ |
9ef4eb9f | 412 | bool CheckBlockHeader(int32_t height,CBlockIndex *pindex,const CBlockHeader& blockhdr, CValidationState& state, bool fCheckPOW = true); |
0d24f3ed | 413 | bool CheckBlock(int32_t height,CBlockIndex *pindex,const CBlock& block, CValidationState& state, bool fCheckPOW = true, bool fCheckMerkleRoot = true); |
38991ffa | 414 | |
c5b390b6 | 415 | /** Context-dependent validity checks */ |
a48f2d6d LD |
416 | bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex *pindexPrev); |
417 | bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIndex *pindexPrev); | |
418 | ||
c5b390b6 | 419 | /** Check a block is completely valid from start to finish (only works on top of our current best block, with cs_main held) */ |
df08a626 LD |
420 | bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex *pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true); |
421 | ||
304892fc SD |
422 | /** Store block on disk. If dbp is non-NULL, the file is known to already reside on disk */ |
423 | bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex **pindex, bool fRequested, CDiskBlockPos* dbp); | |
341735eb | 424 | bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex **ppindex= NULL); |
2a4d3464 | 425 | |
5c363ed6 EL |
426 | |
427 | ||
5382bcf8 PW |
428 | class CBlockFileInfo |
429 | { | |
430 | public: | |
c5b390b6 MF |
431 | unsigned int nBlocks; //! number of blocks stored in file |
432 | unsigned int nSize; //! number of used bytes of block file | |
433 | unsigned int nUndoSize; //! number of used bytes in the undo file | |
434 | unsigned int nHeightFirst; //! lowest height of block in file | |
435 | unsigned int nHeightLast; //! highest height of block in file | |
436 | uint64_t nTimeFirst; //! earliest time of block in file | |
437 | uint64_t nTimeLast; //! latest time of block in file | |
5382bcf8 | 438 | |
3f6540ad | 439 | ADD_SERIALIZE_METHODS; |
3d796f89 | 440 | |
84881f8c | 441 | template <typename Stream, typename Operation> |
31e9a838 | 442 | inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { |
5382bcf8 PW |
443 | READWRITE(VARINT(nBlocks)); |
444 | READWRITE(VARINT(nSize)); | |
445 | READWRITE(VARINT(nUndoSize)); | |
446 | READWRITE(VARINT(nHeightFirst)); | |
447 | READWRITE(VARINT(nHeightLast)); | |
448 | READWRITE(VARINT(nTimeFirst)); | |
449 | READWRITE(VARINT(nTimeLast)); | |
3d796f89 | 450 | } |
5382bcf8 PW |
451 | |
452 | void SetNull() { | |
453 | nBlocks = 0; | |
454 | nSize = 0; | |
455 | nUndoSize = 0; | |
456 | nHeightFirst = 0; | |
457 | nHeightLast = 0; | |
458 | nTimeFirst = 0; | |
459 | nTimeLast = 0; | |
460 | } | |
461 | ||
462 | CBlockFileInfo() { | |
463 | SetNull(); | |
464 | } | |
465 | ||
651480c8 | 466 | std::string ToString() const; |
5382bcf8 | 467 | |
c5b390b6 | 468 | /** update statistics (does not update nSize) */ |
51ed9ec9 | 469 | void AddBlock(unsigned int nHeightIn, uint64_t nTimeIn) { |
5382bcf8 PW |
470 | if (nBlocks==0 || nHeightFirst > nHeightIn) |
471 | nHeightFirst = nHeightIn; | |
472 | if (nBlocks==0 || nTimeFirst > nTimeIn) | |
473 | nTimeFirst = nTimeIn; | |
474 | nBlocks++; | |
367c29d6 | 475 | if (nHeightIn > nHeightLast) |
5382bcf8 PW |
476 | nHeightLast = nHeightIn; |
477 | if (nTimeIn > nTimeLast) | |
478 | nTimeLast = nTimeIn; | |
479 | } | |
480 | }; | |
481 | ||
06a91d96 CL |
482 | /** RAII wrapper for VerifyDB: Verify consistency of the block and coin databases */ |
483 | class CVerifyDB { | |
484 | public: | |
06a91d96 CL |
485 | CVerifyDB(); |
486 | ~CVerifyDB(); | |
2e280311 | 487 | bool VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth); |
06a91d96 CL |
488 | }; |
489 | ||
6db83db3 | 490 | /** Find the last common block between the parameter chain and a locator. */ |
491 | CBlockIndex* FindForkInGlobalIndex(const CChain& chain, const CBlockLocator& locator); | |
0a61b0df | 492 | |
9b0a8d31 PW |
493 | /** Mark a block as invalid. */ |
494 | bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex); | |
495 | ||
496 | /** Remove invalidity status from a block and its descendants. */ | |
497 | bool ReconsiderBlock(CValidationState& state, CBlockIndex *pindex); | |
498 | ||
4c6d41b8 PW |
499 | /** The currently-connected chain of blocks. */ |
500 | extern CChain chainActive; | |
0a61b0df | 501 | |
d979e6e3 | 502 | /** Global variable that points to the active CCoinsView (protected by cs_main) */ |
ae8bfd12 PW |
503 | extern CCoinsViewCache *pcoinsTip; |
504 | ||
d979e6e3 PW |
505 | /** Global variable that points to the active block tree (protected by cs_main) */ |
506 | extern CBlockTreeDB *pblocktree; | |
507 | ||
093303a8 | 508 | #endif // BITCOIN_MAIN_H |