Backend
Phân tích backend · 2026-10-05

Dựng backend cho Block Blash: phần lớn là dựng lại server gốc, không phải bịa thêm.

Bản port hiện chạy 100% offline. Game gốc com.block.juggle lại đã là client-server. Tài liệu này liệt kê backend làm được gì, nhóm theo mức độ bám game thật và gắn bằng chứng trong repo.

Điểm xuất phát

Bản port đang offline, bản gốc thì không

Khoảng cách giữa hai bên chính là danh sách việc của backend.

Game gốc (com.block.juggle)

  • POST unigate-prod.afafb.com/game_init lấy config
  • Level Journey tải từ CDN bband1.afafb.com/.../chapter_lev/line/<key>/<Num>.json
  • Phân bucket A/B theo hash(uid) và lịch sử analytics, phía server
  • Lưu cục bộ bằng jsb.sqlite (41 key)
HTTPSJSON

Bản port hiện tại

  • Không tài khoản, không userId
  • Config bake cứng ở gameInitConfig.ts
  • Level Journey: chỉ có Map thật của Level 1, Map 2 đến 96 còn là GAP
  • Trạng thái lưu trong localStorage: bb_classic_persist, bb_progress, bb_daily_streak, bb_settings…
21
hạng mục backend, chia 5 nhóm A đến E
3100+
request game_init đã thu để xác nhận config
658
giá trị enum OFFER_TYPE (thuật toán sinh khối)
96
level Journey cần cấp phát
Đừng nhầm: OFFER_TYPE không phải shop hay IAP. Đó là catalog thuật toán sinh khối (offerBlock trong libtask.so) thuộc các họ BASE, SHANG (entropy), BLANK (fill-clear), DIFFICULTY, DIE. "Backend chọn offer" nghĩa là chọn chiến lược sinh khay 3 khối cho người chơi. IAP, ads, analytics nằm ngoài phạm vi theo docs/PRD.md.
Nhóm A · Giá trị cao nhất

Tái dựng server gốc, bám 1:1

Những thứ game gốc đã gọi lên server. Dựng lại đúng hợp đồng đó thì client port không cần đổi nhiều.

A1 · quan trọng số 1

Remote config game_init

Phục vụ đúng payload mà gameInitConfig.ts đang bake cứng. Bật/tắt feature và chỉnh độ khó mà không build lại client.

statebật/tắt experiment theo người chơi
exceedAimScore firstGameScore ratioDown exceedScoređiểm mục tiêu / độ khó
reviveLimit {per, score}giới hạn hồi sinh, vd {per:0.8, score:3000}
blockLimitClassics classicsRandomReplace fillExclude DifferentStrategyDietinh chỉnh sinh/thay khối
Bằng chứng: game/assets/scripts/logic/config/gameInitConfig.ts:1-38
A2

A/B testing và bucket theo người chơi

Gốc chia bucket bằng hash(uid) cộng lịch sử analytics. Backend làm được: chia nhóm, gán experiment variant (tức chọn OFFER_TYPE nào kích hoạt), đo lường, rollout dần theo %.

Bằng chứng: logic/strategy/OfferType.ts:18, logic/data/offer-algo-sdk-map.ts, docs/port/OFFER_TYPE_FULL_CATALOG.md, docs/port/analysis/classic-block-gen-libtask.md:141-144
A3

Level config động cho Journey

Phục vụ định nghĩa level thay vì nhúng sẵn. Hiện chỉ Level 1 có Map thật, nên backend là chỗ tự nhiên để chứa và cấp phát phần còn lại.

  • Map: board 8×8, -1 là ô trống, N≥1 là block màu N
  • Condition: score_to_win (Way 0, Level 1 = 368 điểm, ramp 368 đến 1566) hoặc collect (Way 1, màu 101 đến 106)
  • Reward, theme xoay vòng
Bằng chứng: docs/port/JOURNEY-HOME-RESEARCH-SPEC.md:82-203, docs/port/journey-data/chapter_levels.json, view/ChapterMapView.ts
A4

ML policy table, cá nhân hoá độ khó

Chuỗi block gốc là adaptive (churn-prediction LightGBM), hiện fail-closed vì chưa có bảng policy. Backend host bảng policy/model để chỉnh độ khó theo churn-tier từng người, đúng cơ chế gốc.

Bằng chứng: logic/ml/mlPersonalize.ts, gameRuleEngine.ts, docs/port/JOURNEY-HOME-RESEARCH-SPEC.md:73-76
A5 · tận dụng hạ tầng có sẵn

Score validation / anti-cheat

RNG tất định và replay pass 100%, nên backend cấp seed cho từng ván, nhận replay log rồi chạy lại phía server để kiểm điểm. Chống điểm giả mà không cần tin client.

Bằng chứng: logic/rng/FixedRandomUtil.ts, docs/port/PORTED-AND-RESEARCHED.md:35, data_src/replays/, app/qa.ts
Nhóm B · Riêng game này mới làm ngon

Khai thác RNG tất định

RNG là LCG tất định, seed điều khiển được. Nhờ đó làm được social và thi đấu mà vẫn công bằng tuyệt đối. Nhóm này không có trong bản gốc nhưng chi phí thấp.

B1

Daily Challenge, "seed of the day"

Backend phát một seed chung mỗi ngày, mọi người chơi đúng một board giống hệt và xếp hạng theo điểm. Block puzzle rất hợp mode này.

B2

Async duel cùng seed

Hai người nhận cùng seed, ai điểm cao hơn thắng. Không cần realtime: backend chỉ ghép cặp và chấm điểm bằng replay.

B3

Giải đấu tuần / mùa

Cùng cơ chế B2 nhưng nhiều người, có giải thưởng.

B4

Ghost replay và spectate

Hạ tầng replay đã có. Backend lưu và chia sẻ "ván hay nhất", cho xem ghost của top player.Nền: data_src/replays/

Demo trực tiếp

Cùng seed thì cùng khay khối

Hai người chơi nhận cùng một seed. Demo dùng đúng công thức LCG của game (seed = (seed × 16807) mod 2147483647, đầu ra trunc((seed − 1) / 2147483646 × 1e6) / 1e6) để rút 5 khay 3 khối.

Người chơi A

Người chơi B

Phạm vi của demo: dùng LCG thật của game để rút khối từ một bộ 8 hình rút gọn. Engine thật có 642 thuật toán và các trait điều chỉnh, nên đây chỉ minh hoạ tính tất định, không phải chuỗi khối của game. Về con số kiểm chứng trong tài liệu: chạy lại công thức từ seed 12345 thì sau 8 bước ra 1256127050 (bước 1 ra 207482415).
Nhóm C · OTA

Phân phối nội dung, không build lại client

C1

OTA theme / skin

Đẩy theme và skin mới từ xa, gắn với reskin P8; skin theo mùa hoặc sự kiện mà không phát hành lại client.

C2

UGC, level cộng đồng

Người chơi tự tạo level; backend lưu, kiểm duyệt và xếp hạng. Tận dụng đúng format Map/Condition đã giải mã ở A3.

C3

Server-driven UI / lịch hiển thị

Lên lịch banner, popup, thời điểm ưu đãi từ xa.

C4

Localization từ xa

Phục vụ chuỗi text đa ngôn ngữ; sửa chữ không cần build lại.

Nhóm D · Vận hành và an toàn

Ops

D1

Force-update, min-version, maintenance

Chặn client cũ và bật màn bảo trì.

D2

Config theo nền tảng

Trả config khác nhau cho web, TikTok, YouTube Playables, vì team đang ship multi-platform.

D3

Telemetry lỗi và crash

Thu log lỗi client để giám sát.

D4

Anti-cheat nâng cao

Rate-limit, phát hiện bất thường, ban-list; bảng xếp hạng chỉ nhận điểm đã verify bằng replay (nối A5).

D5

Observability

Health check, alert, dashboard vận hành.

Nhóm E · Hạ tầng nền

Tài khoản, cloud save, API

Đặt cuối vì là nền chung cho các nhóm trên, không phải tính năng riêng.

E1

Tài khoản và đăng nhập

Hiện không có userId. Backend thêm guest/device-id, SSO (dự án đã có skill skylink-sso-guard cho *.skylink.vn) và liên kết tài khoản.

E2

Cloud save, đồng bộ đa thiết bị

Thay thế hoặc đồng bộ toàn bộ key local bên dưới. Không mất tiến độ khi xoá cache hay đổi máy. Gốc dùng jsb.sqlite 41 key, backend là bản cloud của nó.Bằng chứng: view/GameView.ts:529,543-566, view/ChapterMapView.ts:73

E3

API gateway, DB, versioning

Endpoint cho config, level, save, leaderboard; DB người chơi và tiến độ; versioning cho remote config và level để rollback; CDN cho asset/level tĩnh.

Dữ liệu E2 sẽ đồng bộ

Key localStorageNội dung
bb_classic_persistHigh score, số ván, guide step (classGuideStep, classGameNum, classHighScore, classHighRecordScore)
bb_classic_sessionVán đang chơi dở: board, điểm, combo, khay
bb_progressLevel Journey cao nhất đã mở khoá
bb_daily_streak, bb_journey_streakChuỗi thắng
bb_settings{muted, musicOn, vibrate, quickDrag}
bb_used_themes, bb_launchTheme đã dùng; mode và level khởi động
Gợi ý ưu tiên

Làm theo thứ tự nào

MVP bám gốc

Config game_init, cloud save và tài khoản, level config.

A1E1E2A3
Giữ fair-play

Seed và kiểm điểm bằng replay. Rẻ vì hạ tầng replay đã có.

A5
Tăng giữ chân

A/B bucket và ML policy.

A2A4
Social rẻ mà hiệu quả

Daily Challenge, ghost và duel. Không có trong gốc, tận dụng sẵn RNG tất định và replay.

B1B2B4
Vận hành

Force-update và maintenance, config theo nền tảng, anti-cheat.

D1D2D4
Phụ lục

File bằng chứng chính

FileDùng cho
docs/PRD.mdPhạm vi (IAP, ads, analytics ngoài scope)
docs/port/JOURNEY-HOME-RESEARCH-SPEC.mdJourney, level, remote, ML
docs/port/CHAPTER-GOAL-UI-SPEC.mdGoal và collect-item
docs/port/OFFER_TYPE_FULL_CATALOG.mdCatalog thuật toán sinh khối
game/assets/scripts/logic/config/gameInitConfig.tsRemote config gốc
game/assets/scripts/logic/rng/FixedRandomUtil.tsRNG tất định
game/assets/scripts/view/{GameView,ChapterMapView,DailyStreak}.tsLưu trạng thái local
game/assets/scripts/logic/ml/mlPersonalize.tsML cá nhân hoá