Skip to content

Commit f4b8623

Browse files
committed
[Fluid] Add mining update and mint leveldb databases
1 parent 36c4855 commit f4b8623

File tree

9 files changed

+715
-89
lines changed

9 files changed

+715
-89
lines changed

src/Makefile.am

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ DYNAMIC_CORE_H = \
106106
flat-database.h \
107107
fluid/fluid.h \
108108
fluid/fluiddynode.h \
109+
fluid/fluidmining.h \
110+
fluid/fluidmint.h \
109111
governance.h \
110112
governance-classes.h \
111113
governance-exceptions.h \
@@ -228,6 +230,8 @@ libdynamic_server_a_SOURCES = \
228230
dynodeman.cpp \
229231
fluid/fluid.cpp \
230232
fluid/fluiddynode.cpp \
233+
fluid/fluidmining.cpp \
234+
fluid/fluidmint.cpp \
231235
fluid/rpcfluid.cpp \
232236
governance.cpp \
233237
governance-classes.cpp \

src/fluid/fluiddynode.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) 2017 Duality Blockchain Solutions Developers
22

3-
#ifndef FLUID_DB_H
4-
#define FLUID_DB_H
3+
#ifndef FLUID_DYNODE_H
4+
#define FLUID_DYNODE_H
55

66
#include "amount.h"
77
#include "dbwrapper.h"
@@ -105,4 +105,4 @@ bool CheckFluidDynodeDB();
105105

106106
extern CFluidDynodeDB *pFluidDynodeDB;
107107

108-
#endif // FLUID_DB_H
108+
#endif // FLUID_DYNODE_H

src/fluid/fluidmining.cpp

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
// Copyright (c) 2017 Duality Blockchain Solutions Developers
2+
3+
4+
#include "fluidmining.h"
5+
6+
#include "core_io.h"
7+
#include "fluid.h"
8+
#include "operations.h"
9+
#include "script/script.h"
10+
11+
CFluidMiningDB *pFluidMiningDB = NULL;
12+
13+
bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry)
14+
{
15+
std::string fluidOperationString = ScriptToAsmStr(scriptPubKey);
16+
std::string strOperationCode = GetRidOfScriptStatement(fluidOperationString, 0);
17+
std::string verificationWithoutOpCode = GetRidOfScriptStatement(fluidOperationString);
18+
std::vector<std::string> splitString;
19+
HexFunctions hexConvert;
20+
hexConvert.ConvertToString(verificationWithoutOpCode);
21+
SeparateString(verificationWithoutOpCode, splitString, false);
22+
std::string messageTokenKey = splitString.at(0);
23+
std::vector<std::string> vecSplitScript;
24+
SeparateFluidOpString(verificationWithoutOpCode, vecSplitScript);
25+
26+
if (vecSplitScript.size() == 5 && strOperationCode == "OP_REWARD_MINING") {
27+
std::vector<unsigned char> vchFluidOperation = CharVectorFromString(fluidOperationString);
28+
entry.FluidScript.insert(entry.FluidScript.end(), vchFluidOperation.begin(), vchFluidOperation.end());
29+
std::string strAmount = vecSplitScript[0];
30+
CAmount fluidAmount;
31+
if (ParseFixedPoint(strAmount, 8, &fluidAmount)) {
32+
entry.MiningReward = fluidAmount;
33+
}
34+
std::string strTimeStamp = vecSplitScript[1];
35+
int64_t tokenTimeStamp;
36+
if (ParseInt64(strTimeStamp, &tokenTimeStamp)) {
37+
entry.nTimeStamp = tokenTimeStamp;
38+
}
39+
entry.SovereignAddresses.clear();
40+
entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[2], messageTokenKey).ToString()));
41+
entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[3], messageTokenKey).ToString()));
42+
entry.SovereignAddresses.push_back(CharVectorFromString(fluid.GetAddressFromDigestSignature(vecSplitScript[4], messageTokenKey).ToString()));
43+
44+
LogPrintf("GetFluidMiningData: strAmount = %s, strTimeStamp = %d, Addresses1 = %s, Addresses2 = %s, Addresses3 = %s \n",
45+
strAmount, entry.nTimeStamp, StringFromCharVector(entry.SovereignAddresses[0]),
46+
StringFromCharVector(entry.SovereignAddresses[1]), StringFromCharVector(entry.SovereignAddresses[2]));
47+
48+
return true;
49+
}
50+
return false;
51+
}
52+
53+
bool GetFluidMiningData(const CTransaction& tx, CFluidMining& entry, int& nOut)
54+
{
55+
int n = 0;
56+
for (const CTxOut& txout : tx.vout) {
57+
CScript txOut = txout.scriptPubKey;
58+
if (IsTransactionFluid(txOut)) {
59+
nOut = n;
60+
return GetFluidMiningData(txOut, entry);
61+
}
62+
n++;
63+
}
64+
return false;
65+
}
66+
67+
bool CFluidMining::UnserializeFromTx(const CTransaction& tx) {
68+
std::vector<unsigned char> vchData;
69+
std::vector<unsigned char> vchHash;
70+
int nOut;
71+
if(!GetFluidMiningData(tx, *this, nOut))
72+
{
73+
SetNull();
74+
return false;
75+
}
76+
return true;
77+
}
78+
79+
bool CFluidMining::UnserializeFromScript(const CScript& fluidScript) {
80+
std::vector<unsigned char> vchData;
81+
std::vector<unsigned char> vchHash;
82+
if(!GetFluidMiningData(fluidScript, *this))
83+
{
84+
SetNull();
85+
return false;
86+
}
87+
return true;
88+
}
89+
90+
void CFluidMining::Serialize(std::vector<unsigned char>& vchData) {
91+
CDataStream dsFluidOp(SER_NETWORK, PROTOCOL_VERSION);
92+
dsFluidOp << *this;
93+
vchData = std::vector<unsigned char>(dsFluidOp.begin(), dsFluidOp.end());
94+
}
95+
96+
CFluidMiningDB::CFluidMiningDB(size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate) : CDBWrapper(GetDataDir() / "fluid-mining", nCacheSize, fMemory, fWipe, obfuscate)
97+
{
98+
}
99+
100+
bool CFluidMiningDB::AddFluidMiningEntry(const CFluidMining& entry, const int op)
101+
{
102+
bool writeState = false;
103+
{
104+
LOCK(cs_fluid_mining);
105+
writeState = Write(make_pair(std::string("script"), entry.FluidScript), entry)
106+
&& Write(make_pair(std::string("txid"), entry.txHash), entry.FluidScript);
107+
}
108+
109+
return writeState;
110+
}
111+
112+
bool CFluidMiningDB::GetLastFluidMiningRecord(CFluidMining& entry)
113+
{
114+
LOCK(cs_fluid_mining);
115+
std::unique_ptr<CDBIterator> pcursor(NewIterator());
116+
pcursor->SeekToLast();
117+
pcursor->GetValue(entry);
118+
return true;
119+
}
120+
121+
bool CFluidMiningDB::GetAllFluidMiningRecords(std::vector<CFluidMining>& entries)
122+
{
123+
LOCK(cs_fluid_mining);
124+
std::pair<std::string, std::vector<unsigned char> > key;
125+
std::unique_ptr<CDBIterator> pcursor(NewIterator());
126+
pcursor->SeekToFirst();
127+
while (pcursor->Valid()) {
128+
boost::this_thread::interruption_point();
129+
CFluidMining entry;
130+
try {
131+
if (pcursor->GetKey(key) && key.first == "script") {
132+
pcursor->GetValue(entry);
133+
if (!entry.IsNull())
134+
{
135+
entries.push_back(entry);
136+
}
137+
}
138+
pcursor->Next();
139+
}
140+
catch (std::exception& e) {
141+
return error("%s() : deserialize error", __PRETTY_FUNCTION__);
142+
}
143+
}
144+
return true;
145+
}
146+
147+
bool CheckFluidMiningDB()
148+
{
149+
if (!pFluidMiningDB)
150+
return false;
151+
152+
return true;
153+
}

src/fluid/fluidmining.h

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// Copyright (c) 2017 Duality Blockchain Solutions Developers
2+
3+
#ifndef FLUID_MINER
4+
#define FLUID_MINER
5+
6+
#include "amount.h"
7+
#include "dbwrapper.h"
8+
#include "serialize.h"
9+
10+
#include "sync.h"
11+
#include "uint256.h"
12+
13+
class CScript;
14+
class CTransaction;
15+
16+
class CFluidMining {
17+
public:
18+
static const int CURRENT_VERSION=1;
19+
int nVersion;
20+
std::vector<unsigned char> FluidScript;
21+
CAmount MiningReward;
22+
int64_t nTimeStamp;
23+
std::vector<std::vector<unsigned char>> SovereignAddresses;
24+
uint256 txHash;
25+
unsigned int nHeight;
26+
27+
CFluidMining() {
28+
SetNull();
29+
}
30+
31+
CFluidMining(const CTransaction& tx) {
32+
SetNull();
33+
UnserializeFromTx(tx);
34+
}
35+
36+
CFluidMining(const CScript& fluidScript) {
37+
SetNull();
38+
UnserializeFromScript(fluidScript);
39+
}
40+
41+
inline void SetNull()
42+
{
43+
nVersion = CFluidMining::CURRENT_VERSION;
44+
FluidScript.clear();
45+
MiningReward = -1;
46+
nTimeStamp = 0;
47+
SovereignAddresses.clear();
48+
txHash.SetNull();
49+
nHeight = 0;
50+
}
51+
52+
ADD_SERIALIZE_METHODS;
53+
54+
template <typename Stream, typename Operation>
55+
inline void SerializationOp(Stream& s, Operation ser_action) {
56+
READWRITE(this->nVersion);
57+
READWRITE(FluidScript);
58+
READWRITE(MiningReward);
59+
READWRITE(VARINT(nTimeStamp));
60+
READWRITE(SovereignAddresses);
61+
READWRITE(txHash);
62+
READWRITE(VARINT(nHeight));
63+
}
64+
65+
inline friend bool operator==(const CFluidMining& a, const CFluidMining& b) {
66+
return (a.FluidScript == b.FluidScript && a.MiningReward == b.MiningReward && a.nTimeStamp == b.nTimeStamp);
67+
}
68+
69+
inline friend bool operator!=(const CFluidMining& a, const CFluidMining& b) {
70+
return !(a == b);
71+
}
72+
73+
inline CFluidMining operator=(const CFluidMining& b) {
74+
FluidScript = b.FluidScript;
75+
MiningReward = b.MiningReward;
76+
nTimeStamp = b.nTimeStamp;
77+
for (const std::vector<unsigned char>& vchAddress : b.SovereignAddresses)
78+
{
79+
SovereignAddresses.push_back(vchAddress);
80+
}
81+
txHash = b.txHash;
82+
nHeight = b.nHeight;
83+
return *this;
84+
}
85+
86+
inline bool IsNull() const { return (nTimeStamp == 0); }
87+
bool UnserializeFromTx(const CTransaction& tx);
88+
bool UnserializeFromScript(const CScript& fluidScript);
89+
void Serialize(std::vector<unsigned char>& vchData);
90+
};
91+
92+
static CCriticalSection cs_fluid_mining;
93+
94+
class CFluidMiningDB : public CDBWrapper {
95+
public:
96+
CFluidMiningDB(size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate);
97+
bool AddFluidMiningEntry(const CFluidMining& entry, const int op);
98+
bool GetLastFluidMiningRecord(CFluidMining& entry);
99+
bool GetAllFluidMiningRecords(std::vector<CFluidMining>& entries);
100+
};
101+
102+
bool GetFluidMiningData(const CScript& scriptPubKey, CFluidMining& entry);
103+
bool GetFluidMiningData(const CTransaction& tx, CFluidMining& entry, int& nOut);
104+
bool CheckFluidMiningDB();
105+
106+
extern CFluidMiningDB *pFluidMiningDB;
107+
108+
#endif // FLUID_MINER

0 commit comments

Comments
 (0)