Merge branch 'danger' into duke
This commit is contained in:
17
contrib/hush_block_subsidy_per_halving
Executable file
17
contrib/hush_block_subsidy_per_halving
Executable 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
22
contrib/hush_halvings
Executable 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++;
|
||||
}
|
||||
|
||||
@@ -4,53 +4,215 @@
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
# Simulate the total supply on Hush v3 mainnet
|
||||
# Todo: track FR
|
||||
# Todo: verify FR off-by-one
|
||||
|
||||
my $supply = 0.0;
|
||||
my $block = 0; # Block 0 in Hush Smart chains is the BTC genesis block
|
||||
my $puposhis = 100_000_000;
|
||||
my $reward0 = 1_250_000_000;
|
||||
my $subsidy0 = 1_250_000_000;
|
||||
my $halvings = 0;
|
||||
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 $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";
|
||||
|
||||
# We know BR will go to zero between 7 and 8th halvings
|
||||
while ($halvings <= 10) {
|
||||
$block++;
|
||||
my $fr = 0;
|
||||
# blocks 2-127 of Hush v3 had BR=0
|
||||
if ($block == 1) {
|
||||
$reward = $initial; # airdropped funds from Hush v2 mainnet
|
||||
} elsif ($block > 1 && $block < 128) {
|
||||
$reward = 0; # blocks 2-127 have BR=0
|
||||
} else {
|
||||
$fr = 125_000_000;
|
||||
if ($block < 340_000) {
|
||||
$reward = $reward0;
|
||||
} else {
|
||||
my $shifted = $block - 340_000;
|
||||
# Past the first halving
|
||||
$halvings = 1 + int ($shifted / $interval);
|
||||
if ($shifted % 840_000 == 0) {
|
||||
$reward >>= 2;
|
||||
$fr >>= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
$supply += $reward;
|
||||
$totalfr += $fr;
|
||||
|
||||
# block, current supply, block reward amount, number of halvings, all amounts are in puposhis
|
||||
printf "%d,%d,%d,%d,%d,%d\n", $block, $supply, $reward, $fr, $totalfr, $halvings;
|
||||
exit(0) if $block == $stop;
|
||||
if ($stop eq 'help' or $stop =~ m/-h/) {
|
||||
die <<HELP;
|
||||
# Simulate the total supply on Hush v3 mainnet
|
||||
# Block Reward: Total Coinbase In Block
|
||||
# Subsidy : Coinbase Earned by Miner
|
||||
# FR : Founders Reward (10%)
|
||||
# Block Reward = Subsidy + FR
|
||||
Usage: ./hush_supply &> supply.csv
|
||||
./hush_supply HEIGHT &> supply.csv # stop at HEIGHT
|
||||
# This will generate CSV in the form of:
|
||||
# block, supply, reward, subsidy, fr, totalfr, halvings
|
||||
HELP
|
||||
}
|
||||
|
||||
|
||||
printf "# block, supply, reward, subsidy, fr, totalfr, halvings\n";
|
||||
|
||||
# Block Reward Amounts in puposhis
|
||||
# The non-integral amounts cannot be represented exactly
|
||||
# 12.5 * 100000000 = 1250000000
|
||||
# 12.5 * 100000000 / 2 = 625000000
|
||||
# 12.5 * 100000000 / 4 = 312500000
|
||||
# 12.5 * 100000000 / 8 = 156250000
|
||||
# 12.5 * 100000000 / 16 = 78125000
|
||||
# 12.5 * 100000000 / 32 = 39062500
|
||||
# 12.5 * 100000000 / 64 = 19531250
|
||||
# 12.5 * 100000000 / 128 = 9765625
|
||||
# 12.5 * 100000000 / 256 = 4882812.5
|
||||
# 12.5 * 100000000 / 512 = 2441406.25
|
||||
# 12.5 * 100000000 / 1024 = 1220703.125
|
||||
# 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);
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
.\" 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
|
||||
hush-cli \- manual page for hush-cli v3.5.0
|
||||
.SH DESCRIPTION
|
||||
Komodo RPC client version v3.5.0\-beta6\-a59803c32\-dirty
|
||||
Komodo RPC client version v3.5.0\-beta6\-fab0f9494\-dirty
|
||||
.PP
|
||||
In order to ensure you are adequately protecting your privacy when using Hush,
|
||||
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
|
||||
(recommended for sensitive information such as passphrases)
|
||||
.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,
|
||||
please see <https://myhush.org/security/>.
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
.\" 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
|
||||
hush-tx \- manual page for hush-tx v3.5.0
|
||||
.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:"
|
||||
.TP
|
||||
komodo\-tx [options] <hex\-tx> [commands]
|
||||
@@ -84,7 +84,7 @@ set=NAME:JSON\-STRING
|
||||
.IP
|
||||
Set register NAME to given JSON\-STRING
|
||||
.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,
|
||||
please see <https://myhush.org/security/>.
|
||||
|
||||
@@ -1,10 +1,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
|
||||
hushd \- manual page for hushd v3.5.0
|
||||
.SH DESCRIPTION
|
||||
Found binary: ./komodod
|
||||
Hush Daemon version v3.5.0\-beta6\-a59803c32\-dirty
|
||||
Hush Daemon version v3.5.0\-beta6\-fab0f9494\-dirty
|
||||
.PP
|
||||
In order to ensure you are adequately protecting your privacy when using Hush,
|
||||
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
|
||||
call (default: 0)
|
||||
.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
|
||||
.IP
|
||||
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
|
||||
\fB\-wallet=\fR<file>
|
||||
.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
|
||||
\fB\-walletbroadcast\fR
|
||||
.IP
|
||||
@@ -639,7 +645,7 @@ Starting supply, default is 0
|
||||
.IP
|
||||
Enforce transaction\-rate limit, default 0
|
||||
.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,
|
||||
please see <https://myhush.org/security/>.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// 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
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2013 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
@@ -16,7 +17,7 @@
|
||||
#ifndef 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* pszTestNetPrivKey = "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2014 The Bitcoin developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2016 The Zcash developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2016 The Zcash developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#define CLIENT_VERSION_MAJOR 3
|
||||
#define CLIENT_VERSION_MINOR 5
|
||||
#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
|
||||
#define CLIENT_VERSION_IS_RELEASE true
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Copyright (c) 2011-2013 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
@@ -23,8 +24,6 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
//#include "zcash/JoinSplit.hpp"
|
||||
|
||||
class CScheduler;
|
||||
class CWallet;
|
||||
|
||||
@@ -34,7 +33,6 @@ class thread_group;
|
||||
} // namespace boost
|
||||
|
||||
extern CWallet* pwalletMain;
|
||||
//extern ZCJoinSplit* pzcashParams;
|
||||
|
||||
void StartShutdown();
|
||||
bool ShutdownRequested();
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
/******************************************************************************
|
||||
* Copyright © 2014-2019 The SuperNET Developers. *
|
||||
* *
|
||||
|
||||
@@ -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/easy.h>
|
||||
#include "consensus/params.h"
|
||||
//#include "primitives/nonce.h"
|
||||
#include "komodo_defs.h"
|
||||
#include "script/standard.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
|
||||
// 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
|
||||
// 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
|
||||
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),
|
||||
INTERVAL = GetArg("-ac_halving1",840000), TRANSITION = 129, BR_END = 2*5422111;
|
||||
// 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
|
||||
};
|
||||
INTERVAL = GetArg("-ac_halving1",840000), TRANSITION = 129, BR_END = 50740000;
|
||||
uint64_t commission = 0;
|
||||
|
||||
//TODO: Likely a bug hiding here or at the next halving :)
|
||||
//if( height >= HALVING1) {
|
||||
if( height > HALVING1) {
|
||||
// Block time going from 150s to 75s (half) means the interval between halvings
|
||||
// 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 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);
|
||||
}
|
||||
|
||||
// Transition period of 128 blocks has BR=FR=0
|
||||
if (height < TRANSITION) {
|
||||
commission = 0;
|
||||
} else if (height < HALVING1) { // before 1st Halving @ Block 340000 (Nov 2020)
|
||||
commission = commisions[0];
|
||||
} else if (height < HALVING1+1*INTERVAL) { // before 2nd Halving @ Block 2020000
|
||||
commission = commisions[1];
|
||||
} else if (height < HALVING1+2*INTERVAL) { // before 3rd Halving @ Block 3700000
|
||||
commission = commisions[2];
|
||||
} else if (height < HALVING1+3*INTERVAL) { // before 4th Halving @ Block 5380000
|
||||
commission = commisions[3];
|
||||
} else if (height < HALVING1+4*INTERVAL) { // before 5th Halving @ Block 7060000
|
||||
commission = commisions[4];
|
||||
} else if (height < HALVING1+5*INTERVAL) { // before 6th Halving @ Block 8740000
|
||||
commission = commisions[5];
|
||||
} else if (height < HALVING1+6*INTERVAL) { // before 7th Halving @ Block 10420000
|
||||
commission = commisions[6];
|
||||
} else if (height < HALVING1+7*INTERVAL) { // before 8th Halving @ Block 12100000
|
||||
// TODO: Still true??? Block reward will go to zero between 7th+8th halvings, ac_end may need adjusting
|
||||
commission = commisions[7];
|
||||
} else if (height < HALVING1+8*INTERVAL) { // before 9th Halving @ Block 13780000
|
||||
// BR should be zero before this halving happens
|
||||
commission = commisions[8];
|
||||
} 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)
|
||||
commission = starting_commission;
|
||||
} else if (height < 2020000 ) {
|
||||
commission = 31250000;
|
||||
} else if (height < 3700000 ) {
|
||||
commission = 15625000;
|
||||
} else if (height < 5380000 ) {
|
||||
commission = 7812500;
|
||||
} else if (height < 7060000 ) {
|
||||
commission = 3906250;
|
||||
} else if (height < 8740000 ) {
|
||||
commission = 1953125;
|
||||
} else if (height < 10420000) {
|
||||
commission = 976562; // 0.5 puposhi deviation, all further BRs have deviation from ideal
|
||||
} 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
|
||||
// the -ac_end param on HUSH3
|
||||
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);
|
||||
|
||||
if(fDebug)
|
||||
fprintf(stderr,"%s: commission=%lu,interval=%d at height %d\n", __func__, commission, INTERVAL, height);
|
||||
return commission;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if (!didinit) {
|
||||
@@ -1317,7 +1361,8 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
|
||||
if ( ASSETCHAINS_FOUNDERS != 0 )
|
||||
{
|
||||
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);
|
||||
|
||||
if (ishush3) {
|
||||
@@ -1333,7 +1378,8 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
|
||||
} else {
|
||||
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 {
|
||||
commission = 0;
|
||||
}
|
||||
@@ -1362,7 +1408,8 @@ uint64_t komodo_commission(const CBlock *pblock,int32_t height)
|
||||
}
|
||||
if ( commission < 10000 )
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -2010,21 +2057,22 @@ void GetKomodoEarlytxidScriptPub()
|
||||
|
||||
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;
|
||||
if ( ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_FOUNDERS_REWARD != 0 )
|
||||
{
|
||||
checktoshis = komodo_commission(pblock,height);
|
||||
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);
|
||||
}
|
||||
else if ( checktoshis != 0 )
|
||||
{
|
||||
script = (uint8_t *)&pblock->vtx[0].vout[1].scriptPubKey[0];
|
||||
scriptlen = (int32_t)pblock->vtx[0].vout[1].scriptPubKey.size();
|
||||
if ( 1 )
|
||||
if ( fDebug )
|
||||
{
|
||||
int32_t 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 )
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(fDebug)
|
||||
fprintf(stderr,"%s checktoshis=%li at height=%d\n",__func__,checktoshis, height);
|
||||
return(checktoshis);
|
||||
}
|
||||
|
||||
|
||||
@@ -1542,32 +1542,106 @@ uint64_t komodo_max_money()
|
||||
}
|
||||
|
||||
|
||||
// This implements the Hush Emission Curve
|
||||
uint64_t hush_block_subsidy(int nHeight)
|
||||
// This implements the Hush Emission Curve, the miner subsidy part,
|
||||
// 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;
|
||||
//TODO: Cover all halvings until BR=0
|
||||
//if (nHeight >= 3700000) {
|
||||
// subsidy = ASSETCHAINS_REWARD[4];
|
||||
//} else
|
||||
if (nHeight >= 2020000) {
|
||||
subsidy = 140625000;
|
||||
} else if (nHeight >= GetArg("-z2zheight",340000)) {
|
||||
subsidy = 281250000;
|
||||
} else if (nHeight >= 128) {
|
||||
subsidy = 1125000000;
|
||||
uint64_t subsidy = 0;
|
||||
int32_t HALVING1 = GetArg("-z2zheight",340000);
|
||||
//TODO: support INTERVAL :(
|
||||
//int32_t INTERVAL = GetArg("-ac_halving1",840000);
|
||||
int32_t TRANSITION = 129;
|
||||
|
||||
if (height < TRANSITION) {
|
||||
if(fDebug)
|
||||
fprintf(stderr,"%s: setting subsidy=0 during transition at height=%d\n",__func__, height);
|
||||
subsidy = 0;
|
||||
} 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;
|
||||
}
|
||||
|
||||
// wrapper for more general supply curves of Hush Smart Chains
|
||||
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
|
||||
int64_t numerator, denominator, subsidy = 0;
|
||||
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;
|
||||
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;
|
||||
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) )
|
||||
{
|
||||
@@ -1598,7 +1673,8 @@ uint64_t komodo_ac_block_subsidy(int nHeight)
|
||||
{
|
||||
if (ishush3) {
|
||||
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 ) {
|
||||
// The code below is not compatible with HUSH3 mainnet
|
||||
if ( ASSETCHAINS_DECAY[curEra] == 0 ) {
|
||||
@@ -1654,7 +1730,8 @@ uint64_t komodo_ac_block_subsidy(int nHeight)
|
||||
else
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
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_TIMEUNLOCKFROM = GetArg("-ac_timeunlockfrom", 0);
|
||||
@@ -1841,7 +1919,7 @@ void komodo_args(char *argv0)
|
||||
bool ishush3 = strncmp(ASSETCHAINS_SYMBOL, "HUSH3",5) == 0 ? true : false;
|
||||
|
||||
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
|
||||
ASSETCHAINS_REWARD[0] = 0;
|
||||
ASSETCHAINS_REWARD[1] = 1125000000;
|
||||
|
||||
10
src/main.cpp
10
src/main.cpp
@@ -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
|
||||
// stuck in the mempool, when the z2z rule takes effect.
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
@@ -2402,13 +2402,8 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex,bool checkPOW)
|
||||
return true;
|
||||
}
|
||||
|
||||
//uint64_t komodo_moneysupply(int32_t height);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -4794,9 +4789,10 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
|
||||
nShieldedOutputsInBlock += nShieldedOutputs;
|
||||
nShieldedSpendsInBlock += nShieldedSpends;
|
||||
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->nChainSproutValue = boost::none;
|
||||
|
||||
@@ -610,7 +610,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32
|
||||
|
||||
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
|
||||
CMutableTransaction txNew = CreateNewContextualCMutableTransaction(consensusParams, nHeight);
|
||||
@@ -621,7 +621,7 @@ CBlockTemplate* CreateNewBlock(CPubKey _pk,const CScript& _scriptPubKeyIn, int32
|
||||
txNew.vout.resize(1);
|
||||
txNew.vout[0].scriptPubKey = scriptPubKeyIn;
|
||||
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;
|
||||
if ( ASSETCHAINS_ADAPTIVEPOW <= 0 )
|
||||
txNew.nLockTime = std::max(pindexPrev->GetMedianTimePast()+1, GetTime());
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
// Copyright (c) 2009-2013 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// Distributed under the MIT software license, see the accompanying
|
||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
|
||||
@@ -9,125 +9,30 @@ extern pthread_mutex_t staked_mutex;
|
||||
|
||||
int8_t is_STAKED(const char *chain_name)
|
||||
{
|
||||
static int8_t STAKED,doneinit;
|
||||
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;
|
||||
static int8_t STAKED=0;
|
||||
return(STAKED);
|
||||
};
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
int8_t StakedNotaryID(std::string ¬aryname, 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);
|
||||
}
|
||||
|
||||
int8_t numStakedNotaries(uint8_t pubkeys[64][33],int8_t era) {
|
||||
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);
|
||||
}
|
||||
|
||||
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 auth;
|
||||
auth.requiredSigs = (num_notaries_STAKED[chosen_era-1] / 5);
|
||||
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;
|
||||
};
|
||||
|
||||
@@ -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!");
|
||||
}
|
||||
|
||||
//if (IsInitialBlockDownload())
|
||||
// throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Zcash is downloading blocks...");
|
||||
|
||||
static unsigned int nTransactionsUpdatedLast;
|
||||
|
||||
if (!lpval.isNull())
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// Copyright (c) 2012-2014 The Bitcoin Core developers
|
||||
// Copyright (c) 2019-2020 The Hush developers
|
||||
// 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. *
|
||||
@@ -24,7 +25,7 @@
|
||||
* 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
|
||||
static const int INIT_PROTO_VERSION = 209;
|
||||
|
||||
Reference in New Issue
Block a user