// komodo functions that interact with bitcoind C++
#ifdef _WIN32
-#include <curl.h>
-#include <easy.h>
+#include <curl/curl.h>
+#include <curl/easy.h>
#else
#include <curl/curl.h>
#include <curl/easy.h>
#endif
-#define issue_curl(cmdstr) bitcoind_RPC(0,(char *)"curl",(char *)"http://127.0.0.1:7776",0,0,(char *)(cmdstr))
+#include "komodo_defs.h"
+
+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);
+
+//#define issue_curl(cmdstr) bitcoind_RPC(0,(char *)"curl",(char *)"http://127.0.0.1:7776",0,0,(char *)(cmdstr))
struct MemoryStruct { char *memory; size_t size; };
struct return_string { char *ptr; size_t len; };
curl_handle = curl_easy_init();
init_string(&s);
headers = curl_slist_append(0,"Expect:");
-
+
curl_easy_setopt(curl_handle,CURLOPT_USERAGENT,"mozilla/4.0");//"Mozilla/4.0 (compatible; )");
curl_easy_setopt(curl_handle,CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl_handle,CURLOPT_URL, url);
bracket0 = (char *)"[";
bracket1 = (char *)"]";
}
-
+
databuf = (char *)malloc(256 + strlen(command) + strlen(params));
sprintf(databuf,"{\"id\":\"jl777\",\"method\":\"%s\",\"params\":%s%s%s}",command,bracket0,params,bracket1);
//printf("url.(%s) userpass.(%s) databuf.(%s)\n",url,userpass,databuf);
free(s.ptr);
sleep((1<<numretries));
goto try_again;
-
+
}
else
{
{
sprintf(url,(char *)"http://127.0.0.1:%u",port);
sprintf(postdata,"{\"method\":\"%s\",\"params\":%s}",method,params);
- //printf("postdata.(%s) USERPASS.(%s)\n",postdata,KMDUSERPASS);
+ //printf("[%s] (%s) postdata.(%s) params.(%s) USERPASS.(%s)\n",ASSETCHAINS_SYMBOL,url,postdata,params,KMDUSERPASS);
retstr2 = bitcoind_RPC(&retstr,(char *)"debug",url,userpass,method,params);
//retstr = curl_post(&cHandle,url,USERPASS,postdata,0,0,0,0);
}
return(retstr2);
}
+int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heightp)
+{
+ char *jsonstr,params[256],*userpass; uint16_t port; cJSON *json,*item; int32_t height = 0,txid_height = 0,txid_confirmations = 0;
+ params[0] = 0;
+ *kmdnotarized_heightp = 0;
+ if ( strcmp(dest,"KMD") == 0 )
+ {
+ port = KMD_PORT;
+ userpass = KMDUSERPASS;
+ }
+ else if ( strcmp(dest,"BTC") == 0 )
+ {
+ port = 8332;
+ userpass = BTCUSERPASS;
+ }
+ else return(0);
+ if ( userpass[0] != 0 )
+ {
+ if ( (jsonstr= komodo_issuemethod(userpass,(char *)"getinfo",params,port)) != 0 )
+ {
+ //printf("(%s)\n",jsonstr);
+ if ( (json= cJSON_Parse(jsonstr)) != 0 )
+ {
+ if ( (item= jobj(json,(char *)"result")) != 0 )
+ {
+ height = jint(item,(char *)"blocks");
+ *kmdnotarized_heightp = strcmp(dest,"KMD") == 0 ? jint(item,(char *)"notarized") : height;
+ }
+ free_json(json);
+ }
+ free(jsonstr);
+ }
+ sprintf(params,"[\"%s\", 1]",txidstr);
+ if ( (jsonstr= komodo_issuemethod(userpass,(char *)"getrawtransaction",params,port)) != 0 )
+ {
+ //printf("(%s)\n",jsonstr);
+ if ( (json= cJSON_Parse(jsonstr)) != 0 )
+ {
+ if ( (item= jobj(json,(char *)"result")) != 0 )
+ {
+ txid_confirmations = jint(item,(char *)"confirmations");
+ if ( txid_confirmations > 0 && height > txid_confirmations )
+ txid_height = height - txid_confirmations;
+ else txid_height = height;
+ //printf("height.%d tconfs.%d txid_height.%d\n",height,txid_confirmations,txid_height);
+ }
+ free_json(json);
+ }
+ free(jsonstr);
+ }
+ }
+ return(txid_height);
+}
+
int32_t komodo_verifynotarizedscript(int32_t height,uint8_t *script,int32_t len,uint256 NOTARIZED_HASH)
{
int32_t i; uint256 hash; char params[256];
printf(" notarized, ");
for (i=0; i<32; i++)
printf("%02x",((uint8_t *)&hash)[i]);
- printf(" opreturn from [%s] ht.%d\n",ASSETCHAINS_SYMBOL,height);
+ printf(" opreturn from [%s] ht.%d MISMATCHED\n",ASSETCHAINS_SYMBOL,height);
return(-1);
}
int32_t komodo_verifynotarization(char *symbol,char *dest,int32_t height,int32_t NOTARIZED_HEIGHT,uint256 NOTARIZED_HASH,uint256 NOTARIZED_DESTTXID)
{
- char params[256],*jsonstr,*hexstr; uint8_t script[8192]; int32_t n,len,retval = -1; cJSON *json,*txjson,*vouts,*vout,*skey;
+ char params[256],*jsonstr,*hexstr; uint8_t *script,_script[8192]; int32_t n,len,retval = -1; cJSON *json,*txjson,*vouts,*vout,*skey;
+ script = _script;
/*params[0] = '[';
params[1] = '"';
for (i=0; i<32; i++)
sprintf(params,"[\"%s\", 1]",NOTARIZED_DESTTXID.ToString().c_str());
if ( strcmp(symbol,ASSETCHAINS_SYMBOL[0]==0?(char *)"KMD":ASSETCHAINS_SYMBOL) != 0 )
return(0);
- //printf("[%s] src.%s dest.%s params.[%s] ht.%d notarized.%d\n",ASSETCHAINS_SYMBOL,symbol,dest,params,height,NOTARIZED_HEIGHT);
+ if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
+ printf("[%s] src.%s dest.%s params.[%s] ht.%d notarized.%d\n",ASSETCHAINS_SYMBOL,symbol,dest,params,height,NOTARIZED_HEIGHT);
if ( strcmp(dest,"KMD") == 0 )
{
if ( KMDUSERPASS[0] != 0 )
- jsonstr = komodo_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,7771);
- //else jsonstr = _dex_getrawtransaction();
+ {
+ if ( ASSETCHAINS_SYMBOL[0] != 0 )
+ {
+ jsonstr = komodo_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,KMD_PORT);
+//printf("userpass.(%s) got (%s)\n",KMDUSERPASS,jsonstr);
+ }
+ }//else jsonstr = _dex_getrawtransaction();
else return(0); // need universal way to issue DEX* API, since notaries mine most blocks, this ok
}
else if ( strcmp(dest,"BTC") == 0 )
if ( (txjson= jobj(json,(char *)"result")) != 0 && (vouts= jarray(&n,txjson,(char *)"vout")) > 0 )
{
vout = jitem(vouts,n-1);
- //printf("vout.(%s)\n",jprint(vout,0));
+ if ( 0 && ASSETCHAINS_SYMBOL[0] != 0 )
+ printf("vout.(%s)\n",jprint(vout,0));
if ( (skey= jobj(vout,(char *)"scriptPubKey")) != 0 )
{
if ( (hexstr= jstr(skey,(char *)"hex")) != 0 )
{
- //printf("HEX.(%s)\n",hexstr);
+ //printf("HEX.(%s) vs hash.%s\n",hexstr,NOTARIZED_HASH.ToString().c_str());
len = strlen(hexstr) >> 1;
decode_hex(script,len,hexstr);
+ if ( script[1] == 0x4c )
+ {
+ script++;
+ len--;
+ }
+ else if ( script[1] == 0x4d )
+ {
+ script += 2;
+ len -= 2;
+ }
retval = komodo_verifynotarizedscript(height,script,len,NOTARIZED_HASH);
}
}
return(retval);
}
-uint256 komodo_getblockhash(int32_t height)
+/*uint256 komodo_getblockhash(int32_t height)
{
uint256 hash; char params[128],*hexstr,*jsonstr; cJSON *result; int32_t i; uint8_t revbuf[32];
memset(&hash,0,sizeof(hash));
sprintf(params,"[%d]",height);
- if ( (jsonstr= komodo_issuemethod(KMDUSERPASS,(char *)"getblockhash",params,7771)) != 0 )
+ if ( (jsonstr= komodo_issuemethod(KMDUSERPASS,(char *)"getblockhash",params,BITCOIND_PORT)) != 0 )
{
if ( (result= cJSON_Parse(jsonstr)) != 0 )
{
return(hash);
}
-uint256 _komodo_getblockhash(int32_t height);
+uint256 _komodo_getblockhash(int32_t height);*/
uint64_t komodo_seed(int32_t height)
{
uint64_t seed = 0;
- if ( 0 ) // problem during init time, seeds are needed for loading blockindex, so null seeds...
+ /*if ( 0 ) // problem during init time, seeds are needed for loading blockindex, so null seeds...
{
uint256 hash,zero; CBlockIndex *pindex;
memset(&hash,0,sizeof(hash));
printf(" seed.%d\n",height);
seed = arith_uint256(hash.GetHex()).GetLow64();
}
- else
+ else*/
{
seed = (height << 13) ^ (height << 2);
seed <<= 21;
void komodo_disconnect(CBlockIndex *pindex,CBlock& block)
{
- char symbol[16],dest[16]; struct komodo_state *sp;
+ char symbol[KOMODO_ASSETCHAIN_MAXLEN],dest[KOMODO_ASSETCHAIN_MAXLEN]; struct komodo_state *sp;
+ //fprintf(stderr,"disconnect ht.%d\n",pindex->nHeight);
komodo_init(pindex->nHeight);
if ( (sp= komodo_stateptr(symbol,dest)) != 0 )
{
} else printf("komodo_disconnect: ht.%d cant get komodo_state.(%s)\n",pindex->nHeight,ASSETCHAINS_SYMBOL);
}
+
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
- ptr = (uint8_t *)tx.vout[0].scriptPubKey.data();
+ ptr = (uint8_t *)tx.vout[0].scriptPubKey.data();
#else
- ptr = (uint8_t *)&tx.vout[0].scriptPubKey[0];
+ 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);
+ if ( ptr != 0 )
+ {
+ if ( crypto777[0] == 0 )
+ decode_hex(crypto777,33,(char *)CRYPTO777_PUBSECPSTR);
+ if ( memcmp(ptr+1,crypto777,33) == 0 )
+ {
+ //printf("found notarytx\n");
+ return(1);
+ }
+ }
}
- else return(0);
+ return(0);
}
int32_t komodo_block2height(CBlock *block)
{
- int32_t i,n,height = 0; uint8_t *ptr;
+ static uint32_t match,mismatch;
+ int32_t i,n,height2=-1,height = 0; uint8_t *ptr; CBlockIndex *pindex;
+ if ( (pindex= mapBlockIndex[block->GetHash()]) != 0 )
+ {
+ height2 = (int32_t)pindex->nHeight;
+ if ( height2 >= 0 )
+ return(height2);
+ }
+ if ( block->vtx[0].vin.size() > 0 )
+ {
#ifdef KOMODO_ZCASH
- ptr = (uint8_t *)block->vtx[0].vin[0].scriptSig.data();
+ ptr = (uint8_t *)block->vtx[0].vin[0].scriptSig.data();
#else
- ptr = (uint8_t *)&block->vtx[0].vin[0].scriptSig[0];
+ ptr = (uint8_t *)&block->vtx[0].vin[0].scriptSig[0];
#endif
- if ( block->vtx[0].vin[0].scriptSig.size() > 5 )
- {
- //for (i=0; i<6; i++)
- // printf("%02x",ptr[i]);
- n = ptr[0];
- for (i=0; i<n; i++)
+ if ( ptr != 0 && block->vtx[0].vin[0].scriptSig.size() > 5 )
{
- //03bb81000101(bb 187) (81 48001) (00 12288256) <- coinbase.6 ht.12288256
- height += ((uint32_t)ptr[i+1] << (i*8));
- //printf("(%02x %x %d) ",ptr[i+1],((uint32_t)ptr[i+1] << (i*8)),height);
+ //for (i=0; i<6; i++)
+ // printf("%02x",ptr[i]);
+ n = ptr[0];
+ for (i=0; i<n; i++) // looks strange but this works
+ {
+ //03bb81000101(bb 187) (81 48001) (00 12288256) <- coinbase.6 ht.12288256
+ height += ((uint32_t)ptr[i+1] << (i*8));
+ //printf("(%02x %x %d) ",ptr[i+1],((uint32_t)ptr[i+1] << (i*8)),height);
+ }
+ //printf(" <- coinbase.%d ht.%d\n",(int32_t)block->vtx[0].vin[0].scriptSig.size(),height);
}
- //printf(" <- coinbase.%d ht.%d\n",(int32_t)block->vtx[0].vin[0].scriptSig.size(),height);
+ //komodo_init(height);
}
- //komodo_init(height);
+ if ( height != height2 )
+ {
+ fprintf(stderr,"block2height height.%d vs height2.%d, match.%d mismatch.%d\n",height,height2,match,mismatch);
+ mismatch++;
+ if ( height2 >= 0 )
+ height = height2;
+ } else match++;
return(height);
}
void komodo_block2pubkey33(uint8_t *pubkey33,CBlock& block)
{
int32_t n;
+ memset(pubkey33,0,33);
+ if ( block.vtx[0].vout.size() > 0 )
+ {
#ifdef KOMODO_ZCASH
- uint8_t *ptr = (uint8_t *)block.vtx[0].vout[0].scriptPubKey.data();
+ uint8_t *ptr = (uint8_t *)block.vtx[0].vout[0].scriptPubKey.data();
#else
- uint8_t *ptr = (uint8_t *)&block.vtx[0].vout[0].scriptPubKey[0];
+ uint8_t *ptr = (uint8_t *)&block.vtx[0].vout[0].scriptPubKey[0];
#endif
- //komodo_init(0);
- n = block.vtx[0].vout[0].scriptPubKey.size();
- if ( n == 35 )
- memcpy(pubkey33,ptr+1,33);
- else memset(pubkey33,0,33);
+ //komodo_init(0);
+ n = block.vtx[0].vout[0].scriptPubKey.size();
+ if ( n == 35 )
+ memcpy(pubkey33,ptr+1,33);
+ }
}
int32_t komodo_blockload(CBlock& block,CBlockIndex *pindex)
return(0);
}
+uint32_t komodo_chainactive_timestamp()
+{
+ if ( chainActive.Tip() != 0 )
+ return((uint32_t)chainActive.Tip()->GetBlockTime());
+ else return(0);
+}
+
+CBlockIndex *komodo_chainactive(int32_t height)
+{
+ if ( chainActive.Tip() != 0 )
+ {
+ if ( height <= chainActive.Tip()->nHeight )
+ return(chainActive[height]);
+ // else fprintf(stderr,"komodo_chainactive height %d > active.%d\n",height,chainActive.Tip()->nHeight);
+ }
+ //fprintf(stderr,"komodo_chainactive null chainActive.Tip() height %d\n",height);
+ return(0);
+}
+
+uint32_t komodo_heightstamp(int32_t height)
+{
+ CBlockIndex *ptr;
+ if ( height > 0 && (ptr= komodo_chainactive(height)) != 0 )
+ return(ptr->nTime);
+ //else fprintf(stderr,"komodo_heightstamp null ptr for block.%d\n",height);
+ return(0);
+}
+
void komodo_index2pubkey33(uint8_t *pubkey33,CBlockIndex *pindex,int32_t height)
{
- CBlock block;
+ CBlock block; int32_t num,i; uint8_t pubkeys[64][33];
//komodo_init(height);
memset(pubkey33,0,33);
if ( pindex != 0 )
{
+ if ( pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3 )
+ {
+ memcpy(pubkey33,pindex->pubkey33,33);
+ return;
+ }
if ( komodo_blockload(block,pindex) == 0 )
+ {
komodo_block2pubkey33(pubkey33,block);
+ if ( (pubkey33[0] == 2 || pubkey33[0] == 3) )
+ {
+ memcpy(pindex->pubkey33,pubkey33,33);
+ if ( (num= komodo_notaries(pubkeys,(int32_t)pindex->nHeight,(uint32_t)pindex->nTime)) > 0 )
+ {
+ pindex->notaryid = -1;
+ for (i=0; i<num; i++)
+ {
+ if ( memcmp(pubkeys[i],pubkey33,33) == 0 )
+ {
+ pindex->notaryid = i;
+ break;
+ }
+ }
+ }
+ } else pindex->notaryid = -1;
+ }
}
else
{
}
}
-void komodo_connectpindex(CBlockIndex *pindex)
+/*void komodo_connectpindex(CBlockIndex *pindex)
{
CBlock block;
if ( komodo_blockload(block,pindex) == 0 )
komodo_connectblock(pindex,block);
-}
+}*/
-CBlockIndex *komodo_chainactive(int32_t height)
-{
- return(chainActive[height]);
-}
-
-int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height);
-int32_t komodo_electednotary(uint8_t *pubkey33,int32_t height);
int8_t komodo_minerid(int32_t height,uint8_t *pubkey33)
{
- int32_t num,i; CBlockIndex *pindex; uint8_t _pubkey33[33],pubkeys[64][33];
- if ( pubkey33 == 0 && (pindex= chainActive[height]) != 0 )
+ int32_t num,i,numnotaries; CBlockIndex *pindex; uint32_t timestamp=0; uint8_t _pubkey33[33],pubkeys[64][33];
+ if ( (pindex= chainActive[height]) != 0 )
{
- if ( pubkey33 == 0 )
+ if ( (pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3) )
{
- pubkey33 = _pubkey33;
- komodo_index2pubkey33(pubkey33,pindex,height);
+ if ( pubkey33 != 0 )
+ memcpy(pubkey33,pindex->pubkey33,33);
+ return(pindex->notaryid);
}
- if ( (num= komodo_notaries(pubkeys,height)) > 0 )
+ if ( pubkey33 != 0 )
+ komodo_index2pubkey33(pubkey33,pindex,height);
+ timestamp = pindex->GetBlockTime();
+ if ( (num= komodo_notaries(pubkeys,height,timestamp)) > 0 )
{
for (i=0; i<num; i++)
if ( memcmp(pubkeys[i],pubkey33,33) == 0 )
return(i);
}
}
- return(komodo_electednotary(pubkey33,height));
+ 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)
{
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->notaryid >= 0 && (pindex->pubkey33[0] == 2 || pindex->pubkey33[0] == 3) )
{
- //mids[i] = *(int32_t *)pubkey33;
+ memcpy(pubkeys[i],pindex->pubkey33,33);
+ mids[i] = pindex->notaryid;
(*nonzpkeysp)++;
}
+ else
+ {
+ komodo_index2pubkey33(pubkey33,pindex,height-i);
+ memcpy(pubkeys[i],pubkey33,33);
+ if ( (mids[i]= komodo_minerid(height-i,pubkey33)) >= 0 )
+ {
+ //mids[i] = *(int32_t *)pubkey33;
+ (*nonzpkeysp)++;
+ }
+ }
if ( mids[0] >= 0 && i > 0 && mids[i] == mids[0] )
duplicate++;
}
}
- if ( i == 66 && duplicate == 0 && *nonzpkeysp > 0 )
+ if ( i == 66 && duplicate == 0 && (height > 186233 || *nonzpkeysp > 0) )
return(1);
else return(0);
}
-int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width)
+int32_t komodo_minerids(uint8_t *minerids,int32_t height,int32_t width) // deprecate
{
- int32_t i,n=0;
+ /*int32_t i,n=0;
for (i=0; i<width; i++,n++)
{
if ( height-i <= 0 )
break;
minerids[i] = komodo_minerid(height - i,0);
}
- return(n);
+ return(n);*/
+ return(-1);
}
-int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33])
+int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp)
{
- int32_t i,notaryid,minerid,limit; uint8_t _pubkey33[33];
+ int32_t i,notaryid=0,minerid,limit,nid; //uint8_t _pubkey33[33];
+ if ( height >= 225000 )
+ komodo_chosennotary(¬aryid,height,pubkey33,timestamp);
if ( height >= 34000 && notaryid >= 0 )
{
if ( height < 79693 )
else limit = 66;
for (i=1; i<limit; i++)
{
- komodo_chosennotary(¬aryid,height-i,_pubkey33);
- if ( komodo_minerid(height-i,_pubkey33) == notaryid )
+ komodo_chosennotary(&nid,height-i,pubkey33,timestamp);
+ if ( nid == notaryid )
{
- //fprintf(stderr,"ht.%d notaryid.%d already mined -i.%d\n",height,notaryid,i);
- return(-1);
+ if ( (0) && notaryid > 0 )
+ fprintf(stderr,"ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid);
+ if ( height > 225000 )
+ return(-1);
}
}
//fprintf(stderr,"special notaryid.%d ht.%d limit.%d\n",notaryid,height,limit);
return(0);
}
+int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,int32_t nHeight)
+{
+ int32_t depth,notarized_ht; uint256 MoM,kmdtxid;
+ depth = komodo_MoMdata(¬arized_ht,&MoM,&kmdtxid,nHeight);
+ memset(MoMp,0,sizeof(*MoMp));
+ memset(kmdtxidp,0,sizeof(*kmdtxidp));
+ *notarized_heightp = 0;
+ if ( depth > 0 && notarized_ht > 0 && nHeight > notarized_ht-depth && nHeight <= notarized_ht )
+ {
+ *MoMp = MoM;
+ *notarized_heightp = notarized_ht;
+ *kmdtxidp = kmdtxid;
+ }
+ return(depth);
+}
+
int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 hash)
{
- int32_t notarized_height; uint256 notarized_hash,notarized_desttxid; CBlockIndex *notary; CBlockIndex *pindex;
+ int32_t notarized_height,MoMdepth; uint256 MoM,notarized_hash,notarized_desttxid; CBlockIndex *notary,*pindex;
if ( (pindex= chainActive.Tip()) == 0 )
return(-1);
notarized_height = komodo_notarizeddata(pindex->nHeight,¬arized_hash,¬arized_desttxid);
{
if ( nHeight < notarized_height )
{
- fprintf(stderr,"nHeight.%d < NOTARIZED_HEIGHT.%d\n",nHeight,notarized_height);
+ //fprintf(stderr,"[%s] nHeight.%d < NOTARIZED_HEIGHT.%d\n",ASSETCHAINS_SYMBOL,nHeight,notarized_height);
return(-1);
}
else if ( nHeight == notarized_height && memcmp(&hash,¬arized_hash,sizeof(hash)) != 0 )
{
- fprintf(stderr,"nHeight.%d == NOTARIZED_HEIGHT.%d, diff hash\n",nHeight,notarized_height);
+ fprintf(stderr,"[%s] nHeight.%d == NOTARIZED_HEIGHT.%d, diff hash\n",ASSETCHAINS_SYMBOL,nHeight,notarized_height);
return(-1);
}
- } else fprintf(stderr,"unexpected error notary_hash %s ht.%d at ht.%d\n",notarized_hash.ToString().c_str(),notarized_height,notary->nHeight);
- } else if ( notarized_height > 0 && notarized_height != 73880 && notarized_height >= 170000 )
+ } else fprintf(stderr,"[%s] unexpected error notary_hash %s ht.%d at ht.%d\n",ASSETCHAINS_SYMBOL,notarized_hash.ToString().c_str(),notarized_height,notary->nHeight);
+ }
+ else if ( notarized_height > 0 && notarized_height != 73880 && notarized_height >= 170000 )
fprintf(stderr,"[%s] couldnt find notarized.(%s %d) ht.%d\n",ASSETCHAINS_SYMBOL,notarized_hash.ToString().c_str(),notarized_height,pindex->nHeight);
return(0);
}
-uint32_t komodo_interest_args(int32_t *txheightp,uint32_t *tiptimep,uint64_t *valuep,uint256 hash,int32_t n)
+uint32_t komodo_interest_args(uint32_t *txheighttimep,int32_t *txheightp,uint32_t *tiptimep,uint64_t *valuep,uint256 hash,int32_t n)
{
LOCK(cs_main);
CTransaction tx; uint256 hashBlock; CBlockIndex *pindex,*tipindex;
+ *txheighttimep = *txheightp = *tiptimep = 0;
+ *valuep = 0;
if ( !GetTransaction(hash,tx,hashBlock,true) )
return(0);
uint32_t locktime = 0;
if ( n < tx.vout.size() )
{
- if ( (pindex= mapBlockIndex[hashBlock]) != 0 && (tipindex= chainActive.Tip()) != 0 )
+ if ( (pindex= mapBlockIndex[hashBlock]) != 0 )
{
*valuep = tx.vout[n].nValue;
*txheightp = pindex->nHeight;
- *tiptimep = tipindex->nTime;
+ *txheighttimep = pindex->nTime;
+ if ( *tiptimep == 0 && (tipindex= chainActive.Tip()) != 0 )
+ *tiptimep = (uint32_t)tipindex->nTime;
locktime = tx.nLockTime;
//fprintf(stderr,"tx locktime.%u %.8f height.%d | tiptime.%u\n",locktime,(double)*valuep/COIN,*txheightp,*tiptimep);
}
}
uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime);
-uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue)
+
+uint64_t komodo_accrued_interest(int32_t *txheightp,uint32_t *locktimep,uint256 hash,int32_t n,int32_t checkheight,uint64_t checkvalue,int32_t tipheight)
{
- uint64_t value; uint32_t tiptime;
- if ( (*locktimep= komodo_interest_args(txheightp,&tiptime,&value,hash,n)) != 0 )
+ uint64_t value; uint32_t tiptime=0,txheighttimep; CBlockIndex *pindex;
+ if ( (pindex= chainActive[tipheight]) != 0 )
+ tiptime = (uint32_t)pindex->nTime;
+ else fprintf(stderr,"cant find height[%d]\n",tipheight);
+ if ( (*locktimep= komodo_interest_args(&txheighttimep,txheightp,&tiptime,&value,hash,n)) != 0 )
{
if ( (checkvalue == 0 || value == checkvalue) && (checkheight == 0 || *txheightp == checkheight) )
return(komodo_interest(*txheightp,value,*locktimep,tiptime));
if ( (sp= komodo_stateptrget((char *)"KMD")) != 0 )
*kmdheightp = sp->CURRENT_HEIGHT;
else *kmdheightp = 0;
- if ( (pindex= chainActive.Tip()) != 0 && pindex->nHeight == (int32_t)komodo_longestchain() )
+ if ( (pindex= chainActive.Tip()) != 0 && pindex->nHeight >= (int32_t)komodo_longestchain() )
return(1);
else return(0);
}
+
+int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_t nTime,int32_t dispflag)
+{
+ uint32_t cmptime = nTime;
+ if ( KOMODO_REWIND == 0 && ASSETCHAINS_SYMBOL[0] == 0 && (int64_t)tx.nLockTime >= LOCKTIME_THRESHOLD ) //1473793441 )
+ {
+ if ( txheight > 246748 )
+ {
+ if ( txheight < 247205 )
+ cmptime -= 16000;
+ if ( (int64_t)tx.nLockTime < cmptime-3600 )
+ {
+ if ( tx.nLockTime != 1477258935 || dispflag != 0 )
+ {
+ fprintf(stderr,"komodo_validate_interest.%d reject.%d [%d] locktime %u cmp2.%u\n",dispflag,txheight,(int32_t)(tx.nLockTime - (cmptime-3600)),(uint32_t)tx.nLockTime,cmptime);
+ }
+ return(-1);
+ }
+ if ( 0 && dispflag != 0 )
+ fprintf(stderr,"validateinterest.%d accept.%d [%d] locktime %u cmp2.%u\n",dispflag,(int32_t)txheight,(int32_t)(tx.nLockTime - (cmptime-3600)),(int32_t)tx.nLockTime,cmptime);
+ }
+ }
+ return(0);
+}