]> Git Repo - VerusCoin.git/blobdiff - src/komodo_bitcoind.h
Test
[VerusCoin.git] / src / komodo_bitcoind.h
index b082fe919698969693fd049d35051d1a5713874a..18ac579e3581397e95e37aa8f6ca15fe0e470c44 100644 (file)
@@ -25,6 +25,9 @@
 
 #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; };
@@ -554,10 +557,11 @@ uint64_t komodo_seed(int32_t height)
     return(seed);
 }
 
-uint32_t komodo_txtime(uint256 hash)
+uint32_t komodo_txtime(uint64_t *valuep,uint256 hash,int32_t n)
 {
     CTransaction tx;
     uint256 hashBlock;
+    *valuep = 0;
     if (!GetTransaction(hash, tx,
 #ifndef KOMODO_ZCASH
                         Params().GetConsensus(),
@@ -565,6 +569,8 @@ uint32_t komodo_txtime(uint256 hash)
                         hashBlock, true))
     {
         //printf("null GetTransaction\n");
+        if ( n < tx.vout.size() )
+            *valuep = tx.vout[n].nValue;
         return(tx.nLockTime);
     }
     return(0);
@@ -585,7 +591,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 +601,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");
@@ -608,7 +615,14 @@ int32_t komodo_is_notarytx(const CTransaction& tx)
 
 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
@@ -621,7 +635,7 @@ int32_t komodo_block2height(CBlock *block)
             //for (i=0; i<6; i++)
             //    printf("%02x",ptr[i]);
             n = ptr[0];
-            for (i=n-4-1; i<n; i++)
+            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));
@@ -631,6 +645,13 @@ int32_t komodo_block2height(CBlock *block)
         }
         //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);
 }
 
@@ -699,13 +720,36 @@ uint32_t komodo_heightstamp(int32_t height)
 
 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
     {
@@ -714,27 +758,28 @@ 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);
 
 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] == 2 || pindex->pubkey33[0] == 3) )
         {
-            pubkey33 = _pubkey33;
-            komodo_index2pubkey33(pubkey33,pindex,height);
+            if ( pubkey33 != 0 )
+                memcpy(pubkey33,pindex->pubkey33,33);
+            return(pindex->notaryid);
         }
+        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++)
@@ -753,14 +798,22 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non
     {
         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++;
         }
@@ -770,23 +823,24 @@ int32_t komodo_eligiblenotary(uint8_t pubkeys[66][33],int32_t *mids,int32_t *non
     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],uint32_t timestamp)
 {
-    int32_t i,notaryid=0,minerid,limit,nid; uint8_t _pubkey33[33];
+    int32_t i,notaryid=0,minerid,limit,nid; //uint8_t _pubkey33[33];
     if ( height >= 225000 )
-        komodo_chosennotary(&notaryid,height,_pubkey33,timestamp);
+        komodo_chosennotary(&notaryid,height,pubkey33,timestamp);
     if ( height >= 34000 && notaryid >= 0 )
     {
         if ( height < 79693 )
@@ -796,8 +850,8 @@ int32_t komodo_is_special(int32_t height,uint8_t pubkey33[33],uint32_t timestamp
         else limit = 66;
         for (i=1; i<limit; i++)
         {
-            komodo_chosennotary(&nid,height-i,_pubkey33,timestamp);
-            if ( nid == notaryid ) //komodo_minerid(height-i,_pubkey33)
+            komodo_chosennotary(&nid,height-i,pubkey33,timestamp);
+            if ( nid == notaryid )
             {
                 if ( (0) && notaryid > 0 )
                     fprintf(stderr,"ht.%d notaryid.%d already mined -i.%d nid.%d\n",height,notaryid,i,nid);
@@ -829,7 +883,7 @@ int32_t komodo_MoM(int32_t *notarized_heightp,uint256 *MoMp,uint256 *kmdtxidp,in
 
 int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 hash)
 {
-    int32_t notarized_height,MoMdepth; uint256 MoM,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,&notarized_hash,&notarized_desttxid);
@@ -851,8 +905,8 @@ int32_t komodo_checkpoint(int32_t *notarized_heightp,int32_t nHeight,uint256 has
             }
         } 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);
+    //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);
 }
 
@@ -867,12 +921,13 @@ uint32_t komodo_interest_args(uint32_t *txheighttimep,int32_t *txheightp,uint32_
     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;
             *txheighttimep = pindex->nTime;
-            *tiptimep = tipindex->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);
         }
@@ -881,9 +936,13 @@ uint32_t komodo_interest_args(uint32_t *txheighttimep,int32_t *txheightp,uint32_
 }
 
 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,txheighttimep;
+    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) )
@@ -928,3 +987,13 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_
     }
     return(0);
 }
+
+int32_t komodo_staked(uint256 *utxotxidp,int32_t *utxovoutp,uint64_t *utxovaluep,uint8_t *utxosig)
+{
+    memset(utxotxidp,0,sizeof(*utxotxidp));
+    memset(utxovoutp,0,sizeof(*utxovoutp));
+    memset(utxovaluep,0,sizeof(*utxovaluep));
+    memset(utxosig,0,72);
+    return(72);
+}
+
This page took 0.03146 seconds and 4 git commands to generate.