Hush Full Node software. We were censored from Github, this is where all development happens now. https://hush.is
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

359 lines
20 KiB

// Copyright 2016-2023 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
8 years ago
/******************************************************************************
* Copyright © 2014-2019 The SuperNET Developers. *
8 years ago
* *
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
* the top-level directory of this distribution for the individual copyright *
* holder information and the developer policies on copyright and licensing. *
* *
* Unless otherwise agreed in a custom licensing agreement, no part of the *
* SuperNET software, including this file may be copied, modified, propagated *
* or distributed except according to the terms contained in the LICENSE file *
* *
* Removal or modification of this copyright notice is prohibited. *
* *
******************************************************************************/
#include "hush_defs.h"
void hush_prefetch(FILE *fp);
3 years ago
uint32_t hush_heightstamp(int32_t height);
void hush_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t kheight,uint32_t ktime,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout,uint256 MoM,int32_t MoMdepth);
3 years ago
void hush_init(int32_t height);
3 years ago
int32_t hush_MoMdata(int32_t *notarized_htp,uint256 *MoMp,uint256 *hushtxidp,int32_t nHeight,uint256 *MoMoMp,int32_t *MoMoMoffsetp,int32_t *MoMoMdepthp,int32_t *hushstartip,int32_t *hushendip);
3 years ago
int32_t hush_notarizeddata(int32_t nHeight,uint256 *notarized_hashp,uint256 *notarized_desttxidp);
char *hush_issuemethod(char *userpass,char *method,char *params,uint16_t port);
3 years ago
void hush_init(int32_t height);
4 years ago
int32_t hush_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33,uint32_t timestamp);
int32_t hush_isrealtime(int32_t *hushheightp);
uint64_t hush_paxtotal();
int32_t hush_longestchain();
int32_t hush_checkvout(int32_t vout,int32_t k,int32_t indallvouts);
3 years ago
pthread_mutex_t hush_mutex;
8 years ago
#define HUSH_DPOW_GAP 2000 //((SMART_CHAIN_SYMBOL[0] == 0) ? 2000 : 100)
#define HUSH_SMART_CHAIN_MAXLEN 65
8 years ago
struct pax_transaction *PAX;
int32_t NUM_PRICES; uint32_t *PVALS;
struct knotaries_entry *Pubkeys;
3 years ago
struct hush_state HUSH_STATES[34];
8 years ago
7 years ago
#define _COINBASE_MATURITY 100
7 years ago
int COINBASE_MATURITY = _COINBASE_MATURITY;//100;
unsigned int WITNESS_CACHE_SIZE = _COINBASE_MATURITY+10;
uint256 HUSH_EARLYTXID;
5 years ago
int32_t HUSH_MININGTHREADS = -1,IS_HUSH_NOTARY,USE_EXTERNAL_PUBKEY,HUSH_CHOSEN_ONE,ASSETCHAINS_SEED,HUSH_ON_DEMAND,HUSH_EXTERNAL_NOTARIES,HUSH_PASSPORT_INITDONE,HUSH_PAX,HUSH_EXCHANGEWALLET,HUSH_REWIND,HUSH_CONNECTING = -1,HUSH_DEALERNODE,HUSH_EXTRASATOSHI,ASSETCHAINS_FOUNDERS,ASSETCHAINS_CBMATURITY,HUSH_NSPV;
3 years ago
int32_t HUSH_INSYNC,HUSH_LASTMINED,prevHUSH_LASTMINED,HUSH_CCACTIVATE;
std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB,NOTARY_ADDRESS,ASSETCHAINS_SELFIMPORT,ASSETCHAINS_CCLIB;
uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW,ASSETCHAINS_MARMARA;
int8_t ASSETCHAINS_ADAPTIVEPOW;
std::vector<uint8_t> Mineropret;
std::vector<std::string> vAllowListAddress;
char NOTARYADDRS[64][64];
char NOTARY_ADDRESSES[NUM_HUSH_SEASONS][64][64];
8 years ago
char SMART_CHAIN_SYMBOL[HUSH_SMART_CHAIN_MAXLEN],ASSETCHAINS_USERPASS[4096];
uint16_t ASSETCHAINS_P2PPORT,ASSETCHAINS_RPCPORT,ASSETCHAINS_BEAMPORT,ASSETCHAINS_CODAPORT;
4 years ago
uint32_t ASSETCHAIN_INIT,ASSETCHAINS_CC,HUSH_STOPAT,HUSH_DPOWCONFS = 1,STAKING_MIN_DIFF;
8 years ago
uint32_t ASSETCHAINS_MAGIC = 2387029918;
int64_t ASSETCHAINS_GENESISTXVAL = 5000000000;
int64_t MAX_MONEY = 200000000 * 100000000LL;
// consensus variables for coinbase timelock control and timelock transaction support
// time locks are specified enough to enable their use initially to lock specific coinbase transactions for emission control
// to be verifiable, timelocks require additional data that enables them to be validated and their ownership and
// release time determined from the blockchain. to do this, every time locked output according to this
// spec will use an op_return with CLTV at front and anything after |OP_RETURN|PUSH of rest|OPRETTYPE_TIMELOCK|script|
#define _ASSETCHAINS_TIMELOCKOFF 0xffffffffffffffff
uint64_t ASSETCHAINS_TIMELOCKGTE = _ASSETCHAINS_TIMELOCKOFF;
uint64_t ASSETCHAINS_TIMEUNLOCKFROM = 0, ASSETCHAINS_TIMEUNLOCKTO = 0,ASSETCHAINS_CBOPRET=0;
uint64_t ASSETCHAINS_LASTERA = 1;
5 years ago
uint64_t ASSETCHAINS_ENDSUBSIDY[ASSETCHAINS_MAX_ERAS+1],ASSETCHAINS_REWARD[ASSETCHAINS_MAX_ERAS+1],ASSETCHAINS_HALVING[ASSETCHAINS_MAX_ERAS+1],ASSETCHAINS_DECAY[ASSETCHAINS_MAX_ERAS+1],ASSETCHAINS_NOTARY_PAY[ASSETCHAINS_MAX_ERAS+1],ASSETCHAINS_PEGSCCPARAMS[3];
5 years ago
uint8_t ASSETCHAINS_CCDISABLES[256];
std::vector<std::string> ASSETCHAINS_PRICES,ASSETCHAINS_STOCKS;
8 years ago
// this is the offset in the ASSETCHAINS_ALGORITHMS array
#define _ASSETCHAINS_EQUIHASH 0
#define _ASSETCHAINS_RANDOMX 1
uint32_t ASSETCHAINS_NUMALGOS = 4; // there are different variants of equihash with different (N,K)
uint32_t ASSETCHAINS_EQUIHASH = _ASSETCHAINS_EQUIHASH;
uint32_t ASSETCHAINS_RANDOMX = _ASSETCHAINS_RANDOMX;
const char *ASSETCHAINS_ALGORITHMS[] = {"equihash", "randomx"};
5 years ago
uint64_t ASSETCHAINS_NONCEMASK[] = {0xffff};
uint32_t ASSETCHAINS_NONCESHIFT[] = {32};
uint32_t ASSETCHAINS_HASHESPERROUND[] = {1};
uint32_t ASSETCHAINS_ALGO = _ASSETCHAINS_EQUIHASH;
// min diff returned from GetNextWorkRequired needs to be added here for each algo, so they can work with ac_staked.
5 years ago
uint32_t ASSETCHAINS_MINDIFF[] = {537857807};
int32_t ASSETCHAINS_LWMAPOS = 0; // percentage of blocks should be PoS
int32_t ASSETCHAINS_SAPLING = -1;
int32_t ASSETCHAINS_OVERWINTER = -1;
5 years ago
int32_t ASSETCHAINS_STAKED;
uint64_t ASSETCHAINS_COMMISSION,ASSETCHAINS_SUPPLY = 10,ASSETCHAINS_FOUNDERS_REWARD;
uint32_t HUSH_INITDONE;
char HUSHUSERPASS[8192+512+1],BTCUSERPASS[8192]; uint16_t HUSH3_PORT = 18031,BITCOIND_RPCPORT = 18031;
uint64_t PENDING_HUSH_TX;
extern int32_t HUSH_LOADINGBLOCKS;
6 years ago
unsigned int MAX_BLOCK_SIGOPS = 20000;
4 years ago
int32_t HUSH_TESTNODE, HUSH_SNAPSHOT_INTERVAL;
CScript HUSH_EARLYTXID_SCRIPTPUB;
int32_t ASSETCHAINS_EARLYTXIDCONTRACT;
std::map <std::int8_t, int32_t> mapHeightEvalActivate;
3 years ago
struct hush_kv *HUSH_KV;
3 years ago
pthread_mutex_t HUSH_KV_mutex,HUSH_CC_mutex;
#define MAX_CURRENCIES 32
char CURRENCIES[][8] = { "USD", "EUR", "JPY", "GBP", "AUD", "CAD", "CHF", "NZD", // major currencies
"CNY", "RUB", "MXN", "BRL", "INR", "HKD", "TRY", "ZAR", "PLN", "NOK", "SEK", "DKK", "CZK", "HUF", "ILS", "KRW", "MYR", "PHP", "RON", "SGD", "THB", "BGN", "IDR", "HRK",
"HUSH" };
3 years ago
int32_t hush_baseid(char *origbase)
{
int32_t i; char base[64];
for (i=0; origbase[i]!=0&&i<sizeof(base); i++)
base[i] = toupper((int32_t)(origbase[i] & 0xff));
base[i] = 0;
for (i=0; i<=MAX_CURRENCIES; i++)
if ( strcmp(CURRENCIES[i],base) == 0 )
return(i);
//printf("illegal base.(%s) %s\n",origbase,base);
return(-1);
}
#ifndef SATOSHIDEN
#define SATOSHIDEN ((uint64_t)100000000L)
#endif
uint64_t hush_current_supply(uint32_t nHeight)
{
uint64_t cur_money;
int32_t baseid;
3 years ago
//if ( (baseid = hush_baseid(SMART_CHAIN_SYMBOL)) >= 0 && baseid < 32 )
5 years ago
// cur_money = ASSETCHAINS_GENESISTXVAL + ASSETCHAINS_SUPPLY + nHeight * ASSETCHAINS_REWARD[0] / SATOSHIDEN;
//else
{
// figure out max_money by adding up supply to a maximum of 10,000,000 blocks
cur_money = (ASSETCHAINS_SUPPLY+1) * SATOSHIDEN + (ASSETCHAINS_MAGIC & 0xffffff) + ASSETCHAINS_GENESISTXVAL;
if ( ASSETCHAINS_LASTERA == 0 && ASSETCHAINS_REWARD[0] == 0 )
{
5 years ago
cur_money += (nHeight * 10000);// / SATOSHIDEN;
}
else
{
for ( int j = 0; j <= ASSETCHAINS_LASTERA; j++ )
{
// if any condition means we have no more rewards, break
if (j != 0 && (nHeight <= ASSETCHAINS_ENDSUBSIDY[j - 1] || (ASSETCHAINS_ENDSUBSIDY[j - 1] == 0 &&
(ASSETCHAINS_REWARD[j] == 0 && (j == ASSETCHAINS_LASTERA || ASSETCHAINS_DECAY[j] != SATOSHIDEN)))))
break;
// add rewards from this era, up to nHeight
int64_t reward = ASSETCHAINS_REWARD[j];
5 years ago
5 years ago
//fprintf(stderr,"last.%d reward %llu period %llu\n",(int32_t)ASSETCHAINS_LASTERA,(long long)reward,(long long)ASSETCHAINS_HALVING[j]);
if ( reward > 0 )
{
uint64_t lastEnd = j == 0 ? 0 : ASSETCHAINS_ENDSUBSIDY[j - 1];
uint64_t curEnd = ASSETCHAINS_ENDSUBSIDY[j] == 0 ? nHeight : nHeight > ASSETCHAINS_ENDSUBSIDY[j] ? ASSETCHAINS_ENDSUBSIDY[j] : nHeight;
uint64_t period = ASSETCHAINS_HALVING[j];
if ( period == 0 )
period = 210000;
uint32_t nSteps = (curEnd - lastEnd) / period;
uint32_t modulo = (curEnd - lastEnd) % period;
uint64_t decay = ASSETCHAINS_DECAY[j];
5 years ago
//fprintf(stderr,"period.%llu cur_money %.8f += %.8f * %d\n",(long long)period,(double)cur_money/COIN,(double)reward/COIN,nHeight);
if ( ASSETCHAINS_HALVING[j] == 0 )
{
// no halving, straight multiply
cur_money += reward * (nHeight - 1);
5 years ago
//fprintf(stderr,"cur_money %.8f\n",(double)cur_money/COIN);
}
// if exactly SATOSHIDEN, linear decay to zero or to next era, same as:
// (next_era_reward + (starting reward - next_era_reward) / 2) * num_blocks
else if ( decay == SATOSHIDEN )
{
int64_t lowestSubsidy, subsidyDifference, stepDifference, stepTriangle;
5 years ago
int64_t denominator, modulo=1;
int32_t sign = 1;
if ( j == ASSETCHAINS_LASTERA )
{
subsidyDifference = reward;
lowestSubsidy = 0;
}
else
{
// Ex: -ac_eras=3 -ac_reward=0,384,24 -ac_end=1440,260640,0 -ac_halving=1,1440,2103840 -ac_decay 100000000,97750000,0
subsidyDifference = reward - ASSETCHAINS_REWARD[j + 1];
if (subsidyDifference < 0)
{
sign = -1;
subsidyDifference *= sign;
lowestSubsidy = reward;
}
else
{
lowestSubsidy = ASSETCHAINS_REWARD[j + 1];
}
}
// if we have not finished the current era, we need to caluclate a total as if we are at the end, with the current
// subsidy. we will calculate the total of a linear era as follows. Each item represents an area calculation:
// a) the rectangle from 0 to the lowest reward in the era * the number of blocks
// b) the rectangle of the remainder of blocks from the lowest point of the era to the highest point of the era if any remainder
// c) the minor triangle from the start of transition from the lowest point to the start of transition to the highest point
// d) one halving triangle (half area of one full step)
//
// we also need:
// e) number of steps = (n - erastart) / halving interval
//
// the total supply from era start up to height is:
// a + b + c + (d * e)
// calculate amount in one step's triangular protrusion over minor triangle's hypotenuse
denominator = nSteps * period;
if ( denominator == 0 )
denominator = 1;
// difference of one step vs. total
stepDifference = (period * subsidyDifference) / denominator;
// area == coin holding of one step triangle, protruding from minor triangle's hypotenuse
stepTriangle = (period * stepDifference) >> 1;
// sign is negative if slope is positive (start is less than end)
if (sign < 0)
{
// use steps minus one for our calculations, and add the potentially partial rectangle
// at the end
cur_money += stepTriangle * (nSteps - 1);
cur_money += stepTriangle * (nSteps - 1) * (nSteps - 1);
// difference times number of steps is height of rectangle above lowest subsidy
cur_money += modulo * stepDifference * nSteps;
}
else
{
// if negative slope, the minor triangle is the full number of steps, as the highest
// level step is full. lowest subsidy is just the lowest so far
lowestSubsidy = reward - (stepDifference * nSteps);
// add the step triangles, one per step
cur_money += stepTriangle * nSteps;
// add the minor triangle
cur_money += stepTriangle * nSteps * nSteps;
}
// add more for the base rectangle if lowest subsidy is not 0
cur_money += lowestSubsidy * (curEnd - lastEnd);
} else {
for ( int k = lastEnd; k < curEnd; k += period )
{
cur_money += period * reward;
// if zero, we do straight halving
reward = decay ? (reward * decay) / SATOSHIDEN : reward >> 1;
}
cur_money += modulo * reward;
}
}
}
}
5 years ago
}
if ( HUSH_BIT63SET(cur_money) != 0 )
3 years ago
return(HUSH_MAXNVALUE);
if ( ASSETCHAINS_COMMISSION != 0 ) {
5 years ago
uint64_t newval = (cur_money + (cur_money/COIN * ASSETCHAINS_COMMISSION));
if ( HUSH_BIT63SET(newval) != 0 )
3 years ago
return(HUSH_MAXNVALUE);
5 years ago
else if ( newval < cur_money ) // check for underflow
3 years ago
return(HUSH_MAXNVALUE);
5 years ago
return(newval);
5 years ago
}
5 years ago
//fprintf(stderr,"cur_money %.8f\n",(double)cur_money/COIN);
5 years ago
return(cur_money);
}
// the number of different devtax addresses/scriptpubs
const uint32_t DEVTAX_NUM = 20;
//TODO: production data
std::string DEVTAX_DATA[DEVTAX_NUM][2] = {
{"RYL7P8UvJMQVFuNPz91jeq4TmBv5CAej3L", "76a914fcd8387af3ddfa3dccfc4c5fcc603a6ac6bb68c788ac"},
{"RYMRJdP3xE8u3UfnPxGXt8y3zyvfJD6iS4", "76a914fd1798f1daa9db1a51b7008ed8595a38bd0578ae88ac"},
{"RR7xJv69GtdePoyR91eHyAHh28kYAnY7bx", "76a914adc2c66f0a5ca17c38d645b32ceb7ac53c7f4d4a88ac"},
{"RC8SkshVk9BxCJD3C3bYz6D5cBmXNtuxSj", "76a9141f40e303a47dbecb3e4a3adc2703ac35ae69df2288ac"},
{"RRWSxaXahpyGrM8kuMEyitgfqZDopBFkYq", "76a914b203d771299fc7317f4c9d931ff56b07b9e0dd3b88ac"},
{"RQqc39iRnwMbveLj3FRMpCa2CydRhnZsGV", "76a914aaab329b9e19f646f291079ec613d3ea73d520b888ac"},
{"RSGF5nvmeePrxx7rTwGKUfMapfJ8quPEqf", "76a914ba4c3b09bb775ce40055a269c1e242ea4e7a916388ac"},
{"RM1emY6avf5aJ17EvuGdxcNeseUFMp6HgM", "76a91480b1223b72f67a5729157948607bff335cc1e38b88ac"},
{"RNDpw9DAiTM17ap8P5XMbeQmt7bLL6NEnc", "76a9148df6bca3744ee12a8caa39444bf3325997ff3eca88ac"},
{"RJ7XsqfYatNgxVSoVPQFckhSiUzwqySaPh", "76a91460e57fe250719088391430421746f6f2c45795e788ac"},
{"REHbigWNsGcmgkyNcJpBwpCrM2XkEqGxab", "76a91436ec5cfe756a35fa5f2fd059ae4b76fbe6baa85a88ac"},
{"RPiWKtmkF7v6ms8GKZXLU1tEftRHeTushj", "76a9149e5b64807a87e5df1d3601eb0244b5a42f8f34b988ac"},
{"RB6k2YBay7BmzcmJyaKNWBrHueWcX1D3vj", "76a91413f6586b53a11b9b2e197dabfb5aa261d0b7419c88ac"},
{"RBQwd9U5VVtDxJzPggGGYivmSvsF2Mo6FV", "76a9141767835cbf20b4dc1300e6c3b983a246c1b1f65088ac"},
{"RAWpKV2s34ZMDa5CySP7K5WsziBmLvR1u5", "76a9140d8bc91d908f52526e872ff3174a5cd644bb99b688ac"},
{"RXwfnPpdaS5S1NHfRBVqdKf2reogjcn3CN", "76a914f899b359ed9a0a4b030c63961295972eaeb1f50488ac"},
{"RMoGypC7yXefJzEkUsTnaRJGdM5ec6spBA", "76a9148952147a2dd0f3961c6704b4a2092724a04596ce88ac"},
{"RTdpeFNcwxEkU2FM4nrweyEGVD2xfdPfxB", "76a914c9591b111bf40716dc7f92b99f8881bc1391fb1f88ac"},
{"RBGHsu1LqDpg7wXEQvVZnZvCRLAUGEjHDb", "76a91415c4ad4b91f2a2217be02a2c25ebfa7afc237cc488ac"},
{"RDLBJaf1Kz2F9FeznLomKjm7TtKvhSGqfb", "76a9142c711ab35a2b6245c6b9d5fac16e230ac7287caa88ac"},
};
// this is a deterministic consensus-changing function. All miners must be able
// to predict the scriptpub for the next block
std::string devtax_scriptpub_for_height(uint32_t nHeight) {
bool ishush3 = strncmp(SMART_CHAIN_SYMBOL, "HUSH3",5) == 0 ? true : false;
bool istush3 = strncmp(SMART_CHAIN_SYMBOL, "TUSH3",5) == 0 ? true : false;
// Fork height for HUSH3 mainnet needs to be decided just before code is merged
// Since it requires all full nodes on the network to have enough time to update.
// For testing, we choose an early blockheight so we can observe the value changing
// from the old fixed value to the new values which cycle
const int DEVTAX_FORK_HEIGHT = ishush3 ? nHushHardforkHeight4 : 5;
// Decentralized devtax is height-activated
if (nHeight >= DEVTAX_FORK_HEIGHT) {
if (ishush3 || istush3) {
return DEVTAX_DATA[ nHeight % DEVTAX_NUM ][1];
} else {
// if this is not HUSH3 or a testchain for HUSH3, return it unchanged
return ASSETCHAINS_SCRIPTPUB;
}
}
// return default unchanged if we are less than fork height
return ASSETCHAINS_SCRIPTPUB;
}
// this is only used by getblocktemplate, so it cannot change consensus of
// blocks < DEVTAX_FORK_HEIGHT but it will affect consensus of later blocks
std::string devtax_address_for_height(uint32_t nHeight) {
const std::string legacy_devtax_address = "RHushEyeDm7XwtaTWtyCbjGQumYyV8vMjn";
bool ishush3 = strncmp(SMART_CHAIN_SYMBOL, "HUSH3",5) == 0 ? true : false;
bool istush3 = strncmp(SMART_CHAIN_SYMBOL, "TUSH3",5) == 0 ? true : false;
// Fork height for HUSH3 mainnet needs to be decided just before code is merged
// Since it requires all full nodes on the network to have enough time to update.
// For testing, we choose an early blockheight so we can observe the value changing
// from the old fixed value to the new values which cycle
const int DEVTAX_FORK_HEIGHT = ishush3 ? nHushHardforkHeight4 : 5;
// Decentralized devtax is height-activated
if (nHeight >= DEVTAX_FORK_HEIGHT) {
if (ishush3 || istush3) {
return DEVTAX_DATA[ nHeight % DEVTAX_NUM ][2];
} else {
// if this is not HUSH3 or TUSH3, return legacy
return legacy_devtax_address;
}
}
// return default unchanged if we are less than fork height
return legacy_devtax_address;
}