52 lines
1.8 KiB
MySQL
52 lines
1.8 KiB
MySQL
|
-- 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);
|