From: CryptoManiac Date: Sun, 29 Mar 2015 14:30:10 +0000 (+0300) Subject: Merge pull request #186 from fsb4000/TorIP X-Git-Tag: nvc-v0.5.3~57 X-Git-Url: https://git.novaco.in/?p=novacoin.git;a=commitdiff_plain;h=68d1622773e4ac83d7736b20beec4b25498305c2;hp=803144ef34088cea11f8d507366720554bdd4d8b Merge pull request #186 from fsb4000/TorIP исправлена смена IP для Tor proxy. --- diff --git a/MSVC/libcommon/libcommon.vcxproj b/MSVC/libcommon/libcommon.vcxproj index eb5fc88..8ddeac1 100644 --- a/MSVC/libcommon/libcommon.vcxproj +++ b/MSVC/libcommon/libcommon.vcxproj @@ -21,6 +21,7 @@ + @@ -158,7 +159,7 @@ NotUsing Level1 Disabled - MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\..\Deps;..\..\..\deps\openssl-1.0.2\inc32;..\..\..\src\leveldb\helpers\memenv;..\..\src\leveldb\helpers;..\..\src\leveldb\include;..\..\..\deps\db-6.0.20\build_windows;..\..\..\deps\boost_1_57_0;..\..\..\deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) ProgramDatabase true @@ -179,7 +180,7 @@ Level1 Disabled - MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\..\Deps;..\..\..\deps\openssl-1.0.2\inc32;..\..\..\src\leveldb\helpers\memenv;..\..\src\leveldb\helpers;..\..\src\leveldb\include;..\..\..\deps\db-6.0.20\build_windows;..\..\..\deps\boost_1_57_0;..\..\..\deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) ProgramDatabase true @@ -200,7 +201,7 @@ MaxSpeed true true - MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\..\deps\;..\..\..\deps\openssl-1.0.2\inc32;..\..\..\src\leveldb\helpers\memenv;..\..\src\leveldb\helpers;..\..\src\leveldb\include;..\..\..\deps\db-6.0.20\build_windows;..\..\..\deps\boost_1_57_0;..\..\..\deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) MultiThreaded false @@ -223,7 +224,7 @@ MaxSpeed true true - MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + MINIUPNP_STATICLIB;STATICLIB;USE_UPNP;_CRT_SECURE_NO_WARNINGS;UNICODE;WIN32;_SCL_SECURE_NO_WARNINGS;_WIN32_WINNT=0x0501;HAVE_WORKING_BOOST_SLEEP_FOR;NOMINMAX;USE_LEVELDB;USE_IPV6=1;BOOST_SPIRIT_THREADSAFE;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\..\Deps;..\..\..\deps\openssl-1.0.2\inc32;..\..\..\src\leveldb\helpers\memenv;..\..\src\leveldb\helpers;..\..\src\leveldb\include;..\..\..\deps\db-6.0.20\build_windows;..\..\..\deps\boost_1_57_0;..\..\..\deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) MultiThreaded false diff --git a/MSVC/libcommon/libcommon.vcxproj.filters b/MSVC/libcommon/libcommon.vcxproj.filters index 9d1b8d5..b358bf8 100644 --- a/MSVC/libcommon/libcommon.vcxproj.filters +++ b/MSVC/libcommon/libcommon.vcxproj.filters @@ -104,10 +104,13 @@ Source Files + + Source Files + Source Files - + Source Files diff --git a/MSVC/mynovacoin/mynovacoin.vcxproj b/MSVC/mynovacoin/mynovacoin.vcxproj index df8b4a0..d4d8474 100644 --- a/MSVC/mynovacoin/mynovacoin.vcxproj +++ b/MSVC/mynovacoin/mynovacoin.vcxproj @@ -86,7 +86,7 @@ - USE_UPNP;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\src\leveldb\include;..\..\..\deps\openssl-1.0.2\inc32;..\..\..\deps\db-6.0.20\build_windows;..\..\..\deps\boost_1_57_0;..\..\..\deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) Disabled ProgramDatabase @@ -106,7 +106,7 @@ - USE_UPNP;UNICODE;WIN32;_WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;UNICODE;WIN32;_WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\src\leveldb\include;..\..\..\Deps\openssl-1.0.2\inc32;..\..\..\Deps\db-6.0.20\build_windows;..\..\..\Deps\boost_1_57_0;..\..\..\Deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) Disabled ProgramDatabase @@ -126,7 +126,7 @@ - USE_UPNP;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\src\leveldb\include;..\..\..\deps\openssl-1.0.2\inc32;..\..\..\deps\db-6.0.20\build_windows;..\..\..\deps\boost_1_57_0;..\..\..\deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) ProgramDatabase MultiThreaded @@ -149,7 +149,7 @@ - USE_UPNP;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) ..\include;..\..\src\leveldb\include;..\..\..\Deps\openssl-1.0.2\inc32;..\..\..\Deps\db-6.0.20\build_windows;..\..\..\Deps\boost_1_57_0;..\..\..\Deps\boost_1_57_0\boost;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);.\;%(AdditionalIncludeDirectories) ProgramDatabase MultiThreaded diff --git a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj index d36aa97..578ecd6 100644 --- a/MSVC/mynovacoinqt/mynovacoinqt.vcxproj +++ b/MSVC/mynovacoinqt/mynovacoinqt.vcxproj @@ -103,7 +103,7 @@ Sync $(IntDir) Disabled - USE_UPNP;USE_QRCODE;UNICODE;WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;USE_QRCODE;UNICODE;WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) false MultiThreadedDebug true @@ -153,7 +153,7 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\lrelease C:\MyP Sync $(IntDir) Disabled - USE_UPNP;USE_QRCODE;UNICODE;WIN32;_WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;USE_QRCODE;UNICODE;WIN32;_WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) false MultiThreadedDebug true @@ -203,7 +203,7 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2-64\qtbase\bin\lrelease C:\ Sync $(IntDir) Full - USE_UPNP;USE_QRCODE;UNICODE;WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;USE_QRCODE;UNICODE;WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded @@ -257,7 +257,7 @@ C:\MyProjects\Deps\qt-everywhere-opensource-src-5.3.2\qtbase\bin\lrelease C:\MyP Sync $(IntDir) Full - USE_UPNP;USE_QRCODE;UNICODE;WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;%(PreprocessorDefinitions) + USE_UPNP;USE_QRCODE;UNICODE;WIN32;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_GUI;_CRT_SECURE_NO_WARNINGS;_SCL_SECURE_NO_WARNINGS;USE_LEVELDB;USE_IPV6=1;__STDC_FORMAT_MACROS;USE_SSE2;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded diff --git a/doc/building novacoind and novacoinqt under Linux.txt b/doc/building novacoind and novacoinqt under Linux.txt index 6badaf9..71f4192 100644 --- a/doc/building novacoind and novacoinqt under Linux.txt +++ b/doc/building novacoind and novacoinqt under Linux.txt @@ -6,6 +6,17 @@ Ubuntu/Debian: libboost-filesystem-dev libboost-program-options-dev libboost-thread-dev libssl-dev libdb++-dev libminiupnpc-dev libqrencode-dev +Если у вас возникла ошибка при установке qt4-qmake (Возникает на Ubuntu 14.04.2 и возможно в других версиях) +libcheese-gtk23 : Depends: libclutter-gtk-1.0-0 (>= 0.91.8) but it is not going to be installed + Depends: libcogl15 (>= 1.15.8) but it is not going to be installed +libcheese7 : Depends: libclutter-gst-2.0-0 (>= 0.10.0) but it is not going to be installed + Depends: gstreamer1.0-clutter but it is not going to be installed +libclutter-1.0-0 : Depends: libcogl-pango15 (>= 1.15.8) but it is not going to be installed + Depends: libcogl15 (>= 1.15.8) but it is not going to be installed + +То введите +sudo apt-get install libglew-dev libcheese7 libcheese-gtk23 libclutter-gst-2.0-0 libcogl15 libclutter-gtk-1.0-0 libclutter-1.0-0 xserver-xorg-input-all + openSUSE(проверено на версии 13.2): sudo zypper install git gcc gcc-c++ libqt4-devel boost-devel libopenssl-devel libdb-4_8-devel libminiupnpc-devel libqrencode3 diff --git a/doc/building novacoind and novacoinqt under Windows with MSVC.txt b/doc/building novacoind and novacoinqt under Windows with MSVC.txt index 32dd2d7..65b6947 100644 --- a/doc/building novacoind and novacoinqt under Windows with MSVC.txt +++ b/doc/building novacoind and novacoinqt under Windows with MSVC.txt @@ -38,7 +38,10 @@ buildopenssl.bat -Откройте C:\MyProjects\Deps\db-6.0.20\build_windows\Berkeley_DB_vs2010.sln -Выберете проект db -Измените конфигурацию с Debug на Static Debug --Нажмите левой кнопкой мыши на проект db, затем "Только проект" -> "Построить только db" +-Нажмите правой кнопкой мыши на проект db, затем в "Свойства" -> "Общие" убедитесь, что Набор символов "Использовать многобайтовую кодировку" +-Перейдите в "C/C++" -> "Препроцессор" -> "Определения препроцессора" и удалите _UNICODE и UNICODE, также убедитесь, что в Унаследованных значениях нет +_UNICODE и UNICODE +-Нажмите правой кнопкой мыши на проект db, затем "Только проект" -> "Построить только db" -Постройте так все Static конфигурации(Static Debug 32 bit, Static Release 32 bit, Static Debug X64, Static Release X64) Проверка: diff --git a/novacoin-qt.pro b/novacoin-qt.pro index 670271b..585782d 100644 --- a/novacoin-qt.pro +++ b/novacoin-qt.pro @@ -133,11 +133,23 @@ contains(USE_LEVELDB, 1) { SOURCES += src/txdb-bdb.cpp } +# use: qmake "USE_ASM=1" contains(USE_ASM, 1) { - message(Using optimized scrypt core implementation) + message(Using assembler scrypt core implementation) SOURCES += src/scrypt-arm.S src/scrypt-x86.S src/scrypt-x86_64.S } else { - message(Using generic scrypt core implementation) + # use: qmake "USE_SSE2=1" + contains(USE_SSE2, 1) { + message(Using SSE2 intrinsic scrypt implementation) + SOURCES += src/scrypt-sse2.cpp + DEFINES += USE_SSE2 + QMAKE_CXXFLAGS += -msse2 + QMAKE_CFLAGS += -msse2 + } else { + message(Using generic scrypt core implementation) + } + + # For now, generic module is required in both cases SOURCES += src/scrypt-generic.c } diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index d944b92..03bd10e 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -361,15 +361,7 @@ string HTTPPost(const string& strMsg, const map& mapRequestHeader string rfc1123Time() { - char buffer[64]; - time_t now; - time(&now); - struct tm* now_gmt = gmtime(&now); - string locale(setlocale(LC_TIME, NULL)); - setlocale(LC_TIME, "C"); // we want POSIX (aka "C") weekday/month strings - strftime(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S +0000", now_gmt); - setlocale(LC_TIME, locale.c_str()); - return string(buffer); + return DateTimeStrFormat("%a, %d %b %Y %H:%M:%S +0000", GetTime()); } static string HTTPReply(int nStatus, const string& strMsg, bool keepalive) diff --git a/src/init.cpp b/src/init.cpp index 1f7fade..ca7c8b1 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -33,7 +33,6 @@ bool fConfChange; unsigned int nNodeLifespan; unsigned int nMinerSleep; bool fUseFastIndex; -bool fUseFastStakeMiner; bool fUseMemoryLog; enum Checkpoints::CPMode CheckpointsMode; @@ -575,6 +574,9 @@ bool AppInit2() int64_t nStart; +#ifdef USE_SSE2 + scrypt_detect_sse2(); +#endif // ********************************************************* Step 5: verify database integrity uiInterface.InitMessage(_("Verifying database integrity...")); diff --git a/src/main.cpp b/src/main.cpp index 2a97e49..28bdb47 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2568,17 +2568,17 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) if (!mapBlockIndex.count(pblock->hashPrevBlock)) { printf("ProcessBlock: ORPHAN BLOCK, prev=%s\n", pblock->hashPrevBlock.ToString().substr(0,20).c_str()); - CBlock* pblock2 = new CBlock(*pblock); // ppcoin: check proof-of-stake - if (pblock2->IsProofOfStake()) + if (pblock->IsProofOfStake()) { // Limited duplicity on stake: prevents block flood attack // Duplicate stake allowed only when there is orphan child block - if (setStakeSeenOrphan.count(pblock2->GetProofOfStake()) && !mapOrphanBlocksByPrev.count(hash) && !Checkpoints::WantedByPendingSyncCheckpoint(hash)) - return error("ProcessBlock() : duplicate proof-of-stake (%s, %d) for orphan block %s", pblock2->GetProofOfStake().first.ToString().c_str(), pblock2->GetProofOfStake().second, hash.ToString().c_str()); + if (setStakeSeenOrphan.count(pblock->GetProofOfStake()) && !mapOrphanBlocksByPrev.count(hash) && !Checkpoints::WantedByPendingSyncCheckpoint(hash)) + return error("ProcessBlock() : duplicate proof-of-stake (%s, %d) for orphan block %s", pblock->GetProofOfStake().first.ToString().c_str(), pblock->GetProofOfStake().second, hash.ToString().c_str()); else - setStakeSeenOrphan.insert(pblock2->GetProofOfStake()); + setStakeSeenOrphan.insert(pblock->GetProofOfStake()); } + CBlock* pblock2 = new CBlock(*pblock); mapOrphanBlocks.insert(make_pair(hash, pblock2)); mapOrphanBlocksByPrev.insert(make_pair(pblock2->hashPrevBlock, pblock2)); diff --git a/src/makefile.bsd b/src/makefile.bsd index 11172ca..27f8187 100644 --- a/src/makefile.bsd +++ b/src/makefile.bsd @@ -166,8 +166,16 @@ OBJS += obj/scrypt-generic.o obj/scrypt-generic.o: scrypt-generic.c $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< + +ifeq (${USE_SSE2}, 1) +DEFS += -DUSE_SSE2 +OBJS += obj/scrypt-sse2.o +obj/scrypt-sse2.o: scrypt-sse2.cpp + $(CXX) -c $(CFLAGS) -MMD -o $@ $< +endif endif + # auto-generated dependencies: -include obj/*.P diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw index 5175466..26a8eb8 100644 --- a/src/makefile.linux-mingw +++ b/src/makefile.linux-mingw @@ -133,12 +133,22 @@ obj/scrypt-x86.o: scrypt-x86.S obj/scrypt-x86_64.o: scrypt-x86_64.S $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< endif + ifneq (${USE_ASM}, 1) OBJS += obj/scrypt-generic.o obj/scrypt-generic.o: scrypt-generic.c $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< + +ifeq (${USE_SSE2}, 1) +DEFS += -DUSE_SSE2 +OBJS += obj/scrypt-sse2.o + +obj/scrypt-sse2.o: scrypt-sse2.cpp $(HEADERS) + $(CCX) -c $(CFLAGS) -MMD -o $@ $< endif +endif + obj/build.h: FORCE /bin/sh ../share/genbuild.sh obj/build.h diff --git a/src/makefile.mingw b/src/makefile.mingw index 1c4e1a1..1d36b42 100644 --- a/src/makefile.mingw +++ b/src/makefile.mingw @@ -4,32 +4,44 @@ USE_UPNP:=0 USE_LEVELDB:=0 +CC=gcc + + USE_IPV6:=1 +USE_SSE2:=1 -INCLUDEPATHS= \ - -I"C:\boost-1.50.0-mgw" \ - -I"C:\db-4.8.30.NC-mgw\build_unix" \ - -I"C:\openssl-1.0.1c-mgw\include" +BOOST_SUFFIX?=-mgw49-mt-s-1_57 +INCLUDEPATHS= \ + -I"$(CURDIR)" \ + -I"/c/deps/boost_1_57_0" \ + -I"/c/deps" \ + -I"/c/deps/db-6.0.20/build_unix" \ + -I"/c/deps/openssl-1.0.2/include" + LIBPATHS= \ - -L"C:\boost-1.50.0-mgw\stage\lib" \ - -L"C:\db-4.8.30.NC-mgw\build_unix" \ - -L"C:\openssl-1.0.1c-mgw" + -L"$(CURDIR)/leveldb" \ + -L"/c/deps/boost_1_57_0/stage/lib" \ + -L"/c/deps/miniupnpc" \ + -L"/c/deps/db-6.0.20/build_unix" \ + -L"/c/deps/openssl-1.0.2" LIBS= \ - -l boost_system-mgw44-mt-1_53 \ - -l boost_filesystem-mgw44-mt-1_53 \ - -l boost_program_options-mgw44-mt-1_53 \ - -l boost_thread-mgw44-mt-1_53 \ - -l boost_chrono-mgw44-mt-1_53 \ - -l db_cxx \ - -l ssl \ - -l crypto + -l leveldb \ + -l memenv \ + -l boost_system$(BOOST_SUFFIX) \ + -l boost_filesystem$(BOOST_SUFFIX) \ + -l boost_program_options$(BOOST_SUFFIX) \ + -l boost_thread$(BOOST_SUFFIX) \ + -l boost_chrono$(BOOST_SUFFIX) \ + -l db_cxx \ + -l ssl \ + -l crypto DEFS=-DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -D__STDC_FORMAT_MACROS DEBUGFLAGS=-g CFLAGS=-mthreads -O2 -msse2 -w -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) -LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat +LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat -Wl,--large-address-aware -static ifndef USE_UPNP override USE_UPNP = - @@ -95,8 +107,8 @@ DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DUSE_LEVELDB DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers) OBJS += obj/txdb-leveldb.o leveldb/libleveldb.a: - cd leveldb; make; cd .. -obj/txdb-leveldb.o: leveldb/libleveldb.lib + cd leveldb;TARGET_OS=NATIVE_WINDOWS make libleveldb.a libmemenv.a;; cd .. +obj/txdb-leveldb.o: leveldb/libleveldb.a else OBJS += obj/txdb-bdb.o endif @@ -114,8 +126,18 @@ OBJS += obj/scrypt-generic.o obj/scrypt-generic.o: scrypt-generic.c $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< + +ifdef USE_SSE2 +DEFS += -DUSE_SSE2 +OBJS += obj/scrypt-sse2.o + +obj/scrypt-sse2.o: scrypt-sse2.cpp $(HEADERS) + g++ -c $(CFLAGS) -MMD -o $@ $< +endif endif + + obj/%.o: %.cpp $(HEADERS) g++ -c $(CFLAGS) -o $@ $< diff --git a/src/makefile.osx b/src/makefile.osx index 9f8e76c..3a4a80c 100644 --- a/src/makefile.osx +++ b/src/makefile.osx @@ -144,7 +144,16 @@ OBJS += obj/scrypt-generic.o obj/scrypt-generic.o: scrypt-generic.c $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< + +ifneq (${USE_SSE2}, 1) and eq (${USE_ASM}, 1) +DEFS += -DUSE_SSE2 +OBJS += obj/scrypt-sse2.o + +obj/scrypt-sse2.o: scrypt-sse2.cpp + $(CXX) -c $(CFLAGS) -MMD -o $@ $< endif +endif + # auto-generated dependencies: -include obj/*.P diff --git a/src/makefile.unix b/src/makefile.unix index bdf9f96..4ef89d5 100644 --- a/src/makefile.unix +++ b/src/makefile.unix @@ -173,7 +173,16 @@ OBJS += obj/scrypt-generic.o obj/scrypt-generic.o: scrypt-generic.c $(CC) -c $(xCXXFLAGS) -MMD -o $@ $< + +ifeq (${USE_SSE2}, 1) +DEFS += -DUSE_SSE2 +OBJS += obj/scrypt-sse2.o + +obj/scrypt-sse2.o: scrypt-sse2.cpp + $(CXX) -c $(xCXXFLAGS) -MMD -o $@ $< endif +endif + # auto-generated dependencies: -include obj/*.P diff --git a/src/miner.cpp b/src/miner.cpp index 0f04521..aca0674 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -520,6 +520,8 @@ void StakeMiner(CWallet *pwallet) // Make this thread recognisable as the mining thread RenameThread("novacoin-miner"); + bool fTrySync = true; + // Each thread has its own counter unsigned int nExtraNonce = 0; @@ -537,11 +539,23 @@ void StakeMiner(CWallet *pwallet) while (vNodes.empty() || IsInitialBlockDownload()) { + fTrySync = true; + Sleep(1000); if (fShutdown) return; } + if (fTrySync) + { + fTrySync = false; + if (vNodes.size() < 3 || nBestHeight < GetNumBlocksOfPeers()) + { + Sleep(1000); + continue; + } + } + // // Create new block // diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 3414a00..ba4ad5c 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -252,7 +252,7 @@ Value getblockbynumber(const Array& params, bool fHelp) { if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( - "getblock [txinfo]\n" + "getblockbynumber [txinfo]\n" "txinfo optional to print more detailed tx info\n" "Returns details of a block with given block-number."); diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 4b4448a..614552f 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -269,10 +269,6 @@ Value getaddednodeinfo(const Array& params, bool fHelp) return ret; } -extern CCriticalSection cs_mapAlerts; -extern map mapAlerts; - -// ppcoin: send alert. // There is a known deadlock situation with ThreadMessageHandler // ThreadMessageHandler: holds cs_vSend and acquiring cs_main in SendMessages() // ThreadRPCServer: holds cs_main and acquiring cs_vSend in alert.RelayTo()/PushMessage()/BeginMessage() diff --git a/src/scrypt-sse2.cpp b/src/scrypt-sse2.cpp new file mode 100644 index 0000000..ef6ffb0 --- /dev/null +++ b/src/scrypt-sse2.cpp @@ -0,0 +1,156 @@ +/* + * Copyright 2009 Colin Percival, 2011 ArtForz, 2012-2013 pooler + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file was originally written by Colin Percival as part of the Tarsnap + * online backup system. + */ + +#include "scrypt.h" +#include +#include +#include +#include "pbkdf2.h" + +#include + +static inline uint32_t le32dec(const void *pp) +{ + const uint8_t *p = (uint8_t const *)pp; + return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + + ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); +} + +static inline void le32enc(void *pp, uint32_t x) +{ + uint8_t *p = (uint8_t *)pp; + p[0] = x & 0xff; + p[1] = (x >> 8) & 0xff; + p[2] = (x >> 16) & 0xff; + p[3] = (x >> 24) & 0xff; +} + +static inline void xor_salsa8_sse2(__m128i B[4], const __m128i Bx[4]) +{ + __m128i X0, X1, X2, X3; + __m128i T; + int i; + + X0 = B[0] = _mm_xor_si128(B[0], Bx[0]); + X1 = B[1] = _mm_xor_si128(B[1], Bx[1]); + X2 = B[2] = _mm_xor_si128(B[2], Bx[2]); + X3 = B[3] = _mm_xor_si128(B[3], Bx[3]); + + for (i = 0; i < 8; i += 2) { + /* Operate on "columns". */ + T = _mm_add_epi32(X0, X3); + X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 7)); + X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 25)); + T = _mm_add_epi32(X1, X0); + X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9)); + X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23)); + T = _mm_add_epi32(X2, X1); + X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 13)); + X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 19)); + T = _mm_add_epi32(X3, X2); + X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18)); + X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14)); + + /* Rearrange data. */ + X1 = _mm_shuffle_epi32(X1, 0x93); + X2 = _mm_shuffle_epi32(X2, 0x4E); + X3 = _mm_shuffle_epi32(X3, 0x39); + + /* Operate on "rows". */ + T = _mm_add_epi32(X0, X1); + X3 = _mm_xor_si128(X3, _mm_slli_epi32(T, 7)); + X3 = _mm_xor_si128(X3, _mm_srli_epi32(T, 25)); + T = _mm_add_epi32(X3, X0); + X2 = _mm_xor_si128(X2, _mm_slli_epi32(T, 9)); + X2 = _mm_xor_si128(X2, _mm_srli_epi32(T, 23)); + T = _mm_add_epi32(X2, X3); + X1 = _mm_xor_si128(X1, _mm_slli_epi32(T, 13)); + X1 = _mm_xor_si128(X1, _mm_srli_epi32(T, 19)); + T = _mm_add_epi32(X1, X2); + X0 = _mm_xor_si128(X0, _mm_slli_epi32(T, 18)); + X0 = _mm_xor_si128(X0, _mm_srli_epi32(T, 14)); + + /* Rearrange data. */ + X1 = _mm_shuffle_epi32(X1, 0x39); + X2 = _mm_shuffle_epi32(X2, 0x4E); + X3 = _mm_shuffle_epi32(X3, 0x93); + } + + B[0] = _mm_add_epi32(B[0], X0); + B[1] = _mm_add_epi32(B[1], X1); + B[2] = _mm_add_epi32(B[2], X2); + B[3] = _mm_add_epi32(B[3], X3); +} + +uint256 scrypt_blockhash__sse2(const uint8_t* input) +{ + uint256 result = 0; + uint8_t scratchpad[SCRYPT_BUFFER_SIZE]; + uint8_t B[128]; + union { + __m128i i128[8]; + uint32_t u32[32]; + } X; + __m128i *V; + uint32_t i, j, k; + + V = (__m128i *)(((uintptr_t)(scratchpad) + 63) & ~ (uintptr_t)(63)); + + PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128); + + for (k = 0; k < 2; k++) { + for (i = 0; i < 16; i++) { + X.u32[k * 16 + i] = le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]); + } + } + + for (i = 0; i < 1024; i++) { + for (k = 0; k < 8; k++) + V[i * 8 + k] = X.i128[k]; + xor_salsa8_sse2(&X.i128[0], &X.i128[4]); + xor_salsa8_sse2(&X.i128[4], &X.i128[0]); + } + for (i = 0; i < 1024; i++) { + j = 8 * (X.u32[16] & 1023); + for (k = 0; k < 8; k++) + X.i128[k] = _mm_xor_si128(X.i128[k], V[j + k]); + xor_salsa8_sse2(&X.i128[0], &X.i128[4]); + xor_salsa8_sse2(&X.i128[4], &X.i128[0]); + } + + for (k = 0; k < 2; k++) { + for (i = 0; i < 16; i++) { + le32enc(&B[(k * 16 + (i * 5 % 16)) * 4], X.u32[k * 16 + i]); + } + } + + PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)&result, 32); + + return result; +} diff --git a/src/scrypt.cpp b/src/scrypt.cpp index 5779127..32eea96 100644 --- a/src/scrypt.cpp +++ b/src/scrypt.cpp @@ -6,16 +6,26 @@ #include "util.h" #include "net.h" -#define SCRYPT_BUFFER_SIZE (131072 + 63) +#ifdef USE_SSE2 +#ifdef _MSC_VER +// MSVC 64bit is unable to use inline asm +#include +#else +// GCC Linux or i686-w64-mingw32 +#include +#endif +#endif extern "C" void scrypt_core(uint32_t *X, uint32_t *V); - +#ifdef USE_SSE2 +extern uint256 scrypt_blockhash__sse2(const uint8_t* input); +#endif /* cpu and memory intensive function to transform a 80 byte buffer into a 32 byte output scratchpad size needs to be at least 63 + (128 * r * p) + (256 * r + 64) + (128 * r * N) bytes r = 1, p = 1, N = 1024 */ -uint256 scrypt_blockhash(const uint8_t* input) +uint256 scrypt_blockhash_generic(const uint8_t* input) { uint8_t scratchpad[SCRYPT_BUFFER_SIZE]; uint32_t X[32]; @@ -29,3 +39,40 @@ uint256 scrypt_blockhash(const uint8_t* input) return result; } + +// By default, set to generic scrypt function. This will prevent crash in case when scrypt_detect_sse2() wasn't called +uint256 (*scrypt_blockhash_detected)(const uint8_t* input) = &scrypt_blockhash_generic; + +#ifdef USE_SSE2 +void scrypt_detect_sse2() +{ + // 32bit x86 Linux or Windows, detect cpuid features + unsigned int cpuid_edx=0; +#if defined(_MSC_VER) + // MSVC + int x86cpuid[4]; + __cpuid(x86cpuid, 1); + cpuid_edx = (unsigned int)x86cpuid[3]; +#else // _MSC_VER + // Linux or i686-w64-mingw32 (gcc-4.6.3) + unsigned int eax, ebx, ecx; + __get_cpuid(1, &eax, &ebx, &ecx, &cpuid_edx); +#endif // _MSC_VER + + if (cpuid_edx & 1<<26) + { + scrypt_blockhash_detected = &scrypt_blockhash__sse2; + printf("scrypt: using scrypt-sse2 as detected.\n"); + } + else + { + scrypt_blockhash_detected = &scrypt_blockhash_generic; + printf("scrypt: using scrypt-generic, SSE2 unavailable.\n"); + } +} +#endif + +uint256 scrypt_blockhash(const uint8_t* input) +{ + return scrypt_blockhash_detected(input); +} \ No newline at end of file diff --git a/src/scrypt.h b/src/scrypt.h index 9a648d3..3c9e3bd 100644 --- a/src/scrypt.h +++ b/src/scrypt.h @@ -7,6 +7,12 @@ #include "util.h" #include "net.h" +#define SCRYPT_BUFFER_SIZE (131072 + 63) + uint256 scrypt_blockhash(const uint8_t* input); +#ifdef USE_SSE2 +void scrypt_detect_sse2(); +#endif + #endif // SCRYPT_MINE_H diff --git a/src/util.cpp b/src/util.cpp index 481da94..8b0afa9 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1464,3 +1464,13 @@ bool NewThread(void(*pfn)(void*), void* parg) } return true; } + +std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) +{ + // std::locale takes ownership of the pointer + std::locale loc(std::locale::classic(), new boost::posix_time::time_facet(pszFormat)); + std::stringstream ss; + ss.imbue(loc); + ss << boost::posix_time::from_time_t(nTime); + return ss.str(); +} \ No newline at end of file diff --git a/src/util.h b/src/util.h index 77b439e..53dc567 100644 --- a/src/util.h +++ b/src/util.h @@ -351,14 +351,7 @@ inline int64_t GetTimeMillis() boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds(); } -inline std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) -{ - time_t n = nTime; - struct tm* ptmTime = gmtime(&n); - char pszTime[200]; - strftime(pszTime, sizeof(pszTime), pszFormat, ptmTime); - return pszTime; -} +std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime); static const std::string strTimestampFormat = "%Y-%m-%d %H:%M:%S UTC"; inline std::string DateTimeStrFormat(int64_t nTime)