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