From d39503c13b7419620d138050899705ced557eef9 Mon Sep 17 00:00:00 2001 From: Duke Date: Tue, 29 Apr 2025 14:52:25 -0400 Subject: [PATCH 1/2] Add HAC option to allow sending funds to the transparent burn address when -ac_private=1 --- src/hush_globals.h | 1 + src/hush_utils.h | 8 +++++++- src/init.cpp | 1 + src/main.cpp | 11 ++++++++--- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/hush_globals.h b/src/hush_globals.h index d31846ee9..8989cc4ce 100644 --- a/src/hush_globals.h +++ b/src/hush_globals.h @@ -50,6 +50,7 @@ int32_t HUSH_INSYNC,HUSH_LASTMINED,prevHUSH_LASTMINED,HUSH_CCACTIVATE; std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY,ASSETCHAINS_SCRIPTPUB,NOTARY_ADDRESS,ASSETCHAINS_SELFIMPORT,ASSETCHAINS_CCLIB; uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEYHASH[20],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE,ASSETCHAINS_TXPOW,ASSETCHAINS_MARMARA; int8_t ASSETCHAINS_ADAPTIVEPOW; +uint8_t ASSETCHAINS_BURN = 0; std::vector Mineropret; std::vector vAllowListAddress; char NOTARYADDRS[64][64]; diff --git a/src/hush_utils.h b/src/hush_utils.h index 433d4a8dc..835a5a5a3 100644 --- a/src/hush_utils.h +++ b/src/hush_utils.h @@ -1841,6 +1841,7 @@ void hush_args(char *argv0) HUSH_SNAPSHOT_INTERVAL = GetArg("-ac_snapshot",0); Split(GetArg("-ac_nk",""), sizeof(ASSETCHAINS_NK)/sizeof(*ASSETCHAINS_NK), ASSETCHAINS_NK, 0); + ASSETCHAINS_BURN = GetArg("-ac_burn", 0); // -ac_ccactivateht=evalcode,height,evalcode,height,evalcode,height.... Split(GetArg("-ac_ccactivateht",""), sizeof(ccEnablesHeight)/sizeof(*ccEnablesHeight), ccEnablesHeight, 0); @@ -2167,7 +2168,7 @@ void hush_args(char *argv0) } } - if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 || ASSETCHAINS_SELFIMPORT.size() > 0 || ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 || ASSETCHAINS_TIMELOCKGTE != _ASSETCHAINS_TIMELOCKOFF|| ASSETCHAINS_ALGO != ASSETCHAINS_EQUIHASH || ASSETCHAINS_LWMAPOS != 0 || ASSETCHAINS_LASTERA > 0 || ASSETCHAINS_BEAMPORT != 0 || ASSETCHAINS_CODAPORT != 0 || ASSETCHAINS_MARMARA != 0 || nonz > 0 || ASSETCHAINS_CCLIB.size() > 0 || ASSETCHAINS_FOUNDERS_REWARD != 0 || ASSETCHAINS_NOTARY_PAY[0] != 0 || ASSETCHAINS_BLOCKTIME != 60 || ASSETCHAINS_CBOPRET != 0 || Mineropret.size() != 0 || (ASSETCHAINS_NK[0] != 0 && ASSETCHAINS_NK[1] != 0) || HUSH_SNAPSHOT_INTERVAL != 0 || ASSETCHAINS_EARLYTXIDCONTRACT != 0 || ASSETCHAINS_CBMATURITY != 0 || ASSETCHAINS_ADAPTIVEPOW != 0 ) + if ( ASSETCHAINS_ENDSUBSIDY[0] != 0 || ASSETCHAINS_REWARD[0] != 0 || ASSETCHAINS_HALVING[0] != 0 || ASSETCHAINS_DECAY[0] != 0 || ASSETCHAINS_COMMISSION != 0 || ASSETCHAINS_PUBLIC != 0 || ASSETCHAINS_PRIVATE != 0 || ASSETCHAINS_TXPOW != 0 || ASSETCHAINS_FOUNDERS != 0 || ASSETCHAINS_SCRIPTPUB.size() > 1 || ASSETCHAINS_SELFIMPORT.size() > 0 || ASSETCHAINS_OVERRIDE_PUBKEY33[0] != 0 || ASSETCHAINS_TIMELOCKGTE != _ASSETCHAINS_TIMELOCKOFF|| ASSETCHAINS_ALGO != ASSETCHAINS_EQUIHASH || ASSETCHAINS_LWMAPOS != 0 || ASSETCHAINS_LASTERA > 0 || ASSETCHAINS_BEAMPORT != 0 || ASSETCHAINS_CODAPORT != 0 || ASSETCHAINS_MARMARA != 0 || nonz > 0 || ASSETCHAINS_CCLIB.size() > 0 || ASSETCHAINS_FOUNDERS_REWARD != 0 || ASSETCHAINS_NOTARY_PAY[0] != 0 || ASSETCHAINS_BLOCKTIME != 60 || ASSETCHAINS_CBOPRET != 0 || Mineropret.size() != 0 || (ASSETCHAINS_NK[0] != 0 && ASSETCHAINS_NK[1] != 0) || HUSH_SNAPSHOT_INTERVAL != 0 || ASSETCHAINS_EARLYTXIDCONTRACT != 0 || ASSETCHAINS_CBMATURITY != 0 || ASSETCHAINS_ADAPTIVEPOW != 0 || ASSETCHAINS_BURN != 0) { if(fDebug) fprintf(stderr,"perc %.4f%% ac_pub=[%02x%02x%02x...] acsize.%d\n",dstr(ASSETCHAINS_COMMISSION)*100,ASSETCHAINS_OVERRIDE_PUBKEY33[0],ASSETCHAINS_OVERRIDE_PUBKEY33[1],ASSETCHAINS_OVERRIDE_PUBKEY33[2],(int32_t)ASSETCHAINS_SCRIPTPUB.size()); @@ -2327,6 +2328,11 @@ void hush_args(char *argv0) } if ( ASSETCHAINS_ADAPTIVEPOW != 0 ) extraptr[extralen++] = ASSETCHAINS_ADAPTIVEPOW; + + if ( ASSETCHAINS_BURN != 0 ) + { + extralen += dragon_rwnum(1,&extraptr[extralen],sizeof(ASSETCHAINS_BURN),(void *)&ASSETCHAINS_BURN); + } } addn = GetArg("-seednode",""); diff --git a/src/init.cpp b/src/init.cpp index 9093a8e5e..d5e68103c 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -603,6 +603,7 @@ std::string HelpMessage(HelpMessageMode mode) strUsage += HelpMessageOpt("-ac_algo", _("Choose PoW mining algorithm, either 'equihash' or 'randomx'. default is Equihash (200,9)")); strUsage += HelpMessageOpt("-ac_blocktime", _("Block time in seconds, default is 60")); strUsage += HelpMessageOpt("-ac_beam", _("BEAM integration")); + strUsage += HelpMessageOpt("-ac_burn", _("Allow sending funds to the transparent burn address when -ac_private=1")); strUsage += HelpMessageOpt("-ac_coda", _("CODA integration")); strUsage += HelpMessageOpt("-ac_decay", _("Percentage of block reward decrease at each halving")); strUsage += HelpMessageOpt("-ac_end", _("Block height at which block rewards will end")); diff --git a/src/main.cpp b/src/main.cpp index a60821d03..60505ef57 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1520,11 +1520,16 @@ bool CheckTransactionWithoutProofVerification(uint32_t tiptime,const CTransactio { char destaddr[65]; Getscriptaddress(destaddr,txout.scriptPubKey); + if ( hush_isnotaryvout(destaddr,tiptime) == 0 ) { - invalid_private_taddr = 1; - fprintf(stderr,"%s: invalid taddr %s on private chain!\n", __func__, destaddr); - //return state.DoS(100, error("CheckTransaction(): this is a private chain, no public allowed"),REJECT_INVALID, "bad-txns-acprivacy-chain"); + const bool isburn = (strcmp(destaddr,BURN_ADDRESS) == 0); + if (ASSETCHAINS_BURN && isburn) { + fprintf(stderr,"%s: allowing burn address %s on private chain because ac_burn != 0\n", __func__, destaddr); + } else { + invalid_private_taddr = 1; + fprintf(stderr,"%s: invalid taddr %s on private chain!\n", __func__, destaddr); + } } } } From 080092a16d567a9112998d0123f2c3be871d17d2 Mon Sep 17 00:00:00 2001 From: Duke Date: Tue, 6 May 2025 00:31:13 -0400 Subject: [PATCH 2/2] -ac_burn=1 requires a z2t tx, -ac_burn=2 does not --- src/main.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 60505ef57..513413421 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1524,8 +1524,12 @@ bool CheckTransactionWithoutProofVerification(uint32_t tiptime,const CTransactio if ( hush_isnotaryvout(destaddr,tiptime) == 0 ) { const bool isburn = (strcmp(destaddr,BURN_ADDRESS) == 0); - if (ASSETCHAINS_BURN && isburn) { - fprintf(stderr,"%s: allowing burn address %s on private chain because ac_burn != 0\n", __func__, destaddr); + if ((ASSETCHAINS_BURN == 1) && isburn && tx.vin.empty()) { + // -ac_burn=1 means only zaddrs can send to the burn address + fprintf(stderr,"%s: allowing zaddr to send to burn address %s on private chain because ac_burn=1\n", __func__, destaddr); + } else if ((ASSETCHAINS_BURN == 2) && isburn) { + // -ac_burn=2 allows notary taddrs to send directly to the burn address + fprintf(stderr,"%s: allowing burn address %s on private chain because ac_burn=2\n", __func__, destaddr); } else { invalid_private_taddr = 1; fprintf(stderr,"%s: invalid taddr %s on private chain!\n", __func__, destaddr);