Skip to content
13 changes: 13 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,19 @@ build-aux/m4/ltversion.m4
build-aux/missing
build-aux/compile
build-aux/test-driver
src/build-aux/config.guess
src/build-aux/config.sub
src/build-aux/depcomp
src/build-aux/install-sh
src/build-aux/ltmain.sh
src/build-aux/libtool.m4
src/build-aux/lt~obsolete.m4
src/build-aux/ltoptions.m4
src/build-aux/ltsugar.m4
src/build-aux/ltversion.m4
src/build-aux/missing
src/build-aux/compile
src/build-aux/test-driver
config.log
config.status
configure
Expand Down
2 changes: 2 additions & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ BITCOIN_CORE_H = \
tinyformat.h \
txdb.h \
txmempool.h \
ubi.h \
ui_interface.h \
uint256.h \
util.h \
Expand Down Expand Up @@ -122,6 +123,7 @@ libbitcoin_server_a_SOURCES = \
leveldbwrapper.cpp \
main.cpp \
miner.cpp \
ubi.cpp \
net.cpp \
noui.cpp \
richlistdb.cpp \
Expand Down
33 changes: 31 additions & 2 deletions src/coins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ bool CCoinsView::GetDexList(const std::string &key, std::tuple<std::string, std:
bool CCoinsView::SetDexList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value) { return false; }
bool CCoinsView::GetBookList(const std::string &key, std::tuple<std::string, std::string, std::string> &value) { return false; }
bool CCoinsView::SetBookList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value) { return false; }
bool CCoinsView::GetNPList(const std::string &key, std::tuple<std::string, std::string, std::string> &value) { return false; }
bool CCoinsView::SetNPList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value) { return false; }
bool CCoinsView::HaveCoins(const uint256 &txid) { return false; }
uint256 CCoinsView::GetBestBlock() { return uint256(0); }
bool CCoinsView::SetBestBlock(const uint256 &hashBlock) { return false; }
Expand All @@ -72,6 +74,7 @@ bool CCoinsView::BatchWrite(const std::map<uint256, CCoins> &mapCoins, const std
const std::map<std::string, std::tuple<std::string, std::string> > &mapServiceUbiList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceDexList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceBookList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceNPList,
const uint256 &hashBlock) { return false; }
bool CCoinsView::GetStats(CCoinsStats &stats) { return false; }

Expand All @@ -91,6 +94,8 @@ bool CCoinsViewBacked::GetDexList(const std::string &key, std::tuple<std::string
bool CCoinsViewBacked::SetDexList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value) { return base->SetDexList(key, value); }
bool CCoinsViewBacked::GetBookList(const std::string &key, std::tuple<std::string, std::string, std::string> &value) { return base->GetBookList(key, value); }
bool CCoinsViewBacked::SetBookList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value) { return base->SetBookList(key, value); }
bool CCoinsViewBacked::GetNPList(const std::string &key, std::tuple<std::string, std::string, std::string> &value) { return base->GetNPList(key, value); }
bool CCoinsViewBacked::SetNPList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value) { return base->SetNPList(key, value); }
bool CCoinsViewBacked::HaveCoins(const uint256 &txid) { return base->HaveCoins(txid); }
uint256 CCoinsViewBacked::GetBestBlock() { return base->GetBestBlock(); }
bool CCoinsViewBacked::SetBestBlock(const uint256 &hashBlock) { return base->SetBestBlock(hashBlock); }
Expand All @@ -101,7 +106,8 @@ bool CCoinsViewBacked::BatchWrite(const std::map<uint256, CCoins> &mapCoins, con
const std::map<std::string, std::tuple<std::string, std::string> > &mapServiceUbiList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceDexList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceBookList,
const uint256 &hashBlock) { return base->BatchWrite(mapCoins, mapAddressInfo, mapServiceInfo, mapServiceTicketList, mapServiceUbiList, mapServiceDexList, mapServiceBookList, hashBlock); }
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceNPList,
const uint256 &hashBlock) { return base->BatchWrite(mapCoins, mapAddressInfo, mapServiceInfo, mapServiceTicketList, mapServiceUbiList, mapServiceDexList, mapServiceBookList, mapServiceNPList, hashBlock); }
bool CCoinsViewBacked::GetStats(CCoinsStats &stats) { return base->GetStats(stats); }

CCoinsViewCache::CCoinsViewCache(CCoinsView &baseIn, bool fDummy) : CCoinsViewBacked(baseIn), hashBlock(0) { }
Expand Down Expand Up @@ -230,6 +236,25 @@ bool CCoinsViewCache::SetBookList(const std::string &key, const std::tuple<std::
return true;
}

bool CCoinsViewCache::GetNPList(const std::string &key, std::tuple<std::string, std::string, std::string> &value) {
std::map<std::string, std::tuple<std::string, std::string, std::string> >::iterator it = cacheServiceNPList.find(key);

if(it!=cacheServiceNPList.end()) {
value = it->second;
return true;
}
if(base->GetNPList(key,value)) {
cacheServiceNPList[key] = value;
return true;
}
return false;
}

bool CCoinsViewCache::SetNPList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value) {
cacheServiceNPList[key] = value;
return true;
}

std::map<uint256,CCoins>::iterator CCoinsViewCache::FetchCoins(const uint256 &txid) {
std::map<uint256,CCoins>::iterator it = cacheCoins.lower_bound(txid);
if (it != cacheCoins.end() && it->first == txid)
Expand Down Expand Up @@ -275,6 +300,7 @@ bool CCoinsViewCache::BatchWrite(const std::map<uint256, CCoins> &mapCoins,
const std::map<std::string, std::tuple<std::string, std::string> > &mapServiceUbiList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceDexList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceBookList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceNPList,
const uint256 &hashBlockIn) {
for (std::map<uint256, CCoins>::const_iterator it = mapCoins.begin(); it != mapCoins.end(); it++)
cacheCoins[it->first] = it->second;
Expand All @@ -290,13 +316,15 @@ bool CCoinsViewCache::BatchWrite(const std::map<uint256, CCoins> &mapCoins,
cacheServiceDexList[it->first] = it->second;
for (std::map<std::string, std::tuple<std::string, std::string, std::string> >::const_iterator it = mapServiceBookList.begin(); it != mapServiceBookList.end(); it++)
cacheServiceBookList[it->first] = it->second;
for (std::map<std::string, std::tuple<std::string, std::string, std::string> >::const_iterator it = mapServiceNPList.begin(); it != mapServiceNPList.end(); it++)
cacheServiceNPList[it->first] = it->second;

hashBlock = hashBlockIn;
return true;
}

bool CCoinsViewCache::Flush() {
bool fOk = base->BatchWrite(cacheCoins, cacheAddressInfo, cacheServiceInfo, cacheServiceTicketList, cacheServiceUbiList, cacheServiceDexList, cacheServiceBookList, hashBlock);
bool fOk = base->BatchWrite(cacheCoins, cacheAddressInfo, cacheServiceInfo, cacheServiceTicketList, cacheServiceUbiList, cacheServiceDexList, cacheServiceBookList, cacheServiceNPList, hashBlock);
if (fOk) {
cacheCoins.clear();
cacheAddressInfo.clear();
Expand All @@ -305,6 +333,7 @@ bool CCoinsViewCache::Flush() {
cacheServiceUbiList.clear();
cacheServiceDexList.clear();
cacheServiceBookList.clear();
cacheServiceNPList.clear();
}
return fOk;
}
Expand Down
13 changes: 13 additions & 0 deletions src/coins.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,11 @@ class CCoinsView
//Modify the balance of and height where a given scriptPubKey was last used - servicebooklist
virtual bool SetBookList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);

virtual bool GetNPList(const std::string &key, std::tuple<std::string, std::string, std::string> &value);

//Modify the balance of and height where a given scriptPubKey was last used - servicebooklist
virtual bool SetNPList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);

//Just check whether we have data for a given txid.
virtual bool HaveCoins(const uint256 &txid);

Expand All @@ -264,6 +269,7 @@ class CCoinsView
const std::map<std::string, std::tuple<std::string, std::string> > &mapServiceUbiList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceDexList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceBookList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceNPList,
const uint256 &hashBlock);

//Calculate statistics about the unspent transaction output set
Expand Down Expand Up @@ -296,6 +302,8 @@ class CCoinsViewBacked : public CCoinsView
bool SetDexList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);
bool GetBookList(const std::string &key, std::tuple<std::string, std::string, std::string> &value);
bool SetBookList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);
bool GetNPList(const std::string &key, std::tuple<std::string, std::string, std::string> &value);
bool SetNPList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);
bool HaveCoins(const uint256 &txid);
uint256 GetBestBlock();
bool SetBestBlock(const uint256 &hashBlock);
Expand All @@ -306,6 +314,7 @@ class CCoinsViewBacked : public CCoinsView
const std::map<std::string, std::tuple<std::string, std::string> > &mapServiceUbiList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceDexList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceBookList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceNPList,
const uint256 &hashBlock);
bool GetStats(CCoinsStats &stats);
};
Expand All @@ -323,6 +332,7 @@ class CCoinsViewCache : public CCoinsViewBacked
std::map<std::string, std::tuple<std::string, std::string> > cacheServiceUbiList;
std::map<std::string, std::tuple<std::string, std::string, std::string> > cacheServiceDexList;
std::map<std::string, std::tuple<std::string, std::string, std::string> > cacheServiceBookList;
std::map<std::string, std::tuple<std::string, std::string, std::string> > cacheServiceNPList;

public:
CCoinsViewCache(CCoinsView &baseIn, bool fDummy = false);
Expand All @@ -342,6 +352,8 @@ class CCoinsViewCache : public CCoinsViewBacked
bool SetDexList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);
bool GetBookList(const std::string &key, std::tuple<std::string, std::string, std::string> &value);
bool SetBookList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);
bool GetNPList(const std::string &key, std::tuple<std::string, std::string, std::string> &value);
bool SetNPList(const std::string &key, const std::tuple<std::string, std::string, std::string> &value);
bool HaveCoins(const uint256 &txid);
uint256 GetBestBlock();
bool SetBestBlock(const uint256 &hashBlock);
Expand All @@ -351,6 +363,7 @@ class CCoinsViewCache : public CCoinsViewBacked
const std::map<std::string, std::tuple<std::string, std::string> > &mapServiceUbiList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceDexList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceBookList,
const std::map<std::string, std::tuple<std::string, std::string, std::string> > &mapServiceNPList,
const uint256 &hashBlock);

//Return a modifiable reference to a CCoins. Check HaveCoins first.
Expand Down
29 changes: 29 additions & 0 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,7 @@ bool AppInit2(boost::thread_group& threadGroup)
fServer = GetBoolArg("-server", false);
fPrintToConsole = GetBoolArg("-printtoconsole", false);
fLogTimestamps = GetBoolArg("-logtimestamps", true);
fUBI = GetBoolArg("-ubi", false);
setvbuf(stdout, NULL, _IOLBF, 0);
#ifdef ENABLE_WALLET
bool fDisableWallet = GetBoolArg("-disablewallet", false);
Expand Down Expand Up @@ -891,6 +892,11 @@ bool AppInit2(boost::thread_group& threadGroup)
break;
}

if (!InitServiceNPList(*pcoinsdbview)) {
strLoadError = _("Error initializing service np list. You need to rebuild the database using -reindex");
break;
}

// Reading rich addresses into memory
if(!pcoinsdbview -> GetRichAddresses(RichList)) {
strLoadError = _("Error loading rich list");
Expand Down Expand Up @@ -927,6 +933,12 @@ bool AppInit2(boost::thread_group& threadGroup)
break;
}

// reading npos addresses into memory
if(!pcoinsdbview -> GetNPList(ServiceItemList)) {
strLoadError = _("Error loading service np list");
break;
}

// Initialize the block index (no-op if non-empty database was already loaded)
if (!InitBlockIndex()) {
strLoadError = _("Error initializing block database");
Expand Down Expand Up @@ -981,6 +993,13 @@ bool AppInit2(boost::thread_group& threadGroup)
ServiceItemList.SetForked(fFork);
}

if(!pblocktree -> ReadServiceNPListFork(fFork)) {
strLoadError = _("Error reading service np chapter list fork status");
break;
} else {
ServiceItemList.SetForked(fFork);
}

uiInterface.InitMessage(_("Verifying blocks..."));
if (!VerifyDB(GetArg("-checklevel", 3),
GetArg("-checkblocks", 288))) {
Expand Down Expand Up @@ -1048,6 +1067,16 @@ bool AppInit2(boost::thread_group& threadGroup)
}
}

if(fFork) {
if(!ServiceItemList.UpdateNPListHeights()) {
strLoadError = _("Error rollbacking NP chapter list heights");
break;
}
else {
ServiceItemList.SetForked(false);
}
}

} catch(std::exception &e) {
if (fDebug) LogPrintf("%s\n", e.what());
strLoadError = _("Error opening block database");
Expand Down
Loading