@ -13,6 +13,170 @@
* *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
// 1. add rpc hooks, debug
// 2. sig validate in fsm
struct dex_nanomsghdr
{
uint32_t size , datalen , crc32 ;
uint8_t version0 , version1 , packet [ ] ;
} PACKED ;
void dex_init ( struct supernet_info * myinfo )
{
strcpy ( myinfo - > dexseed_ipaddr , " 78.47.196.146 " ) ;
myinfo - > dexipbits [ 0 ] = ( uint32_t ) calc_ipbits ( myinfo - > dexseed_ipaddr ) ;
myinfo - > numdexipbits = 1 ;
portable_mutex_init ( & myinfo - > dexmutex ) ;
}
char * nanomsg_tcpname ( char * str , char * ipaddr , uint16_t port )
{
sprintf ( str , " tcp://%s:%u " , ipaddr , port ) ;
return ( str ) ;
}
static int _increasing_ipbits ( const void * a , const void * b )
{
# define uint32_a (*(uint32_t *)a)
# define uint32_b (*(uint32_t *)b)
if ( uint32_b > uint32_a )
return ( - 1 ) ;
else if ( uint32_b < uint32_a )
return ( 1 ) ;
return ( 0 ) ;
# undef uint32_a
# undef uint32_b
}
void dex_packet ( struct supernet_info * myinfo , struct dex_nanomsghdr * dexp , int32_t size )
{
printf ( " DEX_PACKET.[%d] \n " , size ) ;
}
void dex_reqsend ( struct supernet_info * myinfo , uint8_t * data , int32_t datalen )
{
struct dex_nanomsghdr * dexp ; char ipaddr [ 64 ] , str [ 128 ] ; int32_t timeout , i , n , size , recvbytes , sentbytes = 0 ; uint32_t crc32 , * retptr , ipbits ;
if ( myinfo - > reqsock < 0 & & ( myinfo - > reqsock = nn_socket ( AF_SP , NN_REQ ) ) > = 0 )
{
if ( nn_connect ( myinfo - > reqsock , nanomsg_tcpname ( str , myinfo - > dexseed_ipaddr , REP_SOCK ) ) < 0 )
{
nn_close ( myinfo - > reqsock ) ;
myinfo - > reqsock = - 1 ;
}
else
{
if ( myinfo - > subsock < 0 & & ( myinfo - > subsock = nn_socket ( AF_SP , NN_SUB ) ) > = 0 )
{
if ( nn_connect ( myinfo - > subsock , nanomsg_tcpname ( str , myinfo - > dexseed_ipaddr , PUB_SOCK ) ) < 0 )
{
nn_close ( myinfo - > reqsock ) ;
myinfo - > reqsock = - 1 ;
nn_close ( myinfo - > subsock ) ;
myinfo - > subsock = - 1 ;
}
else
{
timeout = 1000 ;
nn_setsockopt ( myinfo - > reqsock , NN_SOL_SOCKET , NN_RCVTIMEO , & timeout , sizeof ( timeout ) ) ;
nn_setsockopt ( myinfo - > subsock , NN_SOL_SOCKET , NN_RCVTIMEO , & timeout , sizeof ( timeout ) ) ;
nn_setsockopt ( myinfo - > subsock , NN_SUB , NN_SUB_SUBSCRIBE , " " , 0 ) ;
}
}
}
}
if ( myinfo - > reqsock > = 0 )
{
crc32 = calc_crc32 ( 0 , data , datalen ) ;
size = ( int32_t ) ( sizeof ( * dexp ) + datalen ) ;
dexp = calloc ( 1 , size ) ; // endian dependent!
dexp - > size = size ;
dexp - > datalen = datalen ;
dexp - > crc32 = crc32 ;
dexp - > version0 = DEX_VERSION & 0xff ;
dexp - > version1 = ( DEX_VERSION > > 8 ) & 0xff ;
memcpy ( dexp - > packet , data , datalen ) ;
sentbytes = nn_send ( myinfo - > reqsock , dexp , size , 0 ) ;
if ( ( recvbytes = nn_recv ( myinfo - > reqsock , & retptr , NN_MSG , 0 ) ) > = 0 )
{
portable_mutex_lock ( & myinfo - > dexmutex ) ;
ipbits = * retptr ;
expand_ipbits ( ipaddr , ipbits ) ;
printf ( " req returned.[%d] %08x %s \n " , recvbytes , * retptr , ipaddr ) ;
n = myinfo - > numdexipbits ;
for ( i = 0 ; i < n ; i + + )
if ( ipbits = = myinfo - > dexipbits [ i ] )
break ;
if ( i = = n & & n < 64 )
{
myinfo - > dexipbits [ n + + ] = ipbits ;
qsort ( myinfo - > dexipbits , n , sizeof ( uint32_t ) , _increasing_ipbits ) ;
if ( ( myinfo - > numdexipbits = n ) < 3 )
{
if ( myinfo - > subsock > = 0 )
nn_connect ( myinfo - > subsock , nanomsg_tcpname ( str , ipaddr , PUB_SOCK ) ) ;
}
}
portable_mutex_unlock ( & myinfo - > dexmutex ) ;
nn_connect ( myinfo - > reqsock , nanomsg_tcpname ( str , ipaddr , REP_SOCK ) ) ;
nn_freemsg ( retptr ) ;
}
free ( dexp ) ;
printf ( " DEXREQ.[%d] crc32.%08x datalen.%d sent.%d \n " , size , dexp - > crc32 , datalen , sentbytes ) ;
}
}
int32_t dex_crc32find ( struct supernet_info * myinfo , uint32_t crc32 )
{
int32_t i , firstz = - 1 ;
for ( i = 0 ; i < sizeof ( myinfo - > dexcrcs ) / sizeof ( * myinfo - > dexcrcs ) ; i + + )
{
if ( myinfo - > dexcrcs [ i ] = = crc32 )
{
//printf("NANODUPLICATE.%08x\n",crc32);
return ( - 1 ) ;
}
else if ( firstz < 0 & & myinfo - > dexcrcs [ i ] = = 0 )
firstz = i ;
}
if ( firstz < 0 )
firstz = ( rand ( ) % ( sizeof ( myinfo - > dexcrcs ) / sizeof ( * myinfo - > dexcrcs ) ) ) ;
myinfo - > dexcrcs [ firstz ] = crc32 ;
return ( firstz ) ;
}
int32_t dex_packetcheck ( struct supernet_info * myinfo , struct dex_nanomsghdr * dexp , int32_t size )
{
int32_t firstz ; uint32_t crc32 ;
if ( dexp - > version0 = = ( DEX_VERSION & 0xff ) & & dexp - > version1 = = ( ( DEX_VERSION > > 8 ) & 0xff ) )
{
if ( dexp - > datalen = = ( size - sizeof ( * dexp ) ) )
{
crc32 = calc_crc32 ( 0 , dexp - > packet , dexp - > datalen ) ;
if ( dexp - > crc32 = = crc32 & & ( firstz = dex_crc32find ( myinfo , crc32 ) ) > = 0 )
return ( 0 ) ;
}
}
return ( - 1 ) ;
}
void dex_subsock_poll ( struct supernet_info * myinfo )
{
int32_t size , n = 0 ; struct dex_nanomsghdr * dexp ;
while ( ( size = nn_recv ( myinfo - > subsock , & dexp , NN_MSG , 0 ) ) > = 0 )
{
n + + ;
if ( dex_packetcheck ( myinfo , dexp , size ) = = 0 )
{
printf ( " SUBSOCK.%08x " , dexp - > crc32 ) ;
dex_packet ( myinfo , dexp , size ) ;
}
if ( dexp ! = 0 )
nn_freemsg ( dexp ) , dexp = 0 ;
if ( size = = 0 | | n + + > 100 )
break ;
}
}
# if ISNOTARYNODE
# if ISNOTARYNODE
@ -34,30 +198,12 @@ struct dpow_nanomsghdr
uint8_t senderind , version0 , version1 , packet [ ] ;
uint8_t senderind , version0 , version1 , packet [ ] ;
} PACKED ;
} PACKED ;
uint64_t dpow_ratifybest ( uint64_t refmask , struct dpow_block * bp , int8_t * lastkp ) ;
uint64_t dpow_ratifybest ( uint64_t refmask , struct dpow_block * bp , int8_t * lastkp ) ;
struct dpow_block * dpow_heightfind ( struct supernet_info * myinfo , struct dpow_info * dp , int32_t height ) ;
struct dpow_block * dpow_heightfind ( struct supernet_info * myinfo , struct dpow_info * dp , int32_t height ) ;
int32_t dpow_signedtxgen ( struct supernet_info * myinfo , struct dpow_info * dp , struct iguana_info * coin , struct dpow_block * bp , int8_t bestk , uint64_t bestmask , int32_t myind , uint32_t deprec , int32_t src_or_dest , int32_t useratified ) ;
int32_t dpow_signedtxgen ( struct supernet_info * myinfo , struct dpow_info * dp , struct iguana_info * coin , struct dpow_block * bp , int8_t bestk , uint64_t bestmask , int32_t myind , uint32_t deprec , int32_t src_or_dest , int32_t useratified ) ;
void dpow_sigscheck ( struct supernet_info * myinfo , struct dpow_info * dp , struct dpow_block * bp , int32_t myind , int32_t src_or_dest , int8_t bestk , uint64_t bestmask , uint8_t pubkeys [ 64 ] [ 33 ] , int32_t numratified ) ;
void dpow_sigscheck ( struct supernet_info * myinfo , struct dpow_info * dp , struct dpow_block * bp , int32_t myind , int32_t src_or_dest , int8_t bestk , uint64_t bestmask , uint8_t pubkeys [ 64 ] [ 33 ] , int32_t numratified ) ;
char * nanomsg_tcpname ( char * str , char * ipaddr )
{
sprintf ( str , " tcp://%s:7775 " , ipaddr ) ;
return ( str ) ;
}
static int _increasing_ipbits ( const void * a , const void * b )
{
# define uint32_a (*(uint32_t *)a)
# define uint32_b (*(uint32_t *)b)
if ( uint32_b > uint32_a )
return ( - 1 ) ;
else if ( uint32_b < uint32_a )
return ( 1 ) ;
return ( 0 ) ;
# undef uint32_a
# undef uint32_b
}
int32_t dpow_addnotary ( struct supernet_info * myinfo , struct dpow_info * dp , char * ipaddr )
int32_t dpow_addnotary ( struct supernet_info * myinfo , struct dpow_info * dp , char * ipaddr )
{
{
char str [ 512 ] ; uint32_t ipbits , * ptr ; int32_t i , iter , n , retval = - 1 ;
char str [ 512 ] ; uint32_t ipbits , * ptr ; int32_t i , iter , n , retval = - 1 ;
@ -84,7 +230,10 @@ int32_t dpow_addnotary(struct supernet_info *myinfo,struct dpow_info *dp,char *i
{
{
ptr [ n ] = ipbits ;
ptr [ n ] = ipbits ;
if ( iter = = 0 & & strcmp ( ipaddr , myinfo - > ipaddr ) ! = 0 )
if ( iter = = 0 & & strcmp ( ipaddr , myinfo - > ipaddr ) ! = 0 )
retval = nn_connect ( myinfo - > dpowsock , nanomsg_tcpname ( str , ipaddr ) ) ;
{
retval = nn_connect ( myinfo - > dpowsock , nanomsg_tcpname ( str , ipaddr , DPOW_SOCK ) ) ;
retval = nn_connect ( myinfo - > dexsock , nanomsg_tcpname ( str , ipaddr , DEX_SOCK ) ) ;
}
n + + ;
n + + ;
qsort ( ptr , n , sizeof ( uint32_t ) , _increasing_ipbits ) ;
qsort ( ptr , n , sizeof ( uint32_t ) , _increasing_ipbits ) ;
if ( iter = = 0 )
if ( iter = = 0 )
@ -112,36 +261,71 @@ void dpow_nanomsginit(struct supernet_info *myinfo,char *ipaddr)
}
}
if ( myinfo - > dpowsock < 0 & & ( myinfo - > dpowsock = nn_socket ( AF_SP , NN_BUS ) ) > = 0 )
if ( myinfo - > dpowsock < 0 & & ( myinfo - > dpowsock = nn_socket ( AF_SP , NN_BUS ) ) > = 0 )
{
{
if ( nn_bind ( myinfo - > dpowsock , nanomsg_tcpname ( str , myinfo - > ipaddr ) ) < 0 )
if ( nn_bind ( myinfo - > dpowsock , nanomsg_tcpname ( str , myinfo - > ipaddr , DPOW_SOCK ) ) < 0 )
{
{
printf ( " error binding to (%s) \n " , nanomsg_tcpname ( str , myinfo - > ipaddr ) ) ;
printf ( " error binding to dpowsock (%s) \n " , nanomsg_tcpname ( str , myinfo - > ipaddr , DPOW_SOCK ) ) ;
nn_close ( myinfo - > dpowsock ) ;
nn_close ( myinfo - > dpowsock ) ;
myinfo - > dpowsock = - 1 ;
myinfo - > dpowsock = - 1 ;
}
}
timeout = 1000 ;
else
nn_setsockopt ( myinfo - > dpowsock , NN_SOL_SOCKET , NN_RCVTIMEO , & timeout , sizeof ( timeout ) ) ;
myinfo - > dpowipbits [ 0 ] = ( uint32_t ) calc_ipbits ( myinfo - > ipaddr ) ;
myinfo - > numdpowipbits = 1 ;
}
dpow_addnotary ( myinfo , 0 , ipaddr ) ;
}
int32_t dpow_crc32find ( struct supernet_info * myinfo , struct dpow_info * dp , uint32_t crc32 , uint32_t channel )
{
int32_t i , firstz = - 1 ;
for ( i = 0 ; i < sizeof ( dp - > crcs ) / sizeof ( * dp - > crcs ) ; i + + )
{
if ( dp - > crcs [ i ] = = crc32 )
{
{
//printf("NANODUPLICATE.%08x\n",crc32);
if ( myinfo - > dexsock < 0 & & ( myinfo - > dexsock = nn_socket ( AF_SP , NN_BUS ) ) > = 0 )
return ( - 1 ) ;
{
if ( nn_bind ( myinfo - > dexsock , nanomsg_tcpname ( str , myinfo - > ipaddr , DEX_SOCK ) ) < 0 )
{
printf ( " error binding to dexsock (%s) \n " , nanomsg_tcpname ( str , myinfo - > ipaddr , DEX_SOCK ) ) ;
nn_close ( myinfo - > dexsock ) ;
myinfo - > dexsock = - 1 ;
nn_close ( myinfo - > dpowsock ) ;
myinfo - > dpowsock = - 1 ;
}
else
{
if ( myinfo - > pubsock < 0 & & ( myinfo - > pubsock = nn_socket ( AF_SP , NN_PUB ) ) > = 0 )
{
if ( nn_bind ( myinfo - > pubsock , nanomsg_tcpname ( str , myinfo - > ipaddr , PUB_SOCK ) ) < 0 )
{
printf ( " error binding to pubsock (%s) \n " , nanomsg_tcpname ( str , myinfo - > ipaddr , PUB_SOCK ) ) ;
nn_close ( myinfo - > pubsock ) ;
myinfo - > pubsock = - 1 ;
nn_close ( myinfo - > dexsock ) ;
myinfo - > dexsock = - 1 ;
nn_close ( myinfo - > dpowsock ) ;
myinfo - > dpowsock = - 1 ;
}
else
{
if ( myinfo - > repsock < 0 & & ( myinfo - > repsock = nn_socket ( AF_SP , NN_REP ) ) > = 0 )
{
if ( nn_bind ( myinfo - > repsock , nanomsg_tcpname ( str , myinfo - > ipaddr , REP_SOCK ) ) < 0 )
{
printf ( " error binding to repsock (%s) \n " , nanomsg_tcpname ( str , myinfo - > ipaddr , REP_SOCK ) ) ;
nn_close ( myinfo - > repsock ) ;
myinfo - > repsock = - 1 ;
nn_close ( myinfo - > pubsock ) ;
myinfo - > pubsock = - 1 ;
nn_close ( myinfo - > dexsock ) ;
myinfo - > dexsock = - 1 ;
nn_close ( myinfo - > dpowsock ) ;
myinfo - > dpowsock = - 1 ;
}
else
{
myinfo - > dpowipbits [ 0 ] = ( uint32_t ) calc_ipbits ( myinfo - > ipaddr ) ;
myinfo - > numdpowipbits = 1 ;
timeout = 1000 ;
nn_setsockopt ( myinfo - > dpowsock , NN_SOL_SOCKET , NN_RCVTIMEO , & timeout , sizeof ( timeout ) ) ;
nn_setsockopt ( myinfo - > dexsock , NN_SOL_SOCKET , NN_RCVTIMEO , & timeout , sizeof ( timeout ) ) ;
nn_setsockopt ( myinfo - > repsock , NN_SOL_SOCKET , NN_RCVTIMEO , & timeout , sizeof ( timeout ) ) ;
}
}
}
}
}
}
}
}
else if ( firstz < 0 & & dp - > crcs [ i ] = = 0 )
firstz = i ;
}
}
if ( firstz < 0 )
dpow_addnotary ( myinfo , 0 , ipaddr ) ;
firstz = ( rand ( ) % ( sizeof ( dp - > crcs ) / sizeof ( * dp - > crcs ) ) ) ;
return ( firstz ) ;
}
}
void dpow_nanoutxoset ( struct dpow_nanoutxo * np , struct dpow_block * bp , int32_t isratify )
void dpow_nanoutxoset ( struct dpow_nanoutxo * np , struct dpow_block * bp , int32_t isratify )
@ -446,44 +630,41 @@ void dpow_send(struct supernet_info *myinfo,struct dpow_info *dp,struct dpow_blo
{
{
struct dpow_nanomsghdr * np ; int32_t i , size , sentbytes = 0 ; uint32_t crc32 ;
struct dpow_nanomsghdr * np ; int32_t i , size , sentbytes = 0 ; uint32_t crc32 ;
crc32 = calc_crc32 ( 0 , data , datalen ) ;
crc32 = calc_crc32 ( 0 , data , datalen ) ;
//if ( (firstz= dpow_crc32find(myinfo,crc32,channel)) >= 0 )
//dp->crcs[firstz] = crc32;
size = ( int32_t ) ( sizeof ( * np ) + datalen ) ;
np = calloc ( 1 , size ) ; // endian dependent!
if ( ( np - > numipbits = dp - > numipbits ) = = 0 )
{
{
//dp->crcs[firstz] = crc32;
dp - > ipbits [ 0 ] = myinfo - > myaddr . myipbits ;
size = ( int32_t ) ( sizeof ( * np ) + datalen ) ;
np - > numipbits = dp - > numipbits = 1 ;
np = calloc ( 1 , size ) ; // endian dependent!
if ( ( np - > numipbits = dp - > numipbits ) = = 0 )
{
dp - > ipbits [ 0 ] = myinfo - > myaddr . myipbits ;
np - > numipbits = dp - > numipbits = 1 ;
}
np - > senderind = bp - > myind ;
memcpy ( np - > ipbits , dp - > ipbits , dp - > numipbits * sizeof ( * dp - > ipbits ) ) ;
//for (i=0; i<np->numipbits; i++)
// printf("%08x ",np->ipbits[i]);
//printf(" dpow_send.(%d) size.%d numipbits.%d myind.%d\n",datalen,size,np->numipbits,bp->myind);
if ( bp - > isratify = = 0 )
dpow_nanoutxoset ( & np - > notarize , bp , 0 ) ;
else dpow_nanoutxoset ( & np - > ratify , bp , 1 ) ;
np - > size = size ;
np - > datalen = datalen ;
np - > crc32 = crc32 ;
for ( i = 0 ; i < 2 ; i + + )
np - > ratify . pendingcrcs [ i ] = bp - > pendingcrcs [ i ] ;
for ( i = 0 ; i < 32 ; i + + )
np - > srchash . bytes [ i ] = dp - > minerkey33 [ i + 1 ] ;
//np->srchash = srchash;
np - > desthash = desthash ;
np - > channel = channel ;
np - > height = msgbits ;
np - > myipbits = myinfo - > myaddr . myipbits ;
strcpy ( np - > symbol , dp - > symbol ) ;
np - > version0 = DPOW_VERSION & 0xff ;
np - > version1 = ( DPOW_VERSION > > 8 ) & 0xff ;
memcpy ( np - > packet , data , datalen ) ;
sentbytes = nn_send ( myinfo - > dpowsock , np , size , 0 ) ;
free ( np ) ;
//printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->crc32,datalen);
}
}
np - > senderind = bp - > myind ;
memcpy ( np - > ipbits , dp - > ipbits , dp - > numipbits * sizeof ( * dp - > ipbits ) ) ;
//for (i=0; i<np->numipbits; i++)
// printf("%08x ",np->ipbits[i]);
//printf(" dpow_send.(%d) size.%d numipbits.%d myind.%d\n",datalen,size,np->numipbits,bp->myind);
if ( bp - > isratify = = 0 )
dpow_nanoutxoset ( & np - > notarize , bp , 0 ) ;
else dpow_nanoutxoset ( & np - > ratify , bp , 1 ) ;
np - > size = size ;
np - > datalen = datalen ;
np - > crc32 = crc32 ;
for ( i = 0 ; i < 2 ; i + + )
np - > ratify . pendingcrcs [ i ] = bp - > pendingcrcs [ i ] ;
for ( i = 0 ; i < 32 ; i + + )
np - > srchash . bytes [ i ] = dp - > minerkey33 [ i + 1 ] ;
//np->srchash = srchash;
np - > desthash = desthash ;
np - > channel = channel ;
np - > height = msgbits ;
np - > myipbits = myinfo - > myaddr . myipbits ;
strcpy ( np - > symbol , dp - > symbol ) ;
np - > version0 = DPOW_VERSION & 0xff ;
np - > version1 = ( DPOW_VERSION > > 8 ) & 0xff ;
memcpy ( np - > packet , data , datalen ) ;
sentbytes = nn_send ( myinfo - > dpowsock , np , size , 0 ) ;
free ( np ) ;
//printf("NANOSEND ht.%d channel.%08x (%d) crc32.%08x datalen.%d\n",np->height,np->channel,size,np->crc32,datalen);
}
}
void dpow_ipbitsadd ( struct supernet_info * myinfo , struct dpow_info * dp , uint32_t * ipbits , int32_t numipbits , int32_t fromid , uint32_t senderipbits )
void dpow_ipbitsadd ( struct supernet_info * myinfo , struct dpow_info * dp , uint32_t * ipbits , int32_t numipbits , int32_t fromid , uint32_t senderipbits )
@ -530,9 +711,10 @@ void dpow_ipbitsadd(struct supernet_info *myinfo,struct dpow_info *dp,uint32_t *
void dpow_nanomsg_update ( struct supernet_info * myinfo )
void dpow_nanomsg_update ( struct supernet_info * myinfo )
{
{
int32_t i , n = 0 , size , firstz = - 1 ; uint32_t crc32 ; struct dpow_nanomsghdr * np ; struct dpow_info * dp ; struct dpow_block * bp ;
int32_t i , n = 0 , num = 0 , size , firstz = - 1 ; uint32_t crc32 , r , m ; struct dpow_nanomsghdr * np = 0 ; struct dpow_info * dp ; struct dpow_block * bp ; struct dex_nanomsghdr * dexp = 0 ;
while ( ( size = nn_recv ( myinfo - > dpowsock , & np , NN_MSG , 0 ) ) > = 0 )
while ( ( size = nn_recv ( myinfo - > dpowsock , & np , NN_MSG , 0 ) ) > = 0 )
{
{
num + + ;
if ( size > = 0 )
if ( size > = 0 )
{
{
if ( np - > version0 = = ( DPOW_VERSION & 0xff ) & & np - > version1 = = ( ( DPOW_VERSION > > 8 ) & 0xff ) )
if ( np - > version0 = = ( DPOW_VERSION & 0xff ) & & np - > version1 = = ( ( DPOW_VERSION > > 8 ) & 0xff ) )
@ -550,7 +732,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo)
break ;
break ;
}
}
}
}
if ( dp ! = 0 & & crc32 = = np - > crc32 ) //&& (firstz= dpow_crc32find(myinfo,dp,crc32,np->channel)) >= 0 )
if ( dp ! = 0 & & crc32 = = np - > crc32 )
{
{
//char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz);
//char str[65]; printf("%s RECV ht.%d ch.%08x (%d) crc32.%08x:%08x datalen.%d:%d firstz.%d\n",bits256_str(str,np->srchash),np->height,np->channel,size,np->crc32,crc32,np->datalen,(int32_t)(size - sizeof(*np)),firstz);
if ( i = = myinfo - > numdpows )
if ( i = = myinfo - > numdpows )
@ -560,7 +742,7 @@ void dpow_nanomsg_update(struct supernet_info *myinfo)
dpow_ipbitsadd ( myinfo , dp , np - > ipbits , np - > numipbits , np - > senderind , np - > myipbits ) ;
dpow_ipbitsadd ( myinfo , dp , np - > ipbits , np - > numipbits , np - > senderind , np - > myipbits ) ;
if ( ( bp = dpow_heightfind ( myinfo , dp , np - > height ) ) ! = 0 & & bp - > state ! = 0xffffffff )
if ( ( bp = dpow_heightfind ( myinfo , dp , np - > height ) ) ! = 0 & & bp - > state ! = 0xffffffff )
{
{
if ( np - > senderind > = 0 & & np - > senderind < bp - > numnotaries & & memcmp ( bp - > notaries [ np - > senderind ] . pubkey + 1 , np - > srchash . bytes , 32 ) = = 0 )
if ( np - > senderind > = 0 & & np - > senderind < bp - > numnotaries & & memcmp ( bp - > notaries [ np - > senderind ] . pubkey + 1 , np - > srchash . bytes , 32 ) = = 0 & & bits256_nonz ( np - > srchash ) ! = 0 )
{
{
if ( bp - > isratify = = 0 )
if ( bp - > isratify = = 0 )
dpow_nanoutxoget ( myinfo , dp , bp , & np - > notarize , 0 , np - > senderind ) ;
dpow_nanoutxoget ( myinfo , dp , bp , & np - > notarize , 0 , np - > senderind ) ;
@ -573,14 +755,52 @@ void dpow_nanomsg_update(struct supernet_info *myinfo)
}
}
} //else printf("ignore np->datalen.%d %d (size %d - %ld)\n",np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np));
} //else printf("ignore np->datalen.%d %d (size %d - %ld)\n",np->datalen,(int32_t)(size-sizeof(*np)),size,sizeof(*np));
}
}
if ( np ! = 0 )
nn_freemsg ( np ) ;
}
}
if ( np ! = 0 )
nn_freemsg ( np ) , np = 0 ;
if ( size = = 0 | | n + + > 100 )
if ( size = = 0 | | n + + > 100 )
break ;
break ;
}
}
if ( 0 & & n ! = 0 )
if ( 0 & & n ! = 0 )
printf ( " nanoupdates.%d \n " , n ) ;
printf ( " nanoupdates.%d \n " , n ) ;
n = 0 ;
while ( ( size = nn_recv ( myinfo - > dexsock , & dexp , NN_MSG , 0 ) ) > = 0 )
{
num + + ;
if ( dex_packetcheck ( myinfo , dexp , size ) = = 0 )
{
printf ( " FROM BUS.%08x -> pub \n " , dexp - > crc32 ) ;
nn_send ( myinfo - > pubsock , dexp , size , 0 ) ;
dex_packet ( myinfo , dexp , size ) ;
}
if ( dexp ! = 0 )
nn_freemsg ( dexp ) , dexp = 0 ;
if ( size = = 0 | | n + + > 100 )
break ;
}
n = 0 ;
if ( num = = 0 )
{
while ( ( size = nn_recv ( myinfo - > repsock , & dexp , NN_MSG , 0 ) ) > = 0 )
{
num + + ;
if ( dex_packetcheck ( myinfo , dexp , size ) = = 0 )
{
nn_send ( myinfo - > dexsock , dexp , size , 0 ) ;
if ( ( m = myinfo - > numdpowipbits ) > 0 )
{
r = myinfo - > dpowipbits [ rand ( ) % m ] ;
nn_send ( myinfo - > repsock , & r , sizeof ( r ) , 0 ) ;
printf ( " REP.%08x -> dexbus, rep.%08x " , dexp - > crc32 , r ) ;
}
dex_packet ( myinfo , dexp , size ) ;
}
if ( dexp ! = 0 )
nn_freemsg ( dexp ) , dexp = 0 ;
if ( size = = 0 | | n + + > 100 )
break ;
}
}
}
}
# else
# else
@ -617,7 +837,7 @@ int32_t dpow_opreturnscript(uint8_t *script,uint8_t *opret,int32_t opretlen)
return ( opretlen + offset ) ;
return ( opretlen + offset ) ;
}
}
int32_t dpow_rwopret ( int32_t rwflag , uint8_t * opret , bits256 * hashmsg , int32_t * heightmsgp , char * src , struct dpow_block * bp , int32_t src_or_dest )
int32_t dpow_rwopret ( int32_t rwflag , uint8_t * opret , bits256 * hashmsg , int32_t * heightmsgp , char * src , uint8_t * extras , int32_t extralen , struct dpow_block * bp , int32_t src_or_dest )
{
{
int32_t i , opretlen = 0 ; //bits256 beacon,beacons[DPOW_MAXRELAYS];
int32_t i , opretlen = 0 ; //bits256 beacon,beacons[DPOW_MAXRELAYS];
opretlen + = iguana_rwbignum ( rwflag , & opret [ opretlen ] , sizeof ( * hashmsg ) , hashmsg - > bytes ) ;
opretlen + = iguana_rwbignum ( rwflag , & opret [ opretlen ] , sizeof ( * hashmsg ) , hashmsg - > bytes ) ;
@ -651,6 +871,11 @@ int32_t dpow_rwopret(int32_t rwflag,uint8_t *opret,bits256 *hashmsg,int32_t *hei
opret [ opretlen + + ] = src [ i ] ;
opret [ opretlen + + ] = src [ i ] ;
}
}
opret [ opretlen + + ] = 0 ;
opret [ opretlen + + ] = 0 ;
if ( extras ! = 0 & & extralen > 0 )
{
memcpy ( & opret [ opretlen ] , extras , extralen ) ;
opretlen + = extralen ;
}
}
}
else
else
{
{
@ -742,7 +967,7 @@ uint32_t komodo_assetmagic(char *symbol,uint64_t supply)
return ( calc_crc32 ( 0 , buf , len ) ) ;
return ( calc_crc32 ( 0 , buf , len ) ) ;
}
}
int32_t komodo_shortflag ( char * symbol )
/*int32_t komodo_shortflag(char *symbol)
{
{
int32_t i , shortflag = 0 ;
int32_t i , shortflag = 0 ;
if ( symbol [ 0 ] = = ' - ' )
if ( symbol [ 0 ] = = ' - ' )
@ -753,18 +978,17 @@ int32_t komodo_shortflag(char *symbol)
symbol [ i ] = 0 ;
symbol [ i ] = 0 ;
}
}
return ( shortflag ) ;
return ( shortflag ) ;
}
} */
uint16_t komodo_assetport ( uint32_t magic , int32_t shortflag )
uint16_t komodo_assetport ( uint32_t magic )
{
{
return ( 8000 + shortflag * 7777 + ( magic % 7777 ) ) ;
return ( 8000 + ( magic % 7777 ) ) ;
}
}
uint16_t komodo_port ( char * symbol , uint64_t supply , uint32_t * magicp , int32_t * shortflagp )
uint16_t komodo_port ( char * symbol , uint64_t supply , uint32_t * magicp )
{
{
* magicp = komodo_assetmagic ( symbol , supply ) ;
* magicp = komodo_assetmagic ( symbol , supply ) ;
* shortflagp = komodo_shortflag ( symbol ) ;
return ( komodo_assetport ( * magicp ) ) ;
return ( komodo_assetport ( * magicp , * shortflagp ) ) ;
}
}
# define MAX_CURRENCIES 32
# define MAX_CURRENCIES 32
@ -773,7 +997,7 @@ extern char CURRENCIES[][8];
void komodo_assetcoins ( )
void komodo_assetcoins ( )
{
{
uint16_t extract_userpass ( char * serverport , char * userpass , char * coinstr , char * userhome , char * coindir , char * confname ) ;
uint16_t extract_userpass ( char * serverport , char * userpass , char * coinstr , char * userhome , char * coindir , char * confname ) ;
int32_t i , j , shortflag ; uint32_t magic ; cJSON * json ; uint16_t port ; long filesize ; char * userhome , confstr [ 16 ] , jsonstr [ 512 ] , magicstr [ 9 ] , path [ 512 ] ; struct iguana_info * coin ;
int32_t i , j ; uint32_t magic ; cJSON * json ; uint16_t port ; long filesize ; char * userhome , confstr [ 16 ] , jsonstr [ 512 ] , magicstr [ 9 ] , path [ 512 ] ; struct iguana_info * coin ;
if ( ( userhome = OS_filestr ( & filesize , " userhome.txt " ) ) = = 0 )
if ( ( userhome = OS_filestr ( & filesize , " userhome.txt " ) ) = = 0 )
userhome = " root " ;
userhome = " root " ;
else
else
@ -783,7 +1007,7 @@ void komodo_assetcoins()
}
}
for ( i = 0 ; i < MAX_CURRENCIES ; i + + )
for ( i = 0 ; i < MAX_CURRENCIES ; i + + )
{
{
port = komodo_port ( CURRENCIES [ i ] , 10 , & magic , & shortflag ) ;
port = komodo_port ( CURRENCIES [ i ] , 10 , & magic ) ;
for ( j = 0 ; j < 4 ; j + + )
for ( j = 0 ; j < 4 ; j + + )
sprintf ( & magicstr [ j * 2 ] , " %02x " , ( ( uint8_t * ) & magic ) [ j ] ) ;
sprintf ( & magicstr [ j * 2 ] , " %02x " , ( ( uint8_t * ) & magic ) [ j ] ) ;
magicstr [ j * 2 ] = 0 ;
magicstr [ j * 2 ] = 0 ;