From faf51f1a7aed6fce1059ff2c718257d9f77cfd57 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 26 Mar 2018 04:23:57 +0300 Subject: [PATCH] Cache pubkey33 and notary --- src/chain.h | 3 +- src/komodo_bitcoind.h | 64 +++++++++++++++++++++++++++---------------- src/komodo_notary.h | 8 ++---- src/pow.cpp | 2 +- 4 files changed, 46 insertions(+), 31 deletions(-) diff --git a/src/chain.h b/src/chain.h index 937e20bda..d3c46f9d6 100644 --- a/src/chain.h +++ b/src/chain.h @@ -177,7 +177,8 @@ public: //! (memory only) Sequential id assigned to distinguish order in which blocks are received. uint32_t nSequenceId; - + int8_t notaryid; uint8_t pubkey33[33]; + void SetNull() { phashBlock = NULL; diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index b2489f814..2fa18708b 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -585,7 +585,7 @@ void komodo_disconnect(CBlockIndex *pindex,CBlock& block) int32_t komodo_is_notarytx(const CTransaction& tx) { - uint8_t *ptr,crypto777[33]; + uint8_t *ptr; static uint8_t crypto777[33]; if ( tx.vout.size() > 0 ) { #ifdef KOMODO_ZCASH @@ -595,7 +595,8 @@ int32_t komodo_is_notarytx(const CTransaction& tx) #endif if ( ptr != 0 ) { - decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR); + if ( crypto777[0] == 0 ) + decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR); if ( memcmp(ptr+1,crypto777,33) == 0 ) { //printf("found notarytx\n"); @@ -704,8 +705,15 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) memset(pubkey33,0,33); if ( pindex != 0 ) { - if ( komodo_blockload(block,pindex) == 0 ) - komodo_block2pubkey33(pubkey33,block); + if ( pindex->pubkey33[0] == 0 ) + { + if ( komodo_blockload(block,pindex) == 0 ) + { + komodo_block2pubkey33(pindex->pubkey33,block); + pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); + } + } + memcpy(pubkey33,pindex->pubkey33,33); } else { @@ -714,12 +722,12 @@ void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height) } } -void komodo_connectpindex(CBlockIndex *pindex) +/*void komodo_connectpindex(CBlockIndex *pindex) { CBlock block; if ( komodo_blockload(block,pindex) == 0 ) komodo_connectblock(pindex,block); -} +}*/ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestamp); int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp); @@ -727,40 +735,50 @@ int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t hei int8_t komodo_minerid(int32_t height,uint8_t *pubkey33) { int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33]; - if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 ) + if ( (pindex= chainActive[height]) != 0 ) { - timestamp = pindex->GetBlockTime(); - if ( pubkey33 == 0 ) + if ( pindex->pubkey33[0] == 0 ) { - pubkey33 = _pubkey33; + timestamp = pindex->GetBlockTime(); + if ( pubkey33 == 0 ) + pubkey33 = _pubkey33; komodo_index2pubkey33(pubkey33,pindex,height); + pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); + /*if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 ) + { + for (i=0; i 0 ) - { - for (i=0; inotaryid); } return(komodo_electednotary(&numnotaries,pubkey33,height,timestamp)); } int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *nonzpkeysp,int32_t height) { - int32_t i,j,duplicate; CBlockIndex *pindex; uint8_t pubkey33[33]; + int32_t i,j,duplicate,numnotaries; CBlockIndex *pindex; uint8_t pubkey33[33]; memset(mids,-1,sizeof(*mids)*66); for (i=duplicate=0; i<66; i++) { if ( (pindex= komodo_chainactive(height-i)) != 0 ) { - komodo_index2pubkey33(pubkey33,pindex,height-i); - for (j=0; j<33; j++) - pubkeys[i][j] = pubkey33[j]; - if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) + if ( pindex->pubkey33[0] == 0 ) { - //mids[i] = *(int32_t *)pubkey33; - (*nonzpkeysp)++; + komodo_index2pubkey33(pubkey33,pindex,height-i); + pindex->notaryid = komodo_electednotary(&numnotaries,pindex->pubkey33,height,pindex->nTime); + //for (j=0; j<33; j++) + // pubkeys[i][j] = pubkey33[j]; + /*if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 ) + { + //mids[i] = *(int32_t *)pubkey33; + (*nonzpkeysp)++; + }*/ } + memcpy(pubkeys[i],pindex->pubkey33,33); + if ( (mids[i]= pindex->notaryid) >= 0 ) + (*nonzkeysp)++; if ( mids[0] >= 0 && i > 0 && mids[i] == mids[0] ) duplicate++; } diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 88ca567a7..961c1e866 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -257,11 +257,7 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height,uint32_t timestam int32_t komodo_electednotary(int32_t *numnotariesp,uint8_t *pubkey33,int32_t height,uint32_t timestamp) { - char pubkeystr[67]; int32_t i,n; uint8_t pubkeys[64][33]; - for (i=0; i<33; i++) - sprintf(&pubkeystr[i*2],"%02x",pubkey33[i]); - pubkeystr[66] = 0; - //printf("%s vs\n",pubkeystr); + int32_t i,n; uint8_t pubkeys[64][33]; n = komodo_notaries(pubkeys,height,timestamp); *numnotariesp = n; for (i=0; i