Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
5d37c53166
  1. 120
      iguana/SuperNET_category.c
  2. 4
      iguana/iguana_chains.c
  3. 2
      iguana/iguana_init.c
  4. 8
      iguana/iguana_msg.c
  5. 3
      iguana/main.c

120
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);

4
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
},

2
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 )
{

8
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);

3
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);

Loading…
Cancel
Save