とりあえず仮で作ってみた。
ブツ
テーブルや列などの名前は以下APIやその戻り値をヒントにしている。
- https://github.com/trezor/blockbook/blob/master/docs/api.md#get-transaction
- https://github.com/trezor/blockbook/blob/master/docs/api.md#get-address
SQLite3 (sql.js)
SQLは大文字と小文字の区別がない。なのでスネークケースで命名する。
DB&テーブル作成
ADDRESS=MEHCqJbgiNERCH3bRAtNSSD9uxPViEX1nu
sqlite3 ${ADDRESS}.sqlite3 < ./create/last.sql
sqlite3 ${ADDRESS}.sqlite3 < ./create/send_partners.sql
sqlite3 ${ADDRESS}.sqlite3 < ./create/receive_partners.sql
sqlite3 ${ADDRESS}.sqlite3 < ./create/transactions.sql
last テーブル
最新情報まとめ。
create table if not exists last (
id integer primary key not null,
count integer,
last_block_height integer,
last_txid integer,
send_value integer,
receive_value integer,
balance integer,
fee integer,
unconfirmed_balance integer,
unconfirmed_txs integer,
send_count integer,
receive_count integer,
send_address_count integer,
receive_address_count integer,
both_address_count integer,
firsted integer,
lasted integer
);
send_partners テーブル
送金したアドレスの集計表。
create table if not exists send_partners (
address text primary key not null,
value integer,
count integer,
firsted integer,
lasted integer
) without rowid;
receive_partners テーブル
受け取ったしたアドレスの集計表。
create table if not exists receive_partners (
address text primary key not null,
value integer,
count integer,
firsted integer,
lasted integer
) without rowid;
transactions テーブル
取引データ。
create table if not exists transactions (
txid text primary key not null,
is_send integer,
addresses text,
value integer,
fee integer,
confirmations integer,
block_time integer,
block_height integer
) without rowid;
IndexedDB (dexie.js)
JavaScriptではキャメルケースを使う。
テーブル作成
this.dexie = new Dexie(`${address}`); // 自分のアドレスひとつごとにDBを作成する。テーブル結合不要になる。
this.dexie.version(1).stores({
last: `++id`,
sendPartners: `address`,
receivePartners: `address`,
transactions: `txid`,
});
lastテーブルの各プロパティ名
await dbs.get(address).dexie.last.put({
id: 1,
count: count,
lastBlockHeight: lastBlockHeight,
lastTxId: lastTxId,
sendValue: parseInt(totalSent),
receiveValue: parseInt(totalReceived),
balance: parseInt(balance),
fee: fee,
unconfirmedBalance: parseInt(unconfirmedBalance),
unconfirmedTxs: unconfirmedTxs,
sendCount: sendCount,
receiveCount: receiveCount,
sendAddressCount: payAddrs.size,
receiveAddressCount: receiveAddrs.size,
bothAddressCount: bothAddrsAry.length,
firsted: (last) ? last.firsted : lastFirsted,
lasted: lastLasted,
})
sendPartnersテーブルの各プロパティ名
await dbs.get(address).dexie.sendPartners.put({
address: addr,
value: addrPayTxs.map(tx=>tx.value-tx.fee).reduce((sum,v)=>sum+v),
count: addrPayTxs.length,
firsted: times.reduce((a,b)=>Math.min(a,b)),
lasted: times.reduce((a,b)=>Math.max(a,b)),
})
receivePartnersテーブルの各プロパティ名
await dbs.get(address).dexie.receivePartners.put({
address: addr,
value: addrTxs.map(tx=>tx.value).reduce((sum,v)=>sum+v),
count: addrTxs.length,
firsted: times.reduce((a,b)=>Math.min(a, b)),
lasted: times.reduce((a,b)=>Math.max(a, b)),
})
transactionsテーブルの各プロパティ名
dbs.get(address).dexie.transactions.put({
txid: tx.txid,
isSend: isSend,
addresses: Array.from(addrs).join(','),
value: value,
fee: fee,
confirmations: tx.confirmations,
blockTime: tx.blockTime,
blockHeight: tx.blockHeight,
})
変更箇所
- 以前は
isPay
としていた列名をisSend
にした