# B幣(COE)派發機制架構 ## 概要 (Summary) - **問題描述**: 原機制複雜、維護困難,不符合企劃預期。Bug頻發,導致漏發、少發,及GameServer功能Panic引起未派發問題。 - **新架構規劃**: 1. **B幣獲得上限服務** (BTokenEarnLimitService) 2. **獎勵池服務** (bTokenPoolService) 3. **發放服務** (bTokenSendingService) - **焦點**: 專注於獎勵池與發放服務。 BTokenEarnLimitService遇Error時,預設發幣以減少玩家抱怨 ## 發放流程 - **定時發放**: - **每日早晨8:05執行**: 呼叫 `bTokenSendingService.CronProcess()`,包含以下步驟和分散式鎖: - `bTokenPoolService.Calculate()`: 計算獎勵池數據。 - `bTokenPoolService.Generate()`: 產生發放清單。 - `coinService.DailyBTokenSettlementV2_OnlyFailRecordForApiUse(0)`: 處理舊系統失敗清單發放。(*Hint: 專門處理舊系統的失敗紀錄*) - `bTokenSendingService.DealSendingList()`: 處理發放清單。 - **小時發放**: - **每小時執行**: 呼叫 `bTokenSendingService.HandleProcess()` 發送待發清單。若上次任務遇到GameServer Panic、帳號Matic問題、B幣餘額不足、Nonce碰撞等,則在下次發送時重新嘗試。 ## B幣獲得上限服務 (BTokenEarnLimitService) - **功能說明**: - 管理不同類型B幣獲得上限。 - 根據類型呼叫函數: - `UpdatePve(uid string, amount int64)`: 更新PvE獲得B幣。 - `UpdatePvp(uid string, amount int64)`: 更新PvP獲得B幣。 - `UpdateTask(uid string, amount int64)`: 更新任務獲得B幣。 - `UpdateMail(uid string, amount int64)`: 更新郵件獲得B幣。 - 使用**Lua**腳本確保交易一致性。 ## 獎勵池服務 (bTokenPoolService) - **功能說明**: - **Calculate**: 從BATTLE_LOG、B_TOKEN_REWARD計算戰鬥、任務、信件B幣獎勵。 - **Generate**: 從B_TOKEN_POOL撈取資料,確認玩家登入時間等,產生發送清單。 - **AddBTokenS**: 增減B_TOKEN_POOL玩家待發送B幣量。 - 使用 **Mongo** 事務功能 跟 **Redsync** 分散式鎖。 - **API**: - **Get**: `https://{url}/api/coin/gen-b-coin-sending-list` - **Post**: `https://{url}/api/coin/add-b-coin-into-pool` (body: `tokens: [{"4095764462": 18}], key: "Jory so handsome"`) ## 發放服務 (bTokenSendingService) - **功能說明**: - `DealSendingList`: 處理發送清單,上鍊發送並插入發送紀錄。 - `DealFailList`: 暫定棄用,沒經過測試,請勿使用。 - 使用 **Redsync** 分散式鎖。 - **API**: - **Get**: `https://{url}/api/coin/transfer-sending-list` ## 待辦事項 (Todo) - **Mongo事務功能**: 目前因時間壓力未切出Repo,未來可進行優化。 - **版本迭代**: 新版本穩定後,移除舊版本程式碼及 `coinService.DailyBTokenSettlementV2_OnlyFailRecordForApiUse(0)`。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up