Exemplo n.º 1
0
int32_t update_peers(struct crypto777_node *nn,struct crypto777_block *block,uint64_t peermetrics[][MAXPEERS],int32_t numpeers,int32_t packet_leverage)
{
    int32_t i;
    for (i=0; i<numpeers; i++)
        if ( block->gen.metric > peermetrics[block->blocknum][i] )
            break;
    if ( i != nn->numpeers )
    {
        crypto777_broadcast(nn,(uint8_t *)block,block->blocksize,packet_leverage,0);
        return(i);
    }
    return(-1);
}
Exemplo n.º 2
0
int32_t broadcast_if_generator(struct consensus_model *model,struct crypto777_node *nn,uint32_t blocknum)
{
    uint64_t sortbuf[MAXPEERS+1][4]; uint8_t msg[8192];
    struct crypto777_generator gen;
    struct crypto777_block *prev,*block;
    char *blockstr = 0;
    uint32_t mytimestamp;
    int32_t i,n,len,lag;
    cJSON *json;
    if ( (prev= model->blocks[blocknum-1]) == 0 )
        return(-1);
    if ( (n= calc_generators(nn,sortbuf,model,blocknum)) > 0 )
    {
        mytimestamp = (uint32_t)time(NULL);
        calc_generator(&gen,calc_stake(nn,model),nn->email,mytimestamp,prev->gen.metric,prev->gen.hash,model->POW_DIFF);
        if ( (json= generators_json(model,nn,sortbuf,n,blocknum,gen.metric)) != 0 )
        {
            blockstr = cJSON_Print(json);
            free_json(json);
            _stripwhite(blockstr,' ');
            strcpy((char *)msg,blockstr);
            //printf("node.%d (%s)\n",nn->nodeid,blockstr);
            free(blockstr);
        }
        len = (int32_t)strlen((char *)msg) + 1;
        lag = (mytimestamp - prev->timestamp);
        for (i=0; i<lag&&i<n; i++)
        {
            if ( sortbuf[i][1] == nn->nodeid )
            {
                if ( 0 && nn->nodeid == 0 )
                    printf("msg%-4d: (%s).%d\n",nn->nodeid,(char *)msg,len);
                block = generate_block(model,nn,msg,len,blocknum,mytimestamp);
                crypto777_broadcast(nn,(uint8_t *)block,block->blocksize,model->packet_leverage,0);
                nn->lastblocktimestamp = mytimestamp;
                Generator++;
                return(1);
            }
        }
    }
    return(0);
}
Exemplo n.º 3
0
void *crypto777_loop(void *args)
{
    struct crypto777_node *nn = (struct crypto777_node *)args;
    uint32_t blocknum,timestamp,i,flag,lag = 0;
    struct crypto777_block *block;
    struct consensus_model *model = calloc(1,sizeof(*model));
    memcpy(model,MODEL,sizeof(*model));
    select_peers(nn);
    //printf("crypto777_loop.(%s) nodeid.%d\n",nn->email,nn->nodeid);
    nn->lastblocknum = 0;
    nn->first_timestamp = nn->lastblocktimestamp = (uint32_t)time(NULL);
    while ( 1 )
    {
        timestamp = (uint32_t)time(NULL);
        if ( process_recvs(model,nn,timestamp) == 0 )
            msleep((500./NETWORKSIZE) * (double)(rand() % NETWORKSIZE));
        //printf("node.%d timestamp.%u\n",nn->nodeid,timestamp);
        for (i=flag=lag=0; i<nn->numpeers; i++)
            if ( model->peerblocknum[i] > 1  && model->peerblocknum[i] < nn->lastblocknum-2 && (block= model->blocks[model->peerblocknum[i]+1]) != 0 )
            {
                crypto777_broadcast(nn,(uint8_t *)block,block->blocksize,model->packet_leverage,0);
                msleep((100./NETWORKSIZE) * (double)(rand() % NETWORKSIZE));
                if ( nn->lastblocknum-model->peerblocknum[i] > lag )
                    lag = nn->lastblocknum-model->peerblocknum[i];
                //printf("node%d: issue prev.%u block.%u lag.%d max.%d\n",nn->nodeid,model->peerblocknum[i],nn->lastblocknum,nn->lastblocknum-model->peerblocknum[i],lag);
                flag++;
            }
        blocknum = (timestamp - nn->first_timestamp) / model->blockduration;
        if ( blocknum > nn->lastblocknum && timestamp > nn->lastblocktimestamp )
        {
       //printf("node.%d blocknum.%d timestamp.%d 1st %u, duration.%d\n",nn->nodeid,blocknum,timestamp,nn->first_timestamp,model->blockduration);
            broadcast_if_generator(model,nn,nn->lastblocknum+1);
            msleep((100./NETWORKSIZE) * (double)(rand() % NETWORKSIZE));
        } //else printf("node.%d blocknum.%d timestamp.%d 1st %u, duration.%d\n",nn->nodeid,blocknum,timestamp,nn->first_timestamp,model->blockduration);
    }
    return(0);
}