diff --git a/src/init.cpp b/src/init.cpp index 1d0ffdb0b..fb2ae6aeb 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -514,7 +514,10 @@ void CleanupBlockRevFiles() remove(it->path()); } } - + path komodostate = GetDataDir() / "komodostate"; + remove(komodostate); + path minerids = GetDataDir() / "minerids"; + remove(minerids); // Remove all block files that aren't part of a contiguous set starting at // zero by walking the ordered map (keys are block file indices) by // keeping a separate counter. Once we hit a gap (or if 0 doesn't exist) diff --git a/src/komodo.h b/src/komodo.h index 94a204b21..34b249f3b 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -17,12 +17,12 @@ #define H_KOMODO_H // Todo: +// 0. optimize assetchains RT loop // 1. error check fiat redeem amounts // 2. net balance limiter -// 3. new RR algo -// 4. verify: interest payment, ratification, reorgs -// 5. automate notarization fee payouts -// 6. automated distribution of test REVS snapshot +// 3. verify: interest payment, ratification, reorgs +// 4. automate notarization fee payouts +// 5. automated distribution of test REVS snapshot #include #include @@ -33,6 +33,7 @@ #define GENESIS_NBITS 0x1f00ffff #define KOMODO_MINRATIFY 7 +FILE *Minerfp; int8_t Minerids[1024 * 1024 * 5]; // 5 million blocks #include "komodo_globals.h" @@ -48,14 +49,28 @@ int8_t Minerids[1024 * 1024 * 5]; // 5 million blocks void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout) { - static FILE *fp; static int32_t errs; char fname[512]; int32_t ht,func; uint8_t num,pubkeys[64][33]; -#ifdef WIN32 - sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"komodostate"); -#else - sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),(char *)"komodostate"); -#endif + static FILE *fp; static int32_t errs; char fname[512],fname2[512]; int32_t ht,func; uint8_t num,pubkeys[64][33]; if ( fp == 0 ) { +#ifdef WIN32 + sprintf(fname,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"komodostate"); + sprintf(fname2,"%s\\%s",GetDataDir(false).string().c_str(),(char *)"minerids"); +#else + sprintf(fname,"%s/%s",GetDataDir(false).string().c_str(),(char *)"komodostate"); + sprintf(fname2,"%s/%s",GetDataDir(false).string().c_str(),(char *)"minerids"); +#endif + memset(Minerids,0xfe,sizeof(Minerids)); + if ( (Minerfp= fopen(fname2,"rb+")) == 0 ) + { + if ( (Minerfp= fopen(fname2,"wb")) != 0 ) + { + fwrite(Minerids,1,sizeof(Minerids),Minerfp); + fclose(Minerfp); + } + Minerfp = fopen(fname2,"rb+"); + } + if ( Minerfp != 0 && fread(Minerids,1,sizeof(Minerids),Minerfp) != sizeof(Minerids) ) + printf("read error Minerids\n"); if ( (fp= fopen(fname,"rb+")) != 0 ) { while ( (func= fgetc(fp)) != EOF ) @@ -259,9 +274,9 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar } } -int32_t komodo_voutupdate(int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value) +int32_t komodo_voutupdate(int32_t *isratificationp,int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen,int32_t height,uint256 txhash,int32_t i,int32_t j,uint64_t *voutmaskp,int32_t *specialtxp,int32_t *notarizedheightp,uint64_t value) { - static uint256 zero; int32_t opretlen,nid,len = 0; uint256 kmdtxid,desttxid; uint8_t crypto777[33]; + static uint256 zero; int32_t opretlen,nid,k,len = 0; uint256 kmdtxid,desttxid; uint8_t crypto777[33]; if ( scriptlen == 35 && scriptbuf[0] == 33 && scriptbuf[34] == 0xac ) { decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR); @@ -274,7 +289,7 @@ int32_t komodo_voutupdate(int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen, if ( memcmp(crypto777,scriptbuf+1,33) == 0 ) { *specialtxp = 1; - printf(">>>>>>>> "); + //printf(">>>>>>>> "); } else if ( komodo_chosennotary(&nid,height,scriptbuf + 1) >= 0 ) { @@ -288,7 +303,9 @@ int32_t komodo_voutupdate(int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen, } else if ( notaryid != nid ) { - printf("mismatch notaryid.%d k.%d\n",notaryid,nid); + //for (i=0; i<33; i++) + // printf("%02x",scriptbuf[i+1]); + //printf(" %s mismatch notaryid.%d k.%d\n",ASSETCHAINS_SYMBOL,notaryid,nid); notaryid = 64; *voutmaskp = 0; } @@ -326,7 +343,20 @@ int32_t komodo_voutupdate(int32_t notaryid,uint8_t *scriptbuf,int32_t scriptlen, //int32_t k; for (k=0; k= 32*2+4 && strcmp(ASSETCHAINS_SYMBOL[0]==0?"KMD":ASSETCHAINS_SYMBOL,(char *)&scriptbuf[len+32*2+4]) == 0 ) + { + iguana_rwbignum(0,&scriptbuf[len],32,(uint8_t *)&kmdtxid); + for (k=0; k<32; k++) + if ( scriptbuf[len+k] != 0 ) + break; + if ( k == 32 ) + { + *isratificationp = 1; + printf("ISRATIFICATION (%s)\n",(char *)&scriptbuf[len+32*2+4]); + } + } + if ( *isratificationp == 0 ) + komodo_stateupdate(height,0,0,0,txhash,0,0,0,0,0,value,&scriptbuf[len],opretlen,j); } } return(notaryid); @@ -350,8 +380,9 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) static int32_t hwmheight; uint64_t signedmask,voutmask; uint8_t scriptbuf[4096],pubkeys[64][33]; uint256 kmdtxid,btctxid,txhash; - int32_t i,j,k,nid,numvalid,specialtx,notarizedheight,notaryid,len,numvouts,numvins,height,txn_count; + int32_t i,j,k,numnotaries,isratification,nid,numvalid,specialtx,notarizedheight,notaryid,len,numvouts,numvins,height,txn_count; komodo_init(pindex->nHeight); + numnotaries = komodo_notaries(pubkeys,pindex->nHeight); if ( pindex->nHeight > hwmheight ) hwmheight = pindex->nHeight; else @@ -380,7 +411,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) txhash = block.vtx[i].GetHash(); numvouts = block.vtx[i].vout.size(); notaryid = -1; - voutmask = specialtx = notarizedheight = 0; + voutmask = specialtx = notarizedheight = isratification = 0; for (j=0; j= 0 ) { if ( height < sizeof(Minerids)/sizeof(*Minerids) ) - Minerids[height] = nid; + { + if ( (Minerids[height]= nid) >= -1 ) + { + if ( Minerfp != 0 ) + { + fseek(Minerfp,height,SEEK_SET); + fputc(Minerids[height],Minerfp); + fflush(Minerfp); + } + } + } } if ( 0 && i > 0 ) { @@ -423,11 +463,12 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block) if ( signedmask != 0 && (notarizedheight != 0 || specialtx != 0) ) { printf("NOTARY SIGNED.%llx numvins.%d ht.%d txi.%d notaryht.%d specialtx.%d\n",(long long)signedmask,numvins,height,i,notarizedheight,specialtx); - if ( specialtx != 0 && numvouts > 2 && komodo_ratify_threshold(height,signedmask) > 0 ) + printf("ht.%d specialtx.%d isratification.%d numvouts.%d signed.%llx numnotaries.%d\n",height,specialtx,isratification,numvouts,(long long)signedmask,numnotaries); + if ( specialtx != 0 && isratification != 0 && numvouts > 2 ) { numvalid = 0; memset(pubkeys,0,sizeof(pubkeys)); - for (j=1; j= KOMODO_MINRATIFY && numvouts > 13 ) + if ( ((signedmask & 1) != 0 && numvalid >= KOMODO_MINRATIFY) || bitweight(signedmask) > (numnotaries>>1) ) { memset(&txhash,0,sizeof(txhash)); komodo_stateupdate(height,pubkeys,numvalid,0,txhash,0,0,0,0,0,0,0,0,0); + printf("RATIFIED! >>>>>>>>>> new notaries.%d newheight.%d from height.%d\n",numvalid,(((height+KOMODO_ELECTION_GAP/2)/KOMODO_ELECTION_GAP)+1)*KOMODO_ELECTION_GAP,height); } - printf("new notaries.%d newheight.%d from height.%d\n",numvouts-1,KOMODO_PUBKEYS_HEIGHT(height),height); } } } diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index b37a4dfa7..af86faa76 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -388,6 +388,23 @@ void komodo_disconnect(CBlockIndex *pindex,CBlock& block) //komodo_stateupdate(-pindex->nHeight,0,0,0,zero,0,0,0,0,0,0,0); } +int32_t komodo_is_notarytx(const CTransaction& tx) +{ + uint8_t *ptr,crypto777[33]; +#ifdef KOMODO_ZCASH + ptr = (uint8_t *)tx.vout[0].scriptPubKey.data(); +#else + ptr = (uint8_t *)&tx.vout[0].scriptPubKey[0]; +#endif + decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR); + if ( memcmp(ptr+1,crypto777,33) == 0 ) + { + //printf("found notarytx\n"); + return(1); + } + else return(0); +} + int32_t komodo_block2height(CBlock *block) { int32_t i,n,height = 0; uint8_t *ptr; @@ -453,11 +470,26 @@ int8_t komodo_minerid(int32_t height) int32_t notaryid; CBlockIndex *pindex; uint8_t pubkey33[33]; if ( depth < 3 && height <= CURRENT_HEIGHT )//chainActive.Tip()->nHeight ) { + if ( Minerids[height] >= -1 ) + { + printf("cached[%d] -> %d\n",height,Minerids[height]); + return(Minerids[height]); + } if ( (pindex= chainActive[height]) != 0 ) { depth++; komodo_index2pubkey33(pubkey33,pindex,height); komodo_chosennotary(¬aryid,height,pubkey33); + if ( notaryid >= -1 ) + { + Minerids[height] = notaryid; + if ( Minerfp != 0 ) + { + fseek(Minerfp,height,SEEK_SET); + fputc(Minerids[height],Minerfp); + fflush(Minerfp); + } + } depth--; return(notaryid); } diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index 1cda66399..6b88f8fae 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -276,7 +276,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above for (j=0; j<32; j++) printf("%02x",((uint8_t *)&hash)[j]); printf(" ht.%d blockhash couldnt find vout.[%d]\n",height,i); - // validate amount! + // validate amount! via fiat chain } } } @@ -288,7 +288,7 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above for (j=0; j<32; j++) printf("%02x",((uint8_t *)&txids[i-1])[j]); printf(" cant paxfind txid\n"); - // validate amount! + // validate amount! via fiat chain } else if ( opcode == 'I' ) matched++; } diff --git a/src/komodo_globals.h b/src/komodo_globals.h index ec5ee6127..bf9ac25ce 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -23,7 +23,7 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33) int COINBASE_MATURITY = 100; -int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,CURRENT_HEIGHT,ASSETCHAINS_SEED; +int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,CURRENT_HEIGHT,ASSETCHAINS_SEED,KOMODO_ON_DEMAND; std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES; uint8_t NOTARY_PUBKEY33[33]; diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 8b637db0a..8cbd3bc0d 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -52,8 +52,7 @@ const char *Notaries_genesis[][2] = { "titomane_SH", "035f49d7a308dd9a209e894321f010d21b7793461b0c89d6d9231a3fe5f68d9960" }, }; -#define KOMODO_ELECTION_GAP 2000 -#define KOMODO_PUBKEYS_HEIGHT(height) ((int32_t)(((((height)+KOMODO_ELECTION_GAP*.5)/KOMODO_ELECTION_GAP) + 1) * KOMODO_ELECTION_GAP)) +#define KOMODO_ELECTION_GAP ((ASSETCHAINS_SYMBOL[0] == 0) ? 2000 : 100) struct nutxo_entry { UT_hash_handle hh; uint256 txhash; uint64_t voutmask; int32_t notaryid,height; } *NUTXOS; struct knotary_entry { UT_hash_handle hh; uint8_t pubkey[33],notaryid; }; @@ -94,8 +93,7 @@ int32_t komodo_ratify_threshold(int32_t height,uint64_t signedmask) int32_t htind,numnotaries,i,wt = 0; if ( ASSETCHAINS_SYMBOL[0] != 0 ) return(2); - if ( (htind= KOMODO_PUBKEYS_HEIGHT(height) / KOMODO_ELECTION_GAP) == 1 ) - htind = 0; + htind = height / KOMODO_ELECTION_GAP; numnotaries = Pubkeys[htind].numnotaries; for (i=0; i 0 ) + { + height += KOMODO_ELECTION_GAP/2; + height /= KOMODO_ELECTION_GAP; + height = ((height + 1) * KOMODO_ELECTION_GAP); + htind = (height / KOMODO_ELECTION_GAP); + } else htind = 0; pthread_mutex_lock(&komodo_mutex); for (k=0; kpubkey,pubkeys[k],33); kp->notaryid = k; HASH_ADD_KEYPTR(hh,N.Notaries,kp->pubkey,33,kp); - //if ( height > 10000 ) + if ( height > 0 ) { for (i=0; i<33; i++) printf("%02x",pubkeys[k][i]); - printf(" notarypubs.[%d] ht.%d\n",k,height); + printf(" notarypubs.[%d] ht.%d active at %d\n",k,height,htind*KOMODO_ELECTION_GAP); } } N.numnotaries = num; - if ( (htind= KOMODO_PUBKEYS_HEIGHT(height) / KOMODO_ELECTION_GAP) == 1 ) - htind = 0; for (i=htind; i hwmheight ) + hwmheight = height; } int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33) @@ -163,8 +170,7 @@ int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33) *notaryidp = -1; if ( height < 0 || height/KOMODO_ELECTION_GAP >= sizeof(Pubkeys)/sizeof(*Pubkeys) ) return(-1); - if ( (htind= KOMODO_PUBKEYS_HEIGHT(height) / KOMODO_ELECTION_GAP) == 1 ) - htind = 0; + htind = height / KOMODO_ELECTION_GAP; pthread_mutex_lock(&komodo_mutex); HASH_FIND(hh,Pubkeys[htind].Notaries,pubkey33,33,kp); pthread_mutex_unlock(&komodo_mutex); @@ -273,7 +279,7 @@ void komodo_assetchain_pubkeys(char *jsonstr) { komodo_init(-1); komodo_notarysinit(0,pubkeys,n); - printf("initialize pubkeys[%d]\n",n); + //printf("initialize pubkeys[%d]\n",n); } else fprintf(stderr,"komodo_assetchain_pubkeys i.%d vs n.%d\n",i,n); } else fprintf(stderr,"assetchain pubkeys n.%d\n",n); } diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 7f691dc12..ec2e2ce9d 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -807,6 +807,15 @@ int32_t komodo_is_issuer() else return(0); } +int32_t bitweight(uint64_t x) +{ + int i,wt = 0; + for (i=0; i<64; i++) + if ( (1LL << i) & x ) + wt++; + return(wt); +} + int32_t _unhex(char c) { if ( c >= '0' && c <= '9' ) diff --git a/src/main.cpp b/src/main.cpp index 8c65fe825..dd1d52a92 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1044,6 +1044,7 @@ bool CheckTransactionWithoutProofVerification(const CTransaction& tx, CValidatio CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowFree) { + extern int32_t KOMODO_ON_DEMAND; { LOCK(mempool.cs); uint256 hash = tx.GetHash(); @@ -1268,6 +1269,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } // Store transaction in memory + if ( komodo_is_notarytx(tx) == 0 ) + KOMODO_ON_DEMAND++; pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); } diff --git a/src/miner.cpp b/src/miner.cpp index e90493f23..928bad008 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -99,12 +99,18 @@ void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, } #define ASSETCHAINS_MINHEIGHT 100 +#define ROUNDROBIN_DELAY 45 +extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE,ASSETCHAINS_SHORTFLAG,KOMODO_REALTIME; +extern char ASSETCHAINS_SYMBOL[16]; +extern std::string NOTARY_PUBKEY; +extern uint8_t NOTARY_PUBKEY33[33]; +uint32_t Mining_start,Mining_height; +int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33); +int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33]); int32_t komodo_pax_opreturn(uint8_t *opret,int32_t maxsize); uint64_t komodo_paxtotal(); int32_t komodo_is_issuer(); int32_t komodo_gateway_deposits(CMutableTransaction *txNew,int32_t shortflag,char *symbol,int32_t tokomodo); -extern int32_t KOMODO_INITDONE,ASSETCHAINS_SHORTFLAG,KOMODO_REALTIME; -extern char ASSETCHAINS_SYMBOL[16]; CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) { @@ -114,11 +120,10 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) if(!pblocktemplate.get()) return NULL; CBlock *pblock = &pblocktemplate->block; // pointer for convenience - //fprintf(stderr,"create new block %d\n",chainActive.Tip()->nHeight); if ( ASSETCHAINS_SYMBOL[0] != 0 && chainActive.Tip()->nHeight >= 100 ) { - fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),KOMODO_REALTIME); - while ( mempool.GetTotalTxSize() <= 0 ) + fprintf(stderr,"start CreateNewBlock %s initdone.%d deposit %.8f mempool.%d RT.%u KOMODO_ON_DEMAND.%d\n",ASSETCHAINS_SYMBOL,KOMODO_INITDONE,(double)komodo_paxtotal()/COIN,(int32_t)mempool.GetTotalTxSize(),KOMODO_REALTIME,KOMODO_ON_DEMAND); + while ( KOMODO_ON_DEMAND == 0 )//mempool.GetTotalTxSize() <= 0 ) { deposits = komodo_paxtotal(); if ( KOMODO_INITDONE == 0 || KOMODO_REALTIME == 0 ) @@ -129,6 +134,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn) break; sleep(10); } + KOMODO_ON_DEMAND = 0; if ( 0 && deposits != 0 ) printf("miner KOMODO_DEPOSIT %llu pblock->nHeight %d mempool.GetTotalTxSize(%d)\n",(long long)komodo_paxtotal(),(int32_t)chainActive.Tip()->nHeight,(int32_t)mempool.GetTotalTxSize()); } @@ -439,13 +445,6 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& // // Internal miner // -#define ROUNDROBIN_DELAY 45 -extern int32_t ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE; -extern std::string NOTARY_PUBKEY; -extern uint8_t NOTARY_PUBKEY33[33]; -uint32_t Mining_start,Mining_height; -int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33); -int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33]); CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey) { diff --git a/src/pow.cpp b/src/pow.cpp index 119544ec0..befb665bd 100644 --- a/src/pow.cpp +++ b/src/pow.cpp @@ -132,6 +132,8 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in if ( notaryid >= 0 ) { special2 = komodo_is_special(height,pubkey33); + if ( 0 && special2 == -2 ) + printf("height.%d special2.%d special.%d\n",height,special2,special); if ( special2 == -2 || (height < 70000 && (special != 0 || special2 > 0)) || (height >= 70000 && special2 > 0) ) { @@ -153,6 +155,8 @@ bool CheckProofOfWork(int32_t height,uint8_t *pubkey33,uint256 hash, unsigned in } if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit)) return error("CheckProofOfWork(): nBits below minimum work"); + if ( height > 70000 ) + bnTarget /= 64; // Check proof of work matches claimed amount if ( UintToArith256(hash) > bnTarget ) { diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index c2cff8c00..4642a52db 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -85,7 +85,7 @@ Value getinfo(const Array& params, bool fHelp) obj.push_back(Pair("protocolversion", PROTOCOL_VERSION)); obj.push_back(Pair("notarized", NOTARIZED_HEIGHT)); obj.push_back(Pair("notarizedhash", NOTARIZED_HASH.ToString())); - obj.push_back(Pair("notarizedbtc", NOTARIZED_DESTTXID.ToString())); + obj.push_back(Pair("notarizedtxid", NOTARIZED_DESTTXID.ToString())); #ifdef ENABLE_WALLET if (pwalletMain) { obj.push_back(Pair("walletversion", pwalletMain->GetVersion()));