Commit 6e2e9b5c authored by OptimismBot's avatar OptimismBot Committed by GitHub

Merge pull request #6973 from ethereum-optimism/indexer.sql.constraints

fix(indexer):Schema unique constraints and cascading deletes
parents d7ac3e97 a382b9e2
...@@ -8,10 +8,10 @@ CREATE DOMAIN UINT256 AS NUMERIC ...@@ -8,10 +8,10 @@ CREATE DOMAIN UINT256 AS NUMERIC
CREATE TABLE IF NOT EXISTS l1_block_headers ( CREATE TABLE IF NOT EXISTS l1_block_headers (
-- Searchable fields -- Searchable fields
hash VARCHAR NOT NULL PRIMARY KEY, hash VARCHAR PRIMARY KEY,
parent_hash VARCHAR NOT NULL, parent_hash VARCHAR NOT NULL UNIQUE,
number UINT256 NOT NULL, number UINT256 NOT NULL UNIQUE,
timestamp INTEGER NOT NULL CHECK (timestamp > 0), timestamp INTEGER NOT NULL UNIQUE CHECK (timestamp > 0),
-- Raw Data -- Raw Data
rlp_bytes VARCHAR NOT NULL rlp_bytes VARCHAR NOT NULL
...@@ -19,10 +19,10 @@ CREATE TABLE IF NOT EXISTS l1_block_headers ( ...@@ -19,10 +19,10 @@ CREATE TABLE IF NOT EXISTS l1_block_headers (
CREATE TABLE IF NOT EXISTS l2_block_headers ( CREATE TABLE IF NOT EXISTS l2_block_headers (
-- Searchable fields -- Searchable fields
hash VARCHAR NOT NULL PRIMARY KEY, hash VARCHAR PRIMARY KEY,
parent_hash VARCHAR NOT NULL, parent_hash VARCHAR NOT NULL UNIQUE,
number UINT256 NOT NULL, number UINT256 NOT NULL UNIQUE,
timestamp INTEGER NOT NULL CHECK (timestamp > 0), timestamp INTEGER NOT NULL UNIQUE CHECK (timestamp > 0),
-- Raw Data -- Raw Data
rlp_bytes VARCHAR NOT NULL rlp_bytes VARCHAR NOT NULL
...@@ -34,8 +34,8 @@ CREATE TABLE IF NOT EXISTS l2_block_headers ( ...@@ -34,8 +34,8 @@ CREATE TABLE IF NOT EXISTS l2_block_headers (
CREATE TABLE IF NOT EXISTS l1_contract_events ( CREATE TABLE IF NOT EXISTS l1_contract_events (
-- Searchable fields -- Searchable fields
guid VARCHAR NOT NULL PRIMARY KEY, guid VARCHAR PRIMARY KEY,
block_hash VARCHAR NOT NULL REFERENCES l1_block_headers(hash), block_hash VARCHAR NOT NULL REFERENCES l1_block_headers(hash) ON DELETE CASCADE,
contract_address VARCHAR NOT NULL, contract_address VARCHAR NOT NULL,
transaction_hash VARCHAR NOT NULL, transaction_hash VARCHAR NOT NULL,
log_index INTEGER NOT NULL, log_index INTEGER NOT NULL,
...@@ -48,8 +48,8 @@ CREATE TABLE IF NOT EXISTS l1_contract_events ( ...@@ -48,8 +48,8 @@ CREATE TABLE IF NOT EXISTS l1_contract_events (
CREATE TABLE IF NOT EXISTS l2_contract_events ( CREATE TABLE IF NOT EXISTS l2_contract_events (
-- Searchable fields -- Searchable fields
guid VARCHAR NOT NULL PRIMARY KEY, guid VARCHAR PRIMARY KEY,
block_hash VARCHAR NOT NULL REFERENCES l2_block_headers(hash), block_hash VARCHAR NOT NULL REFERENCES l2_block_headers(hash) ON DELETE CASCADE,
contract_address VARCHAR NOT NULL, contract_address VARCHAR NOT NULL,
transaction_hash VARCHAR NOT NULL, transaction_hash VARCHAR NOT NULL,
log_index INTEGER NOT NULL, log_index INTEGER NOT NULL,
...@@ -63,58 +63,52 @@ CREATE TABLE IF NOT EXISTS l2_contract_events ( ...@@ -63,58 +63,52 @@ CREATE TABLE IF NOT EXISTS l2_contract_events (
-- Tables that index finalization markers for L2 blocks. -- Tables that index finalization markers for L2 blocks.
CREATE TABLE IF NOT EXISTS legacy_state_batches ( CREATE TABLE IF NOT EXISTS legacy_state_batches (
index INTEGER NOT NULL PRIMARY KEY, index INTEGER PRIMARY KEY,
root VARCHAR NOT NULL, root VARCHAR NOT NULL UNIQUE,
size INTEGER NOT NULL, size INTEGER NOT NULL,
prev_total INTEGER NOT NULL, prev_total INTEGER NOT NULL,
l1_contract_event_guid VARCHAR REFERENCES l1_contract_events(guid) state_batch_appended_guid VARCHAR NOT NULL UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE
); );
CREATE TABLE IF NOT EXISTS output_proposals ( CREATE TABLE IF NOT EXISTS output_proposals (
output_root VARCHAR NOT NULL PRIMARY KEY, output_root VARCHAR PRIMARY KEY,
l2_output_index UINT256 NOT NULL UNIQUE,
l2_block_number UINT256 NOT NULL UNIQUE,
l2_output_index UINT256 NOT NULL, output_proposed_guid VARCHAR NOT NULL UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE
l2_block_number UINT256 NOT NULL,
l1_contract_event_guid VARCHAR REFERENCES l1_contract_events(guid)
); );
/** /**
* BRIDGING DATA * BRIDGING DATA
*/ */
/** -- Bridged L1/L2 Tokens
* TOKEN DATA
*/
-- L1 Token table
CREATE TABLE IF NOT EXISTS l1_tokens ( CREATE TABLE IF NOT EXISTS l1_tokens (
address VARCHAR PRIMARY KEY, address VARCHAR PRIMARY KEY,
bridge_address VARCHAR NOT NULL, bridge_address VARCHAR NOT NULL,
l2_token_address VARCHAR NOT NULL,
name VARCHAR NOT NULL,
symbol VARCHAR NOT NULL,
decimals INTEGER NOT NULL CHECK (decimals >= 0 AND decimals <= 18)
);
-- L2 Token table name VARCHAR NOT NULL,
CREATE TABLE IF NOT EXISTS l2_tokens ( symbol VARCHAR NOT NULL,
address VARCHAR PRIMARY KEY, decimals INTEGER NOT NULL CHECK (decimals >= 0 AND decimals <= 18)
bridge_address VARCHAR NOT NULL,
l1_token_address VARCHAR REFERENCES l1_tokens(address),
name VARCHAR NOT NULL,
symbol VARCHAR NOT NULL,
decimals INTEGER NOT NULL CHECK (decimals >= 0 AND decimals <= 18)
); );
CREATE TABLE IF NOT EXISTS l2_tokens (
address VARCHAR PRIMARY KEY,
bridge_address VARCHAR NOT NULL,
-- L1-L2 relationship is 1 to many so this is not necessarily unique
l1_token_address VARCHAR REFERENCES l1_tokens(address) ON DELETE CASCADE,
name VARCHAR NOT NULL,
symbol VARCHAR NOT NULL,
decimals INTEGER NOT NULL CHECK (decimals >= 0 AND decimals <= 18)
);
-- OptimismPortal/L2ToL1MessagePasser -- OptimismPortal/L2ToL1MessagePasser
CREATE TABLE IF NOT EXISTS l1_transaction_deposits ( CREATE TABLE IF NOT EXISTS l1_transaction_deposits (
source_hash VARCHAR NOT NULL PRIMARY KEY, source_hash VARCHAR PRIMARY KEY,
l2_transaction_hash VARCHAR NOT NULL, l2_transaction_hash VARCHAR NOT NULL UNIQUE,
initiated_l1_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE,
initiated_l1_event_guid VARCHAR NOT NULL REFERENCES l1_contract_events(guid),
-- transaction data -- transaction data
from_address VARCHAR NOT NULL, from_address VARCHAR NOT NULL,
...@@ -125,18 +119,15 @@ CREATE TABLE IF NOT EXISTS l1_transaction_deposits ( ...@@ -125,18 +119,15 @@ CREATE TABLE IF NOT EXISTS l1_transaction_deposits (
timestamp INTEGER NOT NULL CHECK (timestamp > 0) timestamp INTEGER NOT NULL CHECK (timestamp > 0)
); );
CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals ( CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals (
withdrawal_hash VARCHAR NOT NULL PRIMARY KEY, withdrawal_hash VARCHAR PRIMARY KEY,
nonce UINT256 NOT NULL UNIQUE,
initiated_l2_event_guid VARCHAR NOT NULL REFERENCES l2_contract_events(guid), initiated_l2_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l2_contract_events(guid) ON DELETE CASCADE,
-- Multistep (bedrock) process of a withdrawal -- Multistep (bedrock) process of a withdrawal
proven_l1_event_guid VARCHAR REFERENCES l1_contract_events(guid), proven_l1_event_guid VARCHAR UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE,
finalized_l1_event_guid VARCHAR REFERENCES l1_contract_events(guid), finalized_l1_event_guid VARCHAR UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE,
succeeded BOOLEAN, succeeded BOOLEAN,
-- L2ToL1MessagePasser specific
nonce UINT256 UNIQUE,
-- transaction data -- transaction data
from_address VARCHAR NOT NULL, from_address VARCHAR NOT NULL,
to_address VARCHAR NOT NULL, to_address VARCHAR NOT NULL,
...@@ -148,13 +139,12 @@ CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals ( ...@@ -148,13 +139,12 @@ CREATE TABLE IF NOT EXISTS l2_transaction_withdrawals (
-- CrossDomainMessenger -- CrossDomainMessenger
CREATE TABLE IF NOT EXISTS l1_bridge_messages( CREATE TABLE IF NOT EXISTS l1_bridge_messages(
message_hash VARCHAR NOT NULL PRIMARY KEY, message_hash VARCHAR PRIMARY KEY,
nonce UINT256 NOT NULL UNIQUE, nonce UINT256 NOT NULL UNIQUE,
transaction_source_hash VARCHAR NOT NULL UNIQUE REFERENCES l1_transaction_deposits(source_hash) ON DELETE CASCADE,
transaction_source_hash VARCHAR NOT NULL UNIQUE REFERENCES l1_transaction_deposits(source_hash), sent_message_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE,
relayed_message_event_guid VARCHAR UNIQUE REFERENCES l2_contract_events(guid) ON DELETE CASCADE,
sent_message_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l1_contract_events(guid),
relayed_message_event_guid VARCHAR UNIQUE REFERENCES l2_contract_events(guid),
-- sent message -- sent message
from_address VARCHAR NOT NULL, from_address VARCHAR NOT NULL,
...@@ -165,13 +155,12 @@ CREATE TABLE IF NOT EXISTS l1_bridge_messages( ...@@ -165,13 +155,12 @@ CREATE TABLE IF NOT EXISTS l1_bridge_messages(
timestamp INTEGER NOT NULL CHECK (timestamp > 0) timestamp INTEGER NOT NULL CHECK (timestamp > 0)
); );
CREATE TABLE IF NOT EXISTS l2_bridge_messages( CREATE TABLE IF NOT EXISTS l2_bridge_messages(
message_hash VARCHAR NOT NULL PRIMARY KEY, message_hash VARCHAR PRIMARY KEY,
nonce UINT256 NOT NULL UNIQUE, nonce UINT256 NOT NULL UNIQUE,
transaction_withdrawal_hash VARCHAR NOT NULL UNIQUE REFERENCES l2_transaction_withdrawals(withdrawal_hash) ON DELETE CASCADE,
transaction_withdrawal_hash VARCHAR NOT NULL UNIQUE REFERENCES l2_transaction_withdrawals(withdrawal_hash), sent_message_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l2_contract_events(guid) ON DELETE CASCADE,
relayed_message_event_guid VARCHAR UNIQUE REFERENCES l1_contract_events(guid) ON DELETE CASCADE,
sent_message_event_guid VARCHAR NOT NULL UNIQUE REFERENCES l2_contract_events(guid),
relayed_message_event_guid VARCHAR UNIQUE REFERENCES l1_contract_events(guid),
-- sent message -- sent message
from_address VARCHAR NOT NULL, from_address VARCHAR NOT NULL,
...@@ -184,28 +173,28 @@ CREATE TABLE IF NOT EXISTS l2_bridge_messages( ...@@ -184,28 +173,28 @@ CREATE TABLE IF NOT EXISTS l2_bridge_messages(
-- StandardBridge -- StandardBridge
CREATE TABLE IF NOT EXISTS l1_bridge_deposits ( CREATE TABLE IF NOT EXISTS l1_bridge_deposits (
transaction_source_hash VARCHAR PRIMARY KEY REFERENCES l1_transaction_deposits(source_hash), transaction_source_hash VARCHAR PRIMARY KEY REFERENCES l1_transaction_deposits(source_hash) ON DELETE CASCADE,
cross_domain_message_hash VARCHAR NOT NULL UNIQUE REFERENCES l1_bridge_messages(message_hash), cross_domain_message_hash VARCHAR NOT NULL UNIQUE REFERENCES l1_bridge_messages(message_hash) ON DELETE CASCADE,
-- Deposit information -- Deposit information
from_address VARCHAR NOT NULL, from_address VARCHAR NOT NULL,
to_address VARCHAR NOT NULL, to_address VARCHAR NOT NULL,
local_token_address VARCHAR NOT NULL, -- REFERENCES l1_tokens(address), uncomment me in future pr local_token_address VARCHAR NOT NULL, -- REFERENCES l1_tokens(address), uncomment me in future pr
remote_token_address VARCHAR NOT NULL, -- REFERENCES l2_tokens(address), uncomment me in future pr remote_token_address VARCHAR NOT NULL, -- REFERENCES l2_tokens(address), uncomment me in future pr
amount UINT256 NOT NULL, amount UINT256 NOT NULL,
data VARCHAR NOT NULL, data VARCHAR NOT NULL,
timestamp INTEGER NOT NULL CHECK (timestamp > 0) timestamp INTEGER NOT NULL CHECK (timestamp > 0)
); );
CREATE TABLE IF NOT EXISTS l2_bridge_withdrawals ( CREATE TABLE IF NOT EXISTS l2_bridge_withdrawals (
transaction_withdrawal_hash VARCHAR PRIMARY KEY REFERENCES l2_transaction_withdrawals(withdrawal_hash), transaction_withdrawal_hash VARCHAR PRIMARY KEY REFERENCES l2_transaction_withdrawals(withdrawal_hash) ON DELETE CASCADE,
cross_domain_message_hash VARCHAR NOT NULL UNIQUE REFERENCES l2_bridge_messages(message_hash), cross_domain_message_hash VARCHAR NOT NULL UNIQUE REFERENCES l2_bridge_messages(message_hash) ON DELETE CASCADE,
-- Withdrawal information -- Withdrawal information
from_address VARCHAR NOT NULL, from_address VARCHAR NOT NULL,
to_address VARCHAR NOT NULL, to_address VARCHAR NOT NULL,
local_token_address VARCHAR NOT NULL, -- REFERENCES l2_tokens(address), uncomment me in future pr local_token_address VARCHAR NOT NULL, -- REFERENCES l2_tokens(address), uncomment me in future pr
remote_token_address VARCHAR NOT NULL, -- REFERENCES l1_tokens(address), uncomment me in future pr remote_token_address VARCHAR NOT NULL, -- REFERENCES l1_tokens(address), uncomment me in future pr
amount UINT256 NOT NULL, amount UINT256 NOT NULL,
data VARCHAR NOT NULL, data VARCHAR NOT NULL,
timestamp INTEGER NOT NULL CHECK (timestamp > 0) timestamp INTEGER NOT NULL CHECK (timestamp > 0)
); );
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment