diff --git a/common/nyxd-scraper/Cargo.toml b/common/nyxd-scraper/Cargo.toml index 2ac59e06d1..32125f841f 100644 --- a/common/nyxd-scraper/Cargo.toml +++ b/common/nyxd-scraper/Cargo.toml @@ -20,7 +20,8 @@ futures.workspace = true humantime = { workspace = true } sha2 = { workspace = true } serde = { workspace = true, features = ["derive"] } -sqlx = { workspace = true, features = ["runtime-tokio-rustls", "postgres", "macros", "migrate", "time"] } +serde_json = {workspace = true} +sqlx = { workspace = true, features = ["runtime-tokio-rustls", "postgres", "macros", "migrate", "time", "json"] } tendermint.workspace = true tendermint-rpc = { workspace = true, features = ["websocket-client", "http-client"] } thiserror.workspace = true diff --git a/common/nyxd-scraper/sql_migrations/01_metadata.sql b/common/nyxd-scraper/sql_migrations/01_metadata.sql index 89e4981816..1a525315a0 100644 --- a/common/nyxd-scraper/sql_migrations/01_metadata.sql +++ b/common/nyxd-scraper/sql_migrations/01_metadata.sql @@ -2,8 +2,7 @@ * Copyright 2023 - Nym Technologies SA * SPDX-License-Identifier: Apache-2.0 */ -CREATE TABLE - METADATA ( - id INTEGER PRIMARY KEY CHECK (id = 0), - last_processed_height BIGINT NOT NULL - ); \ No newline at end of file +CREATE TABLE METADATA ( + id INTEGER PRIMARY KEY CHECK (id = 0), + last_processed_height BIGINT NOT NULL +); \ No newline at end of file diff --git a/common/nyxd-scraper/sql_migrations/02_cosmos.sql b/common/nyxd-scraper/sql_migrations/02_cosmos.sql index 3cf4382893..3762cf8804 100644 --- a/common/nyxd-scraper/sql_migrations/02_cosmos.sql +++ b/common/nyxd-scraper/sql_migrations/02_cosmos.sql @@ -1,33 +1,31 @@ -CREATE TABLE - validator ( - consensus_address TEXT NOT NULL PRIMARY KEY, - /* Validator consensus address */ - consensus_pubkey TEXT NOT NULL UNIQUE /* Validator consensus public key */ - ); +CREATE TABLE validator ( + consensus_address TEXT NOT NULL PRIMARY KEY, + /* Validator consensus address */ + consensus_pubkey TEXT NOT NULL UNIQUE + /* Validator consensus public key */ +); -CREATE TABLE - pre_commit ( - validator_address TEXT NOT NULL REFERENCES validator (consensus_address), - height BIGINT NOT NULL, - timestamp TIMESTAMPTZ NOT NULL, - voting_power BIGINT NOT NULL, - proposer_priority BIGINT NOT NULL, - UNIQUE (validator_address, timestamp) - ); +CREATE TABLE pre_commit ( + validator_address TEXT NOT NULL REFERENCES validator (consensus_address), + height BIGINT NOT NULL, + timestamp TIMESTAMPTZ NOT NULL, + voting_power BIGINT NOT NULL, + proposer_priority BIGINT NOT NULL, + UNIQUE (validator_address, timestamp) +); CREATE INDEX pre_commit_validator_address_index ON pre_commit (validator_address); CREATE INDEX pre_commit_height_index ON pre_commit (height); -CREATE TABLE - block ( - height BIGINT UNIQUE PRIMARY KEY, - hash TEXT NOT NULL UNIQUE, - num_txs INTEGER DEFAULT 0, - total_gas BIGINT DEFAULT 0, - proposer_address TEXT REFERENCES validator (consensus_address), - timestamp TIMESTAMPTZ NOT NULL - ); +CREATE TABLE block ( + height BIGINT UNIQUE PRIMARY KEY, + hash TEXT NOT NULL UNIQUE, + num_txs INTEGER DEFAULT 0, + total_gas BIGINT DEFAULT 0, + proposer_address TEXT REFERENCES validator (consensus_address), + timestamp TIMESTAMPTZ NOT NULL +); CREATE INDEX block_height_index ON block (height); @@ -35,46 +33,41 @@ CREATE INDEX block_hash_index ON block (hash); CREATE INDEX block_proposer_address_index ON block (proposer_address); --- no JSONB in sqlite (yet) : ) -CREATE TABLE - "transaction" ( - hash TEXT UNIQUE NOT NULL, - height BIGINT NOT NULL REFERENCES block (height), - "index" INTEGER NOT NULL, - success BOOLEAN NOT NULL, - /* Body */ - num_messages INTEGER NOT NULL, - -- messages JSONB NOT NULL,-- DEFAULT '[]'::JSONB, - memo TEXT, - -- signatures TEXT[] NOT NULL, - /* AuthInfo */ - -- signer_infos JSONB NOT NULL,-- DEFAULT '[]'::JSONB, - -- fee JSONB NOT NULL,-- DEFAULT '{}'::JSONB, - /* Tx response */ - gas_wanted BIGINT DEFAULT 0, - gas_used BIGINT DEFAULT 0, - raw_log TEXT - -- logs JSONB - ); +CREATE TABLE "transaction" ( + hash TEXT UNIQUE NOT NULL, + height BIGINT NOT NULL REFERENCES block (height), + "index" INTEGER NOT NULL, + success BOOLEAN NOT NULL, + /* Body */ + num_messages INTEGER NOT NULL, + messages JSONB NOT NULL DEFAULT '[]', + memo TEXT, + signatures TEXT [] NOT NULL, + /* AuthInfo */ + signer_infos JSONB NOT NULL DEFAULT '[]'::JSONB, + fee JSONB NOT NULL DEFAULT '{}'::JSONB, + /* Tx response */ + gas_wanted BIGINT DEFAULT 0, + gas_used BIGINT DEFAULT 0, + raw_log TEXT +); CREATE INDEX transaction_hash_index ON "transaction" (hash); CREATE INDEX transaction_height_index ON "transaction" (height); -CREATE TABLE - message ( - transaction_hash TEXT NOT NULL REFERENCES "transaction" (hash), - "index" BIGINT NOT NULL, - type TEXT NOT NULL, - -- value JSONB NOT NULL, - -- involved_accounts_addresses TEXT[] NOT NULL, - height BIGINT NOT NULL, - CONSTRAINT unique_message_per_tx UNIQUE (transaction_hash, "index") - ); +CREATE TABLE message ( + transaction_hash TEXT NOT NULL REFERENCES "transaction" (hash), + "index" BIGINT NOT NULL, + TYPE TEXT NOT NULL, + value JSONB NOT NULL, + involved_accounts_addresses TEXT [] NOT NULL, + height BIGINT NOT NULL, + CONSTRAINT unique_message_per_tx UNIQUE (transaction_hash, "index") +); CREATE INDEX message_transaction_hash_index ON message (transaction_hash); -CREATE INDEX message_type_index ON message (type); +CREATE INDEX message_type_index ON message (TYPE); -CREATE TABLE - pruning (last_pruned_height BIGINT NOT NULL); \ No newline at end of file +CREATE TABLE pruning (last_pruned_height BIGINT NOT NULL); \ No newline at end of file diff --git a/common/nyxd-scraper/src/storage/manager.rs b/common/nyxd-scraper/src/storage/manager.rs index 884ae443e5..2e60b1868f 100644 --- a/common/nyxd-scraper/src/storage/manager.rs +++ b/common/nyxd-scraper/src/storage/manager.rs @@ -1,6 +1,8 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +use std::vec; + use crate::storage::log_db_operation_time; use crate::storage::models::{CommitSignature, Validator}; use sqlx::types::time::OffsetDateTime; @@ -346,7 +348,8 @@ pub(crate) async fn insert_transaction<'a, E>( height: i64, index: i64, success: bool, - messages: i64, + message_len: i64, + messages: Vec, memo: String, gas_wanted: i64, gas_used: i64, @@ -361,13 +364,14 @@ where sqlx::query!( r#" - INSERT INTO "transaction" (hash, height, "index", success, num_messages, memo, gas_wanted, gas_used, raw_log) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) + INSERT INTO "transaction" (hash, height, "index", success, num_messages, messages, memo, gas_wanted, gas_used, raw_log) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (hash) DO UPDATE SET height = excluded.height, "index" = excluded."index", success = excluded.success, num_messages = excluded.num_messages, + messages = excluded.messages memo = excluded.memo, gas_wanted = excluded.gas_wanted, gas_used = excluded.gas_used, @@ -378,6 +382,7 @@ where index as i32, success, messages as i32, + messages, memo, gas_wanted, gas_used, diff --git a/common/nyxd-scraper/src/storage/mod.rs b/common/nyxd-scraper/src/storage/mod.rs index 808e6dc5b5..6fc3cf7b24 100644 --- a/common/nyxd-scraper/src/storage/mod.rs +++ b/common/nyxd-scraper/src/storage/mod.rs @@ -339,6 +339,7 @@ async fn persist_txs( chain_tx.index as i64, chain_tx.tx_result.code.is_ok(), chain_tx.tx.body.messages.len() as i64, + chain_tx.tx.body.messages.clone(), chain_tx.tx.body.memo.clone(), chain_tx.tx_result.gas_wanted, chain_tx.tx_result.gas_used, @@ -372,3 +373,4 @@ async fn persist_messages( Ok(()) } + \ No newline at end of file