Current data structures:
struct hashtable
{
char *name;
void **hashtable;
uint64_t hashsize,numsearches,numiterations,numitems;
unsigned long keyoffset,keysize,modifiedoffset,structsize;
};
struct hashpacket
{
int32_t *createdflagp,doneflag,funcid;
char *key;
struct hashtable **hp_ptr;
union { void *result; uint64_t hashval; };
};
struct NXT_guid
{
struct NXT_str H;
char guid[128 - sizeof(struct NXT_str)];
};
struct NXT_assettxid
{
struct NXT_str H;
uint64_t txidbits,assetbits,senderbits,receiverbits,quantity,price; // price 0 -> not buy/sell
struct NXT_guid *duplicatehash;
void *cointx;
char *guid,*comment;
int32_t hackattempts;
};
struct NXT_assettxid_list
{
struct NXT_assettxid **txids;
int32_t num,max;
};
struct NXT_asset
{
struct NXT_str H;
uint64_t assetbits;
struct NXT_assettxid **txids; // all transactions for this asset
int32_t max,num;
};
struct NXT_acct
{
struct NXT_str H;
struct coin_acct *coinaccts;
struct NXT_asset **assets;
uint64_t *quantities;
int32_t maxassets,numassets,numcoinaccts;
struct NXT_assettxid_list **txlists; // one list for each asset in acct
};
struct req_deposit
{
uint64_t nxt64bits,modified,AMtxidbits;
char NXTaddr[MAX_NXTADDR_LEN],NXTtxid[MAX_NXTADDR_LEN],cointxid[MAX_COINTXID_LEN];;
};
struct pubkey_info { char pubkey[128],coinaddr[64],server[64]; };
struct multisig_addr
{
char NXTaddr[MAX_NXTADDR_LEN],addr[MAX_COINADDR_LEN],redeemScript[256];
struct pubkey_info pubkeys[NUM_GATEWAYS];
int32_t m,n,coinid,rippletag;
int64_t maxunspent,unspent;
};
struct crosschain_NXTinfo
{
uint64_t AMtxidbits,asset_txid;
int32_t confirmed,pending;
};
struct crosschain_info
{
uint64_t nxt64bits;
int64_t value,assetoshis;
struct multisig_addr *msig;
struct coin_value *parent;
int32_t NXTRTflag,NXTxfermask,coin_confirmed,isinternal;
struct crosschain_NXTinfo NXT;
};
struct coin_value
{
int64_t modified,value;
struct crosschain_info *xp;
struct coin_txid *parent,*spent,*pendingspend;
union { char *script; char *coinbase; };
int32_t parent_vout,spent_vin,pending_spendvin,isconfirmed,iscoinbase,isinternal;
char coinaddr[MAX_COINADDR_LEN];
};
struct coin_txid
{
int64_t modified,height;
char txid[MAX_COINTXID_LEN];
int32_t numvins,numvouts,hasinternal;
struct coin_value **vins,**vouts;
};
struct rawtransaction
{
char *destaddrs[4];
struct coin_value *inputs[16];
int64_t amount,change,inputsum,destamounts[4];
int32_t numoutputs,numinputs;
char rawtransaction[4096],signedtransaction[4096],txid[64];
};
struct withdraw_info
{
struct server_request_header H;
uint64_t AMtxidbits;
int64_t amount,moneysent;
int32_t coinid,srcgateway,destgateway,twofactor,authenticated;
char cointxid[MAX_COINTXID_LEN],withdrawaddr[64],NXTaddr[MAX_NXTADDR_LEN],redeemtxid[MAX_NXTADDR_LEN],comment[1024];
struct rawtransaction rawtx;
};
struct unspent_info
{
int64_t maxunspent,unspent,maxavail,minavail,smallest_msigunspent;
struct coin_value **vps,*maxvp,*minvp;
int32_t maxvps,num;
char smallest_msig[128];
};
struct balance_info { int64_t deposits,transfers,withdraws,moneysends,remaining_transfers,remaining_moneysends,balance; };
struct coin_acct
{
struct balance_info funds;
struct multisig_addr **msigs;
int32_t enable_2FA,nummsigs,coinid;
char withdrawaddr[MAX_COINADDR_LEN];
};
struct replicated_coininfo // runs on all nodes and only needs NXT blockchain
{
char name[64],assetid[64];
int32_t coinid,timestamp,nummsigs,numxps,numwithdraws,pollseconds;
int64_t txfee,markeramount,NXTheight;
struct balance_info funds;
struct unspent_info unspent;
pthread_mutex_t msigs_mutex,xp_mutex;
struct crosschain_info **xps;
struct hashtable *coin_txids,*redeemtxids;
struct pingpong_queue retryassetxfer,withdrawreqs,withdraws;
queue_t errorqueue;
struct multisig_addr **msigs;
struct withdraw_info **wps;
};
struct daemon_info // only valid on nodes with access to actual bitcoind (fork) daemons, near realtime validators
{
char *name[64],*assetid[64],*internalmarker[64],*serverport[64],*userpass[64]; // prepare for one daemon for multiple coinids
int32_t min_confirms[64],blockheight[64],numinitlist[64];
int32_t numretries,mismatch,initdone[64],*initlist[64];
int32_t (*validate_coinaddr)(struct daemon_info *cp,int32_t coinid,char *coinaddr);
int32_t (*add_unique_txids)(struct daemon_info *cp,int32_t coinid,int64_t blockheight,int32_t RTmode);
int64_t (*get_blockheight)(struct daemon_info *cp,int32_t coinid);
queue_t errorqueue;
char *(*calc_rawtransaction)(struct daemon_info *cp,int32_t coinid,struct rawtransaction *rp,char *destaddr,int64_t amout);
};
struct multigateway_info // only valid if one of NUM_GATEWAYS, does actual money handling
{
struct hashtable *genaddr_txids;
struct pingpong_queue genreqs,genaddr,authenticate,sendcoin;
queue_t errorqueue;
int32_t gensocks[NUM_GATEWAYS],wdsocks[NUM_GATEWAYS],backupcount,coinid;
char gateways[NUM_GATEWAYS][64],walletbackup[256];
struct multisig_addr *(*gen_depositaddr)(struct daemon_info *cp,int32_t coinid,char *NXTaddr);
char *(*submit_withdraw)(struct daemon_info *cp,int32_t coinid,struct withdraw_info *wp,struct withdraw_info *otherwp);
pthread_mutex_t consensus_mutex;
struct withdraw_info withdrawinfos[NUM_GATEWAYS];
};
struct gateway_info
{
struct replicated_coininfo *replicants[64];
struct daemon_info *daemons[64];
struct multigateway_info *multigateways[64];
int32_t gatewayid,timestamp;
};
Feel free to ask any questions. I dont claim these are perfect,just what evolved out of the last month of coding and recoding
James