]> Git Repo - VerusCoin.git/blob - src/notarisationdb.cpp
Build fix
[VerusCoin.git] / src / notarisationdb.cpp
1 #include "dbwrapper.h"
2 #include "notarisationdb.h"
3 #include "uint256.h"
4 #include "cc/eval.h"
5 #include "main.h"
6
7 #include <boost/foreach.hpp>
8
9
10 NotarisationDB *pnotarisations;
11
12
13 NotarisationDB::NotarisationDB(size_t nCacheSize, bool fMemory, bool fWipe) : CDBWrapper(GetDataDir() / "notarisations", nCacheSize, fMemory, fWipe, false, 64) { }
14
15
16 NotarisationsInBlock ScanBlockNotarisations(const CBlock &block, int nHeight)
17 {
18     EvalRef eval;
19     NotarisationsInBlock vNotarisations;
20
21     for (unsigned int i = 0; i < block.vtx.size(); i++) {
22         CTransaction tx = block.vtx[i];
23
24         // Special case for TXSCL. Should prob be removed at some point.
25         bool isTxscl = 0;
26         {
27             NotarisationData data;
28             if (ParseNotarisationOpReturn(tx, data))
29                 if (IsTXSCL(data.symbol))
30                     isTxscl = 1;
31         }
32
33         if (isTxscl || eval->CheckNotaryInputs(tx, nHeight, block.nTime)) {
34             NotarisationData data;
35             if (ParseNotarisationOpReturn(tx, data)) {
36                 vNotarisations.push_back(std::make_pair(tx.GetHash(), data));
37                 //printf("Parsed a notarisation for: %s, txid:%s, ccid:%i, momdepth:%i\n",
38                 //      data.symbol, tx.GetHash().GetHex().data(), data.ccId, data.MoMDepth);
39                 //if (!data.MoMoM.IsNull()) printf("MoMoM:%s\n", data.MoMoM.GetHex().data());
40             }
41             else
42                 LogPrintf("WARNING: Couldn't parse notarisation for tx: %s at height %i\n",
43                         tx.GetHash().GetHex().data(), nHeight);
44         }
45     }
46     return vNotarisations;
47 }
48
49 bool IsTXSCL(const char* symbol)
50 {
51     return strlen(symbol) >= 5 && strncmp(symbol, "TXSCL", 5) == 0;
52 }
53
54
55 bool GetBlockNotarisations(uint256 blockHash, NotarisationsInBlock &nibs)
56 {
57     return pnotarisations->Read(blockHash, nibs);
58 }
59
60
61 bool GetBackNotarisation(uint256 notarisationHash, Notarisation &n)
62 {
63     return pnotarisations->Read(notarisationHash, n);
64 }
65
66
67 /*
68  * Write an index of KMD notarisation id -> backnotarisation
69  */
70 void WriteBackNotarisations(const NotarisationsInBlock notarisations, CDBBatch &batch)
71 {
72     int wrote = 0;
73     BOOST_FOREACH(const Notarisation &n, notarisations)
74     {
75         if (!n.second.txHash.IsNull()) {
76             batch.Write(n.second.txHash, n);
77             wrote++;
78         }
79     }
80 }
81
82
83 void EraseBackNotarisations(const NotarisationsInBlock notarisations, CDBBatch &batch)
84 {
85     BOOST_FOREACH(const Notarisation &n, notarisations)
86     {
87         if (!n.second.txHash.IsNull())
88             batch.Erase(n.second.txHash);
89     }
90 }
91
92 /*
93  * Scan notarisationsdb backwards for blocks containing a notarisation
94  * for given symbol. Return height of matched notarisation or 0.
95  */
96 int ScanNotarisationsDB(int height, std::string symbol, int scanLimitBlocks, Notarisation& out)
97 {
98     if (height < 0 || height > chainActive.Height())
99         return false;
100
101     for (int i=0; i<scanLimitBlocks; i++) {
102         if (i > height) break;
103         NotarisationsInBlock notarisations;
104         uint256 blockHash = *chainActive[height-i]->phashBlock;
105         if (!GetBlockNotarisations(blockHash, notarisations))
106             continue;
107
108         BOOST_FOREACH(Notarisation& nota, notarisations) {
109             if (strcmp(nota.second.symbol, symbol.data()) == 0) {
110                 out = nota;
111                 return height-i;
112             }
113         }
114     }
115     return 0;
116 }
This page took 0.030115 seconds and 4 git commands to generate.