Skip to content

오픈소스 가상화폐 거래소 Coinext (부제 : Silverstring-Exchange)

Notifications You must be signed in to change notification settings

thispell/silverstring-exchange

 
 

Repository files navigation

Welcome to Coinext (Silverstring-Exchange)

오픈소스 가상화폐 거래소 Coinext (부제 : Silverstring-Exchange)

  • 만든이 : Coinest2017@gmail.com (닉네임 : 나사못도 살포시)

  • 언어 : Java 1.8

  • 스킬 : spring boot, redis, rabbitmq, mysql, jpa, websocket, jquery, bootstrap, ipfs, clientjs

  • 사용 솔류션 : rabbitmq, redis, mysql, google mail

  • 목적 : 가상화폐 거래소를 만들고 싶어하고, 어떻게 구동되는지 알고싶은 많은 개발자들에게 기술을 오픈하고 싶어서..

  • 개발 중점 : 기준 거래소들의 성능저하의 원인을 극복하고, 클라우드 환경에서의 scale out하게 서버를 확장가능하도록 구현하고, 비동기 방식과 메세지큐를 사용하여 퍼포먼스를 향상함.

  • 최적화 : 리팩토링 작업 남음.

  • 구동 방법 : rabbitmq, redis, mysql 설치하시고,application.properties쪽에 설정정보 채워서 구동하면됩니다. 아래쪽에 DB스키마를 참고해주세요. 




Docker compose를 이용한 구동

$ gradle clean buildDocker
$ docker-compose -f silverstring-web/docker/docker-compose.yml up

DB 스키마

CREATE TABLE action_log
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20) NOT NULL,
    tag VARCHAR(30),
    ip VARCHAR(100),
    user_agent VARCHAR(255),
    reg_dtm DATETIME,
    data VARCHAR(512)
);

CREATE TABLE admin_wallet
(
    coin_name VARCHAR(255) DEFAULT '' NOT NULL,
    type VARCHAR(10) DEFAULT '' NOT NULL,
    address VARCHAR(255),
    tag VARCHAR(100),
    recv_corp_nm VARCHAR(255),
    bank_name VARCHAR(255),
    bank_code VARCHAR(255),
    available_balance DECIMAL(32,8),
    using_balance DECIMAL(32,8),
    reg_dt DATETIME,
    CONSTRAINT `PRIMARY` PRIMARY KEY (coin_name, type)
);

CREATE TABLE bot_connect_setting
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20),
    service VARCHAR(100),
    connect_key VARCHAR(255),
    secret_key VARCHAR(255),
    reg_dtm DATETIME,
    status VARCHAR(20)
);

CREATE TABLE bot_report
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20),
    service VARCHAR(30),
    reg_dtm DATETIME,
    assets DECIMAL(32,8),
    profit DECIMAL(32,8),
    action VARCHAR(50)
);

CREATE TABLE bot_trade_setting
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20)
);

CREATE TABLE chart
(
    dt VARCHAR(255) NOT NULL,
    coin VARCHAR(255) NOT NULL,
    price DECIMAL(24,8),
    adj_close DECIMAL(24,8),
    close DECIMAL(24,8),
    high DECIMAL(24,8),
    low DECIMAL(24,8),
    open DECIMAL(24,8),
    volume DECIMAL(24,8),
    CONSTRAINT `PRIMARY` PRIMARY KEY (dt, coin)
);

CREATE TABLE coin
(
    name VARCHAR(30) PRIMARY KEY NOT NULL,
    han_name VARCHAR(30) NOT NULL,
    mark VARCHAR(4) NOT NULL,
    unit VARCHAR(11),
    display_priority INT(11) NOT NULL,
    rpc_url VARCHAR(255) NOT NULL,
    logo_url VARCHAR(255),
    reg_dtm DATETIME NOT NULL,
    active VARCHAR(1) NOT NULL,
    withdrawal_min_amount DECIMAL(32,8) NOT NULL,
    withdrawal_auto_allow_max_amount DECIMAL(32,8) NOT NULL,
    withdrawal_fee_amount DECIMAL(32,8) NOT NULL,
    auto_collect_min_amount DECIMAL(32,8) NOT NULL,
    trading_fee_percent DECIMAL(32,2) NOT NULL,
    trading_min_amount DECIMAL(32,8),
    margin_trading_fee_percent DECIMAL(32,8) NOT NULL,
    deposit_scan_page_offset INT(11),
    deposit_scan_page_size INT(11),
    deposit_allow_confirmation BIGINT(20)
);

CREATE TABLE coupon
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    name VARCHAR(255),
    content VARCHAR(255),
    img_url VARCHAR(255),
    reg_dtm DATETIME,
    del_dtm DATETIME,
    under_krw BIGINT(20),
    expire_hr INT(11)
);

CREATE TABLE email_confirm
(
    hash_email VARCHAR(120) NOT NULL,
    code VARCHAR(20) NOT NULL,
    email VARCHAR(30) NOT NULL,
    send_yn VARCHAR(1) NOT NULL,
    reg_dtm DATETIME NOT NULL,
    CONSTRAINT `PRIMARY` PRIMARY KEY (hash_email, code)
);
CREATE UNIQUE INDEX email_confirm_email_pk ON email_confirm (email);
CREATE UNIQUE INDEX email_confirm_hash_email_pk ON email_confirm (hash_email);

CREATE TABLE finger_print
(
    user_id INT(11) NOT NULL,
    hash_key VARCHAR(255) NOT NULL,
    reg_dtm DATETIME NOT NULL,
    del_dtm DATETIME,
    active VARCHAR(1) NOT NULL,
    CONSTRAINT `PRIMARY` PRIMARY KEY (user_id, hash_key)
);
CREATE UNIQUE INDEX finger_print_hash_key_uindex ON finger_print (hash_key);

CREATE TABLE ico_recommend
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    title VARCHAR(255),
    content VARCHAR(255),
    url VARCHAR(255),
    email VARCHAR(255),
    img_url VARCHAR(255)
);

CREATE TABLE level
(
    coin_name VARCHAR(8) DEFAULT '' NOT NULL,
    level VARCHAR(11) DEFAULT '' NOT NULL,
    once_amount DECIMAL(32,8),
    oneday_amount DECIMAL(32,8),
    CONSTRAINT `PRIMARY` PRIMARY KEY (coin_name, level)
);

CREATE TABLE manual_transaction
(
    id VARCHAR(150) DEFAULT '' NOT NULL,
    user_id INT(11) DEFAULT '0' NOT NULL,
    coin_name VARCHAR(30),
    category VARCHAR(10),
    address VARCHAR(255),
    tag VARCHAR(255),
    bank_nm VARCHAR(60),
    recv_nm VARCHAR(30),
    deposit_dvcd VARCHAR(10),
    amount DECIMAL(32,8),
    reg_dt DATETIME,
    status VARCHAR(30),
    reason VARCHAR(255),
    CONSTRAINT `PRIMARY` PRIMARY KEY (id, user_id)
);

CREATE TABLE market_history_order
(
    id BIGINT(20) NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20) NOT NULL,
    order_id BIGINT(20) NOT NULL,
    amount DECIMAL(32,8),
    completed_dtm DATETIME,
    dt VARCHAR(255),
    order_type VARCHAR(255),
    price DECIMAL(32,8),
    reg_dtm DATETIME,
    status VARCHAR(255),
    from_coin_name VARCHAR(255),
    to_coin_name VARCHAR(255),
    CONSTRAINT `PRIMARY` PRIMARY KEY (id, user_id, order_id),
    CONSTRAINT FKficco4yldft62qi141fdk133r FOREIGN KEY (from_coin_name) REFERENCES coin (name),
    CONSTRAINT FKjkgrji3bs5tw60bvvqf3cufwh FOREIGN KEY (to_coin_name) REFERENCES coin (name)
);
CREATE INDEX FKficco4yldft62qi141fdk133r ON market_history_order (from_coin_name);
CREATE INDEX FKjkgrji3bs5tw60bvvqf3cufwh ON market_history_order (to_coin_name);

CREATE TABLE my_coupon
(
    id BIGINT(20) NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20) DEFAULT '0' NOT NULL,
    coupon_id BIGINT(20) DEFAULT '0' NOT NULL,
    reg_dtm DATETIME,
    used_begin_dtm DATETIME,
    expire_dtm DATETIME,
    CONSTRAINT `PRIMARY` PRIMARY KEY (id, user_id),
    CONSTRAINT my_coupon_coupon_id_fk FOREIGN KEY (coupon_id) REFERENCES coupon (id)
);
CREATE INDEX my_coupon_coupon_id_fk ON my_coupon (coupon_id);

CREATE TABLE my_history_order
(
    id BIGINT(20) NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20) NOT NULL,
    order_id BIGINT(20) NOT NULL,
    amount DECIMAL(32,8),
    completed_dtm DATETIME,
    dt VARCHAR(255),
    order_type VARCHAR(255),
    price DECIMAL(32,8),
    reg_dtm DATETIME,
    status VARCHAR(255),
    from_coin_name VARCHAR(255),
    to_coin_name VARCHAR(255),
    to_user_id BIGINT(20),
    to_order_id BIGINT(20),
    CONSTRAINT `PRIMARY` PRIMARY KEY (id, user_id, order_id),
    CONSTRAINT FKripxngjayhjot1c8not7v19a6 FOREIGN KEY (from_coin_name) REFERENCES coin (name),
    CONSTRAINT FK4twra4ndo9ef2l78wk779yj5s FOREIGN KEY (to_coin_name) REFERENCES coin (name)
);
CREATE INDEX FK4twra4ndo9ef2l78wk779yj5s ON my_history_order (to_coin_name);
CREATE INDEX FKripxngjayhjot1c8not7v19a6 ON my_history_order (from_coin_name);
CREATE UNIQUE INDEX my_history_orders_id_uindex ON my_history_order (id);

CREATE TABLE news
(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    url VARCHAR(255) NOT NULL,
    reg_dtm DATETIME NOT NULL,
    del_dtm DATETIME
);

CREATE TABLE notice
(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    content BLOB NOT NULL,
    url VARCHAR(255) NOT NULL,
    reg_dtm DATETIME NOT NULL,
    del_dtm DATETIME
);

CREATE TABLE `order`
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20) NOT NULL,
    amount DECIMAL(32,8),
    amount_remaining DECIMAL(32,8),
    completed_dtm DATETIME,
    order_type VARCHAR(255),
    price DECIMAL(32,8),
    reg_dtm DATETIME,
    status VARCHAR(255),
    from_coin_name VARCHAR(255),
    to_coin_name VARCHAR(255),
    cancel_dtm DATETIME
);
CREATE INDEX FKj21c1p46tcvjbpaymef4xbjfe ON `order` (to_coin_name);
CREATE INDEX FKjao1n98lkxadyhny5dxf71qco ON `order` (from_coin_name);
CREATE INDEX orders_fk ON `order` (user_id);

CREATE TABLE submit_document
(
    user_id BIGINT(20) PRIMARY KEY NOT NULL,
    level_idcard_url_hash VARCHAR(255),
    level_doc_url_hash VARCHAR(255),
    reg_dtm DATETIME,
    complete_dtm DATETIME,
    status VARCHAR(30),
    reason VARCHAR(255)
);

CREATE TABLE support
(
    id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    parent_id BIGINT(20),
    user_id BIGINT(20),
    type VARCHAR(10),
    title VARCHAR(255),
    content VARCHAR(255),
    reg_dtm DATETIME,
    status VARCHAR(10),
    reason VARCHAR(255)
);

CREATE TABLE transaction
(
    id VARCHAR(150) DEFAULT '' NOT NULL,
    user_id INT(11) DEFAULT '0' NOT NULL,
    coin_name VARCHAR(30),
    category VARCHAR(10),
    tx_id VARCHAR(150),
    address VARCHAR(255),
    tag VARCHAR(255),
    bank_nm VARCHAR(60),
    recv_nm VARCHAR(30),
    amount DECIMAL(32,8),
    reg_dt DATETIME,
    complete_dtm DATETIME,
    confirmation INT(11),
    status VARCHAR(30),
    reason VARCHAR(255),
    CONSTRAINT `PRIMARY` PRIMARY KEY (id, user_id)
);
CREATE UNIQUE INDEX transaction_tx_id_coin_name_pk ON transaction (tx_id, coin_name);

CREATE TABLE user
(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    email VARCHAR(60) NOT NULL,
    pwd VARCHAR(120) NOT NULL,
    level VARCHAR(11) NOT NULL,
    otp_hash VARCHAR(120) NOT NULL,
    active VARCHAR(1) NOT NULL,
    role VARCHAR(10),
    reg_dtm DATETIME NOT NULL,
    del_dtm DATETIME
);
CREATE UNIQUE INDEX user_email_uindex ON user (email);

CREATE TABLE virtual_account
(
    id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    user_id INT(11),
    account VARCHAR(255) NOT NULL,
    bank_name VARCHAR(255),
    bank_code VARCHAR(255),
    recv_corp_nm VARCHAR(255),
    reg_dtm DATETIME,
    alloc_dtm DATETIME
);
CREATE UNIQUE INDEX virtual_account_account_pk ON virtual_account (account);
CREATE UNIQUE INDEX virtual_account_alloc_dtm_pk ON virtual_account (alloc_dtm);

CREATE TABLE wallet
(
    id BIGINT(20) NOT NULL AUTO_INCREMENT,
    user_id BIGINT(20) DEFAULT '0' NOT NULL,
    coin_name VARCHAR(255),
    address VARCHAR(255),
    bank_code VARCHAR(255),
    bank_name VARCHAR(255),
    recv_corp_nm VARCHAR(255),
    tag VARCHAR(100),
    deposit_dvcd VARCHAR(10),
    using_balance DECIMAL(32,8),
    available_balance DECIMAL(32,8),
    today_withdrawal_total_balance DECIMAL(32,8),
    reg_dt DATETIME,
    CONSTRAINT `PRIMARY` PRIMARY KEY (id, user_id),
    CONSTRAINT wallet_coin_name_fk FOREIGN KEY (coin_name) REFERENCES coin (name)
);
CREATE INDEX wallet_coin_name_fk ON wallet (coin_name);

About

오픈소스 가상화폐 거래소 Coinext (부제 : Silverstring-Exchange)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • CSS 41.3%
  • Less 20.1%
  • JavaScript 14.1%
  • SCSS 10.1%
  • HTML 7.2%
  • Java 7.2%