1- -- RSK Explorer Database Schema V1.1.5
2-
1+ -- RSK Explorer Database Schema V1.2.3
32/*
43
4+ V1.2.3 Notes:
5+ - Normalized SQL schema across environments
6+
7+ V1.2.2 Notes:
8+ - Updated event foreign key to point to receipt table
9+
10+ V1.2.1 Notes:
11+ - Fixed typo in table creation for receipt.is_successful (isSuccessful -> is_successful)
12+ - Implemented receipt table
13+ - Logs reconstruction using event table
14+ * receipt.logs (VARCHAR) is maintained for backward compatibility
15+ * Logs are stored individually in event table with transaction_hash and log_index
16+ * To reconstruct: SELECT * FROM event WHERE transaction_hash = ? ORDER BY log_index
17+ * Topics array is reconstructed from event.topic0, topic1, topic2, topic3 as: topics = [topic0, topic1, topic2, topic3] (filtering NULLs)
18+ * Index added: idx_event_transaction_hash_log_index for optimized JOIN queries
19+
520V1.1.6 Notes:
6- - add isSuccessful column to transaction table
21+ - add is_successful column to transaction table
722
823V1.1.5 Notes:
924- add status field to transaction table
@@ -130,6 +145,7 @@ received INT8 NOT NULL
130145CREATE INDEX ON block(miner);
131146CREATE INDEX ON block(hash);
132147CREATE INDEX ON block(received);
148+ CREATE INDEX block_timestamp_idx ON block(timestamp );
133149
134150CREATE TABLE stats (
135151block_number INT4 PRIMARY KEY ,
@@ -173,6 +189,7 @@ input VARCHAR NOT NULL,
173189status VARCHAR NOT NULL ,
174190timestamp VARCHAR NOT NULL DEFAULT CAST(DATE_PART(' epoch' , NOW()) AS VARCHAR )
175191);
192+ CREATE INDEX transaction_pending_timestamp_idx ON transaction_pending(timestamp );
176193
177194CREATE TABLE transaction_in_pool (
178195hash VARCHAR (66 ),
@@ -200,8 +217,8 @@ is_native BOOLEAN NOT NULL,
200217type VARCHAR NOT NULL ,
201218name VARCHAR -- NULL | string
202219);
203- CREATE INDEX index_address_id ON address(id );
204- CREATE INDEX index_address_name ON address(name );
220+ CREATE INDEX address_name_idx ON address(name );
221+ CREATE UNIQUE INDEX idx_address_id ON address(id );
205222
206223CREATE TABLE miner_address (
207224id SERIAL ,
@@ -231,6 +248,8 @@ CONSTRAINT fk_balance_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash)
231248CREATE INDEX idx_balance_address ON balance(address);
232249CREATE INDEX idx_balance_block_number ON balance(block_number);
233250CREATE INDEX ON balance(block_hash);
251+ CREATE INDEX idx_balance_address_block_number ON balance(address, block_number DESC );
252+ CREATE INDEX idx_balance_address_id ON balance(address, id DESC );
234253
235254CREATE TABLE address_latest_balance (
236255address VARCHAR (42 ) PRIMARY KEY ,
@@ -263,28 +282,68 @@ datetime TIMESTAMP WITH TIME ZONE,
263282date date ,
264283gas_used INT ,
265284status VARCHAR ,
266- isSuccessful BOOLEAN ,
285+ is_successful BOOLEAN ,
267286receipt VARCHAR NOT NULL , -- stringified
268287CONSTRAINT fk_transaction_from FOREIGN KEY (" from" ) REFERENCES address(address) ON DELETE CASCADE ,
269288CONSTRAINT fk_transaction_to FOREIGN KEY (" to" ) REFERENCES address(address) ON DELETE CASCADE ,
270289CONSTRAINT fk_transaction_block_number FOREIGN KEY (block_number) REFERENCES block(number ) ON DELETE CASCADE ,
271290CONSTRAINT fk_transaction_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE
272291);
273- CREATE INDEX idx_transaction_tx_id ON transaction(tx_id);
292+ CREATE UNIQUE INDEX idx_transaction_tx_id ON transaction(tx_id);
274293CREATE INDEX idx_transaction_block_number ON transaction(block_number);
275294CREATE INDEX idx_transaction_block_hash ON transaction(block_hash);
276295CREATE INDEX idx_transaction_from ON transaction(" from" );
277296CREATE INDEX idx_transaction_to ON transaction(" to" );
278297CREATE INDEX idx_transaction_tx_type ON transaction(tx_type);
279- CREATE INDEX ON transaction(transaction_index);
280- CREATE INDEX ON transaction(timestamp );
298+ CREATE INDEX transaction_transaction_index_idx ON transaction(transaction_index);
299+ CREATE INDEX transaction_timestamp_idx ON transaction(timestamp );
281300CREATE INDEX idx_transaction_datetime ON transaction(datetime);
282301CREATE INDEX idx_transaction_date ON transaction(date );
283302CREATE INDEX idx_transaction_status ON transaction(status);
284303CREATE INDEX idx_transaction_is_successful ON transaction(is_successful);
285304CREATE INDEX idx_transaction_is_successful_to ON TRANSACTION (" to" , is_successful);
286305CREATE INDEX idx_transaction_is_successful_from ON TRANSACTION (" from" , is_successful);
287306CREATE INDEX idx_transaction_is_successful_tx_id ON TRANSACTION (tx_id, is_successful);
307+ CREATE UNIQUE INDEX unique_block_number_transaction_index ON transaction(block_number, transaction_index);
308+ CREATE INDEX idx_transaction_blocknumber_transactionindex ON transaction(block_number, transaction_index DESC );
309+ CREATE INDEX idx_transaction_blocknumber_transactionindex_desc ON transaction(block_number DESC , transaction_index DESC );
310+ CREATE INDEX idx_transaction_blocknumber_transactionindex_reverse ON transaction(block_number DESC , transaction_index);
311+ CREATE INDEX idx_transaction_date_recent ON transaction(date ) WHERE (date >= ' 2024-10-01' ::date );
312+ CREATE INDEX idx_transaction_from_txid_desc ON transaction(" from" , tx_id DESC );
313+ CREATE INDEX idx_transaction_recent_blocks ON transaction(date ) WHERE (block_number >= 5600000 );
314+ CREATE INDEX idx_transaction_to_txid_desc ON transaction(" to" , tx_id DESC );
315+
316+ CREATE TABLE receipt (
317+ transaction_hash VARCHAR (66 ) PRIMARY KEY ,
318+ contract_address VARCHAR (42 ),
319+ logs_bloom VARCHAR NOT NULL ,
320+ cumulative_gas_used INT4 NOT NULL ,
321+ effective_gas_price VARCHAR ,
322+ block_hash VARCHAR (66 ) NOT NULL ,
323+ logs VARCHAR NOT NULL , -- stringified (legacy, maintained for backward compatibility)
324+ -- NOTE: Logs can be reconstructed from event table using:
325+ -- SELECT * FROM event WHERE transaction_hash = receipt.transaction_hash ORDER BY log_index
326+ -- Topics array is reconstructed from event.topic0, topic1, topic2, topic3 as: topics = [topic0, topic1, topic2, topic3] (filtering NULLs)
327+ block_number INT4 NOT NULL ,
328+ gas_used INT4 NOT NULL ,
329+ " to" VARCHAR (42 ),
330+ " from" VARCHAR (42 ),
331+ type VARCHAR NOT NULL ,
332+ status VARCHAR NOT NULL ,
333+ transaction_index INT4 NOT NULL ,
334+ CONSTRAINT fk_receipt_transaction_hash FOREIGN KEY (transaction_hash) REFERENCES transaction(hash) ON DELETE CASCADE ,
335+ CONSTRAINT fk_receipt_block_number FOREIGN KEY (block_number) REFERENCES block(number ) ON DELETE CASCADE ,
336+ CONSTRAINT fk_receipt_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE ,
337+ CONSTRAINT fk_receipt_from FOREIGN KEY (" from" ) REFERENCES address(address) ON DELETE CASCADE ,
338+ CONSTRAINT fk_receipt_to FOREIGN KEY (" to" ) REFERENCES address(address) ON DELETE CASCADE ,
339+ CONSTRAINT fk_receipt_contract_address FOREIGN KEY (contract_address) REFERENCES address(address) ON DELETE CASCADE
340+ );
341+ CREATE INDEX idx_receipt_block_number ON receipt(block_number);
342+ CREATE INDEX idx_receipt_block_hash ON receipt(block_hash);
343+ CREATE INDEX idx_receipt_from ON receipt(" from" );
344+ CREATE INDEX idx_receipt_to ON receipt(" to" );
345+ CREATE INDEX idx_receipt_status ON receipt(status);
346+ CREATE INDEX idx_receipt_contract_address ON receipt(contract_address);
288347
289348CREATE TABLE internal_transaction (
290349internal_tx_id VARCHAR PRIMARY KEY ,
@@ -369,6 +428,7 @@ CONSTRAINT fk_token_address_block_number FOREIGN KEY (block_number) REFERENCES b
369428CONSTRAINT fk_token_address_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE
370429);
371430CREATE INDEX ON token_address(address);
431+ CREATE INDEX idx_token_address_contract ON token_address(contract);
372432CREATE INDEX ON token_address(block_number);
373433CREATE INDEX ON token_address(block_hash);
374434
@@ -405,7 +465,7 @@ timestamp INT8 NOT NULL,
405465transaction_hash VARCHAR (66 ) NOT NULL ,
406466transaction_index INT4 NOT NULL ,
407467tx_status VARCHAR NOT NULL ,
408- CONSTRAINT fk_event_transaction_hash FOREIGN KEY (transaction_hash) REFERENCES transaction(hash ) ON DELETE CASCADE ,
468+ CONSTRAINT fk_event_transaction_hash FOREIGN KEY (transaction_hash) REFERENCES receipt(transaction_hash ) ON DELETE CASCADE ,
409469CONSTRAINT fk_event_address FOREIGN KEY (address) REFERENCES address(address) ON DELETE CASCADE ,
410470CONSTRAINT fk_event_block_hash FOREIGN KEY (block_hash) REFERENCES block(hash) ON DELETE CASCADE ,
411471CONSTRAINT fk_event_block_number FOREIGN KEY (block_number) REFERENCES block(number ) ON DELETE CASCADE
@@ -419,6 +479,10 @@ CREATE INDEX ON event(topic0);
419479CREATE INDEX ON event(topic1);
420480CREATE INDEX ON event(topic2);
421481CREATE INDEX ON event(topic3);
482+ CREATE INDEX idx_event_transaction_hash_log_index ON event(transaction_hash, log_index);
483+ CREATE INDEX idx_event_address_event_event_id ON event(address, event, event_id DESC );
484+ CREATE INDEX idx_event_event ON event(event);
485+ CREATE INDEX idx_event_lowercase_event ON event(lower ((event)::text ));
422486
423487CREATE TABLE address_in_event (
424488event_id VARCHAR ,
@@ -558,8 +622,13 @@ CREATE TABLE verification_result (
558622 request VARCHAR , -- stringified
559623 result VARCHAR , -- stringified
560624 sources VARCHAR , -- stringified
561- timestamp INT8
625+ timestamp INT8,
626+ status VARCHAR
562627);
628+ CREATE INDEX idx_verification_result_address ON verification_result(address);
629+ CREATE INDEX idx_verification_result_match ON verification_result(match);
630+ CREATE INDEX idx_verification_result_status ON verification_result(status);
631+ CREATE INDEX idx_verification_result_timestamp ON verification_result(timestamp );
563632
564633-- Daily gas fees
565634CREATE TABLE bo_gas_fee_daily_aggregated (
0 commit comments