Skip to content

Commit d8f8063

Browse files
alexalex
alex
authored and
alex
committed
Second pre-release update
* Use maximum timeweight as a split/combine threshold (instead of age); * Remove BDB transactions index support, include some basic optimizations of leveldb wrapper; *
1 parent 68fbc35 commit d8f8063

20 files changed

+107
-783
lines changed

novacoin-qt.pro

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -91,34 +91,26 @@ contains(BITCOIN_NEED_QT_PLUGINS, 1) {
9191
QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets
9292
}
9393

94-
contains(USE_LEVELDB, -) {
95-
message(Building without LevelDB)
96-
SOURCES += src/txdb-bdb.cpp
94+
INCLUDEPATH += src/leveldb/include src/leveldb/helpers
95+
LIBS += $$PWD/src/leveldb/libleveldb.a $$PWD/src/leveldb/libmemenv.a
96+
SOURCES += src/txdb-leveldb.cpp
97+
!win32 {
98+
# we use QMAKE_CXXFLAGS_RELEASE even without RELEASE=1 because we use RELEASE to indicate linking preferences not -O preferences
99+
genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a
97100
} else {
98-
message(Building with LevelDB)
99-
DEFINES += USE_LEVELDB
100-
101-
INCLUDEPATH += src/leveldb/include src/leveldb/helpers
102-
LIBS += $$PWD/src/leveldb/libleveldb.a $$PWD/src/leveldb/libmemenv.a
103-
SOURCES += src/txdb-leveldb.cpp
104-
!win32 {
105-
# we use QMAKE_CXXFLAGS_RELEASE even without RELEASE=1 because we use RELEASE to indicate linking preferences not -O preferences
106-
genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a
107-
} else {
108-
# make an educated guess about what the ranlib command is called
109-
isEmpty(QMAKE_RANLIB) {
110-
QMAKE_RANLIB = $$replace(QMAKE_STRIP, strip, ranlib)
111-
}
112-
LIBS += -lshlwapi
113-
genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
101+
# make an educated guess about what the ranlib command is called
102+
isEmpty(QMAKE_RANLIB) {
103+
QMAKE_RANLIB = $$replace(QMAKE_STRIP, strip, ranlib)
114104
}
115-
genleveldb.target = $$PWD/src/leveldb/libleveldb.a
116-
genleveldb.depends = FORCE
117-
PRE_TARGETDEPS += $$PWD/src/leveldb/libleveldb.a
118-
QMAKE_EXTRA_TARGETS += genleveldb
119-
# Gross ugly hack that depends on qmake internals, unfortunately there is no other way to do it.
120-
QMAKE_CLEAN += $$PWD/src/leveldb/libleveldb.a; cd $$PWD/src/leveldb ; $(MAKE) clean
105+
LIBS += -lshlwapi
106+
genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a
121107
}
108+
genleveldb.target = $$PWD/src/leveldb/libleveldb.a
109+
genleveldb.depends = FORCE
110+
PRE_TARGETDEPS += $$PWD/src/leveldb/libleveldb.a
111+
QMAKE_EXTRA_TARGETS += genleveldb
112+
# Gross ugly hack that depends on qmake internals, unfortunately there is no other way to do it.
113+
QMAKE_CLEAN += $$PWD/src/leveldb/libleveldb.a; cd $$PWD/src/leveldb ; $(MAKE) clean
122114

123115
# regenerate src/build.h
124116
!windows|contains(USE_BUILD_INFO, 1) {
@@ -342,16 +334,6 @@ SOURCES += src/qt/qrcodedialog.cpp
342334
FORMS += src/qt/forms/qrcodedialog.ui
343335
}
344336

345-
contains(BITCOIN_QT_TEST, 1) {
346-
SOURCES += src/qt/test/test_main.cpp \
347-
src/qt/test/uritests.cpp
348-
HEADERS += src/qt/test/uritests.h
349-
DEPENDPATH += src/qt/test
350-
QT += testlib
351-
TARGET = novacoin-qt_test
352-
DEFINES += BITCOIN_QT_TEST
353-
}
354-
355337
CODECFORTR = UTF-8
356338

357339
# for lrelease/lupdate
@@ -373,7 +355,7 @@ QMAKE_EXTRA_COMPILERS += TSQM
373355

374356
# "Other files" to show in Qt Creator
375357
OTHER_FILES += \
376-
doc/*.rst doc/*.txt doc/README README.md res/bitcoin-qt.rc src/test/*.cpp src/test/*.h src/qt/test/*.cpp src/qt/test/*.h
358+
doc/*.rst doc/*.txt doc/README README.md res/bitcoin-qt.rc
377359

378360
# platform specific defaults, if not overridden on command line
379361
isEmpty(BOOST_LIB_SUFFIX) {

src/checkpoints.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,6 @@ namespace Checkpoints
164164
if (!txdb.TxnCommit())
165165
return error("WriteSyncCheckpoint(): failed to commit to db sync checkpoint %s", hashCheckpoint.ToString().c_str());
166166

167-
#ifndef USE_LEVELDB
168-
txdb.Close();
169-
#endif
170-
171167
Checkpoints::hashSyncCheckpoint = hashCheckpoint;
172168
return true;
173169
}
@@ -198,9 +194,6 @@ namespace Checkpoints
198194
}
199195
}
200196

201-
#ifndef USE_LEVELDB
202-
txdb.Close();
203-
#endif
204197
if (!WriteSyncCheckpoint(hashPendingCheckpoint))
205198
return error("AcceptPendingSyncCheckpoint(): failed to write sync checkpoint %s", hashPendingCheckpoint.ToString().c_str());
206199
hashPendingCheckpoint = 0;
@@ -286,11 +279,6 @@ namespace Checkpoints
286279
{
287280
return error("ResetSyncCheckpoint: SetBestChain failed for hardened checkpoint %s", hash.ToString().c_str());
288281
}
289-
290-
#ifndef USE_LEVELDB
291-
txdb.Close();
292-
#endif
293-
294282
}
295283
else if(!mapBlockIndex.count(hash))
296284
{
@@ -457,10 +445,6 @@ bool CSyncCheckpoint::ProcessSyncCheckpoint(CNode* pfrom)
457445
}
458446
}
459447

460-
#ifndef USE_LEVELDB
461-
txdb.Close();
462-
#endif
463-
464448
if (!Checkpoints::WriteSyncCheckpoint(hashCheckpoint))
465449
return error("ProcessSyncCheckpoint(): failed to write sync checkpoint %s", hashCheckpoint.ToString().c_str());
466450
Checkpoints::checkpointMessage = *this;

src/db.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -111,31 +111,6 @@ bool CDBEnv::Open(boost::filesystem::path pathEnv_)
111111
fDbEnvInit = true;
112112
fMockDb = false;
113113

114-
#ifndef USE_LEVELDB
115-
// Check that the number of locks is sufficient (to prevent chain fork possibility, read http://bitcoin.org/may15 for more info)
116-
u_int32_t nMaxLocks;
117-
if (!dbenv.get_lk_max_locks(&nMaxLocks))
118-
{
119-
int nBlocks, nDeepReorg;
120-
std::string strMessage;
121-
122-
nBlocks = nMaxLocks / 48768;
123-
nDeepReorg = (nBlocks - 1) / 2;
124-
125-
printf("Final lk_max_locks is %lu, sufficient for (worst case) %d block%s in a single transaction (up to a %d-deep reorganization)\n", (unsigned long)nMaxLocks, nBlocks, (nBlocks == 1) ? "" : "s", nDeepReorg);
126-
if (nDeepReorg < 3)
127-
{
128-
if (nBlocks < 1)
129-
strMessage = strprintf(_("Warning: DB_CONFIG has set_lk_max_locks %lu, which may be too low for a single block. If this limit is reached, NovaCoin may stop working."), (unsigned long)nMaxLocks);
130-
else
131-
strMessage = strprintf(_("Warning: DB_CONFIG has set_lk_max_locks %lu, which may be too low for a common blockchain reorganization. If this limit is reached, NovaCoin may stop working."), (unsigned long)nMaxLocks);
132-
133-
strMiscWarning = strMessage;
134-
printf("*** %s\n", strMessage.c_str());
135-
}
136-
}
137-
#endif
138-
139114
return true;
140115
}
141116

src/init.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ CClientUIInterface uiInterface;
3131
std::string strWalletFileName;
3232
unsigned int nNodeLifespan;
3333
unsigned int nDerivationMethodIndex;
34+
unsigned int nMinerSleep;
3435
bool fUseFastIndex;
36+
bool fUseFastStakeMiner;
3537
enum Checkpoints::CPMode CheckpointsMode;
3638

3739
//////////////////////////////////////////////////////////////////////////////
@@ -360,6 +362,7 @@ bool AppInit2()
360362

361363
nNodeLifespan = GetArg("-addrlifespan", 7);
362364
fUseFastIndex = GetBoolArg("-fastindex", true);
365+
nMinerSleep = GetArg("-minersleep", 500);
363366

364367
CheckpointsMode = Checkpoints::STRICT;
365368
std::string strCpMode = GetArg("-cppolicy", "strict");

src/kernel.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ static std::map<int, unsigned int> mapStakeModifierCheckpointsTestNet =
3131
( 0, 0x0e00670bu )
3232
;
3333

34+
// Get time weight
35+
int64 GetWeight(int64 nIntervalBeginning, int64 nIntervalEnd)
36+
{
37+
// Kernel hash weight starts from 0 at the 30-day min age
38+
// this change increases active coins participating the hash and helps
39+
// to secure the network when proof-of-stake difficulty is low
40+
//
41+
// Maximum TimeWeight is 90 days.
42+
43+
return min(nIntervalEnd - nIntervalBeginning - nStakeMinAge, (int64)nStakeMaxAge);
44+
}
45+
3446
// Get the last stake modifier and its generation time from a given block
3547
static bool GetLastStakeModifier(const CBlockIndex* pindex, uint64& nStakeModifier, int64& nModifierTime)
3648
{
@@ -275,17 +287,9 @@ bool CheckStakeKernelHash(unsigned int nBits, const CBlock& blockFrom, unsigned
275287
bnTargetPerCoinDay.SetCompact(nBits);
276288
int64 nValueIn = txPrev.vout[prevout.n].nValue;
277289

278-
int64 nTimeWeight;
279290
uint256 hashBlockFrom = blockFrom.GetHash();
280291

281-
// Kernel hash weight starts from 0 at the 30-day min age
282-
// this change increases active coins participating the hash and helps
283-
// to secure the network when proof-of-stake difficulty is low
284-
//
285-
// Maximum TimeWeight is 90 days.
286-
nTimeWeight = min((int64)nTimeTx - txPrev.nTime - nStakeMinAge, (int64)nStakeMaxAge);
287-
288-
CBigNum bnCoinDayWeight = CBigNum(nValueIn) * nTimeWeight / COIN / (24 * 60 * 60);
292+
CBigNum bnCoinDayWeight = CBigNum(nValueIn) * GetWeight((int64)txPrev.nTime, (int64)nTimeTx) / COIN / (24 * 60 * 60);
289293
targetProofOfStake = (bnCoinDayWeight * bnTargetPerCoinDay).getuint256();
290294

291295
// Calculate hash
@@ -347,10 +351,6 @@ bool CheckProofOfStake(const CTransaction& tx, unsigned int nBits, uint256& hash
347351
if (!txPrev.ReadFromDisk(txdb, txin.prevout, txindex))
348352
return tx.DoS(1, error("CheckProofOfStake() : INFO: read txPrev failed")); // previous transaction not in main chain, may occur during initial download
349353

350-
#ifndef USE_LEVELDB
351-
txdb.Close();
352-
#endif
353-
354354
// Verify signature
355355
if (!VerifySignature(txPrev, tx, 0, true, 0))
356356
return tx.DoS(100, error("CheckProofOfStake() : VerifySignature failed on coinstake %s", tx.GetHash().ToString().c_str()));

src/kernel.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,7 @@ unsigned int GetStakeModifierChecksum(const CBlockIndex* pindex);
3333
// Check stake modifier hard checkpoints
3434
bool CheckStakeModifierCheckpoints(int nHeight, unsigned int nStakeModifierChecksum);
3535

36+
// Get time weight using supplied timestamps
37+
int64 GetWeight(int64 nIntervalBeginning, int64 nIntervalEnd);
38+
3639
#endif // PPCOIN_KERNEL_H

src/main.cpp

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ uint256 nPoWBase = uint256("0x00000000ffff00000000000000000000000000000000000000
4444

4545
CBigNum bnProofOfWorkLimitTestNet(~uint256(0) >> 16);
4646

47-
unsigned int nStakeMinAge = 60 * 60 * 24 * 30; // 30 days as minimum age for coin age
48-
unsigned int nStakeMaxAge = 60 * 60 * 24 * 90; // 90 days as stake age of full weight
47+
unsigned int nStakeMinAge = 60 * 60 * 24 * 30; // 30 days as zero time weight
48+
unsigned int nStakeMaxAge = 60 * 60 * 24 * 90; // 90 days as full weight
4949
unsigned int nStakeTargetSpacing = 10 * 60; // 10-minute stakes spacing
5050
unsigned int nModifierInterval = 6 * 60 * 60; // time to elapse before new modifier is computed
5151

@@ -2701,10 +2701,9 @@ bool LoadBlockIndex(bool fAllowNew)
27012701
//
27022702
// Load block index
27032703
//
2704-
CTxDB txdb("cr");
2704+
CTxDB txdb("cr+");
27052705
if (!txdb.LoadBlockIndex())
27062706
return false;
2707-
txdb.Close();
27082707

27092708
//
27102709
// Init with genesis block
@@ -2767,25 +2766,19 @@ bool LoadBlockIndex(bool fAllowNew)
27672766
return error("LoadBlockIndex() : failed to init sync checkpoint");
27682767
}
27692768

2770-
// ppcoin: if checkpoint master key changed must reset sync-checkpoint
2771-
{
2772-
CTxDB txdb;
2773-
string strPubKey = "";
2774-
if (!txdb.ReadCheckpointPubKey(strPubKey) || strPubKey != CSyncCheckpoint::strMasterPubKey)
2775-
{
2776-
// write checkpoint master key to db
2777-
txdb.TxnBegin();
2778-
if (!txdb.WriteCheckpointPubKey(CSyncCheckpoint::strMasterPubKey))
2779-
return error("LoadBlockIndex() : failed to write new checkpoint master key to db");
2780-
if (!txdb.TxnCommit())
2781-
return error("LoadBlockIndex() : failed to commit new checkpoint master key to db");
2782-
if ((!fTestNet) && !Checkpoints::ResetSyncCheckpoint())
2783-
return error("LoadBlockIndex() : failed to reset sync-checkpoint");
2784-
}
2785-
#ifndef USE_LEVELDB
2786-
txdb.Close();
2787-
#endif
2769+
string strPubKey = "";
27882770

2771+
// if checkpoint master key changed must reset sync-checkpoint
2772+
if (!txdb.ReadCheckpointPubKey(strPubKey) || strPubKey != CSyncCheckpoint::strMasterPubKey)
2773+
{
2774+
// write checkpoint master key to db
2775+
txdb.TxnBegin();
2776+
if (!txdb.WriteCheckpointPubKey(CSyncCheckpoint::strMasterPubKey))
2777+
return error("LoadBlockIndex() : failed to write new checkpoint master key to db");
2778+
if (!txdb.TxnCommit())
2779+
return error("LoadBlockIndex() : failed to commit new checkpoint master key to db");
2780+
if ((!fTestNet) && !Checkpoints::ResetSyncCheckpoint())
2781+
return error("LoadBlockIndex() : failed to reset sync-checkpoint");
27892782
}
27902783

27912784
return true;

src/makefile.bsd

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
USE_UPNP:=0
66
USE_IPV6:=1
7-
USE_LEVELDB:=1
87

98
LINK:=$(CXX)
109

@@ -13,17 +12,13 @@ DEFS=-DBOOST_SPIRIT_THREADSAFE
1312
DEFS += $(addprefix -I,$(CURDIR) $(CURDIR)/obj $(BOOST_INCLUDE_PATH) $(BDB_INCLUDE_PATH) $(OPENSSL_INCLUDE_PATH))
1413
LIBS = $(addprefix -L,$(BOOST_LIB_PATH) $(BDB_LIB_PATH) $(OPENSSL_LIB_PATH))
1514

16-
TESTDEFS = -DTEST_DATA_DIR=$(abspath test/data)
17-
1815
LMODE = dynamic
1916
LMODE2 = dynamic
2017
ifdef STATIC
2118
LMODE = static
2219
ifeq (${STATIC}, all)
2320
LMODE2 = static
2421
endif
25-
else
26-
TESTDEFS += -DBOOST_TEST_DYN_LINK
2722
endif
2823

2924
# for boost 1.37, add -mt to the boost libraries
@@ -148,31 +143,18 @@ OBJS= \
148143
obj/zerocoin/SpendMetaData.o \
149144
obj/zerocoin/ZeroTest.o
150145

151-
152146
all: novacoind
153147

154-
#
155-
# LevelDB support
156-
#
157-
ifeq (${USE_LEVELDB}, 1)
158148
LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a
159-
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DUSE_LEVELDB
149+
DEFS += $(addprefix -I,$(CURDIR)/leveldb/include)
160150
DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers)
161151
OBJS += obj/txdb-leveldb.o
162152
leveldb/libleveldb.a:
163153
@echo "Building LevelDB ..."; cd leveldb; make libleveldb.a libmemenv.a; cd ..;
164154
obj/txdb-leveldb.o: leveldb/libleveldb.a
165-
endif
166-
ifneq (${USE_LEVELDB}, 1)
167-
OBJS += obj/txdb-bdb.o
168-
endif
169-
170-
test check: test_novacoin FORCE
171-
./test_novacoin
172155

173156
# auto-generated dependencies:
174157
-include obj/*.P
175-
-include obj-test/*.P
176158

177159
obj/build.h: FORCE
178160
/bin/sh ../share/genbuild.sh obj/build.h
@@ -205,26 +187,12 @@ obj/zerocoin/%.o: zerocoin/%.cpp
205187
novacoind: $(OBJS:obj/%=obj/%)
206188
$(LINK) $(xCXXFLAGS) -o $@ $^ $(xLDFLAGS) $(LIBS)
207189

208-
TESTOBJS := $(patsubst test/%.cpp,obj-test/%.o,$(wildcard test/*.cpp))
209-
210-
obj-test/%.o: test/%.cpp
211-
$(CXX) -c $(TESTDEFS) $(xCXXFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $<
212-
@cp $(@:%.o=%.d) $(@:%.o=%.P); \
213-
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
214-
-e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \
215-
rm -f $(@:%.o=%.d)
216-
217-
test_novacoin: $(TESTOBJS) $(filter-out obj/init.o,$(OBJS:obj/%=obj/%))
218-
$(LINK) $(xCXXFLAGS) -o $@ $(LIBPATHS) $^ -Wl,-B$(LMODE) -lboost_unit_test_framework $(xLDFLAGS) $(LIBS)
219-
220190
clean:
221-
-rm -f novacoind test_novacoin
191+
-rm -f novacoind
222192
-rm -f obj/*.o
223193
-rm -f obj/zerocoin/*.o
224-
-rm -f obj-test/*.o
225194
-rm -f obj/*.P
226195
-rm -f obj/zerocoin/*.P
227-
-rm -f obj-test/*.P
228196
-rm -f obj/build.h
229197

230198
FORCE:

0 commit comments

Comments
 (0)