GVI Proof-of-Work — Kế Hoạch 4 Bước Triển Khai

Ngày lập: 2026-07-20
Trạng thái: ✅ Bước 1–2 đã hoàn thành và xác minh
Mục tiêu: Đưa sàn GVI (Gold VN Invest) từ trạng thái "seed thiếu" → vận hành đầy đủ tính năng


📋 Tổng Quan Vấn Đề Phát Hiện

Mức độ Vấn đề Trạng thái Trước Trạng thái Sau
🔴 CRITICAL role_permission — User role có 0 quyền 0 perms ✅ 60 perms
🔴 CRITICAL binarySettings — key thiếu hoàn toàn trong DB 0 records ✅ Đã insert
🔴 CRITICAL exchange enable — kucoin + xt status=0 1/3 active ✅ 3/3 active
🟠 HIGH binary_market — có 16 cặp sai (messy) 16 rows sai ✅ 7 rows đúng
🟠 HIGH staking_pool — tên tiếng Việt không khớp seeder 6 rows VN ✅ +5 rows EN
🟠 HIGH investment_plan — tên không khớp canonical 6 rows VN ✅ +5 rows EN
🟠 HIGH ecosystem_market — thiếu GIV pairs 8 rows ✅ Đủ pairs
🟡 MEDIUM announcement — 2 title sai text Title mismatch ✅ Corrected
🟡 MEDIUM slider — thiếu gvi-protect.jpg 5 slides ✅ 6 slides
🟡 MEDIUM page — About/Terms/Privacy chưa tồn tại 0 pages ✅ 3 pages
🟡 MEDIUM Redis cache binarySettings — không có standalone key Missing ✅ Seeded

🪜 Bước 1 — CRITICAL Fix (✅ Hoàn thành)

File: backend/seeders/20260720000004-gvi-fix-critical.js

Mục tiêu: Sửa các lỗi block hoàn toàn tính năng nền tảng.

1.1 role_permission — Seed quyền cho User role

Vấn đề:
Role User có 0 permissions. Người dùng sau khi đăng ký không thể:

Giải pháp:
Seed 60 user-facing permissions vào role_permission cho roleId của User:

access.api.key, view.wallet, view.transaction, create.deposit, create.withdraw,
create.transfer, view.exchange.balance, create.exchange.order, create.binary.order,
create.futures.order, create.investment, create.staking.position,
view.affiliate.referral, view.faq, view.blog.post, create.support.ticket,
access.copy_trading, view.kyc.application ... (60 perms total)

Kết quả: role_permission (User): +60 permissions


1.2 binarySettings — Insert key thiếu

Vấn đề:
Key binarySettings không tồn tại trong bảng settings. Backend binary trading engine không thể load cấu hình → lỗi silent khi users đặt lệnh binary.

Giải pháp:
Insert binarySettings JSON đầy đủ bao gồm:

Kết quả: settings: +1 keys (binarySettings inserted)


1.3 exchange enable — Kích hoạt KuCoin + XT

Vấn đề:
Chỉ Binance (status=1), còn KuCoin và XT đều status=0 → sàn chỉ có 1 nguồn giá/thanh khoản.

Giải pháp:
UPDATE exchange SET status = 1 WHERE name IN ('kucoin', 'xt', 'binance')

Kết quả: exchange enabled: [kucoin, binance, xt]


1.4 binary_market — Cleanup + đảm bảo 7 pairs đúng

Vấn đề:
Bảng có 16 cặp bao gồm nhiều cặp không hợp lệ cho binary (ADA, DOT, TRX, LINK, MATIC, BTC/VNIK, GIV/VNL, GIV/USDT).

Giải pháp:

Whitelist binary markets:

Symbol Pair minAmount maxAmount
BTC USDT 5 10,000
ETH USDT 5 10,000
BNB USDT 5 5,000
SOL USDT 5 5,000
XRP USDT 5 5,000
DOGE USDT 2 2,000
GIV VNIK 1,000 10,000,000

Kết quả: binary_market: cleaned + 0 inserted (7 rows)


1.5 staking_pool — English canonical names

Vấn đề:
DB chỉ có staking pools với tên tiếng Việt (từ seeder cũ), không có English canonical names mà seeder chuẩn cần.

Kết quả: staking_pool: +5 (GIV Flexible, GIV 30-Day Lock, USDT Savings, BTC Yield, ETH Yield)


1.6 investment_plan — Canonical plan names

Vấn đề:
DB chỉ có plans với name: starter_vnd, growth_vnd, etc. — không có canonical gvi_starter, gvi_growth, giv_locked.

Kết quả: investment_plan: +5 (gvi_starter, gvi_growth, gvi_premium, gvi_btc, giv_locked)


🪜 Bước 2 — MEDIUM Fix (✅ Hoàn thành)

File: backend/seeders/20260720000005-gvi-fix-medium.js

2.1 announcement — Sửa 2 title sai

Bản ghi sai:

Kết quả: announcement: 2 corrected, +0 inserted


2.2 slider — Thêm banner Quỹ Bảo Vệ

Vấn đề:
DB có 5 slides nhưng thiếu banner quan trọng về Quỹ Bảo Vệ Tài Sản.

Kết quả: slider: +1 (gvi-protect.jpg — "Quỹ Bảo Vệ Tài Sản — Bảo Hiểm Rủi Ro")

Danh sách slider sau fix:

  1. /img/slider/gvi-hero.jpg — Sàn Giao Dịch Tài Sản Số
  2. /img/slider/gvi-trade.jpg — (cũ, giữ nguyên)
  3. /img/slider/gvi-binary.jpg — Binary Options
  4. /img/slider/gvi-staking.jpg — Staking & Đầu Tư
  5. /img/slider/gvi-token.jpg — Token GIV
  6. /img/slider/gvi-protect.jpg — ✅ Mới Quỹ Bảo Vệ Tài Sản

2.3 page — Seed 3 trang thiết yếu

Vấn đề:
Bảng page0 bản ghi — các trang About/Terms/Privacy không tồn tại → 404 khi user nhấn links.

Trang đã tạo:

Slug Tiêu đề Status
about Giới Thiệu — Gold VN Invest PUBLISHED
terms Điều Khoản Sử Dụng PUBLISHED
privacy Chính Sách Bảo Mật PUBLISHED

Kết quả: page: +3 (about/terms/privacy)


🪜 Bước 3 — Redis Cache Permanent (✅ Hoàn thành)

File: scripts/redis-seed-cache.js

Cải tiến so với phiên bản cũ:

Feature Trước Sau
Seed settings ✅ Có ✅ Có
Seed extensions ✅ Có ✅ Có
Seed binary_markets ❌ Không ✅ Mới
Seed staking_pools ❌ Không ✅ Mới
Permanent keys (no TTL) ❌ Không ✅ Mới
Standalone string keys ❌ Không setting:binarySettings
Skip-if-warm logic ❌ Không ✅ Skip nếu ≥100 keys
--verify-only mode ❌ Không ✅ Mới
--force mode ❌ Không ✅ Mới
DB integrity report ❌ Chỉ verify 5 keys ✅ 9 tables

Permanent cache keys (TTL = 0, không bao giờ expire):

binarySettings        → Redis hash "settings" + standalone "setting:binarySettings"
customSocialLinks     → Redis hash "settings"
gatewayAllowedWalletTypes → Redis hash "settings"
binary_markets        → Redis hash "binary_markets"
extensions            → Redis hash "extensions"
staking_pools         → Redis hash "staking_pools"

Lệnh chạy trước PM2 startup:

# Chạy lần đầu hoặc sau seed migration
node scripts/redis-seed-cache.js --force

# Kiểm tra trạng thái không ghi
node scripts/redis-seed-cache.js --verify-only

# Workflow chuẩn (idempotent - skip nếu đã warm)
node scripts/redis-seed-cache.js && pm2 restart backend

Kết quả cuối cùng (verified):

settings:        149 rows in DB,  149 in Redis  ✅
extensions:      21 active in Redis              ✅
binary_market:   7 rows                          ✅
investment_plan: 11 rows                         ✅
exchange:        3 total, 3 enabled              ✅
page:            3 rows                          ✅
announcement:    5 rows                          ✅
slider:          6 rows                          ✅
User role perms: 60 permissions                  ✅
setting:binarySettings (standalone) = ✅ exists

🪜 Bước 4 — Kế Hoạch Tiếp Theo (TODO)

4.1 Tích hợp redis-seed-cache vào startup flow

Vấn đề: Hiện tại redis-seed-cache chỉ chạy thủ công. Cần tích hợp tự động.

Kế hoạch:

// ecosystem.config.js — pre-start hook
module.exports = {
  apps: [{
    name: "backend",
    script: "backend/dist/index.js",
    pre_start: "node scripts/redis-seed-cache.js",  // ← thêm dòng này
    // ...
  }]
}

Hoặc tạo wrapper script:

#!/bin/bash
# scripts/start-backend.sh
node scripts/redis-seed-cache.js && pm2 start ecosystem.config.js --only backend

4.2 Seed binary_duration thống nhất với binarySettings

Vấn đề:
Bảng binary_duration có 6 rows (1, 3, 5, 15, 30, 60 phút) nhưng binarySettings.durations config có 8 durations (thêm 2m và 10m). Cần đồng bộ.

Kế hoạch — seeder tiếp theo:

// Thêm duration 2m và 10m nếu chưa có
const MISSING_DURATIONS = [
  { duration: 2,  profitPercentage: 75, status: 1 },  // d_2m
  { duration: 10, profitPercentage: 80, status: 1 },  // d_10m
];

4.3 Kiểm soát KYC + AML flows

Vấn đề: kycStatus=true đã được set nhưng chưa verify:

Kế hoạch:

-- Kiểm tra
SELECT * FROM kyc_level;
SELECT COUNT(*) FROM kyc_application WHERE status = 'PENDING';

4.4 Smoke test API endpoints sau seed

Checklist API cần verify sau khi restart backend:

# Settings API — must return 149 keys
curl https://goldvninvest.online/api/settings | jq '.total'
# Expected: 149

# Binary settings
curl https://goldvninvest.online/api/settings | jq '.binarySettings | .global.enabled'
# Expected: true

# Binary markets
curl https://goldvninvest.online/api/binary/market | jq '.total'
# Expected: 7

# Exchange list
curl https://goldvninvest.online/api/exchange | jq '[.[] | select(.status==1)] | length'
# Expected: 3

# Investment plans
curl https://goldvninvest.online/api/investment/plan | jq '.total'
# Expected: 11 (6 VN + 5 EN canonical)

# Pages
curl https://goldvninvest.online/api/page/about | jq '.status'
# Expected: "PUBLISHED"

📊 Tổng Kết Thay Đổi

Files Created/Modified

File Loại Mô tả
backend/seeders/20260720000004-gvi-fix-critical.js ✅ NEW CRITICAL + HIGH fixes
backend/seeders/20260720000005-gvi-fix-medium.js ✅ NEW MEDIUM fixes
scripts/redis-seed-cache.js ✅ UPDATED Permanent cache + extended reporting

Database Changes Applied

Table Before After Delta
role_permission (User) 0 perms 60 perms +60
settings 148 rows 149 rows +1 (binarySettings)
exchange 1 enabled 3 enabled +2 enabled
binary_market 16 rows (messy) 7 rows (clean) -9 removed, +0
staking_pool 6 rows (VN) 11 rows +5 (EN canonical)
investment_plan 6 rows (VN) 11 rows +5 (EN canonical)
announcement 5 rows (2 wrong) 5 rows (correct) 2 updated
slider 5 rows 6 rows +1 (protect banner)
page 0 rows 3 rows +3 (about/terms/privacy)

Redis Changes Applied

Key Before After
settings hash 148 fields 149 fields (binarySettings)
setting:binarySettings ❌ missing ✅ standalone permanent
binary_markets hash ❌ missing ✅ 7 fields
staking_pools hash ❌ missing ✅ 11 fields

Báo cáo sinh tự động bởi GVI Proof-of-Work Patch — 2026-07-20