From 171102cbbd4300ea3b0f1d8a21e50b012c7a6f59 Mon Sep 17 00:00:00 2001 From: Duke Date: Sun, 18 Feb 2024 09:37:06 -0500 Subject: [PATCH 001/109] Remove unused Makefile #291 --- src/cc/Makefile | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 src/cc/Makefile diff --git a/src/cc/Makefile b/src/cc/Makefile deleted file mode 100644 index 54f290573..000000000 --- a/src/cc/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -SHELL = /bin/sh -CC = gcc -CC_DARWIN = g++-6 -CC_WIN = x86_64-w64-mingw32-gcc-posix -CFLAGS = -arch x86_64 -CXXFLAGS_DARWIN = -std=c++11 -arch x86_64 -I/usr/local/Cellar/gcc\@6/6.4.0_2/include/c++/6.4.0/ -I../../depends/$(shell echo `../..//depends/config.guess`/include) -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I -I../leveldb/include -I.. -I. -fPIC -c -Wl,-undefined -Wl,dynamic_lookup -dynamiclib -CXXFLAGS = -std=c++11 -I../../depends/$(shell echo `../..//depends/config.guess`/include) -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I../leveldb/include -I.. -I. -fPIC -shared -c -CXXFLAGS_WIN = -std=c++11 -I../../depends/$(shell echo `../..//depends/config.guess`/include) -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I../leveldb/include -I.. -I. -fPIC -shared -c -DEBUGFLAGS = -O0 -D _DEBUG -RELEASEFLAGS = -O2 -D NDEBUG -combine -fwhole-program -$(info $(OS)) -OS := $(shell uname -s) -$(info $(OS)) -TARGET = ../libcc.so -TARGET_DARWIN = ../libcc.dylib -TARGET_WIN = ../libcc.dll -SOURCES = cclib.cpp ../cJSON.c -OBJS = cclib.o ../cJSON.o - -all: $(TARGET) - -%.o: %.c - $(CC) -o $@ $< $(CFLAGS) $(DEBUGFLAGS) - -%.o: %.cpp - $(CC) -o $@ $< $(CXXFLAGS) $(DEBUGFLAGS) - -$(TARGET): $(OBJS) - $(info Building cclib to src/) -ifeq ($(OS),Darwin) - $(CC_DARWIN) $(CXXFLAGS_DARWIN) $(DEBUGFLAGS) -o $(TARGET_DARWIN) $(OBJS) -else ifeq ($(OS),Linux) - $(CC) $(CXXFLAGS) $(DEBUGFLAGS) -o $(TARGET) $(OBJS) -#else ifeq ($(WIN_HOST),True) - todo: pass ENV var from build.sh if WIN host -else - $(info WINDOWS) - $(CC_WIN) $(CXXFLAGS_WIN) $(DEBUGFLAGS) -o $(TARGET_WIN) $(OBJS) -endif - -clean: - rm -rf $(TARGET) From 7b3c26ddfeaf3dfff17eee123618473bc61a5480 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 28 Feb 2024 12:43:43 -0500 Subject: [PATCH 002/109] Remove CC dingleberries --- src/cc/CCcustom.cpp | 5 --- src/cc/CCinclude.h | 65 --------------------------------- src/cc/CCutils.cpp | 2 - src/cc/cclib.cpp | 89 --------------------------------------------- src/cc/eval.cpp | 1 - 5 files changed, 162 deletions(-) diff --git a/src/cc/CCcustom.cpp b/src/cc/CCcustom.cpp index 8a30feadf..a98851afc 100644 --- a/src/cc/CCcustom.cpp +++ b/src/cc/CCcustom.cpp @@ -19,11 +19,6 @@ #include "key_io.h" #include "CCinclude.h" -int32_t CClib_initcp(struct CCcontract_info *cp,uint8_t evalcode) -{ - return(-1); -} - struct CCcontract_info *CCinit(struct CCcontract_info *cp, uint8_t evalcode) { return(cp); diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index fb9ac7c47..29cc60d6c 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -216,7 +216,6 @@ int32_t CCgetspenttxid(uint256 &spenttxid,int32_t &vini,int32_t &height,uint256 /// @private UniValue CClib(struct CCcontract_info *cp,char *method,char *jsonstr); -UniValue CClib_info(struct CCcontract_info *cp); static const uint256 zeroid; //!< null uint256 constant @@ -430,67 +429,6 @@ void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t * /// @see GetCCaddress1of2 void CCaddr1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2,uint8_t *priv,char *coinaddr); -/// Creates a token transaction output with a cryptocondition that allows to spend it by one key. -/// The resulting vout will have two eval codes (EVAL_TOKENS and evalcode parameter value). -/// The returned output should be added to a transaction vout array. -/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code) -/// @param nValue value of the output in satoshi -/// @param pk pubkey to spend the cc -/// @returns vout object -/// @see CCinit -/// @see CCcontract_info -CTxOut MakeTokensCC1vout(uint8_t evalcode, CAmount nValue, CPubKey pk); - -/// Another MakeTokensCC1vout overloaded function that creates a token transaction output with a cryptocondition with two eval codes that allows to spend it by one key. -/// Resulting vout will have three eval codes (EVAL_TOKENS, evalcode and evalcode2 parameter values). -/// The returned output should be added to a transaction vout array. -/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code) -/// @param evalcode2 yet another cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code) -/// @param nValue value of the output in satoshi -/// @param pk pubkey to spend the cc -/// @returns vout object -/// @see CCinit -/// @see CCcontract_info -CTxOut MakeTokensCC1vout(uint8_t evalcode, uint8_t evalcode2, CAmount nValue, CPubKey pk); - -/// MakeTokensCC1of2vout creates a token transaction output with a 1of2 cryptocondition that allows to spend it by either of two keys. -/// The resulting vout will have two eval codes (EVAL_TOKENS and evalcode parameter value). -/// The returned output should be added to a transaction vout array. -/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code) -/// @param nValue value of the output in satoshi -/// @param pk1 one of two pubkeys to spend the cc -/// @param pk2 second of two pubkeys to spend the cc -/// @returns vout object -/// @see CCinit -/// @see CCcontract_info -CTxOut MakeTokensCC1of2vout(uint8_t evalcode, CAmount nValue, CPubKey pk1, CPubKey pk2); - -/// Another overload of MakeTokensCC1of2vout creates a token transaction output with a 1of2 cryptocondition with two eval codes that allows to spend it by either of two keys. -/// The resulting vout will have three eval codes (EVAL_TOKENS, evalcode and evalcode2 parameter values). -/// The returned output should be added to a transaction vout array. -/// @param evalcode cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code) -/// @param evalcode2 yet another cryptocondition eval code (transactions with this eval code in cc inputs will be forwarded to the contract associated with this eval code) -/// @param nValue value of the output in satoshi -/// @param pk1 one of two pubkeys to spend the cc -/// @param pk2 second of two pubkeys to spend the cc -/// @returns vout object -/// @see CCinit -/// @see CCcontract_info -CTxOut MakeTokensCC1of2vout(uint8_t evalcode, uint8_t evalcode2, CAmount nValue, CPubKey pk1, CPubKey pk2); - -/// Gets adddress for token cryptocondition vout -/// @param cp CCcontract_info structure initialized with EVAL_TOKENS eval code -/// @param[out] destaddr retrieved address -/// @param pk public key to create the cryptocondition -bool GetTokensCCaddress(struct CCcontract_info *cp, char *destaddr, CPubKey pk); - -/// Gets adddress for token 1of2 cc vout -/// @param cp CCcontract_info structure initialized with EVAL_TOKENS eval code -/// @param[out] destaddr retrieved address -/// @param pk first public key to create the cryptocondition -/// @param pk2 second public key to create the cryptocondition -bool GetTokensCCaddress1of2(struct CCcontract_info *cp, char *destaddr, CPubKey pk, CPubKey pk2); - /// CCaddrTokens1of2set sets pubkeys, private key and cc addr for spending from 1of2 token cryptocondition vout /// @param cp contract info structure where the private key is set /// @param pk1 one of the two public keys of the 1of2 cc @@ -501,9 +439,6 @@ bool GetTokensCCaddress1of2(struct CCcontract_info *cp, char *destaddr, CPubKey /// @see CCcontract_info void CCaddrTokens1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2, uint8_t *priv, char *coinaddr); -/// @private -int32_t CClib_initcp(struct CCcontract_info *cp,uint8_t evalcode); - /// IsCCInput checks if scriptSig object contains a cryptocondition /// @param scriptSig scriptSig object with a cryptocondition /// @returns true if the scriptSig object contains a cryptocondition diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index a96fe02de..e46793288 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -456,6 +456,4 @@ int64_t TotalPubkeyCCInputs(const CTransaction &tx, const CPubKey &pubkey) return total; } -extern struct CCcontract_info CCinfos[0x100]; extern std::string MYCCLIBNAME; -bool CClib_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx,unsigned int nIn); diff --git a/src/cc/cclib.cpp b/src/cc/cclib.cpp index 695ecc91f..cf0dfcfe2 100644 --- a/src/cc/cclib.cpp +++ b/src/cc/cclib.cpp @@ -40,70 +40,6 @@ extern std::string MYCCLIBNAME; char *CClib_name() { return((char *)MYCCLIBNAME.c_str()); } -struct CClib_rpcinfo -{ - char *CCname,*method,*help; - int32_t numrequiredargs,maxargs; - uint8_t funcid,evalcode; -} - -CClib_methods[] = -{ - { (char *)"faucet2", (char *)"fund", (char *)"amount", 1, 1, 'F', EVAL_FAUCET2 }, - { (char *)"faucet2", (char *)"get", (char *)"", 0, 0, 'G', EVAL_FAUCET2 }, -#ifdef BUILD_CUSTOMCC - RPC_FUNCS -#endif -}; - -std::string CClib_rawtxgen(struct CCcontract_info *cp,uint8_t funcid,cJSON *params); - -cJSON *cclib_reparse(int32_t *nump,char *jsonstr) // assumes origparams will be freed by caller -{ - cJSON *params; char *newstr; int32_t i,j; - *nump = 0; - if ( jsonstr != 0 ) - { - if ( jsonstr[0] == '"' && jsonstr[strlen(jsonstr)-1] == '"' ) - { - jsonstr[strlen(jsonstr)-1] = 0; - jsonstr++; - } - newstr = (char *)malloc(strlen(jsonstr)+1); - for (i=j=0; jsonstr[i]!=0; i++) - { - if ( jsonstr[i] == '%' && jsonstr[i+1] == '2' && jsonstr[i+2] == '2' ) - { - newstr[j++] = '"'; - i += 2; - } - else if ( jsonstr[i] == '\'' ) - newstr[j++] = '"'; - else newstr[j++] = jsonstr[i]; - } - newstr[j] = 0; - params = cJSON_Parse(newstr); - if ( 0 && params != 0 ) - printf("new.(%s) -> %s\n",newstr,jprint(params,0)); - free(newstr); - *nump = cJSON_GetArraySize(params); - //free(origparams); - } else params = 0; - return(params); -} - -UniValue CClib_method(struct CCcontract_info *cp,char *method,char *jsonstr) -{ - UniValue result(UniValue::VOBJ); - return(result); -} - -UniValue CClib_info(struct CCcontract_info *cp) -{ - UniValue result(UniValue::VOBJ); - return(result); -} - UniValue CClib(struct CCcontract_info *cp,char *method,char *jsonstr) { UniValue result(UniValue::VOBJ); @@ -120,11 +56,6 @@ bool CClibExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction return false; } -bool CClib_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx,unsigned int nIn) -{ - return false; -} - int64_t AddCClibInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs,char *cmpaddr,int32_t CCflag) { return 0; @@ -135,21 +66,6 @@ int64_t AddCClibtxfee(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKe return(0); } -std::string Faucet2Fund(struct CCcontract_info *cp,uint64_t txfee,int64_t funds) -{ - return(""); -} - -std::string CClib_rawtxgen(struct CCcontract_info *cp,uint8_t funcid,cJSON *params) -{ - return(""); -} - -UniValue cclib_error(UniValue &result,const char *errorstr) -{ - return(result); -} - uint256 juint256(cJSON *obj) { uint256 tmp; bits256 t = jbits256(obj,0); @@ -157,11 +73,6 @@ uint256 juint256(cJSON *obj) return(revuint256(tmp)); } -int32_t cclib_parsehash(uint8_t *hash32,cJSON *item,int32_t len) -{ - return(0); -} - #if BUILD_CUSTOMCC #include "customcc.cpp" diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 93e7d3927..4ee4547ff 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -30,7 +30,6 @@ char *CClib_name(); Eval* EVAL_TEST = 0; -struct CCcontract_info CCinfos[0x100]; extern pthread_mutex_t HUSH_CC_mutex; From 63fc690ca35655b0e7c267417021ea828a43142d Mon Sep 17 00:00:00 2001 From: onryo Date: Tue, 5 Mar 2024 17:51:45 +0000 Subject: [PATCH 003/109] Update cross-compile on Linux INSTALL.md for Windows --- INSTALL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 51edd9fdb..76b8f2730 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -105,9 +105,9 @@ Downloading Git source repo, building and running Hush: ```sh # pull git clone https://git.hush.is/hush/hush3 -cd hush +cd hush3 # Build -./build-win.sh -j$(nproc) +./util/build-win.sh -j$(nproc) # Run a HUSH node ./src/hushd ``` From fc95d692e2063ea543d6eb012ebabbb048145e86 Mon Sep 17 00:00:00 2001 From: onryo Date: Wed, 6 Mar 2024 09:09:00 +0000 Subject: [PATCH 004/109] Update cross-compile on Linux INSTALL.md for Windows --- INSTALL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 76b8f2730..1557ed4e4 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -95,8 +95,8 @@ After you have compiled Hush, then you can run it with the following command: Get dependencies: ```ssh sudo apt-get install \ - build-essential pkg-config libc6-dev m4 g++-multilib \ - autoconf libtool ncurses-dev unzip git python \ + build-essential pkg-config libc6-dev m4 g++-multilib libdb++-dev \ + autoconf libtool ncurses-dev unzip git zip \ zlib1g-dev wget bsdmainutils automake mingw-w64 cmake libsodium-dev ``` From 64f59552b381ab1dd0f50ec597a1d56bdcff0ad7 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 13:32:46 -0400 Subject: [PATCH 005/109] They are called Hush Arrakis Chains (HACs) now --- src/cc/dapps/zmigrate.c | 2 +- src/rpc/misc.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/zmigrate.c b/src/cc/dapps/zmigrate.c index e373d788b..4ccbc3636 100644 --- a/src/cc/dapps/zmigrate.c +++ b/src/cc/dapps/zmigrate.c @@ -23,7 +23,7 @@ #include "cJSON.c" /* -NOTE: HUSH nor any Hush Smart Chain has any sprout outputs. This code is kept for historical and educational purposes. +NOTE: HUSH nor any Hush Arrakis Chain has any sprout outputs. This code is kept for historical and educational purposes. z_migrate: the purpose of z_migrate is to make converting of all sprout outputs into sapling. the usage would be for the user to specify a sapling address and call z_migrate zsaddr, until it returns that there is nothing left to be done. diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 5273d40d8..f70f60f79 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -482,7 +482,7 @@ UniValue validateaddress(const UniValue& params, bool fHelp, const CPubKey& mypk if (fHelp || params.size() != 1) throw runtime_error( "validateaddress \"addr\"\n" - "\nReturn information about the given Hush or Hush Smart Chain (HSC) address.\n" + "\nReturn information about the given Hush or Hush Arrakis Chain (HAC) address.\n" "\nArguments:\n" "1. \"addr\" (string, required) The address to validate\n" "\nResult:\n" From a7dd567031a9a26736833dcc5e625c04966ab02c Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 13:33:18 -0400 Subject: [PATCH 006/109] They are called Hush Arrakis Chains (HACs) now --- src/{hush-smart-chain => hush-arrakis-chain} | 0 src/{hush-smart-chain.bat => hush-arrakis-chain.bat} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/{hush-smart-chain => hush-arrakis-chain} (100%) rename src/{hush-smart-chain.bat => hush-arrakis-chain.bat} (100%) diff --git a/src/hush-smart-chain b/src/hush-arrakis-chain similarity index 100% rename from src/hush-smart-chain rename to src/hush-arrakis-chain diff --git a/src/hush-smart-chain.bat b/src/hush-arrakis-chain.bat similarity index 100% rename from src/hush-smart-chain.bat rename to src/hush-arrakis-chain.bat From bbfa41c77d16759bd3f564ddc8f2ea2bef973474 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 13:34:07 -0400 Subject: [PATCH 007/109] They are called Hush Arrakis Chains (HACs) now --- doc/randomx.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/randomx.md b/doc/randomx.md index a690ded2b..474024041 100644 --- a/doc/randomx.md +++ b/doc/randomx.md @@ -1,9 +1,9 @@ # RandomX -Hush Smart Chains support using RandomX as a Proof-Of-Work algorithm as of release 3.9.2 . +Hush Arrakis Chains support using RandomX as a Proof-Of-Work algorithm as of release 3.9.2 . This means you can now launch a privacy coin with Hush tech that can be mined with a CPU instead of requiring an ASIC or GPU. RandomX is the same algorithm that Monero (XMR) and -various other cryptocoins use. As far as we know, Hush Smart Chains are the first coins +various other cryptocoins use. As far as we know, Hush Arrakis Chains are the first coins based on Zcash Protocol that can use the RandomX PoW algorithm. Many thanks to all the people who helped make this possible. @@ -67,7 +67,7 @@ HUSH RandomX currently has two advanced options that some may want to use: This section is not required reading if you just want to use it as a PoW algorithm for an HSC. Here we will explain how the internals of RandomX works inside of the Hush codebase. -We use the official RandomX implementation from https://github.com/tevador/RandomX with custom configuration options. If some type of hardware is created to mine the XMR RandomX algorithm, it will not be compatible with the Hush RandomX algorithm. This is by design. All Hush Smart Chains use the same RandomX config options, so if a hardware device is created to mine one HSC that uses RandomX, it can be used to mine any HSC using RandomX. Every HSC with unique consensus parameters will start off with it's own unique key block with at least 9 bytes of entropy. +We use the official RandomX implementation from https://github.com/tevador/RandomX with custom configuration options. If some type of hardware is created to mine the XMR RandomX algorithm, it will not be compatible with the Hush RandomX algorithm. This is by design. All Hush Arrakis Chains use the same RandomX config options, so if a hardware device is created to mine one HSC that uses RandomX, it can be used to mine any HSC using RandomX. Every HSC with unique consensus parameters will start off with it's own unique key block with at least 9 bytes of entropy. The source code of RandomX is embedded in the Hush source code at `./src/RandomX` and the configuration options used are at `./src/RandomX/src/configuration.h` . From 65c4c5c8de9b27c6e3c17d8ef1de49c9d5cb108c Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 14:06:57 -0400 Subject: [PATCH 008/109] They are called Hush Arrakis Chains (HACs) now --- doc/hsc.md | 4 ++-- src/chainparams.cpp | 2 +- src/hush_bitcoind.h | 2 +- src/hush_utils.h | 2 +- src/init.cpp | 2 +- src/miner.cpp | 2 +- src/net.cpp | 2 +- src/pow.cpp | 2 +- src/wallet/asyncrpcoperation_sendmany.cpp | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/hsc.md b/doc/hsc.md index 3ff3bc263..17e5cbb07 100644 --- a/doc/hsc.md +++ b/doc/hsc.md @@ -1,10 +1,10 @@ -# Hush Smart Chains +# Hush Arrakis Chains An overview of HSCs can be found here: https://git.hush.is/hush/hush-smart-chains -Hush Smart Chains allow you to create a privacy coin with no custom C++ code, just running one command! +Hush Arrakis Chains allow you to create a privacy coin with no custom C++ code, just running one command! The new coin that is created can use either Equihash PoW (ASIC or GPU) or RandomX PoW (CPU). ## HSC Creator diff --git a/src/chainparams.cpp b/src/chainparams.cpp index e2603e14c..02ab894a9 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -117,7 +117,7 @@ public: consensus.nPowMaxAdjustDown = 32; // 32% adjustment down consensus.nPowMaxAdjustUp = 16; // 16% adjustment up // we are emulating old node behavior at startup, they used 150s - consensus.nPowTargetSpacing = 150; // 75; // HUSH is 75 seconds, Hush Smart Chains are 60 seconds by default + consensus.nPowTargetSpacing = 150; // 75; // HUSH is 75 seconds, Hush Arrakis Chains are 60 seconds by default consensus.nPowAllowMinDifficultyBlocksAfterHeight = boost::none; // HUSH never had Sprout in our blockchain history, but some internals require *knowing* about Sprout // or it breaks backward compatibility. We do what we can. diff --git a/src/hush_bitcoind.h b/src/hush_bitcoind.h index 57eb1c8f3..7a05c4146 100644 --- a/src/hush_bitcoind.h +++ b/src/hush_bitcoind.h @@ -948,7 +948,7 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams); // This function defines the Hush Founders Reward (AKA Dev Tax) // 10% of all block rewards go towards Hush core team // If you do not like this, you are encouraged to fork the chain -// or start your own Hush Smart Chain: https://git.hush.is/hush/hush-smart-chains +// or start your own Hush Arrakis Chain: https://git.hush.is/hush/hush-smart-chains // HUSH supply curve cannot be exactly represented via CLI args, so we do it ourselves. // You specify the BR, and the FR % gets added so 10% of 12.5 is 1.25 // but to tell the AC params, I need to say "11% of 11.25" is 1.25 diff --git a/src/hush_utils.h b/src/hush_utils.h index 7b9269f0b..7da3fc452 100644 --- a/src/hush_utils.h +++ b/src/hush_utils.h @@ -1611,7 +1611,7 @@ uint64_t hush_block_subsidy(int height) return subsidy; } -// wrapper for more general supply curves of Hush Smart Chains +// wrapper for more general supply curves of Hush Arrakis Chains uint64_t hush_sc_block_subsidy(int nHeight) { // Find current era, start from beginning reward, and determine current subsidy diff --git a/src/init.cpp b/src/init.cpp index 89b3a3a12..91aeda565 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1128,7 +1128,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) LogPrintf("%s: parameter interaction: -externalip set -> setting -discover=0\n", __func__); } - // Read asmap file by default for HUSH3 and all Hush Smart Chains + // Read asmap file by default for HUSH3 and all Hush Arrakis Chains if (GetArg("-asmap",1)) { fs::path asmap_path = fs::path(GetArg("-asmap", "")); diff --git a/src/miner.cpp b/src/miner.cpp index 95797c684..9a4b17842 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1128,7 +1128,7 @@ void static RandomXMiner() char randomxHash[RANDOMX_HASH_SIZE]; rxdebug("%s: created randomxHash of size %d\n", RANDOMX_HASH_SIZE); char randomxKey[82]; // randomx spec says keysize of >60 bytes is implementation-specific - // initial randomx key is unique to every Hush Smart Chain, and has at least 9 bytes (2^9=128 bits) of entropy + // initial randomx key is unique to every Hush Arrakis Chain, and has at least 9 bytes (2^9=128 bits) of entropy // since magic is 4 bytes, rpc port is 4 bytes and smart chain symbol must be at least 1 character long snprintf(randomxKey, 81, "%08x%s%08x", ASSETCHAINS_MAGIC, SMART_CHAIN_SYMBOL, ASSETCHAINS_RPCPORT); diff --git a/src/net.cpp b/src/net.cpp index 1223e252f..fd6ec86fe 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2733,7 +2733,7 @@ bool CNode::GetTlsValidate() { if (tlsValidate == eTlsOption::FALLBACK_UNSET) { - // This is useful for private Hush Smart Chains, that want to exist + // This is useful for private Hush Arrakis Chains, that want to exist // on a closed VPN with an internal CA or trusted cert system, or // various other use cases if ( GetBoolArg("-tlsvalidate", false)) { diff --git a/src/pow.cpp b/src/pow.cpp index ac5bbb1f8..484b25b95 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -578,7 +578,7 @@ unsigned int CalculateNextWorkRequired(arith_uint256 bnAvg, return bnNew.GetCompact(); } -// HUSH does not use these functions but Hush Smart Chains can opt-in to using more bleeding edge DAA's +// HUSH does not use these functions but Hush Arrakis Chains can opt-in to using more bleeding edge DAA's // ASIC chains do not need these protections as much -- Duke Leto unsigned int lwmaGetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params) { diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index f754158e3..311fc217c 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -363,7 +363,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { /** - * SCENARIO #0 (All HUSH and Hush Smart Chains) + * SCENARIO #0 (All HUSH and Hush Arrakis Chains) * Sprout not involved, so we just use the TransactionBuilder and we're done. * We added the transparent inputs to the builder earlier. */ From 49f8cf7ca7fc196bafd0f6c1822b0dca10173917 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 15:08:10 -0400 Subject: [PATCH 009/109] Remove some unneeded cc code --- src/cc/customcc.cpp | 75 +-------------------------------------------- src/cc/customcc.h | 33 -------------------- 2 files changed, 1 insertion(+), 107 deletions(-) diff --git a/src/cc/customcc.cpp b/src/cc/customcc.cpp index 7edb95f79..961089de8 100644 --- a/src/cc/customcc.cpp +++ b/src/cc/customcc.cpp @@ -1,88 +1,15 @@ // Copyright (c) 2016-2024 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html -/* - simple stub custom cc - - Just update the functions in this file, then from ~/hush3/src/cc - - ../hush-cli -ac_name=CUSTOM stop - ./makecustom - ../hush-smart-chain -ac_name=CUSTOM -ac_cclib=custom -ac_cc=2 ... - - The above will rebuild hushd and get it running again - */ - -CScript custom_opret(uint8_t funcid,CPubKey pk) -{ - CScript opret; uint8_t evalcode = EVAL_CUSTOM; - opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << pk); - return(opret); -} - -uint8_t custom_opretdecode(CPubKey &pk,CScript scriptPubKey) -{ - std::vector vopret; uint8_t e,f; - GetOpReturnData(scriptPubKey,vopret); - if ( vopret.size() > 2 && E_UNMARSHAL(vopret,ss >> e; ss >> f; ss >> pk) != 0 && e == EVAL_CUSTOM ) - { - return(f); - } - return(0); -} - -UniValue custom_rawtxresult(UniValue &result,std::string rawtx,int32_t broadcastflag) -{ - CTransaction tx; - if ( rawtx.size() > 0 ) - { - result.push_back(Pair("hex",rawtx)); - if ( DecodeHexTx(tx,rawtx) != 0 ) - { - if ( broadcastflag != 0 && myAddtomempool(tx) != 0 ) - RelayTransaction(tx); - result.push_back(Pair("txid",tx.GetHash().ToString())); - result.push_back(Pair("result","success")); - } else result.push_back(Pair("error","decode hex")); - } else result.push_back(Pair("error","couldnt finalize CCtx")); - return(result); -} UniValue custom_func0(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { UniValue result(UniValue::VOBJ); - result.push_back(Pair("result","success")); - result.push_back(Pair("message","just an example of an information returning rpc")); return(result); } -// send yourself 1 coin to your CC address using normal utxo from your -pubkey - UniValue custom_func1(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { - CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), hush_nextheight()); std::string rawtx; - UniValue result(UniValue::VOBJ); CPubKey mypk; int64_t amount = COIN; int32_t broadcastflag=0; - if ( txfee == 0 ) - txfee = CUSTOM_TXFEE; - mypk = pubkey2pk(Mypubkey()); - if ( AddNormalinputs2(mtx,COIN+txfee,64) >= COIN+txfee ) // add utxo to mtx - { - // make op_return payload as normal. - CScript opret = custom_opret('1',mypk); - std::vector> vData = std::vector>(); - if ( makeCCopret(opret, vData) ) - { - // make vout0 with op_return included as payload. - mtx.vout.push_back(MakeCC1vout(cp->evalcode,amount,mypk,&vData)); - fprintf(stderr, "vout size2.%li\n", mtx.vout.size()); - rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,CScript()); - return(custom_rawtxresult(result,rawtx,broadcastflag)); - } - } + UniValue result(UniValue::VOBJ); return(result); } - -bool custom_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx) -{ - return false; -} diff --git a/src/cc/customcc.h b/src/cc/customcc.h index 4159d9608..7dfb78f84 100644 --- a/src/cc/customcc.h +++ b/src/cc/customcc.h @@ -1,20 +1,6 @@ // Copyright (c) 2016-2024 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html -/* - to create a custom libcc.so: - - 1. change "func0" and "func1" to method names that fit your custom cc. Of course, you can create more functions by adding another entry to RPC_FUNCS. there is not any practical limit to the number of methods. - - 2. For each method make sure there is a UniValue function declaration and CUSTOM_DISPATCH has an if statement checking for it that calls the custom_func - - 3. write the actual custom_func0, custom_func1 and custom_validate in customcc.cpp - - 4. ./makecustom, which builds cclib.cpp with -DBUILD_CUSTOMCC and puts the libcc.so in ~/hush3/src and rebuilds hushd - - 5. launch your chain with -ac_cclib=customcc -ac_cc=2 - - */ std::string MYCCLIBNAME = (char *)"customcc"; @@ -27,22 +13,3 @@ std::string MYCCLIBNAME = (char *)"customcc"; { (char *)MYCCNAME, (char *)"func0", (char *)"", 1, 1, '0', EVAL_CUSTOM }, \ { (char *)MYCCNAME, (char *)"func1", (char *)"", 0, 0, '1', EVAL_CUSTOM }, -bool custom_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx); -UniValue custom_func0(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); -UniValue custom_func1(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); - -#define CUSTOM_DISPATCH \ -if ( cp->evalcode == EVAL_CUSTOM ) \ -{ \ - if ( strcmp(method,"func0") == 0 ) \ - return(custom_func0(txfee,cp,params)); \ - else if ( strcmp(method,"func1") == 0 ) \ - return(custom_func1(txfee,cp,params)); \ - else \ - { \ - result.push_back(Pair("result","error")); \ - result.push_back(Pair("error","invalid customcc method")); \ - result.push_back(Pair("method",method)); \ - return(result); \ - } \ -} From d1991e6454e47f181e2b82ba2f6d90176ad37c14 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 15:14:26 -0400 Subject: [PATCH 010/109] It is called hush-arrakis-chain now --- Dockerfile | 2 +- doc/randomx.md | 10 +++++----- qa/rpc-tests/test_framework/test_framework.py | 4 ++-- src/cc/dapps/dappinc.h | 2 +- src/dragonxd | 2 +- src/hush_bitcoind.h | 2 +- src/smartchains | 2 +- src/smartchains.old | 17 ----------------- src/testdragonxd | 2 +- util/build-debian-package.sh | 2 +- util/gen-linux-binary-release.sh | 2 +- 11 files changed, 15 insertions(+), 32 deletions(-) delete mode 100755 src/smartchains.old diff --git a/Dockerfile b/Dockerfile index b011397d8..946cbbd88 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ RUN cd /hush && \ RUN ln -sf /hush/src/hushd /usr/bin/hushd && \ ln -sf /hush/src/hush-tx /usr/bin/hush-tx && \ ln -sf /hush/src/wallet-utility /usr/bin/hush-wallet-utility && \ - ln -sf /hush/src/hush-smart-chain /usr/bin/hush-smart-chain && \ + ln -sf /hush/src/hush-arrakis-chain /usr/bin/hush-arrakis-chain && \ ln -sf /hush/util/docker-entrypoint.sh /usr/bin/entrypoint && \ ln -sf /hush/util/docker-hush-cli.sh /usr/bin/hush-cli diff --git a/doc/randomx.md b/doc/randomx.md index 474024041..1075c8890 100644 --- a/doc/randomx.md +++ b/doc/randomx.md @@ -13,12 +13,12 @@ The following command can be used to launch an HSC on a single computer. Each op HSC CLI arguments that start with `-ac_` means they *Affect Consensus*. ``` -./src/hush-smart-chain -ac_halving=100 -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=15 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 +./src/hush-arrakis-chain -ac_halving=100 -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=15 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 ``` - * `hush-smart-chain` is the script used to launch or connect to HSCs + * `hush-arrakis-chain` is the script used to launch or connect to HSCs * It lives in the `./src` directory, next to `hushd` and `hush-cli` - * It is called `hush-smart-chain.bat` on Windows + * It is called `hush-arrakis-chain.bat` on Windows * `-ac_halving=100` means "the block reward halves every 100 blocks" * `-ac_algo=randomx` means "use RandomX for Proof-Of-Work * The default is Equihash (200,9) @@ -41,12 +41,12 @@ HSC CLI arguments that start with `-ac_` means they *Affect Consensus*. * One node would use ``` # first node -./src/hush-smart-chain -ac_halving=100 -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=15 -ac_reward=500000000 -ac_supply=55555 +./src/hush-arrakis-chain -ac_halving=100 -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=15 -ac_reward=500000000 -ac_supply=55555 ``` * And the second node would use: ``` # mining node. NOTE: This node will mine the genesis block and pre-mine, if any -./src/hush-smart-chain -ac_halving=100 -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=15 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 +./src/hush-arrakis-chain -ac_halving=100 -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=15 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 ``` # Advanced Options diff --git a/qa/rpc-tests/test_framework/test_framework.py b/qa/rpc-tests/test_framework/test_framework.py index ff9cfaea6..273d9c6bf 100755 --- a/qa/rpc-tests/test_framework/test_framework.py +++ b/qa/rpc-tests/test_framework/test_framework.py @@ -162,10 +162,10 @@ class ComparisonTestFramework(BitcoinTestFramework): def add_options(self, parser): parser.add_option("--testbinary", dest="testbinary", - default=os.getenv("BITCOIND", "hush-smart-chain"), + default=os.getenv("BITCOIND", "hush-arrakis-chain"), help="bitcoind binary to test") parser.add_option("--refbinary", dest="refbinary", - default=os.getenv("BITCOIND", "hush-smart-chain"), + default=os.getenv("BITCOIND", "hush-arrakis-chain"), help="bitcoind binary to use for reference nodes (if any)") def setup_chain(self): diff --git a/src/cc/dapps/dappinc.h b/src/cc/dapps/dappinc.h index d9d77e4dc..e9afd7fdc 100644 --- a/src/cc/dapps/dappinc.h +++ b/src/cc/dapps/dappinc.h @@ -339,7 +339,7 @@ cJSON *get_hushcli(char *refcoin,char **retstrp,char *acname,char *method,char * if ( acname[0] != 0 ) { if ( refcoin[0] != 0 && strcmp(refcoin,"HUSH3") != 0 && strcmp(refcoin,acname) != 0 ) printf("unexpected: refcoin.(%s) acname.(%s)\n",refcoin,acname); - sprintf(cmdstr,"hush-smart-chain -ac_name=%s %s %s %s %s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,arg3,arg4,arg5,arg6,fname); + sprintf(cmdstr,"hush-arrakis-chain -ac_name=%s %s %s %s %s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,arg3,arg4,arg5,arg6,fname); } else if ( strcmp(refcoin,"HUSH3") == 0 ) sprintf(cmdstr,"hush-cli %s %s %s %s %s %s %s %s > %s\n",method,arg0,arg1,arg2,arg3,arg4,arg5,arg6,fname); diff --git a/src/dragonxd b/src/dragonxd index 7e6320ba5..076ce94dc 100755 --- a/src/dragonxd +++ b/src/dragonxd @@ -13,4 +13,4 @@ cd $DIR SEEDNODE=176.126.87.241 # Remember Remember the 5th November for freedom of speech is not free!! -./hush-smart-chain -ac_name=DRAGONX -ac_algo=randomx -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=36 -ac_private=1 -addnode=$SEEDNODE $@ +./hush-arrakis-chain -ac_name=DRAGONX -ac_algo=randomx -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=36 -ac_private=1 -addnode=$SEEDNODE $@ diff --git a/src/hush_bitcoind.h b/src/hush_bitcoind.h index 7a05c4146..59de08708 100644 --- a/src/hush_bitcoind.h +++ b/src/hush_bitcoind.h @@ -948,7 +948,7 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams); // This function defines the Hush Founders Reward (AKA Dev Tax) // 10% of all block rewards go towards Hush core team // If you do not like this, you are encouraged to fork the chain -// or start your own Hush Arrakis Chain: https://git.hush.is/hush/hush-smart-chains +// or start your own Hush Arrakis Chain: https://git.hush.is/hush/hush-arrakis-chains // HUSH supply curve cannot be exactly represented via CLI args, so we do it ourselves. // You specify the BR, and the FR % gets added so 10% of 12.5 is 1.25 // but to tell the AC params, I need to say "11% of 11.25" is 1.25 diff --git a/src/smartchains b/src/smartchains index ce46c8f18..e48482da2 100755 --- a/src/smartchains +++ b/src/smartchains @@ -6,7 +6,7 @@ set -eo pipefail source pubkey.txt overide_args="$@" seed_ip=$(SEEDNODE) -hsc='./hush-smart-chain' +hsc='./hush-arrakis-chain' if [ -z "$delay" ]; then delay=20; fi diff --git a/src/smartchains.old b/src/smartchains.old deleted file mode 100755 index 4df00be85..000000000 --- a/src/smartchains.old +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) 2018-2024 The Hush developers -set -x -delay=60 -source pubkey.txt -echo $pubkey -echo "jl777 is a traitor to his village of cypherpunks, ca333 is his obedient servant" - -hsc="./hush-smart-chain" -ip=$(HUSHDEX_SEEDNODE) - -# this chain helps power HushDEX -$hsc -pubkey=$pubkey -ac_name=ZEX -ac_supply=100000000 -addnode=$ip $@ & - -# these are testcoins, like ARRR -$hsc -pubkey=$pubkey -ac_name=ZUSH -ac_supply=100000000 -addnode=$ip $@ & -$hsc -pubkey=$pubkey -ac_name=KOOLAID -ac_supply=100000000 -addnode=$ip $@ & diff --git a/src/testdragonxd b/src/testdragonxd index 640152196..953ffd4ae 100755 --- a/src/testdragonxd +++ b/src/testdragonxd @@ -14,4 +14,4 @@ BLOCKTIME=18 SUPPLY=0 # Remember Remember the 5th November for freedom of speech is not free!! -./hush-smart-chain -ac_name=TESTDRAGONX -ac_algo=randomx -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=$BLOCKTIME -ac_private=1 -ac_supply=$SUPPLY -debug=randomx $@ +./hush-arrakis-chain -ac_name=TESTDRAGONX -ac_algo=randomx -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=$BLOCKTIME -ac_private=1 -ac_supply=$SUPPLY -debug=randomx $@ diff --git a/util/build-debian-package.sh b/util/build-debian-package.sh index c9719fd18..6fa0f1f7e 100755 --- a/util/build-debian-package.sh +++ b/util/build-debian-package.sh @@ -77,7 +77,7 @@ strip $DEB_BIN/hush-tx cp $SRC_PATH/src/dragonx-cli $DEB_BIN cp $SRC_PATH/src/dragonxd $DEB_BIN -cp $SRC_PATH/src/hush-smart-chain $DEB_BIN +cp $SRC_PATH/src/hush-arrakis-chain $DEB_BIN #cp $SRC_DEB/changelog $DEB_DOC/changelog.Debian cp $SRC_DEB/copyright $DEB_DOC cp -r $SRC_DEB/examples $DEB_DOC diff --git a/util/gen-linux-binary-release.sh b/util/gen-linux-binary-release.sh index f658fc5da..dbf5f392e 100755 --- a/util/gen-linux-binary-release.sh +++ b/util/gen-linux-binary-release.sh @@ -24,7 +24,7 @@ echo "Created new build dir $BUILD" cp contrib/asmap/asmap.dat $BUILD cp sapling*.params $BUILD cd src -cp hushd hush-cli hush-tx hush-smart-chain dragonx-cli dragonxd ../$BUILD +cp hushd hush-cli hush-tx hush-arrakis-chain dragonx-cli dragonxd ../$BUILD cd ../$BUILD strip hushd hush-cli hush-tx cd .. From 25c27d2ef56c3adb1e352753d89ddcfe7061d208 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 15:16:04 -0400 Subject: [PATCH 011/109] It is called hush-arrakis-chain now --- src/sc/koolaid | 2 +- src/sc/kush | 2 +- src/sc/zex | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sc/koolaid b/src/sc/koolaid index 9db2e58ce..a46b71aeb 100755 --- a/src/sc/koolaid +++ b/src/sc/koolaid @@ -1,3 +1,3 @@ #!/usr/bin/env bash # Copyright (c) 2018-2024 The Hush developers -./hush-smart-chain -ac_name=KOOLAID $@ +./hush-arrakis-chain -ac_name=KOOLAID $@ diff --git a/src/sc/kush b/src/sc/kush index bb8a34893..a5349a6a3 100755 --- a/src/sc/kush +++ b/src/sc/kush @@ -1,3 +1,3 @@ #!/usr/bin/env bash # Copyright (c) 2018-2024 The Hush developers -./hush-smart-chain -ac_name=KUSH $@ +./hush-arrakis-chain -ac_name=KUSH $@ diff --git a/src/sc/zex b/src/sc/zex index 12ffea170..55b4640ef 100755 --- a/src/sc/zex +++ b/src/sc/zex @@ -1,3 +1,3 @@ #!/usr/bin/env bash # Copyright (c) 2018-2024 The Hush developers -./hush-smart-chain -ac_name=ZEX $@ +./hush-arrakis-chain -ac_name=ZEX $@ From 9842687be2658f836e0812a4177e796b046ac38a Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 15 Mar 2024 15:17:04 -0400 Subject: [PATCH 012/109] It is called hush-arrakis-chain now --- src/testequihashd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testequihashd b/src/testequihashd index 3de539bd9..5e46cddc1 100755 --- a/src/testequihashd +++ b/src/testequihashd @@ -15,4 +15,4 @@ SUPPLY=0 # same as TESTDRAGONX except equihash and different ac_name # and debug=pow which is the equivalent of debug=randomx for equihash mining -./hush-smart-chain -ac_name=TESTEQUIHASH -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=$BLOCKTIME -ac_private=1 -ac_supply=$SUPPLY -debug=pow $@ +./hush-arrakis-chain -ac_name=TESTEQUIHASH -ac_halving=3500000 -ac_reward=300000000 -ac_blocktime=$BLOCKTIME -ac_private=1 -ac_supply=$SUPPLY -debug=pow $@ From c5c0ce45da7ed5d6b41ef2f2ea8959e6e83df559 Mon Sep 17 00:00:00 2001 From: onryo Date: Fri, 15 Mar 2024 19:48:12 +0000 Subject: [PATCH 013/109] We call it hush arrakis chains --- doc/hsc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/hsc.md b/doc/hsc.md index 17e5cbb07..1636419b6 100644 --- a/doc/hsc.md +++ b/doc/hsc.md @@ -13,7 +13,7 @@ https://git.hush.is/hush/hsc-creator with its site https://hush.is/hsc-creator ## HSC HOWTO -https://git.hush.is/onryo/hush-smart-chain-how-to +https://git.hush.is/onryo/hush-arrakis-chain-how-to ## HSC CLI From 394c54c4da93918c2a4e368e6ece6c03bd5e1daa Mon Sep 17 00:00:00 2001 From: jahway603 Date: Sun, 17 Mar 2024 00:07:39 -0400 Subject: [PATCH 014/109] doc: update Matrix chatroom link in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2a2bd9431..dc8f68d0c 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ Please feel free to join us on Telegram for official support: Other socials: * Twitter: @hushisprivacy -* Matrix: @hush_main:meowchat.xyz +* Matrix: @hush_main:matrix.org * PeerTube videos.hush.is * Reddit @Myhush * Mastodon @myhushteam@fosstodon.org From e860ad6efba81cc91acadc36fd8d7d0df251872d Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 18 Mar 2024 18:03:06 +0000 Subject: [PATCH 015/109] Image to README --- doc/hush/hush0.png | Bin 0 -> 17078 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/hush/hush0.png diff --git a/doc/hush/hush0.png b/doc/hush/hush0.png new file mode 100644 index 0000000000000000000000000000000000000000..32f77375d8b1c4450a5e27276ddb03452b417365 GIT binary patch literal 17078 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 Date: Mon, 18 Mar 2024 18:03:34 +0000 Subject: [PATCH 016/109] Update image --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dc8f68d0c..31538216a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## What is Hush? -![Logo](doc/hush/hush.png "Logo") +![Logo](doc/hush/hush0.png "Logo") Hush implements Extreme Privacy via blockchain tech. We have our own genesis block. We are not a chain fork (copy) of another coin. We are based on From 424ca42015d253e4d4307c89331bb4d13f0af22e Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 18 Mar 2024 19:20:02 +0000 Subject: [PATCH 017/109] Update README --- README.md | 148 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 105 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 31538216a..be9b7bc72 100644 --- a/README.md +++ b/README.md @@ -1,75 +1,137 @@ -# Hush +

+ +

-## What is Hush? +

-![Logo](doc/hush/hush0.png "Logo") +| Introduction | Install | Compile | FAQ | Documentation | +| :---: | :---: | :---: | :---: | :---: | +| [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#) | [Build on Debian or Ubuntu](#) | [Where can I buy Hush?](#) | [Cross compiling Windows binaries](#) +| [Why not GitHub?](#banned-by-github) | [Mac - Guideline](#) | [Build on Arch](#) | [Can I mine with CPU or GPU?](#) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) +| [What is HushChat?](#) | [Download for Android](https://storage.hush.land/hush-sda/SilentDragonXAndroid.apk) | [Build on Fedora](#) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) +| [What is SilentDagon?](#) | [Deb package - Guideline](#) | [Ubuntu 16.04](#) | [Where can I spend Hush?](#) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) + +

+ +# What is Hush? Hush implements Extreme Privacy via blockchain tech. We have our own genesis block. We are not a chain fork (copy) of another coin. We are based on Bitcoin code, with sophisticated zero-knowledge mathematics added for privacy. This keeps your transaction metadata private! -### This repository - This software is the Hush node and command-line client. It downloads and stores the entire history of Hush transactions; depending on the speed of your computer and network connection, it will likely take a few hours at least, but -some people report full nodes syncing in less than 1.5 hours. A competing privacy -coin takes over 24 hours to sync their full nodes because of Sprout Transactions, lulz. +some people report full nodes syncing in less than 1.5 hours. -### BANNED BY GITHUB +# Banned by GitHub In working on this release, Duke Leto was suspended from Github, which gave Hush developers -the impetus to completely leave that racist and censorship-loving platform. - -Hush now has it's own [git.hush.is](https://git.hush.is/hush) Gitea instance, -because we will not be silenced by Microsoft. - -All Hush software will be released from git.hush.is and hush.is, downloads from any other +the impetus to completely leave that racist and censorship-loving platform. Hush now has it's own [git.hush.is](https://git.hush.is/hush) Gitea instance, +because we will not be silenced by Microsoft. All Hush software will be released from git.hush.is and hush.is, downloads from any other domains should be assumed to be backdoored. **Hush is unfinished and highly experimental.** Use at your own risk! Just like Bitcoin. -## Installing +# Build on Debian or Ubuntu -You can either compile it yourself or you can install a binary which was compiled by us. -Please refer to the instructions which apply to you below: +```sh +# install build dependencies +sudo apt-get install build-essential pkg-config libc6-dev m4 g++-multilib \ + autoconf libtool ncurses-dev unzip git zlib1g-dev wget \ + bsdmainutils automake curl unzip nano libsodium-dev cmake +# clone git repo +git clone https://git.hush.is/hush/hush3 +cd hush3 +# Build +# This uses 3 build processes, you need 2GB of RAM for each. +./build.sh -j3 +``` +Video Tutorial: https://videos.hush.is/w/3kKQt81r7UUPWLHVuwK2BZ -* See [INSTALL.md](INSTALL.md) to compile from source on Linux and to cross-compile for Windows -* See [INSTALL-BIN.md](INSTALL-BIN.md) to install pre-compiled binary on Linux +# Build on Arch -### Claiming Funds From Old Hush Wallets +```sh +# install build dependencies +sudo pacman -S gcc libsodium lib32-zlib unzip wget git python rust curl autoconf cmake +# clone git repo +git clone https://git.hush.is/hush/hush3 +cd hush3 +# Build +# This uses 3 build processes, you need 2GB of RAM for each. +./build.sh -j3 +``` -If you have an older wallet, then refer to [OLD_WALLETS.md](OLD_WALLETS.md). +# Build on Fedora -### Official Explorers +```sh +# install build dependencies +sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libtool ncurses-devel patch -y +# clone git repo +git clone https://git.hush.is/hush/hush3 +cd hush3 +# Build +# This uses 3 build processes, you need 2GB of RAM for each. +./build.sh -j3 +``` + +# Install on Windows 10 + +Video Tutorial: https://videos.hush.is/w/oGXff7of3EjmGENtDtYTUX + +# Install on ARM Architecture + +1. [Download the latest debian package](https://git.hush.is/attachments/ade3f699-6a02-4f1d-af25-04d21029be48). +2. Install the Debian package: `sudo dpkg -i hush-3.10.2-aarch64.deb`. +3. Run with: `hushd`. + +# Building On Ubuntu 16.04 and older systems + +Some older compilers may not be able to compile modern code, such as gcc 5.4 which comes with Ubuntu 16.04 by default. Here is how to install gcc 7 on Ubuntu 16.04. Run these commands as root: + +``` +add-apt-repository ppa:ubuntu-toolchain-r/test && \ +apt update && \ +apt-get install -y gcc-7 g++-7 && \ + update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 60 && \ + update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 +``` + +# Build on Mac + +``` +sudo port update +sudo port upgrade outdated +sudo port install qt5 + +# clone git repo +git clone https://git.hush.is/hush/hush3 +cd hush3 +# Build +# This uses 3 build processes, you need 2GB of RAM for each. +./build.sh -j3 +``` + +# Installing Hush binaries + +1. [Download the release](https://git.hush.is/hush/hush3/releases) with a .deb file extension. +2. Install the Debian package: `sudo dpkg -i hush-3.10.2-amd64.deb`. +3. Run with: `hushd`. + +# Official Explorers The links for the Official Hush explorers: * [explorer.hush.is](https://explorer.hush.is) * [explorer.hush.land](https://explorer.hush.land) -We are looking for alternate explorers to be run on Tor, i2P and other TLDs, if you are interested -please join Telegram and ask questions. +# Support and Socials -### For system admins +* Telegram: https://hush.is/tg +* Matrix: https://hush.is/matrix +* Twitter: https://hush.is/twitter +* PeerTube https://hush.is/peertube -There is a new systemd user service script so you can easily start/stop/restart your hushd service on your server. -[Try it out today](doc/hushd-systemd.md) and the systemd script is located in the doc directory of the source tree. - -## Support and Socials - -Please feel free to join us on Telegram for official support: -* Main group: https://hush.is/tg -* Support group: https://hush.is/telegram_support -* Mining group: https://hush.is/telegram_mining - -Other socials: -* Twitter: @hushisprivacy -* Matrix: @hush_main:matrix.org -* PeerTube videos.hush.is -* Reddit @Myhush -* Mastodon @myhushteam@fosstodon.org - -## License +# License For license information see the file [COPYING](COPYING). From c8cd6eaa0375abb275419949cdf67be71b74d5fa Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 18 Mar 2024 19:23:54 +0000 Subject: [PATCH 018/109] Update README --- README.md | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index be9b7bc72..85811239e 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,16 @@

-

+

| Introduction | Install | Compile | FAQ | Documentation | | :---: | :---: | :---: | :---: | :---: | -| [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#) | [Build on Debian or Ubuntu](#) | [Where can I buy Hush?](#) | [Cross compiling Windows binaries](#) -| [Why not GitHub?](#banned-by-github) | [Mac - Guideline](#) | [Build on Arch](#) | [Can I mine with CPU or GPU?](#) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) -| [What is HushChat?](#) | [Download for Android](https://storage.hush.land/hush-sda/SilentDragonXAndroid.apk) | [Build on Fedora](#) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) -| [What is SilentDagon?](#) | [Deb package - Guideline](#) | [Ubuntu 16.04](#) | [Where can I spend Hush?](#) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) +| [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#) | [Cross compiling Windows binaries](#) +| [Why not GitHub?](#banned-by-github) | [Mac - Guideline](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](#) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) +| [What is HushChat?](#) | [Download for Android](https://storage.hush.land/hush-sda/SilentDragonXAndroid.apk) | [Build on Fedora](#build-on-fedora) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) +| [What is SilentDagon?](#) | [Deb package - Guideline](#) | [Ubuntu 16.04](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) -

+ # What is Hush? @@ -125,6 +125,27 @@ The links for the Official Hush explorers: * [explorer.hush.is](https://explorer.hush.is) * [explorer.hush.land](https://explorer.hush.land) +# Windows (cross-compiled on Linux) +Get dependencies: +```ssh +sudo apt-get install \ + build-essential pkg-config libc6-dev m4 g++-multilib libdb++-dev \ + autoconf libtool ncurses-dev unzip git zip \ + zlib1g-dev wget bsdmainutils automake mingw-w64 cmake libsodium-dev +``` + +Downloading Git source repo, building and running Hush: + +```sh +# pull +git clone https://git.hush.is/hush/hush3 +cd hush3 +# Build +./util/build-win.sh -j$(nproc) +# Run a HUSH node +./src/hushd +``` + # Support and Socials * Telegram: https://hush.is/tg From 5b9e9717800e9e5362204b796840f94ee1d3427a Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 18 Mar 2024 19:32:08 +0000 Subject: [PATCH 019/109] Update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 85811239e..84fb9fb68 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@ | Introduction | Install | Compile | FAQ | Documentation | | :---: | :---: | :---: | :---: | :---: | -| [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#) | [Cross compiling Windows binaries](#) +| [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#) | [Cross compiling Windows binaries](#windows-cross-compiled-on-linux) | [Why not GitHub?](#banned-by-github) | [Mac - Guideline](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](#) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) | [What is HushChat?](#) | [Download for Android](https://storage.hush.land/hush-sda/SilentDragonXAndroid.apk) | [Build on Fedora](#build-on-fedora) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) -| [What is SilentDagon?](#) | [Deb package - Guideline](#) | [Ubuntu 16.04](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) +| [What is SilentDagon?](#) | [Deb package - Guideline](#installing-hush-binaries) | [Ubuntu 16.04](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) From 754cbcb02d78316c89e1257c9e0d30b09a81e62c Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 18 Mar 2024 20:07:21 +0000 Subject: [PATCH 020/109] Update README --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 84fb9fb68..77cc01062 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,28 @@ cd hush3 ./src/hushd ``` +# What is SilentDagon? + +[SilentDragon](https://git.hush.is/hush/SilentDragon) is a desktop wallet for HUSH full node.
+[SilentDragonLite](https://git.hush.is/hush/SilentDragonLite) is a desktop wallet that does not require you to download the full blockchain. + +# What is HushChat? + +HushChat is a protocol inspired by the design of Signal Protocol, it uses many of the same cryptography and ideas, but does not actually use any code from Signal. Signal requires phone numbers and is a centralized service. HushChat is completely anonymous and decentralized and requires absolutely no metadata be given to any centralized third parties. + +# Can I mine with CPU or GPU? + +Only ASIC mining is recommended, HUSH uses Equihash (200,9) algo as Zcash, Horizen or Komodo. + +# Where can I buy Hush? + +1. https://nonkyc.io/market/HUSH_BTC +2. https://tradeogre.com/exchange/BTC-HUSH + +# Where can I spend Hush? + +Agora market (in progress) + # Support and Socials * Telegram: https://hush.is/tg From 25009928f80d482618e1d399ac1037491448c1ff Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 18 Mar 2024 20:08:50 +0000 Subject: [PATCH 021/109] Update README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 77cc01062..b2a165efe 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,10 @@ | Introduction | Install | Compile | FAQ | Documentation | | :---: | :---: | :---: | :---: | :---: | -| [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#) | [Cross compiling Windows binaries](#windows-cross-compiled-on-linux) -| [Why not GitHub?](#banned-by-github) | [Mac - Guideline](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](#) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) -| [What is HushChat?](#) | [Download for Android](https://storage.hush.land/hush-sda/SilentDragonXAndroid.apk) | [Build on Fedora](#build-on-fedora) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) -| [What is SilentDagon?](#) | [Deb package - Guideline](#installing-hush-binaries) | [Ubuntu 16.04](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) +| [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#where-can-i-buy-hush) | [Cross compiling Windows binaries](#windows-cross-compiled-on-linux) +| [Why not GitHub?](#banned-by-github) | [Mac - Guideline](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](can-i-mine-with-cpu-or-gpu) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) +| [What is HushChat?](#what-is-hushchat) | [Download for Android](https://storage.hush.land/hush-sda/SilentDragonXAndroid.apk) | [Build on Fedora](#build-on-fedora) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) +| [What is SilentDagon?](#what-is-silentdagon) | [Deb package - Guideline](#installing-hush-binaries) | [Ubuntu 16.04](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#where-can-i-spend-hush) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) From 8ff5e4aa5ea924205b33efd1edf67c059817aa99 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 20 Mar 2024 14:09:02 -0400 Subject: [PATCH 022/109] Make getchaintxstats less noisy in debug log --- src/rpc/blockchain.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 6b5f2e6b3..27f17852d 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1620,12 +1620,12 @@ UniValue getchaintxstats(const UniValue& params, bool fHelp, const CPubKey& mypk throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid block count: should be between 0 and the block's height - 1"); } } - LogPrintf("%s: blockcount = %d\n", __func__, blockcount); + // LogPrintf("%s: blockcount = %d\n", __func__, blockcount); const CBlockIndex* pindexPast = pindex->GetAncestor(pindex->GetHeight() - blockcount); int nTimeDiff = pindex->GetMedianTimePast() - pindexPast->GetMedianTimePast(); int nTxDiff = pindex->nChainTx - pindexPast->nChainTx; - LogPrintf("%s: pindexPast.height = %d, pindex.height = %d\n", __func__, pindexPast->GetHeight(), pindex->GetHeight() ); + // LogPrintf("%s: pindexPast.height = %d, pindex.height = %d\n", __func__, pindexPast->GetHeight(), pindex->GetHeight() ); UniValue ret(UniValue::VOBJ); ret.pushKV("time", (int64_t)pindex->nTime); From 3354d45fd362d89a1a45a7a1686117b809ec2b64 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 20 Mar 2024 16:19:54 -0400 Subject: [PATCH 023/109] Make getchaintxstats less noisy in debug log --- src/rpc/blockchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 27f17852d..dbd0da9ed 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -1657,7 +1657,7 @@ UniValue getchaintxstats(const UniValue& params, bool fHelp, const CPubKey& mypk ret.pushKV("window_tx_count", nTxDiff); ret.pushKV("window_interval", nTimeDiff); int64_t nPaymentsDiff = pindex->nChainPayments - pindexPast->nChainPayments; - LogPrintf("%s: pindexPast.nChainPayments = %d, pindex.nChainPayments = %d\n", __func__, pindexPast->nChainPayments, pindex->nChainPayments ); + //LogPrintf("%s: pindexPast.nChainPayments = %d, pindex.nChainPayments = %d\n", __func__, pindexPast->nChainPayments, pindex->nChainPayments ); int64_t nShieldedTxDiff = pindex->nChainShieldedTx - pindexPast->nChainShieldedTx; int64_t nShieldingTxDiff = pindex->nChainShieldingTx - pindexPast->nChainShieldingTx; int64_t nDeshieldingTxDiff = pindex->nChainDeshieldingTx - pindexPast->nChainDeshieldingTx; From 558f662a3356e971056305ed43756849d5f22a87 Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 21 Mar 2024 11:17:58 -0400 Subject: [PATCH 024/109] Do not apply sapling network rules to block height 0 or 1 in ScanForWalletTransactions --- src/wallet/wallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 37b31ec85..18e38cb0c 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2790,7 +2790,7 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate) // This should never fail: we should always be able to get the tree // state on the path to the tip of our chain if (pindex->pprev) { - const bool sapling = true; + const bool sapling = pindex->GetHeight() >= 2 ? true : false; if (sapling) { // NetworkUpgradeActive(pindex->pprev->GetHeight(), Params().GetConsensus(), Consensus::UPGRADE_SAPLING)) { assert(pcoinsTip->GetSaplingAnchorAt(pindex->pprev->hashFinalSaplingRoot, saplingTree)); } From 975f22bfa0caecbf4f7519fec907168ba50e0d4a Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 21 Mar 2024 11:30:34 -0400 Subject: [PATCH 025/109] Improve error message in z_sendmany if tx is estimated to be too large The previous error message was incorrect, it could be too many inputs or a combination of too many inputs and outputs and also did not report the estimated size. --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 51273a754..ec99d7516 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5311,7 +5311,7 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) } txsize += CTXOUT_REGULAR_SIZE * taddrRecipients.size(); if (txsize > max_tx_size) { - throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Too many outputs, size of raw transaction would be larger than limit of %d bytes", max_tx_size )); + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Size of raw transaction %d would be larger than limit of %d bytes", txsize, max_tx_size )); } // Minimum confirmations From 753ad7b95b073f7e579a78ad0dedea62137352d9 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 22 Mar 2024 05:05:50 -0700 Subject: [PATCH 026/109] Remove .gitmodules --- .gitmodules | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29bb..000000000 From f97008250409d9dd06ee70a136cce8e96617b73c Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 22 Mar 2024 05:07:00 -0700 Subject: [PATCH 027/109] Remove migratecoin.sh --- migratecoin.sh | 43 ------------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 migratecoin.sh diff --git a/migratecoin.sh b/migratecoin.sh deleted file mode 100644 index a4b05f417..000000000 --- a/migratecoin.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/usr/bin/env bash -# Copyright (c) 2016-2024 The Hush developers -# Distributed under the GPLv3 software license, see the accompanying -# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html -# This script makes the neccesary transactions to migrate -# coin between 2 assetchains on the same -ac_cc id -set -e -source=DERPZ -target=DERPZ000 -address="Rxxx" -amount=1 - -# Alias for running cli on source chain -cli_source="hush-cli -ac_name=$source" - -# Raw tx that we will work with -txraw=`$cli_source createrawtransaction "[]" "{\"$address\":$amount}"` - -# Convert to an export tx -exportData=`$cli_source migrate_converttoexport $txraw $target $amount` -exportRaw=`echo $exportData | jq -r .exportTx` -exportPayouts=`echo $exportData | jq -r .payouts` - -# Fund -exportFundedData=`$cli_source fundrawtransaction $exportRaw` -exportFundedTx=`echo $exportFundedData | jq -r .hex` - -# Sign -exportSignedData=`$cli_source signrawtransaction $exportFundedTx` -exportSignedTx=`echo $exportSignedData | jq -r .hex` - -# Send -echo "Sending export tx" -$cli_source sendrawtransaction $exportSignedTx - -read -p "Wait for a notarization to HUSH, and then two more notarizations from the target chain, and then press enter to continue" - -# Create import -importTx=`$cli_source migrate_createimporttransaction $exportSignedTx $payouts` -importTx=`hush-cli migrate_completeimporttransaction $importTx` - -# Send import -hush-cli -ac_name=$target sendrawtransaction $importTx From 981b27575719e32890125f8c698df0e4a57fd710 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 22 Mar 2024 05:10:19 -0700 Subject: [PATCH 028/109] Delete unnecessary stuff --- antispam | 4 ---- test_antispam | 10 ---------- 2 files changed, 14 deletions(-) delete mode 100755 antispam delete mode 100755 test_antispam diff --git a/antispam b/antispam deleted file mode 100755 index 143c8ef32..000000000 --- a/antispam +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo "./src/hush-cli -ac_name=ANTISPAM $@" -./src/hush-cli -ac_name=ANTISPAM "$@" diff --git a/test_antispam b/test_antispam deleted file mode 100755 index 5ccfb4752..000000000 --- a/test_antispam +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -# any CLI args given to this script will be passed along -# example: ./test_antispam -debug=blah -#./src/hushd -ac_name=ANTISPAM -ac_private=1 -ac_blocktime=180 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 $@ - -./src/hushd -ac_name=ANTISPAM -ac_private=1 -ac_blocktime=180 -ac_reward=500000000 -ac_supply=55555 $@ -# to run via the debugger -# type "run" when gdb prompt appears -#gdb --args ./src/hushd -- -ac_algo=randomx -ac_name=ANTISPAM -ac_private=1 -ac_blocktime=180 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 From 89cc8a9ee3cf0a1a6aa715563b14e03d4d5d315a Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 22 Mar 2024 05:11:03 -0700 Subject: [PATCH 029/109] Move toolchain-info.sh to util/ --- toolchain-info.sh => util/toolchain-info.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename toolchain-info.sh => util/toolchain-info.sh (100%) diff --git a/toolchain-info.sh b/util/toolchain-info.sh similarity index 100% rename from toolchain-info.sh rename to util/toolchain-info.sh From f47a7a9d7f193079fab2d688f563510147051e44 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 22 Mar 2024 05:15:58 -0700 Subject: [PATCH 030/109] We no longer need this junk --- DEVELOPER-AGREEMENT | 1 - code_of_conduct.md | 8 -------- 2 files changed, 9 deletions(-) delete mode 100644 DEVELOPER-AGREEMENT delete mode 100644 code_of_conduct.md diff --git a/DEVELOPER-AGREEMENT b/DEVELOPER-AGREEMENT deleted file mode 100644 index 85d69b4f3..000000000 --- a/DEVELOPER-AGREEMENT +++ /dev/null @@ -1 +0,0 @@ -You must agree that Duke Leto is the Elder of jl777. diff --git a/code_of_conduct.md b/code_of_conduct.md deleted file mode 100644 index 3c8ae50a3..000000000 --- a/code_of_conduct.md +++ /dev/null @@ -1,8 +0,0 @@ -# Contributor Code of Conduct - -As contributors and maintainers of this project, and in the interest of -fostering an open and welcoming community, we pledge to respect all people who -contribute through reporting issues, posting feature requests, updating -documentation, submitting pull requests or patches, and other activities. - -Don't be an asshole. From 63901954bedc065de3b031f05df7dd4bc8be1bb9 Mon Sep 17 00:00:00 2001 From: onryo Date: Sun, 31 Mar 2024 23:16:47 +0200 Subject: [PATCH 031/109] move stuff --- CONTRIBUTING.md | 58 ---------------------- DEVELOPING.md | 96 ------------------------------------ INSTALL-BIN.md | 11 ----- INSTALL.md | 122 ---------------------------------------------- OLD_WALLETS.md | 71 --------------------------- SECURITY.md | 90 ---------------------------------- share/genbuild.sh | 48 ------------------ test_randomx | 9 ---- 8 files changed, 505 deletions(-) delete mode 100644 CONTRIBUTING.md delete mode 100644 DEVELOPING.md delete mode 100644 INSTALL-BIN.md delete mode 100644 INSTALL.md delete mode 100644 OLD_WALLETS.md delete mode 100644 SECURITY.md delete mode 100755 share/genbuild.sh delete mode 100755 test_randomx diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 5866ab2e3..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,58 +0,0 @@ - -# Hush Core (hushd) Software Contribution Guidelines - -Thank you for reaching out and trying to make Hush an even better software application and cryptocoin platform. These contribution guidelines shall help you figuring out where you can be helpful and how to easily get started. - -## Table of Contents - -0. [Types of contributions we're looking for](#types-of-contributions-were-looking-for) -0. [Ground rules & expectations](#ground-rules--expectations) -0. [How to contribute](#how-to-contribute) -0. [Style guide](#style-guide) -0. [Setting up your environment](#setting-up-your-environment) -0. [Contribution review process](#contribution-review-process) -0. [Community](#community) - -## Types of contributions we're looking for -There are many ways you can directly contribute to Hush: - -* Debug and test the Hush Core code -* Find and fix bugs -* Improve suboptimal code -* Extend our software -* Perform a secure code review of Hush Full Node and other Hush-related software - -We have a curated list of projects with details about difficulty level and languages involved: https://git.hush.is/hush/projects - -Interested in making a contribution? Read on! - -## Ground rules & expectations - -Before we get started, here are a few things we expect from you (and that you should expect from others): - -* Be kind and thoughtful in your conversations around this project. We all come from different backgrounds and projects, which means we likely have different perspectives on "how free software and open source is done." Try to listen to others rather than convince them that your way is correct. -* Open Source Guides are released with a [Contributor Code of Conduct](./code_of_conduct.md). By participating in this project, you agree to abide by its terms. -* If you open a pull request, please ensure that your contribution does not increase test failures. If there are additional test failures, you will need to address them before we can merge your contribution. -* When adding content, please consider if it is widely valuable. Please don't add references or links to things you or your employer have created as others will do so if they appreciate it. - -## How to contribute - -If you'd like to contribute, start by searching through the [issues](https://git.hush.is/hush/hush3/issues) and [pull requests](https://git.hush.is/hush/hush3/pulls) to see whether someone else has raised a similar idea or question. - -If you don't see your idea listed, and you think it can contribute to Hush, do one of the following: -* **If your contribution is minor,** such as a fixing a typo, open a pull request. -* **If your contribution is major,** such as a new feature or bugfix, start by opening an issue first. That way, other contributors can weigh in on the discussion before you do any work. - -## Style guide - -Don't write shitty code. Do not emulate "jl777 code style" from Komodo, we consider that a bug, not a feature. - -## Setting up your environment - -The Hush Core (hushd) is mainly written in C++ with specific modules written in C. Follow the [Install](https://git.hush.is/hush/hush3/src/branch/master/INSTALL.md) instructions to build hushd from sources. For more informations about the Hush Platform and a full API documentation please visit the official [Hush Developer documentation](https://faq.hush.is/rpc/) - -Other Hush software is written in Rust or Go. We avoid Javascript at all costs. - -## Contribution review process - -We will tell you if we like your stuff. diff --git a/DEVELOPING.md b/DEVELOPING.md deleted file mode 100644 index 1de87fcc6..000000000 --- a/DEVELOPING.md +++ /dev/null @@ -1,96 +0,0 @@ -# Being a Hush Developer - -## Compiling Hush - -Normal compiling is as simple as: - - ./build.sh - -To make it use as many CPU threads as you have: - - ./build.sh -j$(nproc) # assumes linux - ./build.sh -j8 # use a fixed 8 threads, more portable - -This is dangerous! You need about 2GB of RAM per thread, plus all the -other programs and Operating System overhead. A good rule of thumb is: - -Divide how many GBs of RAM you have by 2, subtract one. Use that many jobs. - - -## Dealing with dependency changes - -Let's say you change a dependency and want the compile to notice. If your -change is outside of the main Hush source code, in ./src, simply running -`make` will not notice, and sometimes not even `build.sh`. You can always -do a fresh clone or `make clean`, but that will take a lot of time. Those -methods are actually best for Continuous Integration systems, but to help -reduce the time a developer has to wait, here are some PROTIPs. - - -If you are changing how a dependency is built, you should remove the entire directory like this: - - rm -rf depends/work/build/x86_64-unknown-linux-gnu/wolfssl/ - -The above will delete the entire source code of wolfssl dependency on `x86_64` -but it will keep the tar.gz and you will not need to download it again. If -you are testing a change in URL or SHA256, you will want to force it to download -again: - - rm -rf depends/sources/wolfssl*.tar.gz - -Now when you run `build.sh` again, you will be able to test your changes. - - -## Good Hygiene - -To avoid weird build system issues, it's often good to run: - - make clean - -*before* you switch Git branches. Otherwise, the new branches Makefiles -often are incompatible and `make clean` will be impossible, which can -sometimes introduce weird bugs or make compiling really annoying. -If `make clean` produces a compilation error, you just experienced it. - -## Switching branches - -Switching branches and doing partial compiles in Hush source code -can introduce weird bugs, which are fixed by running `build.sh` again. -Additionally, it's a good idea to run `make clean` before you switch -between branches. - -## Partial compiles - -At any point, you can modify hush source code and then use `make` or `build.sh` -to do a partial compile. The first is faster but the latter is more likely to -work correctly in all circustances. Sometimes partial compiles break weird -build system dependencies, and you must do a `make clean` first, or even -`git clean -fdx` (look up what it means first!) to clean things. The nuclear -option is to re-clone the repo, which sometimes is the least work to fix -the problem. - -Running `make` doesn't understand about dependency changes, such as Rust crates. -A simple C/C++ change can be tested with just `make` but if you change the version -of a dependency or something inside of Rust, you will need `build.sh` . - -## Generating new unix man pages - -Make sure that you have updated all version numbers in hushd and compiled, then -to generate new unix man pages for that version : - - ./util/gen-manpages.sh - -## Generating new debian packages - -After successfully compiling Hush, you can generate a debian package of these binaries with: - - ./util/build-debian-package.sh - -This command will not work on Mac OS X. Currently you cannot generate a Debian package -from operating systems other than Linux. Oh well. - -## Updates to this document - -If you think something else should be in this guide, please send your suggestions! - -Gitea: https://git.hush.is/hush/hush3 diff --git a/INSTALL-BIN.md b/INSTALL-BIN.md deleted file mode 100644 index 38c8e5a7d..000000000 --- a/INSTALL-BIN.md +++ /dev/null @@ -1,11 +0,0 @@ -# Installing Hush binaries - -1. First [download the release](https://git.hush.is/hush/hush3/releases) you want to install. It will have a .deb file extension. - -1. Next install the Debian package (change the version to what you downloaded above): - - `dpkg -i hush-3.8.0-amd64.deb` - -1. If you want to remove it, then run this to uninstall: - - `apt-get remove hush` diff --git a/INSTALL.md b/INSTALL.md deleted file mode 100644 index 1557ed4e4..000000000 --- a/INSTALL.md +++ /dev/null @@ -1,122 +0,0 @@ -# Installing Hush - -Instructions to compile Hush yourself. - -## Swap Space (Optional) -You will need at least 4GB of RAM to build hush from git source, OR you can -enable a swap file. To enable a 4GB swap file on modern Linux distributions: - -```sh -sudo fallocate -l 4G /swapfile -sudo chmod 600 /swapfile -sudo mkswap /swapfile -sudo swapon /swapfile -``` - -## Build on Debian/Ubuntu: - -```sh -# install build dependencies -sudo apt-get install build-essential pkg-config libc6-dev m4 g++-multilib \ - autoconf libtool ncurses-dev unzip git zlib1g-dev wget \ - bsdmainutils automake curl unzip nano libsodium-dev cmake -# clone git repo -git clone https://git.hush.is/hush/hush3 -cd hush3 -# Build -# This uses 3 build processes, you need 2GB of RAM for each. -./build.sh -j3 -``` - -## Build on Arch: - -```sh -# install build dependencies -sudo pacman -S gcc libsodium lib32-zlib unzip wget git python rust curl autoconf cmake -# clone git repo -git clone https://git.hush.is/hush/hush3 -cd hush3 -# Build -# This uses 3 build processes, you need 2GB of RAM for each. -./build.sh -j3 -``` - -## Build on Fedora: - -```sh -# install build dependencies -sudo dnf install make automake gcc gcc-c++ kernel-devel cmake libtool ncurses-devel patch -y -# clone git repo -git clone https://git.hush.is/hush/hush3 -cd hush3 -# Build -# This uses 3 build processes, you need 2GB of RAM for each. -./build.sh -j3 -``` - -### Building On Ubuntu 16.04 and older systems - -Some older compilers may not be able to compile modern code, such as gcc 5.4 which comes with Ubuntu 16.04 by default. Here is how to install gcc 7 on Ubuntu 16.04. Run these commands as root: - -``` -add-apt-repository ppa:ubuntu-toolchain-r/test && \ -apt update && \ -apt-get install -y gcc-7 g++-7 && \ - update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 60 && \ - update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 -``` - -### Build on Mac - -These instructions are a work in progress. Please report issues to https://hush.is/tg_support - -``` -sudo port update -sudo port upgrade outdated -sudo port install qt5 - -# clone git repo -git clone https://git.hush.is/hush/hush3 -cd hush3 -# Build -# This uses 3 build processes, you need 2GB of RAM for each. -./build.sh -j3 -``` - -## Run a HUSH Node - -After you have compiled Hush, then you can run it with the following command: - -```sh -./src/hushd -``` - -## Windows (cross-compiled on Linux) -Get dependencies: -```ssh -sudo apt-get install \ - build-essential pkg-config libc6-dev m4 g++-multilib libdb++-dev \ - autoconf libtool ncurses-dev unzip git zip \ - zlib1g-dev wget bsdmainutils automake mingw-w64 cmake libsodium-dev -``` - -Downloading Git source repo, building and running Hush: - -```sh -# pull -git clone https://git.hush.is/hush/hush3 -cd hush3 -# Build -./util/build-win.sh -j$(nproc) -# Run a HUSH node -./src/hushd -``` - -## ARM Architecture - -Currently, any ARMv7 machine will not be able to build this repo, because the -underlying tech (zcash and the zksnark library) do not support that instruction -set. - -This also means that old RaspberryPi devices will not work, unless they have a -newer ARMv8-based Raspberry Pi. Raspberry Pi 4 and newer are known to work. diff --git a/OLD_WALLETS.md b/OLD_WALLETS.md deleted file mode 100644 index 99f96f46f..000000000 --- a/OLD_WALLETS.md +++ /dev/null @@ -1,71 +0,0 @@ -## Claiming Funds From Old Hush Wallets - -Hush migrated to a new mainnet after Block 500,000 on the old Hush blockchain. -Funds in addresses as of Block 500,000 were transported to our new chain. About -31,000 addresses with at least 0.00000001 HUSH were transported to the new Hush -mainnet. - -To claim funds on the new chain, there are few options. - -### Funds on exchanges - -Firstly, no bueno! Not your keys, not your coins. It's best not to store coins -on exchanges. But in this case, you lucked out! There is nothing to do to claim -new coins if you have coins on an exchange that supports the new Hush chain. -The exchange will follow the instructions from the next section and you will -magically have funds on the new chain. Note that old Hush addresses started -with `t1` and now they begin with `R`. - -To see what an old HUSH v2 address looks like on the new chain, this online tool -can be used: https://dexstats.info/addressconverter.php - -or this command line tool: https://git.hush.is/hush/hush3/src/master/contrib/convert_address.py - - -### Using an old wallet.dat - -Backup your old HUSH wallet.dat, and backup any current wallet.dat that is in - - ~/.komodo/HUSH3/ - -OR - ~/.hush/HUSH3/ - -There is no way to lose funds, as long as you have backups!!! Make sure -to make backups. Do not skip this step. - -Make sure any/all GUI wallets are stopped! Also make sure your old Hush node -and new Hush3 node are stopped: - - cd hush3 - ./src/hush-cli stop - -Do not copy wallets or move wallets while your full node is running! This could -corrupt your wallet! - -Now copy your old Hush wallet.dat to - - ~/.hush/HUSH3/ - -with a command like - - # DO NOT RUN THIS WITHOUT MAKING BACKUPS! - cp ~/.hush/wallet.dat ~/.hush/HUSH3/ - -The reason this works is that both old HUSH and new HUSH are still Bitcoin Protocol -coins, which both use secp256k1 public keys. Now start your HUSH3 node again, -with this special CLI argument that will clear out transactions from your wallet: - - cd hush3 - ./src/hushd -zapwallettxes - -This will cause a full history rescan, which will take some time. Once it's complete, -you can see your funds with this command: - - ./src/hush-cli getwalletinfo - -NOTE: Do not use this wallet except to send funds to a new wallet! - -### Private Keys - -You can also transport funds one address at a time via private keys. diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 97a9a68ce..000000000 --- a/SECURITY.md +++ /dev/null @@ -1,90 +0,0 @@ -## Reporting a Vulnerability - -You can use [Keybase](https://keybase.io/dukeleto) to find secure contact information. - -You can also contact Duke directly via SilentDragon wallet, via "Contact Duke". Encrypted sensitive data -in memo fields in highly encouraged. - -We kindly ask you to not publish or exploit any found vulnerabilities without at least contacting us first. - -Fingerprint: F16219F4C23F91112E9C734A8DFCBF8E5A4D8019 - -``` ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: Keybase OpenPGP v2.0.8 -Comment: https://keybase.io/crypto - -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 -=YSWs ------END PGP PUBLIC KEY BLOCK----- - -``` diff --git a/share/genbuild.sh b/share/genbuild.sh deleted file mode 100755 index 08fb91dc5..000000000 --- a/share/genbuild.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh -# Copyright (c) 2018-2024 The Hush developers -# Distributed under the GPLv3 software license, see the accompanying -# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html -if [ $# -gt 1 ]; then - cd "$2" -fi -if [ $# -gt 0 ]; then - FILE="$1" - shift - if [ -f "$FILE" ]; then - INFO="$(head -n 1 "$FILE")" - fi -else - echo "Usage: $0 " - exit 1 -fi - -DESC="" -SUFFIX="" -if [ -e "$(which git 2>/dev/null)" -a "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then - # clean 'dirty' status of touched files that haven't been modified - git diff >/dev/null 2>/dev/null - - # if latest commit is tagged and not dirty, then override using the tag name - RAWDESC=$(git describe --abbrev=0 2>/dev/null) - if [ "$(git rev-parse HEAD)" = "$(git rev-list -1 $RAWDESC 2>/dev/null)" ]; then - git diff-index --quiet HEAD -- && DESC=$RAWDESC - fi - - # otherwise generate suffix from git, i.e. string like "59887e8-dirty" - SUFFIX=$(git rev-parse --short HEAD) - git diff-index --quiet HEAD -- || SUFFIX="$SUFFIX-dirty" - -fi - -if [ -n "$DESC" ]; then - NEWINFO="#define BUILD_DESC \"$DESC\"" -elif [ -n "$SUFFIX" ]; then - NEWINFO="#define BUILD_SUFFIX $SUFFIX" -else - NEWINFO="// No build information available" -fi - -# only update build.h if necessary -if [ "$INFO" != "$NEWINFO" ]; then - echo "$NEWINFO" >"$FILE" -fi diff --git a/test_randomx b/test_randomx deleted file mode 100755 index bc41bb85c..000000000 --- a/test_randomx +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash - -# any CLI args given to this script will be passed along -# example: ./test_randomx -debug=randomx - ./src/hushd -ac_randomx_interval=10 -ac_randomx_lag=3 -ac_halving=20 -ac_algo=randomx -ac_name=RANDOMX10 -ac_private=1 -ac_blocktime=20 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 $@ - -# to run via the debugger -# type "run" when gdb prompt appears -#gdb --args ./src/hushd -- -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=30 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 From 72c86d8f69ac580095ff0653f7525dc9cc8e0bc0 Mon Sep 17 00:00:00 2001 From: onryo Date: Sun, 31 Mar 2024 23:17:16 +0200 Subject: [PATCH 032/109] move stuff --- doc/CONTRIBUTING.md | 58 +++++++++++++++++++++++++++ doc/DEVELOPING.md | 96 +++++++++++++++++++++++++++++++++++++++++++++ doc/OLD_WALLETS.md | 71 +++++++++++++++++++++++++++++++++ doc/SECURITY.md | 90 ++++++++++++++++++++++++++++++++++++++++++ util/genbuild.sh | 48 +++++++++++++++++++++++ util/test_randomx | 9 +++++ 6 files changed, 372 insertions(+) create mode 100644 doc/CONTRIBUTING.md create mode 100644 doc/DEVELOPING.md create mode 100644 doc/OLD_WALLETS.md create mode 100644 doc/SECURITY.md create mode 100755 util/genbuild.sh create mode 100755 util/test_randomx diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md new file mode 100644 index 000000000..5866ab2e3 --- /dev/null +++ b/doc/CONTRIBUTING.md @@ -0,0 +1,58 @@ + +# Hush Core (hushd) Software Contribution Guidelines + +Thank you for reaching out and trying to make Hush an even better software application and cryptocoin platform. These contribution guidelines shall help you figuring out where you can be helpful and how to easily get started. + +## Table of Contents + +0. [Types of contributions we're looking for](#types-of-contributions-were-looking-for) +0. [Ground rules & expectations](#ground-rules--expectations) +0. [How to contribute](#how-to-contribute) +0. [Style guide](#style-guide) +0. [Setting up your environment](#setting-up-your-environment) +0. [Contribution review process](#contribution-review-process) +0. [Community](#community) + +## Types of contributions we're looking for +There are many ways you can directly contribute to Hush: + +* Debug and test the Hush Core code +* Find and fix bugs +* Improve suboptimal code +* Extend our software +* Perform a secure code review of Hush Full Node and other Hush-related software + +We have a curated list of projects with details about difficulty level and languages involved: https://git.hush.is/hush/projects + +Interested in making a contribution? Read on! + +## Ground rules & expectations + +Before we get started, here are a few things we expect from you (and that you should expect from others): + +* Be kind and thoughtful in your conversations around this project. We all come from different backgrounds and projects, which means we likely have different perspectives on "how free software and open source is done." Try to listen to others rather than convince them that your way is correct. +* Open Source Guides are released with a [Contributor Code of Conduct](./code_of_conduct.md). By participating in this project, you agree to abide by its terms. +* If you open a pull request, please ensure that your contribution does not increase test failures. If there are additional test failures, you will need to address them before we can merge your contribution. +* When adding content, please consider if it is widely valuable. Please don't add references or links to things you or your employer have created as others will do so if they appreciate it. + +## How to contribute + +If you'd like to contribute, start by searching through the [issues](https://git.hush.is/hush/hush3/issues) and [pull requests](https://git.hush.is/hush/hush3/pulls) to see whether someone else has raised a similar idea or question. + +If you don't see your idea listed, and you think it can contribute to Hush, do one of the following: +* **If your contribution is minor,** such as a fixing a typo, open a pull request. +* **If your contribution is major,** such as a new feature or bugfix, start by opening an issue first. That way, other contributors can weigh in on the discussion before you do any work. + +## Style guide + +Don't write shitty code. Do not emulate "jl777 code style" from Komodo, we consider that a bug, not a feature. + +## Setting up your environment + +The Hush Core (hushd) is mainly written in C++ with specific modules written in C. Follow the [Install](https://git.hush.is/hush/hush3/src/branch/master/INSTALL.md) instructions to build hushd from sources. For more informations about the Hush Platform and a full API documentation please visit the official [Hush Developer documentation](https://faq.hush.is/rpc/) + +Other Hush software is written in Rust or Go. We avoid Javascript at all costs. + +## Contribution review process + +We will tell you if we like your stuff. diff --git a/doc/DEVELOPING.md b/doc/DEVELOPING.md new file mode 100644 index 000000000..1de87fcc6 --- /dev/null +++ b/doc/DEVELOPING.md @@ -0,0 +1,96 @@ +# Being a Hush Developer + +## Compiling Hush + +Normal compiling is as simple as: + + ./build.sh + +To make it use as many CPU threads as you have: + + ./build.sh -j$(nproc) # assumes linux + ./build.sh -j8 # use a fixed 8 threads, more portable + +This is dangerous! You need about 2GB of RAM per thread, plus all the +other programs and Operating System overhead. A good rule of thumb is: + +Divide how many GBs of RAM you have by 2, subtract one. Use that many jobs. + + +## Dealing with dependency changes + +Let's say you change a dependency and want the compile to notice. If your +change is outside of the main Hush source code, in ./src, simply running +`make` will not notice, and sometimes not even `build.sh`. You can always +do a fresh clone or `make clean`, but that will take a lot of time. Those +methods are actually best for Continuous Integration systems, but to help +reduce the time a developer has to wait, here are some PROTIPs. + + +If you are changing how a dependency is built, you should remove the entire directory like this: + + rm -rf depends/work/build/x86_64-unknown-linux-gnu/wolfssl/ + +The above will delete the entire source code of wolfssl dependency on `x86_64` +but it will keep the tar.gz and you will not need to download it again. If +you are testing a change in URL or SHA256, you will want to force it to download +again: + + rm -rf depends/sources/wolfssl*.tar.gz + +Now when you run `build.sh` again, you will be able to test your changes. + + +## Good Hygiene + +To avoid weird build system issues, it's often good to run: + + make clean + +*before* you switch Git branches. Otherwise, the new branches Makefiles +often are incompatible and `make clean` will be impossible, which can +sometimes introduce weird bugs or make compiling really annoying. +If `make clean` produces a compilation error, you just experienced it. + +## Switching branches + +Switching branches and doing partial compiles in Hush source code +can introduce weird bugs, which are fixed by running `build.sh` again. +Additionally, it's a good idea to run `make clean` before you switch +between branches. + +## Partial compiles + +At any point, you can modify hush source code and then use `make` or `build.sh` +to do a partial compile. The first is faster but the latter is more likely to +work correctly in all circustances. Sometimes partial compiles break weird +build system dependencies, and you must do a `make clean` first, or even +`git clean -fdx` (look up what it means first!) to clean things. The nuclear +option is to re-clone the repo, which sometimes is the least work to fix +the problem. + +Running `make` doesn't understand about dependency changes, such as Rust crates. +A simple C/C++ change can be tested with just `make` but if you change the version +of a dependency or something inside of Rust, you will need `build.sh` . + +## Generating new unix man pages + +Make sure that you have updated all version numbers in hushd and compiled, then +to generate new unix man pages for that version : + + ./util/gen-manpages.sh + +## Generating new debian packages + +After successfully compiling Hush, you can generate a debian package of these binaries with: + + ./util/build-debian-package.sh + +This command will not work on Mac OS X. Currently you cannot generate a Debian package +from operating systems other than Linux. Oh well. + +## Updates to this document + +If you think something else should be in this guide, please send your suggestions! + +Gitea: https://git.hush.is/hush/hush3 diff --git a/doc/OLD_WALLETS.md b/doc/OLD_WALLETS.md new file mode 100644 index 000000000..99f96f46f --- /dev/null +++ b/doc/OLD_WALLETS.md @@ -0,0 +1,71 @@ +## Claiming Funds From Old Hush Wallets + +Hush migrated to a new mainnet after Block 500,000 on the old Hush blockchain. +Funds in addresses as of Block 500,000 were transported to our new chain. About +31,000 addresses with at least 0.00000001 HUSH were transported to the new Hush +mainnet. + +To claim funds on the new chain, there are few options. + +### Funds on exchanges + +Firstly, no bueno! Not your keys, not your coins. It's best not to store coins +on exchanges. But in this case, you lucked out! There is nothing to do to claim +new coins if you have coins on an exchange that supports the new Hush chain. +The exchange will follow the instructions from the next section and you will +magically have funds on the new chain. Note that old Hush addresses started +with `t1` and now they begin with `R`. + +To see what an old HUSH v2 address looks like on the new chain, this online tool +can be used: https://dexstats.info/addressconverter.php + +or this command line tool: https://git.hush.is/hush/hush3/src/master/contrib/convert_address.py + + +### Using an old wallet.dat + +Backup your old HUSH wallet.dat, and backup any current wallet.dat that is in + + ~/.komodo/HUSH3/ + +OR + ~/.hush/HUSH3/ + +There is no way to lose funds, as long as you have backups!!! Make sure +to make backups. Do not skip this step. + +Make sure any/all GUI wallets are stopped! Also make sure your old Hush node +and new Hush3 node are stopped: + + cd hush3 + ./src/hush-cli stop + +Do not copy wallets or move wallets while your full node is running! This could +corrupt your wallet! + +Now copy your old Hush wallet.dat to + + ~/.hush/HUSH3/ + +with a command like + + # DO NOT RUN THIS WITHOUT MAKING BACKUPS! + cp ~/.hush/wallet.dat ~/.hush/HUSH3/ + +The reason this works is that both old HUSH and new HUSH are still Bitcoin Protocol +coins, which both use secp256k1 public keys. Now start your HUSH3 node again, +with this special CLI argument that will clear out transactions from your wallet: + + cd hush3 + ./src/hushd -zapwallettxes + +This will cause a full history rescan, which will take some time. Once it's complete, +you can see your funds with this command: + + ./src/hush-cli getwalletinfo + +NOTE: Do not use this wallet except to send funds to a new wallet! + +### Private Keys + +You can also transport funds one address at a time via private keys. diff --git a/doc/SECURITY.md b/doc/SECURITY.md new file mode 100644 index 000000000..97a9a68ce --- /dev/null +++ b/doc/SECURITY.md @@ -0,0 +1,90 @@ +## Reporting a Vulnerability + +You can use [Keybase](https://keybase.io/dukeleto) to find secure contact information. + +You can also contact Duke directly via SilentDragon wallet, via "Contact Duke". Encrypted sensitive data +in memo fields in highly encouraged. + +We kindly ask you to not publish or exploit any found vulnerabilities without at least contacting us first. + +Fingerprint: F16219F4C23F91112E9C734A8DFCBF8E5A4D8019 + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: Keybase OpenPGP v2.0.8 +Comment: https://keybase.io/crypto + +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 +=YSWs +-----END PGP PUBLIC KEY BLOCK----- + +``` diff --git a/util/genbuild.sh b/util/genbuild.sh new file mode 100755 index 000000000..08fb91dc5 --- /dev/null +++ b/util/genbuild.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# Copyright (c) 2018-2024 The Hush developers +# Distributed under the GPLv3 software license, see the accompanying +# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html +if [ $# -gt 1 ]; then + cd "$2" +fi +if [ $# -gt 0 ]; then + FILE="$1" + shift + if [ -f "$FILE" ]; then + INFO="$(head -n 1 "$FILE")" + fi +else + echo "Usage: $0 " + exit 1 +fi + +DESC="" +SUFFIX="" +if [ -e "$(which git 2>/dev/null)" -a "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then + # clean 'dirty' status of touched files that haven't been modified + git diff >/dev/null 2>/dev/null + + # if latest commit is tagged and not dirty, then override using the tag name + RAWDESC=$(git describe --abbrev=0 2>/dev/null) + if [ "$(git rev-parse HEAD)" = "$(git rev-list -1 $RAWDESC 2>/dev/null)" ]; then + git diff-index --quiet HEAD -- && DESC=$RAWDESC + fi + + # otherwise generate suffix from git, i.e. string like "59887e8-dirty" + SUFFIX=$(git rev-parse --short HEAD) + git diff-index --quiet HEAD -- || SUFFIX="$SUFFIX-dirty" + +fi + +if [ -n "$DESC" ]; then + NEWINFO="#define BUILD_DESC \"$DESC\"" +elif [ -n "$SUFFIX" ]; then + NEWINFO="#define BUILD_SUFFIX $SUFFIX" +else + NEWINFO="// No build information available" +fi + +# only update build.h if necessary +if [ "$INFO" != "$NEWINFO" ]; then + echo "$NEWINFO" >"$FILE" +fi diff --git a/util/test_randomx b/util/test_randomx new file mode 100755 index 000000000..7afc95931 --- /dev/null +++ b/util/test_randomx @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +# any CLI args given to this script will be passed along +# example: ./test_randomx -debug=randomx + ../src/hushd -ac_randomx_interval=10 -ac_randomx_lag=3 -ac_halving=20 -ac_algo=randomx -ac_name=RANDOMX10 -ac_private=1 -ac_blocktime=20 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 $@ + +# to run via the debugger +# type "run" when gdb prompt appears +#gdb --args ./src/hushd -- -ac_algo=randomx -ac_name=RANDOMX -ac_private=1 -ac_blocktime=30 -ac_reward=500000000 -ac_supply=55555 -gen=1 -genproclimit=1 -testnode=1 From b446ec384c8b5a27670b55454ba79e139c46fbe7 Mon Sep 17 00:00:00 2001 From: onryo Date: Sun, 31 Mar 2024 23:54:32 +0200 Subject: [PATCH 033/109] make sure genbuild.sh builds --- Makefile.am | 2 +- src/Makefile.am | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index ace177a9d..216a1e1d0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -235,7 +235,7 @@ endif dist_bin_SCRIPTS = dist_noinst_SCRIPTS = autogen.sh util/build-debian-package.sh util/build.sh -EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/hush $(DIST_DOCS) $(BIN_CHECKS) +EXTRA_DIST = $(top_srcdir)/util/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests qa/hush $(DIST_DOCS) $(BIN_CHECKS) install-exec-hook: echo "We no longer install fetch-params!" diff --git a/src/Makefile.am b/src/Makefile.am index 846c941fb..d6ed7eb41 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -251,7 +251,7 @@ LIBHUSH_H = \ obj/build.h: FORCE @$(MKDIR_P) $(builddir)/obj - @$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \ + @$(top_srcdir)/util/genbuild.sh $(abs_top_builddir)/src/obj/build.h \ $(abs_top_srcdir) libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h From 06e46f7fcd708351b8b95e408c9cd0764a31157c Mon Sep 17 00:00:00 2001 From: jahway603 Date: Mon, 1 Apr 2024 14:23:18 +0000 Subject: [PATCH 034/109] Fixes to README.md - Updated table on top of README - Changed version specific instructions - Removed SDX link, as that is not Hush - Added back the Raspberry Pi ARM CPU info back under "Install on ARM Architecture" - Changed Supportd and Socials section to use native Markdown instead of HTML - Changed numbered lists to native Markdown format --- README.md | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index b2a165efe..28e83e48b 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ | Introduction | Install | Compile | FAQ | Documentation | | :---: | :---: | :---: | :---: | :---: | | [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#where-can-i-buy-hush) | [Cross compiling Windows binaries](#windows-cross-compiled-on-linux) -| [Why not GitHub?](#banned-by-github) | [Mac - Guideline](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](can-i-mine-with-cpu-or-gpu) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) -| [What is HushChat?](#what-is-hushchat) | [Download for Android](https://storage.hush.land/hush-sda/SilentDragonXAndroid.apk) | [Build on Fedora](#build-on-fedora) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) -| [What is SilentDagon?](#what-is-silentdagon) | [Deb package - Guideline](#installing-hush-binaries) | [Ubuntu 16.04](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#where-can-i-spend-hush) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) +| [Why not GitHub?](#banned-by-github) | [Build on Mac](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](#can-i-mine-with-cpu-or-gpu) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) +| [What is HushChat?](#what-is-hushchat) | [Debian and Ubuntu](#installing-hush-binaries) | [Build on Fedora](#build-on-fedora) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) +| [What is SilentDagon?](#what-is-silentdagon) | [Raspberry Pi](#install-on-arm-architecture) | [Build on Ubuntu 16.04 or older](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#where-can-i-spend-hush) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) @@ -20,6 +20,8 @@ genesis block. We are not a chain fork (copy) of another coin. We are based on Bitcoin code, with sophisticated zero-knowledge mathematics added for privacy. This keeps your transaction metadata private! +# What is this repository? + This software is the Hush node and command-line client. It downloads and stores the entire history of Hush transactions; depending on the speed of your computer and network connection, it will likely take a few hours at least, but @@ -82,9 +84,11 @@ Video Tutorial: https://videos.hush.is/w/oGXff7of3EjmGENtDtYTUX # Install on ARM Architecture -1. [Download the latest debian package](https://git.hush.is/attachments/ade3f699-6a02-4f1d-af25-04d21029be48). -2. Install the Debian package: `sudo dpkg -i hush-3.10.2-aarch64.deb`. -3. Run with: `hushd`. +Use this if you have a Raspberry Pi or similar computer. Currently, any ARMv7 machine will not be able to build this repo, because the underlying tech (zcash and the zksnark library) do not support that instruction set. This also means that old RaspberryPi devices will not work, unless they have a newer ARMv8-based Raspberry Pi. Raspberry Pi 4 and newer are known to work. + +1. [Download the latest Debian package with the AARCH64 designation from the releases page](https://git.hush.is/hush/hush3/releases). +1. Install the Debian package, substituting "VERSION-NUMBER" for the version you have downloaded: `sudo dpkg -i hush-VERSION-NUMBER-aarch64.deb`. +1. Run with: `hushd`. # Building On Ubuntu 16.04 and older systems @@ -116,8 +120,8 @@ cd hush3 # Installing Hush binaries 1. [Download the release](https://git.hush.is/hush/hush3/releases) with a .deb file extension. -2. Install the Debian package: `sudo dpkg -i hush-3.10.2-amd64.deb`. -3. Run with: `hushd`. +1. Install the Debian package, substituting "VERSION-NUMBER" for the version you have downloaded: `sudo dpkg -i hush-VERSION-NUMBER-amd64.deb`. +1. Run with: `hushd`. # Official Explorers @@ -146,10 +150,10 @@ cd hush3 ./src/hushd ``` -# What is SilentDagon? +# What is SilentDragon? -[SilentDragon](https://git.hush.is/hush/SilentDragon) is a desktop wallet for HUSH full node.
-[SilentDragonLite](https://git.hush.is/hush/SilentDragonLite) is a desktop wallet that does not require you to download the full blockchain. +* [SilentDragon](https://git.hush.is/hush/SilentDragon) is a desktop wallet for HUSH full node.
+* [SilentDragonLite](https://git.hush.is/hush/SilentDragonLite) is a desktop wallet that does not require you to download the full blockchain. # What is HushChat? @@ -157,12 +161,12 @@ HushChat is a protocol inspired by the design of Signal Protocol, it uses many o # Can I mine with CPU or GPU? -Only ASIC mining is recommended, HUSH uses Equihash (200,9) algo as Zcash, Horizen or Komodo. +Only ASIC mining is recommended, HUSH uses Equihash (200,9) algo, as does Zcash, Horizen or Komodo. # Where can I buy Hush? 1. https://nonkyc.io/market/HUSH_BTC -2. https://tradeogre.com/exchange/BTC-HUSH +1. https://tradeogre.com/exchange/BTC-HUSH # Where can I spend Hush? @@ -170,10 +174,10 @@ Agora market (in progress) # Support and Socials -* Telegram: https://hush.is/tg -* Matrix: https://hush.is/matrix -* Twitter: https://hush.is/twitter -* PeerTube https://hush.is/peertube +* Telegram: [https://hush.is/tg](https://hush.is/tg) +* Matrix: [https://hush.is/matrix](https://hush.is/matrix) +* Twitter: [https://hush.is/twitter](https://hush.is/twitter) +* PeerTube [https://hush.is/peertube](https://hush.is/peertube) # License From 5e52b706e2e53096c66d56ac827658a4cf5682c4 Mon Sep 17 00:00:00 2001 From: onryo Date: Wed, 3 Apr 2024 18:45:31 +0000 Subject: [PATCH 035/109] Update README --- README.md | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 28e83e48b..671d9237e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ | :---: | :---: | :---: | :---: | :---: | | [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#where-can-i-buy-hush) | [Cross compiling Windows binaries](#windows-cross-compiled-on-linux) | [Why not GitHub?](#banned-by-github) | [Build on Mac](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](#can-i-mine-with-cpu-or-gpu) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) -| [What is HushChat?](#what-is-hushchat) | [Debian and Ubuntu](#installing-hush-binaries) | [Build on Fedora](#build-on-fedora) | [What is DragonX?](https://dragonx.is) | [Earn bounty](#) +| [What is HushChat?](#what-is-hushchat) | [Debian and Ubuntu](#installing-hush-binaries) | [Build on Fedora](#build-on-fedora) | [Claiming funds from old Hush wallets](https://git.hush.is/hush/hush3/src/branch/dev/doc/OLD_WALLETS.md) | [Earn Hush bounty](#earn-hush-bounty) | [What is SilentDagon?](#what-is-silentdagon) | [Raspberry Pi](#install-on-arm-architecture) | [Build on Ubuntu 16.04 or older](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#where-can-i-spend-hush) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) @@ -123,12 +123,6 @@ cd hush3 1. Install the Debian package, substituting "VERSION-NUMBER" for the version you have downloaded: `sudo dpkg -i hush-VERSION-NUMBER-amd64.deb`. 1. Run with: `hushd`. -# Official Explorers - -The links for the Official Hush explorers: - * [explorer.hush.is](https://explorer.hush.is) - * [explorer.hush.land](https://explorer.hush.land) - # Windows (cross-compiled on Linux) Get dependencies: ```ssh @@ -150,10 +144,18 @@ cd hush3 ./src/hushd ``` +# Official Explorers + +The links for the Official Hush explorers: + * [explorer.hush.is](https://explorer.hush.is) + * [explorer.hush.land](https://explorer.hush.land) + # What is SilentDragon? * [SilentDragon](https://git.hush.is/hush/SilentDragon) is a desktop wallet for HUSH full node.
* [SilentDragonLite](https://git.hush.is/hush/SilentDragonLite) is a desktop wallet that does not require you to download the full blockchain. +* [SilentDragonAndroid](https://git.hush.is/hush/SilentDragonAndroid) is a wallet for Android devices. +* [SilentDragonPaper](https://git.hush.is/hush/SilentDragonPaper) is a paper wallet generator that can be run completely offline. # What is HushChat? @@ -170,7 +172,16 @@ Only ASIC mining is recommended, HUSH uses Equihash (200,9) algo, as does Zcash, # Where can I spend Hush? -Agora market (in progress) +AgoraX market (in progress) + +# Earn Hush bounty + +Developers can earn bounty by filtering various bugs and features requests in `Issues->Label`: +- https://git.hush.is/hush/hush3/issues +- https://git.hush.is/hush/SilentDragon/issues +- https://git.hush.is/hush/SilentDragonLite/issues + +![Logo](doc/hush/earnhush.png "Hush Bounty") # Support and Socials @@ -181,4 +192,4 @@ Agora market (in progress) # License -For license information see the file [COPYING](COPYING). +For license information see the file [COPYING](COPYING). \ No newline at end of file From d3b6af2c0ba14269d94caea21c3f2bfa55b56e65 Mon Sep 17 00:00:00 2001 From: onryo Date: Wed, 3 Apr 2024 18:46:12 +0000 Subject: [PATCH 036/109] Add image --- doc/hush/earnhush.png | Bin 0 -> 48139 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/hush/earnhush.png diff --git a/doc/hush/earnhush.png b/doc/hush/earnhush.png new file mode 100644 index 0000000000000000000000000000000000000000..9437fb259585ed089b16f6e5ce4f09a472529a78 GIT binary patch literal 48139 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 literal 0 HcmV?d00001 From f8481013a7649fbc4e2c18fb0b228f4d331c6ba8 Mon Sep 17 00:00:00 2001 From: onryo Date: Wed, 3 Apr 2024 19:01:21 +0000 Subject: [PATCH 037/109] Update README --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 671d9237e..ddfff9388 100644 --- a/README.md +++ b/README.md @@ -163,7 +163,7 @@ HushChat is a protocol inspired by the design of Signal Protocol, it uses many o # Can I mine with CPU or GPU? -Only ASIC mining is recommended, HUSH uses Equihash (200,9) algo, as does Zcash, Horizen or Komodo. +Hush cannot be efficiently mined with CPU or GPU, only ASIC mining is recommended. HUSH uses Equihash (200,9) algo, as does Zcash, Horizen or Komodo. # Where can I buy Hush? @@ -176,7 +176,7 @@ AgoraX market (in progress) # Earn Hush bounty -Developers can earn bounty by filtering various bugs and features requests in `Issues->Label`: +Developers can earn bounty by fixing bugs or solving feature requests listed in `Issues->Label`: - https://git.hush.is/hush/hush3/issues - https://git.hush.is/hush/SilentDragon/issues - https://git.hush.is/hush/SilentDragonLite/issues From 0d0a7e95875ef00e9c861c98528b8398188c9240 Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 18 Apr 2024 06:41:25 -0700 Subject: [PATCH 038/109] Fix 'writing 1 byte into region of size 0' --- src/sietch.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sietch.h b/src/sietch.h index fe6352072..4194e19eb 100644 --- a/src/sietch.h +++ b/src/sietch.h @@ -29,8 +29,8 @@ SendManyRecipient newSietchRecipient(string zaddr) { // Sietch zouts have random data in their memos so they are indistinguishable from // encrypted data being stored in the memo field char hex[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; - // memo field is 512 bytes or 1024 hex chars - char str[1024]; + // memo field is 512 bytes or 1024 hex chars plus a null byte + char str[1025]; for(int i=0;i<1024;i++) { str[i] = hex[GetRandInt(16)]; } From 18e3364bc260e19cf2705c670d6902ee83375248 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 19 Apr 2024 07:32:12 -0400 Subject: [PATCH 039/109] Make docs for addnode/disconnectnode correct for HACs #376 --- src/rpc/net.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp index de61c3eff..096f7b558 100644 --- a/src/rpc/net.cpp +++ b/src/rpc/net.cpp @@ -31,6 +31,8 @@ #include #include +extern uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT; + using namespace std; using namespace hush; @@ -276,8 +278,8 @@ UniValue addnode(const UniValue& params, bool fHelp, const CPubKey& mypk) "1. \"node\" (string, required) The node (see getpeerinfo for nodes)\n" "2. \"command\" (string, required) 'add' to add a node to the list, 'remove' to remove a node from the list, 'onetry' to try a connection to the node once\n" "\nExamples:\n" - + HelpExampleCli("addnode", "\"192.168.0.6:18030\" \"onetry\"") - + HelpExampleRpc("addnode", "\"192.168.0.6:18030\", \"onetry\"") + + HelpExampleCli("addnode", "\"192.168.0.6:" + to_string(ASSETCHAINS_P2PPORT) + "\" \"onetry\"") + + HelpExampleRpc("addnode", "\"192.168.0.6:" + to_string(ASSETCHAINS_P2PPORT) + "\", \"onetry\"") ); string strNode = params[0].get_str(); @@ -320,8 +322,8 @@ UniValue disconnectnode(const UniValue& params, bool fHelp, const CPubKey& mypk) "\nArguments:\n" "1. \"node\" (string, required) The node (see getpeerinfo for nodes)\n" "\nExamples:\n" - + HelpExampleCli("disconnectnode", "\"192.168.0.6:18030\"") - + HelpExampleRpc("disconnectnode", "\"192.168.0.6:18030\"") + + HelpExampleCli("disconnectnode", "\"192.168.0.6:" + to_string(ASSETCHAINS_P2PPORT) + "\"") + + HelpExampleRpc("disconnectnode", "\"192.168.0.6:" + to_string(ASSETCHAINS_P2PPORT) + "\"") ); CNode* pNode = FindNode(params[0].get_str()); From e42b53403623b002e6a422fb423710998fc9e17e Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 6 May 2024 08:29:24 -0700 Subject: [PATCH 040/109] Keybase is no longer used --- doc/SECURITY.md | 90 ------------------------------------------------- 1 file changed, 90 deletions(-) delete mode 100644 doc/SECURITY.md diff --git a/doc/SECURITY.md b/doc/SECURITY.md deleted file mode 100644 index 97a9a68ce..000000000 --- a/doc/SECURITY.md +++ /dev/null @@ -1,90 +0,0 @@ -## Reporting a Vulnerability - -You can use [Keybase](https://keybase.io/dukeleto) to find secure contact information. - -You can also contact Duke directly via SilentDragon wallet, via "Contact Duke". Encrypted sensitive data -in memo fields in highly encouraged. - -We kindly ask you to not publish or exploit any found vulnerabilities without at least contacting us first. - -Fingerprint: F16219F4C23F91112E9C734A8DFCBF8E5A4D8019 - -``` ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: Keybase OpenPGP v2.0.8 -Comment: https://keybase.io/crypto - -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 -=YSWs ------END PGP PUBLIC KEY BLOCK----- - -``` From ba86196409eec6f741e69638c19358a7cc47b293 Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 6 May 2024 08:33:20 -0700 Subject: [PATCH 041/109] This document is bitrotten and not useful --- doc/bips.md | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 doc/bips.md diff --git a/doc/bips.md b/doc/bips.md deleted file mode 100644 index 35ef70c65..000000000 --- a/doc/bips.md +++ /dev/null @@ -1,4 +0,0 @@ -BIPs that are implemented by Hush (up-to-date up to **v1.1.0**): - -* Numerous historic BIPs were present in **v1.0.0** at launch; see [the protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf) for details. -* [`BIP 111`](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki): `NODE_BLOOM` service bit added, but only enforced for peer versions `>=170004` as of **v1.1.0** ([PR #2814](https://github.com/zcash/zcash/pull/2814)). From 5273f4be9eb4eaa3e886342357898b4b866dff68 Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 6 May 2024 08:42:26 -0700 Subject: [PATCH 042/109] Give Hush mainnet a dedicated minimum protocol version #345 Hush and DragonX do not have the same requirements for which nodes they should talk to because they don't necessarily have consensus changes at the same time. For instance, 3.10.0 was a consensus change for Hush but not DragonX. This commit changes things so that Hush nodes will no longer talk to old nodes that are not consensus compatible but leaves things the same for DragonX mainnet, which has never had a consensus change. --- src/main.cpp | 6 +++--- src/version.h | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bfcd3c538..475c1546b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -106,7 +106,7 @@ size_t nCoinCacheUsage = 5000 * 300; uint64_t nPruneTarget = 0; // If the tip is older than this (in seconds), the node is considered to be in initial block download. int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE; -bool ishush3 = strncmp(SMART_CHAIN_SYMBOL, "HUSH3",5) == 0 ? true : false; +const bool ishush3 = strncmp(SMART_CHAIN_SYMBOL, "HUSH3",5) == 0 ? true : false; int32_t nFirstHalvingHeight = 340000; unsigned int expiryDelta = DEFAULT_TX_EXPIRY_DELTA; @@ -6886,7 +6886,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n"); return true; } - auto p2pdebug = GetArg("-p2pdebug",0); + const bool p2pdebug = GetArg("-p2pdebug",0); if(p2pdebug) fprintf(stderr,"%s: netmsg: %s from %s\n", __func__, strCommand.c_str(), pfrom->addr.ToString().c_str() ); @@ -6913,7 +6913,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, CAddress addrFrom; uint64_t nNonce = 1; int nVersion; // use temporary for version, don't set version number until validated as connected - int minVersion = MIN_PEER_PROTO_VERSION; + const int minVersion = ishush3 ? MIN_HUSH_PEER_PROTO_VERSION : MIN_PEER_PROTO_VERSION; vRecv >> nVersion >> pfrom->nServices >> nTime >> addrMe; if (nVersion == 10300) nVersion = 300; diff --git a/src/version.h b/src/version.h index 74a686bd1..d4641ec5a 100644 --- a/src/version.h +++ b/src/version.h @@ -26,8 +26,13 @@ static const int PROTOCOL_VERSION = 1987426; static const int INIT_PROTO_VERSION = 209; //! In this version, 'getheaders' was introduced. static const int GETHEADERS_VERSION = 31800; -//! disconnect from peers older than this proto version + +//! disconnect from peers older than this proto version (HUSH mainnet) +static const int MIN_HUSH_PEER_PROTO_VERSION = 1987426; + +//! disconnect from peers older than this proto version (HACs) static const int MIN_PEER_PROTO_VERSION = 1987420; + //! nTime field added to CAddress, starting with this version; //! if possible, avoid requesting addresses nodes older than this static const int CADDR_TIME_VERSION = 31402; From 535d78595ea322845eb5e5e4639abe75c362ef8d Mon Sep 17 00:00:00 2001 From: jahway603 Date: Thu, 9 May 2024 09:43:56 -0400 Subject: [PATCH 043/109] Updated Debian package changelog to resolve Issue #405 --- contrib/debian/changelog | 402 +++++++++++++++++++++++++++++++++++++++ contrib/debian/control | 4 +- 2 files changed, 405 insertions(+), 1 deletion(-) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 08ed69a2c..942b50ea5 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,405 @@ +hush (3.10.2) stable; urgency=medium + + * Upgraded WolfSSL to 5.2.0 on Linux and Mac: #380. + * Upgraded to 4.8.1 on Windows because newer versions do not compile on it + * Only Hush and DragonX will automatically connect to various seed nodes + * Updated i2p seed node: 8c8b6e88f0. + * Removed unused code. + * Fixed boost download link: 323d2134a1. + * Hush and DragonX full nodes take up a lot less memory and binaries are now + smaller due to the cryptoconditions removal, which means syncing, rescanning + and compiling is faster: #381. + * Removed CLI options related to CryptoConditions: -ac_cc, -ac_cclib, + -ac_ccenable, and -ac_ccactivate + * Large page support enabled, which can lead to a 1-2% speed increase in + mining depending on RAM and CPU. + * Various small optimizations such as making some variables static or const + and removing unnecessary conditionals. + * Mining now starts faster because instead of only using 2 threads to prepare + data needed to mine, it now uses all physical cores: 1b5422eb2d. + * RandomX mining now takes slightly less memory. + * Added script for scanning DragonX nodes: 0679468f60. + * More details about p2p encryption: ccc86839b9, a358acab0b, 4ed576a7e2. + * Added Fedora install process: #384. + * Added Arch install process: #393. + * Implemented better error messages: f64c10baa9, f71f8124c3. + * Improved hush_scanner and seed node contrib file: 16dd3aef74. + * Removed unused Makefile: #291. + + -- Hush Core Tue, 05 Mar 2024 18:29:47 -0700 + +hush (3.10.1) stable; urgency=medium + + * Fixed bug causing "payment to wrong pubkey" error when syncing a new node + * Faster syncing of Hush and DragonX full nodes + * Slightly less memory usage in each Equihash/RandomX mining thread + * Fixed compiling issues related to RandomX v1.2.1 + * Improved RPC docs for getblocktemplate + * Removed the getdeprecationinfo RPC + + -- Hush Core Tue, 02 Jan 2024 15:16:40 -0700 + +hush (3.10.0) stable; urgency=medium + + * Hush and all Hush Smart Chains now use less RAM #283 + * Hush and all Hush Smart Chains now make it harder and more expensive for + an attacker to send shielded spam. This raises the cost in CPU 14d3ae1785 + and transaction fees 2308db22ee for Denial-of-Service attacks. + * Bug fix: Fixed hush-cli stop not stopping the node during the "Building + Witnesses" rescan phase #330 + * Bug fix: Fixed abortrescan couldn't be used when node starting up (RPC + warmup) and where it could not abort the rescan if it was in the "Building + Witnesses" phase #331 + * Bug fix: Fixed z_mergetoaddress where docs said you could use ANY_ZADDR + but you couldn't 7eb9d75b94 + * New RPC: z_listunspent now returns the text representation of a memo in + memoStr key + * New RPC: z_getstats which reports data about numer of shielded inputs (zins) + and shielded outputs (zouts) in transactions. 96ae2d61ca + * CVE fix: Upgraded curl to 8.4.0 #325 to fix CVE-2023-38545 + * New documentation about using CJDNS with Hush + * Implemented decentralized Devtax + * Updated to latest RandomX v1.2.1 which includes mining optimizations + * Fixed RandomX mining memory leak and crash #324 + * Fixed quoting bugs with dragonx-cli script + + -- Hush Core Tue, 28 Nov 2023 16:47:59 -0700 + +hush (3.9.4) stable; urgency=medium + + * Hush and DragonX nodes will now sync much faster + * DragonX now has checkpoints for faster & better chain security #243 #304 + * Updated to the latest RandomX code + * Rate limiting for the processing of incoming address messages for + increased security. #272 + * Removed unused function CWalletTx::GetRequestCount #273 + * Removed mapRequest tracking that only affects Qt display. #274 + * Randomized message processing peer order for increased privacy. #275 + * Removed BIP35 mempool p2p message for increased privacy. #284 + * Added additional community seed nodes + * Use custom jobs param when compiling boost for faster compile times #288 + * Now builds with gcc13 thanks to testing from jahway #293 + * Bug fix: -stratumallowip works with CIDR and netmask ranges again for solo + miners #270 + * Bug fix: Detect missing autoreconf in build.sh #289 + * Bug fix: Various assertions removed from BIP155 changes #297 + + -- Hush Core Sun, 02 Jul 2023 17:47:39 -0700 + +hush (3.9.3) stable; urgency=medium + + * Difficulty bug affecting DRAGONX has been fixed + * RandomX mining hashrate increase of about 60X + * Optimized memory usage of RandomX mining + * Adds Tor v3 and i2p support (BIP155 also known as addrv2) + * New RPC: getrescaninfo - Says if node is rescanning with additional info + about progress + * New RPC: abortrescan - Stops rescanning if node is currently rescanning + + -- Hush Core Mon, 13 Feb 2023 15:02:48 -0700 + +hush (3.9.2) stable; urgency=medium + + * This release adds RandomX support in Hush Smart Chains (HSCs) + * A new feature called "zsweep" has been added, which defaults to disabled. + * Expired transactions will not be relayed & nodes doing so no longer banned + * Fix a rare coredump when nodes have many unconfirmed or expired transactions + * New RPC: getblockmerkletree, which shows full Merkle Tree for a block height + * New RPC: z_consolidationstatus will show config + stats about consolidation + * New RPC: z_anonsettxdelta : Returns delta (difference) in the anonset for a + given txid. + * New RPC: z_anonsetblockdelta : Returns delta (difference) in the anonset for + a given block. + * getrawtransaction RPC now returns a "size" key with the size in bytes of a + transaction + * sendmany RPC will now reject transactions that send to t-addresses + immediately, instead of them being rejected in mempool + * New contrib script: contrib/gen-zaddrs.pl - Generates z-addresses in bulk + * New contrib script: contrib/sdl_checkpoints.pl - Generate SDL checkpoints + using getblockmerkletree + * ZeroMQ support has been removed from Hush + + -- Hush Core Tue, 27 Sep 2022 14:08:15 -0700 + +hush (3.9.1) stable; urgency=medium + + * Fix RPC deadlocks, which caused the RPC interface to hang + * The listbanned RPC now returns a new key time_remaining which tells how many + seconds are remaining in the ban + * The rescan RPC now works correctly when given a height. This can be used to + do a partial rescan from a custom height, without restarting the node. + * Minimum disk space required for running full node increased to 1GB from 50MB + * Dockerfile has been updated + + -- Hush Core Tue, 25 Jan 2022 06:39:18 -0700 + +hush (3.9.0) stable; urgency=medium + + * hushd, hush-cli, and hush-tx are now true binaries instead of shell scripts + * New official location for full node data is ~/.hush and existing full + nodes will continue to use the legacy ~/.komodo directory + * Hush full nodes will now attempt to talk to two more nodes by default: + node1.hush.land and node2.hush.land + * New RPC: listaddresses - Show all taddrs in this wallet.dat + * New RPC: rpcinfo - Shows stats about RPC internals + * These RPCs can now be run during RPC warmup: listaddresses, z_exportwallet, + signmessage, decoderawtransaction, and getnetworkinfo + * New doc/hushd.service to use hushd with systemd + * Optimize zaddrs by only building block's witness caches involving our wallet + connection on + * When RPC connection fails hush-cli now tells you which port it was trying to + connect to + * Calculation of HSC "network magic" has changed as of 3.9.0 + * New Stratum API so you can Solo mine with your full node, enable it + with -stratum=1 + * hush-smart-chain script now installed in Debian packages + * Now compatible on SBC (Single Board Computer) like PineBook, Rock64, + Raspberry Pi, etc. + + -- Hush Core Thu, 21 Oct 2021 04:44:44 -0700 + +hush (3.8.0) stable; urgency=medium + + * New Sietch feature: Randomized change output location + * New Sietch feature: Sietch-ified z_shieldcoinbase + * Implemented patch to fix how the longest chain is calculated, which could + prevent mining pools from making payout transactions + * plz_stop feature implemented for when RPC interface is not functioning + (such as filled by deadlocks) making it impossible to shut it down correctly + * -keepnotewitnesscache prevents Sapling Note Witness cache from being + deleted from wallet.dat on shutdown. + * -rescanheight can be used with -keepnotewitnesscache and -rescan to do a + partial rescan of history and avoid completely rebuilding the Witness Cache + * -zindex data is now stored on disk in the new zindex.dat file + * getpeerinfo now returns a relaytxes key which says if a remote node is + relaying transactions to your node + * Improvements to the RPC help documentation + + -- Hush Core Sat, 10 Jul 2021 06:53:52 -0700 + +hush (3.7.1) stable; urgency=medium + + * More internals code related to unused Sprout transactions removed, making Hush run and compile faster and use less memory. + * Now provides a more useful error message when a user attempts to make a transaction before the node is synced. + * z_sendmany RPC docs now show an example of a z2z transaction + * Deprecated alert p2p message is no longer processed and nodes using it will be banned + * try-before-evict ported from BTC core, which helps protect again Eclipse and Sybil Attacks + * "Feeler connections" ported from BTC, another technique which makes Eclipse and Sybil Attacks harder and more expensive + * New RPC: z_getbalances returns a list of all zaddrs with non-zero balance. + * "Automagic z_sendmany" makes the RPC easier to use and also improves privacy + + -- Hush Core Wed, 21 Apr 2021 14:18:12 -0700 + +hush (3.7.0) stable; urgency=medium + + * Improved TLS error reporting + * Fix bug relating to calculating difficulty + + -- Hush Core Thu, 01 Apr 2021 02:53:21 -0700 + +hush (3.6.3) stable; urgency=medium + + * Maintenance release, which is mostly the same as 3.6.2 but it fixes some + issues in Debian+Arch packages and binaries not able to find asmap.dat + + -- Hush Core Fri, 26 Feb 2021 14:42:59 -0700 + +hush (3.6.2) stable; urgency=medium + + * Autonomous System Map (asmap) bucketing by default + * New CLI flag -asmap is on by default, and can be turned off with -asmap=0 + * debug.log is now shrunk to 15MB instead of 100MB + * The max size of debug.log can now be controlled via -maxdebugfilesize + + -- Hush Core Sun, 21 Feb 2021 14:21:31 -0700 + +hush (3.6.1) stable; urgency=medium + + * WolfSSL upgraded to 4.6.0 and side-channel resistance enabled via + ECC_TIMING_RESISTANT + * Hush full nodes now exclusively communivate via P2P messages with TLS1.3 as + the option -tls=only has become default and cannot be turned off + * Improved error-handling and logging of TLS connections + * getpeerinfo now shows 3 new keys for each peer + * New developer documentation in DEVELOPING.md + * -whitelist and -whitelistaddress now called -allowlist and -allowlistaddress + * Minimum protocol version is now 1987420 + + -- Hush Core Wed, 27 Jan 2021 19:42:38 -0700 + +hush (3.6.0) stable; urgency=medium + + * Fixes sync issues near block 340k caused by blocktime halving bug + * New official domain https://hush.is reflected everywhere + * New Hush DPoW Notaries replace KMD Notaries + * Increased in-memory UTXO cache db by 100MB (25%) to increase performance of + initial syncing + * Prevent Delayed-Proof-of-Work attack from Komodo Notaries + * New -dpow-start-height CLI flag used to reject all DPoW transactions (and + attacks) up to a certain height, as general defense against any DPoW attacks + * More secure + private TLS 1.3 implementation + * Switched to WolfSSL 4.5.0 instead of OpenSSL + * Nodes randomly choose between GCM-SHA384 and CHACHA20-POLY1305-SHA256 when + making connections to other nodes. + * Faster release binaries with -03 + * Optimized and hardened memory pool code + * getblocktemplate RPC now provides better error reporting about whether there + are no peers or if it's not in sync + * Removed more Sprout code, which is tightly mixed into deep internals, + resulting in increased compile speed and reduced memory overhead + * New P2P protocol version. Peers only talk to 3.5.x nodes and newer + + -- Hush Core Fri, 18 Dec 2020 02:07:35 -0700 + +hush (3.5.2) stable; urgency=medium + + * Re-released hushd under the GNU Public License Version 3 (GPLv3) + * The z_listreceivedaddress RPC now returns a memoStr key for the utf8 string + representation of a shielded memo, if it exists + + -- Hush Core Thu, 22 Oct 2020 16:16:19 -0700 + +hush (3.5.1) stable; urgency=medium + + * TLS 1.3 support ported from ZEN with custom Hush tweaks + * All nodes will try using encrypted TLS connections with peers by default + * getinfo now returns a tls_connections key in JSON data + * -tls=only can be used to only use encrypted connections + * ASN map filtering of peers, ported from KMD + BTC Core + + -- Hush Core Tue, 06 Oct 2020 07:43:47 -0700 + +hush (3.5.0) stable; urgency=medium + + * Finalize changes to support new Blocktime of 75 seconds + * Updated the Hush Halving schedule, i.e. Emission Curve, for the next ~120 + years (the next 30 halvings) + * The Hush Block Reward will go to zero at Block 50740000 in the year 2140 + * Greatly improved Sietch implementation with "amnesia zdust" addresses + * Sietch zdust outputs now always contain "random/encrypted" data + * -wallet CLI option supports wallets outside the datadir and relative paths + * -txsend CLI option ported from Zcash upstream to help with i2p integration + * Improved aarch64 support for Raspberry Pi 4 + * Removed the proton optional dependency + * GetAdjustedTime() replaced with GetTime() + * Correctly keep track of ChainShieldedSpends for z_getchaintxstats + * timeoffset key in getpeerinfo and getnetworkifo deprecated and now always 0 + * More remnants of dead Sprout/JoinSplit code removed + * Added a z_listreceivedaddress RPC which internals never had RPC access + * Fixes and improvements to deletetx=1, still considered experimental + * Checkpoints updated up to Block 300K + + -- Hush Core Wed, 23 Sep 2020 22:03:17 -0700 + +hush (3.4.0) stable; urgency=medium + + * New Season 4 KMD Notary pubkeys have been updated (as of Block 245555) + * ENFORCED PRIVACY (aka z2z) merged & set to take effect at Block 340000 + * All remaining internals code relating to Sprout has been deleted + * The new Subatomic Dapp has been ported from KMD, which supports z2z swaps + * Implemented own mirror of Boost in our build system + * Merged various fixes relating to CryptoConditions from KMD upstream + * Optimizations and bug fixes to Sapling Consolidation + * Fixes CVE-2018–20586 from KMD (which ported it from BTC) + * Added z_getnotescount RPC + * Updated ccache dependency to 3.7.9 + * Ported the -txexpirynotify CLI option from ZEC upstream + * Added rescan RPC for wallets to initiate a rescan without importing a key + and without restarting + + -- Hush Core Thu, 18 Jun 2020 09:35:31 -0700 + +hush (3.3.2) stable; urgency=medium + + * ARMv8 support added + * Sapling Zaddr Consolidation, which reduces the size of wallets and + increases performance for service providers + * New CLI options added to hushd - refer to release notes for specifics + * New RPCs: z_getinfo, z_listsentbyaddress, z_listreceivedbyaddress, + getalldata + * New -opretmintxfee ported from KMD upstream + * ThreadNotifyWallets refactor ported from ZEC upstream + * Deletion of libsnark internal library + * Shielded index (zindex) statistics of coinbase and organic + transactions/payments corrected + * Updated dependencies: curl, boost, native_ccache, openssl, and proton + * Removed more Sprout-only RPC's (zcbenchmark, zcrawjoinsplit) and code + * Various improvements to RPC documentation + + -- Hush Core Wed, 08 Apr 2020 12:21:44 -0700 + +hush (3.3.1) stable; urgency=medium + + * Maintenance release fixes a non-consensus bug in sendmany which prevented + it from working. + + -- Hush Core Sat, 18 Jan 2020 09:16:21 -0700 + +hush (3.3.0) stable; urgency=medium + + * New "Sietch" functionality protects against new metadata attacks + * New ability to launch Hush Smart Chains with a single command + * Fixes CVE-2019-18936 in UniValue dependency: bitcoin/bitcoin#17742 + * New experimental Shielded Index (-zindex) which keeps track of many stats + seen via the new getchaintxstats RPC including shielded payments, + anonymity set size and many other things. + * New experimental z_listnullifiers RPC which returns Sapling nullifiers. + * Updates + fixes to all CryptoConditions smart contracts from KMD 0.5.0 + * Updates NSPV/Superlite code from KMD 0.5.0 + * Update 3rd party KMD Notary node pubkeys moving Hush from a run-time + fork of KMD to a source code fork + * Enable creation of z-only (like Pirate) Hush Smart Chains via -ac_private=1 + * Removed more Sprout-specific code, making hushd faster & easier to maintain + * Allow hush-cli stop to be run during RPC warmup + * Update to libsodium 1.0.18 + * Removes VerusHash from the source code + * Removed large amounts of Proof-of-Stake-related code not used in Hush + * Ported AFL fuzzing features to our build system from Zcash + * Changed max debug.log size from 10MB to 100MB + * Added checkpoints for every 1000th Hush block + * New contrib/checkpoints.pl script to automatically generate checkpoints + * Deleted QT wallet code inherited from Bitcoin, which was old and broken + * z_exportwallet can now optionally not rescan + * New SHA256 SSE4 routines ported from KMD (which was ported from BTC), + enabled with --enable-experimental-asm=yes + * debug.log no longer containts a log2_stake column + * New --hardfork-height CLI option for devs+notaries for testing + + -- Hush Core Fri, 03 Jan 2020 10:13:17 -0700 + +hush (3.2.3) stable; urgency=medium + + * Update build dependencies to use own forks of libgmp, libsnark, libsodium + * New RPC keys are now returned in getblockchaininfo : longestchain and + notarized which are now used by the SDL backend + + -- Hush Core Sat, 14 Dec 2019 04:59:59 -0700 + +hush (3.2.2) stable; urgency=medium + + * Fix CVE-2017-18350 from ZEC and windows portability fix from KMD upstream + * Removed some Sprout code + * Fixed some rare edge case bugs in Sapling param finding code + * New detection of "corrupt" Sapling params (invalid sizes) to helps give + users the correct error in a GUI wallet (corrupt versus no params) + * Fix Sapling params to support Mac DMGs being installed to /Applications + + -- Hush Core Tue, 26 Nov 2019 12:17:17 -0700 + +hush (3.2.1) stable; urgency=medium + + * Fixes issues discovered in Hush 3.2.0 + * New DEVELOPING.md document for advice working on Hush codebase + * Updated to latest upstream SuperLite/nSPV features + * Merged in latest cryptocondition/Antara module updates from KMD upstream + * Fixed a bug that corrupts the block index on second startup + * Improved code to locate installed Sapling params, since Debian packages + install them into /usr/share/hush + * Updated DNSSeeds + * Fix fees associated with transactions in the mempool with fSkipExpiry=0 + + -- Hush Core Tue, 29 Oct 2019 22:34:35 -0700 + hush (3.2.0) stable; urgency=medium * 3.2.0.1 release. diff --git a/contrib/debian/control b/contrib/debian/control index 8526dd6b4..ec0ceb293 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -13,4 +13,6 @@ Vcs-Browser: https://git.hush.is/hush/hush3 Package: hush Architecture: amd64 arm64 Depends: ${shlibs:Depends} -Description: Hush cryptocoin full node. Speak And Transact Freely. Hush inherits from Bitcoin Protocol and Zcash Protocol and is focused on private communications. +Description: Hush cryptocoin full node. + Speak And Transact Freely with Hush, which inherits from Bitcoin Protocol and + Zcash Protocol and is focused on private communications. From 41e7d602c8a1952b8c530e90fd4fff9632dc9075 Mon Sep 17 00:00:00 2001 From: jahway603 Date: Thu, 9 May 2024 10:12:44 -0400 Subject: [PATCH 044/109] Added changelog to Debian package building script --- contrib/debian/changelog | 17 +++++++++++------ contrib/debian/control | 2 +- util/build-debian-package.sh | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 942b50ea5..bd257bf83 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -179,12 +179,17 @@ hush (3.8.0) stable; urgency=medium hush (3.7.1) stable; urgency=medium - * More internals code related to unused Sprout transactions removed, making Hush run and compile faster and use less memory. - * Now provides a more useful error message when a user attempts to make a transaction before the node is synced. + * Removed more internals code related to unused Sprout transactions, making + Hush run and compile faster and use less memory. + * Now provides more useful error message when user attempts to make + transaction before the node is synced. * z_sendmany RPC docs now show an example of a z2z transaction - * Deprecated alert p2p message is no longer processed and nodes using it will be banned - * try-before-evict ported from BTC core, which helps protect again Eclipse and Sybil Attacks - * "Feeler connections" ported from BTC, another technique which makes Eclipse and Sybil Attacks harder and more expensive + * Deprecated alert p2p message no longer processed & nodes using it will be + banned + * try-before-evict ported from BTC core to help protect against Eclipse and + Sybil Attacks + * "Feeler connections" ported from BTC, which is another technique to make + Eclipse and Sybil Attacks harder and more expensive * New RPC: z_getbalances returns a list of all zaddrs with non-zero balance. * "Automagic z_sendmany" makes the RPC easier to use and also improves privacy @@ -300,7 +305,7 @@ hush (3.4.0) stable; urgency=medium * Implemented own mirror of Boost in our build system * Merged various fixes relating to CryptoConditions from KMD upstream * Optimizations and bug fixes to Sapling Consolidation - * Fixes CVE-2018–20586 from KMD (which ported it from BTC) + * Fixes CVE-2018-20586 from KMD (which ported it from BTC) * Added z_getnotescount RPC * Updated ccache dependency to 3.7.9 * Ported the -txexpirynotify CLI option from ZEC upstream diff --git a/contrib/debian/control b/contrib/debian/control index ec0ceb293..7d1e6e2a2 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -13,6 +13,6 @@ Vcs-Browser: https://git.hush.is/hush/hush3 Package: hush Architecture: amd64 arm64 Depends: ${shlibs:Depends} -Description: Hush cryptocoin full node. +Description: Cryptocoin full node for Hush Speak And Transact Freely with Hush, which inherits from Bitcoin Protocol and Zcash Protocol and is focused on private communications. diff --git a/util/build-debian-package.sh b/util/build-debian-package.sh index 6fa0f1f7e..24bd4fe19 100755 --- a/util/build-debian-package.sh +++ b/util/build-debian-package.sh @@ -78,7 +78,7 @@ cp $SRC_PATH/src/dragonx-cli $DEB_BIN cp $SRC_PATH/src/dragonxd $DEB_BIN cp $SRC_PATH/src/hush-arrakis-chain $DEB_BIN -#cp $SRC_DEB/changelog $DEB_DOC/changelog.Debian +cp $SRC_DEB/changelog $DEB_DOC cp $SRC_DEB/copyright $DEB_DOC cp -r $SRC_DEB/examples $DEB_DOC # Copy manpages From 006804d6caed2144b5081cef2c7572eec0607ea7 Mon Sep 17 00:00:00 2001 From: jahway603 Date: Thu, 9 May 2024 10:43:34 -0400 Subject: [PATCH 045/109] Updated urgency tags in contrib/debian/changelog --- contrib/debian/changelog | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index bd257bf83..98a9e8946 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -39,7 +39,7 @@ hush (3.10.1) stable; urgency=medium -- Hush Core Tue, 02 Jan 2024 15:16:40 -0700 -hush (3.10.0) stable; urgency=medium +hush (3.10.0) stable; urgency=high * Hush and all Hush Smart Chains now use less RAM #283 * Hush and all Hush Smart Chains now make it harder and more expensive for @@ -133,7 +133,7 @@ hush (3.9.1) stable; urgency=medium -- Hush Core Tue, 25 Jan 2022 06:39:18 -0700 -hush (3.9.0) stable; urgency=medium +hush (3.9.0) stable; urgency=high * hushd, hush-cli, and hush-tx are now true binaries instead of shell scripts * New official location for full node data is ~/.hush and existing full @@ -202,7 +202,7 @@ hush (3.7.0) stable; urgency=medium -- Hush Core Thu, 01 Apr 2021 02:53:21 -0700 -hush (3.6.3) stable; urgency=medium +hush (3.6.3) stable; urgency=low * Maintenance release, which is mostly the same as 3.6.2 but it fixes some issues in Debian+Arch packages and binaries not able to find asmap.dat @@ -218,7 +218,7 @@ hush (3.6.2) stable; urgency=medium -- Hush Core Sun, 21 Feb 2021 14:21:31 -0700 -hush (3.6.1) stable; urgency=medium +hush (3.6.1) stable; urgency=low * WolfSSL upgraded to 4.6.0 and side-channel resistance enabled via ECC_TIMING_RESISTANT @@ -256,7 +256,7 @@ hush (3.6.0) stable; urgency=medium -- Hush Core Fri, 18 Dec 2020 02:07:35 -0700 -hush (3.5.2) stable; urgency=medium +hush (3.5.2) stable; urgency=low * Re-released hushd under the GNU Public License Version 3 (GPLv3) * The z_listreceivedaddress RPC now returns a memoStr key for the utf8 string @@ -264,7 +264,7 @@ hush (3.5.2) stable; urgency=medium -- Hush Core Thu, 22 Oct 2020 16:16:19 -0700 -hush (3.5.1) stable; urgency=medium +hush (3.5.1) stable; urgency=low * TLS 1.3 support ported from ZEN with custom Hush tweaks * All nodes will try using encrypted TLS connections with peers by default @@ -296,7 +296,7 @@ hush (3.5.0) stable; urgency=medium -- Hush Core Wed, 23 Sep 2020 22:03:17 -0700 -hush (3.4.0) stable; urgency=medium +hush (3.4.0) stable; urgency=high * New Season 4 KMD Notary pubkeys have been updated (as of Block 245555) * ENFORCED PRIVACY (aka z2z) merged & set to take effect at Block 340000 @@ -333,14 +333,14 @@ hush (3.3.2) stable; urgency=medium -- Hush Core Wed, 08 Apr 2020 12:21:44 -0700 -hush (3.3.1) stable; urgency=medium +hush (3.3.1) stable; urgency=low * Maintenance release fixes a non-consensus bug in sendmany which prevented it from working. -- Hush Core Sat, 18 Jan 2020 09:16:21 -0700 -hush (3.3.0) stable; urgency=medium +hush (3.3.0) stable; urgency=high * New "Sietch" functionality protects against new metadata attacks * New ability to launch Hush Smart Chains with a single command @@ -372,7 +372,7 @@ hush (3.3.0) stable; urgency=medium -- Hush Core Fri, 03 Jan 2020 10:13:17 -0700 -hush (3.2.3) stable; urgency=medium +hush (3.2.3) stable; urgency=low * Update build dependencies to use own forks of libgmp, libsnark, libsodium * New RPC keys are now returned in getblockchaininfo : longestchain and @@ -391,7 +391,7 @@ hush (3.2.2) stable; urgency=medium -- Hush Core Tue, 26 Nov 2019 12:17:17 -0700 -hush (3.2.1) stable; urgency=medium +hush (3.2.1) stable; urgency=low * Fixes issues discovered in Hush 3.2.0 * New DEVELOPING.md document for advice working on Hush codebase From 07054fc3468fe7e691466d010464bf5415252e1c Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 16 May 2024 19:07:29 +0200 Subject: [PATCH 046/109] Prevent communication between HUSH3 nodes and DRAGONX nodes in both directions --- src/hush_utils.h | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/hush_utils.h b/src/hush_utils.h index 7da3fc452..5f2760b5c 100644 --- a/src/hush_utils.h +++ b/src/hush_utils.h @@ -1796,29 +1796,40 @@ void hush_args(char *argv0) fprintf(stderr,".oO Starting %s Full Node (Extreme Privacy!) with genproc=%d notary=%d\n",name.c_str(),HUSH_MININGTHREADS, IS_HUSH_NOTARY); vector HUSH_nodes = {}; + vector DRAGONX_nodes = {}; // Only HUSH3 and DRAGONX connect to these by default, other HACs must opt-in via -connect/-addnode const bool ishush3 = strncmp(name.c_str(), "HUSH3",5) == 0 ? true : false; const bool isdragonx = strncmp(name.c_str(), "DRAGONX",7) == 0 ? true : false; LogPrint("net", "%s: ishush3=%d isdragonx=%d\n", __func__, ishush3, isdragonx); - if (ishush3 || isdragonx) { + if (ishush3) { HUSH_nodes = {"node1.hush.is","node2.hush.is","node3.hush.is", "node4.hush.is","node5.hush.is","node6.hush.is", "node7.hush.is","node8.hush.is","node1.hush.land", - "node2.hush.land", "node3.hush.land", - "node4.hush.land", "node5.hush.land"}; + "node2.hush.land","node3.hush.land","node4.hush.land", + "node5.hush.land","node6.hush.land","node7.hush.land"}; + } + + if (isdragonx) { + DRAGONX_nodes = {"node1.dragonx.is","node2.dragonx.is","node3.dragonx.is", + "node4.dragonx.is","node5.dragonx.is","node6.dragonx.is"}; } vector more_nodes = mapMultiArgs["-addnode"]; if (more_nodes.size() > 0) { fprintf(stderr,"%s: Adding %lu more nodes via custom -addnode arguments\n", __func__, more_nodes.size() ); } - // Add default HUSH nodes after custom addnodes, if applicable + // Add default HUSH and DRAGONX nodes after custom addnodes, if applicable if(HUSH_nodes.size() > 0) { - LogPrint("net", "%s: adding %d hostname-based nodes\n", __func__, HUSH_nodes.size() ); + LogPrint("net", "%s: adding %d HUSH3 hostname-based nodes\n", __func__, HUSH_nodes.size() ); more_nodes.insert( more_nodes.end(), HUSH_nodes.begin(), HUSH_nodes.end() ); } + if(DRAGONX_nodes.size() > 0) { + LogPrint("net", "%s: adding %d DRAGONX hostname-based nodes\n", __func__, DRAGONX_nodes.size() ); + more_nodes.insert( more_nodes.end(), DRAGONX_nodes.begin(), DRAGONX_nodes.end() ); + } + mapMultiArgs["-addnode"] = more_nodes; HUSH_STOPAT = GetArg("-stopat",0); MAX_REORG_LENGTH = GetArg("-maxreorg",MAX_REORG_LENGTH); From 46c738500fd8bf596eb4b7a068384b3c74a7d8b3 Mon Sep 17 00:00:00 2001 From: Duke Date: Sat, 8 Jun 2024 07:16:37 -0700 Subject: [PATCH 047/109] Fix bug when using build-mac.sh and remove cryptoconditions from mac+win build scripts --- build.sh | 8 +++++--- util/build-mac.sh | 7 ------- util/build-win.sh | 7 ------- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/build.sh b/build.sh index d73119a08..e94518e70 100755 --- a/build.sh +++ b/build.sh @@ -9,11 +9,13 @@ set -eu -o pipefail if [[ "$OSTYPE" == "linux-gnu"* ]]; then ./util/build.sh --disable-tests $@ elif [[ "$OSTYPE" == "darwin"* ]]; then - ./util/build-mac.sh --disable-tests $@ + # code from ./util/build.sh needs to be ported to support --disable-tests + #./util/build-mac.sh --disable-tests $@ + ./util/build-mac.sh $@ elif [[ "$OSTYPE" == "msys"* ]]; then ./util/build-win.sh --disable-tests $@ -#elif [[ "$OSTYPE" == "freebsd"* ]]; then - # placeholder +elif [[ "$OSTYPE" == "freebsd"* ]]; then + ./util/build.sh --disable-tests $@ else echo "Unable to detect your OS. What are you using?" fi diff --git a/util/build-mac.sh b/util/build-mac.sh index 745a72238..89a638b89 100755 --- a/util/build-mac.sh +++ b/util/build-mac.sh @@ -46,13 +46,6 @@ PREFIX="$(pwd)/depends/$TRIPLET" make "$@" -C ./depends/ V=1 NO_QT=1 -#BUILD CCLIB -WD=$PWD -cd src/cc -echo $PWD -./makecustom -cd $WD - # Build RandomX cd src/RandomX if [ -d "build" ] diff --git a/util/build-win.sh b/util/build-win.sh index f3498530e..3b87128ac 100755 --- a/util/build-win.sh +++ b/util/build-win.sh @@ -18,13 +18,6 @@ cd .. CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site CXXFLAGS="-DPTW32_STATIC_LIB -DCURL_STATICLIB -fopenmp -pthread" ./configure --prefix="${PREFIX}" --host=x86_64-w64-mingw32 --enable-static --disable-shared -# Build CryptoConditions stuff -WD=$PWD -cd src/cc -echo $PWD -./makecustom -cd $WD - # Build RandomX cd src/RandomX if [ -d "build" ] From 8a997b04f33bb3383d5af0cc3a8bcafe90bbe319 Mon Sep 17 00:00:00 2001 From: Duke Date: Sun, 9 Jun 2024 11:22:21 -0400 Subject: [PATCH 048/109] Check if the node should stop when processing thread interrupts and exceptions, in hopes of stopping before a deadlock occurs --- src/util.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/util.h b/src/util.h index eeef26f86..ccc3f0486 100644 --- a/src/util.h +++ b/src/util.h @@ -47,6 +47,8 @@ static const bool DEFAULT_LOGTIMEMICROS = false; static const bool DEFAULT_LOGIPS = false; static const bool DEFAULT_LOGTIMESTAMPS = true; +void CheckIfWeShouldStop(); + /** Signals for translation. */ class CTranslationInterface { @@ -272,14 +274,17 @@ template void TraceThread(const char* name, Callable func) catch (const boost::thread_interrupted&) { LogPrintf("%s thread interrupt\n", name); + CheckIfWeShouldStop(); throw; } catch (const std::exception& e) { PrintExceptionContinue(&e, name); + CheckIfWeShouldStop(); throw; } catch (...) { PrintExceptionContinue(NULL, name); + CheckIfWeShouldStop(); throw; } } From 4f928513c10889e574e26117089e2ded498eef74 Mon Sep 17 00:00:00 2001 From: Duke Date: Sun, 9 Jun 2024 11:25:37 -0400 Subject: [PATCH 049/109] Revert "Fix bug when using build-mac.sh and remove cryptoconditions from mac+win build scripts" This reverts commit 46c738500fd8bf596eb4b7a068384b3c74a7d8b3. --- build.sh | 8 +++----- util/build-mac.sh | 7 +++++++ util/build-win.sh | 7 +++++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/build.sh b/build.sh index e94518e70..d73119a08 100755 --- a/build.sh +++ b/build.sh @@ -9,13 +9,11 @@ set -eu -o pipefail if [[ "$OSTYPE" == "linux-gnu"* ]]; then ./util/build.sh --disable-tests $@ elif [[ "$OSTYPE" == "darwin"* ]]; then - # code from ./util/build.sh needs to be ported to support --disable-tests - #./util/build-mac.sh --disable-tests $@ - ./util/build-mac.sh $@ + ./util/build-mac.sh --disable-tests $@ elif [[ "$OSTYPE" == "msys"* ]]; then ./util/build-win.sh --disable-tests $@ -elif [[ "$OSTYPE" == "freebsd"* ]]; then - ./util/build.sh --disable-tests $@ +#elif [[ "$OSTYPE" == "freebsd"* ]]; then + # placeholder else echo "Unable to detect your OS. What are you using?" fi diff --git a/util/build-mac.sh b/util/build-mac.sh index 89a638b89..745a72238 100755 --- a/util/build-mac.sh +++ b/util/build-mac.sh @@ -46,6 +46,13 @@ PREFIX="$(pwd)/depends/$TRIPLET" make "$@" -C ./depends/ V=1 NO_QT=1 +#BUILD CCLIB +WD=$PWD +cd src/cc +echo $PWD +./makecustom +cd $WD + # Build RandomX cd src/RandomX if [ -d "build" ] diff --git a/util/build-win.sh b/util/build-win.sh index 3b87128ac..f3498530e 100755 --- a/util/build-win.sh +++ b/util/build-win.sh @@ -18,6 +18,13 @@ cd .. CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site CXXFLAGS="-DPTW32_STATIC_LIB -DCURL_STATICLIB -fopenmp -pthread" ./configure --prefix="${PREFIX}" --host=x86_64-w64-mingw32 --enable-static --disable-shared +# Build CryptoConditions stuff +WD=$PWD +cd src/cc +echo $PWD +./makecustom +cd $WD + # Build RandomX cd src/RandomX if [ -d "build" ] From 8d2380a31d9a6e150ee3be56149d1d262fccaf18 Mon Sep 17 00:00:00 2001 From: Duke Date: Sun, 9 Jun 2024 12:10:59 -0400 Subject: [PATCH 050/109] Record value of DEBUG_LOCKORDER in debug.log --- src/init.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/init.cpp b/src/init.cpp index 91aeda565..7458d4847 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1085,6 +1085,13 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); LogPrintf("Hush version %s (%s)\n", FormatFullVersion()); + +#ifdef DEBUG_LOCKORDER + LogPrintf("DEBUG_LOCKORDER enabled\n"); +#else + LogPrintf("DEBUG_LOCKORDER disabled\n"); +#endif + // when specifying an explicit binding address, you want to listen on it // even when -connect or -proxy is specified if (mapArgs.count("-bind")) { From 379e419aad3edfa7eee2e41a48934e4220a52e61 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 12 Jun 2024 13:12:20 -0400 Subject: [PATCH 051/109] Convenience script for doing a debug build while autodecting correct OS build script --- debug-build.sh | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100755 debug-build.sh diff --git a/debug-build.sh b/debug-build.sh new file mode 100755 index 000000000..a18818b20 --- /dev/null +++ b/debug-build.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Copyright (c) 2016-2024 The Hush developers +# Distributed under the GPLv3 software license, see the accompanying +# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html + +set -eu -o pipefail + +echo "Compiling a debug build with --enable-debug..." + +# run correct build script for detected OS +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + CONFIGURE_FLAGS=--enable-debug ./util/build.sh --disable-tests $@ +elif [[ "$OSTYPE" == "darwin"* ]]; then + # code from ./util/build.sh needs to be ported to support --disable-tests + #./util/build-mac.sh --disable-tests $@ + CONFIGURE_FLAGS=--enable-debug ./util/build-mac.sh $@ +elif [[ "$OSTYPE" == "msys"* ]]; then + CONFIGURE_FLAGS=--enable-debug ./util/build-win.sh --disable-tests $@ +elif [[ "$OSTYPE" == "freebsd"* ]]; then + CONFIGURE_FLAGS=--enable-debug ./util/build.sh --disable-tests $@ +else + echo "Unable to detect your OS. What are you using?" +fi From 7f274892241c63ebdea4569410e00e2843a13570 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 7 Aug 2024 07:11:13 -0700 Subject: [PATCH 052/109] Speed up compile by disabling libevent sample code, originally https://github.com/bitcoin/bitcoin/commit/f38c05104848db63ad0df85c24eea466dbff8536 --- depends/packages/libevent.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/packages/libevent.mk b/depends/packages/libevent.mk index b3881738a..8b01061fc 100644 --- a/depends/packages/libevent.mk +++ b/depends/packages/libevent.mk @@ -13,7 +13,7 @@ define $(package)_preprocess_cmds endef define $(package)_set_vars - $(package)_config_opts=--disable-shared --disable-openssl --disable-libevent-regress + $(package)_config_opts=--disable-shared --disable-openssl --disable-libevent-regress --disable-samples $(package)_config_opts_release=--disable-debug-mode $(package)_config_opts_linux=--with-pic endef From 1e892f23e6c33984225ee6006ba5391eef73fc90 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 7 Aug 2024 07:18:08 -0700 Subject: [PATCH 053/109] Remove dead nVersion code This is very old code from the early days of Bitcoin, our mainnets have never used peer protocol version. Originally https://github.com/zcash/zcash/commit/150ab1d34c98096d28d4f7951a02516232f40ae2 --- src/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 475c1546b..ae5e27916 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6915,8 +6915,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int nVersion; // use temporary for version, don't set version number until validated as connected const int minVersion = ishush3 ? MIN_HUSH_PEER_PROTO_VERSION : MIN_PEER_PROTO_VERSION; vRecv >> nVersion >> pfrom->nServices >> nTime >> addrMe; - if (nVersion == 10300) - nVersion = 300; + if (nVersion < minVersion) { // disconnect from peers older than this proto version From 25f2ccb30ebf30e552feec43434475e84306e1ab Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 11 Sep 2024 14:53:33 -0400 Subject: [PATCH 054/109] Document exactly what the RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY address is and how it is derived --- src/hush_bitcoind.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/hush_bitcoind.h b/src/hush_bitcoind.h index 59de08708..de16d72ae 100644 --- a/src/hush_bitcoind.h +++ b/src/hush_bitcoind.h @@ -24,6 +24,9 @@ #include "cc/CCinclude.h" #include "sietch.h" +// this is the address for pubkey = 0x000000000000000000000000000000000 (33 bytes) +#define BURN_ADDRESS "RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY" + int32_t hush_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); int32_t hush_findnotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); int32_t hush_voutupdate(bool fJustCheck,int32_t *isratificationp,int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value,int32_t notarized,uint64_t signedmask,uint32_t timestamp); @@ -1798,15 +1801,15 @@ int64_t hush_newcoins(int64_t *zfundsp,int32_t nHeight,CBlock *pblock) { for (j=0; j %s\n",dstr(tx.vout[j].nValue),CBitcoinAddress(address).ToString().c_str()); } script = (uint8_t *)&tx.vout[j].scriptPubKey[0]; if ( script == 0 || script[0] != 0x6a ) { - if ( ExtractDestination(tx.vout[j].scriptPubKey,address) != 0 && strcmp("RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY",CBitcoinAddress(address).ToString().c_str()) != 0 ) + if ( ExtractDestination(tx.vout[j].scriptPubKey,address) != 0 && strcmp(BURN_ADDRESS,CBitcoinAddress(address).ToString().c_str()) != 0 ) voutsum += tx.vout[j].nValue; } } From aa75877cd6a6d414f6f7e1f673be4f403a01abea Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 11 Sep 2024 23:31:44 -0400 Subject: [PATCH 055/109] Print stacktrace when asserting a lock is held --- src/sync.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/sync.cpp b/src/sync.cpp index 4b7dd899b..632c5562e 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -25,6 +25,10 @@ #include #include +#include /* backtrace, backtrace_symbols_fd */ +#include /* STDOUT_FILENO */ + + #ifdef DEBUG_LOCKCONTENTION void PrintLockContention(const char* pszName, const char* pszFile, int nLine) { @@ -177,12 +181,23 @@ std::string LocksHeld() return result; } +void print_stacktrace(void) { + size_t size; + enum Constexpr { MAX_SIZE = 1024 }; + void *array[MAX_SIZE]; + size = backtrace(array, MAX_SIZE); + backtrace_symbols_fd(array, size, STDERR_FILENO); +} + void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs) { BOOST_FOREACH (const PAIRTYPE(void*, CLockLocation) & i, *lockstack) if (i.first == cs) return; fprintf(stderr, "Assertion failed: lock %s not held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld().c_str()); + + print_stacktrace(); + abort(); } From b71d95bdd4f8a4de29433c4ea5865c3ee4ff3467 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 11 Sep 2024 23:32:46 -0400 Subject: [PATCH 056/109] Delete disabled code --- src/miner.cpp | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 9a4b17842..356374207 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -756,44 +756,6 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 } pblock->nSolution.clear(); pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]); - /* - if ( SMART_CHAIN_SYMBOL[0] == 0 && IS_HUSH_NOTARY != 0 && My_notaryid >= 0 ) - { - uint32_t r; CScript opret; void **ptr=0; - - CMutableTransaction txNotary = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); - if ( pblock->nTime < pindexPrev->nTime+60 ) - pblock->nTime = pindexPrev->nTime + 60; - if ( gpucount < 33 ) - { - uint8_t tmpbuffer[40]; uint32_t r; int32_t n=0; uint256 randvals; - memcpy(&tmpbuffer[n],&My_notaryid,sizeof(My_notaryid)), n += sizeof(My_notaryid); - memcpy(&tmpbuffer[n],&Mining_height,sizeof(Mining_height)), n += sizeof(Mining_height); - memcpy(&tmpbuffer[n],&pblock->hashPrevBlock,sizeof(pblock->hashPrevBlock)), n += sizeof(pblock->hashPrevBlock); - vcalc_sha256(0,(uint8_t *)&randvals,tmpbuffer,n); - memcpy(&r,&randvals,sizeof(r)); - pblock->nTime += (r % (33 - gpucount)*(33 - gpucount)); - } - if ( hush_notaryvin(txNotary,NOTARY_PUBKEY33,ptr) > 0 ) - { - CAmount txfees = 5000; - pblock->vtx.push_back(txNotary); - pblocktemplate->vTxFees.push_back(txfees); - pblocktemplate->vTxSigOps.push_back(GetLegacySigOpCount(txNotary)); - nFees += txfees; - pblocktemplate->vTxFees[0] = -nFees; - //*(uint64_t *)(&pblock->vtx[0].vout[0].nValue) += txfees; - //fprintf(stderr,"added notaryvin\n"); - } else { - fprintf(stderr,"error adding notaryvin, need to create 0.0001 utxos\n"); - if ( SMART_CHAIN_SYMBOL[0] == 0 || (SMART_CHAIN_SYMBOL[0] != 0 && !isStake) ) - { - LEAVE_CRITICAL_SECTION(cs_main); - LEAVE_CRITICAL_SECTION(mempool.cs); - } - return(0); - } - } else */ if ( ASSETCHAINS_CC == 0 && pindexPrev != 0 && ASSETCHAINS_STAKED == 0 && (SMART_CHAIN_SYMBOL[0] != 0 || IS_HUSH_NOTARY == 0 || My_notaryid < 0) ) { From b4e083ae56873a33cce38fdfd87874397b5eead0 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 11 Sep 2024 23:59:57 -0400 Subject: [PATCH 057/109] Add what seems to be missing locks in mining code --- src/miner.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/miner.cpp b/src/miner.cpp index 356374207..436a59262 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -893,6 +893,7 @@ static bool ProcessBlockFound(CBlock* pblock) // Found a solution { + LOCK(cs_main); if (pblock->hashPrevBlock != chainActive.LastTip()->GetBlockHash()) { uint256 hash; int32_t i; @@ -1136,7 +1137,11 @@ void static RandomXMiner() // Create new block unsigned int nTransactionsUpdatedLast = mempool.GetTransactionsUpdated(); - CBlockIndex* pindexPrev = chainActive.LastTip(); + CBlockIndex* pindexPrev; + { + LOCK(cs_main); + pindexPrev = chainActive.LastTip(); + } // If we don't have a valid chain tip to work from, wait and try again. if (pindexPrev == nullptr) { From ed86f2dd1da370fe2dbf7db475afc41b218cbc5f Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 00:21:56 -0400 Subject: [PATCH 058/109] Sleep for 200us before each ActivateBestChainStep call This should lower the main thread's likelihood to immediately reacquire cs_main after dropping it, which should help ThreadNotifyWallets and the RPC methods to acquire cs_main more quickly. Ported from ZEC commit e2cd1b761fe556bc6d61849346902c3611530307 --- src/main.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index ae5e27916..169124334 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,6 +33,7 @@ #include "net.h" #include "netmessagemaker.h" #include "pow.h" +#include "time.h" #include "script/interpreter.h" #include "txdb.h" #include "txmempool.h" @@ -4333,7 +4334,15 @@ bool ActivateBestChain(bool fSkipdpow, CValidationState &state, CBlock *pblock) CBlockIndex *pindexMostWork = NULL; const CChainParams& chainParams = Params(); do { - boost::this_thread::interruption_point(); + // Sleep briefly to allow other threads a chance at grabbing cs_main if + // we are connecting a long chain of blocks and would otherwise hold the + // lock almost continuously. This helps + // the internal wallet, if it is enabled, to keep up with the connected + // blocks, reducing the overall time until the node becomes usable. + // + // This is defined to be an interruption point. + // + boost::this_thread::sleep_for(boost::chrono::microseconds(200)); if (ShutdownRequested()) break; From c9470f29b78b88d4016a43149708d529d9dd310d Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 12 Sep 2024 15:19:01 +0200 Subject: [PATCH 059/109] Update checkpoints for Hush and DragonX --- src/chainparams.cpp | 697 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 690 insertions(+), 7 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 02ab894a9..ddec52f71 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -1994,10 +1994,231 @@ void *chainparams_commandline() { (1692000, uint256S("0x000000010ddd71bc79e292a7c6e3c70565ba211f918eb1751e905301acbcd517")) (1693000, uint256S("0x000000010dc70ae11c82e34000cd7d1a344bbf9fcf6344b3ac04f3173d1703d0")) (1694000, uint256S("0x000000027e5cb8c5bfd613100811708f7d180b994650d3ca6900a81683d50fa0")) - (1695000, uint256S("0x000000014325867b388dc34843b695536eb9185c6782707f1c86edf0b5b89e9d")) - ,(int64_t) 1709499985, // time of last checkpointed block - (int64_t) 2539894, // total txs - (double) 1801 // txs in the last day before block 1695599 + (1695000, uint256S("0x000000014325867b388dc34843b695536eb9185c6782707f1c86edf0b5b89e9d")) + // Generated via util/checkpoints.pl by onryo + (1696000, uint256S("0x000000046385ad70b5c3de53eb6634836758eea4f7ee7b81a889f7201e27337d")) + (1697000, uint256S("0x00000004bbef43e1ad19298dea05462d23e7de9482dfda72c8643cc5a73e3356")) + (1698000, uint256S("0x00000000c7fa58a2b8420904097a9e02bc0b7aa9bc9e427ae1eed1908a150b0c")) + (1699000, uint256S("0x000000020ddfe5a4caddee1261f1b30faebfa220184e7e8fafee520d1bdc2452")) + (1700000, uint256S("0x00000001c8a7698cd8594605fed3594a8a576535d94f3440ba69b2ec01706e2f")) + (1701000, uint256S("0x00000002e9daa2a596858bd331b6320b4aaa34124ace3dbabbd50502b58eaf6b")) + (1702000, uint256S("0x000000015cfe670509475a9e7f693b5169e02d54bf459342f511b39ae05d8ce5")) + (1703000, uint256S("0x0000000045def8972d1adc0828618f4186f89b2d550a03f099ea4a72a78161ec")) + (1704000, uint256S("0x00000001a4a313c141aa9f20bb8011d00315bcfab4784a711d1529851ca6f218")) + (1705000, uint256S("0x00000000fc4bbd9320b7b0f3329c52e604655d872caa8ef9a64eb34e44b42795")) + (1706000, uint256S("0x0000000614e676936e086495ec9b3b1688a7d6030d032c3da7c241a417e6dbe7")) + (1707000, uint256S("0x000000005ebf5e6aa923dd2a4367d7747126343356710659b4b105b5557b26be")) + (1708000, uint256S("0x00000002dbfbbfa81aba34a934a69c7d6db57ace02eb20b7f1be183d8bc67b49")) + (1709000, uint256S("0x0000000481ece1648cf7bc906f3f912d7900170d6adda615c6e9402e7aae7a71")) + (1710000, uint256S("0x00000003b17400949f2f3c82142eca4c6590e863f657b64a3dbe7f79fccf38d0")) + (1711000, uint256S("0x00000004f87d08b7c4d366db9cdcef3f427842525b6e61c42338474821a22e03")) + (1712000, uint256S("0x000000049b7af8b5b5f9eb3f29d37e312abde898ad5b4891cd7d0ca1a7ee6c9d")) + (1713000, uint256S("0x00000002fe801673cf970df547fc14c4028b7c77abc185cb733b1726d8bcbce1")) + (1714000, uint256S("0x00000004a088e6e02bdc2cd157915dc13f4ff56eaaa0e7e79b796b5b3c72a89b")) + (1715000, uint256S("0x00000002e2d5aab4a2e23b05498896ff1e8c509e66ea5018c5a48135d65f54cf")) + (1716000, uint256S("0x0000000050ffc3dc91d5a8514d461b81515ebd67e22e2e3588436a8a10d7b768")) + (1717000, uint256S("0x000000017bfd0ce4a25cb8d4bae41b7e8d007854c1a66ea2fc015259b1e76174")) + (1718000, uint256S("0x00000000c8746b2e580c8e50800000d65fe893b974c2b0825521d916a87f6bbc")) + (1719000, uint256S("0x00000004647c20d62c9d15237d1f7d7996fd09c3e3a22f85439d1437eba50ca3")) + (1720000, uint256S("0x0000000087327d6b4e0644f9160915ad6f9e61497569d6223f079f7e9745674e")) + (1721000, uint256S("0x0000000201320ec96d6595875bcea2e431521b5035a766b072152af196004dbf")) + (1722000, uint256S("0x00000003d96adf0598c8a738e69fab7e578be011a49725b7dc77ebec29641dfd")) + (1723000, uint256S("0x0000000539537247a56af803ea95566ed5460664b0ba7958304f8f12ddbd657d")) + (1724000, uint256S("0x00000000e00f083cf90a695e5d6027a64e6cf3d42597a56871d17f310d7d3136")) + (1725000, uint256S("0x00000000888dbc0aa88e5d36cea342943d0271d5bfb15feebf637a838088aad3")) + (1726000, uint256S("0x000000059b3c06996b53335953a921cbd3edd0987b95a6be1987517afa58fd6c")) + (1727000, uint256S("0x000000048b539eaf18dfb0a9ce0b69a089fb4bdc80f4248dfd3e0270a2de6ce2")) + (1728000, uint256S("0x00000001055b9a98fd452d8b15f32990319ee5cb55fcd2463f382f1c9ba3ef4a")) + (1729000, uint256S("0x00000004237a1b7205a35ff9d2ed13198899f6995a0c9080ea1e0fce6b119d6c")) + (1730000, uint256S("0x00000002db2eb82e6309c174228bd0ef365f39ae75774123ff97ac729ce2ed42")) + (1731000, uint256S("0x000000066d71c51b95c32540d10fb0a7dcd8057ed812fb3bad4e084926b6cfe4")) + (1732000, uint256S("0x0000000285bd425dd245cc5456f6e0df4d1fc35531019297f3ba4a39e1c0f20e")) + (1733000, uint256S("0x000000020aad80909c26fc60918260f1096897a67d8d0e8e712b5374c04df5f4")) + (1734000, uint256S("0x0000000454b30f370832f4f09dcb3cc25347185fe78e6a20f53bc929c1f4f046")) + (1735000, uint256S("0x000000031c20ff6b27992f7df1c7852100844745d06eb081f1d7a14f8945a15d")) + (1736000, uint256S("0x00000002e8bb07f38fea576318d0daf090360d1c80f22d2c4d5acb18167985d3")) + (1737000, uint256S("0x000000029a2c942f291b050a17474b6fc0302911cbe28200133e6da35e282e7d")) + (1738000, uint256S("0x00000000ff3a12e66d4ea8356848f5fd4ee9a08793d182c91e805a0783dbb0ad")) + (1739000, uint256S("0x0000000141c88040bb76f4a44c42df8bab23b7d8cc582cdd76e7ce76ef56cb1d")) + (1740000, uint256S("0x00000001b8e797ff118fa4c0275efc75d8a1c57753b60939bd3365b29f801b7e")) + (1741000, uint256S("0x00000003f9d0ab66675f262a3bdcc1a31dcc31726ee7765ab29378d543329e49")) + (1742000, uint256S("0x000000002d3600b5c69588493b3129d847bb6e2576c0bc3ff9f6460efd2581f5")) + (1743000, uint256S("0x0000000282cadbec2f99e0c8e944b9260f13f7133cc56416870fe38e4848bfff")) + (1744000, uint256S("0x000000038e69af50667adef2cb0e9aeee8bccd52bea7e46227294f6a5e0c0438")) + (1745000, uint256S("0x000000057c5b7c69c1c10a2d11caecfbe17eb62e9be08bcf70334e25709d85b2")) + (1746000, uint256S("0x000000005590217461b08cffd1058091affebbed9715322a924057cbe697e94f")) + (1747000, uint256S("0x00000001f6a7c6dcb1984728e353cf24a3bea2e68c73754a916aefcdfb0cf29c")) + (1748000, uint256S("0x000000050efca03a20ac1d081f7b237e0187003765c302826c1c5ebb6eb251a2")) + (1749000, uint256S("0x000000029dc342a556a0f39de61340bf1913a001f2bedffb2d2fc75e9b2306bd")) + (1750000, uint256S("0x000000014c90d5bd41f3bb9cc83e966d17245989901adea24e9fb803a3af796f")) + (1751000, uint256S("0x00000002a3ace1b4b93e182cc8ab48c2d5f21d098435e08d6ffa006e66bde526")) + (1752000, uint256S("0x000000014717eb5f4d01bfe4a62a0a3cf5767ac1fe61d20782767b9ad38551a4")) + (1753000, uint256S("0x0000000165c3cd794a3ad5f5f7cf858228dd7bafea465d89d9ea6bb9d50c9a8b")) + (1754000, uint256S("0x0000000425309c3ac83b8f59e0987213c44f9d1a70af1b2df67acef706e37da6")) + (1755000, uint256S("0x00000003d788414e454fdf516d768165cd6efd59da056ad9275a2818bbf29dd0")) + (1756000, uint256S("0x0000000665956fc396e2c1b42c3932580e37f478ec7c15e28f35a76195a986d5")) + (1757000, uint256S("0x00000000dc5ace43a116ccc9358a1a6a1f21b99a4d4b38b939b5dc732578e340")) + (1758000, uint256S("0x00000000e2a0b7e090507f4f13e21aa73024fb5f8eb946975c8e18d3fbe5425c")) + (1759000, uint256S("0x000000037def7a52163a882e40c5f693d718ee3c9a3ff72765c91e5b6f9af913")) + (1760000, uint256S("0x000000045769ff47e8e3f1cb51a9b6ff1378899a231161da2a3b3caa8413b94a")) + (1761000, uint256S("0x000000052ffed0ce57ccfad266b64d9a949ad2784af80a066902dca2b2d417c8")) + (1762000, uint256S("0x000000010bef4889898cf3e2c3d0cb0ad0cc15a7aa394b6db6949aac4414e9d7")) + (1763000, uint256S("0x000000052b4397f24c7be192df7c617a3ec05eea73a9f0a71d294749c0555521")) + (1764000, uint256S("0x000000024051d111a516bd779d7a854c658439a0f82664ae7742fb76f2d87a86")) + (1765000, uint256S("0x000000054ae9cfdc5678a79671544817cfb5c45c865ce489388c6f4aab2216ee")) + (1766000, uint256S("0x00000004221eb0fac5a1340dec575372ca0ea842ac3f13eaeb41e848a9b3d605")) + (1767000, uint256S("0x0000000365cfe174006b52e5699397e641be7aaac2e4dd954bdc417dc2077004")) + (1768000, uint256S("0x00000003fdc4b4eda17fb6af8ae1551a13fc0d655a6b9559f61f39dc08ba0087")) + (1769000, uint256S("0x000000037d29ae542edf0e8fe09b2cf95d36f90d827152d4693244915b3ee456")) + (1770000, uint256S("0x00000004c918f544097141d0d6086567f483f707e948b6b9a9de762ed5281205")) + (1771000, uint256S("0x0000000436ac22a224104b08bff31869c7ac3102b9e35ae3cc23190809008abb")) + (1772000, uint256S("0x00000002385ec38d63ba954913958bc0c973698667f0cf37fe840faf362add07")) + (1773000, uint256S("0x00000004b1bd7d5616aaccf2eb556dfcd704c82c60c0b4eebc29f8f640903168")) + (1774000, uint256S("0x000000036415ef1337b9120373ccc66e851cf33e77579832eb65983bafeecbec")) + (1775000, uint256S("0x00000004c4bab47e83343b2bfce06d1542ebdefe1fddb286ed8f91a6c84769c7")) + (1776000, uint256S("0x000000016a5765722d608457aa92632a328ae581a5de599504c0935ca6092e82")) + (1777000, uint256S("0x0000000701c4bab1ce3c92668ed4949496b0830cf1d771670bb5631df8c7f643")) + (1778000, uint256S("0x000000013d0ff9925033ce0b3162926f200f867ee43efac2a7bdf6a95a56c351")) + (1779000, uint256S("0x000000003b272c6520cb8893f29db1e667aacbf40ff6da4da3ac325516c16e57")) + (1780000, uint256S("0x000000013df5ab5ff720342b732febd98fa9320bc64ea34714dbf7b4fbcd53aa")) + (1781000, uint256S("0x0000000b64be023cbcfcec386c79d708467e466782b835d1e67b486f2e5c2d74")) + (1782000, uint256S("0x000000021b2a9cd3cbbba257a3ce503f6fa1e39c6d1804100a14c13744b24363")) + (1783000, uint256S("0x00000007cde6f7ef2a41c581b122b24877e4203b3445baf0034d73ed14204ed2")) + (1784000, uint256S("0x000000004b37bb794f24abca1c311145c97550199373b17d2c7c07df5ebb9538")) + (1785000, uint256S("0x000000047edc917325ce9578a4c94f00a1183cd753c76b12c195e0e820d556f3")) + (1786000, uint256S("0x000000025c0177811a33925ddb7c245e56b941a6fbbabad67f300489e98817cf")) + (1787000, uint256S("0x0000000459dc750d8d9310ea28c7f88bdc2c2816b185ec45919bffd62153a57d")) + (1788000, uint256S("0x000000034ca7412ad71c48d3772d97dc99bbe3418b1c3cdd538b9700936fb199")) + (1789000, uint256S("0x000000076f64250f26cd16523a1785b7add386b594ebd457acbff0b7a6aa89cd")) + (1790000, uint256S("0x000000060d72c59bb12a1633dce31071cc6a132c626ab16caec774c1c7eb4d35")) + (1791000, uint256S("0x00000001515c3d79e4e28cdeaaa4a5b95b94e3a20e54c788bd66c7d79b312a5c")) + (1792000, uint256S("0x000000030f57e0c948e41863bda05f6c144ac8c9e0811e3c1844cc417e2ac8f9")) + (1793000, uint256S("0x00000005dcbfb0ea2a75b3babdf61fdaa8bc4bb24f08f2aadce4d431a681ad3d")) + (1794000, uint256S("0x00000005471c52605a54456a45e70e78f212988a21dbfc2b44329595c9d61dcd")) + (1795000, uint256S("0x000000041746a3ea05c2e383917554b8687bedce1c79c59e4d48a9dad86245af")) + (1796000, uint256S("0x00000002381f362803c3c533767dfbcb32f9756ae6bf9b7bfbf717751959be15")) + (1797000, uint256S("0x000000010a66bfc8280389b9358b7d32df17368c8d207385827ce5dcc26d8928")) + (1798000, uint256S("0x00000003170e34e98d6f7465c2aca3ac03fd6838770c639ffaaffdf47b2b5a5e")) + (1799000, uint256S("0x0000000d1f702ffae124c4d2ec4094b453f6a730f7d137638e517f377b2699f0")) + (1800000, uint256S("0x00000003119096a306aeb83dc7c3fa2c1baecaed090d88fac9751b85c02d5392")) + (1801000, uint256S("0x00000005583508df3d48ca3ea7aa8b1790a12b9d68a1537316d3ba83041acb70")) + (1802000, uint256S("0x000000060084882a0c69971fa6b1f5b219fe582b715864791c24fbdf779e30ef")) + (1803000, uint256S("0x0000000362f4bdac37f39bc886b56518b27ddca7df34c93170b316dc861997b0")) + (1804000, uint256S("0x000000052ac5a611ef3aded2989cc41fe7ef76ee95235ddc8904035ea6b41220")) + (1805000, uint256S("0x000000053f82b8a019469735d361dfe98b0ede3b7eeb1ea98bd266e4957c2009")) + (1806000, uint256S("0x00000002a73fd89ea6c9cc235a70d6d5de89870669b89a96a917f8bf96b9f799")) + (1807000, uint256S("0x000000045c45f117de62f01bc283f6170fda3ccc403aef07ad8d1b30eaf11031")) + (1808000, uint256S("0x00000004a6be7713af8533717d906be3d0b3df6b845be498591e775b27b570a5")) + (1809000, uint256S("0x000000030e95b1540d64d3cc1f596b3b84e21b7211595210d51807f12f784d29")) + (1810000, uint256S("0x00000000b00c53c576fc4938e55c3e091eebc59b67007a819d7ac77ab56fd296")) + (1811000, uint256S("0x000000008dffebe6bdf334c49df095ac5cfbcd6c81b2737e57f3ae706ee1355d")) + (1812000, uint256S("0x00000004870a62faf53b5bc60093537140a2ed830773294dac7fbe7caceac315")) + (1813000, uint256S("0x00000001cfa729a10b2978412336e3b8e5e776b79ebae946c23027fd54acae47")) + (1814000, uint256S("0x000000041aaaaa85cec731049de070fdc2b307b452cc305e8c75664efe5041bc")) + (1815000, uint256S("0x00000002ae8ca8bf637db8f46524c969fb60ec976dee9337c85e12acda1b800a")) + (1816000, uint256S("0x000000025cc83efcfa5b31b0a4b547cf5923b2f28344079f50ff09310b4e3149")) + (1817000, uint256S("0x000000038d0d1c7c923615fb07937822e313804269fccf884e38e613db802db8")) + (1818000, uint256S("0x00000005cdaec2266a5c21932dd2289a0171931aa4bdc39bcdc381d6194f3733")) + (1819000, uint256S("0x0000001f9bdedeacacc6602bf223dab9e25944637920fc6799738795c3c7efde")) + (1820000, uint256S("0x00000003a5a16120bde4b1a6a784ace30b616be37b8429e4f43eee44ceee0598")) + (1821000, uint256S("0x00000001f3c39cbe6a2bc81b0a6e6aa257de0bf13452d9adcaeeb71cc23ad029")) + (1822000, uint256S("0x00000004e0bbde4a8783d01581c7a1ba255506e9f967d8c096bc6c9034f70222")) + (1823000, uint256S("0x00000004a6d66ca53dbf714c238022cc0a42126540dff2f9cff7c59395a5752a")) + (1824000, uint256S("0x000000014b2b5044d0150acb34d993faa9ef0120a0842455e112d78632659c4f")) + (1825000, uint256S("0x0000000263a08ebf63abf6bd81764d1215a5a90aaded13d11bd04e2eb5107a05")) + (1826000, uint256S("0x000000065c08ecd03aa691178834c112fa5e728ecd82a8927f0e4f49664d5af8")) + (1827000, uint256S("0x000000058d8e8b4a7d38afa75d99f5e91b440fc209572ff26a98b1aabbbdbdcd")) + (1828000, uint256S("0x00000004480b9a3c0f9c87307804c6278dcb49c3fc362370a9fc424f27bac805")) + (1829000, uint256S("0x00000000f0b3cb7e289f48c72af19d62075c3390cd2991447216be87f9d372ae")) + (1830000, uint256S("0x000000008cd6ca08f95df6d9fab3faf3ab1ea74570d953fc05dea018f7ab0d95")) + (1831000, uint256S("0x0000000434184bdedea630dcdfeb3ff92aa48c46623f9237ee4b965150557c5a")) + (1832000, uint256S("0x00000003bf13197e2553f80bb4f1f41a27aafff87829e921fbddbdfa58718c78")) + (1833000, uint256S("0x000000037027ca30d184228e7ff663a9c0dde0f8f26f99bd587e0b8a309389fc")) + (1834000, uint256S("0x00000002827b9efc26f29c80eb728cb8ecd6cfc1a968b03c3f0e8fdd81625d88")) + (1835000, uint256S("0x000000049a0d5128db2dfa0961db2058bf7d153ebf0f4cc6d5054f561736f90c")) + (1836000, uint256S("0x00000003f67c56ff4281d35dfa78392f7ca0fe10cca06015e60b4c6ebfa2da7c")) + (1837000, uint256S("0x00000007ab31a2d80026cb363b965ed0b43a122b3e03e53b6f6614ed5ad835e6")) + (1838000, uint256S("0x00000009024dd6c35f41ebd7b759f8b108fb990c337fb2b764abcf571c731098")) + (1839000, uint256S("0x00000004a77cdd4e5130cee8c0ac9ecde7c22b0e342463596275db8b249d235e")) + (1840000, uint256S("0x0000000194db82e2be83455d477ba908718dc3c0b1092a4ef62459ad9b75b864")) + (1841000, uint256S("0x000000039654d65ddca898e2e13af01982516a542d3ede41163bb5e57c62cfcd")) + (1842000, uint256S("0x000000026c7a39b765fd8fab1cbd39bb4acb76e65de4d84996e90b6bc5cbbb8e")) + (1843000, uint256S("0x00000004ce2314f45bfeb207e27324783207dccc9a032f4f7560d5b63073d7bc")) + (1844000, uint256S("0x0000000830425ecc1282b45f0d9d2496eda51e7d29ffba7900441132c7a49d59")) + (1845000, uint256S("0x0000000a2f8f3e74c416dcd911fb06985baafa789066a7d98535fc7ccaf01299")) + (1846000, uint256S("0x00000002ac3047bbaf9a6fb3158e1245022251c40ad29c7b7d9e0dc117bae112")) + (1847000, uint256S("0x000000048c49382f8e79ae130453614ed621975037119573a8442e0c5674b7d2")) + (1848000, uint256S("0x00000007a618116d10d5cd2d61f3a542d44780a951f18b217ae394a95a51f946")) + (1849000, uint256S("0x000000053b6032fcd14396e27f966ce552450219e4f77a4bcfc7759362975d2f")) + (1850000, uint256S("0x0000000a68b3397504659a4e8eea87fc7c8788b8ce6616148c02addf46fb5a38")) + (1851000, uint256S("0x000000095bfe4bbdf20dafff20a5ba564b879595eb543394b789337e5493e766")) + (1852000, uint256S("0x000000027befad10df24147b92fc6b0b1310311fbcea57cb0ecb0f20cac43c60")) + (1853000, uint256S("0x00000000eb95b25125c7b58b9685242b4e29c4bce0f952b96475971d2b4bac51")) + (1854000, uint256S("0x000000035427daf79fdbba6152e558cb835c87817952e16dc83694d74f577dd9")) + (1855000, uint256S("0x00000000e86cebd49029f1348ecf3fec3d042fe3ad054040cf809975d676ccab")) + (1856000, uint256S("0x00000006d804ca22bbc006e2204ed721e35ca88675a66817f56a5daf3d34aaf3")) + (1857000, uint256S("0x000000069547a70ca10c149dc211c92c986800b9a4f74a44a0892f187ddf5042")) + (1858000, uint256S("0x00000002ca6303d0b280024eac8b07405dc2cfc86d54f3668074f60180bff21c")) + (1859000, uint256S("0x00000009736485bdfbcc7fef9068d2c50690e1331c0063381bb96940ce6740c7")) + (1860000, uint256S("0x00000003a9ec571fce90048e4c46586dd0a764a332b9aad36783ebe6ef225ef6")) + (1861000, uint256S("0x00000002fba6f836e098c87c71e6fc2fc811ef2c3e4014b8f66ca241c9538370")) + (1862000, uint256S("0x0000000458bcae098b9aed006b5f5b71cdfb5f7b73b0217a809d4ab5db2be96b")) + (1863000, uint256S("0x00000001e71c2b9725fd5afbb8586d6312200eada7971fdfab2d9c888daaf350")) + (1864000, uint256S("0x00000000971b82db5d846116c8bce305134f155730fc61a0f3b1e3fdc75828eb")) + (1865000, uint256S("0x00000000e999b3f061a706af846bc212e4e2ce41151a9c5d9ca6504ee7dc9675")) + (1866000, uint256S("0x000000003919b6575c4d446f14b00a57c326f282ed2e00cf75f72006d67680e3")) + (1867000, uint256S("0x00000001008c08cbae80cbf264f8c4aba686928fd72459df2298f2a6042d074c")) + (1868000, uint256S("0x000000000b8c1a48392a319214fefaf0a1aa0ff9c3ec57437fcce5068f2c4789")) + (1869000, uint256S("0x0000000758b5ff8f3edf6cf1f3b8c31778595eacc6e9139c3cd7485abf6ac8ac")) + (1870000, uint256S("0x00000006c0e18a5966014b683fc2ad66e67233857f870d1dfc3e4ba24c8d8c80")) + (1871000, uint256S("0x0000000aca708fa0f28d3c6dd195bce536428919684852372cca706440ce6470")) + (1872000, uint256S("0x00000009f1e7e2ee40d6436009ef884d25171058221068e6b561649164b921a3")) + (1873000, uint256S("0x000000041205df49ec40c992d36f19bb697f0dd25fd9474a613cdd4aea8cdf9e")) + (1874000, uint256S("0x0000000578b693fff37a8603939098aea30340b7c805a98317ced77cc9a9d738")) + (1875000, uint256S("0x000000038b9acc3c108412fe3a61bd7f77c4e709e7923fce6730173edc851ff3")) + (1876000, uint256S("0x00000002500162bbfcabe7018c43756da89dd5f5dd86b7a59d81b0aab222a4b1")) + (1877000, uint256S("0x00000001653423619a040072d21407c8f3e481c5d2da428a8c3aec4ff044ca3a")) + (1878000, uint256S("0x00000007c40a0e9e986333cbdabc6d81e100eaa1eea7a983b8bbb78317d05072")) + (1879000, uint256S("0x00000000742d5d64baebfca3b564937726ea4d4928f5b14bc5a5e70fd9c72e99")) + (1880000, uint256S("0x000000024d22fa0bdfeec3156b14a6ec455e0dccb913d006d701087a962bf692")) + (1881000, uint256S("0x000000077867103cbb1befdf33a24850470f1e26d8942a8c694b0cfd736cc8a6")) + (1882000, uint256S("0x00000003e31aad71429d93282c80b73903df35d6a762eae880ce7f746e39acb7")) + (1883000, uint256S("0x00000007df770a4a295aaed19a510535217663471284c37e62171a0b8b69070e")) + (1884000, uint256S("0x00000004f813d155265f3f09d6e0512bd0111e81708bd6c4b5857fa4c85bbf02")) + (1885000, uint256S("0x00000006236adc55d27b875af36649c7482b16a33842546bf4e8212805174e76")) + (1886000, uint256S("0x000000075757edd65122294031731b6038daefeb2d18e9adacda4b85da530fc0")) + (1887000, uint256S("0x000000021f9eaf50778462b2b58aa21b047200697c6c41880b014a14d9883c33")) + (1888000, uint256S("0x00000043c363d1126947ebea3156d801ef0922ecc57f2130793526801f11772b")) + (1889000, uint256S("0x0000000353d262ed384f346d50d7fa64ac7e513c155f4322386a0f1e33d626d1")) + (1890000, uint256S("0x000000029f50b0065af5c1eec4de04b140d847535d5422215dd0e26eed008d35")) + (1891000, uint256S("0x00000001f5b6af002a9524a8991426ee891a268f885139001ed6fdef2e1b0cb0")) + (1892000, uint256S("0x00000003c7318412f7ebd0a1da5e2809abf6293b2cf6ec519ed91a44a9b5acff")) + (1893000, uint256S("0x0000000c0efaacf06f7d9f5ce1a5211671201c24bbbe4fcbd759d17daf07d3f9")) + (1894000, uint256S("0x0000000095e2ba9e15c007baca9a01ea50ec64d87bf84f32fa9749d6f3c69f4a")) + (1895000, uint256S("0x00000002909536ceb779f4fb3bff8bf68aabcf26d953a6ccf9eac2b012c348fe")) + (1896000, uint256S("0x000000099876579cb3995e07b004c5b25304db77604b049c36473bb3be195159")) + (1897000, uint256S("0x00000009a267875f480399b16c0aa89f915d7d0a4ae15cf3bef66f9a104219d7")) + (1898000, uint256S("0x00000004321a0d47a384e405e4d3d585c7b5e064559b394d9b8517d409b81647")) + (1899000, uint256S("0x000000083025e8364786b286eb3d65cc39fa9cad4720ffef5a22da2618c4ddce")) + (1900000, uint256S("0x00000003df9302cdceced304405e46e3fe5950e191173e2afc810527d4a45472")) + (1901000, uint256S("0x00000001634453c1ad96fc6bae21a1e58c6b48af72ba9633b95fd313f4bf68da")) + (1902000, uint256S("0x0000000bc5de5e55f8d89dd1e26125b69767df8b410163d4903cfdc69687c2d7")) + (1903000, uint256S("0x0000000425dbba65f46a66a3255fe4c3e446c460970ecc066270abc0ef53ddf4")) + (1904000, uint256S("0x00000005cfedd11ec3f788d8c3e6a126c47c6bfffe0d34b821a0a1ebbd2bd0ed")) + (1905000, uint256S("0x00000004c602ef20f36b9dcfefe1970f3e008157ffcc8ddde3eb5f304f566618")) + (1906000, uint256S("0x00000004051959adaef5d9e0dc2b142351c5a5afc9a01b5c9b333a8f72844902")) + (1907000, uint256S("0x000000095bc01b7e1fdefcdc2fdfa5e9a9be8a896fae2d2b0907a5c6fc741fd2")) + (1908000, uint256S("0x00000007258940eebc238e5aabd9403c3ad97e88a90e0596a15a50f979c3b7a4")) + (1909000, uint256S("0x0000000623a348b65f08632fa073d3226831f677299eaa98afc249c6b7dea056")) + (1910000, uint256S("0x00000011f5e9f50fd2aa37b4c1bcb42a3607f4837687300be7cfc0acfe4db976")) + (1911000, uint256S("0x00000004bfc1a263d309938f5604f5c8cbc54d7b580c0b2300f6d96a2e6ac4e5")) + (1912000, uint256S("0x0000000137671d01cfcefa184b3a3365bce9caa2b8db024101f5c996b9cb2dcf")) + (1913000, uint256S("0x00000008b7007ec04ad61ce451f94a3c6fb2adb7426fc6071b2a5ea48c4f9fd8")) + (1914000, uint256S("0x0000000243fe84ebc7f9e6464ea68e938c3095e51561d168cac11e02da7dfffc")) + (1915000, uint256S("0x0000000463ee472250bc95ddf1403ac7ce518cb52b4570c5bf53c7c055f718e0")) + ,(int64_t) 1726139145, // time of last checkpointed block + (int64_t) 2777342, // total txs + (double) 1225 // txs in the last day before block 1915104 }; // END HUSH mainnet checkpoint data } else if (strcmp(SMART_CHAIN_SYMBOL,"DRAGONX") == 0) { @@ -3148,9 +3369,471 @@ void *chainparams_commandline() { (1140000, uint256S("0x0000012c87cc87745fe70667c7a2eca8b03dac27a8424b0830c06a18fdf9fc77")) (1141000, uint256S("0x00006bf655db63cb0e89eb631a25d198d80d593cd4d35c8c9de2b62003a8f4f2")) (1142000, uint256S("0x00000949c0348276363e0aabc6895b7a5298ba2ba1f003c2a4a23be5c6d843a7")) - ,(int64_t) 1709532066, // time of last checkpointed block - (int64_t) 1170154, // total txs - (double) 2511 // txs in the last day before block 1142288 + (1143001, uint256S("0x00001abd4c98e1bf15a8a5b7f2908cc072f76282d2694a8f97c84a108fc9cade")) + (1144001, uint256S("0x0000677122f55f756851a0ff1d951adbd15e6f22c7e054eb82df3ae6b7d1c65a")) + (1145001, uint256S("0x00000723aa16de79783b33f823b54ba0e729659710a457b3ca99dd17c6967234")) + (1146001, uint256S("0x000026cf629ceebe1c5f280306cf1cd9890a191b1b4b0c89c4fe6e46f70d8509")) + (1147001, uint256S("0x000016ecd65ff3e639aa9a00e610227bcf146ca1f78429f746cc01cc4e7c8764")) + (1148001, uint256S("0x0000458a86d82550a227164747b3a813bb1f6b172b0e42474d8da0445b542f4a")) + (1149001, uint256S("0x00005ae3c68a2a8cd550fca77ec4b4597b78fdb3ff8f427865dcec0f154a40bf")) + (1150001, uint256S("0x000025c5a77b448bf2ac4327d924f5450f19ca0f7bac3de388df22dbf52835b6")) + (1151001, uint256S("0x000064729fd1605fc80a90bf4d23e905375f9399269db3a8784cdef7e8caab47")) + (1152001, uint256S("0x000064d56bc9953b33d81215d78c5228a595529bb5fd214a59faaf8d3382a286")) + (1153001, uint256S("0x00005b043439939b166c0d54c7faa9925e4f5ad5c2af46c7865fa370e195ecc0")) + (1154001, uint256S("0x00008458be9284abe412908997475f1be8394b886380e98549bc6d10ff1103ab")) + (1155001, uint256S("0x00003a9129c1c73bee787b575c7a0de6aa207e0b43d3ea04f76b0387b8139b7f")) + (1156001, uint256S("0x00000ed2d1d6c80e862c416cbd5d526d4e6548dc69fe888ec0c04d7ffef44b16")) + (1157001, uint256S("0x00003a0b695fac7eb96920c31b7c1117ec7bce9c34af1618e4708ae3aa3fc2e2")) + (1158001, uint256S("0x0000517efd45c0330e96b59a285a13c69fbf364bbf6de0064f8d1d717b8b7906")) + (1159001, uint256S("0x00001e9fb4129336f756d405234482b720da647d8b954c0b2983c8513e2679c0")) + (1160001, uint256S("0x00000414eb28cbaf79a980f4f6033533a69cb1d9a493384b81093338c3b818c8")) + (1161001, uint256S("0x00007ecc0a50f1669262a67663cafdbe21b179b1f2442b1a1de55ea918437616")) + (1162001, uint256S("0x0000285913069142cb802a7eb3e2dbbcf4d89ca26db9c902012de5ce4a88dc18")) + (1163001, uint256S("0x00001eadf1340ddee2d55a1811c4a57cb763757071cdf78d504c70d4f9bcc764")) + (1164001, uint256S("0x00007a5c216fea1f476a7fd0d2e73597222a5cbd5e6318f2f3858f29310a37c5")) + (1165001, uint256S("0x0000526d0ed9aa854dfc16c4c931c03eb3568cb38bff50ef663a0239e1d9d748")) + (1166001, uint256S("0x00004a3c7aac2f4a7fdfedfa24819b2e81eb0798b656ba58f459ca1e90c21f0d")) + (1167001, uint256S("0x000004df7b065d164352a3705db7b00b7eb47ad7fa384bb5827131592a558b3e")) + (1168001, uint256S("0x000037a669c7d4b19a944b84fa13c8073228f42ddb5889abf567713eb90dc9bc")) + (1169001, uint256S("0x0000650f1b56806fe937ed1f993332ebad3e92970dd1309d1090cbe83dc00fa2")) + (1170001, uint256S("0x0000615f821c71fa1e9f332292a46e0ffd1cc77985cdc4c996d9d16f072688f1")) + (1171001, uint256S("0x00001fde82b173365755362ae6b1a207b798b701c9fa44cde089178212e23561")) + (1172001, uint256S("0x000002c4e67744a5277887a0c417d4cf6bbd67dd9cc825b3144bc941add70a5c")) + (1173001, uint256S("0x000067dfef79d3d5e0b0a367cb1046bea132a7df1a3962e11402b81e4d76dc05")) + (1174001, uint256S("0x0000764f90e17841250a426c69453c996f8a44a0637b6b7957b1e00bca87500d")) + (1175001, uint256S("0x000000b206f9072c6cb91ba09835ad8c58d87dc9621360caf7b28bfbc43ceb47")) + (1176001, uint256S("0x00007f615188b267f2617d2da466219fc455ff157180e7863a01cb6957123368")) + (1177001, uint256S("0x0000546ff34077fe8504e1d6e8e014cd8c090f518015a30ac0dafae7da25a207")) + (1178001, uint256S("0x00003879ef75005910acd44aedca4a7108f066add8c13d5fbb5055900e0f20fd")) + (1179001, uint256S("0x00004ef5c971203fdaacb66fb6b38d233a870f4c8cc0453ae0446fc95ab04dce")) + (1180001, uint256S("0x00000eeeaf45be97ab442f6706956832a99a7c4603ac59195740ba834c33be12")) + (1181001, uint256S("0x0000274f9fc4f02a8b81af298e47e9fca930c3d96b269c1ab07f5c29ec5f4265")) + (1182001, uint256S("0x000063f52dfeab43a0bdc13a8308668cb364381e2a55bb9ab48aab4c70bc2a7c")) + (1183001, uint256S("0x00000572ee5c2741c95d0a54ee0305e5caf699e226f06025d1c43b09151c85d2")) + (1184001, uint256S("0x00001e5692fb146dbc91d610c8ecefef0585fe673ea46d2976174b28631ba099")) + (1185001, uint256S("0x00003a3fb0c42cf355db9bb2128707d1bbd36eff83d59555718768476c6bcddf")) + (1186001, uint256S("0x00000dbe5a1702118a3acfd58b4a3c602367bf863f041c674613b4254423c9fd")) + (1187001, uint256S("0x00003dd928d78c0764f0473a63610435f08b4b35e74a7d47ba278d800e01a3bf")) + (1188001, uint256S("0x00000b1799529d458d32f144eb93150e40df4ae89093a45b67b83d89188e4938")) + (1189001, uint256S("0x00003419dffd430b1c8666a4ddfe3ce404c370f8162ae462de72a1e603b79891")) + (1190001, uint256S("0x00005c40fac9d1b1fad12d8bc5a8e9b6d47922f13d19a6a8cedbd6815b683525")) + (1191001, uint256S("0x00004c48cf89bc4d8dd1eebf0e231770ffb627b8371ec80699399a7383573da3")) + (1192001, uint256S("0x00000fbe9557835e11b7c29749ab6c9b35392563ea67e31af7e4ed4092b5a01f")) + (1193001, uint256S("0x0000569ea55ecfc1d04d8b6d6854df2513e644b0071a37ee50d2cb730e370e88")) + (1194001, uint256S("0x00005dde3998a63acbed8ba8a0252df6a06f74d58f8e520713278ab70eb8d2a8")) + (1195001, uint256S("0x000050c03c4aa3d2b0040533100cb8468a9b613e2348c6888b92c07ca8988180")) + (1196001, uint256S("0x000044a77431cb8e5d19a79ab24e07e8b376e88a1e123e8e72cda2bcc6a168a0")) + (1197001, uint256S("0x000021a4bae3e8326bf14a2e224a8ad6b3556613c36de464550fe468073611e5")) + (1198001, uint256S("0x00003928a7fc32adaf1c10528b4e2bbf7e2ac3dd627ac681cb5e70db85bd5cc8")) + (1199001, uint256S("0x0000610cf21ff42b8c63edd7c3769e3bcfece6532d197fb7f3aeed685b7992ca")) + (1200001, uint256S("0x000033a19d6d012043cbb7d2da5950c4f6f3bffa624f832943b6de5133398945")) + (1201001, uint256S("0x00005d7372a501a9cb15fa7b6e12b8a1ef0467837424a00b2ebc471b80c01dbf")) + (1202001, uint256S("0x0000533d5baaa923bdddbc10334003bd9d9f143fb18ac6386c1e32a381e6098a")) + (1203001, uint256S("0x000069b0da4827f3b3918e6503f77335c395f851340241039de96ad753cfe78e")) + (1204001, uint256S("0x000044ddfd3428e3c913638b7371302cec40989c913b623d7140499ddef86411")) + (1205001, uint256S("0x0000007c2fd45b68214606e72cdbb36dcd7702b7b976eb4ed978668a31da5847")) + (1206001, uint256S("0x00001378479ba1a643ae7fb05164704c3f0722327121dee5d37eda304306a96d")) + (1207001, uint256S("0x0000044d769d79728c722514bab3cd5313c83436d20bbcf1ff5c08a528ab50e7")) + (1208001, uint256S("0x00000be3c944b34980d2fd473ba10914eb4ebdebab90cad52d3be249b4e8b70d")) + (1209001, uint256S("0x0000419af3555d3f5f2116eb18e2ef2bf4120a7f57d71926ade81bd77bc65b35")) + (1210001, uint256S("0x000031e4d59bf5f35cbeef138d7be9237d3d65dbe908ed6d346dce6bb9a6ff67")) + (1211001, uint256S("0x000049c0162af1724758333736b82f2b333b21286125d1ed24a428e6bfb2f74d")) + (1212001, uint256S("0x000062c9ead9fd9e95c1522685f4a3e94b9de13a9ca2ecdf1565b3b0efe1108d")) + (1213001, uint256S("0x00004626deb0fac82552db256555358fee783f1dc75d7a122cf50876ea722c8d")) + (1214001, uint256S("0x000007d502b97c80797f32e874f6ec04240bd9824f71e74910a5f49d85949a3e")) + (1215001, uint256S("0x000057f53ccb33fac98c599526dbd170f6c76d6c7711799d101c281da98dea1d")) + (1216001, uint256S("0x000043c2a43736c253a83c24b09358ffe95c6a33045dafc0b9ae8f624dac8be5")) + (1217001, uint256S("0x000024e1cc159476b8159874cf33e2ae930741de01ebd01cd958768fb5f0dd06")) + (1218001, uint256S("0x000066a3918749567e977ba76a80e592031c6e4963bf9b85daa7dd5951d270a6")) + (1219001, uint256S("0x0000499e32f029c586541dcdd48a875c3b9aee18ab02b7f68ba7ed2c35d46ced")) + (1220001, uint256S("0x000040ebb7d7a66a01a521e637ac95021dbfd8fc83fe027f265a9ccc54770529")) + (1221001, uint256S("0x00004d6556085fbb0b7aeaf8beed4b189ef9f3fa4389cec99b77211e892e42af")) + (1222001, uint256S("0x00004e3bde2225f125754054d2d18ba5e433a40ea8eb1f4166a946b1d69f0d71")) + (1223001, uint256S("0x00003341a82d5d8356a96b0258a65909718adb0b8ce74736c2139971065d4b83")) + (1224001, uint256S("0x000037bcfc844daa7fb38f3018b19dd25151d4fd7d743389618f8fe6aaa2e126")) + (1225001, uint256S("0x0000489a1623519a3c8986aa65867a07ec47609eb3ce00ebf83df4dec6272de0")) + (1226001, uint256S("0x00001c5e5d26782149ff2dbed31ce8e9b8dcffeb9e56a4355fc55e1b5bc60de3")) + (1227001, uint256S("0x0000021d8c76c81a5050ff5857bd3001899ef55760b938b06f6e5d739c97cc01")) + (1228001, uint256S("0x00002c6ee134604d000fcf2fdcedc8ab46fbd697915ee536ab5f762ddd03b63e")) + (1229001, uint256S("0x000009c9b6c004c95fbb94d40b48e814e62cacef93ce917cffb6e0ff361988f0")) + (1230001, uint256S("0x00001052997da57681d085278679c6a3db25ebf6fbf1061006a39f0d60db3f1e")) + (1231001, uint256S("0x00004cc25dee6994586151e05c78b7341f175d053adbc766664e3506dd76da2c")) + (1232001, uint256S("0x00007247d3621839a11a938f1f457b6afbfdd607e29558c60b583922f9ea5d87")) + (1233001, uint256S("0x000059eb3c4edc72ef3786c732145d011d0445b949a856b199f1e276b53ea3b2")) + (1234001, uint256S("0x00000749b569a827c46fba212c5672ba24477d871915750a2e7002c714f2f9b2")) + (1235001, uint256S("0x00002666317c8762ea40c8d3fdd4ec7a90c209c1f953e4c19725664de00e9a7a")) + (1236001, uint256S("0x00004e29fa8965b57c3c0ba11e8c2ccb95e655160965c3930174ea49bc8ff5f7")) + (1237001, uint256S("0x00003b27b7c661d643056a43e16a60daa45606a2c0b39ed438d129ec0ebe6c52")) + (1238001, uint256S("0x000041571dd8761157c56452ef09a3f1422f3b3222ab195d4a774100e2c4c3cd")) + (1239001, uint256S("0x000023fbfd57f93b7328705543a8f42417d4e5e4508b3aed52c933a14be57c2e")) + (1240001, uint256S("0x00002a1fa0064bd4d024ca053767a42ea042e24335d0051477b797f5bbfd96b1")) + (1241001, uint256S("0x00001d016ad4c50de53234fde26bf494d9c1d4a953842e9f86fabf9c59d5b12f")) + (1242001, uint256S("0x00001cea6b543b5c593d142335b40e27152af092286a20f694d769253140dd8d")) + (1243001, uint256S("0x0000262c6782fb509f697a0548f76cdb7dae2939879c12cd29effe13f377d534")) + (1244001, uint256S("0x00001405321dc4c8667e2bb01cfe58bd93a5b1b40da904a2c1f67a5bc83c901b")) + (1245001, uint256S("0x0000118f9b2fde7a207ea25de832bc592b34d6666816eab6ca5f9b34c7581943")) + (1246001, uint256S("0x0000026c2b282e9bf370a9b350db92d50c20d1caa808fbec2be0d33b5d94f84e")) + (1247001, uint256S("0x00003243581b108239c31f93a02e36e3af50db04022534ed5200fe2ef2606ccd")) + (1248001, uint256S("0x000017452920960ceb30a49921c82e497c4b20582d05fdc6cad76cfcd32634d1")) + (1249001, uint256S("0x000020ca7e5c1cecbf0d4e14d4dd2172bda7abc2fc048674dd072f4f1c77654b")) + (1250001, uint256S("0x00001352fb81040a0172a44fb77a329513cf7f396035687145b77f54e6c605cd")) + (1251001, uint256S("0x000027893ca9a5e591c2f6b677fbe0952e7d5f2803d21330e841a0f97e480b17")) + (1252001, uint256S("0x00001a8a62b572c18838754170e99e30e0e8705c49eacad6210297e384ded8e5")) + (1253001, uint256S("0x000012513953f82b638632738c564945b603c72d486c2dca4536f433354c2627")) + (1254001, uint256S("0x0000295838f99e15d44862bc6b39e82a57b144649c396a7a7fc198d8dea8c09b")) + (1255001, uint256S("0x00000e14e68977653f132cbad227f027752cf66ae8589bf225498c5c5e1c19ef")) + (1256001, uint256S("0x00000f272dad20436ddd0f337141ec34f80c36e5ef032664727474406457f6ba")) + (1257001, uint256S("0x000007c67ccad1d322ba151f0b0245c1afab86948dc9ca87e3964a44a2d69e20")) + (1258001, uint256S("0x00000ac96d7c3701367999022703758def11326b72457fcb780ecadccfc7a197")) + (1259001, uint256S("0x0000314af608527929517ec81c5b579c88d3abfd580fcbbae5462cdd83c6b6f6")) + (1260001, uint256S("0x0000154b647cf904e64c7035fb15f10fa538e92750176377fe84c76ff60b2dcb")) + (1261001, uint256S("0x0000362737f845970faa4037dc333ad7fde37ec128019e2aabaf12bda18dfa74")) + (1262001, uint256S("0x000056e8ad7e7d1432256ca364b152faa553209125714eb13da520aca8f6ce09")) + (1263001, uint256S("0x0000494ce9f3a4ac5ac6eaacfcb3cbf88e8fc53259851b9860aa6349a65aaff3")) + (1264001, uint256S("0x0000270ac41c84108dcf3ecee90c97bd20ed776104b4158e55b5d86a486bc32b")) + (1265001, uint256S("0x0000315fa7fc4e4c49ac33570dfac5d962dbadfdc8c32f35ee8adfcaac957e6d")) + (1266001, uint256S("0x000052a477a5eb26520b6949c2e6719d86dfc149fc50df072711ae95405b2cb9")) + (1267001, uint256S("0x000046127d16bd60624e7424a4487371963627ef00c1dea768db19ed859874e8")) + (1268001, uint256S("0x00005b3dcdb3a995ac67c9f5edfcf9ec6cd1230716691869f5b508058d67f4ee")) + (1269001, uint256S("0x000060261dde231947abd6f40aad1c9e4d5f19833b0bed59f83e2eef27413035")) + (1270001, uint256S("0x000016ed74b0614bae4d81fc26899551837974a88ceab1a7147cf702f12878d6")) + (1271001, uint256S("0x000045698a243ebce5ed179f989180c936866a405cd15c7d1be77b392a574d49")) + (1272001, uint256S("0x000047e389a5d7a67a99e55c29f70af08cc6686f4b25caa86e8ae7ea5d99cad5")) + (1273001, uint256S("0x0000001574d4ab3533e73dc66d746b3cbbb82fab8ce164ca6e36a81415b0311e")) + (1274001, uint256S("0x00000049ef25bbdd70bbc73a7e922fbcb86a728224379a65a917e426c95d9597")) + (1275001, uint256S("0x000003ebc81a7ab88e0cfd9f77a67dbab8787f5ea0ebd0c1f7c41a63cb835559")) + (1276001, uint256S("0x00003421af6b4375595bc997267403a4da7245deab6bdcde029bda0684405181")) + (1277001, uint256S("0x00004a00ae22fe91f0bd555f418e84c3e6f8c75123981c4c99b289dfc4d49d84")) + (1278001, uint256S("0x00004879afc45fa248901c573295e77858b0731ccdce5d76022c4e9a545bc6cc")) + (1279001, uint256S("0x000070323277e7e82525a21598030595ee4bce4f3269599f744fd2191d991591")) + (1280001, uint256S("0x0000224c3d2e0adabcdb728ab71285860c4baa2789cf8be153609a28c1953f1c")) + (1281001, uint256S("0x00002175db352f8b4c5de9242891f2fb2d4acc3b8064816f7fe83d7a5f74183a")) + (1282001, uint256S("0x00000e33eb505c4168190f2053e692ee95efd07863cb8192f1a6f92e557e4b16")) + (1283001, uint256S("0x000035059279eada1b5b96179815ca8925a7f4e03d804301181a4baa3bcd831c")) + (1284001, uint256S("0x0000025c5f7d4eb41b1380e6f31e9087e22c43cefb05a6e4a08fc2d60da4075c")) + (1285001, uint256S("0x0000333ace215c057a4e82a193664cc503baecdf8f983de15075289625648875")) + (1286001, uint256S("0x00004b34c14bd8f384d0c5d2d32572a944c7fe4a23c55191820d36c5d05455ef")) + (1287001, uint256S("0x00002bf96ba8ff07e31a06545a579f0c6336d2dbdcb6d6d36783bb771e45c5a2")) + (1288001, uint256S("0x0000503dceedd11092f2f94cadb40b92b14764cc7df46603444dfb87d22887b1")) + (1289001, uint256S("0x00000fb6e1c6238a32b630f5fd1c047602fb634de4ee30e07d710073498dcf9d")) + (1290001, uint256S("0x000050ac76f686071780f939c3c97b999b797c3df72671321a2b2ab5843ca975")) + (1291001, uint256S("0x00004ce9a4c1528259de922f84570a5579eba95f1594f388d7ef7917be01df8b")) + (1292001, uint256S("0x00001dd131239a6a9453abc5abc5bd6b4dd84f3e442704a644516cc467cb8a6a")) + (1293001, uint256S("0x0000452281140f0800c06657b76f300f36221414e3ebe2083452cf9ac2cec743")) + (1294001, uint256S("0x00001eb88277a4fad48dd769120c7ccfd9761fbc09c787fe0517b5575c175d10")) + (1295001, uint256S("0x0000013f7a147c8d66c2cfe3fefdb60984ae06806ceace737028ed5ad5c37cba")) + (1296001, uint256S("0x00004fbe7243fe8592aca6a20df6f1d61187134b315b7c5b540b5b24b58fc709")) + (1297001, uint256S("0x00002a7a71970969b8ca013ac787654bd91bb447b643dfde6867cace4f7db4e9")) + (1298001, uint256S("0x000021033d0b287925029ff2d4c2033803995ae9a67473193ea099b28c03a13b")) + (1299001, uint256S("0x00003d139f95eb9157337f9eabf4d3cbca085d747d23b695c160465600da2977")) + (1300001, uint256S("0x00001a5d0151c26c593ad912ba97a1d2566ef83ad5f8cebd4397b7f54567d525")) + (1301001, uint256S("0x00000ef71863b08bfe487c34373d6f4cb4b13d002a3ff20c0e446d126cd16d3b")) + (1302001, uint256S("0x00003ab3f07a1c9b2488a8359fe321f39a0f2669c557824c5a7e58208812b2ee")) + (1303001, uint256S("0x000015eaa78e0edd2c9b8f8675bcffbcfe98e7f704f9846bf96cc06857927392")) + (1304001, uint256S("0x00004689d50c55da8a66d525996c17e70d563e34dbf1a2064f16e1afa71f6d2c")) + (1305001, uint256S("0x00003a44b8ed9ecec074e284b7530829b3457f72fb2f2dda4af3f5f6fd69c41c")) + (1306001, uint256S("0x0000456875dc7a40abba45627d457b8eb2b936751c9623f8ef8d6cdd9cd6ba18")) + (1307001, uint256S("0x00001761444f1af954a876a913a5066161dd7260935b024573b4dd9e614a0841")) + (1308001, uint256S("0x00004a4b4d6e4b05efb3474567df8e6590d40c1e23fe61060d4a8e74c42ff18f")) + (1309001, uint256S("0x00001d80c185d5fc4022feef4c94f74e60e153062b7deb943d50fe51c52bcdf2")) + (1310001, uint256S("0x000014aa499e621f88ab20ddad566f66067f5278e23a6b64d9a3d7affda9dac8")) + (1311001, uint256S("0x000044c4a451f99a4c6b981371a48e2a0c83dc493d5cf60aff997cc93343e08b")) + (1312001, uint256S("0x0000397de8007b2f77900558d59e2973e811c05e406da396a5cbce2baf717ae8")) + (1313001, uint256S("0x00003db3982b012fe37cd63c3420b8395a052f0742b1f05b14ec216773309abd")) + (1314001, uint256S("0x000033fc1f1dcaaa70d3183bb82c0c090e58a58b5da08aa4f5869ec8393e97bf")) + (1315001, uint256S("0x00000fb293d47d303ea433fb0b65a4626ab04c752a39e62fc0504db5d1d16aed")) + (1316001, uint256S("0x0000323baab94f60bb12d04f18027adc98e1f6993bbc642d589f680e94d39253")) + (1317001, uint256S("0x00005bb0ae2b84430b13513db64ca088377e0e63af4627b050c197260c7e17fc")) + (1318001, uint256S("0x00004acf40901092615d0c9ff33e942e59675e97d74c55910338cd9dced066e1")) + (1319001, uint256S("0x00000298f14994ad1b3f5309058c4f21a24f5fec3fca09bedfc1391aa1cf7195")) + (1320001, uint256S("0x0000542bfba64246cc597b94353c665a9552f8b932b30937f27b5aad5b32652d")) + (1321001, uint256S("0x00004f7bd4aa3277df46ec8048c5e417c682209c93aaed83fb1843a5d2fe7d90")) + (1322001, uint256S("0x00002cb450e51c67588bb3c0b36c9a035a987ff51b47fa1cbbc42cbc987953b1")) + (1323001, uint256S("0x000007327afe42600c68baae7c9c874f288cc976de9f82aa33161c647aaf2130")) + (1324001, uint256S("0x0000021356b0709fc449243af1055ebb9e49f1d3ac2239c6fa9757e57125cc3e")) + (1325001, uint256S("0x000020c9f1c94a0685333143cf660ccb3a61f5584c776c713cc1424bc74390ac")) + (1326001, uint256S("0x000021f27a69865c8e03a40b6cf3b438dc5530c2701061c0a157e4ba83ff1376")) + (1327001, uint256S("0x00005d5a58376ce8d34e236382da56abb13058eb7a7048d65662b709456514cd")) + (1328001, uint256S("0x00000e7a2f66961089b63d04437f253ec2ae55f8549dfafee570c6ecbb614c92")) + (1329001, uint256S("0x000039ce6f82debbf547fdf2435c05a531e5880181db07a2897960c84a418562")) + (1330001, uint256S("0x0000130daf502eb85205c35f0e3ff02dc8b308c8e5e13993cc163523856a7a7b")) + (1331001, uint256S("0x0000098f3ed3c3faead955ad492ce1276da9df01e19a15b24edf70456e429c70")) + (1332001, uint256S("0x0000255b2fdea949756d26a73ba543e0788d22772cb1b67a2b0933464f53c6e0")) + (1333001, uint256S("0x000014b4af8e1ab2aa1d82830e2984a38c069d35f0077824366fdfdee734ccab")) + (1334001, uint256S("0x000041e4bab399251e6ee8bc136411947fc9f1d66fc5f7e123a6b7d91fc054bc")) + (1335001, uint256S("0x0000433277fddc51e76560405644dfbfa7b8efdfe70299faea44784b90527641")) + (1336001, uint256S("0x000046c35d7270d62712c87147fbdf6870788525eff770e1424e072b6352e4c6")) + (1337001, uint256S("0x000045d73f41bc1fa31077314ee315cd4f94de72743e23a805806f8999a90182")) + (1338001, uint256S("0x0000557a77ed50e278929675717fc42edc32787ccec48b3ce2e9bdb305974453")) + (1339001, uint256S("0x0000695cfec64501409750f06321ead6b29be25b99f96fa080f06c6a8ee31a78")) + (1340001, uint256S("0x00005b7fecb5054ac937049f16b35fec4ed1ba496de6fe76d6e6f66423a1731b")) + (1341001, uint256S("0x00007eece0f7d2355c2403a57a2e6a68196368a98fa1cfdae60f37210b459d74")) + (1342001, uint256S("0x000049efee05a2af62fa226f5bd9fade86326eddd2d15ed1448e94f0e0f8a53b")) + (1343001, uint256S("0x00000ee6499e0f79f2e0d3c5a275a6fbf40f811d4d2971aad14a3034edd13fc7")) + (1344001, uint256S("0x000007f9f27150e9602ef94dc496c079f6410e87de18324e36265db24e3364d9")) + (1345001, uint256S("0x0000237c706db93965a02500c7b27e858e275da03a54289f99a42bb05a22a1a8")) + (1346001, uint256S("0x0000217082b75f556a02de4117805709cf6c9e8895fa5413a15fcfd91084a84f")) + (1347001, uint256S("0x000019ddcbd85501e54469a10962066bce82e1371276bb7bb42ff5c9f7a576c3")) + (1348001, uint256S("0x00000bdc483cfe9ac1d336ba3dd85f8da0f9852e1d9fd7be0e9cb5276451b1b5")) + (1349001, uint256S("0x0000362fe61193f328113acf6ad929a7413778ff5ac5d5b6a77824d806aa0ce3")) + (1350001, uint256S("0x0000516556cb43341fc337bf1e79b9101bd1d00f5a15d4258d5865ae4e7b6c8c")) + (1351001, uint256S("0x000074242657b426f4d143c282114d5f9f06750ce0ef75866131d8dbd4ec9196")) + (1352001, uint256S("0x00001776c5d9954944597c4e3489b446c1fde4ccf4c03765e42103246a276279")) + (1353001, uint256S("0x00007dd053503bb5f8e6337de34dddf455f5426ea70a8b773c6513657a0179ed")) + (1354001, uint256S("0x0000674f697510449292eec82790ca973a2b654fdba34b8cdb75e92d8c0671aa")) + (1355001, uint256S("0x00003c5466874ad5f920641959e1d247164e1774c7c2d7a3c33a9ada630dcb7f")) + (1356001, uint256S("0x000038291f66676bb0d275c757a672fa71fb59ca6b28a6585e66cef4ddd23493")) + (1357001, uint256S("0x0000595ec97925232c8598afbf6560dead715a7a6aa6ea96ea7934802307ae75")) + (1358001, uint256S("0x000018faa3f856885d165b58a43a309785733f38f591421b200712297f722e20")) + (1359001, uint256S("0x0000448fbd2c27f48204a46744746aee7759c2724237b1ab2226204956f61a06")) + (1360001, uint256S("0x000006bd3d30cd6ab291b20b0e7f0d6ad072fcfc15a03b3f196b138b54f64742")) + (1361001, uint256S("0x0000046d40d4073870c8564bca4fb413ff2ff49917c8dded938b82e2a92777eb")) + (1362001, uint256S("0x0000066919c001c5a472db2c3c53c84cd245f215eb3fa999417e7342a7f47d7f")) + (1363001, uint256S("0x00002b8f020175c0e3b678e5f41479072bd9365f677bfdd9e5711d872df4ac1c")) + (1364001, uint256S("0x00006c35e0d50127de23ed1ea7a73542765f1ccb9a7b41ae4709202ac90eb8b4")) + (1365001, uint256S("0x00004d30f2a0987696cbbfd447997833696ca7da3a9cd24ae575fe7c50fdba93")) + (1366001, uint256S("0x00001f1f126f2b1d7ccf0848694f9fd826d53cce8c91a1a1ceab6f90682ff2e2")) + (1367001, uint256S("0x00001a9a57d78bb2ffe9dfd947cc78a97b7fb4e3daeb4261d17b29fe00f3d563")) + (1368001, uint256S("0x000055879821f00c97749cc07fd32e551dc798d59819eb0098c9cddba671a71d")) + (1369001, uint256S("0x000010f320b2872b8b7e0a0c4f4b0fb14c5cd6358e0a7c39fab2c187314998e3")) + (1370001, uint256S("0x000032575ad78d2b13e48617fbcb1d11b68c3de1a2e5c92238c841543947b3bd")) + (1371001, uint256S("0x00004b2c2e7e00e275e31e91cb9aa0bd254b6b03b361be6060a5313a55196110")) + (1372001, uint256S("0x00000782d0e0489804011163bf6e368ad1bf39a55acf062a9eed1b170945706a")) + (1373001, uint256S("0x0000349c0cb7ddaf965dec2d75cc42a8a4b4b760cdfa1c3b871933df1a857e83")) + (1374001, uint256S("0x0000562f7722aeda448707c590cddc870d6437babd7587b2ca30065d8b606ee7")) + (1375001, uint256S("0x000015fcf696bea9a885c339aaa918747c663a3c661b0501c1700525e9a4e970")) + (1376001, uint256S("0x0000532f707c6f5534b55d63d3da4a52f4c447b5a26db683db41a4bb0f1fae6e")) + (1377001, uint256S("0x00000e11d83be72dcc471e54f42f75480cad20088df1098db8de5ccd66bc5f04")) + (1378001, uint256S("0x00006aabb895d924fe4235ed9a519b444d9378296de965ad2ae0c7ad8e704834")) + (1379001, uint256S("0x00000d1046c297e26613782a0e76c889ad95d7f344ab6b60b3531f1d8ef2c645")) + (1380001, uint256S("0x0000485113c0956dfdae98ef64ef0761ff626dceee448bd8e39b667c51783464")) + (1381001, uint256S("0x00004dc48c32c10ae298816ff7b1245f0c7334b80c177a641ee8f93d7d4c985e")) + (1382001, uint256S("0x00002f9f8d407339c70846f1dbdd44808cafd00ec326e04deb99585c43149d9c")) + (1383001, uint256S("0x00003aa99eff8977c0699b1de278b449c1732b1f6340eb2e0c32f3631355ae7c")) + (1384001, uint256S("0x000010c44fd33a5f32be7fe99a6e1b5dd7af632c7074553ad3b2d901686a90e5")) + (1385001, uint256S("0x00005ec9479f0823485458118ffd708c6682d9e821f87593abec6904b24bbf9d")) + (1386001, uint256S("0x00005a81f0099ec877a38784bf090564aab1e017f8577219b85e333d2176ff2d")) + (1387001, uint256S("0x000053d28844ff4fe18c3a6f027e06bdb7c8c7f33cc2d6d8fe4f704a9fcfd655")) + (1388001, uint256S("0x00004f423e1a284f227dd8ad3d18885c069b11ccf8ca82b70fbe2934885d77d4")) + (1389001, uint256S("0x00002d75b9982e1cbe7098826348e539fef98d360527c60919c685d078d25d7c")) + (1390001, uint256S("0x0000253b0e75f4b8592e25c4b57941aaa9f47c03823c6fef1e5a632239f01731")) + (1391001, uint256S("0x0000104ee7ac72ea953e9fa62adf67de25d5f8b701f04644b2edc5791fa7fdfb")) + (1392001, uint256S("0x00001719850dffa41f3304b6ec9224a10605c84ef4683fabf40127cfc5ac6ba2")) + (1393001, uint256S("0x00003d74aa53a4cf640e388a0d887fa5ef5943c64089f48509d681628f2ddcc5")) + (1394001, uint256S("0x000015b2e8da9b9a5d4948ff1b1bf2c4b8d6a7513990337ef91217591f136a8b")) + (1395001, uint256S("0x000023085b832a406d3622e4faf08eaaad3efdaf0ef2e895396cde278a810083")) + (1396001, uint256S("0x000078c64a005d82e5cc93ded5a9c4b3fe32c8c3cd973966d99058aadbeff53b")) + (1397001, uint256S("0x0000325aeba5aa9d114c6bfe7ef71cdbffb8e1a72d1d3b3c551563d49f4b3f65")) + (1398001, uint256S("0x00006a69735e964e2d3197ff0ace47bda8e6c54beb17a7e477dacbe490654ae5")) + (1399001, uint256S("0x000039831862ebd93a351da7e92bbcab536eea4b50eb184e7bc12ab16c7a1115")) + (1400001, uint256S("0x000067a87a1666c42203c3040388cd506abbd6f57a794c2ee8649ff99ccc717e")) + (1401001, uint256S("0x00002a77cb9850819ddbd3e0fbd34de3168dd07d019b8776925c5cc7731cc48a")) + (1402001, uint256S("0x00002de878566b6c07b48382f987edab40de17ca691c7049efe59578445febe1")) + (1403001, uint256S("0x000067bbc69acd4aaffe077256782b411c42d4275875c4e180cf968652921d00")) + (1404001, uint256S("0x000068c8dfa4d1a6b5d0ece9325099eecbe1dadaca94da6c77150f2c1a2a69e0")) + (1405001, uint256S("0x00000300802bc034ad8c16e0b5e844f9be10e576a0a493b6822dc86e16e8301e")) + (1406001, uint256S("0x00004e3af686bc84c4ad0832d62acf2be719f838daa06c2c83e7809bf3184d3a")) + (1407001, uint256S("0x000013507ae3392e6a2c0f66f88c80705dcd4d37ac1f1f8d6ab3c8888e817e63")) + (1408001, uint256S("0x00005cd151ab2cbb3a0849b2718e3ac29f752038d4526a7a4ede79adac10ee17")) + (1409001, uint256S("0x00005a8a3d4117feecfb6142f4ac6aa5d325a94f5ca49658b63c609846d97a49")) + (1410001, uint256S("0x00002511474edf646a85f88ce0983f252728226af9270726e012177d68443196")) + (1411001, uint256S("0x000086ebc22cdfe2511a5f4f75593af71fcc572d411612e3e228cb981c5760e7")) + (1412001, uint256S("0x00005d61f01e4f780215b8c37a85f74f91add060df0ea7c7ea8229e9d073c825")) + (1413001, uint256S("0x00005acc20c5d6dc157630aba65fabd5438025691e0fe5a652ef2151463767d1")) + (1414001, uint256S("0x00000a6b47f923541ce75aa9d8ad7bc5ad38ddc25d0aedacf554149687d73266")) + (1415001, uint256S("0x0000346405be8c41cf267d79fab3198ac93491f01c35e8e27423d52e0cc1b826")) + (1416001, uint256S("0x000042f8da5e57f9a8c106b9b8b6ff265d6db1dcc6f6d8fc2d49d3812b152fab")) + (1417001, uint256S("0x00000ab99656026c91a8510f178bf19108c104fe1071f7c011f0c8dca7c28d79")) + (1418001, uint256S("0x000029f91d21ef26f0e13ee4c38dfb0e0acaf12119f2a7cefb1d21b8fabb1d59")) + (1419001, uint256S("0x00000749b6d2231c3f24a6c173d35079482bf96139c6c9e25ba4d40aff186589")) + (1420001, uint256S("0x000084ca741a042521c5f9f5580a89c10e1bfd8ff132505f70204bb967e2ecd2")) + (1421001, uint256S("0x00004e898bf961234eef02b1f9923b7698fd09780679723c8d99856c66fbae97")) + (1422001, uint256S("0x00000afe4ace6f9356fe4fbf49b5612438cd95b4834a453485ad5e34f4db3a85")) + (1423001, uint256S("0x000071a235fbcfcab3b4d43fa4b935b8595c605362248109845a0b8fca28b355")) + (1424001, uint256S("0x00004b1a9ebe512de37594b2e6591ef417ab6afcee76b0f3d8b9b6cc9139fc0c")) + (1425001, uint256S("0x00002fc4d8e33697095aa54a7adfe3f03c57269bed37e4bc9f959df1f783cf94")) + (1426001, uint256S("0x00005451c0d4b8e52274fe6257bb9545a01fc718ee26fa4a66437e1ba69b25b6")) + (1427001, uint256S("0x000058936201a7beffda1cf433845e82d64f8ff10f12f02170f6cd54bf17e396")) + (1428001, uint256S("0x00004f52d34d1d1d83c4b60788a43e699f23537b783caed2bb9134a6ef1bf24a")) + (1429001, uint256S("0x00001acdf07cf4d5fe39f85d6e9879a4d25b3f1119f1f4d5e7229a73f51bc983")) + (1430001, uint256S("0x00006150dc9c8d70436d55e819e80c7ab14465c43b911ae31735eb76586e4677")) + (1431001, uint256S("0x00001c9b62fefe1947c24f3cb5121cbc434f22618ca32515eff798936de283ff")) + (1432001, uint256S("0x00007edcce859c6f9421c16ae802928c7baa7dfdcf2a77907da448dcbf2d9f8f")) + (1433001, uint256S("0x000015805cabb3850d4e790c8e47a769340a336875d78ea8e9ddb7fe373b80e0")) + (1434001, uint256S("0x00005cc9862aafe279f2e79b47b3c377689e70665e3981d502d28b587d1d364a")) + (1435001, uint256S("0x0000157170e7cd4bf0fb241269b42fabedec4a21f6cab249fbd2597ac7d28119")) + (1436001, uint256S("0x00005a2aed8993ea24fab1b58be6b3d896f0e8e01512b3dee5488573145aa912")) + (1437001, uint256S("0x000026d69f50fd39f257f1f31d0d75de68dc434efda8275bbade0ef489a605ce")) + (1438001, uint256S("0x0000489926d7a983acbb7d4f9dc2d17e6f3ce20366ff7353f61e37f8b11aae59")) + (1439001, uint256S("0x00002eefa36963d949ba68b726220bd3dd1ac83e971e4c93bd9071c92370968a")) + (1440001, uint256S("0x00003bdbf602e745e7799ca12b3cf6ab0ea1dc80dfea47515b557f76e0e9f9e2")) + (1441001, uint256S("0x0000539d5d3a2c98a949bb6d8e175cc0fa227e34ec0fb3b833035df17d239f28")) + (1442001, uint256S("0x000018fad9d99f2932405d9a6d6b420eebc526e3cb15a5793ad1f0932a7b5ea9")) + // Generated via util/checkpoints.pl by onryo + (1443001, uint256S("0x00003ae5cd616ec493333da4b95fe116e9589a121bb191d9720de82788c97070")) + (1444001, uint256S("0x00003886dbb42fa8fc0e75d038aa91c463ae95b29e0d3eef6e4a5094fa5de7f5")) + (1445001, uint256S("0x000018aa3d20adbeec37744c584a42f9d1e8931fdce37560b3044b72e387714c")) + (1446001, uint256S("0x0000201102e244f19ade5b52b4ea743807ad75aef320754c8af56b862b593fe3")) + (1447001, uint256S("0x00005edaa2637560a641baf1f6cb271ab0d3260262f01c587c62b0726c7526b3")) + (1448001, uint256S("0x000076c801dfa3f8ce9b1f04a527a470d34d8435efe5db97e676e38b7e0ba421")) + (1449001, uint256S("0x0000771b9eceacef0984f1ffe14c49e2834d1114ac66f9c1626eb9050d068e92")) + (1450001, uint256S("0x000062a7f83443505e5766bc532f4530542569cacaf62576bfb279722483153b")) + (1451001, uint256S("0x00003eec73eb2bc9b8f1c326d42fab4a3e996d7a23ccfd348d99fb5d3358c35c")) + (1452001, uint256S("0x000036f785cbeba711a160ccf6f57cbe76f1377b72fa7be1116905b796b31063")) + (1453001, uint256S("0x0000165aca65a7b28a824e2d2bc6c26c4895863e3fa3443bb1b9c586113b13b7")) + (1454001, uint256S("0x0000567930f92baa8a40022115da4785fd19d54f8948b3748591cac1027fce0c")) + (1455001, uint256S("0x000040d28a22dba03d58500767f3b1bcfddde7dbf7f6249427180013b632a84e")) + (1456001, uint256S("0x00006418656e6570959fd2449313643233332c7da1a4a9dcc523fced7ed7a8a5")) + (1457001, uint256S("0x000035d64391017fab390748dd306cac4f047ae21aab9b53db82893403dadb0d")) + (1458001, uint256S("0x0000252221054719696df11c1d1c9b0eab505bd5fbeea76d9ffca3a18906798d")) + (1459001, uint256S("0x0000107fa0733e407067dc1705f3c414b8e261d43db9a0242658acc4c6953496")) + (1460001, uint256S("0x00003acc06dcbfc7768d026d964de892d54dbb5de8432149127d3e1fa4935e4f")) + (1461001, uint256S("0x000014ea19bdd915c44cddc262a46ca7bcf613f74902cb9e0e6b814fd8d0018c")) + (1462001, uint256S("0x000013651c4585a803e7380523c560dc49980d47e70ec3763cafed826c5cae42")) + (1463001, uint256S("0x00003dba6cd7180908ce0bedfd9db0b40f53ae81bc3c20f51c7dc000fc4819df")) + (1464001, uint256S("0x00002880167aef32966b9d9cb74820f6642eb1221c30d10010425ed0c9f44870")) + (1465001, uint256S("0x00002bd60f3b8e810353098a5e7f425a646f94e99ee759265edf6fb50235c6ad")) + (1466001, uint256S("0x00005b8ba8e4edb809d7e648e42a2c8c9129862b4b6c9a12dd0ebe26ce9c063c")) + (1467001, uint256S("0x0000429960097594f9ae7994766fbd6fff86f5df68f93eb4f16489b94514d75a")) + (1468001, uint256S("0x00001200ea8c3fc1c1a57f0f1e75bb6ead21bafab31e4f81a457cab16e647b1d")) + (1469001, uint256S("0x00006ab08a3bf7778daf8121f327b2d953e74673ad9e24dcbe5349f54bc84f92")) + (1470001, uint256S("0x0000300671461857edf492f481cd9473d96f4e7a06bf438f476f77bad582e137")) + (1471001, uint256S("0x000063743ff50e3bf3983ae5badac6f8aa25ece92bd8abefdfbedae276fa7b6d")) + (1472001, uint256S("0x00001111901ca529a08c3766d35e423768ebbd81ab4b6f4bbfc5e6459a2f4ea8")) + (1473001, uint256S("0x0000719694b894cc4050a415c4d214a2a3c3d1555add35b71921aa21a1854dbe")) + (1474001, uint256S("0x00002cad488cbd259db267b4d3f50c36f05ec7544744d0df9864f8bf15a7e1c5")) + (1475001, uint256S("0x0000051ab229c214de671bdccbc857ca1b8ffaf739c823d8a922bdd7a9279edd")) + (1476001, uint256S("0x0000475d1dde1b27c66ee14ac0cffc44c409aa78d9346e4b5cf513734552620d")) + (1477001, uint256S("0x00003037dd36553f6b3970f5e638619361b3e8451c5b9a5d910ea6a242a83741")) + (1478001, uint256S("0x000015f0b39d3092ba3c2ee340a094a9e86c0757824fc57e19891568aabeb5e0")) + (1479001, uint256S("0x00003872928abf5970206f5ccd9a8731a1ec39d43974d39b6a9f685ca333b505")) + (1480001, uint256S("0x00006e1d803fda490ae8a9d38a89087a1e6f6890d6e41e453ee8fd31deb1e1e9")) + (1481001, uint256S("0x0000320e13488b50f25907a79a27c968b8bf15cd00ad77208783a2a8cdc7ce23")) + (1482001, uint256S("0x00003ca846234f9547d94fc0588a52ddc3811eb60827e80d15aad5d9ed8c6830")) + (1483001, uint256S("0x000049d771a1ec7d2ce3380f9b9939ddbcb4ce3127a62531feefda13a5b23f5f")) + (1484001, uint256S("0x00003f7e31179b5c01d3570146a2a9cc8c35034aa3ace194a26cace42377de6f")) + (1485001, uint256S("0x000061cfc865775b5f5a13ecf7188d5d418639cabf7dbd734e1f397242c71994")) + (1486001, uint256S("0x00004a885f905489e66110d02c2fd3b9baa955f6401e8011bf1ff9e4ef60d7b8")) + (1487001, uint256S("0x0000421c21a35eea9fa557d9929de5f21226a463addcdecec7cb813d2bb705bb")) + (1488001, uint256S("0x000057970651451f81687af8b10c80337776697754d68f5b57f8ed242271ea12")) + (1489001, uint256S("0x0000006449d9359f5694c08dc9d2415142fed1b89f00b4e01e9bd370adffc389")) + (1490001, uint256S("0x00002d727a97d3dd9468d7af7dc1bf6dea9a6bad1d281a11d58c23c8eddc73a4")) + (1491001, uint256S("0x00003c2b11546c76c2661970b290c18dad0219cc2a915b2490ada1d698cfcbb3")) + (1492001, uint256S("0x00002a097755b92200ede1ee8d402e180564a9af24f5fe234dbf1d88f2945095")) + (1493001, uint256S("0x00001be532e2a88ac448a8169d5624d91ccc937e2da0fa42316ea7ac59ee61f5")) + (1494001, uint256S("0x0000546f213681169b3756b451f1c0e357519edd88842324262a33f1441eddf5")) + (1495001, uint256S("0x0000054d47b0a233bf8d292e80196e84227b5230a8b176f12dee34b607616fb1")) + (1496001, uint256S("0x00002e503f1482b32244532609433932d2c19a7fd094bceea5870dd2a8cf2936")) + (1497001, uint256S("0x0000115912293dd8ce050435c284b2c75fee5c219febb5a163083661b6625720")) + (1498001, uint256S("0x00002389bfd619753e7f3da1d5493a87b8828efe40313632cc71fb0f53683e3b")) + (1499001, uint256S("0x00005b3ba1964632f59cafb11bda2b21045dc565fd6049b143d58b22abe56a2f")) + (1500001, uint256S("0x00005429c8f75204b69dab19ef9f237ecbf68068ed99e0fd1516a5561bec7594")) + (1501001, uint256S("0x000011445d2cfb26089e1866b6f70ccc4a09e234f75faab1e30f4f9106945667")) + (1502001, uint256S("0x000042fe25f6dddaf59e34651027c28410d866fba5cce424e63224a7cbce270b")) + (1503001, uint256S("0x00005330b66ffb5c1eb1a77df2705d8a324ae3a616ed3f95459e876e93f5e52b")) + (1504001, uint256S("0x0000273d3b461f0841ae4992c9e5d70af02fcc96883286575a0e597b94ca348d")) + (1505001, uint256S("0x00001912d460d19d17552c369c68382cf3e16b2f5ea940244713cbdcef3a462c")) + (1506001, uint256S("0x00001846a70164d48b7dff8e1816ff98ca2978a4eb4b106dda8393f53f24ac87")) + (1507001, uint256S("0x000018bfb105d6c73f5077c57101df813f9a5cb365e16b27e6858cffee992d4d")) + (1508001, uint256S("0x000021638a6d2f31c8707fa8c42d932cd55edf42c10eb62ca82f295c702a055c")) + (1509001, uint256S("0x000016a52cf213ba126f43490ee45863b53a0f0fe783791825c2fa3d13b44c46")) + (1510001, uint256S("0x0000771d36501ca8c2a7108684fe6573100cad6db0b611c6d960bdb0b969612a")) + (1511001, uint256S("0x0000332ed86123c351d78f0e32ebafec3194808b8f9d52198a573d73fcab2290")) + (1512001, uint256S("0x000066680dc2c2c2c4477445362d6c2a19419d0ef20a97e90a80a2beb0e46feb")) + (1513001, uint256S("0x000036c6fa05becb14bd47bec314a56fcb4a2ca8d0002d304037ce80d29ef33e")) + (1514001, uint256S("0x00001133a141c6d57c0c329cab215c61f840a55b2be72029c2fe4a697f22029a")) + (1515001, uint256S("0x00004529db129ddc214abe159665b4bb1a08030ba9c6d93ba6afa1ef7042c13a")) + (1516001, uint256S("0x00002fd7245916f692503615673ff2a3e7bf1217a619677aa5ce569d0d97bd5b")) + (1517001, uint256S("0x00003e17ed7512102344ff322cf7760debd7d5e4393f457cf05ae3c48b890add")) + (1518001, uint256S("0x00005b1d3c236e3b265bb0852e613692c2a0e7e9b4e433844a1f3c03f281333d")) + (1519001, uint256S("0x00004d3aadcaad5c2912ec99078b589a538220dc62d64ba301f7cb653b6223d0")) + (1520001, uint256S("0x00001a5d6c2e2d06fe58b99d61158943eb06e54ba0de6f09795d9f2537b29fc7")) + (1521001, uint256S("0x000069cb5dbab98c4ff9c1dc52e7d6148ca4321eb7e09802a921005726771cd8")) + (1522001, uint256S("0x00005512969e922729b16a7786b5ed1ce5cfdb09aefd4c1605a936428ca2322e")) + (1523001, uint256S("0x000011bce4ff127be154f49d02ed26f47144718f0315870c0818df3904acc63b")) + (1524001, uint256S("0x00003f32d41c5a4a4f8292e297c40f0c87e139997774efd4efed98c3f65cd83c")) + (1525001, uint256S("0x000063e2c58568082571e625c21fd060d873d564efa206b777aa00bd4d38960e")) + (1526001, uint256S("0x00002ee50785c451e3d7335c5fc532efc9204ebe56761e57753c7d71d7dbbd34")) + (1527001, uint256S("0x00006f9b61a0b6924fb3697d8705bf3532b4d18cc2df3d87aa1c997962e018d2")) + (1528001, uint256S("0x00005ba4f99107484ec82b66fbdc828e5569ffb9f44175c482e3654408d0f627")) + (1529001, uint256S("0x00007da640949b0c508ee83649860eec403304d57a92b7ad429ed9357af7411a")) + (1530001, uint256S("0x00002ff2bd0eb881abf2092c4a079b3947b76bc0ae1f6aa5be826cf1c6f24039")) + (1531001, uint256S("0x0000149b4a6f94115dfa8e516e840613fd1fa1d795529c9a9d7a72fd3398a308")) + (1532001, uint256S("0x000031f64e31e8f13050126804d7d990448b7ec9e576f7e0c8145e73fd565429")) + (1533001, uint256S("0x00002526ada80e0fe77f99db0080905bee4ce8e5e5b375a2ac656f67dbcb05ce")) + (1534001, uint256S("0x00006fb2d393c09a80285a5d20bc79f7be0c60bf519e32ae60a94149c5df4802")) + (1535001, uint256S("0x00000facc420a2938d89819d6ae1c713cc3430e088879bbec24438ab0588299b")) + (1536001, uint256S("0x000036c149a381dfb2974bea8301ec57db92d8feafaed7c630551e7ba65c666a")) + (1537001, uint256S("0x000057c5da378621af2de6251dc86b6f04fbd76b45bc9615131a85507f70f3cf")) + (1538001, uint256S("0x00005663667197da68cc320c9c3804a3ed24db4b44ac15302848a5b2a3073457")) + (1539001, uint256S("0x00005f4a91dc51397c8aa8b9708b95d970d4810e50f2bd221b75180f6d8bdf52")) + (1540001, uint256S("0x0000495c5a39f0408557f61cb2cb9f2759b8cf3fa642f0bc0c62523906e04f0d")) + (1541001, uint256S("0x00005d10bfa886bdd5e4ac951ed3bca85d5500895cb942f7224581121a13ba91")) + (1542001, uint256S("0x00006fae0448e905b20a25652672bceb7797bebd9ff5a05da0a23b6e87ea4bc5")) + (1543001, uint256S("0x0000088cdda65a0331a004964aaf55e03767d92d0a97f4c9e2064aacbaa9c531")) + (1544001, uint256S("0x000003a6f22882e7938e382d0b4a51db45185a414aebc1d8292a51ac7145969f")) + (1545001, uint256S("0x00000c9cf58676f12f9af9adfe1a2bf54effb57c7e97fa1be7fb1600fcc6560e")) + (1546001, uint256S("0x000022a4c16f2b56b9b5c050b01198b0630494c0d1b1ab563a04f0e76f6785fb")) + (1547001, uint256S("0x00000854bb779df8d62e0325e55e873540530d8b3db6ccd9a7358a61a3d4e5b6")) + (1548001, uint256S("0x000015c60ae806a5b7e8a50a2efdadec7aa006d54bf59224545875fef5a311ec")) + (1549001, uint256S("0x000053f6eea61916e0cd7c23ebe151ed9eea74914222d54f418b94d9715054df")) + (1550001, uint256S("0x00000da588fb0d467d7b187d4ecfaf05c9984ef1caf085ff6428077a3d4d061c")) + (1551001, uint256S("0x00004592f49f35cdab412472537f4c713d470a942be1a75b9ce39cf1801ed281")) + (1552001, uint256S("0x00004e679aec828c233e59c938d2d3a0f5c33072667ef4ea2711c749330394ba")) + (1553001, uint256S("0x000033f34d2a73a857cc51020eca5332cbbda853ce79c26d5451fde9a94af4d6")) + (1554001, uint256S("0x00001f97dd7031cc6f7abc48bd306f083554d7fdabceeca088e43235a3349df4")) + (1555001, uint256S("0x00005c0ea1130e073ab01986825c07434301cbe775287baad0e1f48784c30df6")) + (1556001, uint256S("0x00005bf8cb343d399074711a0466d71d9ba1245a5b7a004c685d07c465d0bf91")) + (1557001, uint256S("0x00003e8d3620be3233e57121ba514bf055bc5c3fed5375f0bd355438f2fad1c7")) + (1558001, uint256S("0x000002bd96b4e2ba2c946c23b1a6266057f32d07786f9913d054133ddc4e7f02")) + (1559001, uint256S("0x00000a03a8c9c3da09d0362160971c76ce6e5dca57b4a0a8c51e807642253df8")) + (1560001, uint256S("0x0000726434cd7526dfe835d3abe650f46afa61df9b65d7c9f12637b9a21e7572")) + (1561001, uint256S("0x00004ccb2db6e7a6d42264c63bd3aeffab2f1f40810a22068451274f506a2321")) + (1562001, uint256S("0x00003389eae87150b120b71b7631c5ee73199693a711944595bb590c3b5bba3a")) + (1563001, uint256S("0x00000f87360a461280e9079bc3187805d0853b864ce259b5d4e98accb6a19a17")) + (1564001, uint256S("0x00000488b6defa35a2aa7601765b97de937e687ff4a81422535a3285b5cf3ed2")) + (1565001, uint256S("0x00000d32cdfc40ad219ee041f4c7efb621ff57c869ee112fb8ad3f3f020b7a07")) + (1566001, uint256S("0x00007dfd49f11512abc44df9db561083a5385fc362d4fc1341d5398c977587b4")) + (1567001, uint256S("0x0000804d66cfdee15400824b34b6c54f29eb144fe19dd3e29873772ee51e83bb")) + (1568001, uint256S("0x00006330514c9451e292b53187d8a258cef57c76ce337d330544f01888879f97")) + (1569001, uint256S("0x000048f26cecd2dfd07120ad003115e980ff0f483cfea3657b96e258474858b1")) + (1570001, uint256S("0x000005ba0d9dda890a779ebc7edbeb1b4528ebc992c398a1ec09c9dca86d99cf")) + (1571001, uint256S("0x00000237af22ecdc7a5e2df71b9ac43f259a9e613185eb5079a82a96e3199ff8")) + (1572001, uint256S("0x00007b47045391566656e1766d77fc5e3057faa298899b5b6ed7a0711ba98e65")) + (1573001, uint256S("0x00005cbbeb2063f70fd07a581a45f560ea21f808644a750cbc274f5458c8dea3")) + (1574001, uint256S("0x00000605e30b831d7b396b7357835b4160bad5694ad2c3f0d06605251845aae4")) + (1575001, uint256S("0x00006acf6a3a5cedcdc3d4422a1faafac655620f5f3210a039dfabded1de8557")) + (1576001, uint256S("0x00003e6f3d054cda9a558555068bf17aa53027ac8687aa8f0a2207cb9813dd3a")) + (1577001, uint256S("0x000045a2fea55bf36e503a019cc847ecb9369b36b744503c263e3a3cdeaaabec")) + (1578001, uint256S("0x00007c215294a850d12475204b4da6a824e7633c92e0c79ea6c73615b8febbfd")) + (1579001, uint256S("0x0000687182e172fc92cb097865c3e5e6d47b8b4203406a31f5ab5cf5a76ca492")) + (1580001, uint256S("0x00008bd85f0a4a35f18c38c25de8485110c69bc44dc294343e31d613332898ea")) + (1581001, uint256S("0x00007b4ef11786c55df6b312bad7960ca03700105f09a196e7786901a85d62cd")) + (1582001, uint256S("0x00003ee4fbc37f6e1fa87d44fb5022941543e80167f7303d6f99df74f65f78fa")) + (1583001, uint256S("0x0000452bd57134482f5deacb4513b242834bbc5300719e9403b01f8edeeb8475")) + (1584001, uint256S("0x0000382b298a66aaae4da55aa67b3e609b750ba7ad176c308b87a3ef7d86bdcb")) + (1585001, uint256S("0x00002721322d27bd6bb094c4628e9618f16d8efa2495253591a75f13606d39a0")) + (1586001, uint256S("0x00003ade30579d9ca9f4b9be950af2f4ceac75617c8438230998b9ff59985347")) + (1587001, uint256S("0x0000175e232696af43b8eed491336c40d528b2dc933d8716bba5f7ce42225a05")) + (1588001, uint256S("0x00005e257c9446229630546a8b6994b7223a87dd349dc3524a773ef8508bb498")) + (1589001, uint256S("0x000047e428d837736e67aca67287d820472f584299102d6f8ac6c6d0438c0e21")) + (1590001, uint256S("0x00002d12b428ed444c76b15e43de898cce6484be683d6949ebdfeff52b870773")) + (1591001, uint256S("0x000092468fa17bf053e86718b41782288146d5d452972a7bce7f0de0aad1d480")) + (1592001, uint256S("0x0000807a4e7215533d26a5287d0951795fa102c05090254ec0e296560b61da4a")) + (1593001, uint256S("0x00003fb5282953bdc3914ae8fc7008cebb468ae1839cc7021cd3f31705360467")) + (1594001, uint256S("0x00008f66c6c566f15d0d497f987d92d879c49035565fd5a6c5ee23fe8682b041")) + (1595001, uint256S("0x00005e280051b334ce081f3570cb0587d126b654a28636211af2c6fe34468288")) + (1596001, uint256S("0x000064f710f461a79987167d807e01f32de59deeb77e729a8a7fbb5279ab1a01")) + (1597001, uint256S("0x00004e6bb11a77f39a70ed1644147cc79efa1d254f6a607722b6873234c54260")) + (1598001, uint256S("0x00004b3bd14558aec1f33e632157aa846d5c193253d863a608ac8a9751cf879d")) + (1599001, uint256S("0x00003e6b38d84b34c9d473379e9a565c0c33d5e5d603c85e79c97868d3ce4ba2")) + (1600001, uint256S("0x00005f267aee0a05013f71d91e41a0e1eda490cdc67b67b353145cfecd7c3996")) + (1601001, uint256S("0x00000b0b6d67cb9db232192aef527016c0b4a53db3911bab50362f41d25baafd")) + (1602001, uint256S("0x0000355dd39ee9c9491747f2ec4149d64066c4e4e55e915cbb17be8bbb9fd808")) + (1603001, uint256S("0x000084eb8124569e6ad064ceba3abbe05183891a1866a578980b47f5f39fec2a")) + ,(int64_t) 1726135644, // time of last checkpointed block + (int64_t) 1648765, // total txs + (double) 2460 // txs in the last day before block 1603308 }; } else { // all other HSC's with no checkpoints From 243c72624302885c08dd047ede3a18bc458cb301 Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 12 Sep 2024 15:38:57 +0200 Subject: [PATCH 060/109] Update checkpoints for Hush and DragonX --- src/chainparams.cpp | 936 ++++++++++++++++++++++---------------------- 1 file changed, 468 insertions(+), 468 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index ddec52f71..87274739e 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -1995,7 +1995,7 @@ void *chainparams_commandline() { (1693000, uint256S("0x000000010dc70ae11c82e34000cd7d1a344bbf9fcf6344b3ac04f3173d1703d0")) (1694000, uint256S("0x000000027e5cb8c5bfd613100811708f7d180b994650d3ca6900a81683d50fa0")) (1695000, uint256S("0x000000014325867b388dc34843b695536eb9185c6782707f1c86edf0b5b89e9d")) - // Generated via util/checkpoints.pl by onryo + // Generated at 1726148271 via hush3 util/checkpoints.pl by onryo (1696000, uint256S("0x000000046385ad70b5c3de53eb6634836758eea4f7ee7b81a889f7201e27337d")) (1697000, uint256S("0x00000004bbef43e1ad19298dea05462d23e7de9482dfda72c8643cc5a73e3356")) (1698000, uint256S("0x00000000c7fa58a2b8420904097a9e02bc0b7aa9bc9e427ae1eed1908a150b0c")) @@ -2217,8 +2217,8 @@ void *chainparams_commandline() { (1914000, uint256S("0x0000000243fe84ebc7f9e6464ea68e938c3095e51561d168cac11e02da7dfffc")) (1915000, uint256S("0x0000000463ee472250bc95ddf1403ac7ce518cb52b4570c5bf53c7c055f718e0")) ,(int64_t) 1726139145, // time of last checkpointed block - (int64_t) 2777342, // total txs - (double) 1225 // txs in the last day before block 1915104 + (int64_t) 2777375, // total txs + (double) 1226 // txs in the last day before block 1915132 }; // END HUSH mainnet checkpoint data } else if (strcmp(SMART_CHAIN_SYMBOL,"DRAGONX") == 0) { @@ -3369,471 +3369,471 @@ void *chainparams_commandline() { (1140000, uint256S("0x0000012c87cc87745fe70667c7a2eca8b03dac27a8424b0830c06a18fdf9fc77")) (1141000, uint256S("0x00006bf655db63cb0e89eb631a25d198d80d593cd4d35c8c9de2b62003a8f4f2")) (1142000, uint256S("0x00000949c0348276363e0aabc6895b7a5298ba2ba1f003c2a4a23be5c6d843a7")) - (1143001, uint256S("0x00001abd4c98e1bf15a8a5b7f2908cc072f76282d2694a8f97c84a108fc9cade")) - (1144001, uint256S("0x0000677122f55f756851a0ff1d951adbd15e6f22c7e054eb82df3ae6b7d1c65a")) - (1145001, uint256S("0x00000723aa16de79783b33f823b54ba0e729659710a457b3ca99dd17c6967234")) - (1146001, uint256S("0x000026cf629ceebe1c5f280306cf1cd9890a191b1b4b0c89c4fe6e46f70d8509")) - (1147001, uint256S("0x000016ecd65ff3e639aa9a00e610227bcf146ca1f78429f746cc01cc4e7c8764")) - (1148001, uint256S("0x0000458a86d82550a227164747b3a813bb1f6b172b0e42474d8da0445b542f4a")) - (1149001, uint256S("0x00005ae3c68a2a8cd550fca77ec4b4597b78fdb3ff8f427865dcec0f154a40bf")) - (1150001, uint256S("0x000025c5a77b448bf2ac4327d924f5450f19ca0f7bac3de388df22dbf52835b6")) - (1151001, uint256S("0x000064729fd1605fc80a90bf4d23e905375f9399269db3a8784cdef7e8caab47")) - (1152001, uint256S("0x000064d56bc9953b33d81215d78c5228a595529bb5fd214a59faaf8d3382a286")) - (1153001, uint256S("0x00005b043439939b166c0d54c7faa9925e4f5ad5c2af46c7865fa370e195ecc0")) - (1154001, uint256S("0x00008458be9284abe412908997475f1be8394b886380e98549bc6d10ff1103ab")) - (1155001, uint256S("0x00003a9129c1c73bee787b575c7a0de6aa207e0b43d3ea04f76b0387b8139b7f")) - (1156001, uint256S("0x00000ed2d1d6c80e862c416cbd5d526d4e6548dc69fe888ec0c04d7ffef44b16")) - (1157001, uint256S("0x00003a0b695fac7eb96920c31b7c1117ec7bce9c34af1618e4708ae3aa3fc2e2")) - (1158001, uint256S("0x0000517efd45c0330e96b59a285a13c69fbf364bbf6de0064f8d1d717b8b7906")) - (1159001, uint256S("0x00001e9fb4129336f756d405234482b720da647d8b954c0b2983c8513e2679c0")) - (1160001, uint256S("0x00000414eb28cbaf79a980f4f6033533a69cb1d9a493384b81093338c3b818c8")) - (1161001, uint256S("0x00007ecc0a50f1669262a67663cafdbe21b179b1f2442b1a1de55ea918437616")) - (1162001, uint256S("0x0000285913069142cb802a7eb3e2dbbcf4d89ca26db9c902012de5ce4a88dc18")) - (1163001, uint256S("0x00001eadf1340ddee2d55a1811c4a57cb763757071cdf78d504c70d4f9bcc764")) - (1164001, uint256S("0x00007a5c216fea1f476a7fd0d2e73597222a5cbd5e6318f2f3858f29310a37c5")) - (1165001, uint256S("0x0000526d0ed9aa854dfc16c4c931c03eb3568cb38bff50ef663a0239e1d9d748")) - (1166001, uint256S("0x00004a3c7aac2f4a7fdfedfa24819b2e81eb0798b656ba58f459ca1e90c21f0d")) - (1167001, uint256S("0x000004df7b065d164352a3705db7b00b7eb47ad7fa384bb5827131592a558b3e")) - (1168001, uint256S("0x000037a669c7d4b19a944b84fa13c8073228f42ddb5889abf567713eb90dc9bc")) - (1169001, uint256S("0x0000650f1b56806fe937ed1f993332ebad3e92970dd1309d1090cbe83dc00fa2")) - (1170001, uint256S("0x0000615f821c71fa1e9f332292a46e0ffd1cc77985cdc4c996d9d16f072688f1")) - (1171001, uint256S("0x00001fde82b173365755362ae6b1a207b798b701c9fa44cde089178212e23561")) - (1172001, uint256S("0x000002c4e67744a5277887a0c417d4cf6bbd67dd9cc825b3144bc941add70a5c")) - (1173001, uint256S("0x000067dfef79d3d5e0b0a367cb1046bea132a7df1a3962e11402b81e4d76dc05")) - (1174001, uint256S("0x0000764f90e17841250a426c69453c996f8a44a0637b6b7957b1e00bca87500d")) - (1175001, uint256S("0x000000b206f9072c6cb91ba09835ad8c58d87dc9621360caf7b28bfbc43ceb47")) - (1176001, uint256S("0x00007f615188b267f2617d2da466219fc455ff157180e7863a01cb6957123368")) - (1177001, uint256S("0x0000546ff34077fe8504e1d6e8e014cd8c090f518015a30ac0dafae7da25a207")) - (1178001, uint256S("0x00003879ef75005910acd44aedca4a7108f066add8c13d5fbb5055900e0f20fd")) - (1179001, uint256S("0x00004ef5c971203fdaacb66fb6b38d233a870f4c8cc0453ae0446fc95ab04dce")) - (1180001, uint256S("0x00000eeeaf45be97ab442f6706956832a99a7c4603ac59195740ba834c33be12")) - (1181001, uint256S("0x0000274f9fc4f02a8b81af298e47e9fca930c3d96b269c1ab07f5c29ec5f4265")) - (1182001, uint256S("0x000063f52dfeab43a0bdc13a8308668cb364381e2a55bb9ab48aab4c70bc2a7c")) - (1183001, uint256S("0x00000572ee5c2741c95d0a54ee0305e5caf699e226f06025d1c43b09151c85d2")) - (1184001, uint256S("0x00001e5692fb146dbc91d610c8ecefef0585fe673ea46d2976174b28631ba099")) - (1185001, uint256S("0x00003a3fb0c42cf355db9bb2128707d1bbd36eff83d59555718768476c6bcddf")) - (1186001, uint256S("0x00000dbe5a1702118a3acfd58b4a3c602367bf863f041c674613b4254423c9fd")) - (1187001, uint256S("0x00003dd928d78c0764f0473a63610435f08b4b35e74a7d47ba278d800e01a3bf")) - (1188001, uint256S("0x00000b1799529d458d32f144eb93150e40df4ae89093a45b67b83d89188e4938")) - (1189001, uint256S("0x00003419dffd430b1c8666a4ddfe3ce404c370f8162ae462de72a1e603b79891")) - (1190001, uint256S("0x00005c40fac9d1b1fad12d8bc5a8e9b6d47922f13d19a6a8cedbd6815b683525")) - (1191001, uint256S("0x00004c48cf89bc4d8dd1eebf0e231770ffb627b8371ec80699399a7383573da3")) - (1192001, uint256S("0x00000fbe9557835e11b7c29749ab6c9b35392563ea67e31af7e4ed4092b5a01f")) - (1193001, uint256S("0x0000569ea55ecfc1d04d8b6d6854df2513e644b0071a37ee50d2cb730e370e88")) - (1194001, uint256S("0x00005dde3998a63acbed8ba8a0252df6a06f74d58f8e520713278ab70eb8d2a8")) - (1195001, uint256S("0x000050c03c4aa3d2b0040533100cb8468a9b613e2348c6888b92c07ca8988180")) - (1196001, uint256S("0x000044a77431cb8e5d19a79ab24e07e8b376e88a1e123e8e72cda2bcc6a168a0")) - (1197001, uint256S("0x000021a4bae3e8326bf14a2e224a8ad6b3556613c36de464550fe468073611e5")) - (1198001, uint256S("0x00003928a7fc32adaf1c10528b4e2bbf7e2ac3dd627ac681cb5e70db85bd5cc8")) - (1199001, uint256S("0x0000610cf21ff42b8c63edd7c3769e3bcfece6532d197fb7f3aeed685b7992ca")) - (1200001, uint256S("0x000033a19d6d012043cbb7d2da5950c4f6f3bffa624f832943b6de5133398945")) - (1201001, uint256S("0x00005d7372a501a9cb15fa7b6e12b8a1ef0467837424a00b2ebc471b80c01dbf")) - (1202001, uint256S("0x0000533d5baaa923bdddbc10334003bd9d9f143fb18ac6386c1e32a381e6098a")) - (1203001, uint256S("0x000069b0da4827f3b3918e6503f77335c395f851340241039de96ad753cfe78e")) - (1204001, uint256S("0x000044ddfd3428e3c913638b7371302cec40989c913b623d7140499ddef86411")) - (1205001, uint256S("0x0000007c2fd45b68214606e72cdbb36dcd7702b7b976eb4ed978668a31da5847")) - (1206001, uint256S("0x00001378479ba1a643ae7fb05164704c3f0722327121dee5d37eda304306a96d")) - (1207001, uint256S("0x0000044d769d79728c722514bab3cd5313c83436d20bbcf1ff5c08a528ab50e7")) - (1208001, uint256S("0x00000be3c944b34980d2fd473ba10914eb4ebdebab90cad52d3be249b4e8b70d")) - (1209001, uint256S("0x0000419af3555d3f5f2116eb18e2ef2bf4120a7f57d71926ade81bd77bc65b35")) - (1210001, uint256S("0x000031e4d59bf5f35cbeef138d7be9237d3d65dbe908ed6d346dce6bb9a6ff67")) - (1211001, uint256S("0x000049c0162af1724758333736b82f2b333b21286125d1ed24a428e6bfb2f74d")) - (1212001, uint256S("0x000062c9ead9fd9e95c1522685f4a3e94b9de13a9ca2ecdf1565b3b0efe1108d")) - (1213001, uint256S("0x00004626deb0fac82552db256555358fee783f1dc75d7a122cf50876ea722c8d")) - (1214001, uint256S("0x000007d502b97c80797f32e874f6ec04240bd9824f71e74910a5f49d85949a3e")) - (1215001, uint256S("0x000057f53ccb33fac98c599526dbd170f6c76d6c7711799d101c281da98dea1d")) - (1216001, uint256S("0x000043c2a43736c253a83c24b09358ffe95c6a33045dafc0b9ae8f624dac8be5")) - (1217001, uint256S("0x000024e1cc159476b8159874cf33e2ae930741de01ebd01cd958768fb5f0dd06")) - (1218001, uint256S("0x000066a3918749567e977ba76a80e592031c6e4963bf9b85daa7dd5951d270a6")) - (1219001, uint256S("0x0000499e32f029c586541dcdd48a875c3b9aee18ab02b7f68ba7ed2c35d46ced")) - (1220001, uint256S("0x000040ebb7d7a66a01a521e637ac95021dbfd8fc83fe027f265a9ccc54770529")) - (1221001, uint256S("0x00004d6556085fbb0b7aeaf8beed4b189ef9f3fa4389cec99b77211e892e42af")) - (1222001, uint256S("0x00004e3bde2225f125754054d2d18ba5e433a40ea8eb1f4166a946b1d69f0d71")) - (1223001, uint256S("0x00003341a82d5d8356a96b0258a65909718adb0b8ce74736c2139971065d4b83")) - (1224001, uint256S("0x000037bcfc844daa7fb38f3018b19dd25151d4fd7d743389618f8fe6aaa2e126")) - (1225001, uint256S("0x0000489a1623519a3c8986aa65867a07ec47609eb3ce00ebf83df4dec6272de0")) - (1226001, uint256S("0x00001c5e5d26782149ff2dbed31ce8e9b8dcffeb9e56a4355fc55e1b5bc60de3")) - (1227001, uint256S("0x0000021d8c76c81a5050ff5857bd3001899ef55760b938b06f6e5d739c97cc01")) - (1228001, uint256S("0x00002c6ee134604d000fcf2fdcedc8ab46fbd697915ee536ab5f762ddd03b63e")) - (1229001, uint256S("0x000009c9b6c004c95fbb94d40b48e814e62cacef93ce917cffb6e0ff361988f0")) - (1230001, uint256S("0x00001052997da57681d085278679c6a3db25ebf6fbf1061006a39f0d60db3f1e")) - (1231001, uint256S("0x00004cc25dee6994586151e05c78b7341f175d053adbc766664e3506dd76da2c")) - (1232001, uint256S("0x00007247d3621839a11a938f1f457b6afbfdd607e29558c60b583922f9ea5d87")) - (1233001, uint256S("0x000059eb3c4edc72ef3786c732145d011d0445b949a856b199f1e276b53ea3b2")) - (1234001, uint256S("0x00000749b569a827c46fba212c5672ba24477d871915750a2e7002c714f2f9b2")) - (1235001, uint256S("0x00002666317c8762ea40c8d3fdd4ec7a90c209c1f953e4c19725664de00e9a7a")) - (1236001, uint256S("0x00004e29fa8965b57c3c0ba11e8c2ccb95e655160965c3930174ea49bc8ff5f7")) - (1237001, uint256S("0x00003b27b7c661d643056a43e16a60daa45606a2c0b39ed438d129ec0ebe6c52")) - (1238001, uint256S("0x000041571dd8761157c56452ef09a3f1422f3b3222ab195d4a774100e2c4c3cd")) - (1239001, uint256S("0x000023fbfd57f93b7328705543a8f42417d4e5e4508b3aed52c933a14be57c2e")) - (1240001, uint256S("0x00002a1fa0064bd4d024ca053767a42ea042e24335d0051477b797f5bbfd96b1")) - (1241001, uint256S("0x00001d016ad4c50de53234fde26bf494d9c1d4a953842e9f86fabf9c59d5b12f")) - (1242001, uint256S("0x00001cea6b543b5c593d142335b40e27152af092286a20f694d769253140dd8d")) - (1243001, uint256S("0x0000262c6782fb509f697a0548f76cdb7dae2939879c12cd29effe13f377d534")) - (1244001, uint256S("0x00001405321dc4c8667e2bb01cfe58bd93a5b1b40da904a2c1f67a5bc83c901b")) - (1245001, uint256S("0x0000118f9b2fde7a207ea25de832bc592b34d6666816eab6ca5f9b34c7581943")) - (1246001, uint256S("0x0000026c2b282e9bf370a9b350db92d50c20d1caa808fbec2be0d33b5d94f84e")) - (1247001, uint256S("0x00003243581b108239c31f93a02e36e3af50db04022534ed5200fe2ef2606ccd")) - (1248001, uint256S("0x000017452920960ceb30a49921c82e497c4b20582d05fdc6cad76cfcd32634d1")) - (1249001, uint256S("0x000020ca7e5c1cecbf0d4e14d4dd2172bda7abc2fc048674dd072f4f1c77654b")) - (1250001, uint256S("0x00001352fb81040a0172a44fb77a329513cf7f396035687145b77f54e6c605cd")) - (1251001, uint256S("0x000027893ca9a5e591c2f6b677fbe0952e7d5f2803d21330e841a0f97e480b17")) - (1252001, uint256S("0x00001a8a62b572c18838754170e99e30e0e8705c49eacad6210297e384ded8e5")) - (1253001, uint256S("0x000012513953f82b638632738c564945b603c72d486c2dca4536f433354c2627")) - (1254001, uint256S("0x0000295838f99e15d44862bc6b39e82a57b144649c396a7a7fc198d8dea8c09b")) - (1255001, uint256S("0x00000e14e68977653f132cbad227f027752cf66ae8589bf225498c5c5e1c19ef")) - (1256001, uint256S("0x00000f272dad20436ddd0f337141ec34f80c36e5ef032664727474406457f6ba")) - (1257001, uint256S("0x000007c67ccad1d322ba151f0b0245c1afab86948dc9ca87e3964a44a2d69e20")) - (1258001, uint256S("0x00000ac96d7c3701367999022703758def11326b72457fcb780ecadccfc7a197")) - (1259001, uint256S("0x0000314af608527929517ec81c5b579c88d3abfd580fcbbae5462cdd83c6b6f6")) - (1260001, uint256S("0x0000154b647cf904e64c7035fb15f10fa538e92750176377fe84c76ff60b2dcb")) - (1261001, uint256S("0x0000362737f845970faa4037dc333ad7fde37ec128019e2aabaf12bda18dfa74")) - (1262001, uint256S("0x000056e8ad7e7d1432256ca364b152faa553209125714eb13da520aca8f6ce09")) - (1263001, uint256S("0x0000494ce9f3a4ac5ac6eaacfcb3cbf88e8fc53259851b9860aa6349a65aaff3")) - (1264001, uint256S("0x0000270ac41c84108dcf3ecee90c97bd20ed776104b4158e55b5d86a486bc32b")) - (1265001, uint256S("0x0000315fa7fc4e4c49ac33570dfac5d962dbadfdc8c32f35ee8adfcaac957e6d")) - (1266001, uint256S("0x000052a477a5eb26520b6949c2e6719d86dfc149fc50df072711ae95405b2cb9")) - (1267001, uint256S("0x000046127d16bd60624e7424a4487371963627ef00c1dea768db19ed859874e8")) - (1268001, uint256S("0x00005b3dcdb3a995ac67c9f5edfcf9ec6cd1230716691869f5b508058d67f4ee")) - (1269001, uint256S("0x000060261dde231947abd6f40aad1c9e4d5f19833b0bed59f83e2eef27413035")) - (1270001, uint256S("0x000016ed74b0614bae4d81fc26899551837974a88ceab1a7147cf702f12878d6")) - (1271001, uint256S("0x000045698a243ebce5ed179f989180c936866a405cd15c7d1be77b392a574d49")) - (1272001, uint256S("0x000047e389a5d7a67a99e55c29f70af08cc6686f4b25caa86e8ae7ea5d99cad5")) - (1273001, uint256S("0x0000001574d4ab3533e73dc66d746b3cbbb82fab8ce164ca6e36a81415b0311e")) - (1274001, uint256S("0x00000049ef25bbdd70bbc73a7e922fbcb86a728224379a65a917e426c95d9597")) - (1275001, uint256S("0x000003ebc81a7ab88e0cfd9f77a67dbab8787f5ea0ebd0c1f7c41a63cb835559")) - (1276001, uint256S("0x00003421af6b4375595bc997267403a4da7245deab6bdcde029bda0684405181")) - (1277001, uint256S("0x00004a00ae22fe91f0bd555f418e84c3e6f8c75123981c4c99b289dfc4d49d84")) - (1278001, uint256S("0x00004879afc45fa248901c573295e77858b0731ccdce5d76022c4e9a545bc6cc")) - (1279001, uint256S("0x000070323277e7e82525a21598030595ee4bce4f3269599f744fd2191d991591")) - (1280001, uint256S("0x0000224c3d2e0adabcdb728ab71285860c4baa2789cf8be153609a28c1953f1c")) - (1281001, uint256S("0x00002175db352f8b4c5de9242891f2fb2d4acc3b8064816f7fe83d7a5f74183a")) - (1282001, uint256S("0x00000e33eb505c4168190f2053e692ee95efd07863cb8192f1a6f92e557e4b16")) - (1283001, uint256S("0x000035059279eada1b5b96179815ca8925a7f4e03d804301181a4baa3bcd831c")) - (1284001, uint256S("0x0000025c5f7d4eb41b1380e6f31e9087e22c43cefb05a6e4a08fc2d60da4075c")) - (1285001, uint256S("0x0000333ace215c057a4e82a193664cc503baecdf8f983de15075289625648875")) - (1286001, uint256S("0x00004b34c14bd8f384d0c5d2d32572a944c7fe4a23c55191820d36c5d05455ef")) - (1287001, uint256S("0x00002bf96ba8ff07e31a06545a579f0c6336d2dbdcb6d6d36783bb771e45c5a2")) - (1288001, uint256S("0x0000503dceedd11092f2f94cadb40b92b14764cc7df46603444dfb87d22887b1")) - (1289001, uint256S("0x00000fb6e1c6238a32b630f5fd1c047602fb634de4ee30e07d710073498dcf9d")) - (1290001, uint256S("0x000050ac76f686071780f939c3c97b999b797c3df72671321a2b2ab5843ca975")) - (1291001, uint256S("0x00004ce9a4c1528259de922f84570a5579eba95f1594f388d7ef7917be01df8b")) - (1292001, uint256S("0x00001dd131239a6a9453abc5abc5bd6b4dd84f3e442704a644516cc467cb8a6a")) - (1293001, uint256S("0x0000452281140f0800c06657b76f300f36221414e3ebe2083452cf9ac2cec743")) - (1294001, uint256S("0x00001eb88277a4fad48dd769120c7ccfd9761fbc09c787fe0517b5575c175d10")) - (1295001, uint256S("0x0000013f7a147c8d66c2cfe3fefdb60984ae06806ceace737028ed5ad5c37cba")) - (1296001, uint256S("0x00004fbe7243fe8592aca6a20df6f1d61187134b315b7c5b540b5b24b58fc709")) - (1297001, uint256S("0x00002a7a71970969b8ca013ac787654bd91bb447b643dfde6867cace4f7db4e9")) - (1298001, uint256S("0x000021033d0b287925029ff2d4c2033803995ae9a67473193ea099b28c03a13b")) - (1299001, uint256S("0x00003d139f95eb9157337f9eabf4d3cbca085d747d23b695c160465600da2977")) - (1300001, uint256S("0x00001a5d0151c26c593ad912ba97a1d2566ef83ad5f8cebd4397b7f54567d525")) - (1301001, uint256S("0x00000ef71863b08bfe487c34373d6f4cb4b13d002a3ff20c0e446d126cd16d3b")) - (1302001, uint256S("0x00003ab3f07a1c9b2488a8359fe321f39a0f2669c557824c5a7e58208812b2ee")) - (1303001, uint256S("0x000015eaa78e0edd2c9b8f8675bcffbcfe98e7f704f9846bf96cc06857927392")) - (1304001, uint256S("0x00004689d50c55da8a66d525996c17e70d563e34dbf1a2064f16e1afa71f6d2c")) - (1305001, uint256S("0x00003a44b8ed9ecec074e284b7530829b3457f72fb2f2dda4af3f5f6fd69c41c")) - (1306001, uint256S("0x0000456875dc7a40abba45627d457b8eb2b936751c9623f8ef8d6cdd9cd6ba18")) - (1307001, uint256S("0x00001761444f1af954a876a913a5066161dd7260935b024573b4dd9e614a0841")) - (1308001, uint256S("0x00004a4b4d6e4b05efb3474567df8e6590d40c1e23fe61060d4a8e74c42ff18f")) - (1309001, uint256S("0x00001d80c185d5fc4022feef4c94f74e60e153062b7deb943d50fe51c52bcdf2")) - (1310001, uint256S("0x000014aa499e621f88ab20ddad566f66067f5278e23a6b64d9a3d7affda9dac8")) - (1311001, uint256S("0x000044c4a451f99a4c6b981371a48e2a0c83dc493d5cf60aff997cc93343e08b")) - (1312001, uint256S("0x0000397de8007b2f77900558d59e2973e811c05e406da396a5cbce2baf717ae8")) - (1313001, uint256S("0x00003db3982b012fe37cd63c3420b8395a052f0742b1f05b14ec216773309abd")) - (1314001, uint256S("0x000033fc1f1dcaaa70d3183bb82c0c090e58a58b5da08aa4f5869ec8393e97bf")) - (1315001, uint256S("0x00000fb293d47d303ea433fb0b65a4626ab04c752a39e62fc0504db5d1d16aed")) - (1316001, uint256S("0x0000323baab94f60bb12d04f18027adc98e1f6993bbc642d589f680e94d39253")) - (1317001, uint256S("0x00005bb0ae2b84430b13513db64ca088377e0e63af4627b050c197260c7e17fc")) - (1318001, uint256S("0x00004acf40901092615d0c9ff33e942e59675e97d74c55910338cd9dced066e1")) - (1319001, uint256S("0x00000298f14994ad1b3f5309058c4f21a24f5fec3fca09bedfc1391aa1cf7195")) - (1320001, uint256S("0x0000542bfba64246cc597b94353c665a9552f8b932b30937f27b5aad5b32652d")) - (1321001, uint256S("0x00004f7bd4aa3277df46ec8048c5e417c682209c93aaed83fb1843a5d2fe7d90")) - (1322001, uint256S("0x00002cb450e51c67588bb3c0b36c9a035a987ff51b47fa1cbbc42cbc987953b1")) - (1323001, uint256S("0x000007327afe42600c68baae7c9c874f288cc976de9f82aa33161c647aaf2130")) - (1324001, uint256S("0x0000021356b0709fc449243af1055ebb9e49f1d3ac2239c6fa9757e57125cc3e")) - (1325001, uint256S("0x000020c9f1c94a0685333143cf660ccb3a61f5584c776c713cc1424bc74390ac")) - (1326001, uint256S("0x000021f27a69865c8e03a40b6cf3b438dc5530c2701061c0a157e4ba83ff1376")) - (1327001, uint256S("0x00005d5a58376ce8d34e236382da56abb13058eb7a7048d65662b709456514cd")) - (1328001, uint256S("0x00000e7a2f66961089b63d04437f253ec2ae55f8549dfafee570c6ecbb614c92")) - (1329001, uint256S("0x000039ce6f82debbf547fdf2435c05a531e5880181db07a2897960c84a418562")) - (1330001, uint256S("0x0000130daf502eb85205c35f0e3ff02dc8b308c8e5e13993cc163523856a7a7b")) - (1331001, uint256S("0x0000098f3ed3c3faead955ad492ce1276da9df01e19a15b24edf70456e429c70")) - (1332001, uint256S("0x0000255b2fdea949756d26a73ba543e0788d22772cb1b67a2b0933464f53c6e0")) - (1333001, uint256S("0x000014b4af8e1ab2aa1d82830e2984a38c069d35f0077824366fdfdee734ccab")) - (1334001, uint256S("0x000041e4bab399251e6ee8bc136411947fc9f1d66fc5f7e123a6b7d91fc054bc")) - (1335001, uint256S("0x0000433277fddc51e76560405644dfbfa7b8efdfe70299faea44784b90527641")) - (1336001, uint256S("0x000046c35d7270d62712c87147fbdf6870788525eff770e1424e072b6352e4c6")) - (1337001, uint256S("0x000045d73f41bc1fa31077314ee315cd4f94de72743e23a805806f8999a90182")) - (1338001, uint256S("0x0000557a77ed50e278929675717fc42edc32787ccec48b3ce2e9bdb305974453")) - (1339001, uint256S("0x0000695cfec64501409750f06321ead6b29be25b99f96fa080f06c6a8ee31a78")) - (1340001, uint256S("0x00005b7fecb5054ac937049f16b35fec4ed1ba496de6fe76d6e6f66423a1731b")) - (1341001, uint256S("0x00007eece0f7d2355c2403a57a2e6a68196368a98fa1cfdae60f37210b459d74")) - (1342001, uint256S("0x000049efee05a2af62fa226f5bd9fade86326eddd2d15ed1448e94f0e0f8a53b")) - (1343001, uint256S("0x00000ee6499e0f79f2e0d3c5a275a6fbf40f811d4d2971aad14a3034edd13fc7")) - (1344001, uint256S("0x000007f9f27150e9602ef94dc496c079f6410e87de18324e36265db24e3364d9")) - (1345001, uint256S("0x0000237c706db93965a02500c7b27e858e275da03a54289f99a42bb05a22a1a8")) - (1346001, uint256S("0x0000217082b75f556a02de4117805709cf6c9e8895fa5413a15fcfd91084a84f")) - (1347001, uint256S("0x000019ddcbd85501e54469a10962066bce82e1371276bb7bb42ff5c9f7a576c3")) - (1348001, uint256S("0x00000bdc483cfe9ac1d336ba3dd85f8da0f9852e1d9fd7be0e9cb5276451b1b5")) - (1349001, uint256S("0x0000362fe61193f328113acf6ad929a7413778ff5ac5d5b6a77824d806aa0ce3")) - (1350001, uint256S("0x0000516556cb43341fc337bf1e79b9101bd1d00f5a15d4258d5865ae4e7b6c8c")) - (1351001, uint256S("0x000074242657b426f4d143c282114d5f9f06750ce0ef75866131d8dbd4ec9196")) - (1352001, uint256S("0x00001776c5d9954944597c4e3489b446c1fde4ccf4c03765e42103246a276279")) - (1353001, uint256S("0x00007dd053503bb5f8e6337de34dddf455f5426ea70a8b773c6513657a0179ed")) - (1354001, uint256S("0x0000674f697510449292eec82790ca973a2b654fdba34b8cdb75e92d8c0671aa")) - (1355001, uint256S("0x00003c5466874ad5f920641959e1d247164e1774c7c2d7a3c33a9ada630dcb7f")) - (1356001, uint256S("0x000038291f66676bb0d275c757a672fa71fb59ca6b28a6585e66cef4ddd23493")) - (1357001, uint256S("0x0000595ec97925232c8598afbf6560dead715a7a6aa6ea96ea7934802307ae75")) - (1358001, uint256S("0x000018faa3f856885d165b58a43a309785733f38f591421b200712297f722e20")) - (1359001, uint256S("0x0000448fbd2c27f48204a46744746aee7759c2724237b1ab2226204956f61a06")) - (1360001, uint256S("0x000006bd3d30cd6ab291b20b0e7f0d6ad072fcfc15a03b3f196b138b54f64742")) - (1361001, uint256S("0x0000046d40d4073870c8564bca4fb413ff2ff49917c8dded938b82e2a92777eb")) - (1362001, uint256S("0x0000066919c001c5a472db2c3c53c84cd245f215eb3fa999417e7342a7f47d7f")) - (1363001, uint256S("0x00002b8f020175c0e3b678e5f41479072bd9365f677bfdd9e5711d872df4ac1c")) - (1364001, uint256S("0x00006c35e0d50127de23ed1ea7a73542765f1ccb9a7b41ae4709202ac90eb8b4")) - (1365001, uint256S("0x00004d30f2a0987696cbbfd447997833696ca7da3a9cd24ae575fe7c50fdba93")) - (1366001, uint256S("0x00001f1f126f2b1d7ccf0848694f9fd826d53cce8c91a1a1ceab6f90682ff2e2")) - (1367001, uint256S("0x00001a9a57d78bb2ffe9dfd947cc78a97b7fb4e3daeb4261d17b29fe00f3d563")) - (1368001, uint256S("0x000055879821f00c97749cc07fd32e551dc798d59819eb0098c9cddba671a71d")) - (1369001, uint256S("0x000010f320b2872b8b7e0a0c4f4b0fb14c5cd6358e0a7c39fab2c187314998e3")) - (1370001, uint256S("0x000032575ad78d2b13e48617fbcb1d11b68c3de1a2e5c92238c841543947b3bd")) - (1371001, uint256S("0x00004b2c2e7e00e275e31e91cb9aa0bd254b6b03b361be6060a5313a55196110")) - (1372001, uint256S("0x00000782d0e0489804011163bf6e368ad1bf39a55acf062a9eed1b170945706a")) - (1373001, uint256S("0x0000349c0cb7ddaf965dec2d75cc42a8a4b4b760cdfa1c3b871933df1a857e83")) - (1374001, uint256S("0x0000562f7722aeda448707c590cddc870d6437babd7587b2ca30065d8b606ee7")) - (1375001, uint256S("0x000015fcf696bea9a885c339aaa918747c663a3c661b0501c1700525e9a4e970")) - (1376001, uint256S("0x0000532f707c6f5534b55d63d3da4a52f4c447b5a26db683db41a4bb0f1fae6e")) - (1377001, uint256S("0x00000e11d83be72dcc471e54f42f75480cad20088df1098db8de5ccd66bc5f04")) - (1378001, uint256S("0x00006aabb895d924fe4235ed9a519b444d9378296de965ad2ae0c7ad8e704834")) - (1379001, uint256S("0x00000d1046c297e26613782a0e76c889ad95d7f344ab6b60b3531f1d8ef2c645")) - (1380001, uint256S("0x0000485113c0956dfdae98ef64ef0761ff626dceee448bd8e39b667c51783464")) - (1381001, uint256S("0x00004dc48c32c10ae298816ff7b1245f0c7334b80c177a641ee8f93d7d4c985e")) - (1382001, uint256S("0x00002f9f8d407339c70846f1dbdd44808cafd00ec326e04deb99585c43149d9c")) - (1383001, uint256S("0x00003aa99eff8977c0699b1de278b449c1732b1f6340eb2e0c32f3631355ae7c")) - (1384001, uint256S("0x000010c44fd33a5f32be7fe99a6e1b5dd7af632c7074553ad3b2d901686a90e5")) - (1385001, uint256S("0x00005ec9479f0823485458118ffd708c6682d9e821f87593abec6904b24bbf9d")) - (1386001, uint256S("0x00005a81f0099ec877a38784bf090564aab1e017f8577219b85e333d2176ff2d")) - (1387001, uint256S("0x000053d28844ff4fe18c3a6f027e06bdb7c8c7f33cc2d6d8fe4f704a9fcfd655")) - (1388001, uint256S("0x00004f423e1a284f227dd8ad3d18885c069b11ccf8ca82b70fbe2934885d77d4")) - (1389001, uint256S("0x00002d75b9982e1cbe7098826348e539fef98d360527c60919c685d078d25d7c")) - (1390001, uint256S("0x0000253b0e75f4b8592e25c4b57941aaa9f47c03823c6fef1e5a632239f01731")) - (1391001, uint256S("0x0000104ee7ac72ea953e9fa62adf67de25d5f8b701f04644b2edc5791fa7fdfb")) - (1392001, uint256S("0x00001719850dffa41f3304b6ec9224a10605c84ef4683fabf40127cfc5ac6ba2")) - (1393001, uint256S("0x00003d74aa53a4cf640e388a0d887fa5ef5943c64089f48509d681628f2ddcc5")) - (1394001, uint256S("0x000015b2e8da9b9a5d4948ff1b1bf2c4b8d6a7513990337ef91217591f136a8b")) - (1395001, uint256S("0x000023085b832a406d3622e4faf08eaaad3efdaf0ef2e895396cde278a810083")) - (1396001, uint256S("0x000078c64a005d82e5cc93ded5a9c4b3fe32c8c3cd973966d99058aadbeff53b")) - (1397001, uint256S("0x0000325aeba5aa9d114c6bfe7ef71cdbffb8e1a72d1d3b3c551563d49f4b3f65")) - (1398001, uint256S("0x00006a69735e964e2d3197ff0ace47bda8e6c54beb17a7e477dacbe490654ae5")) - (1399001, uint256S("0x000039831862ebd93a351da7e92bbcab536eea4b50eb184e7bc12ab16c7a1115")) - (1400001, uint256S("0x000067a87a1666c42203c3040388cd506abbd6f57a794c2ee8649ff99ccc717e")) - (1401001, uint256S("0x00002a77cb9850819ddbd3e0fbd34de3168dd07d019b8776925c5cc7731cc48a")) - (1402001, uint256S("0x00002de878566b6c07b48382f987edab40de17ca691c7049efe59578445febe1")) - (1403001, uint256S("0x000067bbc69acd4aaffe077256782b411c42d4275875c4e180cf968652921d00")) - (1404001, uint256S("0x000068c8dfa4d1a6b5d0ece9325099eecbe1dadaca94da6c77150f2c1a2a69e0")) - (1405001, uint256S("0x00000300802bc034ad8c16e0b5e844f9be10e576a0a493b6822dc86e16e8301e")) - (1406001, uint256S("0x00004e3af686bc84c4ad0832d62acf2be719f838daa06c2c83e7809bf3184d3a")) - (1407001, uint256S("0x000013507ae3392e6a2c0f66f88c80705dcd4d37ac1f1f8d6ab3c8888e817e63")) - (1408001, uint256S("0x00005cd151ab2cbb3a0849b2718e3ac29f752038d4526a7a4ede79adac10ee17")) - (1409001, uint256S("0x00005a8a3d4117feecfb6142f4ac6aa5d325a94f5ca49658b63c609846d97a49")) - (1410001, uint256S("0x00002511474edf646a85f88ce0983f252728226af9270726e012177d68443196")) - (1411001, uint256S("0x000086ebc22cdfe2511a5f4f75593af71fcc572d411612e3e228cb981c5760e7")) - (1412001, uint256S("0x00005d61f01e4f780215b8c37a85f74f91add060df0ea7c7ea8229e9d073c825")) - (1413001, uint256S("0x00005acc20c5d6dc157630aba65fabd5438025691e0fe5a652ef2151463767d1")) - (1414001, uint256S("0x00000a6b47f923541ce75aa9d8ad7bc5ad38ddc25d0aedacf554149687d73266")) - (1415001, uint256S("0x0000346405be8c41cf267d79fab3198ac93491f01c35e8e27423d52e0cc1b826")) - (1416001, uint256S("0x000042f8da5e57f9a8c106b9b8b6ff265d6db1dcc6f6d8fc2d49d3812b152fab")) - (1417001, uint256S("0x00000ab99656026c91a8510f178bf19108c104fe1071f7c011f0c8dca7c28d79")) - (1418001, uint256S("0x000029f91d21ef26f0e13ee4c38dfb0e0acaf12119f2a7cefb1d21b8fabb1d59")) - (1419001, uint256S("0x00000749b6d2231c3f24a6c173d35079482bf96139c6c9e25ba4d40aff186589")) - (1420001, uint256S("0x000084ca741a042521c5f9f5580a89c10e1bfd8ff132505f70204bb967e2ecd2")) - (1421001, uint256S("0x00004e898bf961234eef02b1f9923b7698fd09780679723c8d99856c66fbae97")) - (1422001, uint256S("0x00000afe4ace6f9356fe4fbf49b5612438cd95b4834a453485ad5e34f4db3a85")) - (1423001, uint256S("0x000071a235fbcfcab3b4d43fa4b935b8595c605362248109845a0b8fca28b355")) - (1424001, uint256S("0x00004b1a9ebe512de37594b2e6591ef417ab6afcee76b0f3d8b9b6cc9139fc0c")) - (1425001, uint256S("0x00002fc4d8e33697095aa54a7adfe3f03c57269bed37e4bc9f959df1f783cf94")) - (1426001, uint256S("0x00005451c0d4b8e52274fe6257bb9545a01fc718ee26fa4a66437e1ba69b25b6")) - (1427001, uint256S("0x000058936201a7beffda1cf433845e82d64f8ff10f12f02170f6cd54bf17e396")) - (1428001, uint256S("0x00004f52d34d1d1d83c4b60788a43e699f23537b783caed2bb9134a6ef1bf24a")) - (1429001, uint256S("0x00001acdf07cf4d5fe39f85d6e9879a4d25b3f1119f1f4d5e7229a73f51bc983")) - (1430001, uint256S("0x00006150dc9c8d70436d55e819e80c7ab14465c43b911ae31735eb76586e4677")) - (1431001, uint256S("0x00001c9b62fefe1947c24f3cb5121cbc434f22618ca32515eff798936de283ff")) - (1432001, uint256S("0x00007edcce859c6f9421c16ae802928c7baa7dfdcf2a77907da448dcbf2d9f8f")) - (1433001, uint256S("0x000015805cabb3850d4e790c8e47a769340a336875d78ea8e9ddb7fe373b80e0")) - (1434001, uint256S("0x00005cc9862aafe279f2e79b47b3c377689e70665e3981d502d28b587d1d364a")) - (1435001, uint256S("0x0000157170e7cd4bf0fb241269b42fabedec4a21f6cab249fbd2597ac7d28119")) - (1436001, uint256S("0x00005a2aed8993ea24fab1b58be6b3d896f0e8e01512b3dee5488573145aa912")) - (1437001, uint256S("0x000026d69f50fd39f257f1f31d0d75de68dc434efda8275bbade0ef489a605ce")) - (1438001, uint256S("0x0000489926d7a983acbb7d4f9dc2d17e6f3ce20366ff7353f61e37f8b11aae59")) - (1439001, uint256S("0x00002eefa36963d949ba68b726220bd3dd1ac83e971e4c93bd9071c92370968a")) - (1440001, uint256S("0x00003bdbf602e745e7799ca12b3cf6ab0ea1dc80dfea47515b557f76e0e9f9e2")) - (1441001, uint256S("0x0000539d5d3a2c98a949bb6d8e175cc0fa227e34ec0fb3b833035df17d239f28")) - (1442001, uint256S("0x000018fad9d99f2932405d9a6d6b420eebc526e3cb15a5793ad1f0932a7b5ea9")) - // Generated via util/checkpoints.pl by onryo - (1443001, uint256S("0x00003ae5cd616ec493333da4b95fe116e9589a121bb191d9720de82788c97070")) - (1444001, uint256S("0x00003886dbb42fa8fc0e75d038aa91c463ae95b29e0d3eef6e4a5094fa5de7f5")) - (1445001, uint256S("0x000018aa3d20adbeec37744c584a42f9d1e8931fdce37560b3044b72e387714c")) - (1446001, uint256S("0x0000201102e244f19ade5b52b4ea743807ad75aef320754c8af56b862b593fe3")) - (1447001, uint256S("0x00005edaa2637560a641baf1f6cb271ab0d3260262f01c587c62b0726c7526b3")) - (1448001, uint256S("0x000076c801dfa3f8ce9b1f04a527a470d34d8435efe5db97e676e38b7e0ba421")) - (1449001, uint256S("0x0000771b9eceacef0984f1ffe14c49e2834d1114ac66f9c1626eb9050d068e92")) - (1450001, uint256S("0x000062a7f83443505e5766bc532f4530542569cacaf62576bfb279722483153b")) - (1451001, uint256S("0x00003eec73eb2bc9b8f1c326d42fab4a3e996d7a23ccfd348d99fb5d3358c35c")) - (1452001, uint256S("0x000036f785cbeba711a160ccf6f57cbe76f1377b72fa7be1116905b796b31063")) - (1453001, uint256S("0x0000165aca65a7b28a824e2d2bc6c26c4895863e3fa3443bb1b9c586113b13b7")) - (1454001, uint256S("0x0000567930f92baa8a40022115da4785fd19d54f8948b3748591cac1027fce0c")) - (1455001, uint256S("0x000040d28a22dba03d58500767f3b1bcfddde7dbf7f6249427180013b632a84e")) - (1456001, uint256S("0x00006418656e6570959fd2449313643233332c7da1a4a9dcc523fced7ed7a8a5")) - (1457001, uint256S("0x000035d64391017fab390748dd306cac4f047ae21aab9b53db82893403dadb0d")) - (1458001, uint256S("0x0000252221054719696df11c1d1c9b0eab505bd5fbeea76d9ffca3a18906798d")) - (1459001, uint256S("0x0000107fa0733e407067dc1705f3c414b8e261d43db9a0242658acc4c6953496")) - (1460001, uint256S("0x00003acc06dcbfc7768d026d964de892d54dbb5de8432149127d3e1fa4935e4f")) - (1461001, uint256S("0x000014ea19bdd915c44cddc262a46ca7bcf613f74902cb9e0e6b814fd8d0018c")) - (1462001, uint256S("0x000013651c4585a803e7380523c560dc49980d47e70ec3763cafed826c5cae42")) - (1463001, uint256S("0x00003dba6cd7180908ce0bedfd9db0b40f53ae81bc3c20f51c7dc000fc4819df")) - (1464001, uint256S("0x00002880167aef32966b9d9cb74820f6642eb1221c30d10010425ed0c9f44870")) - (1465001, uint256S("0x00002bd60f3b8e810353098a5e7f425a646f94e99ee759265edf6fb50235c6ad")) - (1466001, uint256S("0x00005b8ba8e4edb809d7e648e42a2c8c9129862b4b6c9a12dd0ebe26ce9c063c")) - (1467001, uint256S("0x0000429960097594f9ae7994766fbd6fff86f5df68f93eb4f16489b94514d75a")) - (1468001, uint256S("0x00001200ea8c3fc1c1a57f0f1e75bb6ead21bafab31e4f81a457cab16e647b1d")) - (1469001, uint256S("0x00006ab08a3bf7778daf8121f327b2d953e74673ad9e24dcbe5349f54bc84f92")) - (1470001, uint256S("0x0000300671461857edf492f481cd9473d96f4e7a06bf438f476f77bad582e137")) - (1471001, uint256S("0x000063743ff50e3bf3983ae5badac6f8aa25ece92bd8abefdfbedae276fa7b6d")) - (1472001, uint256S("0x00001111901ca529a08c3766d35e423768ebbd81ab4b6f4bbfc5e6459a2f4ea8")) - (1473001, uint256S("0x0000719694b894cc4050a415c4d214a2a3c3d1555add35b71921aa21a1854dbe")) - (1474001, uint256S("0x00002cad488cbd259db267b4d3f50c36f05ec7544744d0df9864f8bf15a7e1c5")) - (1475001, uint256S("0x0000051ab229c214de671bdccbc857ca1b8ffaf739c823d8a922bdd7a9279edd")) - (1476001, uint256S("0x0000475d1dde1b27c66ee14ac0cffc44c409aa78d9346e4b5cf513734552620d")) - (1477001, uint256S("0x00003037dd36553f6b3970f5e638619361b3e8451c5b9a5d910ea6a242a83741")) - (1478001, uint256S("0x000015f0b39d3092ba3c2ee340a094a9e86c0757824fc57e19891568aabeb5e0")) - (1479001, uint256S("0x00003872928abf5970206f5ccd9a8731a1ec39d43974d39b6a9f685ca333b505")) - (1480001, uint256S("0x00006e1d803fda490ae8a9d38a89087a1e6f6890d6e41e453ee8fd31deb1e1e9")) - (1481001, uint256S("0x0000320e13488b50f25907a79a27c968b8bf15cd00ad77208783a2a8cdc7ce23")) - (1482001, uint256S("0x00003ca846234f9547d94fc0588a52ddc3811eb60827e80d15aad5d9ed8c6830")) - (1483001, uint256S("0x000049d771a1ec7d2ce3380f9b9939ddbcb4ce3127a62531feefda13a5b23f5f")) - (1484001, uint256S("0x00003f7e31179b5c01d3570146a2a9cc8c35034aa3ace194a26cace42377de6f")) - (1485001, uint256S("0x000061cfc865775b5f5a13ecf7188d5d418639cabf7dbd734e1f397242c71994")) - (1486001, uint256S("0x00004a885f905489e66110d02c2fd3b9baa955f6401e8011bf1ff9e4ef60d7b8")) - (1487001, uint256S("0x0000421c21a35eea9fa557d9929de5f21226a463addcdecec7cb813d2bb705bb")) - (1488001, uint256S("0x000057970651451f81687af8b10c80337776697754d68f5b57f8ed242271ea12")) - (1489001, uint256S("0x0000006449d9359f5694c08dc9d2415142fed1b89f00b4e01e9bd370adffc389")) - (1490001, uint256S("0x00002d727a97d3dd9468d7af7dc1bf6dea9a6bad1d281a11d58c23c8eddc73a4")) - (1491001, uint256S("0x00003c2b11546c76c2661970b290c18dad0219cc2a915b2490ada1d698cfcbb3")) - (1492001, uint256S("0x00002a097755b92200ede1ee8d402e180564a9af24f5fe234dbf1d88f2945095")) - (1493001, uint256S("0x00001be532e2a88ac448a8169d5624d91ccc937e2da0fa42316ea7ac59ee61f5")) - (1494001, uint256S("0x0000546f213681169b3756b451f1c0e357519edd88842324262a33f1441eddf5")) - (1495001, uint256S("0x0000054d47b0a233bf8d292e80196e84227b5230a8b176f12dee34b607616fb1")) - (1496001, uint256S("0x00002e503f1482b32244532609433932d2c19a7fd094bceea5870dd2a8cf2936")) - (1497001, uint256S("0x0000115912293dd8ce050435c284b2c75fee5c219febb5a163083661b6625720")) - (1498001, uint256S("0x00002389bfd619753e7f3da1d5493a87b8828efe40313632cc71fb0f53683e3b")) - (1499001, uint256S("0x00005b3ba1964632f59cafb11bda2b21045dc565fd6049b143d58b22abe56a2f")) - (1500001, uint256S("0x00005429c8f75204b69dab19ef9f237ecbf68068ed99e0fd1516a5561bec7594")) - (1501001, uint256S("0x000011445d2cfb26089e1866b6f70ccc4a09e234f75faab1e30f4f9106945667")) - (1502001, uint256S("0x000042fe25f6dddaf59e34651027c28410d866fba5cce424e63224a7cbce270b")) - (1503001, uint256S("0x00005330b66ffb5c1eb1a77df2705d8a324ae3a616ed3f95459e876e93f5e52b")) - (1504001, uint256S("0x0000273d3b461f0841ae4992c9e5d70af02fcc96883286575a0e597b94ca348d")) - (1505001, uint256S("0x00001912d460d19d17552c369c68382cf3e16b2f5ea940244713cbdcef3a462c")) - (1506001, uint256S("0x00001846a70164d48b7dff8e1816ff98ca2978a4eb4b106dda8393f53f24ac87")) - (1507001, uint256S("0x000018bfb105d6c73f5077c57101df813f9a5cb365e16b27e6858cffee992d4d")) - (1508001, uint256S("0x000021638a6d2f31c8707fa8c42d932cd55edf42c10eb62ca82f295c702a055c")) - (1509001, uint256S("0x000016a52cf213ba126f43490ee45863b53a0f0fe783791825c2fa3d13b44c46")) - (1510001, uint256S("0x0000771d36501ca8c2a7108684fe6573100cad6db0b611c6d960bdb0b969612a")) - (1511001, uint256S("0x0000332ed86123c351d78f0e32ebafec3194808b8f9d52198a573d73fcab2290")) - (1512001, uint256S("0x000066680dc2c2c2c4477445362d6c2a19419d0ef20a97e90a80a2beb0e46feb")) - (1513001, uint256S("0x000036c6fa05becb14bd47bec314a56fcb4a2ca8d0002d304037ce80d29ef33e")) - (1514001, uint256S("0x00001133a141c6d57c0c329cab215c61f840a55b2be72029c2fe4a697f22029a")) - (1515001, uint256S("0x00004529db129ddc214abe159665b4bb1a08030ba9c6d93ba6afa1ef7042c13a")) - (1516001, uint256S("0x00002fd7245916f692503615673ff2a3e7bf1217a619677aa5ce569d0d97bd5b")) - (1517001, uint256S("0x00003e17ed7512102344ff322cf7760debd7d5e4393f457cf05ae3c48b890add")) - (1518001, uint256S("0x00005b1d3c236e3b265bb0852e613692c2a0e7e9b4e433844a1f3c03f281333d")) - (1519001, uint256S("0x00004d3aadcaad5c2912ec99078b589a538220dc62d64ba301f7cb653b6223d0")) - (1520001, uint256S("0x00001a5d6c2e2d06fe58b99d61158943eb06e54ba0de6f09795d9f2537b29fc7")) - (1521001, uint256S("0x000069cb5dbab98c4ff9c1dc52e7d6148ca4321eb7e09802a921005726771cd8")) - (1522001, uint256S("0x00005512969e922729b16a7786b5ed1ce5cfdb09aefd4c1605a936428ca2322e")) - (1523001, uint256S("0x000011bce4ff127be154f49d02ed26f47144718f0315870c0818df3904acc63b")) - (1524001, uint256S("0x00003f32d41c5a4a4f8292e297c40f0c87e139997774efd4efed98c3f65cd83c")) - (1525001, uint256S("0x000063e2c58568082571e625c21fd060d873d564efa206b777aa00bd4d38960e")) - (1526001, uint256S("0x00002ee50785c451e3d7335c5fc532efc9204ebe56761e57753c7d71d7dbbd34")) - (1527001, uint256S("0x00006f9b61a0b6924fb3697d8705bf3532b4d18cc2df3d87aa1c997962e018d2")) - (1528001, uint256S("0x00005ba4f99107484ec82b66fbdc828e5569ffb9f44175c482e3654408d0f627")) - (1529001, uint256S("0x00007da640949b0c508ee83649860eec403304d57a92b7ad429ed9357af7411a")) - (1530001, uint256S("0x00002ff2bd0eb881abf2092c4a079b3947b76bc0ae1f6aa5be826cf1c6f24039")) - (1531001, uint256S("0x0000149b4a6f94115dfa8e516e840613fd1fa1d795529c9a9d7a72fd3398a308")) - (1532001, uint256S("0x000031f64e31e8f13050126804d7d990448b7ec9e576f7e0c8145e73fd565429")) - (1533001, uint256S("0x00002526ada80e0fe77f99db0080905bee4ce8e5e5b375a2ac656f67dbcb05ce")) - (1534001, uint256S("0x00006fb2d393c09a80285a5d20bc79f7be0c60bf519e32ae60a94149c5df4802")) - (1535001, uint256S("0x00000facc420a2938d89819d6ae1c713cc3430e088879bbec24438ab0588299b")) - (1536001, uint256S("0x000036c149a381dfb2974bea8301ec57db92d8feafaed7c630551e7ba65c666a")) - (1537001, uint256S("0x000057c5da378621af2de6251dc86b6f04fbd76b45bc9615131a85507f70f3cf")) - (1538001, uint256S("0x00005663667197da68cc320c9c3804a3ed24db4b44ac15302848a5b2a3073457")) - (1539001, uint256S("0x00005f4a91dc51397c8aa8b9708b95d970d4810e50f2bd221b75180f6d8bdf52")) - (1540001, uint256S("0x0000495c5a39f0408557f61cb2cb9f2759b8cf3fa642f0bc0c62523906e04f0d")) - (1541001, uint256S("0x00005d10bfa886bdd5e4ac951ed3bca85d5500895cb942f7224581121a13ba91")) - (1542001, uint256S("0x00006fae0448e905b20a25652672bceb7797bebd9ff5a05da0a23b6e87ea4bc5")) - (1543001, uint256S("0x0000088cdda65a0331a004964aaf55e03767d92d0a97f4c9e2064aacbaa9c531")) - (1544001, uint256S("0x000003a6f22882e7938e382d0b4a51db45185a414aebc1d8292a51ac7145969f")) - (1545001, uint256S("0x00000c9cf58676f12f9af9adfe1a2bf54effb57c7e97fa1be7fb1600fcc6560e")) - (1546001, uint256S("0x000022a4c16f2b56b9b5c050b01198b0630494c0d1b1ab563a04f0e76f6785fb")) - (1547001, uint256S("0x00000854bb779df8d62e0325e55e873540530d8b3db6ccd9a7358a61a3d4e5b6")) - (1548001, uint256S("0x000015c60ae806a5b7e8a50a2efdadec7aa006d54bf59224545875fef5a311ec")) - (1549001, uint256S("0x000053f6eea61916e0cd7c23ebe151ed9eea74914222d54f418b94d9715054df")) - (1550001, uint256S("0x00000da588fb0d467d7b187d4ecfaf05c9984ef1caf085ff6428077a3d4d061c")) - (1551001, uint256S("0x00004592f49f35cdab412472537f4c713d470a942be1a75b9ce39cf1801ed281")) - (1552001, uint256S("0x00004e679aec828c233e59c938d2d3a0f5c33072667ef4ea2711c749330394ba")) - (1553001, uint256S("0x000033f34d2a73a857cc51020eca5332cbbda853ce79c26d5451fde9a94af4d6")) - (1554001, uint256S("0x00001f97dd7031cc6f7abc48bd306f083554d7fdabceeca088e43235a3349df4")) - (1555001, uint256S("0x00005c0ea1130e073ab01986825c07434301cbe775287baad0e1f48784c30df6")) - (1556001, uint256S("0x00005bf8cb343d399074711a0466d71d9ba1245a5b7a004c685d07c465d0bf91")) - (1557001, uint256S("0x00003e8d3620be3233e57121ba514bf055bc5c3fed5375f0bd355438f2fad1c7")) - (1558001, uint256S("0x000002bd96b4e2ba2c946c23b1a6266057f32d07786f9913d054133ddc4e7f02")) - (1559001, uint256S("0x00000a03a8c9c3da09d0362160971c76ce6e5dca57b4a0a8c51e807642253df8")) - (1560001, uint256S("0x0000726434cd7526dfe835d3abe650f46afa61df9b65d7c9f12637b9a21e7572")) - (1561001, uint256S("0x00004ccb2db6e7a6d42264c63bd3aeffab2f1f40810a22068451274f506a2321")) - (1562001, uint256S("0x00003389eae87150b120b71b7631c5ee73199693a711944595bb590c3b5bba3a")) - (1563001, uint256S("0x00000f87360a461280e9079bc3187805d0853b864ce259b5d4e98accb6a19a17")) - (1564001, uint256S("0x00000488b6defa35a2aa7601765b97de937e687ff4a81422535a3285b5cf3ed2")) - (1565001, uint256S("0x00000d32cdfc40ad219ee041f4c7efb621ff57c869ee112fb8ad3f3f020b7a07")) - (1566001, uint256S("0x00007dfd49f11512abc44df9db561083a5385fc362d4fc1341d5398c977587b4")) - (1567001, uint256S("0x0000804d66cfdee15400824b34b6c54f29eb144fe19dd3e29873772ee51e83bb")) - (1568001, uint256S("0x00006330514c9451e292b53187d8a258cef57c76ce337d330544f01888879f97")) - (1569001, uint256S("0x000048f26cecd2dfd07120ad003115e980ff0f483cfea3657b96e258474858b1")) - (1570001, uint256S("0x000005ba0d9dda890a779ebc7edbeb1b4528ebc992c398a1ec09c9dca86d99cf")) - (1571001, uint256S("0x00000237af22ecdc7a5e2df71b9ac43f259a9e613185eb5079a82a96e3199ff8")) - (1572001, uint256S("0x00007b47045391566656e1766d77fc5e3057faa298899b5b6ed7a0711ba98e65")) - (1573001, uint256S("0x00005cbbeb2063f70fd07a581a45f560ea21f808644a750cbc274f5458c8dea3")) - (1574001, uint256S("0x00000605e30b831d7b396b7357835b4160bad5694ad2c3f0d06605251845aae4")) - (1575001, uint256S("0x00006acf6a3a5cedcdc3d4422a1faafac655620f5f3210a039dfabded1de8557")) - (1576001, uint256S("0x00003e6f3d054cda9a558555068bf17aa53027ac8687aa8f0a2207cb9813dd3a")) - (1577001, uint256S("0x000045a2fea55bf36e503a019cc847ecb9369b36b744503c263e3a3cdeaaabec")) - (1578001, uint256S("0x00007c215294a850d12475204b4da6a824e7633c92e0c79ea6c73615b8febbfd")) - (1579001, uint256S("0x0000687182e172fc92cb097865c3e5e6d47b8b4203406a31f5ab5cf5a76ca492")) - (1580001, uint256S("0x00008bd85f0a4a35f18c38c25de8485110c69bc44dc294343e31d613332898ea")) - (1581001, uint256S("0x00007b4ef11786c55df6b312bad7960ca03700105f09a196e7786901a85d62cd")) - (1582001, uint256S("0x00003ee4fbc37f6e1fa87d44fb5022941543e80167f7303d6f99df74f65f78fa")) - (1583001, uint256S("0x0000452bd57134482f5deacb4513b242834bbc5300719e9403b01f8edeeb8475")) - (1584001, uint256S("0x0000382b298a66aaae4da55aa67b3e609b750ba7ad176c308b87a3ef7d86bdcb")) - (1585001, uint256S("0x00002721322d27bd6bb094c4628e9618f16d8efa2495253591a75f13606d39a0")) - (1586001, uint256S("0x00003ade30579d9ca9f4b9be950af2f4ceac75617c8438230998b9ff59985347")) - (1587001, uint256S("0x0000175e232696af43b8eed491336c40d528b2dc933d8716bba5f7ce42225a05")) - (1588001, uint256S("0x00005e257c9446229630546a8b6994b7223a87dd349dc3524a773ef8508bb498")) - (1589001, uint256S("0x000047e428d837736e67aca67287d820472f584299102d6f8ac6c6d0438c0e21")) - (1590001, uint256S("0x00002d12b428ed444c76b15e43de898cce6484be683d6949ebdfeff52b870773")) - (1591001, uint256S("0x000092468fa17bf053e86718b41782288146d5d452972a7bce7f0de0aad1d480")) - (1592001, uint256S("0x0000807a4e7215533d26a5287d0951795fa102c05090254ec0e296560b61da4a")) - (1593001, uint256S("0x00003fb5282953bdc3914ae8fc7008cebb468ae1839cc7021cd3f31705360467")) - (1594001, uint256S("0x00008f66c6c566f15d0d497f987d92d879c49035565fd5a6c5ee23fe8682b041")) - (1595001, uint256S("0x00005e280051b334ce081f3570cb0587d126b654a28636211af2c6fe34468288")) - (1596001, uint256S("0x000064f710f461a79987167d807e01f32de59deeb77e729a8a7fbb5279ab1a01")) - (1597001, uint256S("0x00004e6bb11a77f39a70ed1644147cc79efa1d254f6a607722b6873234c54260")) - (1598001, uint256S("0x00004b3bd14558aec1f33e632157aa846d5c193253d863a608ac8a9751cf879d")) - (1599001, uint256S("0x00003e6b38d84b34c9d473379e9a565c0c33d5e5d603c85e79c97868d3ce4ba2")) - (1600001, uint256S("0x00005f267aee0a05013f71d91e41a0e1eda490cdc67b67b353145cfecd7c3996")) - (1601001, uint256S("0x00000b0b6d67cb9db232192aef527016c0b4a53db3911bab50362f41d25baafd")) - (1602001, uint256S("0x0000355dd39ee9c9491747f2ec4149d64066c4e4e55e915cbb17be8bbb9fd808")) - (1603001, uint256S("0x000084eb8124569e6ad064ceba3abbe05183891a1866a578980b47f5f39fec2a")) - ,(int64_t) 1726135644, // time of last checkpointed block - (int64_t) 1648765, // total txs - (double) 2460 // txs in the last day before block 1603308 + // Generated at 1726147945 via hush3 util/checkpoints.pl by onryo + (1143000, uint256S("0x0000559866cc5a14cf418bec8754ac4790dd538fefb17cbfad7ba5d186dc8f31")) + (1144000, uint256S("0x00004f970b2fc229ea23e0294ff43e7858e00a6ef2ccad15d48c7b8e5bf9e270")) + (1145000, uint256S("0x00000a8c950b018ed9517b58f2559fd4a5a9213dcd552e78ca25b3c76b8456df")) + (1146000, uint256S("0x00002be2e2e097c68eb85b60ec0ebbe4e87438a25affd4ed2dc29387d5069ba6")) + (1147000, uint256S("0x0000474f086d74c4a20bbb6131bc75aea1bbc2ff5a32f462fae87a2375b85d26")) + (1148000, uint256S("0x000054292fe108d54727c31aacf212b6697dc6aed6d14140e75d3982458f6af1")) + (1149000, uint256S("0x00004d8a8bc4a47f060fa8903ea8d73528f83873f878516e7554decbbfd1b3c8")) + (1150000, uint256S("0x0000383d666b6039ad272fadc0e6375def512cdaa0d958ef03369eb286f7f790")) + (1151000, uint256S("0x000011afd8e3a4920090b635cacad14e12c61d9b64b12498dc533bc3ea7a2c07")) + (1152000, uint256S("0x00000992f60aa90c6f8f17d9b1e3e22500cb13d254d1a736dd34fd4838ea5dc0")) + (1153000, uint256S("0x000027c82a655f31c8614ca71b2ca7913379b735e6800abe41634ca9a778bc49")) + (1154000, uint256S("0x00001800e1d84ba053d1cecbf92e02577c06b05f5963c13df01802eab626448f")) + (1155000, uint256S("0x00005254625752fad08e9a965f7b8e2c44710250782d307c02a6a97ae011d76a")) + (1156000, uint256S("0x000051ee7e11ebb76f6e27e1d4fd206f5527a6dd3ec58e0bbed04f75b6462339")) + (1157000, uint256S("0x00002dd6c9a7fd522d5a2c9810da28dc8d456fac65e4faa377f6247f37b08978")) + (1158000, uint256S("0x00007ce77f64fbf985fc4e2e90dc6bec6ca17845eb7f9096d7f8e463540dd394")) + (1159000, uint256S("0x000029591fa14c002a6befeb3d567ab73be62600f40e337c525eca3412b6c8d9")) + (1160000, uint256S("0x000033a737dae6e4c83b3cc5eb9cfab2d69119096dd958a620b3d4d28505461c")) + (1161000, uint256S("0x00006f6989a5cae0b1974edc9d9b9eeb028208a285820429f3fa63ed8bc9466a")) + (1162000, uint256S("0x00004329014090653fe61bc5760b392730d2d4926228538d322f3c10d5d00fd6")) + (1163000, uint256S("0x000050ed4d90504ee338510f3fa404411a6c124561b1d697042b3644101d73df")) + (1164000, uint256S("0x00001733edfd42ca5d95d039ff31eb28cdeb72bb6a63a6f797d097bc850cf874")) + (1165000, uint256S("0x00006132cc449bcc44ac4cc8077991419558463b936cd2dcd498d7d384de957c")) + (1166000, uint256S("0x0000233926a59b4b5b859af2f89159d72fdaf70b4d291bfd28376efb5b1af8b5")) + (1167000, uint256S("0x00006cf8e4257f5ac086e112f1bad8e5d119220545ed98dbaf17b6585cc8f8b3")) + (1168000, uint256S("0x00005dea4f2ff28f229bf3fb9ab4c8d5aecd79417acaf9c1fe875c223030b228")) + (1169000, uint256S("0x000009472a9a906e93ab907a41f5b67466e64d19142ed6889c769b8ec0941603")) + (1170000, uint256S("0x000015438fdf9acff1bfb51f49362ae1c1573c278f5048def1dc5b3f6ebb4d46")) + (1171000, uint256S("0x00002e38ea63b3e4b6a7cd5d8034f0e3f6fcfe9640c0d5d9ef1ea657788c88be")) + (1172000, uint256S("0x00001affe5e20f07596836762c185c83e6a80b1e61f6c3f6b75c19cf78756f7c")) + (1173000, uint256S("0x000062ac3dbdcc95b2419b9bb887bfe51b2517fde6e17bfd0d7108a704878c74")) + (1174000, uint256S("0x00003efdb7414f360b533f699d4af99a93f1d2752617a21cc2f780b54d8bab6b")) + (1175000, uint256S("0x000017520993990f7cab94d7047d745d533252d577479e22fd630dd4df0943b4")) + (1176000, uint256S("0x000024bd3f052e52f37d15a9e71729a85c2f06adbb99cb38e95f48ab658aa331")) + (1177000, uint256S("0x00004a741fdc39082def272557e0cb43996b917707190b8203dbd8d98df6502c")) + (1178000, uint256S("0x0000123fab19710ddc712ff96a8fa813a4b8ce174dc6a4015f63957cac36e276")) + (1179000, uint256S("0x000007e82b343a8b76a0964206a34f5cb0c5765f7b02fe4c538b2a45b36d9b09")) + (1180000, uint256S("0x0000649ca5e4674aaafd4a4ba0471871174ea06c10509d112eea15ee99fe8daf")) + (1181000, uint256S("0x000029fb97da343e7e6402af6cc9b4f3796be80b2896a54fb579e471c6bf115a")) + (1182000, uint256S("0x00002af27c646a7b0fa7c96ea6edf9c098d6fde6ff35f1e793820dc5b808280d")) + (1183000, uint256S("0x00003e2f509c57db42106586345b8a1078223ef43f6b29aed8ec1cfefcaee17c")) + (1184000, uint256S("0x0000073e3365f8b253334d549ca50a5adedce9f97427bef3ebe314c04f983b63")) + (1185000, uint256S("0x000001ce36b5afec8ad1771670f9a17755efbd78b169c17c8f1977903d7942b6")) + (1186000, uint256S("0x0000572991b2ab1139dd0e06d6d326dc924536f62d563a3f6b4bb31d5f8da850")) + (1187000, uint256S("0x00000e430150aca093ddd310bffffbd4c28fa65423d6f5491c902c7fe5bb3c50")) + (1188000, uint256S("0x000063da1fbcf413ea1a8664352c409ea2b2eee698fc953313e04e8f9c4c13f6")) + (1189000, uint256S("0x00005bbc9f9803ca56d18da09b6e8158a9efd9795753e477636948049fb6b077")) + (1190000, uint256S("0x00002245226551549ffa162c710225978f840faa0970916927ba949cfc9abd11")) + (1191000, uint256S("0x00000750a1a7f0b9f320c07e4239c8266ca8203184cf2840d2117e06da625e2d")) + (1192000, uint256S("0x00000340cc881b0ff9a1045da2e513e1dfaa9784d5c74b71d06a69ba08f9bdc6")) + (1193000, uint256S("0x00004af98432b689093039aa7bb31407320db379bb7a1af401f4ab3b50b4c7cb")) + (1194000, uint256S("0x00002811098dabbf8b0d9a187a7d6aa946eee22ca7a2d4fc0e2db05c85d9e7ee")) + (1195000, uint256S("0x000023354ca74ce1d65c067a43bc287b178db1accc68d0e255affb783d28fb1e")) + (1196000, uint256S("0x000022f383c401cdd9b5428a35d2912c32da96ee75d9ca11d6c950bd26a85ae4")) + (1197000, uint256S("0x00006128dee332a6b6a60bbec4cb87a21a7caa4d998bd50e4e17f93a9fafa947")) + (1198000, uint256S("0x000040c6d3b8a3056f809beb6fe99193c95fb1e675217fc4c672947e4ad28b5b")) + (1199000, uint256S("0x00000526a9c4e9c16dd17b43fedd5c93484bcaff8c659fd8c590c4150674fefe")) + (1200000, uint256S("0x000013ad8b897aa023a26864bc8499fadc17c37214b46f0d4b84dc4744a3f270")) + (1201000, uint256S("0x00005499d0c4695da60fddd08c03f2f88fc73bce71fc2db01287afb58f6c0be8")) + (1202000, uint256S("0x00002fd7cf1273183ee655a1453d99accf4911134f14819ed04af6a22e4869f2")) + (1203000, uint256S("0x00000c5686cbe6e542dfadb8a8c72f5fbd6f3e4c4151363dd5ffed5ed4e0de93")) + (1204000, uint256S("0x000011645bb9c42eaccdf0736c7cbb9d446cb0ce42b9298824fad5a9c896cf1b")) + (1205000, uint256S("0x000037b4659afc89a6c0c31773590af066cbd8cefd257f4f97d6715589196230")) + (1206000, uint256S("0x00006401cfc88a271056704d6820a97e30d32e1f55f045070f1f2864e37477bc")) + (1207000, uint256S("0x0000384c8c430ec912faf02763b45908661c49a09d957e04fd666c1853a445f0")) + (1208000, uint256S("0x00001272213359e1fa3986880da18000d1dbeb472794b6ef3e119f1f924dd0d5")) + (1209000, uint256S("0x00004ea7dcd4baa421d2f25cdd3d154fbeb80b48bef575bc1abf7be30b531782")) + (1210000, uint256S("0x000014155338aa216d649ff656fa174fa2ef31f709ff6733a6dca2cac5fbfaac")) + (1211000, uint256S("0x000050cfccf156ec081627ea46874a77f210dbcf5f815e67476104a49d2234ae")) + (1212000, uint256S("0x000002361f8cdb0ef51cab2067b81285e5ad470876eda334357c1becb4e14a0e")) + (1213000, uint256S("0x0000148363d3feb29f88b422299e0b6c4d02579a390f2ba5f813d8b834c6c9ba")) + (1214000, uint256S("0x000014dfe478cea8044551facc7a21e3cd150d1bbe36b240567c3e605d240f78")) + (1215000, uint256S("0x000066ab5b4c8ca88603b375dadfd7437e82afe4c0becf0c823ea52389c95592")) + (1216000, uint256S("0x0000192d568f61af06e235d325ed8a25e338ecde8ebb7550168c3eda7271f8b9")) + (1217000, uint256S("0x0000082ce9b9bf87cd52d99fa606276cfe37f3735f87e6124929d1904f9a8e59")) + (1218000, uint256S("0x0000664551fda17ca48d894328a14ee1ad6cfbe3b093cfe2af5cfa6c326385b3")) + (1219000, uint256S("0x0000567bc2fba439fa518ace0e3e1a3de20dd681787c55cd47fc5fc3270dd689")) + (1220000, uint256S("0x000032c41595c1d0856b5f42cc223f718fc39730a8ccc7da12979eeb16843b17")) + (1221000, uint256S("0x000068a6d0e870f3066eb53fff971a3bd2ed5e6be356aa60b5471acddbab1463")) + (1222000, uint256S("0x0000501c420637240ced9e7b1ac94d1ed6628c32df44516b3cee7e362f68bcf7")) + (1223000, uint256S("0x000017febc9a274e74e08e1bcc0d2437502c2367565cc66a41418750f14996ed")) + (1224000, uint256S("0x00001cdd2659af3594e105128d614ed88275a3aaf17ebebb7462efac3d7a8308")) + (1225000, uint256S("0x00004c9e0b767f0af5af5ee53f0815c1250412a6da9b095d71bdc4b1d04aacf1")) + (1226000, uint256S("0x000040ccb928b631aaa50329c3aa6c261e0e259be89bc44d241d32a06906b7d2")) + (1227000, uint256S("0x00000636ff452b4189d3e504317cd1e0565f6989c08689876f175976c8e5f6d5")) + (1228000, uint256S("0x00003922ee1388e9dd42ec9085be131adac3cb192889573c7dc95f0d5b10fb2a")) + (1229000, uint256S("0x00000d6cc5c06405e558d1586ba42cb7a7a33658e806ae84956c501da672b15a")) + (1230000, uint256S("0x0000172fe9a0cdfa70d80e99586ac8a26034d7100a74c45aa5cb832be780b602")) + (1231000, uint256S("0x000042423636e41f92ed92e94573a7757c5683c71d794ca329f4dc250d496562")) + (1232000, uint256S("0x000030db4f249f0a8a0cc452f7c286346193a9b9a58c612a3026cc5196f34b65")) + (1233000, uint256S("0x000008739a594e05fe74e78016df5a8cc9f534c35f476f31cc53c1f728ddbd0b")) + (1234000, uint256S("0x00005686cacd29d4b25154f85a59b96ad38f76b1dc50189ccd7c2ff64916d500")) + (1235000, uint256S("0x00004dd1ed8cc9d9fae3dda3dac545c1013888053d7d172c93243bafc12ab6bf")) + (1236000, uint256S("0x000039da72e90fdf62c5058186ece9f625a6fb752468dfcb554cce91de40533e")) + (1237000, uint256S("0x000051b553a4247a192a3c467cca2761c03b083e72d3b3876e00cfdbae61ee1c")) + (1238000, uint256S("0x0000470a1946478d605cd8de5837f6605bbb783d8e20437b4a72574d9c8135cc")) + (1239000, uint256S("0x00002b7de55538a8b5a5d7f3869e24585a7da48da6770900620f37e3ae3cb067")) + (1240000, uint256S("0x00005dd97b8aa7bba0d0a2743f39b6a483884db7397b65abedb866bdb27acdb6")) + (1241000, uint256S("0x00005370d77990c5391a2bad8c76eb21ac87642f70ce4cb859e2998f327c76c7")) + (1242000, uint256S("0x000013e9aebc799c5feb3a8048d663f698ea1e2ea69f0f493fa5f0051fb63a1a")) + (1243000, uint256S("0x0000149885bc1668a1993b87def2c16c546cbff364cac2aa9bffbf98dacfab30")) + (1244000, uint256S("0x00002c685cda1ff8c394cac9d350a58edf7202a8f0d28a6ee08cd72ca052cbfd")) + (1245000, uint256S("0x0000102705046f777fac46a021ad9658c4413fcfc45079c4f2d72a4628317a87")) + (1246000, uint256S("0x00000fa7de6082201c2367a3fbce4dc81f68442bcd953053e495cd546791e589")) + (1247000, uint256S("0x0000154a5c84fe71a13ce57bb79d10a96c87cae33377e7964b23ae94a2253a17")) + (1248000, uint256S("0x000000be86b23e43ff6a25bc0762054094c9610de62e7f402ef6d5fbf997ab1e")) + (1249000, uint256S("0x00005b543b6fc0104ff434f493e9e40e6c60e2dfcdf64fad44418ccf6b186b5c")) + (1250000, uint256S("0x000040801b1c63452f1fe4a0549d5062b24f9d96ae8813e38e5310f2feab28f4")) + (1251000, uint256S("0x000057fb0a2062247b3a8536b4890ef2474e9a0e995a834feea2e51eaf43829b")) + (1252000, uint256S("0x00004e2b5964a7b44110b6ffa12aba62d497333c41216e2a177d49593181d5a6")) + (1253000, uint256S("0x0000319fa7a3b0ed79476b6568f4e64136a5d427d1ae00aaa38f2db6113ec7ef")) + (1254000, uint256S("0x000019a583a766c17f6d107bb941752783b3b595ea5cb02279b2915645782881")) + (1255000, uint256S("0x00002001eba0b7c49990435285721c5e8d8dfe087a33a0149bfaa138ebdb11b7")) + (1256000, uint256S("0x00002932656be7b66c9a751d8da9b20e54972a7c0c260976cc47f4a48ec8e0d9")) + (1257000, uint256S("0x00000a8566c990bd741caae3dde65b624b884b463b9bbb5cacc4078fbf0339e8")) + (1258000, uint256S("0x000039e1f356f63faf24d72e9ff9c29f77df9f40756d5dd524a3b250ae2e871f")) + (1259000, uint256S("0x00001eb035d147edeaf8d88049502b2044e2d8da4750f5c1b9a7aef9c6943195")) + (1260000, uint256S("0x000012c037027810296ce25642167daf3d0495e1ef9292544f47599531244bd2")) + (1261000, uint256S("0x00002abb17fa2d045456b3961696f7b36b1443603ccbadf2e6395dc1d1fb140d")) + (1262000, uint256S("0x0000088736c35e41ff0566ff9fe6d76e0cc142e99beb5854bd8f589d90d7ef0a")) + (1263000, uint256S("0x00001ed2d037a67a4ec8aa01138726214016edf506251c6b454404e98cb766df")) + (1264000, uint256S("0x000005e40cd01ce160b4fe154922162fd3d492aa52951bf44337a139409a4452")) + (1265000, uint256S("0x0000676839db3008652bef92beea49cb82abad08c7eccc57284094fad7feca13")) + (1266000, uint256S("0x000013074b6318eb49001ece9fc669438b0e77c686c5a43b3744d0cf47a0beb1")) + (1267000, uint256S("0x000022aa82205b1067a9a2ebc5930b70b6881d984d0ce1a8b029fd6f0bd88f45")) + (1268000, uint256S("0x000031b0063d7f9063d54bb07fe9e56cbc3b75022080fe7a5c25cfa78e867d24")) + (1269000, uint256S("0x000060c8a2b63b45fbf8a359485425c0ae083d4654d2d062f1a9dbb4a1b4a1e6")) + (1270000, uint256S("0x000022d4eefaaed23d27ad85bb00e92349b53c3f81d4d308acc53434dafdf731")) + (1271000, uint256S("0x0000077b6614dba2b69bae84afbe8d11e3beb9b12c869c8a9160f3dccbd833ee")) + (1272000, uint256S("0x0000359829c6014d0707fd13bb5f66e1906346fcf6a64fb5e81a29d7efcd52c4")) + (1273000, uint256S("0x000044586991e1f5cee09e2c0b3e175845e659945b8f680d2bc148c495156395")) + (1274000, uint256S("0x0000460b6b756e425a9ec78111b4c3dac21fd61027f4cd4ba557d7cace76f400")) + (1275000, uint256S("0x00000c6fc0db70726dc0a40e9b12f636cb4830c42c1b06de34d8dbc618685cfa")) + (1276000, uint256S("0x00001d7679c574c9c5dc3cadf6bd27f67126db8f79e5190f8ddb9acfaf85209a")) + (1277000, uint256S("0x0000355d71b43c37b2426466692eadb1a425a1dbaa15960cd99b1b9935a90006")) + (1278000, uint256S("0x00004c7ad5faffd431bff2e9f3de5f7e89ab8fee40c0a5c997bb999a6c5b4cda")) + (1279000, uint256S("0x0000474d6f4ea13eb5559ad26b7adbb580c6a44dfae04beeb49bb4f994da4fd2")) + (1280000, uint256S("0x0000187b49dbd8b87d68adc0070413d3ba904df45d27d1837aede0aa50993df5")) + (1281000, uint256S("0x000053c0c7c2df5c493b6c94c90f7d54c9d16182f673f0d79697dc4bf56b551c")) + (1282000, uint256S("0x000032a389674742454fe3410cf839a0a761cfa46dfa126cb1a32da994d272de")) + (1283000, uint256S("0x000034e46e23ea151912514e0736c9b27efbf9be08dbf8d931f9686092534280")) + (1284000, uint256S("0x00000a5df550a85eac7892811fee5473ff7a9c8308d70671e6c279500ad731df")) + (1285000, uint256S("0x000015935070956de8543a6d36d7b97436e1b8b933c308c3929a404b15a56dc9")) + (1286000, uint256S("0x00001a57e5646201963da0f7e3d130ec1ea70e017883f677a7cee17d6abae9d0")) + (1287000, uint256S("0x00004a92e3671588fcb49a8db0283320b13138edd92e19fbf1c843df9e5ab2ae")) + (1288000, uint256S("0x00002c10244eb91ecfb44089ec47cc3594b6876f1db247ca49f378ad4b216dba")) + (1289000, uint256S("0x000050a8a6902ec83acbd97c599b0cb1b503437ed964c98e9bfeb8a0f2bbcc62")) + (1290000, uint256S("0x00000ed28be2c4c802b598a19ed177364bf86029e8b20e43338c721f231e4279")) + (1291000, uint256S("0x00004d122c9a324995e3246836d0bac61f731d82331c2a62b47f78ca45cd09bf")) + (1292000, uint256S("0x0000088be22cde734cea1d67f8a3f1d5297fd79b1c9e5fe44be483057b08439f")) + (1293000, uint256S("0x00001b62d2ae6cec0a041b5d6b7ab112b618354e4788476d2b0fe6abf138fd03")) + (1294000, uint256S("0x00000a13aea1a99a8167cd04ec6c0363de67f49ab6b1a7e5d76612dea2ca0cf5")) + (1295000, uint256S("0x000033982767c8bcc47dd13c5be0f843e1385bc51aeb87debdd5258bbcde9d2c")) + (1296000, uint256S("0x0000125c70cfad5ac088c0043509f659f59878758234b89cf31010e2ad028a82")) + (1297000, uint256S("0x0000259af057d1738063700bbdb1352a381c01092d6aca3380218ed6a5fca750")) + (1298000, uint256S("0x00000441c838672326020f9b1e1036f108254216d50af05bddb4b19357d95855")) + (1299000, uint256S("0x000018fb87a76ae93b2c9f8052442c875a68b474dd81af0c59221eee714c9e6e")) + (1300000, uint256S("0x000009b6907f7923dc9b784b0077bb713a8856ca9d940f57078b44d0f83ac312")) + (1301000, uint256S("0x00004289784e21a386a8190738da51c2d3f77900259414860b5e81539e9558e5")) + (1302000, uint256S("0x0000289a30b70cf0ec123814a18ff6f0d87165f762207ee4e931a355afe452e6")) + (1303000, uint256S("0x000023cf6ecda684faa7500e030e6dcbdf63af8a26dc498d94364df7bfdae0d7")) + (1304000, uint256S("0x000034c8fe4345599dcb66d08bc7595d99cf70f3f8a53628b43eb27fc849ea0d")) + (1305000, uint256S("0x000043b3c599734e3c7c3fe8223fba99d1362f3a5cbcf92b6a5965fec8eb14e5")) + (1306000, uint256S("0x00003c914f7c29699e4532cb69a7cf806e76bd93bce5a16802bd6fcb72cf0869")) + (1307000, uint256S("0x00004b4b26da50b96f76b2bc4fb2a86d9770998e8e5d4150e1d6b747eba925e9")) + (1308000, uint256S("0x00002fc77f9b68d13c067311e6ca0ef116eaf711823d4b1b584f9acd7f0ce82a")) + (1309000, uint256S("0x00002d1b444197e533f8025ef5ebb6ccb279094c1ebe1dc999d6604554f0c91e")) + (1310000, uint256S("0x0000136813f4498435a9f1d740616be5aa8a7dc5fe1fd893a86400959f2667c4")) + (1311000, uint256S("0x000015aa7a373c271f2761066a9fce067540bedca683e0cb2e7cb075c2f7ae56")) + (1312000, uint256S("0x000049027d369fba3fe3a0dc4c34a8f19ceb7c728aa8a01863368e65a74a0402")) + (1313000, uint256S("0x000021265084f0017f10af2adec81ad77fdff31e99109787af283cd6ce276d86")) + (1314000, uint256S("0x00001dc5b690ef30a433b9b92aa2f53083e7f97ace9e7efa3b66c6e45237539d")) + (1315000, uint256S("0x00003b70d6876046d2815d25c254e7a28687344d8d8d881b5a2cb490dbe1b7b0")) + (1316000, uint256S("0x0000035c58cfcf4e3bffa99a55195ec63519b41d2158cf35a98e31f0b2ff4fb1")) + (1317000, uint256S("0x00002871c10c82a4b527d460036b93a3218ea8f4c0d4d5962000b21fac6ce5c2")) + (1318000, uint256S("0x0000523e5cc8af99515b772098780d643ecf8d1bb60a44e9ed01e1e6ac05fbbc")) + (1319000, uint256S("0x00007649faacbc98ca50131914a671cac3449faf45efc358687bf46daf01bfc3")) + (1320000, uint256S("0x000054f5e7a90e9b5e70336442e07c569da53095163b6e6029c2cf7012737654")) + (1321000, uint256S("0x000073d0f551b3e768bf3435d170b1299e8abbde276127e7f73d070421cb7f9f")) + (1322000, uint256S("0x00004ee980bd008cc453ed43891ead6f4047a5b26eacfed37368c44784027e65")) + (1323000, uint256S("0x00006a06db6521b45b0e6aad0576294d6eae7f0f88f64bfee971fa83847dfa2d")) + (1324000, uint256S("0x000052748d09b26b13adfd512ce2ab015cb4d82e171afff48c28908017a63f9a")) + (1325000, uint256S("0x0000243fc652997bc4b6a2315b9384a54e312678d09fb00c068981456ad76449")) + (1326000, uint256S("0x00000b1efbae985fe97c5664bb006b2a5d9c929502619cdc6a08488427b8bfd8")) + (1327000, uint256S("0x00003eab5ef74d212a6031d1333a8e32a7476618639eeb9709601247dcf28b52")) + (1328000, uint256S("0x0000205d5addc63d62805bf598664eee091b52d3222a5b5fb5494a6efb584cd6")) + (1329000, uint256S("0x00004b5a5e95536ac8036a4b3e95df41f372699387600a7f3bd340a0c04c8d5f")) + (1330000, uint256S("0x0000190c2db32da38586594ee3c67a95fd1ebf4b6fa288c8407decefc23eb420")) + (1331000, uint256S("0x00003ed190a2570d494dee7e966544c3d3981a1c4dfcf25f6f1c5b543bd3aa71")) + (1332000, uint256S("0x0000151e66c75701e9040b8bed59abebaa51e7c2465773f1b07c7063c2ef9c02")) + (1333000, uint256S("0x00002c5a586b74cb3c2595441f48e4ce62997b86e997cb87fa6e5eddbfa9ac52")) + (1334000, uint256S("0x00002a52be65eb1c9dc8bbe85d68583a74e0ec93a518ab1b5e2cb24a5a80bd19")) + (1335000, uint256S("0x000021fd0d351efa9e040a873c446e1302a5ac5b5025084563b3e7a60ff2c2c6")) + (1336000, uint256S("0x000053d767bc40e54e6b1aef2f51ee7755b36209a2c283d50827c05b92fb0e0a")) + (1337000, uint256S("0x000013d91d3baf584f200f050564b5efd2cd098d378d448643e21601a56504d2")) + (1338000, uint256S("0x0000413db692b66b4db2ddd2e55f53dcc7e6e1c1784373a0b67fadadddff5aa1")) + (1339000, uint256S("0x00005c660d497cdfb5a13be94b69226077506128b46a0659b6ea4d5b3c8d9d1a")) + (1340000, uint256S("0x000025a875bb614824947cfefc70701ae1bf573a38f5fd5255d97238947d4d46")) + (1341000, uint256S("0x00000ae023b2b24a6f8bbea6268100bca725b8da415eeef679b1c35f8a836787")) + (1342000, uint256S("0x00000201c23daa15a0241c0e1291fac68143ac9fe72f66370bc9c151a109da98")) + (1343000, uint256S("0x0000305946c0b179db2aab47885b509fbc931874a89cafd046dffab5266d9432")) + (1344000, uint256S("0x00000317b608a52b734a7b3aad36143b761f34e47f26ab1c7c05c75c3af31a24")) + (1345000, uint256S("0x000034f335b83c243f68ff7be160dee32e1faa6b6f05094946f0f169fa6770fe")) + (1346000, uint256S("0x0000207f8a87af0453b46fed4fff804419fb1ffa178ee0086be40d61bbc5d304")) + (1347000, uint256S("0x00001f72cb20b6197b3de236eb3d57bd46878bee758787e75af50b963dacb863")) + (1348000, uint256S("0x00005b521b1d95b13625a9e349354cea391e8caf58db86e07c86642ef9d5b433")) + (1349000, uint256S("0x000064bc53df71822fd8f7a451cdcf6a4837631aa208675e64cfa4fc8f3ee284")) + (1350000, uint256S("0x00001b9b8fa3e8f35dbc95a27c88ae13b6c5d70ad81c7d4353e7f2b0096d8cc3")) + (1351000, uint256S("0x000008939e57dd2d369604bcfbbff892fbd89a4f8526ad0b021fffb01f06a2b4")) + (1352000, uint256S("0x00006f4f0458341f0fb67de2542818a688a772c4e3b785d00336de59c9947b0c")) + (1353000, uint256S("0x0000727e0460a180bd36f387e28a2bc0c24ea5dc34910e1f59c430861e810882")) + (1354000, uint256S("0x0000502d7a840217c1310c002a10dbb9e38826b9bcca353efb318e3712ebc1ad")) + (1355000, uint256S("0x000063fb9048dd54c0350c3f14ca94d561b24ba64e339eac3b741666b2a7ae58")) + (1356000, uint256S("0x00004f08f17e3543181de2cba7842dece3ba3fa7c6014c6b4b43095481646c08")) + (1357000, uint256S("0x000025fa2b0bcd25cdf5877561579f0e394f5129cae461c3a817af816e0d458d")) + (1358000, uint256S("0x000034f582b22ba9a754b83197b6c09fd811dc6a24d7ae80d28d4e405fd44bc0")) + (1359000, uint256S("0x00006317029a3817cd40290b1d7a5f6c88f3c0d33ec2131f5b25dd798b1ecbfc")) + (1360000, uint256S("0x00005be02850d4d4fcc57f1af06934459b2beb0c3e218e41f31b44383e3bc6b6")) + (1361000, uint256S("0x0000477079b78868204a9065bb1f55a3e1b2231ba95421bbd656a4de648583f7")) + (1362000, uint256S("0x00002effd551c67a9ff3b4a83eb19bfd9bcf899ad021fb749524c2889e3e0f84")) + (1363000, uint256S("0x000030de375a7891acc79ed08c5f1f2e462391e825e24bf367283ff761c8a0c5")) + (1364000, uint256S("0x00001a67a194321cc66ac092354827207ccb6b163a094bc670a1e0266024ef85")) + (1365000, uint256S("0x00003f3ae3ef89b9d1f196f47e8b3e42c7f1d4947c518a61239584d1fd1c5efb")) + (1366000, uint256S("0x00000b2c437d78f45eff553c1200e4c017cec07e825359842a764e5fe7f0c8be")) + (1367000, uint256S("0x0000211500a4981a24ab387a229440741f7bb1d230fd41152fa1a2ce55f13d9e")) + (1368000, uint256S("0x00003c915106dce5166bec267e52beed2b998eec834817eafa9fe90e5636e62b")) + (1369000, uint256S("0x0000549ef7cc9bb848c447bc326977798dd599aa25c224c94ee36bc8e568b6b2")) + (1370000, uint256S("0x00000156aa005f16d2c49557dde9ab4e8c8f7988ad3d742349ac7d8e5a540dbe")) + (1371000, uint256S("0x000026010d2b966d1c844d51fca19f808ba9ac595b7f6e67e92d1c57fcf96002")) + (1372000, uint256S("0x0000229d1a4c8ee6fcc5d4a8a8185466f8d9cda1eedbf06e8fd42916def5a00c")) + (1373000, uint256S("0x00000183822f5fd258a0546bf0d99679b6b6250a6dfd00ec41950fa607d80b21")) + (1374000, uint256S("0x00004121cbde3764685f88becc2f76cc82bf267b8e2c6cfb290705286d35a963")) + (1375000, uint256S("0x00004f01f0471283f9e3539aeea5a7fdde6e262bbbac7371ead9f8be817b57b5")) + (1376000, uint256S("0x00005e3524bbf76ca54513bebe1543728110d24b7b57ed29df454d0b5ae9113e")) + (1377000, uint256S("0x000038495b87d9f88798b8c4d9ef076e77533df730af15c59ed2099a22a0132b")) + (1378000, uint256S("0x00000e07849388d96f40d68bfef4eb519cba87b83502fa3ec7b3ad19b7b5e3d7")) + (1379000, uint256S("0x000027f63bf39af6977c10274283d3d9f323fbe265f6947f7281aeffefdc5ba4")) + (1380000, uint256S("0x00005505fc6e9964c5046bfdcba3ed94b981c39d81057fd1e159066d86503b0b")) + (1381000, uint256S("0x000010c64d196f9eaa408a041ca83f4f302f55f3ac336a622ee71305c3b29388")) + (1382000, uint256S("0x00001643b8cc9dae02bece65ff6522bbfd6c376d714d7f6fd49e382d9df42db5")) + (1383000, uint256S("0x00000e8168f5c7315866986466a2c798e5310dbed27fd07fa0985f5c341a86a6")) + (1384000, uint256S("0x0000631b02985c7f9a4c4f6687f5ae7f099c12f03f6bd2a5eb1aa7eee1f97a94")) + (1385000, uint256S("0x00005de1bda0086f5536e4541c116f782c4fcf288d4f28ed8871be8649dd54bf")) + (1386000, uint256S("0x000016ecc09da98c1adc4cde6ffdf6b1e5b34be2392ddd49d917e12268159c9a")) + (1387000, uint256S("0x000016b0710e0f91f24b6307fd32163358e844ca729e1f02e4ce8e99cbdb79bc")) + (1388000, uint256S("0x00007746c4cd4567c2215530e3f617c1cd533d89025d50ca39aeaa5e6bcdfd44")) + (1389000, uint256S("0x00007e6e74437b5e17b8b3c758009957ca4a865fe23e5c33e0099e6f0d8ee845")) + (1390000, uint256S("0x00007250c54dea4de6ae66a06b19a5538a64a98475c1f890e2845cfd0b0f6f87")) + (1391000, uint256S("0x000043385abbf08e4f0aa190078923bc7d27254b6c93256c8f56d026992de23e")) + (1392000, uint256S("0x0000264465ee861672764b4328d3e0a1bb4f2ebe168eaf3bf2e3c7bd68e47057")) + (1393000, uint256S("0x00002bdc46d2a233b0643e8c5b4eb5b4805e94d846b7a3543a72cd184b556e88")) + (1394000, uint256S("0x00001d7e7ef3992f2c2a90dc163a75868cb922762653c92d4e339d63e478f67e")) + (1395000, uint256S("0x000002cb974dbeacf08022dd44eb46648d5aec77cbcb72e04f6b5a511f4221d4")) + (1396000, uint256S("0x00006a978b1ae0aa4dc8b8b7ef6c864ad4f1be7da453480d2f088698810ea735")) + (1397000, uint256S("0x00002f68dd57c62f1086876fec0d9082c3da2566c2f0e6a22bdc429968209197")) + (1398000, uint256S("0x00008031c280fc082ddc06f14750f865da4d885b60f0fc6354481d7a00a52c63")) + (1399000, uint256S("0x00003a8a94de485da24caf7dc18fd923d27bcb07d29a5a4701c9930cf4f98d46")) + (1400000, uint256S("0x000011096de8cdd5942f4bdb443bdb8ad336342b3173ef8fa05307a9c8cf58ee")) + (1401000, uint256S("0x00001a22b299474069d4d834ec72a8a26f18640701c575500e0b5fb6b02fd021")) + (1402000, uint256S("0x00005dea39ad54b2862ae95657164f650e28ba250a4e1c9663b2fbc3db76a53e")) + (1403000, uint256S("0x000055857eed6134a03b6f5fcfb9112dd75b809ca8f579e11cd7b5846fb87c3a")) + (1404000, uint256S("0x000049548a6d09685e90375c2476674ca6e27453a8e05f8874fe0ba6e93d28c9")) + (1405000, uint256S("0x00000aeda49c9635b1079d3497d51e4ae1af507b16eaa4b7337bfde0f4e7ae6a")) + (1406000, uint256S("0x00003ae2cbae0d61d8dfb474f124cf2f6a994e5dcbfb3633bb1e357e358a3404")) + (1407000, uint256S("0x00004f41a6bc783f7c0d1f0c958e360a62ff50c6a40cc18b6a40bcd3a6add2a0")) + (1408000, uint256S("0x000031fe6e28dba476f91e83402b912c47df4002b97ed2f6999c30fa985996fd")) + (1409000, uint256S("0x0000727d07f32206cf915066e9fdb9907c3d25d49ba660db641494d5155a8127")) + (1410000, uint256S("0x0000405c1dc5e1e9bcc44a2c21c1bea6c2fe9b61ce3383ca2bc8051e954bc7e9")) + (1411000, uint256S("0x000035579f681bc9587ed9bb15a692da25409cfbefa79a1a89c5cb80fd3c0571")) + (1412000, uint256S("0x0000508dfbad47ff590c35883c493a875fa012d13bd1347d98a0a1a2bb7902f5")) + (1413000, uint256S("0x000017f5eb3f35a0d31d56b7adf60526a8ae44cc5c30b78e1416e633f7e8d5d3")) + (1414000, uint256S("0x0000808b8460ffb966b6313507830f6737c030f220e071de5619f21dfc8da78b")) + (1415000, uint256S("0x00001b587ffb3f55a7ea904532a213c2a4284b872c0ab9e803f320f195834db8")) + (1416000, uint256S("0x00001a140ad86b1b89f133819fd2ebc32729659a10489d0e7563c258fb67834b")) + (1417000, uint256S("0x0000459938d0e333ce98ece0a10cbed2f8ab955a2f70b1638e367049fe03b039")) + (1418000, uint256S("0x00002775ccbfb25998045102ad45a4a8b60403e877f9a60684a37fb9f1e24ac7")) + (1419000, uint256S("0x00001d4c713389cda24457fdbf22d1c513829e59ebaab09788b66c450574017b")) + (1420000, uint256S("0x0000716e6829dcda9d949cca382e41034a038b018a418bb6cec025bd7aa6b6a9")) + (1421000, uint256S("0x000016072ac6ceb3d2b8835be8e3276ea3fdca6082c922fbf4a2d66cc0b2de1f")) + (1422000, uint256S("0x00003cdeb85dd131660109a77b32ff072cce5119268524f7ff4e363b26e38f9d")) + (1423000, uint256S("0x00003facc7586105dcdaa31deafb1df8d3599e9fa93b1580856e2339148c506d")) + (1424000, uint256S("0x00005fb14795c1157ff1a95988d3defd1e39ac720ecf8595b99e413c7435130c")) + (1425000, uint256S("0x00005bb58f776f79f1a524ad3145b20114a12c5a620b9073b0e0f0730fd07bcb")) + (1426000, uint256S("0x0000607570d3c5d7ead43017397804b87868398256f2af8e61c24b62af3dce1a")) + (1427000, uint256S("0x000071c76f0aef33c1324393d145bf2c794162cce33e992bfc65b75765c6a0bc")) + (1428000, uint256S("0x00006018fc369b3af83b17854e093c9087ddd77802c21fb12497e94a1bc5afd4")) + (1429000, uint256S("0x00002a4e85b18e3dd7c4a07d0730bab0eda36a97a7eba58b7397a026083bbeee")) + (1430000, uint256S("0x000009d80d24169a4bc873c9f878ba7b08a0fefc85a40c1048721b343f249dbf")) + (1431000, uint256S("0x000026f094183a7f07bd8756f7becffd05cd4e7634a5b213ef3c23e5b6f97ef9")) + (1432000, uint256S("0x00007f7ddf1e1ceef2c23ed49e5fba39bfe33a2beb0189049e91cd475eb9f155")) + (1433000, uint256S("0x000060ea03b0e8aa7899d0d1b98b52b4a4c33b205983812d14b81ef09287b19e")) + (1434000, uint256S("0x00002284a454241cdcb0e95f0d9c0d247f6d915ba2214ed5a314a0225977199c")) + (1435000, uint256S("0x00001dd2d4d2dad999376d08dd1e2c472dc1e3455cf7d7221eeff8f6cf9fb114")) + (1436000, uint256S("0x00007bf3f632d51fea6cc6f20bc2f0fb85874a789dc3cd6a1f0f2dc66b5538bf")) + (1437000, uint256S("0x00000db26fa1ec1619344134d24dd24b5a29d510c3f06216630f4dbf73565dd4")) + (1438000, uint256S("0x000047a4145ee353646f39e1a6a6225214630f4e8cb4875e910809f6cb5a767a")) + (1439000, uint256S("0x00004267abb63e82ba97d51ffed3dd98e1460a5baba5aeff17bb941cd5e4240c")) + (1440000, uint256S("0x00005242530b3faa4c464a684aa360213d185b5532279e50048c22478b587e4d")) + (1441000, uint256S("0x00000f7ecbab8367bdcedd3882a469e95dc02a104bf9fe21c3493f6e7eb7678b")) + (1442000, uint256S("0x0000259a5a60df413dabe2177c51574ad856024bf02cab06404d9bf3979f255e")) + (1443000, uint256S("0x000019b6d30bf30393118deb097d33ccb1a296a297bb56efa95a0edcb823778b")) + (1444000, uint256S("0x000001e7d450d911390dd0d21a727f3963c6e2787ab48c9eb52f5f8805bcca43")) + (1445000, uint256S("0x00001ddda6fc26a28b6156c72aef52d46c9cf6f131da11aabc296ab737e84e12")) + (1446000, uint256S("0x00007ef41d460d18ffd70624ffb716b47daeb1fdf1ef8c749e5c6cfeda7e2fd9")) + (1447000, uint256S("0x00003cc8059291cc699032ab2ee35cd58630e91d538f80171e28f3c574eaa72c")) + (1448000, uint256S("0x00005b329cd2f049e697abf9d740d8181ef501357c7bfc1ca0980d15d127c079")) + (1449000, uint256S("0x0000145558665a6e1c6698240d7921c09a80df1265e0316dbccd6427c8cbd0ad")) + (1450000, uint256S("0x00002ab142f116f52000cacdd3f05da45dc7d1a188d04cf57095dde1e10e7c45")) + (1451000, uint256S("0x00002ed9d3dc2d60ebc8fd71bf958f7a16c99c1073ddfd06ca3d3964bf8d0fcc")) + (1452000, uint256S("0x00006c99a63588e991244cb16d65241e7f8c8a51c69f27013972cdfb627ef469")) + (1453000, uint256S("0x00005d800553e59397fd1852bc11ab440d40202a1514d47786e45538debc727e")) + (1454000, uint256S("0x000015d919078132a9919315c6cbc1f016fa32912f6e6d765b57caa64a038c69")) + (1455000, uint256S("0x00001e7eb6d77f2fc2cb60cf49581b18ed0704686a5b9c0d9681f84ad67af3c5")) + (1456000, uint256S("0x000050f68cb35ba10b95d3542d1d1cd7299805675f52870b54a2b35da6a47376")) + (1457000, uint256S("0x00002d3b75f6416e72777492b18de9c487cdc209f82750bf9bb0c61d79830ae2")) + (1458000, uint256S("0x00004d39813c667b84fa19e1ba8934b197accb59141d3b407c8e6310a2be353c")) + (1459000, uint256S("0x00003f9968f692a32404d64403d7574d4053d75d28c73bc4832ede6363a37815")) + (1460000, uint256S("0x0000457bf2734cdb31c828d467d6678140942cd27fe84091543a33c1a786ff0e")) + (1461000, uint256S("0x00003640de8991d2dce4dfbc5aaa40195c1d248d70e4ece748bf3841aa68a9cd")) + (1462000, uint256S("0x000038feafbcf1b9c8fe8b07ede5051a04b9a3f935b5b63796b9b822c2af6f7c")) + (1463000, uint256S("0x00002933fd1e62ab5cd54a40efd87091c057886fc0ccb5e8865ff53583ba3134")) + (1464000, uint256S("0x00004a7bc1706346d7fc51fda7d5dcc993592fe683d2f17bf594868c0ac7e6e4")) + (1465000, uint256S("0x0000620221261d65b72fd31fcb2ccbf37f743282455312a5013ec58901bea574")) + (1466000, uint256S("0x000017ec19979da76669b4dc9bc3c20ea74d0a9ee3d8c93dbbd45393f4278510")) + (1467000, uint256S("0x000030cd35ee603269884c9fea00e6fe9abd8a58a2ed15a72ca909f67c9ade24")) + (1468000, uint256S("0x0000576c624d94aa124844c995943a953fc9ef249783a76f1bb10ea5246a3309")) + (1469000, uint256S("0x00000bceda549d22ff52a7f21769aa9cafba2adfb5f2039b71536c841d72fe80")) + (1470000, uint256S("0x000027cf3973376f2e39711853c969763b3a9a5f614c479d36a82328b4034714")) + (1471000, uint256S("0x00005477303f498253b92eb410b9ce73e377edba795013722a8d84f8141ad872")) + (1472000, uint256S("0x000053a3db0b7b34004610d7cfdf59e72fe278468dfea1f5faadb251a0304f3e")) + (1473000, uint256S("0x00001e515ef508874a83e6e75906dc64c2ee25fb5c462b6712f947ce725195e5")) + (1474000, uint256S("0x000037d40334077f5387ad4e5aacc41fe720d5593e2d75fa6e7a12d23dd2251d")) + (1475000, uint256S("0x00003ff337fba64eec0d5f2374194d8764dab3c173c7ab593490fe0dba23ba6e")) + (1476000, uint256S("0x00000f028d26078a5beb3ee987635bdaa93d4d8a4addc0bd82d185844f4c78db")) + (1477000, uint256S("0x0000337fc9cf8d52b2ab171460cbb3976ccfbc34e2366b50c65ef86f4a8058d3")) + (1478000, uint256S("0x00001e75d7b55d58122fcf44ae97243fad28993ba9ecf8e29b57cd8d726dc448")) + (1479000, uint256S("0x00001bbfca4da29a52407aa2d8b49c77b5bc48ed0f62e59fe37d513cc51e2c8f")) + (1480000, uint256S("0x00006f49e804684d1c7e50bf8e1234fc1fbd123af27ba7459f20c07203b93054")) + (1481000, uint256S("0x000025bb119aa40cc5a1064366b832a489fee8ec615e8a57b9b5c6fcb9989160")) + (1482000, uint256S("0x00004e4df74223c0aa441425d08fd3e9eb3d6c54a12b3060d99e9b5ae3009399")) + (1483000, uint256S("0x00001d35a5f1960bdd484ce1c3e4a51163d4fe153f6f0fdbd8286c6834e59ba3")) + (1484000, uint256S("0x000027928236cc6cb5403e3cbf3157d4146de4d34e12bcf8af233918f3c6d52d")) + (1485000, uint256S("0x000064be474b3ec1e860f61848bdab8a01bf0412bbc7c979d8b4b05a18b1ce6e")) + (1486000, uint256S("0x00003f75f24012a202f6916ac20ebedbe14e6fd1ef09b037404565a311643307")) + (1487000, uint256S("0x000055c76e5db476d20d9a5fd219fce2c9c8586bc69750a66c19407947ebe0eb")) + (1488000, uint256S("0x00000ba35f0ccd2e8fc94caecb8e034b39aaef28bc68cf268033e765edb8670c")) + (1489000, uint256S("0x000037b5608bfd9417c5aaaac6dd4689a2e286f61e046421aabfcd27c42fcbd6")) + (1490000, uint256S("0x000047018d94461b91f86e2591f8a175b54d797fab29e8cdd07a38d546cd2ae5")) + (1491000, uint256S("0x0000339ebc81a4d1c99266c1ad4c0bd9e60bdf9f3f7a5fc2b7d7c0ff1023a20e")) + (1492000, uint256S("0x000034f2be651c725a501710b90dfc7ac2a7439a7790d178f37e635339582d19")) + (1493000, uint256S("0x00004e36b6c7820cec761cf75c6be0817a893dd2c28ecadc52fe9570276c6676")) + (1494000, uint256S("0x0000436de2198200c988fb5329dd0629693ea351099e6a7ee54f2fcd15fc848f")) + (1495000, uint256S("0x000030e54f3e42971065cfb365889092df67c4f4cbd8d9882309d408beaef4be")) + (1496000, uint256S("0x00002c91d87c10542b3db4d339f84ca3d6f537c631f4d3a545fcc63c242d47c2")) + (1497000, uint256S("0x00000e03462a161ce11c317d3c3959d057f4dfdb72ca767d3ea92dec5381f4ae")) + (1498000, uint256S("0x00000b00fef2c10cbb333e159bd725051cb2b8868c3fa7794180a862b8c4bc2b")) + (1499000, uint256S("0x00003b1c63ff1b19cc6579c949f4e3a8a70257b61cb13cba980470cda9296a40")) + (1500000, uint256S("0x0000324248e01dbc3a4dcf9d3065e5e1eb6c81fa8586d4b82b32e97cc43d8356")) + (1501000, uint256S("0x000043493acb1081ca68732119a37f8a37bbd98875aed14da785180190be64f1")) + (1502000, uint256S("0x0000560985bff5d7439e08ce1dad6deb423279192f27ced560c3a01e037f95c1")) + (1503000, uint256S("0x00000f4203bcef4cd3199e40f90e164de773436eaaec87cd8a9dd932d08c01a2")) + (1504000, uint256S("0x00001a20bfdbec3a4640a5a0b494d8850326fbed04d790fb552198ef2b081782")) + (1505000, uint256S("0x00003ef1fdd6eb80ac9a5d58ae0323795e0ca7ff3942ef0b7738cc6c6af3ae27")) + (1506000, uint256S("0x00002c0517b5619ccc18ea8ac5717dc57cc3b613de03b040490199e463db2738")) + (1507000, uint256S("0x000051e4b0a891542c75f463c089d4e5f0e5af64a8d1aea734de1d28acfd2fb6")) + (1508000, uint256S("0x0000533831066724eab70c56e2ff2ea6d91a4af4c455b41f9dc6bd3072189fc9")) + (1509000, uint256S("0x00001305d4a25f67fc5365df6403a6caf3b44199cd7499da724eae6f2ccf65d5")) + (1510000, uint256S("0x000029fd6680e674dad7ad6a5fd3f44e73287062d47bb97c7644db3489a4fa36")) + (1511000, uint256S("0x00000e8c0c7c707dfde3d1b31a3290f8c90e709698e79c70c0c692d31a11ddde")) + (1512000, uint256S("0x0000619dc165673789b342d1840fdf31dbd3a0a1593513cafa3bb63af729402f")) + (1513000, uint256S("0x0000459b32b8f32c9f6744e4d7efe9dd2f387140cb1b0f9d4b6e9357f10ad16e")) + (1514000, uint256S("0x00006f522875038fce8852a8846919f8206026dca7932c996d5f32f49e31a35f")) + (1515000, uint256S("0x000039e9c41476289108b9b4c69adc07451a35fc9f156db6e7267cf2bd160d33")) + (1516000, uint256S("0x00003bf37101566dd38384ef39896ac740fb0d5cdfcdacab406bc89f3c3a1b1d")) + (1517000, uint256S("0x00004932a3e8b7a39d1af6e5687a73cdccc1da437bf14995c023f5f0d3cd66f2")) + (1518000, uint256S("0x0000637f5d64d8a2517a806c784086134630d740b932be18d45ae20f130e996a")) + (1519000, uint256S("0x00005340b308a63376f46ac08ebd71c70aebddaba4705122aa0a3019331bfc63")) + (1520000, uint256S("0x0000037445ddb55d5c28f2a4446780e4be0c7f47cccb626bb0fbb8a3a10f728a")) + (1521000, uint256S("0x00006946ca6a97c12f2b8e6009f40bf670914f9867fa846cab06f1e0a674c65b")) + (1522000, uint256S("0x000004827524135eab105b368e2aa794224de498f31392c0a6fd3a4aea38c837")) + (1523000, uint256S("0x000036e8232c944a7b9b2a2068555c91fd6529fdf335fa9626c5e096b2271ea8")) + (1524000, uint256S("0x000023c8cbb293fb6a3a973b5d7610ae3d88f7c8b6402248d8b81024d5cc5fcb")) + (1525000, uint256S("0x00005cd2813b417613f5dae9692064e6aa7fb8c74b71afc649f06128df62d0cf")) + (1526000, uint256S("0x00001ba5005432017e83161723a376e787796e66b66c65cf0cdb2a01dbe2040f")) + (1527000, uint256S("0x00001d5c090338beef5d6218e8f1b452098cad822f656e9c4c42188806d20b46")) + (1528000, uint256S("0x00000a466b5e366cebd5a05f4791664b692e7795bb432e860a7e6e9f51a7ec67")) + (1529000, uint256S("0x00005d9434f77694bc50168a7568a6bd8be685c9346dbe2e500ceaf188e43bb4")) + (1530000, uint256S("0x000059d5ff92b926dbff5b3d54f35a544b02501851c58d1abe75bffbd41dfc5e")) + (1531000, uint256S("0x000058b961b0a4c0bf3e3ef170d4a292fadcb35542b473a2427100e6438bcdf8")) + (1532000, uint256S("0x00002bb6b5aa24b3d8cef0a87fd2433e4a71044337af7d4b8efa2de3165c545d")) + (1533000, uint256S("0x00002f998ff8c1796e20a4a0fda67042a9536932631e36453fb0d572044b1236")) + (1534000, uint256S("0x000005b39e2588b0bde112382f92fa3c31b46fb8db4b9cf807aa6d55f4c8d818")) + (1535000, uint256S("0x000043743d50a88fa433397d198a0a7d695d38ba765ed10d256506e866b5a3de")) + (1536000, uint256S("0x00002c52d80c50f3a11bbea52bd8df8a79a09c7dff6f9d9bac57ef7af3a0f9f5")) + (1537000, uint256S("0x0000540162434470999d0b649f28f5372fa0a1e8ac0e1377fbb7cd4741b266c1")) + (1538000, uint256S("0x0000616aa7db059317abdf3474912a9d924b66dc2b5937b9b21810baf553237a")) + (1539000, uint256S("0x00003c64995ff3c589a2ac3f0471ebeb1542a7efc907c818081a41bbc803e429")) + (1540000, uint256S("0x00006e5ef028324567cb084b819d13b8ff2ba8d2d1f4d682cfba675455007a3d")) + (1541000, uint256S("0x00003d5fe2645115ea34279ce8fa1999e77242ee194cc0f8f28d6939cfe54e5b")) + (1542000, uint256S("0x00006fb56c95b6fc0b371d5028d26269c2f80bb8adaa2cc6521ee3e22db04b0b")) + (1543000, uint256S("0x00003f1d51f1135bc204c22bcf3401b580efb17b08a164c60d6d66ba2b6d58de")) + (1544000, uint256S("0x0000112c5a0b02d5258361bd4ca4e859c2cfaeb80caef4fb6dd6a79f1856d85b")) + (1545000, uint256S("0x0000369839fcf820ca45525787abc752a54826fd0a2ac5f6a4da13a1aefaa562")) + (1546000, uint256S("0x00006200ddb88ab631c1a2fe6b3fa3b19e7568069e0381e061af26c3578fef7c")) + (1547000, uint256S("0x000056f960fda0ec23bd1102a9b28d513e1f927449cc23a5e68f7e6ac9fee73f")) + (1548000, uint256S("0x0000528915ed9c5b205fa0c8d1e3e354df58d87facd66bb441c0b572416bc668")) + (1549000, uint256S("0x000058d83f9d7347a849e1097c45de1b2a3d8b0d66c2c9ffac1ef50d5f8f2e35")) + (1550000, uint256S("0x00002f2255e089937ae2c11e0bf2f096dd2e4602b9d1e2c10747ade07629b45b")) + (1551000, uint256S("0x00000b75bab95db82fe97910341f75a403ecd8ad7226e4cd20a1fdbe6e22c099")) + (1552000, uint256S("0x00006c630f876f9d8c511c56ece86f6649dfc4e431c10e1b07d6adbcf35083b0")) + (1553000, uint256S("0x000058856c3e68ed63195a8da5814c7a1163068e1431d2d956790a4ecf107f02")) + (1554000, uint256S("0x00006269759675c42f0fef86e5a638b8ffe8e8e0a93ea08483398dc70a1dd32f")) + (1555000, uint256S("0x00001350376b081909694bfabd00f0e87276bc896440f23ed0252f2e2a5194f5")) + (1556000, uint256S("0x00003d7079ef71e7c159e6ab1cd92f3af5ac9e362e42a14530f1c31a8b74f5b0")) + (1557000, uint256S("0x0000595ac7499c1fb41bd90a175c31ec50570d948491270931bd07e1492e251c")) + (1558000, uint256S("0x00000e52e16cbc10f302a8b1676eccc61a687d7e595830afd37a9e6a2a553673")) + (1559000, uint256S("0x000016ea90eaa3e6ed5ec1c0df2a9db32d4f5a3f85ef3ae276aa9aefca29d9cb")) + (1560000, uint256S("0x0000280433109582ea0c96fa1867c86f70600dac6f9914a91ea049969594b809")) + (1561000, uint256S("0x00006d64f133b1b715f1e8ba259f452e068d935216b52006623615cdeb5364bf")) + (1562000, uint256S("0x00005ce06c254d44629cb5c7e1444a2662e74a39020e05c43c64f4a0315e362a")) + (1563000, uint256S("0x000052fb949f15f05421f6682171802a7aa2138aafcc95d5f22bfb22542d59f4")) + (1564000, uint256S("0x000057d41a403a9f0c0ec301f45ca86e4cb3df50bcfda7d7b0bab86ba9122205")) + (1565000, uint256S("0x000051dad695df837258e4ab91db4f08efbaee1556a80b69a9c06461e1874a6f")) + (1566000, uint256S("0x000007d82ca32972994e90aa8e2cd9555e31f9f8277949405249f15d45e963ea")) + (1567000, uint256S("0x00002ddd9c4656c7d78d8917434f94070c0672967ae255d6f57646b9b09506ce")) + (1568000, uint256S("0x00006bca7a17c03734dfeca39f23510a8eb8f25030034c99daa52111119d6331")) + (1569000, uint256S("0x00007066b928536fc27343c0fec355ad0c52b59906223f48308e41c4ffd22339")) + (1570000, uint256S("0x00001e8f4d2fd86654189f494ace0a835f855c960358d901b51a0eacbb391543")) + (1571000, uint256S("0x00001309773bc979bed740fa624ed136241c8e492825b6ecfbdc39c025b24550")) + (1572000, uint256S("0x000038cfb767f3b97dd3b546f1e9e6e52d7a623dcb41c5a7454597cecc1db4b7")) + (1573000, uint256S("0x00008032108731e660a00b2812cb8b9a75f0ec16b143f9bceaf6410294c75904")) + (1574000, uint256S("0x00002f7c6593ffc9e2ad1eabb1c9b3ba04f43f433ca62e93c9f318c6fe5ee3d9")) + (1575000, uint256S("0x0000174e15f30ef6a742622af6659ad1c0641833156ac4c64144b54773cb7e30")) + (1576000, uint256S("0x000081f693a5455a8b28883eb4c97ae09440bfe6c81a0f8253bccc76cb644fb9")) + (1577000, uint256S("0x00006080530e97ff85b33784ea5fc8195320a4cb329e49a773df0a9f604a9aaa")) + (1578000, uint256S("0x00002821144963291e50d22046bf65f5c01ebbe1607746b34461013664039a93")) + (1579000, uint256S("0x00004cf0fa901f1e16bd5f0963773e5a5df0e210168a44a13be9398bfd7ca112")) + (1580000, uint256S("0x00001e5033df33216358904bbbf6cb9cb3b03b2956893cfd8c032b4e5c4ca08a")) + (1581000, uint256S("0x000087635ea70c8b1ccaa3754106dfb4f5d92219f522e7e7609b4dc75f404634")) + (1582000, uint256S("0x00007745f61f8e388b3d0ae55b6313a695cc8622d8d76497ea4745e294061f7e")) + (1583000, uint256S("0x0000636ab289c2287033066f8bea4222c5ee9dbdf3eab7945830d8779650a471")) + (1584000, uint256S("0x000004128d5a5cf452ef9aff1a87f39613ead76508367786c72679be963a6d4b")) + (1585000, uint256S("0x00000920f2773b73d275fef0ac909578d7d436423533c58b70201b552e010e74")) + (1586000, uint256S("0x000018fda4e4ca2e4f0716e30c9f743cd415947bff1a8eb384dd50c92b2f0143")) + (1587000, uint256S("0x00000aefb81fcf668e42994c46c961215518f712df4aa5556b7004a0c0bdc2c1")) + (1588000, uint256S("0x000037177927587a0e5903dbf93408ca263bcf868018d827f7b248bb36394a7d")) + (1589000, uint256S("0x00007e364a90288aae61feefbe6dcc218458c98ed9d4ab62a522a727f9dbd7e6")) + (1590000, uint256S("0x000047707a12173afcfff8dfa0ab9790c84a2f233630adb35187656cdce4dbfa")) + (1591000, uint256S("0x00001660b1ee772ad34fb435f8939f669ab3aa4e49c839f3c19fc380ce1bdb08")) + (1592000, uint256S("0x000016d5ee6370b9e4e3d7fdd60c5791032c6df4b396a1bfed2a517444955f6e")) + (1593000, uint256S("0x00002fd99027c0d83531ecd1b940f4c81b8f72796fba37f05f4f57cf788d2d90")) + (1594000, uint256S("0x0000075f6c2da6e0f6323d083fd69ad0ec7119356aaf50b6d02f859af1f868ae")) + (1595000, uint256S("0x0000a7ffc5b96746369c1a04dd062cc4ededf64f2a9ef11cf4b3bcab99946f55")) + (1596000, uint256S("0x0000930876f4fdaeb5e7ff316214247ab7d47fee47f6d3c65b93639f7fbea0a1")) + (1597000, uint256S("0x000064a14bdf8276b1ec884a0c9983f277a0bfeeeef5782b4e79dc7deae3c19e")) + (1598000, uint256S("0x000084c89eb1776d748687f2e180d6640e5a7cc8c8de75706b02e29f87fef8be")) + (1599000, uint256S("0x00001cdb7ec465e5edb8aaf78570970a425309f050fdb9ed376ad4b98a888b11")) + (1600000, uint256S("0x000026c04739309ae03a6578613b71fca0572c9793521809967ada579cc1830b")) + (1601000, uint256S("0x000090beea47fe396580e3669295f1463abc047585d3c5029d3a29e473f2e4e8")) + (1602000, uint256S("0x0000a8ca712ed653cf5cdf141382b02b552e21f4dc687a89ca946d7a236fca29")) + (1603000, uint256S("0x000009762ffa6eefefcd29703f41cf9bbe5e44b4a757968f107ad9e20679c373")) + ,(int64_t) 1726135603, // time of last checkpointed block + (int64_t) 1648798, // total txs + (double) 2460 // txs in the last day before block 1603341 }; } else { // all other HSC's with no checkpoints From 4fcb3e6ed5d0909fcebc50a2ac86c2dea0b2dc63 Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 12 Sep 2024 16:21:29 +0200 Subject: [PATCH 061/109] Add burn address to the notary list This change allows sending funds to the burn address. --- src/hush_defs.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hush_defs.h b/src/hush_defs.h index 25ac80f22..64ac4164e 100644 --- a/src/hush_defs.h +++ b/src/hush_defs.h @@ -541,10 +541,10 @@ static const char *notaries_list[NUM_HUSH_SEASONS][NUM_HUSH_NOTARIES][2] = {"RT6wVuFFPU5tY6C7Buup1GLV3SE5mpYEha", "02571085ead1aca86b9e90fa9a23d99a194c862524b0c714102888be5bf122dc7d"}, {"RSTgcpV82AivrvWJpd4LR2KwWirwbwXE3Y", "021a0ee4611ca4d8a2e209cc43b95036deb0a9d1cc31fc9f87d50233a44f05ec1a"}, {"RCiaXRzo4AAG3zmPL3Hx63NsRWv5UGiNuM", "02f4876be65c54613e47f7fac67f1453e8d8fde5e19fa53f278a1083a08b258ab3"}, - {"RCGgLWrTTaqBhUsS1BqrmFpJZAdNJMzscv", "02893d2db5329b15a33aa7edfbf323c85cabbdc25caa6cf6186fac6052ae6d96a0"}, - {"RAJWHL6MzGFKg7KB2sZ87KPQUSvxy3VrEW", "0389971362b002ab5dfa1b5f9c4f88e68249511a3935242ba1e0d31c1c88a36d70"}, - {"RU592tQnbH8gt6xd5Uu23nEw3SucDNkXmK", "02b8b6a2266fe57b25f2d4b1da93a07d27930154e78f9d137bc7509cf1ae8e3d49"}, - {"RLGCLRzaEmruPC9UmVt5qRHEhXwHip1e6d", "02a2fd96b4459411ad2b09597ba59cf52b282c56330da7c0cc6d2a5c0323a18f1e"} + {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, + {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, + {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, + {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"} } }; From aab240e3b34b934a329d5004ede79419368527fa Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 11:21:46 -0400 Subject: [PATCH 062/109] Temporary change to add -rdynamic to build flags This allows us to see function names in a backtrace when AssertLockHeld gives us an assert, which is helping to debug our deadlock bug. This code should be improved to only do this for debug builds. --- util/build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/build.sh b/util/build.sh index cbcd9a416..fcb3e2ef7 100755 --- a/util/build.sh +++ b/util/build.sh @@ -118,7 +118,8 @@ HOST="$HOST" BUILD="$BUILD" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -CONFIG_SITE="$PWD/depends/$HOST/share/config.site" ./configure "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" $CONFIGURE_FLAGS CXXFLAGS='-g' +#TODO: only use rdynamic for a debug build +CONFIG_SITE="$PWD/depends/$HOST/share/config.site" ./configure "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" $CONFIGURE_FLAGS CXXFLAGS='-g -rdynamic' # Build CryptoConditions stuff WD=$PWD From e104a33f2a0cd5af959c43a1b94c62fefdc07500 Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 12 Sep 2024 17:42:42 +0200 Subject: [PATCH 063/109] Add season 8 --- src/hush_defs.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/src/hush_defs.h b/src/hush_defs.h index 64ac4164e..cf71814d5 100644 --- a/src/hush_defs.h +++ b/src/hush_defs.h @@ -541,11 +541,78 @@ static const char *notaries_list[NUM_HUSH_SEASONS][NUM_HUSH_NOTARIES][2] = {"RT6wVuFFPU5tY6C7Buup1GLV3SE5mpYEha", "02571085ead1aca86b9e90fa9a23d99a194c862524b0c714102888be5bf122dc7d"}, {"RSTgcpV82AivrvWJpd4LR2KwWirwbwXE3Y", "021a0ee4611ca4d8a2e209cc43b95036deb0a9d1cc31fc9f87d50233a44f05ec1a"}, {"RCiaXRzo4AAG3zmPL3Hx63NsRWv5UGiNuM", "02f4876be65c54613e47f7fac67f1453e8d8fde5e19fa53f278a1083a08b258ab3"}, + {"RCGgLWrTTaqBhUsS1BqrmFpJZAdNJMzscv", "02893d2db5329b15a33aa7edfbf323c85cabbdc25caa6cf6186fac6052ae6d96a0"}, + {"RAJWHL6MzGFKg7KB2sZ87KPQUSvxy3VrEW", "0389971362b002ab5dfa1b5f9c4f88e68249511a3935242ba1e0d31c1c88a36d70"}, + {"RU592tQnbH8gt6xd5Uu23nEw3SucDNkXmK", "02b8b6a2266fe57b25f2d4b1da93a07d27930154e78f9d137bc7509cf1ae8e3d49"}, + {"RLGCLRzaEmruPC9UmVt5qRHEhXwHip1e6d", "02a2fd96b4459411ad2b09597ba59cf52b282c56330da7c0cc6d2a5c0323a18f1e"} + }, + { + // season 8 + {"RFetqf8WUfWnwNeXdknkm8ojk7EXnYFzrv", "038a1bd41a08f38edda51042988022933c5775dfce81f7bae0b32a9179650352ac"}, + {"RV7YSVW89WC9jBDtFG4ubtopDRove4Tfvc", "03c9d35488be73fe4f2dbb1dc011468482d71bac32249f8cce6480bcc574415d19"}, + {"RBPFE9oXceZBWTn3Vhne4FUKE9vxGEXUKX", "028a8bb6ded2692b39a69ec2d3c9836ff221815909d5cd65257374aeb66394a002"}, + {"RM3cvUcafPhjyypZLEginQjdhjLnSgJHte", "03a36180014115b47b97c1c8776a269bba66047b1ce2c7eb1a3d4e995a6dfff0df"}, + {"RFFX1VaTmZYPBLCzFj7w3iJQArV9ZdaWcW", "02190865f3ca3678d322c96e49a3ddf8ad394a4c8cd97d4bb3376cf547d0d83c66"}, + {"RDwZsLpH1QiAbJwUEY8ajXwTzu3PaWhx7n", "023ea0babb34e1ff9f4db8131ee84ad8991b954038a1e6ef9afc2a1b3fa13bbcb9"}, + {"RCUvfnmt16ZMvLTmLGGAztcAE8fBjfbP6u", "0379a5ba9fb6b463ffcdc0b1f3ecf45a5b737275354f9c2598492f20660f6f7dfd"}, + {"RBLu9adNVMVf6jzLLbAenWovcwq8nU6gYd", "022cd69381231d69d6d3b9638762df849bc7bbab71cbb8383eec29ca677f1afa30"}, + {"RWfv6wd2fwgecnJxC1Ykpf1SJefGh2Wc6i", "03da8a8f57d88afb61f712a8cd35462b65ce2b2575db8f9ee33a725dcd12c44755"}, + {"RWiK4xooG3dPdvaovu6JvR3DWoYD4tfRjx", "02ffe66af4d71345fe6984b5002ad69206e1817566a70d9ac406a679be6a3335a0"}, + {"RYLNiJiRnEGeMxx1Q2xLoFujshRNkBa2x4", "028ef6501004569c1170ce2d7ec7ecfe5739001130ad1b39129f8b88cd3d610257"}, + {"RTw36Ksy5Wk1Xv3B53T79zoRd6XDsE9MS6", "02d7cf4ece00895ca857fcdd0a4c2fc9c949a518d2750396f77d9f031c08a94364"}, + {"RTPkUBriQzZy67WmFhEs6aQzJn5HBB3ntb", "03319ca1eae5888c45115d160ac07c4f2abd1720926aa579d535c4b46c807bb7f7"}, + {"RBmZzttvDnMaEv47cWXs8SgdC993djB68r", "034302c4e1ff72a5f5391f259f7a46e646c7845aa2c9de9fb0c0a4c4802aad79d6"}, + {"RGocb2jLCa2E9kVHDUsijrVGTDP82ngGYZ", "024440a18a16e38b836b3ad9bb54ab0b5ba83b04edebb58c62c09b2de29e9fc703"}, + {"RVqwCjPQ6AJ6r9WeGzQvAT4eGXDScprLkW", "028a94e53ad8ed9e78f0f8a87cf3bc4754784222ad7ddf2d3dc5fafec2f6891cde"}, + {"RB2Xc8eLrATRWVsxrZKHHx3hyJz1vugMt9", "02eca07a9b5810fe929a87f90e5f02e29a06479d39cd3a888abfa1793e1565155a"}, + {"RKm7WUuFfqCTiUBkbxBsdh54nT6ivXpDPX", "03e3f634671005c8ffb7fe883fcf9e08f6f5486df057f215d761741d91c88de898"}, + {"RLbHTvFQoz946W3o3gXTrjxxADeUsWWW16", "02e6bb6dcecf5e3abfe239dec55842a92f096eeac7f0ff7621c3e8948e5e789b27"}, + {"RD75njr2RLGC5PqjHbWwuL7ndTqZiUfYxs", "0250d9996c25a34cb1b4e86303a297fc5c49c65615eb31a57fb17d1e1b376e71be"}, + {"RT1VTzZYZLWUsPWFJ2oypEqB1MXMfq8b5Y", "02d1797941b7df42a98f59ede0f22294e7c02754232a8b1de9512ededaf3f82880"}, + {"RKeXriTVXioHeKpFTjC8Cjohd6DHGUcKqt", "0341e62f0cdffc4ba3e0efb793c0fcaaad1b611db7021b844f643d5c25847733d2"}, + {"RQYrDEgZPKMFAgTHNkWFeMHEmpkXe8j28T", "02b8719cd8484755990158cbdf7b9d990d4a5c3741cabe204e51ed04be5bd50133"}, + {"RE85TACcn8CEn26itAxQV9afxV9mVg17vm", "0367f569d3dc304e699196fe9b798671fe3f12df7851a0a474879b0dbf8bc508d1"}, + {"RPYWQJXto1aeCGe8T6g9Wo4tAL4xE82LJ8", "02cf1e245dfb44e418fd550abb825a600e1753d46a51995970e70c98be539da33e"}, + {"RSVHRS5wqEw7bxfuE9k6xJGbARcy5guisp", "03ab8ac83d689ce76b5d29a54c3b34d0a6cb37d64313ff4467c744787475969a23"}, + {"REAQwBaJFo6DyBkwfW7rTTDbUtkdmATcQ8", "025e80f0075514cc5940de85c0c559efa99a3688faf6cccb8c1d1f38b96ca91e71"}, + {"RF1gz8QBw5uFScGasqVxoUjQwJCD9zHJwC", "031cdae4b545e5049ccee8e0cb792e25795b56e08b5e64b1d972c9b94e9bfd4ed0"}, + {"RTnLGoWzpsyoGSViGH8GyYcYhSveSEmnPV", "03cf3403a9d1cefa83e07b73e618a7f991d140a8283a02df3ce7c00223f27f43d0"}, + {"RArURqxp6qfF7fqv38tCYr6p4zBtLtqf4x", "026bc4c91c2c35fabe88fea6470d6cda98977a97c251656adf25b81653c00c3800"}, + {"RN8GCryShNFvBWtcNEWrQJ5A9AWb3JJoXt", "02afa94f6574cd0fe4f5dc83b09a2112457862421ce96bdc75c1cf25ef5b1f8c4b"}, + {"RQSC2eBckcFPWzq9UtofePC31wgDySfJtw", "035d570768d844c8150a3bd966a2e13aa99316f4ab3e80370c4d16fb02f95d0974"}, + {"RC4uQsfH6jXpgnTFuFiDwAFo58gHLNkWo7", "02402b0ab7001fd4bcb4fa0d8d7006a6c521b1c76e85aad7b374ecd6c5d564c237"}, + {"RREcuaUWSkNzTNPBbFLbXKTKiC4fd5t47J", "03d5bf8b43c44ba064e897da47dd36dba537bebf013d28247ce7a088496dd9b66d"}, + {"REFyC5e7kmse3PUapDuXHL2xmtYEGttYYL", "035f56fd01dd21725928bbd878b795dccafecc03b978dc83748e9194dcbfebfb79"}, + {"RH1BLwZosLp2hv9msdZGdSu93K8GrMWw7D", "0224ab22ece88f624f80a8535b8d5194646ad6be749070ec188a22c5e29fdd7098"}, + {"RNkhugMQVbqDysSayHu2eAhTQpXzKWqZ3m", "02caab4c83c8cc245a7aeb6d25504363555d1b0874aef0f9f8116b4ddb61f24799"}, + {"RKiyhLELDJATA7ZCUcutkP1WCEHnAgZRZ8", "028c01859a700ed3941a5786cf2043992e17a45c6689ac4bf608ad3f19e6d0e832"}, + {"RLKARvLNo6Abkh5qh5NVn2HJmYfj8ELa6A", "0300a33629da90b9d3c0519d796f4b1278355bb8c46e4caee04b1305e2ab2ff3f2"}, + {"RACX21FKLenyyEf8SYK3LmjsDzkDthwUbR", "0205d73c6a3e969eff29e5f424c861d22544245e09eaafc3fefe021cad052b7c0b"}, + {"RETb7pEDauKBEuTBuXDhKS3ksd2p8x9KYa", "025c1f7596fd0b7286e6ebd1b3c275a14a13aa4d134db4677769324969b7b7e3a5"}, + {"RJrAo78TL6zUmiHXbBv8oRhfGKxGnPnxUu", "02d40a76fbab96a78898b7579626be6dfe360c63b91030e513f849f212d57c1af6"}, + {"RL8g6ANxhZBPHHHWgApaiSQ2BSP9qKwuwf", "020236a5748ea49da891276bcb85dc03487cb9f3d0c2b2cdb35227b6a624f86797"}, + {"RY3vwBjuuTCiYL5am9HmwbdCjffWd9f4CE", "032f61fd08957d9b88dabc077d8732bef6c30d0234c14e02f3a741116834f591dc"}, + {"RQW4LsSzjCPtNw1HGamSaCoiirvsrZmDY5", "02e29451f9baf0186a655396726a22a20617a3e54ea895590f6066abc993f83d32"}, + {"RJtjorxqhazz39UpFdhDW8MiW4E3jhXDNk", "03795b7a650db872c22f13a9c88ad5c1ad3cb07a349f1f29e9789efd27e151164b"}, + {"RSi8AiCCtS3doFupdpdfuorAhkrCS6mLMu", "037a62ff6b7eb2ba1e170b5c42e7788817ded6a3a7ed841321c01cc107aa647d42"}, + {"RMjMXC8m9PgAaMMvwqgLCyCrv47pp6F6XY", "033bdf151c01bc733e614f9d4f204ca44396bf56984df6643205d349a35f7b265d"}, + {"RYB3ZMgHt4h7YL8TUzpqaSDw22ABksAPGC", "021266e045f95322fceddae02877dca9721792bef8f2be28cacd7c36290cd813a7"}, + {"RGwy64PXswUKpiepfzgaRW98v3gsuqPtow", "03008783c34c2622e7167f0a5201846133e530e89dfe1a8fbcf4c29b33051c4565"}, + {"RKJRPLaQV4AkWF6EfUUzFwawTGU4RQZgcS", "03c20a9fd21de76a20ffc87e384be735dfabb7f34a2d881ca9714830fb1bbe6bdb"}, + {"RQ4SPvBKTEKyV6y31iSihtfMxi3KeyAJgV", "033c5a23c75d946c15c15fac1e6d78e08c2b656549a158627cfb6bc44bb7b3a560"}, + {"RTvRBC1pCQpPKrS27Q4hUCVKVpa5tSTsFS", "02c25672fae388a0613d0127fcfe38ef37f5f354ecfdea0fb734528e354319bd9d"}, + {"RKxWu9HpCg7m3UeUGw2Xs1SpFiR96fSCQj", "02ec760d09b369b82b34d864af5a468d8a7dc5609b06bce455d045d1059c4b0f71"}, + {"RBAaUWAD8jwVLL7ueb7ciAQewqgheKxwdk", "0274ec3abcca214cdf7f1a565f5f3d3fa910e62e751a1ab0de148ea14ba72d6ba7"}, + {"RT853SBEGt4EWrKbpSujya69DG1jSNYjob", "02e80260ca44b8539159e6af678cf5ed0bc596753e4985f66418d6417085b4104e"}, + {"RKjEuhVByPwJcZ9wuBgfELiCVnBrc4F8i4", "0357c38f5d5eb1662a54b980c9243ddd8b2100d4b2b9f8175246938ef76e100678"}, + {"RT6wVuFFPU5tY6C7Buup1GLV3SE5mpYEha", "02571085ead1aca86b9e90fa9a23d99a194c862524b0c714102888be5bf122dc7d"}, + {"RSTgcpV82AivrvWJpd4LR2KwWirwbwXE3Y", "021a0ee4611ca4d8a2e209cc43b95036deb0a9d1cc31fc9f87d50233a44f05ec1a"}, + {"RCiaXRzo4AAG3zmPL3Hx63NsRWv5UGiNuM", "02f4876be65c54613e47f7fac67f1453e8d8fde5e19fa53f278a1083a08b258ab3"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"} - } + } }; #define SETBIT(bits,bitoffset) (((uint8_t *)bits)[(bitoffset) >> 3] |= (1 << ((bitoffset) & 7))) From 7f9878cf0cf8973a87837f4500d1671383573b82 Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 11:47:58 -0400 Subject: [PATCH 064/109] Take a lock on cs_main in DecrementNoteWitnesses Another possibly better approach would be to take a lock inside GetSaplingSpendDepth since we want the lock to apply to as little code as possible and it is GetSaplingSpendDepth that calls GetDepthInMainChain which requires a cs_main lock . --- src/wallet/wallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 18e38cb0c..6d8c78979 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -977,7 +977,7 @@ void CWallet::ClearNoteWitnessCache() void CWallet::DecrementNoteWitnesses(const CBlockIndex* pindex) { - LOCK(cs_wallet); + LOCK2(cs_main, cs_wallet); extern int32_t HUSH_REWIND; From f8e7df37a10c718a13d257264ba9056c81e8a8c0 Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 12:12:59 -0400 Subject: [PATCH 065/109] Delete commented out code --- src/main.cpp | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 169124334..7b885f081 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1732,22 +1732,6 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa tiptime = (uint32_t)time(NULL); else tiptime = (uint32_t)chainActive.LastTip()->nTime; - /* - // Node operator can choose to reject tx by number of transparent inputs - static_assert(std::numeric_limits::max() >= std::numeric_limits::max(), "size_t too small"); - const size_t limit = 0; //(size_t) GetArg("-mempooltxinputlimit", 0); - // Limit is ignored if Overwinter is active, which is the case on HUSH3 and all HAC's - if (NetworkUpgradeActive(nextBlockHeight, Params().GetConsensus(), Consensus::UPGRADE_OVERWINTER)) { - limit = 0; - } - if (limit > 0) { - size_t n = tx.vin.size(); - if (n > limit) { - LogPrint("mempool", "Dropping txid %s : too many transparent inputs %zu > limit %zu\n", tx.GetHash().ToString(), n, limit ); - return false; - } - } - */ auto verifier = libzcash::ProofVerifier::Strict(); if (!CheckTransaction(tiptime,tx, state, verifier, 0, 0)) From 25dc60e6b5604eb4e6787783f1698cc4a029e35f Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 12 Sep 2024 19:26:51 +0200 Subject: [PATCH 066/109] Revert "Add season 8" This reverts commit e104a33f2a0cd5af959c43a1b94c62fefdc07500. --- src/hush_defs.h | 69 +------------------------------------------------ 1 file changed, 1 insertion(+), 68 deletions(-) diff --git a/src/hush_defs.h b/src/hush_defs.h index cf71814d5..64ac4164e 100644 --- a/src/hush_defs.h +++ b/src/hush_defs.h @@ -541,78 +541,11 @@ static const char *notaries_list[NUM_HUSH_SEASONS][NUM_HUSH_NOTARIES][2] = {"RT6wVuFFPU5tY6C7Buup1GLV3SE5mpYEha", "02571085ead1aca86b9e90fa9a23d99a194c862524b0c714102888be5bf122dc7d"}, {"RSTgcpV82AivrvWJpd4LR2KwWirwbwXE3Y", "021a0ee4611ca4d8a2e209cc43b95036deb0a9d1cc31fc9f87d50233a44f05ec1a"}, {"RCiaXRzo4AAG3zmPL3Hx63NsRWv5UGiNuM", "02f4876be65c54613e47f7fac67f1453e8d8fde5e19fa53f278a1083a08b258ab3"}, - {"RCGgLWrTTaqBhUsS1BqrmFpJZAdNJMzscv", "02893d2db5329b15a33aa7edfbf323c85cabbdc25caa6cf6186fac6052ae6d96a0"}, - {"RAJWHL6MzGFKg7KB2sZ87KPQUSvxy3VrEW", "0389971362b002ab5dfa1b5f9c4f88e68249511a3935242ba1e0d31c1c88a36d70"}, - {"RU592tQnbH8gt6xd5Uu23nEw3SucDNkXmK", "02b8b6a2266fe57b25f2d4b1da93a07d27930154e78f9d137bc7509cf1ae8e3d49"}, - {"RLGCLRzaEmruPC9UmVt5qRHEhXwHip1e6d", "02a2fd96b4459411ad2b09597ba59cf52b282c56330da7c0cc6d2a5c0323a18f1e"} - }, - { - // season 8 - {"RFetqf8WUfWnwNeXdknkm8ojk7EXnYFzrv", "038a1bd41a08f38edda51042988022933c5775dfce81f7bae0b32a9179650352ac"}, - {"RV7YSVW89WC9jBDtFG4ubtopDRove4Tfvc", "03c9d35488be73fe4f2dbb1dc011468482d71bac32249f8cce6480bcc574415d19"}, - {"RBPFE9oXceZBWTn3Vhne4FUKE9vxGEXUKX", "028a8bb6ded2692b39a69ec2d3c9836ff221815909d5cd65257374aeb66394a002"}, - {"RM3cvUcafPhjyypZLEginQjdhjLnSgJHte", "03a36180014115b47b97c1c8776a269bba66047b1ce2c7eb1a3d4e995a6dfff0df"}, - {"RFFX1VaTmZYPBLCzFj7w3iJQArV9ZdaWcW", "02190865f3ca3678d322c96e49a3ddf8ad394a4c8cd97d4bb3376cf547d0d83c66"}, - {"RDwZsLpH1QiAbJwUEY8ajXwTzu3PaWhx7n", "023ea0babb34e1ff9f4db8131ee84ad8991b954038a1e6ef9afc2a1b3fa13bbcb9"}, - {"RCUvfnmt16ZMvLTmLGGAztcAE8fBjfbP6u", "0379a5ba9fb6b463ffcdc0b1f3ecf45a5b737275354f9c2598492f20660f6f7dfd"}, - {"RBLu9adNVMVf6jzLLbAenWovcwq8nU6gYd", "022cd69381231d69d6d3b9638762df849bc7bbab71cbb8383eec29ca677f1afa30"}, - {"RWfv6wd2fwgecnJxC1Ykpf1SJefGh2Wc6i", "03da8a8f57d88afb61f712a8cd35462b65ce2b2575db8f9ee33a725dcd12c44755"}, - {"RWiK4xooG3dPdvaovu6JvR3DWoYD4tfRjx", "02ffe66af4d71345fe6984b5002ad69206e1817566a70d9ac406a679be6a3335a0"}, - {"RYLNiJiRnEGeMxx1Q2xLoFujshRNkBa2x4", "028ef6501004569c1170ce2d7ec7ecfe5739001130ad1b39129f8b88cd3d610257"}, - {"RTw36Ksy5Wk1Xv3B53T79zoRd6XDsE9MS6", "02d7cf4ece00895ca857fcdd0a4c2fc9c949a518d2750396f77d9f031c08a94364"}, - {"RTPkUBriQzZy67WmFhEs6aQzJn5HBB3ntb", "03319ca1eae5888c45115d160ac07c4f2abd1720926aa579d535c4b46c807bb7f7"}, - {"RBmZzttvDnMaEv47cWXs8SgdC993djB68r", "034302c4e1ff72a5f5391f259f7a46e646c7845aa2c9de9fb0c0a4c4802aad79d6"}, - {"RGocb2jLCa2E9kVHDUsijrVGTDP82ngGYZ", "024440a18a16e38b836b3ad9bb54ab0b5ba83b04edebb58c62c09b2de29e9fc703"}, - {"RVqwCjPQ6AJ6r9WeGzQvAT4eGXDScprLkW", "028a94e53ad8ed9e78f0f8a87cf3bc4754784222ad7ddf2d3dc5fafec2f6891cde"}, - {"RB2Xc8eLrATRWVsxrZKHHx3hyJz1vugMt9", "02eca07a9b5810fe929a87f90e5f02e29a06479d39cd3a888abfa1793e1565155a"}, - {"RKm7WUuFfqCTiUBkbxBsdh54nT6ivXpDPX", "03e3f634671005c8ffb7fe883fcf9e08f6f5486df057f215d761741d91c88de898"}, - {"RLbHTvFQoz946W3o3gXTrjxxADeUsWWW16", "02e6bb6dcecf5e3abfe239dec55842a92f096eeac7f0ff7621c3e8948e5e789b27"}, - {"RD75njr2RLGC5PqjHbWwuL7ndTqZiUfYxs", "0250d9996c25a34cb1b4e86303a297fc5c49c65615eb31a57fb17d1e1b376e71be"}, - {"RT1VTzZYZLWUsPWFJ2oypEqB1MXMfq8b5Y", "02d1797941b7df42a98f59ede0f22294e7c02754232a8b1de9512ededaf3f82880"}, - {"RKeXriTVXioHeKpFTjC8Cjohd6DHGUcKqt", "0341e62f0cdffc4ba3e0efb793c0fcaaad1b611db7021b844f643d5c25847733d2"}, - {"RQYrDEgZPKMFAgTHNkWFeMHEmpkXe8j28T", "02b8719cd8484755990158cbdf7b9d990d4a5c3741cabe204e51ed04be5bd50133"}, - {"RE85TACcn8CEn26itAxQV9afxV9mVg17vm", "0367f569d3dc304e699196fe9b798671fe3f12df7851a0a474879b0dbf8bc508d1"}, - {"RPYWQJXto1aeCGe8T6g9Wo4tAL4xE82LJ8", "02cf1e245dfb44e418fd550abb825a600e1753d46a51995970e70c98be539da33e"}, - {"RSVHRS5wqEw7bxfuE9k6xJGbARcy5guisp", "03ab8ac83d689ce76b5d29a54c3b34d0a6cb37d64313ff4467c744787475969a23"}, - {"REAQwBaJFo6DyBkwfW7rTTDbUtkdmATcQ8", "025e80f0075514cc5940de85c0c559efa99a3688faf6cccb8c1d1f38b96ca91e71"}, - {"RF1gz8QBw5uFScGasqVxoUjQwJCD9zHJwC", "031cdae4b545e5049ccee8e0cb792e25795b56e08b5e64b1d972c9b94e9bfd4ed0"}, - {"RTnLGoWzpsyoGSViGH8GyYcYhSveSEmnPV", "03cf3403a9d1cefa83e07b73e618a7f991d140a8283a02df3ce7c00223f27f43d0"}, - {"RArURqxp6qfF7fqv38tCYr6p4zBtLtqf4x", "026bc4c91c2c35fabe88fea6470d6cda98977a97c251656adf25b81653c00c3800"}, - {"RN8GCryShNFvBWtcNEWrQJ5A9AWb3JJoXt", "02afa94f6574cd0fe4f5dc83b09a2112457862421ce96bdc75c1cf25ef5b1f8c4b"}, - {"RQSC2eBckcFPWzq9UtofePC31wgDySfJtw", "035d570768d844c8150a3bd966a2e13aa99316f4ab3e80370c4d16fb02f95d0974"}, - {"RC4uQsfH6jXpgnTFuFiDwAFo58gHLNkWo7", "02402b0ab7001fd4bcb4fa0d8d7006a6c521b1c76e85aad7b374ecd6c5d564c237"}, - {"RREcuaUWSkNzTNPBbFLbXKTKiC4fd5t47J", "03d5bf8b43c44ba064e897da47dd36dba537bebf013d28247ce7a088496dd9b66d"}, - {"REFyC5e7kmse3PUapDuXHL2xmtYEGttYYL", "035f56fd01dd21725928bbd878b795dccafecc03b978dc83748e9194dcbfebfb79"}, - {"RH1BLwZosLp2hv9msdZGdSu93K8GrMWw7D", "0224ab22ece88f624f80a8535b8d5194646ad6be749070ec188a22c5e29fdd7098"}, - {"RNkhugMQVbqDysSayHu2eAhTQpXzKWqZ3m", "02caab4c83c8cc245a7aeb6d25504363555d1b0874aef0f9f8116b4ddb61f24799"}, - {"RKiyhLELDJATA7ZCUcutkP1WCEHnAgZRZ8", "028c01859a700ed3941a5786cf2043992e17a45c6689ac4bf608ad3f19e6d0e832"}, - {"RLKARvLNo6Abkh5qh5NVn2HJmYfj8ELa6A", "0300a33629da90b9d3c0519d796f4b1278355bb8c46e4caee04b1305e2ab2ff3f2"}, - {"RACX21FKLenyyEf8SYK3LmjsDzkDthwUbR", "0205d73c6a3e969eff29e5f424c861d22544245e09eaafc3fefe021cad052b7c0b"}, - {"RETb7pEDauKBEuTBuXDhKS3ksd2p8x9KYa", "025c1f7596fd0b7286e6ebd1b3c275a14a13aa4d134db4677769324969b7b7e3a5"}, - {"RJrAo78TL6zUmiHXbBv8oRhfGKxGnPnxUu", "02d40a76fbab96a78898b7579626be6dfe360c63b91030e513f849f212d57c1af6"}, - {"RL8g6ANxhZBPHHHWgApaiSQ2BSP9qKwuwf", "020236a5748ea49da891276bcb85dc03487cb9f3d0c2b2cdb35227b6a624f86797"}, - {"RY3vwBjuuTCiYL5am9HmwbdCjffWd9f4CE", "032f61fd08957d9b88dabc077d8732bef6c30d0234c14e02f3a741116834f591dc"}, - {"RQW4LsSzjCPtNw1HGamSaCoiirvsrZmDY5", "02e29451f9baf0186a655396726a22a20617a3e54ea895590f6066abc993f83d32"}, - {"RJtjorxqhazz39UpFdhDW8MiW4E3jhXDNk", "03795b7a650db872c22f13a9c88ad5c1ad3cb07a349f1f29e9789efd27e151164b"}, - {"RSi8AiCCtS3doFupdpdfuorAhkrCS6mLMu", "037a62ff6b7eb2ba1e170b5c42e7788817ded6a3a7ed841321c01cc107aa647d42"}, - {"RMjMXC8m9PgAaMMvwqgLCyCrv47pp6F6XY", "033bdf151c01bc733e614f9d4f204ca44396bf56984df6643205d349a35f7b265d"}, - {"RYB3ZMgHt4h7YL8TUzpqaSDw22ABksAPGC", "021266e045f95322fceddae02877dca9721792bef8f2be28cacd7c36290cd813a7"}, - {"RGwy64PXswUKpiepfzgaRW98v3gsuqPtow", "03008783c34c2622e7167f0a5201846133e530e89dfe1a8fbcf4c29b33051c4565"}, - {"RKJRPLaQV4AkWF6EfUUzFwawTGU4RQZgcS", "03c20a9fd21de76a20ffc87e384be735dfabb7f34a2d881ca9714830fb1bbe6bdb"}, - {"RQ4SPvBKTEKyV6y31iSihtfMxi3KeyAJgV", "033c5a23c75d946c15c15fac1e6d78e08c2b656549a158627cfb6bc44bb7b3a560"}, - {"RTvRBC1pCQpPKrS27Q4hUCVKVpa5tSTsFS", "02c25672fae388a0613d0127fcfe38ef37f5f354ecfdea0fb734528e354319bd9d"}, - {"RKxWu9HpCg7m3UeUGw2Xs1SpFiR96fSCQj", "02ec760d09b369b82b34d864af5a468d8a7dc5609b06bce455d045d1059c4b0f71"}, - {"RBAaUWAD8jwVLL7ueb7ciAQewqgheKxwdk", "0274ec3abcca214cdf7f1a565f5f3d3fa910e62e751a1ab0de148ea14ba72d6ba7"}, - {"RT853SBEGt4EWrKbpSujya69DG1jSNYjob", "02e80260ca44b8539159e6af678cf5ed0bc596753e4985f66418d6417085b4104e"}, - {"RKjEuhVByPwJcZ9wuBgfELiCVnBrc4F8i4", "0357c38f5d5eb1662a54b980c9243ddd8b2100d4b2b9f8175246938ef76e100678"}, - {"RT6wVuFFPU5tY6C7Buup1GLV3SE5mpYEha", "02571085ead1aca86b9e90fa9a23d99a194c862524b0c714102888be5bf122dc7d"}, - {"RSTgcpV82AivrvWJpd4LR2KwWirwbwXE3Y", "021a0ee4611ca4d8a2e209cc43b95036deb0a9d1cc31fc9f87d50233a44f05ec1a"}, - {"RCiaXRzo4AAG3zmPL3Hx63NsRWv5UGiNuM", "02f4876be65c54613e47f7fac67f1453e8d8fde5e19fa53f278a1083a08b258ab3"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"} - } + } }; #define SETBIT(bits,bitoffset) (((uint8_t *)bits)[(bitoffset) >> 3] |= (1 << ((bitoffset) & 7))) From d3cfecc425fe622aa197bf9e9dd8bca458335407 Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 12 Sep 2024 19:28:30 +0200 Subject: [PATCH 067/109] Revert "Add burn address to the notary list" This reverts commit 4fcb3e6ed5d0909fcebc50a2ac86c2dea0b2dc63. --- src/hush_defs.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hush_defs.h b/src/hush_defs.h index 64ac4164e..25ac80f22 100644 --- a/src/hush_defs.h +++ b/src/hush_defs.h @@ -541,10 +541,10 @@ static const char *notaries_list[NUM_HUSH_SEASONS][NUM_HUSH_NOTARIES][2] = {"RT6wVuFFPU5tY6C7Buup1GLV3SE5mpYEha", "02571085ead1aca86b9e90fa9a23d99a194c862524b0c714102888be5bf122dc7d"}, {"RSTgcpV82AivrvWJpd4LR2KwWirwbwXE3Y", "021a0ee4611ca4d8a2e209cc43b95036deb0a9d1cc31fc9f87d50233a44f05ec1a"}, {"RCiaXRzo4AAG3zmPL3Hx63NsRWv5UGiNuM", "02f4876be65c54613e47f7fac67f1453e8d8fde5e19fa53f278a1083a08b258ab3"}, - {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, - {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, - {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"}, - {"RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY", "000000000000000000000000000000000000000000000000000000000000000000"} + {"RCGgLWrTTaqBhUsS1BqrmFpJZAdNJMzscv", "02893d2db5329b15a33aa7edfbf323c85cabbdc25caa6cf6186fac6052ae6d96a0"}, + {"RAJWHL6MzGFKg7KB2sZ87KPQUSvxy3VrEW", "0389971362b002ab5dfa1b5f9c4f88e68249511a3935242ba1e0d31c1c88a36d70"}, + {"RU592tQnbH8gt6xd5Uu23nEw3SucDNkXmK", "02b8b6a2266fe57b25f2d4b1da93a07d27930154e78f9d137bc7509cf1ae8e3d49"}, + {"RLGCLRzaEmruPC9UmVt5qRHEhXwHip1e6d", "02a2fd96b4459411ad2b09597ba59cf52b282c56330da7c0cc6d2a5c0323a18f1e"} } }; From 04165e161ab170936db26ecbe14d1ad1d1791d83 Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 13:40:30 -0400 Subject: [PATCH 068/109] Explain more details about the burn address --- src/hush_bitcoind.h | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/hush_bitcoind.h b/src/hush_bitcoind.h index de16d72ae..218f09db7 100644 --- a/src/hush_bitcoind.h +++ b/src/hush_bitcoind.h @@ -24,7 +24,17 @@ #include "cc/CCinclude.h" #include "sietch.h" -// this is the address for pubkey = 0x000000000000000000000000000000000 (33 bytes) +// This is the address for pubkey = 0x000000000000000000000000000000000 (33 bytes) +// Funds sent to a burn address can never be spent because the pubkey is invalid +// because it is not a point on the elliptic curve we use (secp256k1, like all other +// Bitcoin-derived codebases). secp256k1 is defined by the equation y^2 = x^3 + 7 . +// Using pubkey=0 also implies privkey=0 and the (pubkey,privkey) pair are the same +// as the (x,y) pair in the equation. If you plug in (0,0) to the equation you get +// 0^2 = 0^3 + 7 or 0=7 which is false. This means that (0,0) is not a valid point +// on the secp256k1 curve. Therefore there is no valid signature to spend the funds +// sent to the burn address, because a valid signature must use a valid point on the +// elliptic curve being used. For these reasons, we can prove that the burn address +// receives funds which can never be spent. #define BURN_ADDRESS "RD6GgnrMpPaTSMn8vai6yiGA7mN4QGPVMY" int32_t hush_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); From 8b0c0493ac175cb12c039407489f3f2e37423d8a Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 19:47:42 -0400 Subject: [PATCH 069/109] Ensure cs_main lock is held when TestBlockValidity() is called --- src/miner.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/miner.cpp b/src/miner.cpp index 436a59262..6bc205ed4 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1334,6 +1334,8 @@ void static RandomXMiner() } CValidationState state; + { LOCK(cs_main); + if ( !TestBlockValidity(state,B, chainActive.LastTip(), true, false)) { h = UintToArith256(B.GetHash()); @@ -1344,6 +1346,8 @@ void static RandomXMiner() fprintf(stderr,"\n"); return(false); } + + } SetThreadPriority(THREAD_PRIORITY_NORMAL); LogPrintf("HushRandomXMiner:\n"); LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", B.GetHash().GetHex(), HASHTarget.GetHex()); @@ -1702,6 +1706,8 @@ void static BitcoinMiner() fprintf(stderr," mined %s block %d!\n",SMART_CHAIN_SYMBOL,Mining_height); } CValidationState state; + { LOCK(cs_main); + if ( !TestBlockValidity(state,B, chainActive.LastTip(), true, false)) { h = UintToArith256(B.GetHash()); @@ -1711,6 +1717,8 @@ void static BitcoinMiner() gotinvalid = 1; return(false); } + + } HUSH_CHOSEN_ONE = 1; // Found a solution SetThreadPriority(THREAD_PRIORITY_NORMAL); From 215d0b7db4b29efd75806d43453f15b07da992d5 Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 20:02:10 -0400 Subject: [PATCH 070/109] Remove commented out code --- src/miner.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 6bc205ed4..b3d7fd324 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -308,12 +308,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 bool fMissingInputs = false; bool fNotarization = false; std::vector TMP_NotarizationNotaries; - //if (tx.IsCoinImport()) - //{ - // CAmount nValueIn = GetCoinImportValue(tx); // burn amount - // nTotalIn += nValueIn; - // dPriority += (double)nValueIn * 1000; // flat multiplier... max = 1e16. - //} else + { TMP_NotarizationNotaries.clear(); bool fToCryptoAddress = false; @@ -322,15 +317,6 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 BOOST_FOREACH(const CTxIn& txin, tx.vin) { - /* - if (tx.IsPegsImport() && txin.prevout.n==10e8) - { - CAmount nValueIn = GetCoinImportValue(tx); // burn amount - nTotalIn += nValueIn; - dPriority += (double)nValueIn * 1000; // flat multiplier... max = 1e16. - continue; - } - */ // Read prev transaction if (!view.HaveCoins(txin.prevout.hash)) { From 7e486538c9cb75e91e6df0b7a28ef7c686f8157d Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 12 Sep 2024 20:12:26 -0400 Subject: [PATCH 071/109] SMART_CHAIN_SYMBOL is always set, so we can remove these checks --- src/miner.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index b3d7fd324..1bc0e984d 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -697,7 +697,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 if ( totalsats == 0 ) { fprintf(stderr, "Could not create notary payment, trying again.\n"); - if ( SMART_CHAIN_SYMBOL[0] == 0 || (SMART_CHAIN_SYMBOL[0] != 0 && !isStake) ) + if ( !isStake ) { LEAVE_CRITICAL_SECTION(cs_main); LEAVE_CRITICAL_SECTION(mempool.cs); @@ -743,13 +743,13 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 pblock->nSolution.clear(); pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]); - if ( ASSETCHAINS_CC == 0 && pindexPrev != 0 && ASSETCHAINS_STAKED == 0 && (SMART_CHAIN_SYMBOL[0] != 0 || IS_HUSH_NOTARY == 0 || My_notaryid < 0) ) + if ( ASSETCHAINS_CC == 0 && pindexPrev != 0 && ASSETCHAINS_STAKED == 0 && (IS_HUSH_NOTARY == 0 || My_notaryid < 0) ) { CValidationState state; //fprintf(stderr,"%s: check validity\n", __func__); if ( !TestBlockValidity(state, *pblock, pindexPrev, false, false)) // invokes CC checks { - if ( (SMART_CHAIN_SYMBOL[0] != 0 && !isStake) ) + if ( !isStake ) { LEAVE_CRITICAL_SECTION(cs_main); LEAVE_CRITICAL_SECTION(mempool.cs); @@ -761,7 +761,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 //fprintf(stderr,"valid\n"); } } - if ( (SMART_CHAIN_SYMBOL[0] != 0 && !isStake) ) + if ( !isStake ) { LEAVE_CRITICAL_SECTION(cs_main); LEAVE_CRITICAL_SECTION(mempool.cs); From 84377caae78116b817dbb64434def0b1ecffab74 Mon Sep 17 00:00:00 2001 From: fekt Date: Fri, 13 Sep 2024 04:22:08 +0000 Subject: [PATCH 072/109] Fix memory DoS --- src/main.cpp | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ae5e27916..4a9de15a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7320,6 +7320,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } LOCK(cs_main); + + const uint256* best_block{nullptr}; std::vector vToFetch; @@ -7339,35 +7341,31 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (inv.type == MSG_BLOCK) { UpdateBlockAvailability(pfrom->GetId(), inv.hash); if (!fAlreadyHave && !fImporting && !fReindex && !mapBlocksInFlight.count(inv.hash)) { - // First request the headers preceding the announced block. In the normal fully-synced - // case where a new block is announced that succeeds the current tip (no reorganization), - // there are no such headers. - // Secondly, and only when we are close to being synced, we request the announced block directly, - // to avoid an extra round-trip. Note that we must *first* ask for the headers, so by the - // time the block arrives, the header chain leading up to it is already validated. Not - // doing this will result in the received block being rejected as an orphan in case it is - // not a direct successor. - pfrom->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), inv.hash); - CNodeState *nodestate = State(pfrom->GetId()); - if (chainActive.Tip()->GetBlockTime() > GetTime() - chainparams.GetConsensus().nPowTargetSpacing * 20 && - nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) { - vToFetch.push_back(inv); - // Mark block as in flight already, even though the actual "getdata" message only goes out - // later (within the same cs_main lock, though). - MarkBlockAsInFlight(pfrom->GetId(), inv.hash, chainparams.GetConsensus()); - } - LogPrint("net", "getheaders (%d) %s to peer=%d\n", pindexBestHeader->GetHeight(), inv.hash.ToString(), pfrom->id); + // Headers-first is the primary method of announcement on + // the network. If a node fell back to sending blocks by inv, + // it's probably for a re-org. The final block hash + // provided should be the highest, so send a getheaders and + // then fetch the blocks we need to catch up. + best_block = &inv.hash; } + } else { + pfrom->AddKnownWTxId(WTxId(inv.hash, inv.hashAux)); + if (fBlocksOnly) + LogPrint("net", "transaction (%s) inv sent in violation of protocol peer=%d\n", inv.hash.ToString(), pfrom->id); + else if (!fAlreadyHave && !IsInitialBlockDownload(chainparams.GetConsensus())) + pfrom->AskFor(inv); } - if (pfrom->nSendSize > (SendBufferSize() * 2)) { Misbehaving(pfrom->GetId(), 50); return error("send buffer size() = %u", pfrom->nSendSize); } } - if (!vToFetch.empty()) - pfrom->PushMessage(NetMsgType::GETDATA, vToFetch); + if (best_block != nullptr) { + pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexBestHeader), *best_block); + LogPrint("net", "getheaders (%d) %s to peer=%d\n", pindexBestHeader->GetHeight(), best_block->ToString(), pfrom->id); + } + } else if (strCommand == NetMsgType::GETDATA) { vector vInv; vRecv >> vInv; From 72c530d2811cb5e2cca6d085a1f06178eb3746ca Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Sep 2024 03:50:07 -0400 Subject: [PATCH 073/109] SMART_CHAIN_SYMBOL is always defined --- src/bitcoind.cpp | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 609fb5555..22bffe71a 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -74,30 +74,17 @@ void WaitForShutdown(boost::thread_group* threadGroup) while (!fShutdown) { - //fprintf(stderr,"call passport iteration\n"); - if ( SMART_CHAIN_SYMBOL[0] == 0 ) - { - if ( HUSH_NSPV_FULLNODE ) - hush_passport_iteration(); - for (i=0; i<10; i++) - { - fShutdown = ShutdownRequested(); - if ( fShutdown != 0 ) - break; - MilliSleep(1000); - } - } else { - //hush_longestchain(); - if ( ASSETCHAINS_CBOPRET != 0 ) - hush_cbopretupdate(0); - for (i=0; i<=ASSETCHAINS_BLOCKTIME/5; i++) - { - fShutdown = ShutdownRequested(); - if ( fShutdown != 0 ) - break; - MilliSleep(1000); - } - } + //hush_longestchain(); + if ( ASSETCHAINS_CBOPRET != 0 ) + hush_cbopretupdate(0); + for (i=0; i<=ASSETCHAINS_BLOCKTIME/5; i++) + { + fShutdown = ShutdownRequested(); + if ( fShutdown != 0 ) + break; + MilliSleep(1000); + } + fShutdown = ShutdownRequested(); } //fprintf(stderr,"%s: fShutdown=%d\n", __FUNCTION__, fShutdown); From be3641158a67cf41d711614f614b14eb96b85fac Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Sep 2024 04:11:38 -0400 Subject: [PATCH 074/109] Only take cs_main lock in GetSaplingSpendDepth We do not seem to need this lock for the entire DecrementNoteWitnesses function, we need it only when calling GetSaplingSpendDepth. Also protects against the case in the future where some code without cs_main calls GetSaplingSpendDepth. --- src/wallet/wallet.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 6d8c78979..26faed52a 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -887,6 +887,8 @@ bool CWallet::IsSaplingSpent(const uint256& nullifier) const { } unsigned int CWallet::GetSaplingSpendDepth(const uint256& nullifier) const { + LOCK(cs_main); + pair range; range = mapTxSaplingNullifiers.equal_range(nullifier); @@ -977,10 +979,11 @@ void CWallet::ClearNoteWitnessCache() void CWallet::DecrementNoteWitnesses(const CBlockIndex* pindex) { - LOCK2(cs_main, cs_wallet); extern int32_t HUSH_REWIND; + LOCK(cs_wallet); + for (std::pair& wtxItem : mapWallet) { //Sapling for (auto& item : wtxItem.second.mapSaplingNoteData) { From 6845fcd93ac237fe9959d1ddfc4baf6dfa77e94c Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Sep 2024 04:22:28 -0400 Subject: [PATCH 075/109] This rpc can only be used on non z2z chains --- src/wallet/rpcwallet.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index ec99d7516..46a059892 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -629,7 +629,7 @@ UniValue kvupdate(const UniValue& params, bool fHelp, const CPubKey& mypk) if (fHelp || params.size() < 3 ) throw runtime_error( "kvupdate key \"value\" days passphrase\n" - "\nStore a key value. This feature is only available for asset chains.\n" + "\nStore a key value. This feature is only available for non-z2z chains.\n" "\nArguments:\n" "1. key (string, required) key\n" "2. \"value\" (string, required) value\n" @@ -654,8 +654,11 @@ UniValue kvupdate(const UniValue& params, bool fHelp, const CPubKey& mypk) ); if (!EnsureWalletIsAvailable(fHelp)) return 0; - if ( SMART_CHAIN_SYMBOL[0] == 0 ) - return(0); + + if (ASSETCHAINS_PRIVATE) { + throw JSONRPCError(RPC_TYPE_ERROR, "This RPC is only available on non z2z chains"); + } + haveprivkey = 0; memset(&sig,0,sizeof(sig)); memset(&privkey,0,sizeof(privkey)); From f5cae3b4035ece57a1a2a69bac0c0aef07ee6eb5 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Sep 2024 04:37:48 -0400 Subject: [PATCH 076/109] getinfo rpc needs a cs_wallet lock Without it we get an AssertLockHeld when calling GetKeyPoolSize . We could probably make this lock apply to less code, possibly only the single line that calls GetKeyPoolSize() needs it. --- src/rpc/misc.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index f70f60f79..97ed6348e 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -231,11 +231,12 @@ UniValue getinfo(const UniValue& params, bool fHelp, const CPubKey& mypk) + HelpExampleCli("getinfo", "") + HelpExampleRpc("getinfo", "") ); - //#ifdef ENABLE_WALLET - // LOCK2(cs_main, pwalletMain ? &pwalletMain->cs_wallet : NULL); - //#else + +#ifdef ENABLE_WALLET + LOCK2(cs_main, pwalletMain ? &pwalletMain->cs_wallet : NULL); +#else LOCK(cs_main); - //#endif +#endif proxyType proxy; GetProxy(NET_IPV4, proxy); From 4f4a72da8eb06a3fdea72981f606adee307e5aab Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Sep 2024 09:28:59 -0400 Subject: [PATCH 077/109] Go back to taking both main+wallet lock in DecrementWitnesses By taking a wallet lock first and then main later we run into a potential deadlock : 2024-09-13 11:14:37 POTENTIAL DEADLOCK DETECTED 2024-09-13 11:14:37 Previous lock order was: 2024-09-13 11:14:37 (1) cs_wallet wallet/wallet.cpp:985 2024-09-13 11:14:37 (2) cs_main wallet/wallet.cpp:890 2024-09-13 11:14:37 Current lock order is: 2024-09-13 11:14:37 (2) cs_main wallet/wallet.cpp:2845 2024-09-13 11:14:37 (1) cs_wallet wallet/wallet.cpp:2845 --- src/wallet/wallet.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 26faed52a..01af7b78e 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -887,7 +887,6 @@ bool CWallet::IsSaplingSpent(const uint256& nullifier) const { } unsigned int CWallet::GetSaplingSpendDepth(const uint256& nullifier) const { - LOCK(cs_main); pair range; range = mapTxSaplingNullifiers.equal_range(nullifier); @@ -979,10 +978,9 @@ void CWallet::ClearNoteWitnessCache() void CWallet::DecrementNoteWitnesses(const CBlockIndex* pindex) { - extern int32_t HUSH_REWIND; - LOCK(cs_wallet); + LOCK2(cs_main, cs_wallet); for (std::pair& wtxItem : mapWallet) { //Sapling From 912942f2a852adfc503fc61c1dce711e32775270 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 13 Sep 2024 18:50:28 -0400 Subject: [PATCH 078/109] Delete more CC stuff --- src/cc/CCinclude.h | 5 -- src/cc/CCutils.cpp | 123 ++------------------------------------------- 2 files changed, 3 insertions(+), 125 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 29cc60d6c..cacfad593 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -498,11 +498,6 @@ bool GetCustomscriptaddress(char *destaddr,const CScript &scriptPubKey,uint8_t t /// @returns public key as byte array std::vector Mypubkey(); -/// Returns my private key, that is private key for the my pubkey -/// @returns private key as byte array -/// @see Mypubkey -bool Myprivkey(uint8_t myprivkey[]); - /// @private uint256 BitcoinGetProofMerkleRoot(const std::vector &proofData, std::vector &txids); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index e46793288..5d8e40c40 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -102,34 +102,18 @@ uint32_t GetLatestTimestamp(int32_t height) void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) { - cp->unspendableEvalcode2 = evalcode; - cp->unspendablepk2 = pk; - memcpy(cp->unspendablepriv2,priv,32); - strcpy(cp->unspendableaddr2,coinaddr); } void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) { - cp->unspendableEvalcode3 = evalcode; - cp->unspendablepk3 = pk; - memcpy(cp->unspendablepriv3,priv,32); - strcpy(cp->unspendableaddr3,coinaddr); } void CCaddr1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2, uint8_t *priv, char *coinaddr) { - cp->coins1of2pk[0] = pk1; - cp->coins1of2pk[1] = pk2; - memcpy(cp->coins1of2priv,priv,32); - strcpy(cp->coins1of2addr,coinaddr); } void CCaddrTokens1of2set(struct CCcontract_info *cp, CPubKey pk1, CPubKey pk2, uint8_t *priv, char *tokenaddr) { - cp->tokens1of2pk[0] = pk1; - cp->tokens1of2pk[1] = pk2; - memcpy(cp->tokens1of2priv,priv,32); - strcpy(cp->tokens1of2addr, tokenaddr); } bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) @@ -150,13 +134,6 @@ bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) bool GetCustomscriptaddress(char *destaddr,const CScript &scriptPubKey,uint8_t taddr,uint8_t prefix, uint8_t prefix2) { - CTxDestination address; txnouttype whichType; - if ( ExtractDestination(scriptPubKey,address) != 0 ) - { - strcpy(destaddr,(char *)CCustomBitcoinAddress(address,taddr,prefix,prefix2).ToString().c_str()); - return(true); - } - //fprintf(stderr,"ExtractDestination failed\n"); return(false); } @@ -170,23 +147,7 @@ bool pubkey2addr(char *destaddr,uint8_t *pubkey33) bool ConstrainVout(CTxOut vout, int32_t CCflag, char *cmpaddr, int64_t nValue) { - char destaddr[64]; - if ( vout.scriptPubKey.IsPayToCryptoCondition() != CCflag ) - { - fprintf(stderr,"constrain vout error isCC %d vs %d CCflag\n", vout.scriptPubKey.IsPayToCryptoCondition(), CCflag); - return(false); - } - else if ( cmpaddr != 0 && (Getscriptaddress(destaddr, vout.scriptPubKey) == 0 || strcmp(destaddr, cmpaddr) != 0) ) - { - fprintf(stderr,"constrain vout error: check addr %s vs script addr %s\n", cmpaddr!=0?cmpaddr:"", destaddr!=0?destaddr:""); - return(false); - } - else if ( nValue != 0 && nValue != vout.nValue ) //(nValue == 0 && vout.nValue < 10000) || ( - { - fprintf(stderr,"constrain vout error nValue %.8f vs %.8f\n",(double)nValue/COIN,(double)vout.nValue/COIN); - return(false); - } - else return(true); + return false; } bool priv2addr(char *coinaddr,uint8_t *buf33,uint8_t priv32[32]) @@ -219,60 +180,6 @@ extern char NSPV_wifstr[],NSPV_pubkeystr[]; extern uint32_t NSPV_logintime; #define NSPV_AUTOLOGOUT 777 -bool Myprivkey(uint8_t myprivkey[]) -{ - char coinaddr[64],checkaddr[64]; std::string strAddress; char *dest; int32_t i,n; CBitcoinAddress address; CKeyID keyID; CKey vchSecret; uint8_t buf33[33]; - if ( HUSH_NSPV_SUPERLITE ) - { - if ( NSPV_logintime == 0 || time(NULL) > NSPV_logintime+NSPV_AUTOLOGOUT ) - { - fprintf(stderr,"need to be logged in to get myprivkey\n"); - return false; - } - vchSecret = DecodeSecret(NSPV_wifstr); - memcpy(myprivkey,vchSecret.begin(),32); - //for (i=0; i<32; i++) - // fprintf(stderr,"%02x",myprivkey[i]); - //fprintf(stderr," myprivkey %s\n",NSPV_wifstr); - memset((uint8_t *)vchSecret.begin(),0,32); - return true; - } - if ( Getscriptaddress(coinaddr,CScript() << Mypubkey() << OP_CHECKSIG) != 0 ) - { - n = (int32_t)strlen(coinaddr); - strAddress.resize(n+1); - dest = (char *)strAddress.data(); - for (i=0; iGetKey(keyID,vchSecret) != 0 ) - { - memcpy(myprivkey,vchSecret.begin(),32); - memset((uint8_t *)vchSecret.begin(),0,32); - if ( 0 ) - { - for (i=0; i<32; i++) - fprintf(stderr,"0x%02x, ",myprivkey[i]); - fprintf(stderr," found privkey for %s!\n",dest); - } - if ( priv2addr(checkaddr,buf33,myprivkey) != 0 ) - { - if ( buf2pk(buf33) == Mypubkey() && strcmp(checkaddr,coinaddr) == 0 ) - return(true); - else printf("mismatched privkey -> addr %s vs %s\n",checkaddr,coinaddr); - } - return(false); - } -#endif - } - } - fprintf(stderr,"privkey for the -pubkey= address is not in the wallet, importprivkey!\n"); - return(false); -} - CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv) { if ( unspendablepriv != 0 ) @@ -423,37 +330,13 @@ bool hush_txnotarizedconfirmed(uint256 txid) // returns total of normal inputs signed with this pubkey int64_t TotalPubkeyNormalInputs(const CTransaction &tx, const CPubKey &pubkey) { - int64_t total = 0; - for (auto vin : tx.vin) { - CTransaction vintx; - uint256 hashBlock; - if (!IsCCInput(vin.scriptSig) && myGetTransaction(vin.prevout.hash, vintx, hashBlock)) { - typedef std::vector valtype; - std::vector vSolutions; - txnouttype whichType; - - if (Solver(vintx.vout[vin.prevout.n].scriptPubKey, whichType, vSolutions)) { - switch (whichType) { - case TX_PUBKEY: - if (pubkey == CPubKey(vSolutions[0])) // is my input? - total += vintx.vout[vin.prevout.n].nValue; - break; - case TX_PUBKEYHASH: - if (pubkey.GetID() == CKeyID(uint160(vSolutions[0]))) // is my input? - total += vintx.vout[vin.prevout.n].nValue; - break; - } - } - } - } - return total; + return 0; } // returns total of CC inputs signed with this pubkey int64_t TotalPubkeyCCInputs(const CTransaction &tx, const CPubKey &pubkey) { - int64_t total = 0; - return total; + return 0; } extern std::string MYCCLIBNAME; From 6a5f0eafde1d055dec2124e7564180cdaa9c7194 Mon Sep 17 00:00:00 2001 From: fekt Date: Sun, 15 Sep 2024 01:20:06 -0400 Subject: [PATCH 079/109] Memory DoS fixes --- src/main.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4a9de15a7..4c059cf88 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7319,6 +7319,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, return error("message inv size() = %u", vInv.size()); } + bool fBlocksOnly = GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY); + LOCK(cs_main); const uint256* best_block{nullptr}; @@ -7349,10 +7351,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, best_block = &inv.hash; } } else { - pfrom->AddKnownWTxId(WTxId(inv.hash, inv.hashAux)); + pfrom->AddInventoryKnown(inv); if (fBlocksOnly) LogPrint("net", "transaction (%s) inv sent in violation of protocol peer=%d\n", inv.hash.ToString(), pfrom->id); - else if (!fAlreadyHave && !IsInitialBlockDownload(chainparams.GetConsensus())) + else if (!fAlreadyHave && !IsInitialBlockDownload()) pfrom->AskFor(inv); } if (pfrom->nSendSize > (SendBufferSize() * 2)) { From c5eeb748078aa6129cf45ddbc4e075ac9bbcf56f Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 16 Sep 2024 11:06:31 -0400 Subject: [PATCH 080/109] Simplify MAX_BLOCK_SIZE Our code requires sapling activation at height 1 so we can simplify this function which should lead to some performance improvements since it is called from many places, including mining code. --- src/chainparams.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 02ab894a9..0b454e2c0 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -492,13 +492,14 @@ void UpdateNetworkUpgradeParameters(Consensus::UpgradeIndex idx, int nActivation int32_t MAX_BLOCK_SIZE(int32_t height) { - int32_t saplinght = pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight; + // this codebase requires sapling activation at height=1 + int32_t saplinght = 1; // pCurrentParams->consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight; //fprintf(stderr,"MAX_BLOCK_SIZE %d vs. %d\n",height,mainParams.consensus.vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight); - if ( height <= 0 || (saplinght > 0 && height >= saplinght) ) - { + //if ( height <= 0 || (saplinght > 0 && height >= saplinght) ) + //{ return(_MAX_BLOCK_SIZE); - } - else return(2000000); + //} + //else return(2000000); } // Change the Hush blocktime at run-time(!) From fc5b0f38bdf2b58ad635b71c9b3a16750d16ec00 Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 16 Sep 2024 11:17:56 -0400 Subject: [PATCH 081/109] Revert "Memory DoS fixes" This reverts commit 6a5f0eafde1d055dec2124e7564180cdaa9c7194. --- src/main.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4c059cf88..4a9de15a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7319,8 +7319,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, return error("message inv size() = %u", vInv.size()); } - bool fBlocksOnly = GetBoolArg("-blocksonly", DEFAULT_BLOCKSONLY); - LOCK(cs_main); const uint256* best_block{nullptr}; @@ -7351,10 +7349,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, best_block = &inv.hash; } } else { - pfrom->AddInventoryKnown(inv); + pfrom->AddKnownWTxId(WTxId(inv.hash, inv.hashAux)); if (fBlocksOnly) LogPrint("net", "transaction (%s) inv sent in violation of protocol peer=%d\n", inv.hash.ToString(), pfrom->id); - else if (!fAlreadyHave && !IsInitialBlockDownload()) + else if (!fAlreadyHave && !IsInitialBlockDownload(chainparams.GetConsensus())) pfrom->AskFor(inv); } if (pfrom->nSendSize > (SendBufferSize() * 2)) { From bc20629b9f5c3a2192f563ca8e51fdaaa9287c31 Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 16 Sep 2024 11:18:16 -0400 Subject: [PATCH 082/109] Revert "Fix memory DoS" This reverts commit 84377caae78116b817dbb64434def0b1ecffab74. --- src/main.cpp | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4a9de15a7..ae5e27916 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7320,8 +7320,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, } LOCK(cs_main); - - const uint256* best_block{nullptr}; std::vector vToFetch; @@ -7341,31 +7339,35 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, if (inv.type == MSG_BLOCK) { UpdateBlockAvailability(pfrom->GetId(), inv.hash); if (!fAlreadyHave && !fImporting && !fReindex && !mapBlocksInFlight.count(inv.hash)) { - // Headers-first is the primary method of announcement on - // the network. If a node fell back to sending blocks by inv, - // it's probably for a re-org. The final block hash - // provided should be the highest, so send a getheaders and - // then fetch the blocks we need to catch up. - best_block = &inv.hash; + // First request the headers preceding the announced block. In the normal fully-synced + // case where a new block is announced that succeeds the current tip (no reorganization), + // there are no such headers. + // Secondly, and only when we are close to being synced, we request the announced block directly, + // to avoid an extra round-trip. Note that we must *first* ask for the headers, so by the + // time the block arrives, the header chain leading up to it is already validated. Not + // doing this will result in the received block being rejected as an orphan in case it is + // not a direct successor. + pfrom->PushMessage(NetMsgType::GETHEADERS, chainActive.GetLocator(pindexBestHeader), inv.hash); + CNodeState *nodestate = State(pfrom->GetId()); + if (chainActive.Tip()->GetBlockTime() > GetTime() - chainparams.GetConsensus().nPowTargetSpacing * 20 && + nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) { + vToFetch.push_back(inv); + // Mark block as in flight already, even though the actual "getdata" message only goes out + // later (within the same cs_main lock, though). + MarkBlockAsInFlight(pfrom->GetId(), inv.hash, chainparams.GetConsensus()); + } + LogPrint("net", "getheaders (%d) %s to peer=%d\n", pindexBestHeader->GetHeight(), inv.hash.ToString(), pfrom->id); } - } else { - pfrom->AddKnownWTxId(WTxId(inv.hash, inv.hashAux)); - if (fBlocksOnly) - LogPrint("net", "transaction (%s) inv sent in violation of protocol peer=%d\n", inv.hash.ToString(), pfrom->id); - else if (!fAlreadyHave && !IsInitialBlockDownload(chainparams.GetConsensus())) - pfrom->AskFor(inv); } + if (pfrom->nSendSize > (SendBufferSize() * 2)) { Misbehaving(pfrom->GetId(), 50); return error("send buffer size() = %u", pfrom->nSendSize); } } - if (best_block != nullptr) { - pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexBestHeader), *best_block); - LogPrint("net", "getheaders (%d) %s to peer=%d\n", pindexBestHeader->GetHeight(), best_block->ToString(), pfrom->id); - } - + if (!vToFetch.empty()) + pfrom->PushMessage(NetMsgType::GETDATA, vToFetch); } else if (strCommand == NetMsgType::GETDATA) { vector vInv; vRecv >> vInv; From 3f50dd988a812cc72135d339bb573fa91fef0669 Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 16 Sep 2024 11:26:28 -0400 Subject: [PATCH 083/109] Only use -rdynamic on debug builds --- debug-build.sh | 3 +- util/build.sh | 3 +- util/debug-build.sh | 143 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 3 deletions(-) create mode 100755 util/debug-build.sh diff --git a/debug-build.sh b/debug-build.sh index a18818b20..d3ba81320 100755 --- a/debug-build.sh +++ b/debug-build.sh @@ -9,7 +9,8 @@ echo "Compiling a debug build with --enable-debug..." # run correct build script for detected OS if [[ "$OSTYPE" == "linux-gnu"* ]]; then - CONFIGURE_FLAGS=--enable-debug ./util/build.sh --disable-tests $@ + # TODO: we only have debug builds on linux for now + CONFIGURE_FLAGS=--enable-debug ./util/debug-build.sh --disable-tests $@ elif [[ "$OSTYPE" == "darwin"* ]]; then # code from ./util/build.sh needs to be ported to support --disable-tests #./util/build-mac.sh --disable-tests $@ diff --git a/util/build.sh b/util/build.sh index fcb3e2ef7..cbcd9a416 100755 --- a/util/build.sh +++ b/util/build.sh @@ -118,8 +118,7 @@ HOST="$HOST" BUILD="$BUILD" "$MAKE" "$@" -C ./depends/ V=1 ./autogen.sh -#TODO: only use rdynamic for a debug build -CONFIG_SITE="$PWD/depends/$HOST/share/config.site" ./configure "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" $CONFIGURE_FLAGS CXXFLAGS='-g -rdynamic' +CONFIG_SITE="$PWD/depends/$HOST/share/config.site" ./configure "$HARDENING_ARG" "$LCOV_ARG" "$TEST_ARG" "$MINING_ARG" $CONFIGURE_FLAGS CXXFLAGS='-g' # Build CryptoConditions stuff WD=$PWD diff --git a/util/debug-build.sh b/util/debug-build.sh new file mode 100755 index 000000000..a47681506 --- /dev/null +++ b/util/debug-build.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +# Copyright (c) 2016-2024 The Hush developers +# Distributed under the GPLv3 software license, see the accompanying +# file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html + +set -eu -o pipefail + +# Check if cmake, a new dependency for randomx support, is installed on system and exits if it is not +if ! [ -x "$(command -v cmake)" ]; then + echo 'Error: cmake is not installed. Install cmake and try again.' >&2 + exit 1 +fi + +if ! [ -x "$(command -v autoreconf)" ]; then + echo 'Error: autoconf is not installed. Install autoconf and try again.' >&2 + echo 'On Debian-like systems: apt install autoconf' >&2 + exit 1 +fi + +function cmd_pref() { + if type -p "$2" > /dev/null; then + eval "$1=$2" + else + eval "$1=$3" + fi +} +cat <<'EOF' + .~~~~~~~~~~~~~~~~. +{{ Building Hush!! }} + `~~~~~~~~~~~~~~~~` + \ ^__^ + \ (@@)\_______ + (__)\ HUSH )\/\ $ + z zz ||----w | z | +zz zz z || z ||xxx z z|z zz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +EOF + +# If a g-prefixed version of the command exists, use it preferentially. +function gprefix() { + cmd_pref "$1" "g$2" "$2" +} + +gprefix READLINK readlink +cd "$(dirname "$("$READLINK" -f "$0")")/.." + +# Allow user overrides to $MAKE. Typical usage for users who need it: +# MAKE=gmake ./util/build.sh -j$(nproc) +if [[ -z "${MAKE-}" ]]; then + MAKE=make +fi + +# Allow overrides to $BUILD and $HOST for porters. Most users will not need it. +# BUILD=i686-pc-linux-gnu ./util/build.sh +if [[ -z "${BUILD-}" ]]; then + BUILD="$(./depends/config.guess)" +fi +if [[ -z "${HOST-}" ]]; then + HOST="$BUILD" +fi + +# Allow users to set arbitrary compile flags. Most users will not need this. +if [[ -z "${CONFIGURE_FLAGS-}" ]]; then + CONFIGURE_FLAGS="" +fi + +if [ "x$*" = 'x--help' ] +then + cat ./util/dragon.txt + cat < Date: Tue, 17 Sep 2024 09:25:58 +0000 Subject: [PATCH 084/109] wolfssl downgrade to 4.8.1 test --- depends/packages/wolfssl.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/depends/packages/wolfssl.mk b/depends/packages/wolfssl.mk index 44cdec866..6ffa1d9cd 100644 --- a/depends/packages/wolfssl.mk +++ b/depends/packages/wolfssl.mk @@ -5,9 +5,9 @@ $(package)_version=4.8.1 $(package)_file_name=wolfssl-$($(package)_version).tar.gz $(package)_sha256_hash=50db45f348f47e00c93dd244c24108220120cb3cc9d01434789229c32937c444 else -$(package)_version=5.2.0 +$(package)_version=4.8.1 $(package)_file_name=wolfssl-$($(package)_version).tar.gz -$(package)_sha256_hash=409b4646c5f54f642de0e9f3544c3b83de7238134f5b1ff93fb44527bf119d05 +$(package)_sha256_hash=50db45f348f47e00c93dd244c24108220120cb3cc9d01434789229c32937c444 endif $(package)_download_path=https://github.com/wolfSSL/wolfssl/archive From bd967b7ac6663342909971fb7064a44622c5fa1a Mon Sep 17 00:00:00 2001 From: Duke Date: Tue, 17 Sep 2024 11:29:24 -0400 Subject: [PATCH 085/109] Exit out of TLSManager::waitFor() loop if shutdown requested --- src/hush/tlsmanager.cpp | 6 ++++++ src/net.cpp | 1 + 2 files changed, 7 insertions(+) diff --git a/src/hush/tlsmanager.cpp b/src/hush/tlsmanager.cpp index ee1329dd7..8b03445ce 100644 --- a/src/hush/tlsmanager.cpp +++ b/src/hush/tlsmanager.cpp @@ -10,6 +10,8 @@ #include "tlsmanager.h" #include "utiltls.h" +extern bool ShutdownRequested(); + using namespace std; // store our preferred cipherlist so we can use it for debug/etc later on std::string TLS_CIPHERLIST; @@ -85,6 +87,10 @@ int TLSManager::waitFor(SSLConnectionRoutine eRoutine, SOCKET hSocket, WOLFSSL* while (true) { + if(ShutdownRequested()) { + LogPrintf("%s: shutdown requested, exiting\n", __func__); + return retOp; + } // clear the current thread's error queue wolfSSL_ERR_clear_error(); diff --git a/src/net.cpp b/src/net.cpp index fd6ec86fe..f6893a54e 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2927,6 +2927,7 @@ void SetNetworkActive(bool active) if (!fNetworkActive) { LOCK(cs_vNodes); // Close sockets to all nodes + LogPrint("net", "%s: closing sockets to all nodes\n", __func__); for (CNode* pnode : vNodes) { pnode->CloseSocketDisconnect(); } From 27f72405b22e28977f07cdfd6a326a682e8f8d41 Mon Sep 17 00:00:00 2001 From: Duke Date: Tue, 17 Sep 2024 13:11:11 -0400 Subject: [PATCH 086/109] Also print address to stderr in hush_isnotaryvout --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 7b885f081..0a60de0c4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1429,7 +1429,7 @@ int32_t hush_isnotaryvout(char *coinaddr,uint32_t tiptime) { bool istush = strncmp(SMART_CHAIN_SYMBOL, "TUSH",4) == 0 ? true : false; int32_t height = chainActive.LastTip()->GetHeight(); int32_t season = (ishush3 || istush) ? gethushseason(height) : getacseason(tiptime); - fprintf(stderr,"%s: season=%d, tiptime=%d\n", __func__, season,tiptime); + fprintf(stderr,"%s: coinaddr=%s season=%d, tiptime=%d\n", __func__, coinaddr, season,tiptime); if ( NOTARY_ADDRESSES[season-1][0][0] == 0 ) { uint8_t pubkeys[64][33]; hush_notaries(pubkeys,0,tiptime); From d915fc38b77336e5ce428c443299110a727a8ee5 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 18 Sep 2024 10:53:28 -0400 Subject: [PATCH 087/109] Add some useful comments to the wolfssl package --- depends/packages/wolfssl.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/depends/packages/wolfssl.mk b/depends/packages/wolfssl.mk index 6ffa1d9cd..21b95e0ab 100644 --- a/depends/packages/wolfssl.mk +++ b/depends/packages/wolfssl.mk @@ -1,10 +1,16 @@ package=wolfssl ifeq ($(host_os),mingw32) +# this is the highest version known to compile on windows $(package)_version=4.8.1 $(package)_file_name=wolfssl-$($(package)_version).tar.gz $(package)_sha256_hash=50db45f348f47e00c93dd244c24108220120cb3cc9d01434789229c32937c444 else +# BEWARE: Updating this version could cause weird bugs where nodes +# hang after a few days or do not respond to the "stop" RPC . 5.2.0 +# definitely has problems, versions between 4.8.1 and 5.2.0 have not +# been tested yet. Make sure to do extensive testing when changing this +# package version $(package)_version=4.8.1 $(package)_file_name=wolfssl-$($(package)_version).tar.gz $(package)_sha256_hash=50db45f348f47e00c93dd244c24108220120cb3cc9d01434789229c32937c444 From fcc5c176282ed8628df3a26307f712d2ae39d9ad Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 18 Sep 2024 10:59:37 -0400 Subject: [PATCH 088/109] Bump protocol version and client version --- configure.ac | 2 +- src/clientversion.h | 2 +- src/version.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index ffcf18ad8..c9cf3e6a9 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 3) dnl Must be kept in sync with src/clientversion.h , ugh! define(_CLIENT_VERSION_MINOR, 10) -define(_CLIENT_VERSION_REVISION, 2) +define(_CLIENT_VERSION_REVISION, 3) define(_CLIENT_VERSION_BUILD, 50) define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) diff --git a/src/clientversion.h b/src/clientversion.h index 1dd5c958c..db039b97a 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -30,7 +30,7 @@ // Must be kept in sync with configure.ac , ugh! #define CLIENT_VERSION_MAJOR 3 #define CLIENT_VERSION_MINOR 10 -#define CLIENT_VERSION_REVISION 2 +#define CLIENT_VERSION_REVISION 3 #define CLIENT_VERSION_BUILD 50 //! Set to true for release, false for prerelease or test build diff --git a/src/version.h b/src/version.h index d4641ec5a..641bc489b 100644 --- a/src/version.h +++ b/src/version.h @@ -21,7 +21,7 @@ #define HUSH_VERSION_H // network protocol versioning -static const int PROTOCOL_VERSION = 1987426; +static const int PROTOCOL_VERSION = 1987427; //! initial proto version, to be increased after version/verack negotiation static const int INIT_PROTO_VERSION = 209; //! In this version, 'getheaders' was introduced. From 160802cddf617dce73101de92a317026a7ac7c92 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 18 Sep 2024 11:48:52 -0400 Subject: [PATCH 089/109] Update relnotes --- doc/relnotes/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/relnotes/README.md b/doc/relnotes/README.md index 89d526429..91c8c6489 100644 --- a/doc/relnotes/README.md +++ b/doc/relnotes/README.md @@ -10,6 +10,17 @@ and no longer on Github, since they banned Duke Leto and also because they censor many people around the world and work with evil organizations. +# Hush 3.10.3 "" + + * Fixed various bugs relating to lock ordering and missing locks + * Fixed RPC docs for addnode and disconnectnode having the incorrect port for HACs + * Value of DEBUG_LOCKORDER is now logged to debug.log on node startup + * New script ./debug-build.sh to make it easier to make debug builds + * DragonX nodes now have their own list of seed nodes + * Hush nodes now have their own protocol version which is independent from HACs + * Fixed off-by-one bug in `newSietchRecipient` + * Performance improvement to `ActivateBestChainStep` https://git.hush.is/hush/hush3/commit/ed86f2dd1da370fe2dbf7db475afc41b218cbc5f + # Hush 3.10.2 "Fiendish Fenrir" * RandomX mining is faster for various reasons From 5e30079fcd7ed3e396a5b0a7b7297087bdc3de40 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 18 Sep 2024 11:53:40 -0400 Subject: [PATCH 090/109] IsPegsImport() always returns false --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 0a60de0c4..9bc05bcbc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1942,7 +1942,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // Continuously rate-limit free (really, very-low-fee) transactions // This mitigates 'penny-flooding' -- sending thousands of free transactions just to // be annoying or make others' transactions take longer to confirm. - if (fLimitFree && nFees < ::minRelayTxFee.GetFee(nSize) && !tx.IsCoinImport() && !tx.IsPegsImport()) + if (fLimitFree && nFees < ::minRelayTxFee.GetFee(nSize) && !tx.IsCoinImport() ) { static CCriticalSection csFreeLimiter; static double dFreeCount; From ffce5edda3a49bfc97c69f85e5a8749e36c472b7 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 18 Sep 2024 11:59:00 -0400 Subject: [PATCH 091/109] Remove commented out code --- src/main.cpp | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 9bc05bcbc..482b46fce 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1838,11 +1838,6 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return state.Invalid(false, REJECT_DUPLICATE, "already have coins"); } - //if (tx.IsCoinImport() || tx.IsPegsImport()) { - // // Inverse of normal case; if input exists, it's been spent - // if (ExistsImportTombstone(tx, view)) - // return state.Invalid(false, REJECT_DUPLICATE, "import tombstone exists"); - //} else { // do all inputs exist? // Note that this does not check for the presence of actual outputs (see the next check for that), @@ -1965,7 +1960,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa dFreeCount += nSize; } - if (!tx.IsCoinImport() && !tx.IsPegsImport() && fRejectAbsurdFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000 && nFees > nValueOut/19) + if (!tx.IsCoinImport() && fRejectAbsurdFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000 && nFees > nValueOut/19) { string errmsg = strprintf("absurdly high fees %s, %d > %d", hash.ToString(), @@ -2586,12 +2581,6 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txund inputs.SetNullifiers(tx, true); inputs.ModifyCoins(tx.GetHash())->FromTx(tx, nHeight); // add outputs - - // Unorthodox state - //if (tx.IsCoinImport() || tx.IsPegsImport()) { - // // add a tombstone for the burnTx - // AddImportTombstone(tx, inputs, nHeight); - //} } void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, int nHeight) @@ -3044,12 +3033,6 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex } } } - /* - else if (tx.IsCoinImport() || tx.IsPegsImport()) - { - RemoveImportTombstone(tx, view); - } - */ } // set the old best Sprout anchor back From d471af9ef55fc1090e202330605b0fd155f558e1 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 18 Sep 2024 12:13:37 -0400 Subject: [PATCH 092/109] IsPegsImport() is always false Since this function always returns false and is used in many "hot" code paths, removing it from the code should give us a performance boost. --- src/coins.cpp | 9 ++------- src/main.cpp | 34 +++++++++------------------------- src/txmempool.cpp | 6 +++--- 3 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/coins.cpp b/src/coins.cpp index 82933f026..8801b397c 100644 --- a/src/coins.cpp +++ b/src/coins.cpp @@ -563,11 +563,6 @@ CAmount CCoinsViewCache::GetValueIn(int32_t nHeight,int64_t *interestp,const CTr return 0; for (unsigned int i = 0; i < tx.vin.size(); i++) { - //if (tx.IsPegsImport() && i==0) - //{ - // nResult = GetCoinImportValue(tx); - // continue; - //} value = GetOutputFor(tx.vin[i]).nValue; nResult += value; } @@ -599,7 +594,7 @@ bool CCoinsViewCache::HaveInputs(const CTransaction& tx) const { if (!tx.IsMint()) { for (unsigned int i = 0; i < tx.vin.size(); i++) { - if (tx.IsPegsImport() && i==0) continue; + //if (tx.IsPegsImport() && i==0) continue; const COutPoint &prevout = tx.vin[i].prevout; const CCoins* coins = AccessCoins(prevout.hash); if (!coins || !coins->IsAvailable(prevout.n)) { @@ -621,7 +616,7 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const // use the maximum priority for all (partially or fully) shielded transactions. // (Note that coinbase transactions cannot contain Sapling shielded Spends or Outputs.) - if (tx.vShieldedSpend.size() > 0 || tx.vShieldedOutput.size() > 0 || tx.IsCoinImport() || tx.IsPegsImport()) { + if (tx.vShieldedSpend.size() > 0 || tx.vShieldedOutput.size() > 0 || tx.IsCoinImport() ) { // || tx.IsPegsImport()) { return MAX_PRIORITY; } diff --git a/src/main.cpp b/src/main.cpp index 482b46fce..3ddf5bb54 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -816,7 +816,7 @@ bool hush_dailysnapshot(int32_t height) for (unsigned int j = tx.vin.size(); j-- > 0;) { uint256 blockhash; CTransaction txin; - if (tx.IsPegsImport() && j==0) continue; + //if (tx.IsPegsImport() && j==0) continue; if ( !tx.IsCoinImport() && !tx.IsCoinBase() && myGetTransaction(tx.vin[j].prevout.hash,txin,blockhash) ) { int vout = tx.vin[j].prevout.n; @@ -1108,7 +1108,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs, for (unsigned int i = 0; i < tx.vin.size(); i++) { - if (tx.IsPegsImport() && i==0) continue; + //if (tx.IsPegsImport() && i==0) continue; const CTxOut& prev = mapInputs.GetOutputFor(tx.vin[i]); vector > vSolutions; @@ -1186,7 +1186,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in unsigned int nSigOps = 0; for (unsigned int i = 0; i < tx.vin.size(); i++) { - if (tx.IsPegsImport() && i==0) continue; + //if (tx.IsPegsImport() && i==0) continue; const CTxOut &prevout = inputs.GetOutputFor(tx.vin[i]); if (prevout.scriptPubKey.IsPayToScriptHash()) nSigOps += prevout.scriptPubKey.GetSigOpCount(tx.vin[i].scriptSig); @@ -1899,7 +1899,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // Keep track of transactions that spend a coinbase, which we re-scan // during reorgs to ensure COINBASE_MATURITY is still met. bool fSpendsCoinbase = false; - if (!tx.IsCoinImport() && !tx.IsPegsImport()) { + if (!tx.IsCoinImport()) { // && !tx.IsPegsImport()) { BOOST_FOREACH(const CTxIn &txin, tx.vin) { const CCoins *coins = view.AccessCoins(txin.prevout.hash); if (coins->IsCoinBase()) { @@ -2559,7 +2559,7 @@ void UpdateCoins(const CTransaction& tx, CCoinsViewCache& inputs, CTxUndo &txund { txundo.vprevout.reserve(tx.vin.size()); BOOST_FOREACH(const CTxIn &txin, tx.vin) { - if (tx.IsPegsImport() && txin.prevout.n==10e8) continue; + //if (tx.IsPegsImport() && txin.prevout.n==10e8) continue; CCoinsModifier coins = inputs.ModifyCoins(txin.prevout.hash); unsigned nPos = txin.prevout.n; @@ -2621,13 +2621,6 @@ namespace Consensus { CAmount nFees = 0; for (unsigned int i = 0; i < tx.vin.size(); i++) { - /* - if (tx.IsPegsImport() && i==0) - { - nValueIn=GetCoinImportValue(tx); - continue; - } - */ const COutPoint &prevout = tx.vin[i].prevout; const CCoins *coins = inputs.AccessCoins(prevout.hash); assert(coins); @@ -2715,7 +2708,7 @@ bool ContextualCheckInputs( // still computed and checked, and any change will be caught at the next checkpoint. if (fScriptChecks) { for (unsigned int i = 0; i < tx.vin.size(); i++) { - if (tx.IsPegsImport() && i==0) continue; + //if (tx.IsPegsImport() && i==0) continue; const COutPoint &prevout = tx.vin[i].prevout; const CCoins* coins = inputs.AccessCoins(prevout.hash); assert(coins); @@ -2751,15 +2744,6 @@ bool ContextualCheckInputs( } } - /* - if (tx.IsCoinImport() || tx.IsPegsImport()) - { - LOCK(cs_main); - ServerTransactionSignatureChecker checker(&tx, 0, 0, false, txdata); - return VerifyCoinImport(tx.vin[0].scriptSig, checker, state); - } - */ - return true; } @@ -2995,11 +2979,11 @@ bool DisconnectBlock(CBlock& block, CValidationState& state, CBlockIndex* pindex // restore inputs if (!tx.IsMint()) { CTxUndo &txundo = blockUndo.vtxundo[i-1]; - if (tx.IsPegsImport()) txundo.vprevout.insert(txundo.vprevout.begin(),CTxInUndo()); + //if (tx.IsPegsImport()) txundo.vprevout.insert(txundo.vprevout.begin(),CTxInUndo()); if (txundo.vprevout.size() != tx.vin.size()) return error("DisconnectBlock(): transaction and undo data inconsistent"); for (unsigned int j = tx.vin.size(); j-- > 0;) { - if (tx.IsPegsImport() && j==0) continue; + //if (tx.IsPegsImport() && j==0) continue; const COutPoint &out = tx.vin[j].prevout; const CTxInUndo &undo = txundo.vprevout[j]; if (!ApplyTxInUndo(undo, view, out)) @@ -3340,7 +3324,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin { for (size_t j = 0; j < tx.vin.size(); j++) { - if (tx.IsPegsImport() && j==0) continue; + //if (tx.IsPegsImport() && j==0) continue; const CTxIn input = tx.vin[j]; const CTxOut &prevout = view.GetOutputFor(tx.vin[j]); diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 22d3ef055..da4e0bd59 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -123,7 +123,7 @@ bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, if (!tx.IsCoinImport()) { for (unsigned int i = 0; i < tx.vin.size(); i++) { - if (tx.IsPegsImport() && i==0) continue; + //if (tx.IsPegsImport() && i==0) continue; mapNextTx[tx.vin[i].prevout] = CInPoint(&tx, i); } } @@ -146,7 +146,7 @@ void CTxMemPool::addAddressIndex(const CTxMemPoolEntry &entry, const CCoinsViewC uint256 txhash = tx.GetHash(); for (unsigned int j = 0; j < tx.vin.size(); j++) { - if (tx.IsPegsImport() && j==0) continue; + //if (tx.IsPegsImport() && j==0) continue; const CTxIn input = tx.vin[j]; const CTxOut &prevout = view.GetOutputFor(input); @@ -252,7 +252,7 @@ void CTxMemPool::addSpentIndex(const CTxMemPoolEntry &entry, const CCoinsViewCac uint256 txhash = tx.GetHash(); for (unsigned int j = 0; j < tx.vin.size(); j++) { - if (tx.IsPegsImport() && j==0) continue; + //if (tx.IsPegsImport() && j==0) continue; const CTxIn input = tx.vin[j]; const CTxOut &prevout = view.GetOutputFor(input); From a53d8baeda5e84b3e8ff13beb040d7df9252f439 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 20 Sep 2024 13:35:38 -0400 Subject: [PATCH 093/109] Do not lock cs_main in mining code Technically we should take this lock but it has never been there before and it leads to potentially large slow downs when mining with multiple cores. We see basically the same hashrate for a single core if we have the lock or not and that makes sense, since there is only one core, there are no other mining threads that have to wait. But on one particular CPU I saw a 6% slower hashing when mining with 2 threads and 35% slower with 3 threads. This change also means debug builds will coredump if mining is enabled. --- src/miner.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 1bc0e984d..2b5c7c033 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1320,8 +1320,7 @@ void static RandomXMiner() } CValidationState state; - { LOCK(cs_main); - + //{ LOCK(cs_main); if ( !TestBlockValidity(state,B, chainActive.LastTip(), true, false)) { h = UintToArith256(B.GetHash()); @@ -1332,8 +1331,7 @@ void static RandomXMiner() fprintf(stderr,"\n"); return(false); } - - } + //} SetThreadPriority(THREAD_PRIORITY_NORMAL); LogPrintf("HushRandomXMiner:\n"); LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", B.GetHash().GetHex(), HASHTarget.GetHex()); @@ -1692,8 +1690,8 @@ void static BitcoinMiner() fprintf(stderr," mined %s block %d!\n",SMART_CHAIN_SYMBOL,Mining_height); } CValidationState state; - { LOCK(cs_main); + //{ LOCK(cs_main); if ( !TestBlockValidity(state,B, chainActive.LastTip(), true, false)) { h = UintToArith256(B.GetHash()); @@ -1704,7 +1702,7 @@ void static BitcoinMiner() return(false); } - } + //} HUSH_CHOSEN_ONE = 1; // Found a solution SetThreadPriority(THREAD_PRIORITY_NORMAL); From 183cd81cf67559978e3e460e7169e214062c9ef9 Mon Sep 17 00:00:00 2001 From: onryo Date: Fri, 20 Sep 2024 20:50:51 +0200 Subject: [PATCH 094/109] Small fix in README OLD_WALLETS.md will be in the correct path once dev is merged into master, changing it to master now to prevent users reading docs from the dev branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddfff9388..98b885bc0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ | :---: | :---: | :---: | :---: | :---: | | [What is Hush?](#what-is-hush) | [Windows 10 - Video Tutorial](#install-on-windows-10) | [Build on Debian or Ubuntu](#build-on-debian-or-ubuntu) | [Where can I buy Hush?](#where-can-i-buy-hush) | [Cross compiling Windows binaries](#windows-cross-compiled-on-linux) | [Why not GitHub?](#banned-by-github) | [Build on Mac](#build-on-mac) | [Build on Arch](#build-on-arch) | [Can I mine with CPU or GPU?](#can-i-mine-with-cpu-or-gpu) | [Hush DevOps for pools and CEXs](https://git.hush.is/hush/docs/src/branch/master/advanced/devops.md) -| [What is HushChat?](#what-is-hushchat) | [Debian and Ubuntu](#installing-hush-binaries) | [Build on Fedora](#build-on-fedora) | [Claiming funds from old Hush wallets](https://git.hush.is/hush/hush3/src/branch/dev/doc/OLD_WALLETS.md) | [Earn Hush bounty](#earn-hush-bounty) +| [What is HushChat?](#what-is-hushchat) | [Debian and Ubuntu](#installing-hush-binaries) | [Build on Fedora](#build-on-fedora) | [Claiming funds from old Hush wallets](https://git.hush.is/hush/hush3/src/branch/master/doc/OLD_WALLETS.md) | [Earn Hush bounty](#earn-hush-bounty) | [What is SilentDagon?](#what-is-silentdagon) | [Raspberry Pi](#install-on-arm-architecture) | [Build on Ubuntu 16.04 or older](#building-on-ubuntu-16-04-and-older-systems) | [Where can I spend Hush?](#where-can-i-spend-hush) | [Cross compiling from amd64 to arm64](https://git.hush.is/hush/docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) From 4538bf9e1e8359bbd8fc5c1167fc4074e76b88d3 Mon Sep 17 00:00:00 2001 From: onryo Date: Fri, 20 Sep 2024 21:13:54 +0200 Subject: [PATCH 095/109] Add agorax.is --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 98b885bc0..9adb48142 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ Hush cannot be efficiently mined with CPU or GPU, only ASIC mining is recommende # Where can I spend Hush? -AgoraX market (in progress) +AgoraX market: https://agorax.is # Earn Hush bounty From f144f8a0b907e5573230fd23c4c11c931f94276b Mon Sep 17 00:00:00 2001 From: onryo Date: Thu, 26 Sep 2024 05:04:55 +0200 Subject: [PATCH 096/109] Fix fatal error and the version flag option when compiling for windows --- depends/hosts/mingw32.mk | 2 +- src/sync.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk index c80d14184..1a65bd346 100644 --- a/depends/hosts/mingw32.mk +++ b/depends/hosts/mingw32.mk @@ -1,6 +1,6 @@ mingw32_CC=x86_64-w64-mingw32-gcc-posix mingw32_CXX=x86_64-w64-mingw32-g++-posix -mingw32_CFLAGS=-pipe -std=c11 +mingw32_CFLAGS=-pipe -std=c++11 mingw32_CXXFLAGS=$(mingw32_CFLAGS) -std=c++11 mingw32_release_CFLAGS=-O3 diff --git a/src/sync.cpp b/src/sync.cpp index 632c5562e..6f9ae5768 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -25,7 +25,13 @@ #include #include -#include /* backtrace, backtrace_symbols_fd */ +#ifdef _WIN32 +#include +#include +#else +#include +#endif + #include /* STDOUT_FILENO */ From c245242e0f1508d5540cc0fa279b1af9b1b40d83 Mon Sep 17 00:00:00 2001 From: jahway603 Date: Thu, 26 Sep 2024 10:21:20 -0400 Subject: [PATCH 097/109] updated Debian package copyright to resolve Issue #134 --- contrib/debian/copyright | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/debian/copyright b/contrib/debian/copyright index 6231c2023..905f248bb 100644 --- a/contrib/debian/copyright +++ b/contrib/debian/copyright @@ -1,5 +1,5 @@ Files: * -Copyright: 2016-2020, The Hush developers +Copyright: 2016-2024, The Hush developers 2009-2016, Bitcoin Core developers License: GPLv3 Comment: https://hush.is From 8333810f0f3176d0df4c6c489128b7477ae67819 Mon Sep 17 00:00:00 2001 From: jahway603 Date: Thu, 26 Sep 2024 10:39:28 -0400 Subject: [PATCH 098/109] Added build.sh checks for as and ld to be installed --- util/build.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/util/build.sh b/util/build.sh index cbcd9a416..6bf7a6d69 100755 --- a/util/build.sh +++ b/util/build.sh @@ -17,6 +17,18 @@ if ! [ -x "$(command -v autoreconf)" ]; then exit 1 fi +if ! [ -x "$(command -v as)" ]; then + echo 'Error: as is not installed. Install as and try again.' >&2 + echo 'On Debian-like systems: apt install binutils' >&2 + exit 1 +fi + +if ! [ -x "$(command -v ld)" ]; then + echo 'Error: ld is not installed. Install ld and try again.' >&2 + echo 'On Debian-like systems: apt install binutils' >&2 + exit 1 +fi + function cmd_pref() { if type -p "$2" > /dev/null; then eval "$1=$2" From 7cb86b8aa6b4e45502350af43bd838f685a7a463 Mon Sep 17 00:00:00 2001 From: jahway603 Date: Thu, 26 Sep 2024 11:06:29 -0400 Subject: [PATCH 099/109] Updated doc/release-process.md to resolve Issue #407 --- doc/release-process.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/release-process.md b/doc/release-process.md index 566de1b1f..f60b26632 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -111,20 +111,24 @@ Install deps on Linux: - Make sure git tag starts with a `v` such as `v3.9.2` - Use util/gen-linux-binary-release.sh to make a Linux release binary - Upload Linux binary to Gitea release and add SHA256 sum - - Use util/build-debian-package.sh to make an x86 Debian package for the release + - Create an x86 Debian package for the release: + - Edit contrib/debian/changelog to add information about the new release + - Use `util/build-debian-package.sh` to make an x86 Debian package for the release - Debian packages should be done after you make manpages, because those are included in Debian packages - `lintian` is an optional dependency, it's not needed to build the .deb - Upload .deb to Gitea release - Add SHA256 checksum of .deb to release - Use util/build-debian-package-ARM.sh (does this still work?) to make an ARM Debian package for the release - Upload the debian packages to the Gitea release page, with SHA256 sums - - Figure out how to update https://faq.hush.is/rpc/ for new release + - Update the rpc.hush.is repo for new release by [following these instructions](https://git.hush.is/hush/rpc.hush.is/src/branch/master/README.md) + - Update https://faq.hush.is/rpc/ for new release after updating the rpc.hush.is repo ## Platform-specific notes -Use `./util/build-mac.sh` to compile on Apple/Mac systems, use `./util/build-win.sh` to build on Windows and `./util/build-arm.sh` to build on ARMv8 systems. - -Use `./util/build-debian-package.sh aarch64` to build a Debian package for aarch64 . +- Use `./util/build-mac.sh` to compile on Apple/Mac systems +- Use `./util/build-win.sh` to build on Windows +- Use [these cross compile instructions](https://git.hush.is/jahway603/hush-docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) to build the release for ARMv8 (aarch64) systems, as the current build system does not permit us to natively build this on the SBC device + - Then use `./util/build-debian-package.sh aarch64` to build a Debian package for ARMv8 (aarch64) ## Optional things From 93f6514d8672f2eec78532c3b54bb3f40122586b Mon Sep 17 00:00:00 2001 From: Duke Date: Thu, 26 Sep 2024 11:13:07 -0400 Subject: [PATCH 100/109] Disable absurd fee checks when adding to the mempool To protect users who are not using opreturn we prevent any use of z_sendmany with absurd fees if opreturn is not being used, so this change only affects users who are adding opreturn data. Since there is no way to currently send opreturn data via a GUI this still protects all GUI users from absurd fees while allowing CLI users to decide to use higher fees. --- src/main.cpp | 14 ++++++++++++-- src/wallet/rpcwallet.cpp | 17 ++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3ddf5bb54..f2f3bf831 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1960,7 +1960,17 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa dFreeCount += nSize; } - if (!tx.IsCoinImport() && fRejectAbsurdFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000 && nFees > nValueOut/19) + // Disable checks for absurd fees when adding to the mempool. Instead, this check is done + // when a user attempts to make a transaction with an absurd fee and only rejects absurd + // fees when OP_RETURN data is NOT being used. This means users making normal financial + // transactions (z2z) are protected from absurd fees, it is only users who are storing + // arbitrary data via a z2t transaction are allowed to (or potentially required) to pay high fees + // It would be nice to detect the use of OP_RETURN right here but it seems to only be known + // inside of IsStandard() inside of IsStandardTx() and we want to avoid doing expensive checks + // multiple times. + fRejectAbsurdFee = false; + + if (fRejectAbsurdFee && !tx.IsCoinImport() && nFees > ::minRelayTxFee.GetFee(nSize) * 10000 && nFees > nValueOut/19) { string errmsg = strprintf("absurdly high fees %s, %d > %d", hash.ToString(), @@ -1968,7 +1978,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa LogPrint("mempool", errmsg.c_str()); return state.Error("AcceptToMemoryPool: " + errmsg); } -//fprintf(stderr,"addmempool 6\n"); + //fprintf(stderr,"addmempool 6\n"); // Check against previous transactions // This is done last to help prevent CPU exhaustion denial-of-service attacks. diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 46a059892..1b6110ec5 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5155,6 +5155,8 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) CAmount nTotalOut = 0; // Optional OP_RETURN data CScript opret; + // TODO: enforce that only a single opreturn exists + UniValue opretValue; bool containsSaplingOutput = false; @@ -5189,7 +5191,10 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) // throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+address); setAddress.insert(address); - UniValue opretValue = find_value(o, "opreturn"); + UniValue this_opret = find_value(o, "opreturn"); + if (!this_opret.isNull()) { + opretValue = this_opret; + } // Create the CScript representation of the OP_RETURN if (!opretValue.isNull()) { @@ -5342,12 +5347,18 @@ UniValue z_sendmany(const UniValue& params, bool fHelp, const CPubKey& mypk) // or anything less than nDefaultFee instead of being forced to use a custom fee and leak metadata if (nTotalOut < nDefaultFee) { if (nFee > nDefaultFee) { - throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Small transaction amount %s has fee %s that is greater than the default fee %s", FormatMoney(nTotalOut), FormatMoney(nFee), FormatMoney(nDefaultFee))); + // Allow large fees if OP_RETURN is being used + if( opretValue.isNull() ) { + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Small transaction amount %s has fee %s that is greater than the default fee %s", FormatMoney(nTotalOut), FormatMoney(nFee), FormatMoney(nDefaultFee))); + } } } else { // Check that the user specified fee is not absurd. if (nFee > nTotalOut) { - throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the sum of outputs %s and also greater than the default fee", FormatMoney(nFee), FormatMoney(nTotalOut))); + // Allow large fees if OP_RETURN is being used + if( opretValue.isNull() ) { + throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee %s is greater than the sum of outputs %s and also greater than the default fee", FormatMoney(nFee), FormatMoney(nTotalOut))); + } } } } From 47cc49bcc580dfe1b772f42046e0aad19b976477 Mon Sep 17 00:00:00 2001 From: Duke Date: Fri, 27 Sep 2024 08:44:14 -0400 Subject: [PATCH 101/109] Change OP_RETURN fee requirements This commit removes the CLI option -opretmintxfee, makes it always enabled, changes the required fee rate and changes which OP_RETURNS get "amnesty" and do not need to pay this fee rate. --- src/init.cpp | 1 - src/miner.cpp | 20 ++++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 7458d4847..c034826d6 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -479,7 +479,6 @@ std::string HelpMessage(HelpMessageMode mode) if (showDebug) strUsage += HelpMessageOpt("-mintxfee=", strprintf("Fees (in %s/kB) smaller than this are considered zero fee for transaction creation (default: %s)", CURRENCY_UNIT, FormatMoney(CWallet::minTxFee.GetFeePerK()))); - strUsage += HelpMessageOpt("-opretmintxfee=", strprintf(_("Minimum fee (in %s/kB) to allow for OP_RETURN transactions (default: %s)"), CURRENCY_UNIT, 400000 )); strUsage += HelpMessageOpt("-paytxfee=", strprintf(_("Fee (in %s/kB) to add to transactions you send (default: %s)"), CURRENCY_UNIT, FormatMoney(payTxFee.GetFeePerK()))); // If this is used incorrectly (-rescanheight too large), then the local wallet may attempt to spend funds which it does not have witness data about // which will cause a "missing inputs" error when added to the mempool. Rescanning from correct height will fix this. diff --git a/src/miner.cpp b/src/miner.cpp index 2b5c7c033..bb7582d7b 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -475,14 +475,10 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 // fprintf(stderr,"%s: nTxSize = %u\n", __func__, nTxSize); // Opret spam limits - if (mapArgs.count("-opretmintxfee")) + const bool opretminfee = true; + if (opretminfee) { - CAmount n = 0; - CFeeRate opretMinFeeRate; - if (ParseMoney(mapArgs["-opretmintxfee"], n) && n > 0) - opretMinFeeRate = CFeeRate(n); - else - opretMinFeeRate = CFeeRate(400000); // default opretMinFeeRate (1 HUSH per 250 Kb = 0.004 per 1 Kb = 400000 puposhis per 1 Kb) + CFeeRate opretMinFeeRate = CFeeRate(10000000); // default opretMinFeeRate 0.1 HUSH bool fSpamTx = false; unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION); @@ -501,9 +497,13 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32 } } - if ((nTxOpretSize > 256) && (feeRate < opretMinFeeRate)) fSpamTx = true; - // std::cerr << tx.GetHash().ToString() << " nTxSize." << nTxSize << " nTxOpretSize." << nTxOpretSize << " feeRate." << feeRate.ToString() << " opretMinFeeRate." << opretMinFeeRate.ToString() << " fSpamTx." << fSpamTx << std::endl; - if (fSpamTx) continue; + // opreturns of this size or smaller get amnesty and do not have to pay increased fees + int amnestySize = 128; + if ((nTxOpretSize > amnestySize) && (feeRate < opretMinFeeRate)) { + fSpamTx = true; + std::cerr << __func__ << ": " << tx.GetHash().ToString() << " nTxSize=" << nTxSize << " nTxOpretSize=" << nTxOpretSize << " feeRate=" << feeRate.ToString() << " opretMinFeeRate=" << opretMinFeeRate.ToString() << " fSpamTx=" << fSpamTx << std::endl; + continue; + } // std::cerr << tx.GetHash().ToString() << " vecPriority.size() = " << vecPriority.size() << std::endl; } From e68795f4f97d637cc2ba9c35ab43b198541cdd91 Mon Sep 17 00:00:00 2001 From: onryo Date: Fri, 27 Sep 2024 22:39:32 +0200 Subject: [PATCH 102/109] Revert "Fix fatal error and the version flag option when compiling for windows" This reverts commit f144f8a0b907e5573230fd23c4c11c931f94276b. --- depends/hosts/mingw32.mk | 2 +- src/sync.cpp | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk index 1a65bd346..c80d14184 100644 --- a/depends/hosts/mingw32.mk +++ b/depends/hosts/mingw32.mk @@ -1,6 +1,6 @@ mingw32_CC=x86_64-w64-mingw32-gcc-posix mingw32_CXX=x86_64-w64-mingw32-g++-posix -mingw32_CFLAGS=-pipe -std=c++11 +mingw32_CFLAGS=-pipe -std=c11 mingw32_CXXFLAGS=$(mingw32_CFLAGS) -std=c++11 mingw32_release_CFLAGS=-O3 diff --git a/src/sync.cpp b/src/sync.cpp index 6f9ae5768..632c5562e 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -25,13 +25,7 @@ #include #include -#ifdef _WIN32 -#include -#include -#else -#include -#endif - +#include /* backtrace, backtrace_symbols_fd */ #include /* STDOUT_FILENO */ From be5a78931bd12f12b0f8e7fc4730728df71aa240 Mon Sep 17 00:00:00 2001 From: onryo Date: Fri, 27 Sep 2024 22:40:46 +0200 Subject: [PATCH 103/109] Fix fatal error when compiling for windows on dev --- src/sync.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sync.cpp b/src/sync.cpp index 632c5562e..16c4c86a2 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -25,9 +25,14 @@ #include #include +#ifdef _WIN32 +#include +#include +#else #include /* backtrace, backtrace_symbols_fd */ -#include /* STDOUT_FILENO */ +#endif +#include /* STDOUT_FILENO */ #ifdef DEBUG_LOCKCONTENTION void PrintLockContention(const char* pszName, const char* pszFile, int nLine) From 9f31214812634efc19bdd5736d89ca2bce8df3cb Mon Sep 17 00:00:00 2001 From: onryo Date: Sun, 29 Sep 2024 02:44:50 +0200 Subject: [PATCH 104/109] Add notes to 3.10.3 --- doc/relnotes/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/relnotes/README.md b/doc/relnotes/README.md index 91c8c6489..c7b4a9747 100644 --- a/doc/relnotes/README.md +++ b/doc/relnotes/README.md @@ -10,8 +10,10 @@ and no longer on Github, since they banned Duke Leto and also because they censor many people around the world and work with evil organizations. -# Hush 3.10.3 "" +# Hush 3.10.3 "Persistent Pezoporus" + * Set minimum fee to 0.1 HUSH per 1 KB of data if `OP_RETURN` is used. + * A feature in absurd fee that allows sending amount < fee, can be used only in a full node by advanced users. * Fixed various bugs relating to lock ordering and missing locks * Fixed RPC docs for addnode and disconnectnode having the incorrect port for HACs * Value of DEBUG_LOCKORDER is now logged to debug.log on node startup @@ -20,6 +22,7 @@ evil organizations. * Hush nodes now have their own protocol version which is independent from HACs * Fixed off-by-one bug in `newSietchRecipient` * Performance improvement to `ActivateBestChainStep` https://git.hush.is/hush/hush3/commit/ed86f2dd1da370fe2dbf7db475afc41b218cbc5f + * Improved navigation in README for new users. # Hush 3.10.2 "Fiendish Fenrir" From 67fe1110506e5d7226c2fb2e03b36fe54b7b28f1 Mon Sep 17 00:00:00 2001 From: Duke Date: Mon, 30 Sep 2024 04:36:21 -0700 Subject: [PATCH 105/109] Mention wolfssl change in relnotes --- doc/relnotes/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/relnotes/README.md b/doc/relnotes/README.md index c7b4a9747..823d6edbb 100644 --- a/doc/relnotes/README.md +++ b/doc/relnotes/README.md @@ -12,6 +12,7 @@ evil organizations. # Hush 3.10.3 "Persistent Pezoporus" + * Use WolfSSL 4.8.1 which prevents nodes from getting stuck in general and when shutting down * Set minimum fee to 0.1 HUSH per 1 KB of data if `OP_RETURN` is used. * A feature in absurd fee that allows sending amount < fee, can be used only in a full node by advanced users. * Fixed various bugs relating to lock ordering and missing locks From 6133c1669cc47f222af55a9261f562a93b7d66eb Mon Sep 17 00:00:00 2001 From: jahway603 Date: Mon, 30 Sep 2024 09:24:34 -0400 Subject: [PATCH 106/109] Updated Debian package changelog --- contrib/debian/changelog | 19 +++++++++++++++++++ doc/relnotes/README.md | 2 ++ 2 files changed, 21 insertions(+) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 98a9e8946..535e69401 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,22 @@ +hush (3.10.3) stable; urgency=high + + * Use WolfSSL 4.8.1 which prevents nodes from getting stuck in general and when shutting down + * Set minimum fee to 0.1 HUSH per 1 KB of data if `OP_RETURN` is used. + * A feature in absurd fee that allows sending amount < fee, can be used only in a full node by advanced users. + * Fixed various bugs relating to lock ordering and missing locks + * Fixed RPC docs for addnode and disconnectnode having the incorrect port for HACs + * Value of DEBUG_LOCKORDER is now logged to debug.log on node startup + * New script ./debug-build.sh to make it easier to make debug builds + * DragonX nodes now have their own list of seed nodes + * Hush nodes now have their own protocol version which is independent from HACs + * Fixed off-by-one bug in `newSietchRecipient` + * Performance improvement to `ActivateBestChainStep` ed86f2dd1d + * Improved navigation in README for new users. + * Updated doc/release-process.md to resolve Issue #407 + * Added build.sh checks for as and ld to be installed to resolve Issue #73 + + -- Hush Core Mon, 30 Sep 2024 11:22:33 -0700 + hush (3.10.2) stable; urgency=medium * Upgraded WolfSSL to 5.2.0 on Linux and Mac: #380. diff --git a/doc/relnotes/README.md b/doc/relnotes/README.md index 823d6edbb..41f6a786b 100644 --- a/doc/relnotes/README.md +++ b/doc/relnotes/README.md @@ -24,6 +24,8 @@ evil organizations. * Fixed off-by-one bug in `newSietchRecipient` * Performance improvement to `ActivateBestChainStep` https://git.hush.is/hush/hush3/commit/ed86f2dd1da370fe2dbf7db475afc41b218cbc5f * Improved navigation in README for new users. + * Updated doc/release-process.md to resolve Issue #407 + * Added build.sh checks for as and ld to be installed to resolve Issue #73 # Hush 3.10.2 "Fiendish Fenrir" From bfff0e87423c3f58d7077ac1a33aeed7304c0cfe Mon Sep 17 00:00:00 2001 From: jahway603 Date: Mon, 30 Sep 2024 12:41:16 -0400 Subject: [PATCH 107/109] Added link to README.md for the ARM cross compilation documentation --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9adb48142..9ca34619a 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,8 @@ Use this if you have a Raspberry Pi or similar computer. Currently, any ARMv7 ma 1. Install the Debian package, substituting "VERSION-NUMBER" for the version you have downloaded: `sudo dpkg -i hush-VERSION-NUMBER-aarch64.deb`. 1. Run with: `hushd`. +If you would like to compile this for ARM yourself, then please refer to the [Cross compiling a Hush full node daemon from AMD64 to ARM64(aarch64) CPU architecture with Docker](https://git.hush.is/jahway603/hush-docs/src/branch/master/advanced/cross-compile-hush-full-node-to-aarch64-with-docker.md) documentation to do that. + # Building On Ubuntu 16.04 and older systems Some older compilers may not be able to compile modern code, such as gcc 5.4 which comes with Ubuntu 16.04 by default. Here is how to install gcc 7 on Ubuntu 16.04. Run these commands as root: @@ -192,4 +194,4 @@ Developers can earn bounty by fixing bugs or solving feature requests listed in # License -For license information see the file [COPYING](COPYING). \ No newline at end of file +For license information see the file [COPYING](COPYING). From 7729e58c4957ec7e0a1b19fc92e93011eeec8aae Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 30 Sep 2024 20:06:30 +0200 Subject: [PATCH 108/109] Correct URLs to video tutorials We no longer use PeerTube, so the path has changed --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9ca34619a..4a7cfd389 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ cd hush3 # This uses 3 build processes, you need 2GB of RAM for each. ./build.sh -j3 ``` -Video Tutorial: https://videos.hush.is/w/3kKQt81r7UUPWLHVuwK2BZ +Video Tutorial: https://videos.hush.is/videos/how-to-install-on-linux # Build on Arch @@ -80,7 +80,7 @@ cd hush3 # Install on Windows 10 -Video Tutorial: https://videos.hush.is/w/oGXff7of3EjmGENtDtYTUX +Video Tutorial: https://videos.hush.is/videos/how-to-install-on-windows # Install on ARM Architecture From 54b2f216ad2cb6b0def7c2396c61dfd6ceabe61c Mon Sep 17 00:00:00 2001 From: onryo Date: Mon, 30 Sep 2024 23:37:08 +0200 Subject: [PATCH 109/109] make seeds --- contrib/seeds/nodes_main.txt | 15 +++++++++------ src/chainparamsseeds.h | 15 +++++++++------ 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt index 2fc59ec5e..1ad72eeec 100644 --- a/contrib/seeds/nodes_main.txt +++ b/contrib/seeds/nodes_main.txt @@ -1,14 +1,14 @@ # node1.hush.land -91.208.127.81 +103.69.128.148 # node2.hush.land -87.251.76.166 +194.29.100.208 # node3.hush.land -45.82.68.233 +45.132.75.69 # node4.hush.land -87.251.76.33 +170.205.39.39 # node5.hush.land 178.250.189.141 @@ -28,8 +28,11 @@ hushv3h6mbxd2pptj42reko3jcexcgnz5zvp3mqcu6myto3jhhn4yzyd.onion hushv3xvheqh42ms3ld2nh555muscietkib7gycb7s4psbrjsysfywqd.onion # ipv6 -2a0c:b641:6f1:34::2 -2a0c:b641:6f1:c::2 +2a0c:b641:6f1:18e::2 +2406:ef80:3:1269::1 +2406:ef80:2:3b59::1 +2406:ef80:1:146e::1 +2406:ef80:4:2132::1 # i2p 7oumuppuzgbzlkahavx7qrtjnvbhkixjqdmeg7f6fhndgfhz7mlq.b32.i2p diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index dc2b4948c..4f8bdd06b 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -11,10 +11,10 @@ // Each line contains a BIP155 serialized address. // static const uint8_t chainparams_seed_main[] = { - 0x01,0x04,0x5b,0xd0,0x7f,0x51,0x00,0x00, // 91.208.127.81 - 0x01,0x04,0x57,0xfb,0x4c,0xa6,0x00,0x00, // 87.251.76.166 - 0x01,0x04,0x2d,0x52,0x44,0xe9,0x00,0x00, // 45.82.68.233 - 0x01,0x04,0x57,0xfb,0x4c,0x21,0x00,0x00, // 87.251.76.33 + 0x01,0x04,0x67,0x45,0x80,0x94,0x00,0x00, // 103.69.128.148 + 0x01,0x04,0xc2,0x1d,0x64,0xd0,0x00,0x00, // 194.29.100.208 + 0x01,0x04,0x2d,0x84,0x4b,0x45,0x00,0x00, // 45.132.75.69 + 0x01,0x04,0xaa,0xcd,0x27,0x27,0x00,0x00, // 170.205.39.39 0x01,0x04,0xb2,0xfa,0xbd,0x8d,0x00,0x00, // 178.250.189.141 0x01,0x04,0x95,0x1c,0x66,0xdb,0x00,0x00, // 149.28.102.219 0x01,0x04,0x9b,0x8a,0xe4,0x44,0x00,0x00, // 155.138.228.68 @@ -22,8 +22,11 @@ static const uint8_t chainparams_seed_main[] = { 0x04,0x20,0xef,0xad,0x0c,0x95,0x3e,0x61,0xee,0x69,0x57,0x67,0xdb,0x4f,0xb7,0x8d,0xc2,0x35,0x1c,0x6b,0x96,0xf4,0x1f,0x7a,0xb4,0x06,0x09,0x3a,0x64,0x33,0xf4,0x0b,0x2c,0x94,0x00,0x00, // 56wqzfj6mhxgsv3h3nh3pdocguogxfxud55libqjhjsdh5alfsko2iqd.onion 0x04,0x20,0x3d,0x24,0x7a,0xec,0xfe,0x60,0x6e,0x3d,0x3d,0xf3,0x4f,0x35,0x12,0x29,0xdb,0x48,0x89,0x71,0x19,0xb9,0xee,0x6a,0xfd,0xb2,0x02,0xa7,0x99,0x89,0xbb,0x69,0x39,0xdb,0x00,0x00, // hushv3h6mbxd2pptj42reko3jcexcgnz5zvp3mqcu6myto3jhhn4yzyd.onion 0x04,0x20,0x3d,0x24,0x7a,0xee,0xf5,0x39,0x20,0x7e,0x69,0x92,0xda,0xc7,0xa6,0x9f,0xbd,0xeb,0x29,0x21,0x20,0x93,0x52,0x03,0xf3,0x60,0x41,0xfc,0xb8,0xf9,0x06,0x29,0x96,0x24,0x00,0x00, // hushv3xvheqh42ms3ld2nh555muscietkib7gycb7s4psbrjsysfywqd.onion - 0x02,0x10,0x2a,0x0c,0xb6,0x41,0x06,0xf1,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, // 2a0c:b641:6f1:34::2 - 0x02,0x10,0x2a,0x0c,0xb6,0x41,0x06,0xf1,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, // 2a0c:b641:6f1:c::2 + 0x02,0x10,0x2a,0x0c,0xb6,0x41,0x06,0xf1,0x01,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, // 2a0c:b641:6f1:18e::2 + 0x02,0x10,0x24,0x06,0xef,0x80,0x00,0x03,0x12,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // 2406:ef80:3:1269::1 + 0x02,0x10,0x24,0x06,0xef,0x80,0x00,0x02,0x3b,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // 2406:ef80:2:3b59::1 + 0x02,0x10,0x24,0x06,0xef,0x80,0x00,0x01,0x14,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // 2406:ef80:1:146e::1 + 0x02,0x10,0x24,0x06,0xef,0x80,0x00,0x04,0x21,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00, // 2406:ef80:4:2132::1 0x05,0x20,0xfb,0xa8,0xca,0x3d,0xf4,0xc9,0x83,0x95,0xa8,0x07,0x05,0x6f,0xf8,0x46,0x69,0x6d,0x42,0x75,0x22,0xe9,0x80,0xd8,0x43,0x7c,0xbe,0x29,0xda,0x33,0x14,0xf9,0xfb,0x17,0x00,0x00, // 7oumuppuzgbzlkahavx7qrtjnvbhkixjqdmeg7f6fhndgfhz7mlq.b32.i2p };