From 5d37c531665f37eda8c4db367aa209682287511c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 28 Jan 2016 00:47:07 -0300 Subject: [PATCH] test --- iguana/SuperNET_category.c | 120 ++++++++++++++++++++++++++++++++----- iguana/iguana_chains.c | 4 +- iguana/iguana_init.c | 2 +- iguana/iguana_msg.c | 8 ++- iguana/main.c | 3 +- 5 files changed, 115 insertions(+), 22 deletions(-) diff --git a/iguana/SuperNET_category.c b/iguana/SuperNET_category.c index 0ada22550..c77b4b195 100644 --- a/iguana/SuperNET_category.c +++ b/iguana/SuperNET_category.c @@ -85,34 +85,124 @@ struct category_info *category_processfunc(bits256 categoryhash,int32_t (*proces return(0); } -struct category_info *category_blockhashfunc(bits256 categoryhash,bits256 subhash,int32_t (*blockhash_func)(void *blockhashp,void *data,int32_t datalen)) +struct category_chain { - struct category_info *cat; - if ( (cat= category_find(categoryhash,subhash)) != 0 ) + int32_t hashlen,addrlen; + struct supernet_info *myinfo; + void *categoryinfo,*subinfo; + int32_t (*blockhash_func)(struct category_chain *cchain,void *blockhashp,void *data,int32_t datalen); + bits256 (*stake_func)(struct category_chain *cchain,void *addr,int32_t addrlen); +}; + +int32_t category_default_blockhash(struct category_chain *cchain,void *blockhashp,void *data,int32_t datalen) +{ + bits256 hash; + vcalc_sha256(0,hash.bytes,data,datalen); + vcalc_sha256(0,blockhashp,hash.bytes,sizeof(hash)); + return(sizeof(*blockhashp)); +} + +bits256 category_default_stake(struct category_chain *cchain,void *addr,int32_t addrlen) +{ + bits256 stake; + memset(stake.bytes,0,sizeof(stake)); + stake.txid = ((uint64_t)1 << 63); + return(stake); +} + +bits256 catgory_default_hit(struct supernet_info *myinfo,void *categoryinfo,void *subinfo,int32_t height,void *prevgenerator,void *addr,int32_t addrlen,void *blockhashp,int32_t hashlen) +{ + bits256 hash; bits256 rawhit,hit; + memset(rawhit.bytes,0,sizeof(rawhit)); + memset(hit.bytes,0,sizeof(hit)); + vcalc_sha256cat(hash.bytes,prevgenerator,addrlen,addr,addrlen); + hit = category_default_stake(*(void **)categoryinfo,addr,addrlen); + rawhit.txid = hash.txid % ((uint64_t)1 << 42); + if ( rawhit.txid != 0 ) + hit.txid /= rawhit.txid; + return(hit); +} + +// WARNING: toy implementation assumes only one category chain +bits256 category_default_func(struct supernet_info *myinfo,int32_t func,void *categoryinfo,void *subinfo,int32_t height,void *prevgenerator,void *addr,int32_t addrlen,void *blockhashp,int32_t hashlen,bits256 heaviest) +{ + static int maxblocknum; static bits256 *weights,*blocks,category_hwm,zero; + if ( hashlen != sizeof(bits256) || addrlen != sizeof(bits256) ) { - cat->blockhash_func = blockhash_func; - return(cat); + printf("unsupported hashlen.%d or addrlen.%d\n",hashlen,addrlen); + return(zero); } - return(0); + if ( height > maxblocknum + (func == 'S') ) + { + printf("error func.%c setting heaviest. skipped %d -> %d?\n",func,maxblocknum,height); + return(category_hwm); + } + if ( func == 'H' ) + return(category_hwm); + else if ( func == 'S' ) + { + category_hwm = heaviest; + if ( height > maxblocknum ) + { + weights = realloc(weights,(maxblocknum+1) * sizeof(*weights)); + blocks = realloc(blocks,(maxblocknum+1) * sizeof(*blocks)); + } + maxblocknum = height; + weights[height] = heaviest; + if ( blockhashp != 0 ) + memcpy(&blocks[height],blockhashp,sizeof(blocks[height])); + } + else if ( func == 'B' ) + { + if ( height <= maxblocknum ) + return(blocks[height]); + else + { + printf("error: illegal height.%d vs max.%d\n",height,maxblocknum); + return(zero); + } + } + else if ( func == 'W' ) + { + if ( height >= 0 && height < maxblocknum ) + return(weights[height]); + else printf("error getting weight for height.%d vs maxblocknum.%d\n",height,maxblocknum); + } + return(category_hwm); } -struct category_info *category_hitfunc(bits256 categoryhash,bits256 subhash,uint64_t (*hit_func)(struct supernet_info *myinfo,void *categoryinfo,void *subinfo,void *addr,int32_t addrlen)) +#define category_default_heaviest() category_default_func(myinfo,'H',categoryinfo,subinfo,0,0,0,0,0,0,zero) +#define category_default_setheaviest(height,blockhashp,heaviest) category_default_func(myinfo,'S',categoryinfo,subinfo,height,0,0,0,blockhashp,hashlen,zero) +#define category_default_weight(height) category_default_func(myinfo,'W',categoryinfo,subinfo,height,0,0,0,0,0,zero) +#define category_default_blockfind(height) category_default_func(myinfo,'B',categoryinfo,subinfo,height,0,0,0,0,0,zero) + +int32_t category_default_ishwm(struct supernet_info *myinfo,void *categoryinfo,void *subinfo,int32_t prevheight,void *prevblockhashp,void *blockhashp,int32_t hashlen,void *prevgenerator,void *addr,int32_t addrlen) { - struct category_info *cat; - if ( (cat= category_find(categoryhash,subhash)) != 0 ) + bits256 checkhash,prevwt,oldhit,hit,heaviest; static bits256 zero; + checkhash = category_default_blockfind(prevheight); + if ( memcmp(checkhash.bytes,prevblockhashp,hashlen) == 0 ) { - cat->hit_func = hit_func; - return(cat); - } - return(0); + heaviest = category_default_heaviest(); + prevwt = category_default_weight(prevheight); + oldhit = category_default_weight(prevheight+1); + hit = catgory_default_hit(myinfo,categoryinfo,subinfo,prevheight+1,prevgenerator,addr,addrlen,blockhashp,hashlen); + if ( hit.txid > oldhit.txid && prevwt.txid+hit.txid > heaviest.txid ) + { + heaviest.txid = (prevwt.txid + hit.txid); + category_default_setheaviest(prevheight+1,blockhashp,heaviest); + return(prevheight+1); + } + + } else return(-2); + return(-1); } -struct category_info *category_ishwmfunc(bits256 categoryhash,bits256 subhash,int32_t (*ishwm_func)(struct supernet_info *myinfo,void *categoryinfo,void *subinfo,void *blockhashp,int32_t hashlen,int32_t heighthint,uint64_t hwmwt,uint64_t prevwt,uint64_t hit)) +struct category_info *category_chain_functions(bits256 categoryhash,bits256 subhash,int32_t (*blockhash_func)(void *blockhashp,void *data,int32_t datalen)) { struct category_info *cat; if ( (cat= category_find(categoryhash,subhash)) != 0 ) { - cat->ishwm_func = ishwm_func; + cat->blockhash_func = blockhash_func; return(cat); } return(0); diff --git a/iguana/iguana_chains.c b/iguana/iguana_chains.c index b06ab97a9..c93848a85 100755 --- a/iguana/iguana_chains.c +++ b/iguana/iguana_chains.c @@ -64,8 +64,8 @@ static struct iguana_chain Chains[] = "vpncoin", "VPN", 71, 5, 199, // PUBKEY_ADDRESS + SCRIPT_ADDRESS addrman.h, use wif2priv API on any valid wif "\xfb\xc0\xb6\xdb", // pchMessageStart main.cpp - "3b27c25b333e890fbb6cd912fcdfb07bf17245def80410a0a05a8eae070b2060", - //"00000ac7d764e7119da60d3c832b1d4458da9bc9ef9d5dd0d91a15f690a46d99", // hashGenesisBlock main.h + //"aaea16b9b820180153d9cd069dbfd54764f07cb49c71987163132a72d568cb14", + "00000ac7d764e7119da60d3c832b1d4458da9bc9ef9d5dd0d91a15f690a46d99", // hashGenesisBlock main.h "01000000000000000000000000000000000000000000000000000000000000000000000028581b3ba53e73adaaf957bced1d42d46ed0d84a86b34f7a5a49cdcaa1938a6940540854ffff0f1e78b20100010100000040540854010000000000000000000000000000000000000000000000000000000000000000ffffffff2404ffff001d01041c5468752c20342053657020323031342031323a30303a303020474d54ffffffff01000000000000000000000000000000", // need to extract from valid blk0001.dat 1920,1921,1,0x1e // port and rpcport vpncoin.conf }, diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index e3a936ad1..bfc26cb25 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -213,7 +213,7 @@ void iguana_parseline(struct iguana_info *coin,int32_t iter,FILE *fp) //printf("parse line.(%s) maxpeers.%d\n",line,coin->MAXPEERS); if ( iter == 0 ) { - if ( m < 7 )//(2*coin->MAXPEERS)/3 )//&& m < 77.7 ) + if ( m < (2*coin->MAXPEERS)/3 )//&& m < 77.7 ) { if ( 0 && m == 0 ) { diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 421687307..a1dfb2119 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -45,7 +45,7 @@ int32_t iguana_rwversion(int32_t rwflag,uint8_t *serialized,struct iguana_msgver len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->nStartingHeight),&msg->nStartingHeight); if ( readsize == 117 ) { - uint32_t iVer = 1132,v_Network_id=0; uint16_t wPort=0,wCtPort=0,wPrPort=0; uint8_t bIsGui=0; + uint32_t iVer = 1132,v_Network_id=1; uint16_t wPort=1920,wCtPort=0,wPrPort=0; uint8_t bIsGui=0; len += iguana_rwnum(rwflag,&serialized[len],sizeof(iVer),&iVer); len += iguana_rwnum(rwflag,&serialized[len],sizeof(v_Network_id),&v_Network_id); len += iguana_rwnum(rwflag,&serialized[len],sizeof(wPort),&wPort); @@ -76,6 +76,8 @@ int32_t iguana_rwversion(int32_t rwflag,uint8_t *serialized,struct iguana_msgver return(len); } +// 06000000996da490f6151ad9d05d9defc99bda58441d2b833c0da69d11e764d7c70a00003378a650b506a66b41097a0b513f2fee899788711bc6643ff976ce6dbb0b620c5f800854ffff0f1e0004de0301010000005e800854010000000000000000000000000000000000000000000000000000000000000000ffffffff03510102ffffffff0100008a5d784563011976a9145166e6e52de58dfacb18670c0030aedcf295233988ac000000000000 + int32_t iguana_rwblock(int32_t rwflag,bits256 *hash2p,uint8_t *serialized,struct iguana_msgblock *msg) { int32_t len = 0; char blockhash[65]; uint64_t x; @@ -86,7 +88,7 @@ int32_t iguana_rwblock(int32_t rwflag,bits256 *hash2p,uint8_t *serialized,struct len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->H.bits),&msg->H.bits); len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->H.nonce),&msg->H.nonce); *hash2p = bits256_doublesha256(blockhash,serialized,len); - //printf("len.%d: block version.%d timestamp.%u bits.%x nonce.%u prev.(%s) %llx blockhash.(%s) %llx\n",len,msg->H.version,msg->H.timestamp,msg->H.bits,msg->H.nonce,bits256_str(str,msg->H.prev_block),(long long)msg->H.merkle_root.txid,blockhash,(long long)hash2p->txid); + char str[65]; printf("len.%d: block version.%d timestamp.%u bits.%x nonce.%u prev.(%s) %llx blockhash.(%s) %llx\n",len,msg->H.version,msg->H.timestamp,msg->H.bits,msg->H.nonce,bits256_str(str,msg->H.prev_block),(long long)msg->H.merkle_root.txid,blockhash,(long long)hash2p->txid); if ( rwflag != 0 ) x = msg->txn_count; len += iguana_rwvarint(rwflag,&serialized[len],&x); @@ -194,7 +196,7 @@ int32_t iguana_send_VPNversion(struct iguana_info *coin,struct iguana_peer *addr msg.nVersion = PROTOCOL_VERSION; msg.nServices = myservices; msg.nTime = (int64_t)time(NULL); - msg.nonce = coin->instance_nonce; + msg.nonce = 0;//coin->instance_nonce; sprintf(msg.strSubVer,"/Satoshi:0.11.99/"); msg.nStartingHeight = coin->blocks.hwmchain.height; len = iguana_rwversion(1,&serialized[sizeof(struct iguana_msghdr)],(void *)&msg,addr->ipaddr,117); diff --git a/iguana/main.c b/iguana/main.c index b887e350f..102d4f5a0 100644 --- a/iguana/main.c +++ b/iguana/main.c @@ -441,6 +441,7 @@ void iguana_main(void *arg) jaddbits256(json,"persistent_pub",myinfo->myaddr.persistent); compressed = calloc(1,maxsize); serialized = calloc(1,maxsize); + jadd64bits(json,"rand",rand()); char *str = jprint(json,0); if ( strcmp("confs/iguana.conf",fname) != 0 ) { @@ -500,7 +501,7 @@ void iguana_main(void *arg) #ifdef __APPLE__ sleep(1); char *str; - if ( (str= SuperNET_JSON(&MYINFO,cJSON_Parse("{\"wallet\":\"password\",\"agent\":\"iguana\",\"method\":\"addcoin\",\"services\":129,\"maxpeers\":32,\"newcoin\":\"VPN\",\"active\":0}"),0)) != 0 ) + if ( (str= SuperNET_JSON(&MYINFO,cJSON_Parse("{\"wallet\":\"password\",\"agent\":\"iguana\",\"method\":\"addcoin\",\"services\":0,\"maxpeers\":128,\"newcoin\":\"VPN\",\"active\":1}"),0)) != 0 ) { printf("got.(%s)\n",str); free(str);