CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
数据存储货币钱包分账

【数据存储】货币钱包:金币与元宝的分账存储设计

2026-09-23 13:45 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本数据存储货币钱包分账

实战应用:用在哪里

金币靠打、元宝靠充,两种货币一旦混在一个变量里记账,对不上账的时候谁都说不清。货币钱包把金币、元宝、绑元分成三个独立账本:各自的收支流水、各自的校验和、各自的补账路径。分账存储让每一笔钱的来龙去脉都经得起审计。

分账结构:三本账与独立校验

钱包按币种分三个子账本,每个账本带余额与序号;任何一币变动只动自己的账本,序号递增用于对账与断点排查。示例代码如下:

lua
-- 货币钱包:分账结构
local COINS = {"gold", "yuanbao", "bindyb"}
local function walletBalance(player, coin)
    return tonumber(getplayvar(player, "HUMAN", "Wallet_" .. coin) or 0)
end
local function walletSeq(player, coin)
    return tonumber(getplayvar(player, "HUMAN", "WalletSeq_" .. coin) or 0)
end
local function balanceOf(player)
    local parts = {}
    for _, c in ipairs(COINS) do
        parts[#parts + 1] = c .. "=" .. walletBalance(player, c) .. "#" .. walletSeq(player, c)
    end
    return table.concat(parts, "|")
end

变动记账:先扣后加与流水成对

转账类变动拆成两笔:转出账本扣减、转入账本增加,两笔共用同一流水号;流水号落盘,对账脚本按流水号成对核销,单边流水立即告警。示例代码如下:

lua
-- 转账记账:流水成对核销
local player = class(actor)
local flowSeq = 0
local function transferCoin(player, fromCoin, toCoin, amount)
    local fromBal = walletBalance(player, fromCoin)
    if fromBal < amount then
        sendmsg(player, 1, 0, "余额不足," .. fromCoin .. " 还差 " .. amount - fromBal .. "。")
        return false
    end
    flowSeq = flowSeq + 1
    local flowNo = "F" .. os.date("%Y%m%d") .. "_" .. flowSeq
    setplayvar(player, "HUMAN", "Wallet_" .. fromCoin, fromBal - amount, true)
    setplayvar(player, "HUMAN", "WalletSeq_" .. fromCoin, walletSeq(player, fromCoin) + 1, true)
    setplayvar(player, "HUMAN", "FlowLog", (getplayvar(player, "HUMAN", "FlowLog") or "")
        .. flowNo .. "|" .. fromCoin .. ":-" .. amount .. ";", true)
    setplayvar(player, "HUMAN", "Wallet_" .. toCoin, walletBalance(player, toCoin) + amount, true)
    return true
end

验证与监控

三类变动测试:金币消费不动元宝账本、金币转绑元两本账同步变更、余额不足拒绝且零改动。对账脚本每日核销流水,单边流水超过五笔自动冻结相关账号收支。线上监控各币种流水速率与单边流水率,单边率持续为零才说明记账链路无缺陷;钱包变量体积月增超两成时缩短流水保留窗口,流水归档进日志库。

踩坑记录

混账时代一笔金币消费会顺带刷新元宝余额,并发下元宝被旧值覆盖,玩家充值凭空消失,分账是那次事故的产物。流水号曾用随机数,两笔并发生成同号对账核销错乱,流水号改为服务器单调序列。转出扣减与转入增加曾无先后保护,中途断电出现凭空消失的一笔,先扣后加加流水号重试,最终保证成对。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

引擎触发蜈蚣洞黑暗区域照明

【引擎触发】蜈蚣洞黑屏:黑暗区域的视野触发与火把照明

实战应用:用在哪里 蜈蚣洞深处的黑暗区域是老传奇最经典的压迫感来源:没有火把,屏幕只剩身边一圈微光,黑暗里随时窜出钳虫。视野…

2026-09-23 13:45 996 技术组 · 0 阅读
前端接口邮件撰写附件

【前端接口】邮件撰写:附件拖拽与群发名单的前端实现

实战应用:用在哪里 行会管理层每周要给成员发福利邮件,一封封发到崩溃。邮件撰写面板支持附件拖拽与群发名单:从背包把物品拖进附…

2026-09-23 13:45 996 技术组 · 0 阅读
玩法策划碎片兑换收集

【玩法策划】碎片兑换:碎片收集与整装兑换的规则设计

实战应用:用在哪里 顶级装备直接掉落太破坏生态,长期不掉又让人绝望。碎片兑换把屠龙这样的神器拆成六十块碎片:野外精英怪概率掉…

2026-09-23 13:45 996 技术组 · 0 阅读
玩法策划军备库城防捐献

【玩法策划】沙巴克军备库:城防捐献与军械分发设计

实战应用:用在哪里 沙巴克守城最怕城防形同虚设:城墙上没箭、城门后没药、守军没人指挥补给。军备库玩法把城防物资做成一套捐献与…

2026-09-23 13:45 996 技术组 · 0 阅读
数据存储货币钱包分账

【数据存储】货币钱包:金币与元宝的分账存储设计

实战应用:用在哪里 金币靠打、元宝靠充,两种货币一旦混在一个变量里记账,对不上账的时候谁都说不清。货币钱包把金币、元宝、绑元…

2026-09-23 13:45 996 技术组 · 0 阅读
网络通信心跳分级保活

【网络通信】心跳分级:前台后台的心跳间隔切换

实战应用:用在哪里 每个在线客户端都要定时发心跳保活,一万在线就是每秒上百个心跳包,其中九成来自挂机与后台窗口。心跳分级按客…

2026-09-23 13:45 996 技术组 · 0 阅读