struct NXT_assettxid *add_NXT_assettxid(struct NXT_asset **app,char *assetid,struct NXThandler_info *mp,cJSON *obj,char *txid)
{
    int32_t createdflag;
    struct NXT_asset *ap;
    struct NXT_assettxid *tp;
    if ( obj != 0 )
    {
        copy_cJSON(assetid,obj);
       // printf("add_NXT_assettxid A\n");
        *app = ap = MTadd_hashtable(&createdflag,mp->NXTassets_tablep,assetid);
        if ( createdflag != 0 )
            ap->assetbits = calc_nxt64bits(assetid);
        //printf("add_NXT_assettxid B\n");
        tp = MTadd_hashtable(&createdflag,mp->NXTasset_txids_tablep,txid);
        if ( createdflag != 0 )
        {
            tp->assetbits = calc_nxt64bits(assetid);
            tp->txidbits = calc_nxt64bits(txid);
            if ( ap->num >= ap->max )
            {
                ap->max = ap->num + NXT_ASSETLIST_INCR;
                ap->txids = realloc(ap->txids,sizeof(*ap->txids) * ap->max);
            }
            ap->txids[ap->num++] = tp;
            return(tp);
        }
    } else *app = 0;
    return(0);
}
void transfer_asset_balance(struct NXThandler_info *mp,struct NXT_assettxid *tp,uint64_t assetbits,char *sender,char *receiver,int64_t quantity)
{
    int32_t createdflag,srcind,destind;
    struct NXT_acct *src,*dest;
    struct NXT_asset *ap;
    char assetid[MAX_NXTADDR_LEN];
    if ( sender == 0 || sender[0] == 0 || receiver == 0 || receiver[0] == 0 )
    {
        printf("illegal transfer asset (%s -> %s)\n",sender,receiver);
        return;
    }
    expand_nxt64bits(assetid,assetbits);
    //printf("transfer_asset_balance\n");
    ap = MTadd_hashtable(&createdflag,mp->NXTassets_tablep,assetid);
    if ( createdflag != 0 )
        printf("transfer_asset_balance: unexpected hashtable creation??\n");
    src = get_NXTacct(&createdflag,mp,sender);
    srcind = get_asset_in_acct(src,ap,1);
    dest = get_NXTacct(&createdflag,mp,receiver);
    destind = get_asset_in_acct(dest,ap,1);
    if ( srcind >= 0 && destind >= 0 )
    {
        src->quantities[srcind] -= quantity;
        addto_account_txlist(src,srcind,tp);
        dest->quantities[destind] += quantity;
        addto_account_txlist(dest,destind,tp);
    } else printf("error finding inds for assetid.%s %s.%d %s.%d\n",assetid,sender,srcind,receiver,destind);
}
Beispiel #3
0
char *SuperNET_gotpacket(char *msg,int32_t duration,char *ip_port)
{
    static int flood,duplicates;
    cJSON *json;
    uint16_t p2pport;
    struct pserver_info *pserver;
    uint64_t txid;
    struct sockaddr prevaddr;
    int32_t len,createdflag,valid;
    unsigned char packet[2*MAX_JSON_FIELD];
    char ipaddr[64],txidstr[64],retjsonstr[2*MAX_JSON_FIELD],verifiedNXTaddr[64],*cmdstr,*retstr;
    if ( SUPERNET_PORT != _SUPERNET_PORT )
        return(clonestr("{\"error\":private SuperNET}"));
    strcpy(retjsonstr,"{\"result\":null}");
    if ( Debuglevel > 2 )
        printf("gotpacket.(%s) duration.%d from (%s)\n",msg,duration,ip_port);
    if ( Finished_loading == 0 )
    {
        if ( is_hexstr(msg) == 0 )
        {
            //printf("QUEUE.(%s)\n",msg);
            return(block_on_SuperNET(0,msg));
        }
        return(clonestr(retjsonstr));
    }
    p2pport = parse_ipaddr(ipaddr,ip_port);
    uv_ip4_addr(ipaddr,0,(struct sockaddr_in *)&prevaddr);
    pserver = get_pserver(0,ipaddr,0,p2pport);
    len = (int32_t)strlen(msg);
    if ( is_hexstr(msg) != 0 )
    {
        len >>= 1;
        len = decode_hex(packet,len,msg);
        txid = calc_txid(packet,len);//hash,sizeof(hash));
        sprintf(txidstr,"%llu",(long long)txid);
        MTadd_hashtable(&createdflag,&Global_pNXT->msg_txids,txidstr);
        if ( createdflag == 0 )
        {
            duplicates++;
            return(clonestr("{\"error\":\"duplicate msg\"}"));
        }
        if ( (len<<1) == 30 ) // hack against flood
            flood++;
        if ( Debuglevel > 0 )
            printf("gotpacket %d | Finished_loading.%d | flood.%d duplicates.%d\n",duration,Finished_loading,flood,duplicates);
        if ( is_encrypted_packet(packet,len) != 0 )
            process_packet(0,retjsonstr,packet,len,0,&prevaddr,ipaddr,0);
        /*else if ( (obookid= is_orderbook_tx(packet,len)) != 0 )
        {
            if ( update_orderbook_tx(1,obookid,(struct orderbook_tx *)packet,txid) == 0 )
            {
                ((struct orderbook_tx *)packet)->txid = txid;
                sprintf(retjsonstr,"{\"result\":\"SuperNET_gotpacket got obbokid.%llu packet txid.%llu\"}",(long long)obookid,(long long)txid);
            } else sprintf(retjsonstr,"{\"result\":\"SuperNET_gotpacket error updating obookid.%llu\"}",(long long)obookid);
        }*/ else sprintf(retjsonstr,"{\"error\":\"SuperNET_gotpacket cant find obookid\"}");
    }
struct NXT_assettxid_list *get_asset_txlist(struct NXThandler_info *mp,struct NXT_acct *np,char *assetid)
{
    int32_t ind,createdflag;
    struct NXT_asset *ap;
    if ( assetid == 0 || assetid[0] == 0 )
        return(0);
    //printf("get_asset_txlist\n");
    ap = MTadd_hashtable(&createdflag,mp->NXTassets_tablep,assetid);
    ind = get_asset_in_acct(np,ap,0);
    if ( ind > 0 )
        return(np->txlists[ind]);
    else return(0);
}
int32_t process_NXTtransaction(struct NXThandler_info *mp,int32_t histmode,char *txid)
{
    char cmd[4096],sender[64],receiver[64],assetid[MAX_NXTADDR_LEN],*assetidstr,*commentstr = 0;
    cJSON *senderobj,*attachment,*message,*assetjson,*hashobj,*commentobj;
    unsigned char buf[4096];
    char AMstr[4096],comment[1024];
    struct NXT_AMhdr *hdr;
    struct NXT_guid *gp;
    struct NXT_asset *ap;
    struct NXT_assettxid *tp;
    int32_t createdflag,processed = 0;
    int64_t type,subtype,n,assetoshis = 0;
    union NXTtype retval;
    memset(assetid,0,sizeof(assetid));
    sprintf(cmd,"%s=getTransaction&transaction=%s",NXTSERVER,txid);
    retval = extract_NXTfield(0,cmd,0,0);
    if ( retval.json != 0 )
    {
        //printf("%s\n",cJSON_Print(retval.json));
        hdr = 0; assetidstr = 0;
        sender[0] = receiver[0] = 0;
        hashobj = cJSON_GetObjectItem(retval.json,"hash");
        if ( hashobj != 0 )
        {
            copy_cJSON((char *)buf,hashobj);
            //printf("guid add hash.%s %p %p\n",(char *)buf,mp->NXTguid_tablep,mp->NXTguid_tablep);
            gp = MTadd_hashtable(&createdflag,mp->NXTguid_tablep,(char *)buf);
            if ( createdflag != 0 )
                safecopy(gp->H.txid,txid,sizeof(gp->H.txid));
            else
            {
                printf("duplicate transaction hash??: %s already there, new tx.%s both hash.%s | Probably from history thread\n",gp->H.txid,txid,gp->guid);
                //mark_tx_hashconflict(mp,histmode,txid,gp);
                free_json(retval.json);
                return(0);
            }
        }
        type = get_cJSON_int(retval.json,"type");
        subtype = get_cJSON_int(retval.json,"subtype");

        senderobj = cJSON_GetObjectItem(retval.json,"sender");
        if ( senderobj == 0 )
            senderobj = cJSON_GetObjectItem(retval.json,"accountId");
        else if ( senderobj == 0 )
            senderobj = cJSON_GetObjectItem(retval.json,"account");
        add_NXT_acct(sender,mp,senderobj);
        add_NXT_acct(receiver,mp,cJSON_GetObjectItem(retval.json,"recipient"));

        attachment = cJSON_GetObjectItem(retval.json,"attachment");
        if ( attachment != 0 )
        {
            message = cJSON_GetObjectItem(attachment,"message");
            if ( message != 0 )
            {
                copy_cJSON(AMstr,message);
                //printf("AM message.(%s).%ld\n",AMstr,strlen(AMstr));
                n = strlen(AMstr);
                if ( (n&1) != 0 || n > 2000 )
                    printf("warning: odd message len?? %ld\n",(long)n);
                decode_hex((void *)buf,(int32_t)(n>>1),AMstr);
                hdr = (struct NXT_AMhdr *)buf;
                //printf("txid.%s NXT.%s -> NXT.%s (%s)\n",txid,sender,receiver,((struct json_AM *)buf)->jsonstr);
            }