Merge branch 'danger' into duke

This commit is contained in:
Duke Leto
2020-09-19 12:17:51 -04:00
24 changed files with 476 additions and 235 deletions

View File

@@ -0,0 +1,17 @@
#!/usr/bin/env perl
# Copyright 2019-2020 The Hush developers
# Released under the GPLv3
use strict;
use warnings;
my $x = 12.5 * 100000000;
my $n = 0;
while ($n<=31) {
#printf "$n,%.16g,%.16g,%.16g\n", $x, $x*0.90, $x*0.1;
printf "$n,%d,%d,%d\n", $x, $x*0.90, $x*0.1;
$x = $x / 2;
$n++;
exit if ($x <= 0);
}

22
contrib/hush_halvings Executable file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env perl
# Copyright 2019-2020 The Hush developers
# Released under the GPLv3
use strict;
use warnings;
my $x = 340_000;
my $n = 0;
my $r = 12_500_000_000;
while ($n<=32) {
printf "%d,%d,%d\n", $n+1, $r, $x + 1680000*$n;
# blocktime halving at block 340000
if ($n==0) {
$r = 3.125 * 100_000_000;
} else {
$r /= 2;
}
$n++;
}

View File

@@ -4,53 +4,215 @@
use warnings; use warnings;
use strict; use strict;
# Simulate the total supply on Hush v3 mainnet
# Todo: track FR
# Todo: verify FR off-by-one
my $supply = 0.0; my $supply = 0.0;
my $block = 0; # Block 0 in Hush Smart chains is the BTC genesis block my $block = 0; # Block 0 in Hush Smart chains is the BTC genesis block
my $puposhis = 100_000_000; my $puposhis = 100_000_000;
my $reward0 = 1_250_000_000; my $subsidy0 = 1_250_000_000;
my $halvings = 0; my $halvings = 0;
my $initial = 6178674 * $puposhis; my $initial = 6178674 * $puposhis;
my $interval = 1_640_000; # 4 years of 75s blocks my $interval = 1_680_000; # ~4 years of 75s blocks
my $stop = shift || -1; my $stop = shift || -1;
my $totalfr = 0; # total paid out to FR address my $totalfr = 0; # total paid out to FR address
my $reward = $reward0;
# Usage: ./hush_supply &> supply.csv
# ./hush_supply HEIGHT &> supply.csv # stop at HEIGHT
printf "# block, supply, reward, fr, totalfr, halvings\n"; if ($stop eq 'help' or $stop =~ m/-h/) {
die <<HELP;
# We know BR will go to zero between 7 and 8th halvings # Simulate the total supply on Hush v3 mainnet
while ($halvings <= 10) { # Block Reward: Total Coinbase In Block
$block++; # Subsidy : Coinbase Earned by Miner
my $fr = 0; # FR : Founders Reward (10%)
# blocks 2-127 of Hush v3 had BR=0 # Block Reward = Subsidy + FR
if ($block == 1) { Usage: ./hush_supply &> supply.csv
$reward = $initial; # airdropped funds from Hush v2 mainnet ./hush_supply HEIGHT &> supply.csv # stop at HEIGHT
} elsif ($block > 1 && $block < 128) { # This will generate CSV in the form of:
$reward = 0; # blocks 2-127 have BR=0 # block, supply, reward, subsidy, fr, totalfr, halvings
} else { HELP
$fr = 125_000_000; }
if ($block < 340_000) {
$reward = $reward0;
} else { printf "# block, supply, reward, subsidy, fr, totalfr, halvings\n";
my $shifted = $block - 340_000;
# Past the first halving # Block Reward Amounts in puposhis
$halvings = 1 + int ($shifted / $interval); # The non-integral amounts cannot be represented exactly
if ($shifted % 840_000 == 0) { # 12.5 * 100000000 = 1250000000
$reward >>= 2; # 12.5 * 100000000 / 2 = 625000000
$fr >>= 2; # 12.5 * 100000000 / 4 = 312500000
} # 12.5 * 100000000 / 8 = 156250000
} # 12.5 * 100000000 / 16 = 78125000
} # 12.5 * 100000000 / 32 = 39062500
$supply += $reward; # 12.5 * 100000000 / 64 = 19531250
$totalfr += $fr; # 12.5 * 100000000 / 128 = 9765625
# 12.5 * 100000000 / 256 = 4882812.5
# block, current supply, block reward amount, number of halvings, all amounts are in puposhis # 12.5 * 100000000 / 512 = 2441406.25
printf "%d,%d,%d,%d,%d,%d\n", $block, $supply, $reward, $fr, $totalfr, $halvings; # 12.5 * 100000000 / 1024 = 1220703.125
exit(0) if $block == $stop; # 12.5 * 100000000 / 2048 = 610351.5625
# 12.5 * 100000000 / 4096 = 305175.78125
# 12.5 * 100000000 / 8192 = 152587.890625
# 12.5 * 100000000 / 16384 = 76293.9453125
# 12.5 * 100000000 / 32768 = 38146.97265625
# 12.5 * 100000000 / 65536 = 19073.486328125
# Hush Halving Heights and Block Rewards
# 1,12500000000,340000
# 2,312500000,2020000
# 3,156250000,3700000
# 4,78125000,5380000
# 5,39062500,7060000
# 6,19531250,8740000
# 7,9765625,10420000
# 8,4882812,12100000
# 9,2441406,13780000
# 10,1220703,15460000
# 11,610351,17140000
# 12,305175,18820000
# 13,152587,20500000
# 14,76293,22180000
# 15,38146,23860000
# 16,19073,25540000
# 17,9536,27220000
# 18,4768,28900000
# 19,2384,30580000
# 20,1192,32260000
# 21,596,33940000
# 22,298,35620000
# 23,149,37300000
# 24,74,38980000
# 25,37,40660000
# 26,18,42340000
# 27,9,44020000
# 28,4,45700000
# 29,2,47380000
# 30,1,49060000
# 31,0,50740000
sub hush_block_reward
{
my $reward = 0;
my $height = shift;
my $halvings = 0;
if ($height >= 50740000) {
$reward = 0;
$halvings = 31;
} elsif ($height >= 49060000) {
$reward = 1;
$halvings = 30;
} elsif ($height >= 47380000) {
$reward = 1;
$halvings = 29;
} elsif ($height >= 45700000) {
$reward = 2;
$halvings = 28;
} elsif ($height >= 44020000) {
$reward = 4;
$halvings = 27;
} elsif ($height >= 42340000) {
$reward = 9;
$halvings = 26;
} elsif ($height >= 40660000) {
$reward = 18;
$halvings = 25;
} elsif ($height >= 38980000) {
$reward = 37;
$halvings = 24;
} elsif ($height >= 37380000) {
$reward = 74;
$halvings = 23;
} elsif ($height >= 35620000) {
$reward = 149;
$halvings = 22;
} elsif ($height >= 33940000) {
$reward = 298;
$halvings = 21;
} elsif ($height >= 32260001) {
$reward = 596;
$halvings = 20;
} elsif ($height >= 30580000) {
$reward = 1192;
$halvings = 19;
} elsif ($height >= 28900000) {
$reward = 2384;
$halvings = 18;
} elsif ($height >= 27220000) {
$reward = 4768;
$halvings = 17;
} elsif ($height >= 25540000) {
$reward = 9536;
$halvings = 16;
} elsif ($height >= 23860000) {
$reward = 19073; # 0.486328125 deviation
$halvings = 15;
} elsif ($height >= 22180000) {
$reward = 38146; # 0.97265625 deviation
$halvings = 14;
} elsif ($height >= 20500000) {
$reward = 76293; # 0.9453125 deviation
$halvings = 13;
} elsif ($height >= 18820000) {
$reward = 152587; # 0.890625 deviation
$halvings = 12;
} elsif ($height >= 17140000) {
$reward = 305175; # 0.78125sat deviation
$halvings = 11;
} elsif ($height >= 15460000) {
$reward = 610351; # 0.5625sat deviation
$halvings = 10;
} elsif ($height >= 13780000) {
$reward = 1220703; # 0.125sat deviation
$halvings = 9
} elsif ($height >= 12100000) {
$reward = 2441406; # 0.25sat deviation
$halvings = 8
} elsif ($height >= 10420000) {
$reward = 4882812; # 0.5sat deviation
$halvings = 7;
} elsif ($height >= 8740000) {
$reward = 9765625; # last exact reward
$halvings = 6;
} elsif ($height >= 7060000) {
$reward = 19531250; # 0.1953125 HUSH
$halvings = 5;
} elsif ($height >= 5380000) {
$reward = 39062500; # 0.390625 HUSH
$halvings = 4;
} elsif ($height >= 3700000) {
$reward = 78125000; # 0.78125 HUSH
$halvings = 3;
} elsif ($height >= 2020000) {
$reward = 156250000; # 1.5625 HUSH
$halvings = 2;
} elsif ($height >= 340000) {
$reward = 312500000; # 3.125 HUSH
$halvings = 1;
} elsif ($height >= 128) {
$reward = 1250000000; # 12.5 HUSH
}
return ($reward,$halvings);
}
# Block reward is 0 at the 31st halving
while ($halvings <= 30) {
$block++;
my ($reward,$halvings) = hush_block_reward($block);
my $fr = int($reward / 10);
my $subsidy = $reward - $fr;
if($block == 1) {
# initial airdrop of funds from HUSH v2 network @ Block 500000
$reward = $initial;
$subsidy= $reward;
$fr = 0;
}
$supply += $reward;
$totalfr += $fr;
# all values in puposhis
# block, current supply, block reward amount, fr, totalfr, number of halvings
printf "%d,%d,%d,%d,%d,%d,%d\n", $block, $supply, $reward, $subsidy, $fr, $totalfr, $halvings;
exit(0) if $block == $stop;
exit(0) if ($block > 128 && $reward == 0);
exit(-1) if ($supply >= 21_000_000*$puposhis);
} }

View File

@@ -1,9 +1,9 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.10. .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.10.
.TH HUSH-CLI "1" "July 2020" "hush-cli v3.5.0" "User Commands" .TH HUSH-CLI "1" "September 2020" "hush-cli v3.5.0" "User Commands"
.SH NAME .SH NAME
hush-cli \- manual page for hush-cli v3.5.0 hush-cli \- manual page for hush-cli v3.5.0
.SH DESCRIPTION .SH DESCRIPTION
Komodo RPC client version v3.5.0\-beta6\-a59803c32\-dirty Komodo RPC client version v3.5.0\-beta6\-fab0f9494\-dirty
.PP .PP
In order to ensure you are adequately protecting your privacy when using Hush, In order to ensure you are adequately protecting your privacy when using Hush,
please see <https://myhush.org/security/>. please see <https://myhush.org/security/>.
@@ -71,7 +71,7 @@ Timeout in seconds during HTTP requests, or 0 for no timeout. (default:
Read extra arguments from standard input, one per line until EOF/Ctrl\-D Read extra arguments from standard input, one per line until EOF/Ctrl\-D
(recommended for sensitive information such as passphrases) (recommended for sensitive information such as passphrases)
.SH COPYRIGHT .SH COPYRIGHT
Hush Daemon version v3.5.0-beta6-a59803c32-dirty Hush Daemon version v3.5.0-beta6-fab0f9494-dirty
In order to ensure you are adequately protecting your privacy when using Hush, In order to ensure you are adequately protecting your privacy when using Hush,
please see <https://myhush.org/security/>. please see <https://myhush.org/security/>.

View File

@@ -1,9 +1,9 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.10. .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.10.
.TH HUSH-TX "1" "July 2020" "hush-tx v3.5.0" "User Commands" .TH HUSH-TX "1" "September 2020" "hush-tx v3.5.0" "User Commands"
.SH NAME .SH NAME
hush-tx \- manual page for hush-tx v3.5.0 hush-tx \- manual page for hush-tx v3.5.0
.SH DESCRIPTION .SH DESCRIPTION
Hush komodo\-tx utility version v3.5.0\-beta6\-a59803c32\-dirty Hush komodo\-tx utility version v3.5.0\-beta6\-fab0f9494\-dirty
.SS "Usage:" .SS "Usage:"
.TP .TP
komodo\-tx [options] <hex\-tx> [commands] komodo\-tx [options] <hex\-tx> [commands]
@@ -84,7 +84,7 @@ set=NAME:JSON\-STRING
.IP .IP
Set register NAME to given JSON\-STRING Set register NAME to given JSON\-STRING
.SH COPYRIGHT .SH COPYRIGHT
Hush Daemon version v3.5.0-beta6-a59803c32-dirty Hush Daemon version v3.5.0-beta6-fab0f9494-dirty
In order to ensure you are adequately protecting your privacy when using Hush, In order to ensure you are adequately protecting your privacy when using Hush,
please see <https://myhush.org/security/>. please see <https://myhush.org/security/>.

View File

@@ -1,10 +1,10 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.10. .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.10.
.TH HUSHD "1" "July 2020" "hushd v3.5.0" "User Commands" .TH HUSHD "1" "September 2020" "hushd v3.5.0" "User Commands"
.SH NAME .SH NAME
hushd \- manual page for hushd v3.5.0 hushd \- manual page for hushd v3.5.0
.SH DESCRIPTION .SH DESCRIPTION
Found binary: ./komodod Found binary: ./komodod
Hush Daemon version v3.5.0\-beta6\-a59803c32\-dirty Hush Daemon version v3.5.0\-beta6\-fab0f9494\-dirty
.PP .PP
In order to ensure you are adequately protecting your privacy when using Hush, In order to ensure you are adequately protecting your privacy when using Hush,
please see <https://myhush.org/security/>. please see <https://myhush.org/security/>.
@@ -114,6 +114,11 @@ Create new files with system default permissions, instead of umask 077
Maintain a full transaction index, used by the getrawtransaction rpc Maintain a full transaction index, used by the getrawtransaction rpc
call (default: 0) call (default: 0)
.HP .HP
\fB\-txsend=\fR<cmd>
.IP
Execute command to send a transaction instead of broadcasting (%s in cmd
is replaced by transaction hex)
.HP
\fB\-addressindex\fR \fB\-addressindex\fR
.IP .IP
Maintain a full address index, used to query for the balance, txids and Maintain a full address index, used to query for the balance, txids and
@@ -346,7 +351,8 @@ Upgrade wallet to latest format on startup
.HP .HP
\fB\-wallet=\fR<file> \fB\-wallet=\fR<file>
.IP .IP
Specify wallet file (within data directory) (default: wallet.dat) Specify wallet file absolute path or a path relative to the data
directory (default: wallet.dat)
.HP .HP
\fB\-walletbroadcast\fR \fB\-walletbroadcast\fR
.IP .IP
@@ -639,7 +645,7 @@ Starting supply, default is 0
.IP .IP
Enforce transaction\-rate limit, default 0 Enforce transaction\-rate limit, default 0
.SH COPYRIGHT .SH COPYRIGHT
Hush Daemon version v3.5.0-beta6-a59803c32-dirty Hush Daemon version v3.5.0-beta6-fab0f9494-dirty
In order to ensure you are adequately protecting your privacy when using Hush, In order to ensure you are adequately protecting your privacy when using Hush,
please see <https://myhush.org/security/>. please see <https://myhush.org/security/>.

View File

@@ -1,5 +1,6 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2015 The Bitcoin Core developers // Copyright (c) 2009-2015 The Bitcoin Core developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -79,4 +80,4 @@ struct CMempoolAddressDeltaKeyCompare
} }
}; };
#endif // BITCOIN_ADDRESSINDEX_H #endif // BITCOIN_ADDRESSINDEX_H

View File

@@ -1,5 +1,6 @@
// Copyright (c) 2010 Satoshi Nakamoto // Copyright (c) 2010 Satoshi Nakamoto
// Copyright (c) 2009-2013 The Bitcoin Core developers // Copyright (c) 2009-2013 The Bitcoin Core developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.

View File

@@ -1,3 +1,4 @@
// Copyright (c) 2019-2020 The Hush developers
/****************************************************************************** /******************************************************************************
* Copyright © 2014-2019 The SuperNET Developers. * * Copyright © 2014-2019 The SuperNET Developers. *
* * * *
@@ -16,7 +17,7 @@
#ifndef BITCOIN_ALERTKEYS_H #ifndef BITCOIN_ALERTKEYS_H
#define BITCOIN_ALERTKEYS_H #define BITCOIN_ALERTKEYS_H
// REMINDER: DO NOT COMMIT YOUR PRIVATE KEYS TO THE GIT REPOSITORY! // REMINDER: DO NOT COMMIT YOUR PRIVATE KEYS TO THE GIT REPOSITORY, lulz
const char* pszPrivKey = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; const char* pszPrivKey = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
const char* pszTestNetPrivKey = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; const char* pszTestNetPrivKey = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";

View File

@@ -1,5 +1,6 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2014 The Bitcoin developers // Copyright (c) 2009-2014 The Bitcoin developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.

View File

@@ -1,4 +1,5 @@
// Copyright (c) 2016 The Zcash developers // Copyright (c) 2016 The Zcash developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.

View File

@@ -1,4 +1,5 @@
// Copyright (c) 2016 The Zcash developers // Copyright (c) 2016 The Zcash developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.

View File

@@ -35,7 +35,7 @@
#define CLIENT_VERSION_MAJOR 3 #define CLIENT_VERSION_MAJOR 3
#define CLIENT_VERSION_MINOR 5 #define CLIENT_VERSION_MINOR 5
#define CLIENT_VERSION_REVISION 0 #define CLIENT_VERSION_REVISION 0
#define CLIENT_VERSION_BUILD 5 #define CLIENT_VERSION_BUILD 50
//! Set to true for release, false for prerelease or test build //! Set to true for release, false for prerelease or test build
#define CLIENT_VERSION_IS_RELEASE true #define CLIENT_VERSION_IS_RELEASE true

View File

@@ -1,4 +1,5 @@
// Copyright (c) 2011-2013 The Bitcoin Core developers // Copyright (c) 2011-2013 The Bitcoin Core developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.

View File

@@ -1,5 +1,6 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2014 The Bitcoin Core developers // Copyright (c) 2009-2014 The Bitcoin Core developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -23,8 +24,6 @@
#include <string> #include <string>
//#include "zcash/JoinSplit.hpp"
class CScheduler; class CScheduler;
class CWallet; class CWallet;
@@ -34,7 +33,6 @@ class thread_group;
} // namespace boost } // namespace boost
extern CWallet* pwalletMain; extern CWallet* pwalletMain;
//extern ZCJoinSplit* pzcashParams;
void StartShutdown(); void StartShutdown();
bool ShutdownRequested(); bool ShutdownRequested();

View File

@@ -1,3 +1,4 @@
// Copyright (c) 2019-2020 The Hush developers
/****************************************************************************** /******************************************************************************
* Copyright © 2014-2019 The SuperNET Developers. * * Copyright © 2014-2019 The SuperNET Developers. *
* * * *

View File

@@ -15,12 +15,11 @@
* * * *
******************************************************************************/ ******************************************************************************/
// komodo functions that interact with bitcoind C++ // Hush + Komodo functions that interact with bitcoind C++
#include <curl/curl.h> #include <curl/curl.h>
#include <curl/easy.h> #include <curl/easy.h>
#include "consensus/params.h" #include "consensus/params.h"
//#include "primitives/nonce.h"
#include "komodo_defs.h" #include "komodo_defs.h"
#include "script/standard.h" #include "script/standard.h"
#include "cc/CCinclude.h" #include "cc/CCinclude.h"
@@ -1242,69 +1241,114 @@ CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
// You specify the BR, and the FR % gets added so 10% of 12.5 is 1.25 // 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 // but to tell the AC params, I need to say "11% of 11.25" is 1.25
// 11% ie. 1/9th cannot be exactly represented and so the FR has tiny amounts of error unless done manually // 11% ie. 1/9th cannot be exactly represented and so the FR has tiny amounts of error unless done manually
// Do not change this code unless you really know what you are doing. // This must be kept in sync with hush_block_subsidy() in komoto_utils.h!
// Changing these functions are consensus changes!
// Here Be Dragons! -- Duke Leto // Here Be Dragons! -- Duke Leto
uint64_t hush_commission(int height) uint64_t hush_commission(int height)
{ {
// TODO: Calculate new BR_END based on 75s block time!!! 2X old BR_END is a rough estimate, not exact! // BR_END is the 31st halving
int32_t starting_commission = 125000000, HALVING1 = GetArg("-z2zheight",340000), int32_t starting_commission = 125000000, HALVING1 = GetArg("-z2zheight",340000),
INTERVAL = GetArg("-ac_halving1",840000), TRANSITION = 129, BR_END = 2*5422111; INTERVAL = GetArg("-ac_halving1",840000), TRANSITION = 129, BR_END = 50740000;
// TODO: how many halvings will we have given new 75s blocktime?
int32_t commisions[] = {starting_commission, 31250000, 15625000, 78125000, 39062500, 19531250, 9765625, // these are exact
4882812, 2441406, 1220703, 610351 // these have deviation from ideal BR
// Just like BTC, BRs in the far future will be slightly less than
// they should be because exact values are not integers, causing
// slightly less coins to be actually mined
};
uint64_t commission = 0; uint64_t commission = 0;
//TODO: Likely a bug hiding here or at the next halving :)
//if( height >= HALVING1) {
if( height > HALVING1) { if( height > HALVING1) {
// Block time going from 150s to 75s (half) means the interval between halvings // Block time going from 150s to 75s (half) means the interval between halvings
// must be twice as often, i.e. 840000*2=1680000 // must be twice as often, i.e. 840000*2=1680000
// 840000 is ~4 years worth of 150s blocks
// With 150s blocks, we have 210,000 blocks per year // With 150s blocks, we have 210,000 blocks per year
// With 75s blocks, we have 420,000 blocks per year // With 75s blocks, we have 420,000 blocks per year
INTERVAL = GetArg("-ac_halving2",1680000); INTERVAL = GetArg("-ac_halving2",1680000); // ~4 years worth of 75s blocks
fprintf(stderr,"%s: height=%d increasing interval to %d\n", __func__, height, INTERVAL); fprintf(stderr,"%s: height=%d increasing interval to %d\n", __func__, height, INTERVAL);
} }
// Transition period of 128 blocks has BR=FR=0
if (height < TRANSITION) { if (height < TRANSITION) {
commission = 0; commission = 0;
} else if (height < HALVING1) { // before 1st Halving @ Block 340000 (Nov 2020) } else {
commission = commisions[0]; // Just like BTC, BRs in the far future will be slightly less than
} else if (height < HALVING1+1*INTERVAL) { // before 2nd Halving @ Block 2020000 // they should be because exact values are not integers, causing
commission = commisions[1]; // slightly less coins to be actually mined and small deviations
} else if (height < HALVING1+2*INTERVAL) { // before 3rd Halving @ Block 3700000 // to the ideal FR/devtax
commission = commisions[2]; if (height < HALVING1) { // before 1st Halving @ Block 340000 (Nov 2020)
} else if (height < HALVING1+3*INTERVAL) { // before 4th Halving @ Block 5380000 commission = starting_commission;
commission = commisions[3]; } else if (height < 2020000 ) {
} else if (height < HALVING1+4*INTERVAL) { // before 5th Halving @ Block 7060000 commission = 31250000;
commission = commisions[4]; } else if (height < 3700000 ) {
} else if (height < HALVING1+5*INTERVAL) { // before 6th Halving @ Block 8740000 commission = 15625000;
commission = commisions[5]; } else if (height < 5380000 ) {
} else if (height < HALVING1+6*INTERVAL) { // before 7th Halving @ Block 10420000 commission = 7812500;
commission = commisions[6]; } else if (height < 7060000 ) {
} else if (height < HALVING1+7*INTERVAL) { // before 8th Halving @ Block 12100000 commission = 3906250;
// TODO: Still true??? Block reward will go to zero between 7th+8th halvings, ac_end may need adjusting } else if (height < 8740000 ) {
commission = commisions[7]; commission = 1953125;
} else if (height < HALVING1+8*INTERVAL) { // before 9th Halving @ Block 13780000 } else if (height < 10420000) {
// BR should be zero before this halving happens commission = 976562; // 0.5 puposhi deviation, all further BRs have deviation from ideal
commission = commisions[8]; } else if (height < 12100000) {
commission = 488281;
} else if (height < 15460000) {
commission = 244140;
} else if (height < 17140000) {
commission = 122070;
} else if (height < 18820000) {
commission = 61035;
} else if (height < 23860000) {
commission = 30517;
} else if (height < 23860000) {
commission = 15258;
} else if (height < 25540000) {
commission = 7629;
} else if (height < 27220000) {
commission = 3814;
} else if (height < 27220000) {
commission = 1907;
} else if (height < 28900000) {
commission = 953;
} else if (height < 30580000) {
commission = 476;
} else if (height < 32260000) {
commission = 238;
} else if (height < 33940000) {
commission = 119;
} else if (height < 35620000) {
commission = 59;
} else if (height < 37300000) {
commission = 29;
} else if (height < 38980000) {
commission = 14;
} else if (height < 40660000) {
commission = 7;
} else if (height < 42340000) {
commission = 3;
} else if (height < 44020000) {
commission = 1;
} else if (height < 45700000) {
// FR goes to zero at Halving 26
commission = 0;
} else if (height < 47380000) {
// FR still zero at Halving 27
commission = 0;
} else if (height < 49060000) {
// FR still zero at Halving 28
commission = 0;
} else if (height < 50740000) {
// FR still zero at Halving 29
commission = 0;
} else {
// enforce FR=0 for all other heights
// This over-rides the -ac_end param via HUSH3 cli args
commission = 0;
}
} }
// Explicitly set the last block reward
// BR_END is the block with the last non-zero block reward, which overrides if(fDebug)
// the -ac_end param on HUSH3 fprintf(stderr,"%s: commission=%lu,interval=%d at height %d\n", __func__, commission, INTERVAL, height);
if(height > BR_END) {
fprintf(stderr,"%s: HUSH block reward has gone to zero at height %d!!! It was a good run folks\n", __func__, height);
commission = 0;
}
fprintf(stderr,"%s: commission=%lu,interval=%d at height %d\n", __func__, commission, INTERVAL, height);
return commission; return commission;
} }
uint64_t komodo_commission(const CBlock *pblock,int32_t height) uint64_t komodo_commission(const CBlock *pblock,int32_t height)
{ {
fprintf(stderr,"%s at height=%d\n",__func__,height); //fprintf(stderr,"%s at height=%d\n",__func__,height);
static bool didinit = false, ishush3 = false; static bool didinit = false, ishush3 = false;
if (!didinit) { if (!didinit) {
@@ -1317,7 +1361,8 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
if ( ASSETCHAINS_FOUNDERS != 0 ) if ( ASSETCHAINS_FOUNDERS != 0 )
{ {
nSubsidy = GetBlockSubsidy(height,Params().GetConsensus()); nSubsidy = GetBlockSubsidy(height,Params().GetConsensus());
fprintf(stderr,"ht.%d nSubsidy %.8f prod %llu\n",height,(double)nSubsidy/COIN,(long long)(nSubsidy * ASSETCHAINS_COMMISSION)); if(fDebug)
fprintf(stderr,"ht.%d nSubsidy %.8f prod %llu\n",height,(double)nSubsidy/COIN,(long long)(nSubsidy * ASSETCHAINS_COMMISSION));
commission = ((nSubsidy * ASSETCHAINS_COMMISSION) / COIN); commission = ((nSubsidy * ASSETCHAINS_COMMISSION) / COIN);
if (ishush3) { if (ishush3) {
@@ -1333,7 +1378,8 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
} else { } else {
commission = ASSETCHAINS_FOUNDERS_REWARD; commission = ASSETCHAINS_FOUNDERS_REWARD;
} }
fprintf(stderr,"%s: set commission=%lu at height %d with\n",__func__,commission, height); if(fDebug)
fprintf(stderr,"%s: set commission=%lu at height %d with\n",__func__,commission, height);
} else { } else {
commission = 0; commission = 0;
} }
@@ -1362,7 +1408,8 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
} }
if ( commission < 10000 ) if ( commission < 10000 )
commission = 0; commission = 0;
//fprintf(stderr,"-> %.8f\n",(double)commission/COIN); if(fDebug)
fprintf(stderr,"%s: commission=%.8f at height=%d\n",__func__, (double)commission/COIN, height);
return(commission); return(commission);
} }
@@ -2010,21 +2057,22 @@ void GetKomodoEarlytxidScriptPub()
int64_t komodo_checkcommission(CBlock *pblock,int32_t height) int64_t komodo_checkcommission(CBlock *pblock,int32_t height)
{ {
fprintf(stderr,"%s at height=%d\n",__func__,height); if(fDebug)
fprintf(stderr,"%s at height=%d\n",__func__,height);
int64_t checktoshis=0; uint8_t *script,scripthex[8192]; int32_t scriptlen,matched = 0; static bool didinit = false; int64_t checktoshis=0; uint8_t *script,scripthex[8192]; int32_t scriptlen,matched = 0; static bool didinit = false;
if ( ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_FOUNDERS_REWARD != 0 ) if ( ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_FOUNDERS_REWARD != 0 )
{ {
checktoshis = komodo_commission(pblock,height); checktoshis = komodo_commission(pblock,height);
if ( checktoshis >= 10000 && pblock->vtx[0].vout.size() < 2 ) if ( checktoshis >= 10000 && pblock->vtx[0].vout.size() < 2 )
{ {
fprintf(stderr,"komodo_checkcommission vsize.%d height.%d commission %.8f\n",(int32_t)pblock->vtx[0].vout.size(),height,(double)checktoshis/COIN); fprintf(stderr,"ERROR: komodo_checkcommission vsize.%d height.%d commission %.8f has checktoshis <10000 or not enough vouts\n",(int32_t)pblock->vtx[0].vout.size(),height,(double)checktoshis/COIN);
return(-1); return(-1);
} }
else if ( checktoshis != 0 ) else if ( checktoshis != 0 )
{ {
script = (uint8_t *)&pblock->vtx[0].vout[1].scriptPubKey[0]; script = (uint8_t *)&pblock->vtx[0].vout[1].scriptPubKey[0];
scriptlen = (int32_t)pblock->vtx[0].vout[1].scriptPubKey.size(); scriptlen = (int32_t)pblock->vtx[0].vout[1].scriptPubKey.size();
if ( 1 ) if ( fDebug )
{ {
int32_t i; int32_t i;
for (i=0; i<scriptlen; i++) for (i=0; i<scriptlen; i++)
@@ -2064,11 +2112,13 @@ int64_t komodo_checkcommission(CBlock *pblock,int32_t height)
} }
if ( pblock->vtx[0].vout[1].nValue != checktoshis ) if ( pblock->vtx[0].vout[1].nValue != checktoshis )
{ {
fprintf(stderr,"ht.%d checktoshis %.8f vs actual vout[1] %.8f\n",height,dstr(checktoshis),dstr(pblock->vtx[0].vout[1].nValue)); fprintf(stderr,"ERROR: ht.%d checktoshis %.8f vs actual vout[1] %.8f !!!\n",height,dstr(checktoshis),dstr(pblock->vtx[0].vout[1].nValue));
return(-1); return(-1);
} }
} }
} }
if(fDebug)
fprintf(stderr,"%s checktoshis=%li at height=%d\n",__func__,checktoshis, height);
return(checktoshis); return(checktoshis);
} }

View File

@@ -1542,32 +1542,106 @@ uint64_t komodo_max_money()
} }
// This implements the Hush Emission Curve // This implements the Hush Emission Curve, the miner subsidy part,
uint64_t hush_block_subsidy(int nHeight) // and must be kept in sync with hush_commision() in komoto_bitcoind.h!
// Changing these functions are consensus changes!
// Here Be Dragons! -- Duke Leto
uint64_t hush_block_subsidy(int height)
{ {
uint64_t subsidy=0; uint64_t subsidy = 0;
//TODO: Cover all halvings until BR=0 int32_t HALVING1 = GetArg("-z2zheight",340000);
//if (nHeight >= 3700000) { //TODO: support INTERVAL :(
// subsidy = ASSETCHAINS_REWARD[4]; //int32_t INTERVAL = GetArg("-ac_halving1",840000);
//} else int32_t TRANSITION = 129;
if (nHeight >= 2020000) {
subsidy = 140625000; if (height < TRANSITION) {
} else if (nHeight >= GetArg("-z2zheight",340000)) { if(fDebug)
subsidy = 281250000; fprintf(stderr,"%s: setting subsidy=0 during transition at height=%d\n",__func__, height);
} else if (nHeight >= 128) { subsidy = 0;
subsidy = 1125000000; } else {
// Just like BTC, BRs in the far future will be slightly less than
// they should be because exact values are not integers, causing
// slightly less coins to be actually mined and small deviations
// to the ideal FR/devtax
if (height < HALVING1) { // before 1st Halving @ Block 340000 (Nov 2020)
subsidy = 1125000000;
} else if (height < 2020000 ) {
subsidy = 281250000;
} else if (height < 3700000 ) {
subsidy = 140625000;
} else if (height < 5380000 ) {
subsidy = 70312500;
} else if (height < 7060000 ) {
subsidy = 35156250;
} else if (height < 8740000 ) {
subsidy = 17578125;
} else if (height < 10420000) {
subsidy = 8789062;
} else if (height < 12100000) {
subsidy = 4394531;
} else if (height < 15460000) {
subsidy = 2197265;
} else if (height < 17140000) {
subsidy = 1098632;
} else if (height < 18820000) {
subsidy = 549316;
} else if (height < 23860000) {
subsidy = 274658;
} else if (height < 23860000) {
subsidy = 137329;
} else if (height < 25540000) {
subsidy = 68664;
} else if (height < 27220000) {
subsidy = 34332;
} else if (height < 27220000) {
subsidy = 17166;
} else if (height < 28900000) {
subsidy = 8583;
} else if (height < 30580000) {
subsidy = 4291;
} else if (height < 32260000) {
subsidy = 2145;
} else if (height < 33940000) {
subsidy = 1072;
} else if (height < 35620000) {
subsidy = 536;
} else if (height < 37300000) {
subsidy = 268;
} else if (height < 38980000) {
subsidy = 134;
} else if (height < 40660000) {
subsidy = 67;
} else if (height < 42340000) {
subsidy = 33;
} else if (height < 44020000) {
subsidy = 16;
} else if (height < 45700000) {
subsidy = 8;
} else if (height < 47380000) {
subsidy = 4;
} else if (height < 49060000) {
subsidy = 2;
} else if (height < 50740000) {
subsidy = 1;
} else {
// HUSH Block Reward rounds down to 0 at Block 50740000 which is the 31st halving
// because Bitcoin/Zcash/Hush internals don't support 0.5 sat block reward yet ;)
subsidy = 0;
}
} }
if(fDebug)
fprintf(stderr,"%s: subsidy=%lu at height=%d\n",__func__,subsidy,height);
return subsidy; return subsidy;
} }
// wrapper for more general supply curves of Hush Smart Chains // wrapper for more general supply curves of Hush Smart Chains
uint64_t komodo_ac_block_subsidy(int nHeight) uint64_t komodo_ac_block_subsidy(int nHeight)
{ {
fprintf(stderr,"%s: ht.%d\n", __func__, nHeight); //fprintf(stderr,"%s: ht.%d\n", __func__, nHeight);
// Find current era, start from beginning reward, and determine current subsidy // Find current era, start from beginning reward, and determine current subsidy
int64_t numerator, denominator, subsidy = 0; int64_t numerator, denominator, subsidy = 0;
int64_t subsidyDifference; int64_t subsidyDifference;
int32_t numhalvings, curEra = 0, sign = 1; int32_t numhalvings = 0, curEra = 0, sign = 1;
static uint64_t cached_subsidy; static int32_t cached_numhalvings; static int cached_era; static uint64_t cached_subsidy; static int32_t cached_numhalvings; static int cached_era;
bool ishush3 = strncmp(ASSETCHAINS_SYMBOL, "HUSH3",5) == 0 ? true : false; bool ishush3 = strncmp(ASSETCHAINS_SYMBOL, "HUSH3",5) == 0 ? true : false;
@@ -1590,7 +1664,8 @@ uint64_t komodo_ac_block_subsidy(int nHeight)
{ {
int64_t nStart = curEra ? ASSETCHAINS_ENDSUBSIDY[curEra - 1] : 0; int64_t nStart = curEra ? ASSETCHAINS_ENDSUBSIDY[curEra - 1] : 0;
subsidy = (int64_t)ASSETCHAINS_REWARD[curEra]; subsidy = (int64_t)ASSETCHAINS_REWARD[curEra];
fprintf(stderr,"%s: nStart.%ld subsidy.%ld curEra.%d\n",__func__,nStart,subsidy,curEra); if(fDebug)
fprintf(stderr,"%s: nStart.%ld subsidy.%ld curEra.%d\n",__func__,nStart,subsidy,curEra);
if ( subsidy || (curEra != ASSETCHAINS_LASTERA && ASSETCHAINS_REWARD[curEra + 1] != 0) ) if ( subsidy || (curEra != ASSETCHAINS_LASTERA && ASSETCHAINS_REWARD[curEra + 1] != 0) )
{ {
@@ -1598,7 +1673,8 @@ uint64_t komodo_ac_block_subsidy(int nHeight)
{ {
if (ishush3) { if (ishush3) {
subsidy = hush_block_subsidy(nHeight); subsidy = hush_block_subsidy(nHeight);
fprintf(stderr,"%s: HUSH3 subsidy=%ld at height=%d\n",__func__,subsidy,nHeight); if(fDebug)
fprintf(stderr,"%s: HUSH3 subsidy=%ld at height=%d\n",__func__,subsidy,nHeight);
} else if ( (numhalvings = ((nHeight - nStart) / ASSETCHAINS_HALVING[curEra])) > 0 ) { } else if ( (numhalvings = ((nHeight - nStart) / ASSETCHAINS_HALVING[curEra])) > 0 ) {
// The code below is not compatible with HUSH3 mainnet // The code below is not compatible with HUSH3 mainnet
if ( ASSETCHAINS_DECAY[curEra] == 0 ) { if ( ASSETCHAINS_DECAY[curEra] == 0 ) {
@@ -1654,7 +1730,8 @@ uint64_t komodo_ac_block_subsidy(int nHeight)
else else
subsidy += ASSETCHAINS_SUPPLY * SATOSHIDEN + magicExtra; subsidy += ASSETCHAINS_SUPPLY * SATOSHIDEN + magicExtra;
} }
fprintf(stderr,"%s: ht.%d curEra.%d lastEra.%lu subsidy.%ld numhalvings.%d magicExtra.%u\n",__func__,nHeight,curEra,ASSETCHAINS_LASTERA,subsidy,numhalvings,magicExtra); if(fDebug)
fprintf(stderr,"%s: ht.%d curEra.%d lastEra.%lu subsidy.%ld magicExtra.%u\n",__func__,nHeight,curEra,ASSETCHAINS_LASTERA,subsidy,magicExtra);
return(subsidy); return(subsidy);
} }
@@ -1822,7 +1899,8 @@ void komodo_args(char *argv0)
printf("ASSETCHAINS_LASTERA, if specified, must be between 1 and %u. ASSETCHAINS_LASTERA set to %lu\n", ASSETCHAINS_MAX_ERAS, ASSETCHAINS_LASTERA); printf("ASSETCHAINS_LASTERA, if specified, must be between 1 and %u. ASSETCHAINS_LASTERA set to %lu\n", ASSETCHAINS_MAX_ERAS, ASSETCHAINS_LASTERA);
} }
ASSETCHAINS_LASTERA -= 1; ASSETCHAINS_LASTERA -= 1;
fprintf(stderr,"%s: lastEra=%lu maxEras=%d\n", __func__, ASSETCHAINS_LASTERA, ASSETCHAINS_MAX_ERAS); if(fDebug)
fprintf(stderr,"%s: lastEra=%lu maxEras=%d\n", __func__, ASSETCHAINS_LASTERA, ASSETCHAINS_MAX_ERAS);
ASSETCHAINS_TIMELOCKGTE = (uint64_t)GetArg("-ac_timelockgte", _ASSETCHAINS_TIMELOCKOFF); ASSETCHAINS_TIMELOCKGTE = (uint64_t)GetArg("-ac_timelockgte", _ASSETCHAINS_TIMELOCKOFF);
ASSETCHAINS_TIMEUNLOCKFROM = GetArg("-ac_timeunlockfrom", 0); ASSETCHAINS_TIMEUNLOCKFROM = GetArg("-ac_timeunlockfrom", 0);
@@ -1841,7 +1919,7 @@ void komodo_args(char *argv0)
bool ishush3 = strncmp(ASSETCHAINS_SYMBOL, "HUSH3",5) == 0 ? true : false; bool ishush3 = strncmp(ASSETCHAINS_SYMBOL, "HUSH3",5) == 0 ? true : false;
if(ishush3) { if(ishush3) {
fprintf(stderr,"Setting custom HUSH3 chain values...\n"); fprintf(stderr,"%s: Setting custom HUSH3 reward,halving,subsidy chain values...\n",__func__);
// Over-ride HUSH3 values from CLI params. Changing our blocktime to 75s changes things // Over-ride HUSH3 values from CLI params. Changing our blocktime to 75s changes things
ASSETCHAINS_REWARD[0] = 0; ASSETCHAINS_REWARD[0] = 0;
ASSETCHAINS_REWARD[1] = 1125000000; ASSETCHAINS_REWARD[1] = 1125000000;

View File

@@ -1750,7 +1750,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
// and edge cases. This empty mempool assures there will be no transactions involving taddrs // and edge cases. This empty mempool assures there will be no transactions involving taddrs
// stuck in the mempool, when the z2z rule takes effect. // stuck in the mempool, when the z2z rule takes effect.
// Thanks to jl777 for helping design this // Thanks to jl777 for helping design this
fprintf(stderr,"%s: rejecting all tx's during z2z transition window at height=%d\n", __func__,nHeight); fprintf(stderr,"%s: rejecting all tx's during z2z transition window. Please retry after Block %d !!!\n", __func__,nHeight);
return false; return false;
} }
} }
@@ -2402,13 +2402,8 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex,bool checkPOW)
return true; return true;
} }
//uint64_t komodo_moneysupply(int32_t height);
CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{ {
fprintf(stderr,"%s: ht.%d\n", __func__, nHeight);
int32_t numhalvings,i; uint64_t numerator; CAmount nSubsidy = 3 * COIN;
return komodo_ac_block_subsidy(nHeight); return komodo_ac_block_subsidy(nHeight);
} }
@@ -4794,9 +4789,10 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
nShieldedOutputsInBlock += nShieldedOutputs; nShieldedOutputsInBlock += nShieldedOutputs;
nShieldedSpendsInBlock += nShieldedSpends; nShieldedSpendsInBlock += nShieldedSpends;
if (fZdebug) { if (fZdebug) {
fprintf(stderr,"%s: tx=%s has zspends=%d zouts=%d\n", __FUNCTION__, tx.GetHash().ToString().c_str(), nShieldedSpendsInBlock, nShieldedOutputsInBlock ); fprintf(stderr,"%s: tx=%s has zspends=%d zouts=%d\n", __FUNCTION__, tx.GetHash().ToString().c_str(), nShieldedSpends, nShieldedOutputs );
} }
} }
fprintf(stderr,"%s: block %s has total zspends=%d zouts=%d\n", __FUNCTION__, block.GetHash().ToString().c_str(), nShieldedSpendsInBlock, nShieldedOutputsInBlock );
pindexNew->nSproutValue = sproutValue; pindexNew->nSproutValue = sproutValue;
pindexNew->nChainSproutValue = boost::none; pindexNew->nChainSproutValue = boost::none;

View File

@@ -610,7 +610,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32
int32_t stakeHeight = chainActive.Height() + 1; int32_t stakeHeight = chainActive.Height() + 1;
//LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x stake.%i\n", nBlockSize,blocktime,pblock->nBits,isStake); LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x stake.%i\n", nBlockSize,blocktime,pblock->nBits,isStake);
// Create coinbase tx // Create coinbase tx
CMutableTransaction txNew = CreateNewContextualCMutableTransaction(consensusParams, nHeight); CMutableTransaction txNew = CreateNewContextualCMutableTransaction(consensusParams, nHeight);
@@ -621,7 +621,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32
txNew.vout.resize(1); txNew.vout.resize(1);
txNew.vout[0].scriptPubKey = scriptPubKeyIn; txNew.vout[0].scriptPubKey = scriptPubKeyIn;
txNew.vout[0].nValue = GetBlockSubsidy(nHeight,consensusParams) + nFees; txNew.vout[0].nValue = GetBlockSubsidy(nHeight,consensusParams) + nFees;
//fprintf(stderr,"mine ht.%d with %.8f\n",nHeight,(double)txNew.vout[0].nValue/COIN); fprintf(stderr,"mine ht.%d with %.8f\n",nHeight,(double)txNew.vout[0].nValue/COIN);
txNew.nExpiryHeight = 0; txNew.nExpiryHeight = 0;
if ( ASSETCHAINS_ADAPTIVEPOW <= 0 ) if ( ASSETCHAINS_ADAPTIVEPOW <= 0 )
txNew.nLockTime = std::max(pindexPrev->GetMedianTimePast()+1, GetTime()); txNew.nLockTime = std::max(pindexPrev->GetMedianTimePast()+1, GetTime());

View File

@@ -1,5 +1,6 @@
// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2013 The Bitcoin Core developers // Copyright (c) 2009-2013 The Bitcoin Core developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.

View File

@@ -9,125 +9,30 @@ extern pthread_mutex_t staked_mutex;
int8_t is_STAKED(const char *chain_name) int8_t is_STAKED(const char *chain_name)
{ {
static int8_t STAKED,doneinit; static int8_t STAKED=0;
if ( chain_name[0] == 0 )
return(0);
if (doneinit == 1 && ASSETCHAINS_SYMBOL[0] != 0)
return(STAKED);
else STAKED = 0;
if ( (strcmp(chain_name, "LABS") == 0) )
STAKED = 1; // These chains are allowed coin emissions.
else if ( (strncmp(chain_name, "LABS", 4) == 0) )
STAKED = 2; // These chains have no coin emission, block subsidy is always 0, and comission is 0. Notary pay is allowed.
else if ( (strcmp(chain_name, "CFEK") == 0) || (strncmp(chain_name, "CFEK", 4) == 0) )
STAKED = 3; // These chains have no speical rules at all.
else if ( (strcmp(chain_name, "TEST") == 0) || (strncmp(chain_name, "TEST", 4) == 0) )
STAKED = 4; // These chains are for testing consensus to create a chain etc. Not meant to be actually used for anything important.
else if ( (strcmp(chain_name, "THIS_CHAIN_IS_BANNED") == 0) )
STAKED = 255; // Any chain added to this group is banned, no notarisations are valid, as a consensus rule. Can be used to remove a chain from cluster if needed.
doneinit = 1;
return(STAKED); return(STAKED);
}; };
int32_t STAKED_era(int timestamp) int32_t STAKED_era(int timestamp)
{ {
int8_t era = 0;
if (timestamp <= STAKED_NOTARIES_TIMESTAMP[0])
return(1);
for (int32_t i = 1; i < NUM_STAKED_ERAS; i++)
{
if (timestamp <= STAKED_NOTARIES_TIMESTAMP[i] && timestamp >= (STAKED_NOTARIES_TIMESTAMP[i-1] + STAKED_ERA_GAP))
return(i+1);
}
// if we are in a gap, return era 0, this allows to invalidate notarizations when in GAP.
return(0); return(0);
}; };
int8_t StakedNotaryID(std::string &notaryname, char *Raddress) { int8_t StakedNotaryID(std::string &notaryname, char *Raddress) {
if ( STAKED_ERA != 0 )
{
for (int8_t i = 0; i < num_notaries_STAKED[STAKED_ERA-1]; i++) {
if ( strcmp(Raddress,NOTARYADDRS[i]) == 0 ) {
notaryname.assign(notaries_STAKED[STAKED_ERA-1][i][0]);
return(i);
}
}
}
return(-1); return(-1);
} }
int8_t numStakedNotaries(uint8_t pubkeys[64][33],int8_t era) { int8_t numStakedNotaries(uint8_t pubkeys[64][33],int8_t era) {
int i; int8_t retval = 0; int i; int8_t retval = 0;
static uint8_t staked_pubkeys[NUM_STAKED_ERAS][64][33],didinit[NUM_STAKED_ERAS];
static char ChainName[65];
if ( ChainName[0] == 0 )
{
if ( ASSETCHAINS_SYMBOL[0] == 0 )
strcpy(ChainName,"KMD");
else
strcpy(ChainName,ASSETCHAINS_SYMBOL);
}
if ( era == 0 )
{
// era is zero so we need to null out the pubkeys.
memset(pubkeys,0,64 * 33);
printf("%s is a STAKED chain and is in an ERA GAP.\n",ChainName);
return(64);
}
else
{
if ( didinit[era-1] == 0 )
{
for (i=0; i<num_notaries_STAKED[era-1]; i++) {
decode_hex(staked_pubkeys[era-1][i],33,(char *)notaries_STAKED[era-1][i][1]);
}
didinit[era-1] = 1;
printf("%s is a STAKED chain in era %i \n",ChainName,era);
}
memcpy(pubkeys,staked_pubkeys[era-1],num_notaries_STAKED[era-1] * 33);
retval = num_notaries_STAKED[era-1];
}
return(retval); return(retval);
} }
void UpdateNotaryAddrs(uint8_t pubkeys[64][33],int8_t numNotaries) { void UpdateNotaryAddrs(uint8_t pubkeys[64][33],int8_t numNotaries) {
static int didinit;
if ( didinit == 0 ) {
pthread_mutex_init(&staked_mutex,NULL);
didinit = 1;
}
if ( pubkeys[0][0] == 0 )
{
// null pubkeys, era 0.
pthread_mutex_lock(&staked_mutex);
memset(NOTARYADDRS,0,sizeof(NOTARYADDRS));
pthread_mutex_unlock(&staked_mutex);
}
else
{
// staked era is set.
pthread_mutex_lock(&staked_mutex);
for (int i = 0; i<numNotaries; i++)
{
pubkey2addr((char *)NOTARYADDRS[i],(uint8_t *)pubkeys[i]);
if ( memcmp(NOTARY_PUBKEY33,pubkeys[i],33) == 0 )
{
NOTARY_ADDRESS.assign(NOTARYADDRS[i]);
IS_STAKED_NOTARY = i;
}
}
pthread_mutex_unlock(&staked_mutex);
}
} }
CrosschainAuthority Choose_auth_STAKED(int32_t chosen_era) { CrosschainAuthority Choose_auth_STAKED(int32_t chosen_era) {
CrosschainAuthority auth; CrosschainAuthority auth;
auth.requiredSigs = (num_notaries_STAKED[chosen_era-1] / 5); auth.requiredSigs = (num_notaries_STAKED[chosen_era-1] / 5);
auth.size = num_notaries_STAKED[chosen_era-1]; auth.size = num_notaries_STAKED[chosen_era-1];
for (int n=0; n<auth.size; n++)
for (size_t i=0; i<33; i++)
sscanf(notaries_STAKED[chosen_era-1][n][1]+(i*2), "%2hhx", auth.notaries[n]+i);
return auth; return auth;
}; };

View File

@@ -681,9 +681,6 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp, const CPubKey& myp
throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Cannot get a block template while no peers are connected or chain not in sync!"); throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Cannot get a block template while no peers are connected or chain not in sync!");
} }
//if (IsInitialBlockDownload())
// throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Zcash is downloading blocks...");
static unsigned int nTransactionsUpdatedLast; static unsigned int nTransactionsUpdatedLast;
if (!lpval.isNull()) if (!lpval.isNull())

View File

@@ -1,6 +1,7 @@
// Copyright (c) 2012-2014 The Bitcoin Core developers // Copyright (c) 2012-2014 The Bitcoin Core developers
// Copyright (c) 2019-2020 The Hush developers
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or https://www.opensource.org/licenses/mit-license.php
/****************************************************************************** /******************************************************************************
* Copyright © 2014-2019 The SuperNET Developers. * * Copyright © 2014-2019 The SuperNET Developers. *
@@ -24,7 +25,7 @@
* network protocol versioning * network protocol versioning
*/ */
static const int PROTOCOL_VERSION = 170008; static const int PROTOCOL_VERSION = 170009;
//! initial proto version, to be increased after version/verack negotiation //! initial proto version, to be increased after version/verack negotiation
static const int INIT_PROTO_VERSION = 209; static const int INIT_PROTO_VERSION = 209;