Browse Source

test

release/v0.1
jl777 8 years ago
parent
commit
4010a857a3
  1. 2
      basilisk/basilisk_bitcoin.c
  2. 2
      gecko/gecko_miner.c
  3. 26
      iguana/iguana_interpreter.c
  4. 15
      iguana/iguana_payments.c
  5. 18
      iguana/iguana_sign.c
  6. 4
      iguana/iguana_volatiles.c
  7. 2
      iguana/main.c
  8. 1
      includes/iguana_defines.h
  9. 1
      includes/iguana_funcs.h

2
basilisk/basilisk_bitcoin.c

@ -456,7 +456,7 @@ void *basilisk_bitcoinrawtx(struct basilisk_item *Lptr,struct supernet_info *myi
txfee = 10000;
spendscriptstr = jstr(valsobj,"spendscript");
minconf = juint(valsobj,"minconf");
locktime = juint(valsobj,"locktime");
locktime = jint(valsobj,"locktime");
if ( (addresses= jobj(valsobj,"addresses")) == 0 )
{
addresses = iguana_getaddressesbyaccount(myinfo,coin,"*");

2
gecko/gecko_miner.c

@ -298,7 +298,7 @@ char *gecko_createblock(struct supernet_info *myinfo,int32_t estblocktime,uint32
cJSON *gecko_paymentsobj(struct supernet_info *myinfo,cJSON *txjson,cJSON *valsobj,int32_t reusedaddrs)
{
cJSON *item,*array; char *coinaddr; uint64_t satoshis; uint8_t addrtype,pubkey33[33],rmd160[20],outputscript[512]; int32_t i,n,scriptlen; uint32_t locktime,txversion; struct iguana_waddress *waddr; struct iguana_waccount *wacct;
locktime = juint(valsobj,"locktime");
locktime = jint(valsobj,"locktime");
if ( (txversion= juint(valsobj,"txversion")) == 0 )
txversion = (locktime == 0) ? IGUANA_NORMAL_TXVERSION : IGUANA_LOCKTIME_TXVERSION;
if ( txjson == 0 )

26
iguana/iguana_interpreter.c

@ -484,10 +484,12 @@ static int32_t iguana_isnonz(struct iguana_stackdata Snum)
return(0);
}
static int32_t iguana_num(struct iguana_stackdata Snum)
static int64_t iguana_num(struct iguana_stackdata Snum)
{
if ( Snum.size == sizeof(int32_t) )
return(Snum.U.val);
else if ( Snum.size == sizeof(int64_t) )
return(Snum.U.val64);
else return(0);
}
@ -751,7 +753,7 @@ int32_t iguana_checkprivatekey(struct iguana_info *coin,struct iguana_stackdata
return(0);
}
int32_t iguana_checkschnorrsig(struct iguana_info *coin,int32_t M,struct iguana_stackdata pubkeyarg,struct iguana_stackdata sigarg,bits256 sigtxid)
int32_t iguana_checkschnorrsig(struct iguana_info *coin,int64_t M,struct iguana_stackdata pubkeyarg,struct iguana_stackdata sigarg,bits256 sigtxid)
{
uint8_t combined_pub[MAX_SCRIPT_ELEMENT_SIZE],sig[MAX_SCRIPT_ELEMENT_SIZE]; int32_t plen,siglen;
plen = iguana_databuf(combined_pub,pubkeyarg);
@ -811,10 +813,16 @@ int32_t iguana_checkmultisig(struct iguana_info *coin,struct iguana_interpreter
return(0);
}
int32_t iguana_checklocktimeverify(struct iguana_info *coin,int64_t nLockTime,uint32_t nSequence,struct iguana_stackdata Snum)
#define LOCKTIME_THRESHOLD 500000000
int32_t iguana_checklocktimeverify(struct iguana_info *coin,int64_t tx_lockval,uint32_t nSequence,struct iguana_stackdata Snum)
{
int64_t num = iguana_num(Snum);
if ( num < 0 || (num >= 500000000 && nLockTime < 500000000) || (num < 500000000 && nLockTime >= 500000000) || nSequence == 0xffffffff || num > nLockTime )
int64_t nLockTime = iguana_num(Snum);
if ( nLockTime < 0 )
return(-1);
else if ( ((tx_lockval < LOCKTIME_THRESHOLD && nLockTime < LOCKTIME_THRESHOLD) ||
(tx_lockval >= LOCKTIME_THRESHOLD && nLockTime >= LOCKTIME_THRESHOLD)) == 0 )
return(-1);
else if ( nLockTime > tx_lockval )
return(-1);
return(0);
}
@ -940,7 +948,7 @@ int32_t bitcoin_assembler(struct iguana_info *coin,cJSON *logarray,uint8_t scrip
struct bitcoin_opcode *op; cJSON *array = 0; struct iguana_interpreter STACKS,*stacks = &STACKS;
struct iguana_stackdata args[MAX_PUBKEYS_PER_MULTISIG];
uint8_t databuf[MAX_SCRIPT_ELEMENT_SIZE]; char *asmstr,*str,*hexstr; cJSON *item;
int32_t c,numops,dlen,plen,numvars,numused,numargs=0,i,j,k,n,len,val,datalen,errs=0;
int32_t c,numops,dlen,plen,numvars,numused,numargs=0,i,j,k,n,len,datalen,errs=0; int64_t val;
iguana_optableinit(coin);
if ( (asmstr= jstr(interpreter,"interpreter")) == 0 )
return(-1);
@ -1345,7 +1353,7 @@ int32_t bitcoin_assembler(struct iguana_info *coin,cJSON *logarray,uint8_t scrip
{
if ( interpret != 0 && stacks->stackdepth < (val= iguana_num(args[0])) )
{
printf("stack not deep enough %d < %d\n",stacks->stackdepth,iguana_num(args[0]));
printf("stack not deep enough %d < %lld\n",stacks->stackdepth,(long long)iguana_num(args[0]));
errs++;
break;
}
@ -1357,7 +1365,7 @@ int32_t bitcoin_assembler(struct iguana_info *coin,cJSON *logarray,uint8_t scrip
else
{
args[1] = stacks->stack[stacks->stackdepth - 1 - val];
for (i=stacks->stackdepth-1-val; i<stacks->stackdepth-1; i++)
for (i=(int32_t)(stacks->stackdepth-1-val); i<stacks->stackdepth-1; i++)
stacks->stack[i] = stacks->stack[i+1];
stacks->stack[stacks->stackdepth - 1] = args[1];
}
@ -1408,7 +1416,7 @@ int32_t bitcoin_assembler(struct iguana_info *coin,cJSON *logarray,uint8_t scrip
}
else if ( (op->flags & IGUANA_MATHFLAG) != 0 )
{
int32_t numA,numB,numC;
int64_t numA,numB,numC;
for (i=0; i<op->stackitems; i++)
{
if ( args[i].size != sizeof(int32_t) )

15
iguana/iguana_payments.c

@ -841,9 +841,17 @@ HASH_AND_INT(bitcoinrpc,getrawtransaction,txid,verbose)
return(clonestr("{\"error\":\"cant find txid\"}"));
}
int64_t iguana_lockval(int32_t finalized,int64_t locktime)
{
int64_t lockval = -1;
if ( finalized == 0 )
return(locktime);
return(lockval);
}
char *iguana_validaterawtx(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_msgtx *msgtx,uint8_t *extraspace,int32_t extralen,char *rawtx,int32_t mempool)
{
bits256 signedtxid,txid; struct iguana_msgvin vin; cJSON *log,*vins,*vouts,*txobj,*retjson; char *checkstr,*signedtx; int32_t i,len,maxsize,numinputs,numoutputs,complete; struct vin_info *V; uint8_t *serialized,*serialized2; uint32_t sigsize,pubkeysize,p2shsize,suffixlen; int64_t inputsum,outputsum;
bits256 signedtxid,txid; struct iguana_msgvin vin; cJSON *log,*vins,*vouts,*txobj,*retjson; char *checkstr,*signedtx; int32_t finalized = 1,i,len,maxsize,numinputs,numoutputs,complete; struct vin_info *V; uint8_t *serialized,*serialized2; uint32_t sigsize,pubkeysize,p2shsize,suffixlen; int64_t inputsum,outputsum,lockval;
retjson = cJSON_CreateObject();
inputsum = outputsum = numinputs = numoutputs = 0;
if ( rawtx != 0 && rawtx[0] != 0 && coin != 0 )
@ -901,6 +909,8 @@ char *iguana_validaterawtx(struct supernet_info *myinfo,struct iguana_info *coin
V[i].suffixlen = suffixlen;
memcpy(V[i].spendscript,msgtx->vins[i].spendscript,msgtx->vins[i].spendlen);
V[i].spendlen = msgtx->vins[i].spendlen;
if ( msgtx->vins[i].sequence < IGUANA_SEQUENCEID_FINAL )
finalized = 0;
//printf("V %.8f (%s) spendscript.[%d] scriptlen.%d\n",dstr(V[i].amount),V[i].coinaddr,V[i].spendlen,V[i].spendlen);
}
}
@ -908,7 +918,8 @@ char *iguana_validaterawtx(struct supernet_info *myinfo,struct iguana_info *coin
{
msgtx->txid = signedtxid;
log = cJSON_CreateArray();
if ( iguana_interpreter(coin,log,j64bits(txobj,"locktime"),V,numinputs) < 0 )
lockval = iguana_lockval(finalized,jint(txobj,"locktime"));
if ( iguana_interpreter(coin,log,lockval,V,numinputs) < 0 )
{
jaddstr(retjson,"error","interpreter rejects tx");
}

18
iguana/iguana_sign.c

@ -463,7 +463,7 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t rwflag,cJSON *json,uint8
*txidp = bits256_doublesha256(txidstr,txstart,len);
if ( json != 0 )
{
jadd64bits(json,"locktime",msg->lock_time);
jaddnum(json,"locktime",msg->lock_time);
jaddnum(json,"size",len);
jaddbits256(json,"txid",*txidp);
//printf("TX.(%s) %p\n",jprint(json,0),json);
@ -513,7 +513,7 @@ bits256 iguana_parsetxobj(struct supernet_info *myinfo,struct iguana_info *coin,
len += iguana_parsevoutobj(coin,&serialized[len],maxsize,&msg->vouts[i],jitem(array,i));
}
}
msg->lock_time = (int32_t)j64bits(txobj,"locktime");
msg->lock_time = jint(txobj,"locktime");
msg->txid = jbits256(txobj,"txid");
*txstartp = len;
if ( (msg->allocsize= iguana_rwmsgtx(coin,1,0,&serialized[len],maxsize-len,msg,&txid,vpnstr,0,0,0)) < 0 )
@ -724,7 +724,7 @@ int32_t bitcoin_verifyvins(struct iguana_info *coin,bits256 *signedtxidp,char **
int32_t iguana_vininfo_create(struct supernet_info *myinfo,struct iguana_info *coin,uint8_t *serialized,int32_t maxsize,struct iguana_msgtx *msgtx,cJSON *vins,int32_t numinputs,struct vin_info *V)
{
int32_t i,plen,len = 0; struct vin_info *vp; struct iguana_waccount *wacct; struct iguana_waddress *waddr; uint32_t sigsize,pubkeysize,p2shsize,suffixlen;
int32_t i,plen,finalized = 1,len = 0; struct vin_info *vp; struct iguana_waccount *wacct; struct iguana_waddress *waddr; uint32_t sigsize,pubkeysize,p2shsize,suffixlen;
msgtx->tx_in = numinputs;
maxsize -= (sizeof(struct iguana_msgvin) * msgtx->tx_in);
msgtx->vins = (struct iguana_msgvin *)&serialized[maxsize];
@ -735,6 +735,8 @@ int32_t iguana_vininfo_create(struct supernet_info *myinfo,struct iguana_info *c
{
vp = &V[i];
len += iguana_parsevinobj(myinfo,coin,&serialized[len],maxsize,&msgtx->vins[i],jitem(vins,i),vp);
if ( msgtx->vins[i].sequence < IGUANA_SEQUENCEID_FINAL )
finalized = 0;
if ( msgtx->vins[i].spendscript == 0 )
{
if ( (vp->unspentind= iguana_unspentindfind(coin,vp->coinaddr,vp->spendscript,&vp->spendlen,&vp->amount,&vp->height,msgtx->vins[i].prev_hash,msgtx->vins[i].prev_vout,coin->bundlescount-1,0)) > 0 )
@ -776,7 +778,7 @@ int32_t iguana_vininfo_create(struct supernet_info *myinfo,struct iguana_info *c
printf(" pk_script[%d]\n",i);
}
}*/
return(len);
return(finalized);
}
void iguana_ensure_privkey(struct supernet_info *myinfo,struct iguana_info *coin,bits256 privkey)
@ -934,7 +936,7 @@ cJSON *bitcoin_txcreate(int32_t isPoS,int64_t locktime,uint32_t txversion)
{
cJSON *json = cJSON_CreateObject();
jaddnum(json,"version",txversion);
jadd64bits(json,"locktime",locktime);
jaddnum(json,"locktime",locktime);
if ( isPoS != 0 )
jaddnum(json,"timestamp",time(NULL));
jadd(json,"vin",cJSON_CreateArray());
@ -1061,7 +1063,7 @@ P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount
int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_msgtx *msgtx,char **signedtxp,bits256 *signedtxidp,struct vin_info *V,int32_t numinputs,char *rawtx,cJSON *vins,cJSON *privkeys)
{
uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace; int32_t i,len,n,maxsize,complete = 0,extralen = 65536; char *checkstr,*privkeystr,*signedtx = 0; bits256 privkey,txid; cJSON *item; cJSON *txobj = 0;
uint8_t *serialized,*serialized2,*serialized3,*serialized4,*extraspace; int32_t finalized,i,len,n,maxsize,complete = 0,extralen = 65536; char *checkstr,*privkeystr,*signedtx = 0; bits256 privkey,txid; cJSON *item; cJSON *txobj = 0;
maxsize = 1000000;
if ( rawtx != 0 && rawtx[0] != 0 && (len= (int32_t)strlen(rawtx)>>1) < maxsize )
{
@ -1106,10 +1108,10 @@ int32_t iguana_signrawtransaction(struct supernet_info *myinfo,struct iguana_inf
iguana_ensure_privkey(myinfo,coin,privkey);
}
}
iguana_vininfo_create(myinfo,coin,serialized2,maxsize,msgtx,vins,numinputs,V);
finalized = iguana_vininfo_create(myinfo,coin,serialized2,maxsize,msgtx,vins,numinputs,V);
if ( (complete= bitcoin_verifyvins(coin,signedtxidp,&signedtx,msgtx,serialized3,maxsize,V,SIGHASH_ALL,1)) > 0 && signedtx != 0 )
{
if ( iguana_interpreter(coin,0,j64bits(txobj,"locktime"),V,numinputs) < 0 )
if ( iguana_interpreter(coin,0,iguana_lockval(finalized,jint(txobj,"locktime")),V,numinputs) < 0 )
{
printf("iguana_interpreter error.(%s)\n",signedtx);
complete = 0;

4
iguana/iguana_volatiles.c

@ -221,6 +221,10 @@ int32_t iguana_volatileupdate(struct iguana_info *coin,int32_t incremental,struc
coin->spendvectorsaved = 0;
coin->started = 0;
coin->active = 0;
int32_t i; struct iguana_bundle *bp;
for (i=0; i<coin->bundlescount; i++)
if ( (bp= coin->bundles[i]) != 0 )
iguana_RTramchainfree(coin,bp);
} else printf("volatileupdate error null rdata [%d]\n",spentchain->height/coin->current->bundleheight);
return(-1);
}

2
iguana/main.c

@ -1155,7 +1155,7 @@ void iguana_appletests(struct supernet_info *myinfo)
bitcoin_sharedsecret(myinfo->ctx,hash2,pubkey,33);
printf("secp256k1 elapsed %.3f for %d iterations\n",OS_milliseconds() - startmillis,i);
getchar();**/
if ( 1 && (str= SuperNET_JSON(myinfo,cJSON_Parse("{\"protover\":70002,\"RELAY\":1,\"VALIDATE\":0,\"portp2p\":14631,\"rpc\":14632,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":64,\"endpend\":64,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCD\",\"active\":1,\"numhelpers\":1,\"poll\":1}"),0,myinfo->rpcport)) != 0 )
if ( 1 && (str= SuperNET_JSON(myinfo,cJSON_Parse("{\"protover\":70002,\"RELAY\":0,\"VALIDATE\":0,\"portp2p\":14631,\"rpc\":14632,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":64,\"endpend\":64,\"services\":129,\"maxpeers\":8,\"newcoin\":\"BTCD\",\"active\":1,\"numhelpers\":1,\"poll\":1}"),0,myinfo->rpcport)) != 0 )
{
free(str);
if ( 1 && (str= SuperNET_JSON(myinfo,cJSON_Parse("{\"portp2p\":8333,\"RELAY\":0,\"VALIDATE\":0,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":1,\"endpend\":1,\"services\":128,\"maxpeers\":8,\"newcoin\":\"BTC\",\"active\":0,\"numhelpers\":1,\"poll\":100}"),0,myinfo->rpcport)) != 0 )

1
includes/iguana_defines.h

@ -33,6 +33,7 @@
#define IGUANA_MAXCOINS 64
#define IGUANA_MAXDELAY_MILLIS (3600 * 1000 * 24)
#define IGUANA_DEFAULT_POLLTIMEOUT 10
#define IGUANA_SEQUENCEID_FINAL 0xfffffffe
#define IGUANA_EXCHANGEIDLE 10
#define IGUANS_JSMILLIS 100

1
includes/iguana_funcs.h

@ -532,6 +532,7 @@ void iguana_update_balances(struct iguana_info *coin);
void iguana_RTspendvectors(struct iguana_info *coin,struct iguana_bundle *bp);
double instantdex_avehbla(struct supernet_info *myinfo,double retvals[4],char *base,char *rel,double basevolume);
int32_t bitcoin_revealsecret160(uint8_t *script,int32_t n,uint8_t secret160[20]);
int64_t iguana_lockval(int32_t finalized,int64_t locktime);
#include "../includes/iguana_api.h"

Loading…
Cancel
Save