struct consensus_model *create_genesis(uint64_t PoW_diff,int32_t blockduration,int32_t leverage,uint64_t *stakes,int32_t num) { struct consensus_model *mp = calloc(1,sizeof(*mp)); struct crypto777_generator gen; struct crypto777_ledger *ledger = 0; uint32_t i,blocknum = 0; bits384 prev; mp->genesis_timestamp = (uint32_t)time(NULL); if ( stakes != 0 ) { ledger = calloc(1,sizeof(*ledger)); ledger->num = num, ledger->timestamp = mp->genesis_timestamp; strncpy(ledger->name,"stakeledger",sizeof(ledger->name)-1); for (i=0; i<num; i++) ledger->vals[i] = stakes[i]; mp->stakeledger = *ledger; free(ledger); } else mp->stakeid = MODEL_ROUNDROBIN; memset(prev.bytes,0,sizeof(prev)); mp->POW_DIFF = PoW_diff, mp->blockduration = blockduration, mp->packet_leverage = leverage; memset(&prev,0,sizeof(prev)); calc_generator(&gen,calc_stake(0,mp),"",0,0,prev,mp->POW_DIFF); mp->blocks[0] = sign_block(Network[0],&gen,0,0,blocknum,mp->genesis_timestamp); return(mp); }
struct crypto777_block *generate_block(struct consensus_model *model,struct crypto777_node *nn,uint8_t *msg,int32_t len,uint32_t blocknum,uint32_t timestamp) { struct crypto777_generator gen; struct crypto777_block *prev,*block = 0; if ( (prev= model->blocks[blocknum-1]) != 0 ) { calc_generator(&gen,calc_stake(nn,model),nn->email,timestamp,prev->gen.metric,prev->gen.hash,model->POW_DIFF); //printf("node.%d GENERATE.%d %.8f (%.8f + prev %.8f)\n",nn->nodeid,blocknum,dstr(gen.metric),dstr(gen.hit),dstr(prev->gen.metric)); block = sign_block(nn,&gen,msg,len,blocknum,timestamp); update_block(model,nn,model->blocks,blocknum,block,timestamp); } return(block); }
// compute an XML signature element for some text // int generate_signature( char* text_to_sign, char* signature_hex, R_RSA_PRIVATE_KEY& key ) { DATA_BLOCK block, signature_data; unsigned char signature_buf[SIGNATURE_SIZE_BINARY]; int retval; block.data = (unsigned char*)text_to_sign; block.len = (unsigned int)strlen(text_to_sign); signature_data.data = signature_buf; signature_data.len = SIGNATURE_SIZE_BINARY; retval = sign_block(block, key, signature_data); if (retval) return retval; sprint_hex_data(signature_hex, signature_data); return 0; }