micw/server/migrations/0.up.sql

54 lines
1.9 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 (
-- UNIX Timestamp
-- But not just any timestamp, some timestamp
id BIGINT 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,
finished_at TIMESTAMP,
)
CREATE TABLE IF NOT EXISTS transactions (
-- SHA512 -- 64 bytes long
hash BYTEA(64) PRIMARY KEY,
-- references block id
-- but may be added before the block itself
block_id BIGINT,
-- ED25519 key -- 32 bytes long
sender_public_key BYTEA(32) NOT NULL,
receiver_public_key BYTEA(32) 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(24) NOT NULL,
-- Time provided by the client
created_at BIGINT NOT NULL,
created_at_ns BIGINT NOT NULL,
-- Time when transaction was added to the server
added_at TIMESTAMP SET DEFAULT CURRENT TIMESTAMP,
-- NOTE: Will be extended with smart contracts data
);
CREATE INDEX idx_blocks_hash ON blocks (hash);
CREATE INDEX idx_blocks_prev_hash ON blocks (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);