とりあえず仮で作ってみた。

ブツ

テーブルや列などの名前は以下APIやその戻り値をヒントにしている。

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にした