micw/server/migrations/0.up.sql
2024-11-13 22:10:13 +01:00

52 lines
1.8 KiB
SQL

-- Note: All timestamps inside this DB have to be in UTC+0
-- Otherwise u can travel back to future
SET TIME ZONE 'UTC';
CREATE TABLE blocks (
id BIGSERIAL PRIMARY KEY,
-- SHA512 sum of all hashes inside the block + prev_hash
-- 32 bytes long
hash BYTEA UNIQUE,
-- NULL only on the first block
prev_hash BYTEA UNIQUE,
started_at TIMESTAMP NOT NULL,
finished_at TIMESTAMP,
)
CREATE TABLE IF NOT EXISTS transactions (
-- SHA512 -- 32 bytes long
hash BYTEA PRIMARY KEY,
block_id BIGINT REFERENCES blocks(id) NOT NULL,
-- ED25519 32 bytes long
sender_public_key BYTEA NOT NULL,
receiver_public_key BYTEA NOT NULL,
-- Rewards doesn't decrease sender's balance
-- but generate additional crypto inside the system.
-- Not each sender_public_key should be able to send rewards.
is_reward BOOLEAN NOT NULL,
amount DOUBLE PRECISION NOT NULL,
amount_burned DOUBLE PRECISION NOT NULL,
message VARCHAR,
-- When sign is decrypted with the sender's
-- public key we should get the created_at
-- time in unix format
signature BYTEA NOT NULL,
-- Time provided by the client
created_at TIMESTAMP,
-- Time when transaction was added to the server
added_at TIMESTAMP SET DEFAULT CURRENT TIMESTAMP,
-- Prevent block duplicates
UNIQUE(sendrt_public_key, signature)
-- NOTE: Will be extended with smart contracts data
);
CREATE INDEX idx_blocks_hash ON blocks (hash);
CREATE INDEX idx_blocks_prev_hash ON prev_hash (prev_hash);
CREATE INDEX idx_transactions_block_id ON transactions (block_id);
CREATE INDEX idx_transactions_sender_pk ON transactions (sender_public_key);
CREATE INDEX idx_transactions_receiver_pk ON transactions (receiver_public_key);