From d274f87b8d5bb8a4971aca8f566a962fae864d48 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 16 Oct 2016 09:04:10 -0300 Subject: [PATCH] test --- deprecated/obsolete.h | 102 ++++++++++++- iguana/btc_7776 | 3 +- iguana/dPoW.h | 34 +++-- iguana/dpow/dpow_fsm.c | 281 +++++++++++++++++++---------------- iguana/dpow/dpow_network.c | 54 ++++--- iguana/dpow/dpow_tx.c | 72 ++++----- iguana/iguana_notary.c | 8 +- iguana/kmd_7776 | 4 +- iguana/m_notary | 4 +- iguana/notaries.h | 1 + iguana/tests/addnotarys_7776 | 1 + 11 files changed, 360 insertions(+), 204 deletions(-) diff --git a/deprecated/obsolete.h b/deprecated/obsolete.h index 0a53db822..613af98ab 100755 --- a/deprecated/obsolete.h +++ b/deprecated/obsolete.h @@ -19423,7 +19423,107 @@ len = 0; printf("extracted uxto k.%d != bestk.%d %llx\n",k,bestk,(long long)bestmask); } }*/ - + void dpow_oldstatemachinestart(void *ptr) + { + struct supernet_info *myinfo; struct dpow_info *dp; struct dpow_checkpoint checkpoint; void **ptrs = ptr; + int32_t i,n,myind = -1; struct iguana_info *src,*dest; char str[65],coinaddr[64]; bits256 zero; struct dpow_block *srcbp,*destbp,*bp; uint32_t starttime = (uint32_t)time(NULL); + memset(&zero,0,sizeof(zero)); + myinfo = ptrs[0]; + dp = ptrs[1]; + dp->destupdated = 0; // prevent another state machine till next BTC block + memcpy(&checkpoint,&ptrs[2],sizeof(checkpoint)); + printf("statemachinestart %s->%s %s ht.%d\n",dp->symbol,dp->dest,bits256_str(str,checkpoint.blockhash.hash),checkpoint.blockhash.height); + src = iguana_coinfind(dp->symbol); + dest = iguana_coinfind(dp->dest); + if ( (destbp= dp->destblocks[checkpoint.blockhash.height]) == 0 ) + { + destbp = calloc(1,sizeof(*destbp)); + destbp->coin = iguana_coinfind(dp->dest); + destbp->opret_symbol = dp->symbol; + destbp->bestk = -1; + dp->destblocks[checkpoint.blockhash.height] = destbp; + destbp->beacon = rand256(0); + vcalc_sha256(0,destbp->commit.bytes,destbp->beacon.bytes,sizeof(destbp->beacon)); + if ( (bp= dp->destblocks[checkpoint.blockhash.height - 100]) != 0 ) + { + printf("purge %s.%d\n",dp->dest,checkpoint.blockhash.height - 100); + dp->destblocks[checkpoint.blockhash.height - 100] = 0; + free(bp); + } + } + if ( (srcbp= dp->srcblocks[checkpoint.blockhash.height]) == 0 ) + { + srcbp = calloc(1,sizeof(*srcbp)); + srcbp->coin = iguana_coinfind(dp->symbol); + srcbp->opret_symbol = dp->symbol; + srcbp->bestk = -1; + dp->srcblocks[checkpoint.blockhash.height] = srcbp; + srcbp->beacon = destbp->beacon; + srcbp->commit = destbp->commit; + printf("create srcbp[%d]\n",checkpoint.blockhash.height); + if ( (bp= dp->srcblocks[checkpoint.blockhash.height - 1000]) != 0 ) + { + printf("purge %s.%d\n",dp->symbol,checkpoint.blockhash.height - 1000); + dp->srcblocks[checkpoint.blockhash.height - 1000] = 0; + free(bp); + } + } + n = (int32_t)(sizeof(Notaries)/sizeof(*Notaries)); + srcbp->numnotaries = destbp->numnotaries = n; + for (i=0; inotaries[i].pubkey,33,Notaries[i][1]); + decode_hex(destbp->notaries[i].pubkey,33,Notaries[i][1]); + if ( memcmp(destbp->notaries[i].pubkey,myinfo->DPOW.minerkey33,33) == 0 ) + myind = i; + } + bitcoin_address(coinaddr,src->chain->pubtype,myinfo->DPOW.minerkey33,33); + printf(" myaddr.%s\n",coinaddr); + if ( myind < 0 ) + { + printf("statemachinestart this node %s is not official notary\n",coinaddr); + free(ptr); + return; + } + dp->checkpoint = checkpoint; + srcbp->height = destbp->height = checkpoint.blockhash.height; + srcbp->timestamp = destbp->timestamp = checkpoint.timestamp; + srcbp->hashmsg = destbp->hashmsg = checkpoint.blockhash.hash; + printf("DPOW statemachine checkpoint.%d %s\n",checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash)); + while ( time(NULL) < starttime+300 && src != 0 && dest != 0 && (srcbp->state != 0xffffffff || destbp->state != 0xffffffff) ) + { + sleep(1); + if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) + { + printf("abort ht.%d due to new checkpoint.%d\n",checkpoint.blockhash.height,dp->checkpoint.blockhash.height); + break; + } + if ( destbp->state != 0xffffffff ) + { + //printf("dp->ht.%d ht.%d DEST.%08x %s\n",dp->checkpoint.blockhash.height,checkpoint.blockhash.height,deststate,bits256_str(str,srchash.hash)); + destbp->state = dpow_statemachineiterate(myinfo,dp,dest,destbp,myind,1); + if ( destbp->state == 0xffffffff ) + { + srcbp->btctxid = destbp->signedtxid; + printf("SET BTCTXID.(%s)\n",bits256_str(str,srcbp->btctxid)); + } + } + if ( destbp->state == 0xffffffff && bits256_nonz(srcbp->btctxid) != 0 ) + { + if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) + { + printf("abort ht.%d due to new checkpoint.%d\n",checkpoint.blockhash.height,dp->checkpoint.blockhash.height); + break; + } + if ( srcbp->state != 0xffffffff ) + { + //printf("dp->ht.%d ht.%d SRC.%08x %s\n",dp->checkpoint.blockhash.height,checkpoint.blockhash.height,srcbp->state,bits256_str(str,srcbp->btctxid)); + srcbp->state = dpow_statemachineiterate(myinfo,dp,src,srcbp,myind,0); + } + } + } + free(ptr); + } uint64_t dpow_maskmin(uint64_t refmask,struct dpow_block *bp,int32_t *lastkp) { int32_t j,m,k; uint64_t mask = 0; diff --git a/iguana/btc_7776 b/iguana/btc_7776 index 573181578..e1e642539 100755 --- a/iguana/btc_7776 +++ b/iguana/btc_7776 @@ -1,2 +1 @@ -userhome=`cat userhome.txt` -curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"bitcoin.conf\",\"path\":\"$userhome/.bitcoin\",\"prefetchlag\":-1,\"poll\":1,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTC\",\"startpend\":64,\"endpend\":64,\"services\":0,\"maxpeers\":512,\"RELAY\":-1,\"VALIDATE\":0,\"portp2p\":8333,\"minconfirms\":1}" +curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"bitcoin.conf\",\"path\":\"${HOME#"/"}/.bitcoin\",\"prefetchlag\":-1,\"poll\":1,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"newcoin\":\"BTC\",\"startpend\":64,\"endpend\":64,\"services\":0,\"maxpeers\":512,\"RELAY\":-1,\"VALIDATE\":0,\"portp2p\":8333,\"minconfirms\":1}" diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 32e0bd31a..751e86ac1 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -16,8 +16,8 @@ #ifndef INCLUDE_DPOW_H #define INCLUDE_DPOW_H -#define DPOW_M(bp) (5) // (((bp)->numnotaries >> 1) + 1) -#define DPOW_VERSION 0x0103 +#define DPOW_M(bp) (2) // (((bp)->numnotaries >> 1) + 1) +#define DPOW_VERSION 0x0204 #define DPOW_UTXOSIZE 10000 #define DPOW_FIFOSIZE 64 @@ -28,13 +28,29 @@ #define DPOW_MAXRELAYS 64 #define DPOW_CHECKPOINTFREQ 5 +struct dpow_coinentry +{ + bits256 prev_hash; + uint8_t siglens[DPOW_MAXRELAYS],sigs[DPOW_MAXRELAYS][76]; + int32_t prev_vout; +}; + +struct dpow_utxoentry +{ + bits256 srchash,desthash,commit,hashmsg; + uint64_t recvmask,othermasks[DPOW_MAXRELAYS]; + int32_t srcvout,destvout,height; + int8_t bestk; uint8_t pubkey[33]; +}; + struct dpow_entry { - bits256 prev_hash,commit,beacon; - uint64_t masks[DPOW_MAXRELAYS],recvmask; - int32_t prev_vout,height; + bits256 commit,beacon; + uint64_t masks[DPOW_MAXRELAYS],recvmask,othermask; + int32_t height; int8_t bestk; - uint8_t pubkey[33],siglens[DPOW_MAXRELAYS],sigs[DPOW_MAXRELAYS][76]; + uint8_t pubkey[33]; + struct dpow_coinentry src,dest; }; struct dpow_sigentry @@ -57,8 +73,8 @@ struct dpow_checkpoint { struct dpow_hashheight blockhash,approved; bits256 mine struct dpow_block { - bits256 hashmsg,btctxid,signedtxid,beacon,commit; - struct iguana_info *coin; char *opret_symbol; + bits256 hashmsg,desttxid,srctxid,signedtxid,beacon,commit; + struct iguana_info *srccoin,*destcoin; char *opret_symbol; uint64_t recvmask,bestmask; struct dpow_entry notaries[DPOW_MAXRELAYS]; uint32_t state,timestamp,waiting,sigcrcs[2],txidcrcs[2],utxocrcs[2]; @@ -75,7 +91,7 @@ struct dpow_info bits256 srctx[DPOW_MAXTX],desttx[DPOW_MAXTX]; uint32_t destupdated,srcconfirms,numdesttx,numsrctx,lastsplit,crcs[1024]; int32_t sock; - struct dpow_block **srcblocks,**destblocks; + struct dpow_block **blocks; }; diff --git a/iguana/dpow/dpow_fsm.c b/iguana/dpow/dpow_fsm.c index 2337484d3..a8bfed95b 100755 --- a/iguana/dpow/dpow_fsm.c +++ b/iguana/dpow/dpow_fsm.c @@ -28,9 +28,44 @@ struct dpow_entry *dpow_notaryfind(struct supernet_info *myinfo,struct dpow_bloc return(0); } +void dpow_utxo2entry(struct dpow_block *bp,struct dpow_entry *ep,struct dpow_utxoentry *up) +{ + int32_t i; + for (i=0; inotaries[i].othermask |= up->othermasks[i]; + ep->commit = up->commit; + ep->height = up->height; + ep->recvmask = up->recvmask; + ep->bestk = up->bestk; + ep->src.prev_hash = up->srchash; + ep->dest.prev_hash = up->desthash; + ep->src.prev_vout = up->srcvout; + ep->dest.prev_vout = up->destvout; +} + +void dpow_entry2utxo(struct dpow_utxoentry *up,struct dpow_block *bp,struct dpow_entry *ep) +{ + int32_t i; + up->commit = bp->commit; + up->hashmsg = bp->hashmsg; + up->height = bp->height; + up->recvmask = bp->recvmask; + up->bestk = bp->bestk; + for (i=0; iothermasks[i] = bp->notaries[i].recvmask; + up->commit = ep->commit; + up->height = ep->height; + up->recvmask = ep->recvmask; + up->bestk = ep->bestk; + up->srchash = ep->src.prev_hash; + up->desthash = ep->dest.prev_hash; + up->srcvout = ep->src.prev_vout; + up->destvout = ep->dest.prev_vout; +} + void dpow_utxosync(struct supernet_info *myinfo,struct dpow_block *bp,uint64_t recvmask,int32_t myind,bits256 srchash,uint32_t channel) { - uint32_t i,j,r; int32_t len; uint8_t utxodata[sizeof(struct dpow_entry)+2]; + uint32_t i,j,r; int32_t len; struct dpow_utxoentry U; uint8_t utxodata[sizeof(U)+2]; if ( (bp->recvmask ^ recvmask) != 0 ) { if ( ((1LL << myind) & recvmask) == 0 ) @@ -45,30 +80,33 @@ void dpow_utxosync(struct supernet_info *myinfo,struct dpow_block *bp,uint64_t r break; } } - if ( (len= dpow_rwutxobuf(1,utxodata,&bp->hashmsg,&bp->notaries[i])) > 0 ) + memset(&U,0,sizeof(U)); + dpow_entry2utxo(&U,bp,&bp->notaries[i]); + if ( (len= dpow_rwutxobuf(1,utxodata,&U,bp)) > 0 ) dpow_send(myinfo,bp,srchash,bp->hashmsg,channel,bp->height,utxodata,len,bp->utxocrcs); } } -void dpow_sync(struct supernet_info *myinfo,struct dpow_block *bp,uint64_t refmask,int32_t myind,bits256 srchash,uint32_t channel) +void dpow_sync(struct supernet_info *myinfo,struct dpow_block *bp,uint64_t refmask,int32_t myind,bits256 srchash,uint32_t channel,int32_t src_or_dest) { int8_t lastk; uint64_t mask; mask = dpow_maskmin(refmask,bp,&lastk); dpow_utxosync(myinfo,bp,mask,myind,srchash,channel); if ( bp->notaries[myind].masks[lastk] == 0 ) - dpow_signedtxgen(myinfo,bp->coin,bp,lastk,mask,myind,bp->opret_symbol,bits256_nonz(bp->btctxid) == 0 ? DPOW_SIGBTCCHANNEL : DPOW_SIGCHANNEL); + dpow_signedtxgen(myinfo,(src_or_dest != 0) ? bp->destcoin : bp->srccoin,bp,lastk,mask,myind,bp->opret_symbol,bits256_nonz(bp->desttxid) == 0 ? DPOW_SIGBTCCHANNEL : DPOW_SIGCHANNEL,src_or_dest); } -void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen) +void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen,int32_t src_or_dest) { - bits256 hashmsg,txid,commit,srchash; struct dpow_block *bp = 0; uint32_t flag = 0; int32_t senderind,i,myind = -1; char str[65],str2[65]; struct dpow_sigentry dsig; struct dpow_entry *ep,E; + bits256 hashmsg,txid,commit,srchash; struct dpow_block *bp = 0; uint32_t flag = 0; int32_t senderind,i,myind = -1; char str[65],str2[65]; struct dpow_sigentry dsig; struct dpow_entry *ep; struct dpow_coinentry *cp; struct dpow_utxoentry U; struct iguana_info *coin; if ( channel == DPOW_UTXOCHANNEL || channel == DPOW_UTXOBTCCHANNEL ) { - memset(&E,0,sizeof(E)); - if ( dpow_rwutxobuf(0,data,&hashmsg,&E) < 0 ) + memset(&U,0,sizeof(U)); + if ( dpow_rwutxobuf(0,data,&U,bp) < 0 ) return; if ( (bp= dpow_heightfind(myinfo,height,channel == DPOW_UTXOBTCCHANNEL)) != 0 ) { + coin = (src_or_dest != 0) ? bp->destcoin : bp->srccoin; dpow_notaryfind(myinfo,bp,&myind,myinfo->DPOW.minerkey33); if ( myind < 0 ) return; @@ -77,20 +115,16 @@ void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t hei printf("unexpected mismatch hashmsg.%s vs %s\n",bits256_str(str,hashmsg),bits256_str(str2,bp->hashmsg)); return; } - if ( (ep= dpow_notaryfind(myinfo,bp,&senderind,E.pubkey)) != 0 ) + if ( (ep= dpow_notaryfind(myinfo,bp,&senderind,U.pubkey)) != 0 ) { - if ( bits256_nonz(ep->prev_hash) == 0 ) - { - *ep = E; - bp->recvmask |= (1LL << senderind); - } - ep->recvmask = E.recvmask; - dpow_sync(myinfo,bp,ep->recvmask,myind,srchash,channel); + dpow_utxo2entry(bp,ep,&U); + bp->recvmask |= (1LL << senderind); + dpow_sync(myinfo,bp,ep->recvmask,myind,srchash,channel,src_or_dest); flag = 1; } } if ( 0 && flag == 0 && bp != 0 ) - printf("UTXO.%d hashmsg.(%s) txid.(%s) v%d\n",height,bits256_str(str,hashmsg),bits256_str(str2,E.prev_hash),E.prev_vout); + printf("UTXO.%d hashmsg.(%s) txid.(%s) v%d\n",height,bits256_str(str,hashmsg),bits256_str(str2,src_or_dest!=0?U.desthash:U.srchash),src_or_dest!=0?U.destvout:U.srcvout); } else if ( channel == DPOW_SIGCHANNEL || channel == DPOW_SIGBTCCHANNEL ) { @@ -98,26 +132,28 @@ void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t hei return; if ( dsig.senderind >= 0 && dsig.senderind < DPOW_MAXRELAYS && (bp= dpow_heightfind(myinfo,height,channel == DPOW_SIGBTCCHANNEL)) != 0 ) { + coin = (src_or_dest != 0) ? bp->destcoin : bp->srccoin; dpow_notaryfind(myinfo,bp,&myind,myinfo->DPOW.minerkey33); if ( myind < 0 ) return; if ( dsig.lastk < bp->numnotaries && dsig.senderind < bp->numnotaries && (ep= dpow_notaryfind(myinfo,bp,&senderind,dsig.senderpub)) != 0 ) { + cp = (src_or_dest != 0) ? &bp->notaries[myind].dest : &bp->notaries[myind].src; vcalc_sha256(0,commit.bytes,dsig.beacon.bytes,sizeof(dsig.beacon)); if ( memcmp(dsig.senderpub,bp->notaries[dsig.senderind].pubkey,33) == 0 ) { if ( ep->masks[dsig.lastk] == 0 ) { ep->masks[dsig.lastk] = dsig.mask; - ep->siglens[dsig.lastk] = dsig.siglen; - memcpy(ep->sigs[dsig.lastk],dsig.sig,dsig.siglen); + cp->siglens[dsig.lastk] = dsig.siglen; + memcpy(cp->sigs[dsig.lastk],dsig.sig,dsig.siglen); ep->beacon = dsig.beacon; - printf(" <<<<<<<< %s from.%d got lastk.%d %llx siglen.%d >>>>>>>>>\n",bp->coin->symbol,dsig.senderind,dsig.lastk,(long long)dsig.mask,dsig.siglen); - dpow_sync(myinfo,bp,dsig.mask,myind,srchash,channel); + printf(" <<<<<<<< %s from.%d got lastk.%d %llx siglen.%d >>>>>>>>>\n",coin->symbol,dsig.senderind,dsig.lastk,(long long)dsig.mask,dsig.siglen); + dpow_sync(myinfo,bp,dsig.mask,myind,srchash,channel,src_or_dest); flag = 1; } - } else printf("%s pubkey mismatch for senderind.%d %llx vs %llx\n",bp->coin->symbol,dsig.senderind,*(long long *)dsig.senderpub,*(long long *)bp->notaries[dsig.senderind].pubkey); - } else printf("%s illegal lastk.%d or senderind.%d or senderpub.%llx\n",bp->coin->symbol,dsig.lastk,dsig.senderind,*(long long *)dsig.senderpub); + } else printf("%s pubkey mismatch for senderind.%d %llx vs %llx\n",coin->symbol,dsig.senderind,*(long long *)dsig.senderpub,*(long long *)bp->notaries[dsig.senderind].pubkey); + } else printf("%s illegal lastk.%d or senderind.%d or senderpub.%llx\n",coin->symbol,dsig.lastk,dsig.senderind,*(long long *)dsig.senderpub); } else printf("couldnt find senderind.%d height.%d channel.%x\n",dsig.senderind,height,channel); if ( 0 && bp != 0 ) printf(" SIG.%d sender.%d lastk.%d mask.%llx siglen.%d recv.%llx\n",height,dsig.senderind,dsig.lastk,(long long)dsig.mask,dsig.siglen,(long long)bp->recvmask); @@ -127,6 +163,7 @@ void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t hei printf("handle txid channel.%x\n",channel); if ( (bp= dpow_heightfind(myinfo,height,channel == DPOW_BTCTXIDCHANNEL)) != 0 ) { + coin = (src_or_dest != 0) ? bp->destcoin : bp->srccoin; //printf("bp.%p datalen.%d\n",bp,datalen); for (i=0; i<32; i++) srchash.bytes[i] = data[i]; @@ -134,7 +171,7 @@ void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t hei { init_hexbytes_noT(bp->rawtx,&data[32],datalen-32); //printf("got bestk.%d %llx rawtx.(%s) set utxo\n",srchash.bytes[31],(long long)srchash.ulongs[1],bp->rawtx); - dpow_rawtxsign(myinfo,bp->coin,bp,bp->rawtx,0,srchash.bytes[31],srchash.ulongs[1],myind,bits256_nonz(bp->btctxid) == 0 ? DPOW_SIGBTCCHANNEL : DPOW_SIGCHANNEL); + dpow_rawtxsign(myinfo,bp->coin,bp,bp->rawtx,0,srchash.bytes[31],srchash.ulongs[1],myind,bits256_nonz(bp->desttxid) == 0 ? DPOW_SIGBTCCHANNEL : DPOW_SIGCHANNEL); } else*/ { @@ -143,7 +180,7 @@ void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t hei printf("signedtx.(%s)\n",bp->signedtx); if ( bits256_cmp(txid,srchash) == 0 ) { - printf("verify (%s) it is properly signed! set ht.%d signedtxid to %s\n",bp->coin->symbol,height,bits256_str(str,txid)); + printf("verify (%s) it is properly signed! set ht.%d signedtxid to %s\n",coin->symbol,height,bits256_str(str,txid)); bp->signedtxid = txid; bp->state = 0xffffffff; } @@ -158,9 +195,9 @@ void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t hei } } -int32_t dpow_update(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t utxochannel,uint32_t sigchannel,uint32_t txidchannel,bits256 srchash,int32_t myind) +int32_t dpow_update(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t utxochannel,uint32_t sigchannel,uint32_t txidchannel,bits256 srchash,int32_t myind,int32_t src_or_dest) { - struct dpow_entry *ep; int32_t i,k,len,sendutxo = 1; bits256 hash; uint8_t data[sizeof(struct dpow_entry)+2]; + struct dpow_entry *ep; int32_t i,k,len,sendutxo = 1; uint8_t data[sizeof(struct dpow_entry)+2]; struct dpow_utxoentry U; ep = &bp->notaries[myind]; if ( (bp->bestk= dpow_bestk(bp,&bp->bestmask)) >= 0 ) { @@ -176,33 +213,33 @@ int32_t dpow_update(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t } } if ( ep->masks[bp->bestk] == 0 ) - dpow_signedtxgen(myinfo,bp->coin,bp,bp->bestk,bp->bestmask,myind,bp->opret_symbol,sigchannel); - else dpow_sigsend(myinfo,bp,myind,bp->bestk,bp->bestmask,srchash,sigchannel); + dpow_signedtxgen(myinfo,(src_or_dest != 0) ? bp->destcoin : bp->srccoin,bp,bp->bestk,bp->bestmask,myind,bp->opret_symbol,sigchannel,src_or_dest); + //else dpow_sigsend(myinfo,bp,myind,bp->bestk,bp->bestmask,srchash,sigchannel); } if ( sendutxo != 0 ) { - hash = srchash; - hash.uints[0] = rand(); - if ( (len= dpow_rwutxobuf(1,data,&bp->hashmsg,&bp->notaries[myind])) > 0 ) - dpow_send(myinfo,bp,hash,bp->hashmsg,utxochannel,bp->height,data,len,bp->utxocrcs); + memset(&U,0,sizeof(U)); + dpow_entry2utxo(&U,bp,&bp->notaries[myind]); + if ( (len= dpow_rwutxobuf(1,data,&U,bp)) > 0 ) + dpow_send(myinfo,bp,srchash,bp->hashmsg,utxochannel,bp->height,data,len,bp->utxocrcs); } if ( bp->state != 0xffffffff ) { if ( ep->masks[bp->bestk] == 0 ) - dpow_signedtxgen(myinfo,bp->coin,bp,bp->bestk,bp->bestmask,myind,bp->opret_symbol,sigchannel); - else dpow_sigsend(myinfo,bp,myind,bp->bestk,bp->bestmask,srchash,sigchannel); + dpow_signedtxgen(myinfo,(src_or_dest != 0) ? bp->destcoin : bp->srccoin,bp,bp->bestk,bp->bestmask,myind,bp->opret_symbol,sigchannel,src_or_dest); + //else dpow_sigsend(myinfo,bp,myind,bp->bestk,bp->bestmask,srchash,sigchannel); } return(bp->state); } -uint32_t dpow_statemachineiterate(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,struct dpow_block *bp,int32_t myind) +uint32_t dpow_statemachineiterate(struct supernet_info *myinfo,struct dpow_info *dp,struct iguana_info *coin,struct dpow_block *bp,int32_t myind,int32_t src_or_dest) { - int32_t j,match,sigmatch,len,vout,incr,haveutxo = 0; cJSON *addresses; char *sendtx,*rawtx,*opret_symbol,coinaddr[64]; uint32_t channel,sigchannel,txidchannel; bits256 txid,srchash,zero; uint8_t data[4096]; int8_t lastk; uint64_t sigsmask; + int32_t j,match,sigmatch,len,incr; char *opret_symbol,coinaddr[64]; uint32_t channel,sigchannel,txidchannel; bits256 srchash,zero; uint8_t data[4096]; int8_t lastk; uint64_t sigsmask; struct dpow_utxoentry U; struct dpow_coinentry *cp; if ( bp->numnotaries > 8 ) incr = sqrt(bp->numnotaries) + 1; else incr = 1; memset(zero.bytes,0,sizeof(zero)); - if ( bits256_nonz(bp->btctxid) == 0 ) + if ( bits256_nonz(bp->desttxid) == 0 ) { channel = DPOW_UTXOBTCCHANNEL; sigchannel = DPOW_SIGBTCCHANNEL; @@ -231,7 +268,8 @@ uint32_t dpow_statemachineiterate(struct supernet_info *myinfo,struct dpow_info if ( bp->notaries[j].masks[bp->bestk] == bp->bestmask ) { match++; - if ( bp->notaries[j].siglens[bp->bestk] > 0 ) + cp = (src_or_dest != 0) ? &bp->notaries[j].dest : &bp->notaries[j].src; + if ( cp->siglens[bp->bestk] > 0 ) { sigmatch++; sigsmask |= (1LL << j); @@ -240,61 +278,63 @@ uint32_t dpow_statemachineiterate(struct supernet_info *myinfo,struct dpow_info } } if ( (rand() % 10) == 0 ) - printf("[%d] %s ht.%d FSM.%d %s BTC.%d masks.%llx best.(%d %llx) match.(%d sigs.%d) sigsmask.%llx\n",myind,coin->symbol,bp->height,bp->state,coinaddr,bits256_nonz(bp->btctxid)==0,(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,match,sigmatch,(long long)sigsmask); + printf("[%d] %s ht.%d FSM.%d %s BTC.%d masks.%llx best.(%d %llx) match.(%d sigs.%d) sigsmask.%llx\n",myind,coin->symbol,bp->height,bp->state,coinaddr,bits256_nonz(bp->desttxid)==0,(long long)bp->recvmask,bp->bestk,(long long)bp->bestmask,match,sigmatch,(long long)sigsmask); if ( sigmatch == DPOW_M(bp) ) { printf("sigmatch.%d\n",sigmatch); - dpow_sigscheck(myinfo,bp,sigchannel,myind); + dpow_sigscheck(myinfo,bp,sigchannel,myind,src_or_dest); } switch ( bp->state ) { case 0: - if ( (haveutxo= dpow_haveutxo(myinfo,coin,&txid,&vout,coinaddr)) != 0 && bits256_nonz(txid) != 0 ) - { - bp->notaries[myind].prev_hash = txid; - bp->notaries[myind].prev_vout = vout; - bp->recvmask |= (1LL << myind); - bp->state = 1; - } - if ( haveutxo < 10 && time(NULL) > dp->lastsplit+600 ) - { - addresses = cJSON_CreateArray(); - jaddistr(addresses,coinaddr); - if ( (rawtx= iguana_utxoduplicates(myinfo,coin,myinfo->DPOW.minerkey33,DPOW_UTXOSIZE,10,&bp->completed,&bp->signedtxid,0,addresses)) != 0 ) - { - if ( (sendtx= dpow_sendrawtransaction(myinfo,coin,rawtx)) != 0 ) - { - printf("sendrawtransaction.(%s)\n",sendtx); - free(sendtx); - } - free(rawtx); - } - free_json(addresses); - dp->lastsplit = (uint32_t)time(NULL); - } + bp->state = 1; break; case 1: dpow_lastk_mask(bp,&lastk); - if ( (len= dpow_rwutxobuf(1,data,&bp->hashmsg,&bp->notaries[myind])) > 0 ) + memset(&U,0,sizeof(U)); + dpow_entry2utxo(&U,bp,&bp->notaries[myind]); + if ( (len= dpow_rwutxobuf(1,data,&U,bp)) > 0 ) dpow_send(myinfo,bp,srchash,bp->hashmsg,channel,bp->height,data,len,bp->utxocrcs); bp->recvmask |= (1LL << myind); bp->state = 2; break; default: - dpow_update(myinfo,bp,channel,sigchannel,txidchannel,srchash,myind); + dpow_update(myinfo,bp,channel,sigchannel,txidchannel,srchash,myind,src_or_dest); break; } if ( bits256_nonz(bp->signedtxid) != 0 ) - { bp->state = 0xffffffff; - } return(bp->state); } +int32_t dpow_checkutxo(struct supernet_info *myinfo,struct dpow_block *bp,struct iguana_info *coin,bits256 *txidp,int32_t *voutp,char *coinaddr) +{ + int32_t haveutxo,completed; bits256 signedtxid; cJSON *addresses; char *rawtx,*sendtx; + if ( (haveutxo= dpow_haveutxo(myinfo,coin,txidp,voutp,coinaddr)) <= 10 && time(NULL) > myinfo->DPOW.lastsplit+300 ) + { + addresses = cJSON_CreateArray(); + jaddistr(addresses,coinaddr); + if ( (rawtx= iguana_utxoduplicates(myinfo,coin,myinfo->DPOW.minerkey33,DPOW_UTXOSIZE,10,&completed,&signedtxid,0,addresses)) != 0 ) + { + if ( (sendtx= dpow_sendrawtransaction(myinfo,coin,rawtx)) != 0 ) + { + printf("sendrawtransaction.(%s)\n",sendtx); + free(sendtx); + } + free(rawtx); + } + free_json(addresses); + myinfo->DPOW.lastsplit = (uint32_t)time(NULL); + } + if ( bits256_nonz(*txidp) == 0 ) + return(-1); + return(haveutxo); +} + void dpow_statemachinestart(void *ptr) { struct supernet_info *myinfo; struct dpow_info *dp; struct dpow_checkpoint checkpoint; void **ptrs = ptr; - int32_t i,n,myind = -1; struct iguana_info *src,*dest; char str[65],coinaddr[64]; bits256 zero; struct dpow_block *srcbp,*destbp,*bp; uint32_t starttime = (uint32_t)time(NULL); + int32_t i,n,myind = -1; struct iguana_info *src,*dest; char str[65],str2[65],srcaddr[64],destaddr[64]; bits256 zero; struct dpow_block *bp; struct dpow_entry *ep = 0; uint32_t starttime = (uint32_t)time(NULL); memset(&zero,0,sizeof(zero)); myinfo = ptrs[0]; dp = ptrs[1]; @@ -303,62 +343,62 @@ void dpow_statemachinestart(void *ptr) printf("statemachinestart %s->%s %s ht.%d\n",dp->symbol,dp->dest,bits256_str(str,checkpoint.blockhash.hash),checkpoint.blockhash.height); src = iguana_coinfind(dp->symbol); dest = iguana_coinfind(dp->dest); - if ( (destbp= dp->destblocks[checkpoint.blockhash.height]) == 0 ) + if ( (bp= dp->blocks[checkpoint.blockhash.height]) == 0 ) { - destbp = calloc(1,sizeof(*destbp)); - destbp->coin = iguana_coinfind(dp->dest); - destbp->opret_symbol = dp->symbol; - destbp->bestk = -1; - dp->destblocks[checkpoint.blockhash.height] = destbp; - destbp->beacon = rand256(0); - vcalc_sha256(0,destbp->commit.bytes,destbp->beacon.bytes,sizeof(destbp->beacon)); - if ( (bp= dp->destblocks[checkpoint.blockhash.height - 100]) != 0 ) + bp = calloc(1,sizeof(*bp)); + bp->srccoin = src; + bp->destcoin = dest; + bp->opret_symbol = dp->symbol; + bp->bestk = -1; + dp->blocks[checkpoint.blockhash.height] = bp; + bp->beacon = rand256(0); + vcalc_sha256(0,bp->commit.bytes,bp->beacon.bytes,sizeof(bp->beacon)); + if ( dp->blocks[checkpoint.blockhash.height - 1000] != 0 ) { - printf("purge %s.%d\n",dp->dest,checkpoint.blockhash.height - 100); - dp->destblocks[checkpoint.blockhash.height - 100] = 0; - free(bp); + printf("purge %s.%d\n",dp->dest,checkpoint.blockhash.height - 1000); + free(dp->blocks[checkpoint.blockhash.height - 1000]); + dp->blocks[checkpoint.blockhash.height - 1000] = 0; } } - if ( (srcbp= dp->srcblocks[checkpoint.blockhash.height]) == 0 ) + n = (int32_t)(sizeof(Notaries)/sizeof(*Notaries)); + bp->numnotaries = n; + for (i=0; icoin = iguana_coinfind(dp->symbol); - srcbp->opret_symbol = dp->symbol; - srcbp->bestk = -1; - dp->srcblocks[checkpoint.blockhash.height] = srcbp; - srcbp->beacon = destbp->beacon; - srcbp->commit = destbp->commit; - printf("create srcbp[%d]\n",checkpoint.blockhash.height); - if ( (bp= dp->srcblocks[checkpoint.blockhash.height - 1000]) != 0 ) + decode_hex(bp->notaries[i].pubkey,33,Notaries[i][1]); + if ( memcmp(bp->notaries[i].pubkey,myinfo->DPOW.minerkey33,33) == 0 ) { - printf("purge %s.%d\n",dp->symbol,checkpoint.blockhash.height - 1000); - dp->srcblocks[checkpoint.blockhash.height - 1000] = 0; - free(bp); + myind = i; + ep = &bp->notaries[myind]; } } - n = (int32_t)(sizeof(Notaries)/sizeof(*Notaries)); - srcbp->numnotaries = destbp->numnotaries = n; - for (i=0; inotaries[i].pubkey,33,Notaries[i][1]); - decode_hex(destbp->notaries[i].pubkey,33,Notaries[i][1]); - if ( memcmp(destbp->notaries[i].pubkey,myinfo->DPOW.minerkey33,33) == 0 ) - myind = i; + printf("statemachinestart this node %s %s is not official notary\n",srcaddr,destaddr); + free(ptr); + return; } - bitcoin_address(coinaddr,src->chain->pubtype,myinfo->DPOW.minerkey33,33); - printf(" myaddr.%s\n",coinaddr); - if ( myind < 0 ) + bitcoin_address(srcaddr,dest->chain->pubtype,myinfo->DPOW.minerkey33,33); + bitcoin_address(destaddr,dest->chain->pubtype,myinfo->DPOW.minerkey33,33); + printf(" myaddr.(%s %s)\n",srcaddr,destaddr); + if ( dpow_checkutxo(myinfo,bp,bp->destcoin,&ep->dest.prev_hash,&ep->dest.prev_vout,destaddr) < 0 ) { - printf("statemachinestart this node %s is not official notary\n",coinaddr); + printf("dont have %s %s utxo, please send funds\n",dp->dest,destaddr); free(ptr); return; } + if ( dpow_checkutxo(myinfo,bp,bp->srccoin,&ep->src.prev_hash,&ep->src.prev_vout,srcaddr) < 0 ) + { + printf("dont have %s %s utxo, please send funds\n",dp->symbol,srcaddr); + free(ptr); + return; + } + bp->recvmask |= (1LL << myind); dp->checkpoint = checkpoint; - srcbp->height = destbp->height = checkpoint.blockhash.height; - srcbp->timestamp = destbp->timestamp = checkpoint.timestamp; - srcbp->hashmsg = destbp->hashmsg = checkpoint.blockhash.hash; + bp->height = checkpoint.blockhash.height; + bp->timestamp = checkpoint.timestamp; + bp->hashmsg = checkpoint.blockhash.hash; printf("DPOW statemachine checkpoint.%d %s\n",checkpoint.blockhash.height,bits256_str(str,checkpoint.blockhash.hash)); - while ( time(NULL) < starttime+300 && src != 0 && dest != 0 && (srcbp->state != 0xffffffff || destbp->state != 0xffffffff) ) + while ( time(NULL) < starttime+300 && src != 0 && dest != 0 && bp->state != 0xffffffff ) { sleep(1); if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) @@ -366,29 +406,12 @@ void dpow_statemachinestart(void *ptr) printf("abort ht.%d due to new checkpoint.%d\n",checkpoint.blockhash.height,dp->checkpoint.blockhash.height); break; } - if ( destbp->state != 0xffffffff ) + if ( bp->state != 0xffffffff ) { //printf("dp->ht.%d ht.%d DEST.%08x %s\n",dp->checkpoint.blockhash.height,checkpoint.blockhash.height,deststate,bits256_str(str,srchash.hash)); - destbp->state = dpow_statemachineiterate(myinfo,dp,dest,destbp,myind); - if ( destbp->state == 0xffffffff ) - { - srcbp->btctxid = destbp->signedtxid; - printf("SET BTCTXID.(%s)\n",bits256_str(str,srcbp->btctxid)); - } - } - if ( destbp->state == 0xffffffff && bits256_nonz(srcbp->btctxid) != 0 ) - { - if ( dp->checkpoint.blockhash.height > checkpoint.blockhash.height ) - { - printf("abort ht.%d due to new checkpoint.%d\n",checkpoint.blockhash.height,dp->checkpoint.blockhash.height); - break; - } - if ( srcbp->state != 0xffffffff ) - { - //printf("dp->ht.%d ht.%d SRC.%08x %s\n",dp->checkpoint.blockhash.height,checkpoint.blockhash.height,srcbp->state,bits256_str(str,srcbp->btctxid)); - srcbp->state = dpow_statemachineiterate(myinfo,dp,src,srcbp,myind); - } + bp->state = dpow_statemachineiterate(myinfo,dp,dest,bp,myind,1); } } + printf("state machine ht.%d completed %s.%s %s.%s\n",bp->height,dp->dest,bits256_str(str,bp->desttxid),dp->symbol,bits256_str(str2,bp->srctxid)); free(ptr); } diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index e113081e2..7ac57c797 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -58,7 +58,7 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr) int32_t dpow_crc32find(struct supernet_info *myinfo,uint32_t crc32,uint32_t channel) { int32_t i,firstz = -1; - return(0); +return(0); for (i=0; iDPOW.crcs)/sizeof(*myinfo->DPOW.crcs); i++) { if ( myinfo->DPOW.crcs[i] == crc32 ) @@ -78,9 +78,9 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_block *bp,bits256 srchas { struct dpow_nanomsghdr *np; int32_t size,firstz,sentbytes = 0; uint32_t crc32; crc32 = calc_crc32(0,data,datalen); - //if ( (firstz= dpow_crc32find(myinfo,crc32,channel)) >= 0 ) + if ( (firstz= dpow_crc32find(myinfo,crc32,channel)) >= 0 ) { - //myinfo->DPOW.crcs[firstz] = crc32; + myinfo->DPOW.crcs[firstz] = crc32; size = (int32_t)(sizeof(*np) + datalen); np = calloc(1,size); //printf("dpow_send.(%d) size.%d\n",datalen,size); @@ -111,7 +111,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo) if ( crc32 == np->crc32 && (firstz= dpow_crc32find(myinfo,crc32,np->channel)) >= 0 ) { myinfo->DPOW.crcs[firstz] = crc32; - //printf("NANORECV ht.%d channel.%08x (%d) crc32.%08x:%08x datalen.%d:%d\n",np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np))); + printf("NANORECV ht.%d channel.%08x (%d) crc32.%08x:%08x datalen.%d:%d\n",np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np))); dpow_datahandler(myinfo,np->channel,np->height,np->packet,np->datalen); } } else printf("np->datalen.%d (size %d - %ld)\n",np->datalen,size,sizeof(*np)); @@ -185,9 +185,9 @@ int32_t dpow_rwopret(int32_t rwflag,uint8_t *opret,bits256 *hashmsg,int32_t *hei return(opretlen); } -int32_t dpow_rwutxobuf(int32_t rwflag,uint8_t *data,bits256 *hashmsg,struct dpow_entry *ep) +int32_t dpow_rwutxobuf(int32_t rwflag,uint8_t *data,struct dpow_utxoentry *up,struct dpow_block *bp) { - int32_t i,len = 0; + uint8_t numnotaries; uint64_t othermask; int32_t i,len = 0; if ( rwflag != 0 ) { data[0] = DPOW_VERSION & 0xff; @@ -195,27 +195,41 @@ int32_t dpow_rwutxobuf(int32_t rwflag,uint8_t *data,bits256 *hashmsg,struct dpow } else if ( (data[0]+((int32_t)data[1]<<8)) != DPOW_VERSION ) return(-1); - len = 2; - len += iguana_rwbignum(rwflag,&data[len],sizeof(*hashmsg),hashmsg->bytes); - len += iguana_rwbignum(rwflag,&data[len],sizeof(ep->prev_hash),ep->prev_hash.bytes); - if ( bits256_nonz(ep->prev_hash) == 0 ) + if ( bits256_nonz(up->srchash) == 0 || bits256_nonz(up->desthash) == 0 ) return(-1); - len += iguana_rwbignum(rwflag,&data[len],sizeof(ep->commit),ep->commit.bytes); + len = 2; + len += iguana_rwbignum(rwflag,&data[len],sizeof(up->hashmsg),up->hashmsg.bytes); + len += iguana_rwbignum(rwflag,&data[len],sizeof(up->srchash),up->srchash.bytes); + len += iguana_rwbignum(rwflag,&data[len],sizeof(up->desthash),up->desthash.bytes); + len += iguana_rwbignum(rwflag,&data[len],sizeof(up->commit),up->commit.bytes); + len += iguana_rwnum(rwflag,&data[len],sizeof(up->recvmask),(uint8_t *)&up->recvmask); + len += iguana_rwnum(rwflag,&data[len],sizeof(up->height),(uint8_t *)&up->height); + len += iguana_rwnum(rwflag,&data[len],sizeof(up->srcvout),&up->srcvout); + len += iguana_rwnum(rwflag,&data[len],sizeof(up->destvout),&up->destvout); + len += iguana_rwnum(rwflag,&data[len],sizeof(up->bestk),&up->bestk); if ( rwflag != 0 ) { - data[len++] = ep->prev_vout; for (i=0; i<33; i++) - data[len++] = ep->pubkey[i]; - data[len++] = ep->bestk; + data[len++] = up->pubkey[i]; + numnotaries = (uint8_t)(sizeof(Notaries)/sizeof(*Notaries)); + data[len++] = numnotaries; + for (i=0; iothermasks),(uint8_t *)&up->othermasks[(int32_t)i]); } else { - ep->prev_vout = data[len++]; for (i=0; i<33; i++) - ep->pubkey[i] = data[len++]; - ep->bestk = data[len++]; + up->pubkey[i] = data[len++]; + numnotaries = data[len++]; + if ( numnotaries == (uint8_t)(sizeof(Notaries)/sizeof(*Notaries)) ) + { + for (i=0; inotaries[(int32_t)i].othermask |= othermask; + } + } else return(-1); } - len += iguana_rwbignum(rwflag,&data[len],sizeof(ep->recvmask),(uint8_t *)&ep->recvmask); return(len); } @@ -269,8 +283,8 @@ void dpow_sigsend(struct supernet_info *myinfo,struct dpow_block *bp,int32_t myi dsig.mask = bestmask; dsig.senderind = myind; dsig.beacon = bp->beacon; - dsig.siglen = ep->siglens[bestk]; - memcpy(dsig.sig,ep->sigs[bestk],ep->siglens[bestk]); + dsig.siglen = ep->dest.siglens[bestk]; + memcpy(dsig.sig,ep->dest.sigs[bestk],ep->dest.siglens[bestk]); memcpy(dsig.senderpub,myinfo->DPOW.minerkey33,33); len = dpow_rwsigentry(1,data,&dsig); dpow_send(myinfo,bp,srchash,bp->hashmsg,sigchannel,bp->height,data,len,bp->sigcrcs); diff --git a/iguana/dpow/dpow_tx.c b/iguana/dpow/dpow_tx.c index 48293316f..d14fcfe8b 100755 --- a/iguana/dpow/dpow_tx.c +++ b/iguana/dpow/dpow_tx.c @@ -20,7 +20,7 @@ uint64_t dpow_lastk_mask(struct dpow_block *bp,int8_t *lastkp) for (j=m=0; jnumnotaries; j++) { k = ((bp->height % bp->numnotaries) + j) % bp->numnotaries; - if ( bits256_nonz(bp->notaries[k].prev_hash) != 0 ) + if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) { bp->recvmask |= (1LL << k); mask |= (1LL << k); @@ -51,7 +51,7 @@ uint64_t dpow_maskmin(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) for (j=m=0; jnumnotaries; j++) { k = ((bp->height % bp->numnotaries) + j) % bp->numnotaries; - if ( bits256_nonz(bp->notaries[k].prev_hash) != 0 ) + if ( bits256_nonz(bp->notaries[k].src.prev_hash) != 0 && bits256_nonz(bp->notaries[k].dest.prev_hash) != 0 ) { mask |= (1LL << k); if ( ++m >= DPOW_M(bp) ) @@ -66,15 +66,13 @@ uint64_t dpow_maskmin(uint64_t refmask,struct dpow_block *bp,int8_t *lastkp) struct dpow_block *dpow_heightfind(struct supernet_info *myinfo,int32_t height,int32_t destflag) { - if ( destflag != 0 ) - return(myinfo->DPOW.destblocks!=0?myinfo->DPOW.destblocks[height]:0); - else return(myinfo->DPOW.srcblocks!=0?myinfo->DPOW.srcblocks[height]:0); + return(myinfo->DPOW.blocks!=0?myinfo->DPOW.blocks[height]:0); } -bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,char *src,int32_t usesigs) +bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,char *src,int32_t usesigs,int32_t src_or_dest) { uint32_t k,j,m,numsigs,locktime,numvouts,version,opretlen,siglen,len,sequenceid = 0xffffffff; - uint64_t satoshis,satoshisB; uint8_t serialized[32768],opret[1024],data[4096]; struct dpow_entry *ep; + uint64_t satoshis,satoshisB; uint8_t serialized[32768],opret[1024],data[4096]; struct dpow_entry *ep; struct dpow_coinentry *cp; len = locktime = numsigs = 0; version = 1; len += iguana_rwnum(1,&serialized[len],sizeof(version),&version); @@ -88,17 +86,18 @@ bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow if ( ((1LL << k) & bestmask) != 0 ) { ep = &bp->notaries[k]; - if ( bits256_nonz(ep->prev_hash) == 0 ) - return(ep->prev_hash); - len += iguana_rwbignum(1,&serialized[len],sizeof(ep->prev_hash),ep->prev_hash.bytes); - len += iguana_rwnum(1,&serialized[len],sizeof(ep->prev_vout),&ep->prev_vout); - siglen = ep->siglens[bestk]; + cp = (src_or_dest != 0) ? &bp->notaries[k].dest : &bp->notaries[k].src; + if ( bits256_nonz(cp->prev_hash) == 0 ) + return(cp->prev_hash); + len += iguana_rwbignum(1,&serialized[len],sizeof(cp->prev_hash),cp->prev_hash.bytes); + len += iguana_rwnum(1,&serialized[len],sizeof(cp->prev_vout),&cp->prev_vout); + siglen = cp->siglens[bestk]; if ( usesigs != 0 ) { len += iguana_rwvarint32(1,&serialized[len],&siglen); - if ( siglen > 0 && siglen <= sizeof(ep->sigs[bestk]) ) + if ( siglen > 0 && siglen <= sizeof(cp->sigs[bestk]) ) { - memcpy(&serialized[len],ep->sigs[bestk],siglen); + memcpy(&serialized[len],cp->sigs[bestk],siglen); len += siglen; numsigs++; } @@ -122,7 +121,7 @@ bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow serialized[len++] = CHECKSIG; satoshis = 0; len += iguana_rwnum(1,&serialized[len],sizeof(satoshis),&satoshis); - opretlen = dpow_rwopret(1,opret,&bp->hashmsg,&bp->height,&bp->btctxid,src); + opretlen = dpow_rwopret(1,opret,&bp->hashmsg,&bp->height,&bp->desttxid,src); opretlen = dpow_opreturnscript(data,opret,opretlen); if ( opretlen < 0xfd ) serialized[len++] = opretlen; @@ -140,9 +139,9 @@ bits256 dpow_notarytx(char *signedtx,int32_t *numsigsp,int32_t isPoS,struct dpow return(bits256_doublesha256(0,serialized,len)); } -cJSON *dpow_vins(struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t usesigs) +cJSON *dpow_vins(struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t usesigs,int32_t src_or_dest) { - int32_t k,j,m=0; uint8_t script[35]; char scriptstr[256]; cJSON *vins=0,*item; struct dpow_entry *ep; + int32_t k,j,m=0; uint8_t script[35]; char scriptstr[256]; cJSON *vins=0,*item; struct dpow_entry *ep; struct dpow_coinentry *cp; vins = cJSON_CreateArray(); for (j=0; jnumnotaries; j++) { @@ -150,11 +149,12 @@ cJSON *dpow_vins(struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uin if ( ((1LL << k) & bestmask) != 0 ) { ep = &bp->notaries[k]; - if ( bits256_nonz(ep->prev_hash) != 0 ) + cp = (src_or_dest != 0) ? &bp->notaries[k].dest : &bp->notaries[k].src; + if ( bits256_nonz(cp->prev_hash) != 0 ) { item = cJSON_CreateObject(); - jaddbits256(item,"txid",ep->prev_hash); - jaddnum(item,"vout",ep->prev_vout); + jaddbits256(item,"txid",cp->prev_hash); + jaddnum(item,"vout",cp->prev_vout); script[0] = 33; memcpy(script+1,ep->pubkey,33); script[34] = CHECKSIG; @@ -176,10 +176,12 @@ cJSON *dpow_vins(struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uin return(vins); } -void dpow_rawtxsign(struct supernet_info *myinfo,struct iguana_info *coin,struct dpow_block *bp,char *rawtx,cJSON *vins,int8_t bestk,uint64_t bestmask,int32_t myind,uint32_t sigchannel) +void dpow_rawtxsign(struct supernet_info *myinfo,struct iguana_info *coin,struct dpow_block *bp,char *rawtx,cJSON *vins,int8_t bestk,uint64_t bestmask,int32_t myind,uint32_t sigchannel,int32_t src_or_dest) { - int32_t j,m=0,retval=-1; char *jsonstr,*signedtx,*rawtx2,*sigstr; cJSON *signobj,*sobj,*txobj2,*item,*vin; bits256 srchash; struct dpow_entry *ep = &bp->notaries[myind]; + int32_t j,m=0,retval=-1; char *jsonstr,*signedtx,*rawtx2,*sigstr; cJSON *signobj,*sobj,*txobj2,*item,*vin; bits256 srchash; struct dpow_entry *ep; struct dpow_coinentry *cp; m = 0; + ep = &bp->notaries[myind]; + cp = (src_or_dest != 0) ? &bp->notaries[myind].dest : &bp->notaries[myind].src; if ( (jsonstr= dpow_signrawtransaction(myinfo,coin,rawtx,vins)) != 0 ) { //printf("bestk.%d mask.%llx dpowsign.(%s)\n",bestk,(long long)bestmask,jsonstr); @@ -197,10 +199,9 @@ void dpow_rawtxsign(struct supernet_info *myinfo,struct iguana_info *coin,struct if ( (sobj= jobj(item,"scriptSig")) != 0 && (sigstr= jstr(sobj,"hex")) != 0 && strlen(sigstr) > 32 ) { printf("height.%d mod.%d VINI.%d myind.%d MINE.(%s) j.%d\n",bp->height,bp->height%bp->numnotaries,j,myind,jprint(item,0),j); - ep->siglens[bestk] = (int32_t)strlen(sigstr) >> 1; - decode_hex(ep->sigs[bestk],ep->siglens[bestk],sigstr); + cp->siglens[bestk] = (int32_t)strlen(sigstr) >> 1; + decode_hex(cp->sigs[bestk],cp->siglens[bestk],sigstr); ep->masks[bestk] = bestmask; - ep->siglens[bestk] = ep->siglens[bestk]; ep->beacon = bp->beacon; dpow_sigsend(myinfo,bp,myind,bestk,bestmask,srchash,sigchannel); retval = 0; @@ -218,7 +219,7 @@ void dpow_rawtxsign(struct supernet_info *myinfo,struct iguana_info *coin,struct } } -int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t myind,char *opret_symbol,uint32_t sigchannel) +int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,struct dpow_block *bp,int8_t bestk,uint64_t bestmask,int32_t myind,char *opret_symbol,uint32_t sigchannel,int32_t src_or_dest) { int32_t j,incr,numsigs,retval=-1; char rawtx[32768]; cJSON *vins; bits256 txid,srchash,zero; struct dpow_entry *ep; if ( bp->numnotaries < 8 ) @@ -231,9 +232,9 @@ int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,s return(-1); for (j=0; jDPOW.minerkey33[j+1]; - if ( (vins= dpow_vins(coin,bp,bestk,bestmask,1)) != 0 ) + if ( (vins= dpow_vins(coin,bp,bestk,bestmask,1,src_or_dest)) != 0 ) { - txid = dpow_notarytx(rawtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,opret_symbol,0); + txid = dpow_notarytx(rawtx,&numsigs,coin->chain->isPoS,bp,bestk,bestmask,opret_symbol,0,src_or_dest); if ( bits256_nonz(txid) != 0 && rawtx[0] != 0 ) // send tx to share utxo set { /*memset(&tmp,0,sizeof(tmp)); @@ -244,25 +245,26 @@ int32_t dpow_signedtxgen(struct supernet_info *myinfo,struct iguana_info *coin,s for (j=0; jhashmsg,(bits256_nonz(bp->btctxid) == 0) ? DPOW_BTCTXIDCHANNEL : DPOW_TXIDCHANNEL,bp->height,txdata,len+32,bp->txidcrcs);*/ - dpow_rawtxsign(myinfo,coin,bp,rawtx,vins,bestk,bestmask,myind,sigchannel); + dpow_rawtxsign(myinfo,coin,bp,rawtx,vins,bestk,bestmask,myind,sigchannel,src_or_dest); } free_json(vins); } return(retval); } -void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t channel,int32_t myind) +void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t channel,int32_t myind,int32_t src_or_dest) { - bits256 txid,srchash,zero; int32_t j,len,numsigs; char *retstr=0,str[65],str2[65]; uint8_t txdata[32768]; + bits256 txid,srchash,zero; struct iguana_info *coin; int32_t j,len,numsigs; char *retstr=0,str[65],str2[65]; uint8_t txdata[32768]; + coin = (src_or_dest != 0) ? bp->destcoin : bp->srccoin; memset(zero.bytes,0,sizeof(zero)); - if ( bp->state != 0xffffffff && bp->coin != 0 ) + if ( bp->state != 0xffffffff && coin != 0 ) { - bp->signedtxid = dpow_notarytx(bp->signedtx,&numsigs,bp->coin->chain->isPoS,bp,bp->bestk,bp->bestmask,bp->opret_symbol,1); + bp->signedtxid = dpow_notarytx(bp->signedtx,&numsigs,coin->chain->isPoS,bp,bp->bestk,bp->bestmask,bp->opret_symbol,1,src_or_dest); printf("%s numsigs.%d signedtx.(%s)\n",bits256_str(str,bp->signedtxid),numsigs,bp->signedtx); bp->state = 1; if ( bits256_nonz(bp->signedtxid) != 0 && numsigs == DPOW_M(bp) ) { - if ( (retstr= dpow_sendrawtransaction(myinfo,bp->coin,bp->signedtx)) != 0 ) + if ( (retstr= dpow_sendrawtransaction(myinfo,coin,bp->signedtx)) != 0 ) { printf("sendrawtransaction.(%s)\n",retstr); if ( is_hexstr(retstr,0) == sizeof(txid)*2 ) @@ -275,7 +277,7 @@ void dpow_sigscheck(struct supernet_info *myinfo,struct dpow_block *bp,uint32_t for (j=0; jhashmsg,(channel == DPOW_SIGBTCCHANNEL) ? DPOW_BTCTXIDCHANNEL : DPOW_TXIDCHANNEL,bp->height,txdata,len+32,bp->txidcrcs); - printf("complete statemachine.%s ht.%d\n",bp->coin->symbol,bp->height); + printf("complete statemachine.%s ht.%d\n",coin->symbol,bp->height); bp->state = 0xffffffff; } else printf("sendtxid mismatch got %s instead of %s\n",bits256_str(str,txid),bits256_str(str2,bp->signedtxid)); } diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index 8ef5d039a..6099b00b2 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -27,7 +27,7 @@ #include "iguana777.h" #include "notaries.h" -void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen); +void dpow_datahandler(struct supernet_info *myinfo,uint32_t channel,uint32_t height,uint8_t *data,int32_t datalen,int32_t src_or_dest); #include "dpow/dpow_network.c" #include "dpow/dpow_rpc.c" @@ -208,10 +208,8 @@ TWO_STRINGS(iguana,dpow,symbol,pubkey) } if ( myinfo->DPOW.srcconfirms > DPOW_FIFOSIZE ) myinfo->DPOW.srcconfirms = DPOW_FIFOSIZE; - if ( myinfo->DPOW.srcblocks == 0 ) - myinfo->DPOW.srcblocks = calloc(1000000,sizeof(*myinfo->DPOW.srcblocks)); - if ( myinfo->DPOW.destblocks == 0 ) - myinfo->DPOW.destblocks = calloc(1000000,sizeof(*myinfo->DPOW.destblocks)); + if ( myinfo->DPOW.blocks == 0 ) + myinfo->DPOW.blocks = calloc(1000000,sizeof(*myinfo->DPOW.blocks)); return(clonestr("{\"result\":\"success\"}")); } diff --git a/iguana/kmd_7776 b/iguana/kmd_7776 index e33b7564c..3448cef40 100755 --- a/iguana/kmd_7776 +++ b/iguana/kmd_7776 @@ -1,3 +1,3 @@ -userhome=`cat userhome.txt` -curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"komodo.conf\",\"path\":\"$userhome/.komodo\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":10,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":8,\"endpend\":8,\"services\":0,\"maxpeers\":32,\"newcoin\":\"KMD\",\"name\":\"Komodo\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"f9eee48d\",\"p2p\":7770,\"rpc\":7771,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0}" +curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"komodo.conf\",\"path\":\"${HOME#"/"}/.komodo\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":10,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":8,\"endpend\":8,\"services\":0,\"maxpeers\":32,\"newcoin\":\"KMD\",\"name\":\"Komodo\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"f9eee48d\",\"p2p\":7770,\"rpc\":7771,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0}" +curl --url "http://127.0.0.1:7776" --data "{\"conf\":\"komodo.conf\",\"path\":\"$userhome/.komodo\",\"unitval\":\"20\",\"zcash\":1,\"RELAY\":-1,\"VALIDATE\":0,\"prefetchlag\":-1,\"poll\":10,\"active\":1,\"agent\":\"iguana\",\"method\":\"addcoin\",\"startpend\":8,\"endpend\":8,\"services\":0,\"maxpeers\":32,\"newcoin\":\"KMD\",\"name\":\"Komodo\",\"hasheaders\":1,\"useaddmultisig\":0,\"netmagic\":\"f9eee48d\",\"p2p\":7770,\"rpc\":7771,\"pubval\":60,\"p2shval\":85,\"wifval\":188,\"txfee_satoshis\":\"10000\",\"isPoS\":0,\"minoutput\":10000,\"minconfirms\":2,\"genesishash\":\"027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71\",\"protover\":170002,\"genesisblock\":\"0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a000000000000000000000000000000000000000000000000000000000000000029ab5f490f0f0f200b00000000000000000000000000000000000000000000000000000000000000fd4005000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2\",\"debug\":0}" diff --git a/iguana/m_notary b/iguana/m_notary index 29ae188e2..6959e153e 100755 --- a/iguana/m_notary +++ b/iguana/m_notary @@ -9,7 +9,8 @@ gcc -g -o ../agents/iguana *.o ../agents/libcrypto777.a -lnanomsg -lcurl -lssl - ../agents/iguana notary > iguana.log 2> error.log & -myip=`cat myip.txt` +myip=`curl -s4 checkip.amazonaws.com` + sleep 4 curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"SuperNET\",\"method\":\"myipaddr\",\"ipaddr\":\"$myip\"}" sleep 3 @@ -20,3 +21,4 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"ad ./dpow_7776 sleep 3 ./wp_7776 + diff --git a/iguana/notaries.h b/iguana/notaries.h index e46bc47ad..af2edb80d 100755 --- a/iguana/notaries.h +++ b/iguana/notaries.h @@ -46,6 +46,7 @@ char *Notaries[][2] = { "crackers_SH", "02313d72f9a16055737e14cfc528dcd5d0ef094cfce23d0348fe974b6b1a32e5f0" }, { "grewal_SH", "03212a73f5d38a675ee3cdc6e82542a96c38c3d1c79d25a1ed2e42fcf6a8be4e68" }, { "polycryptoblock_NA", "02708dcda7c45fb54b78469673c2587bfdd126e381654819c4c23df0e00b679622" }, + { "titomane_NA", "0387046d9745414fb58a0fa3599078af5073e10347e4657ef7259a99cb4f10ad47" }, /*{ "Server1","0221876c8259764224dc1a7b70ec956f3fbe9a768cd77f13082cfa60eb6aa2d068"}, { "Server2","03c7c14e6b1f94585bb571cf3ee5eb9b9ab54bd23d0acb8cf13edad1c515842b66"}, { "Server3","02d28f8992ff0cd68c5d558cf55ec5b3ada25151519a6cea8cef1bac04c40023b6"}, diff --git a/iguana/tests/addnotarys_7776 b/iguana/tests/addnotarys_7776 index 883dbd603..535f7c52c 100755 --- a/iguana/tests/addnotarys_7776 +++ b/iguana/tests/addnotarys_7776 @@ -3,6 +3,7 @@ curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"ad curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"149.56.29.163\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"191.235.80.138\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"94.102.63.226\"}" +curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"104.255.64.3\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"149.56.122.76\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"213.202.253.10\"}" curl --url "http://127.0.0.1:7776" --data "{\"agent\":\"iguana\",\"method\":\"addnotary\",\"ipaddr\":\"94.102.63.217\"}"