转自廖雪峰老师的《交易系统如何确保账簿100%准确》

这篇文章阐述了一个交易系统中对账功能的关键,即:时刻保证资产负债表总额始终为 0。

交易系统中,对账是一个大问题。对账处理不好,不但需要花费大量的人力去处理账簿,还要承担很大的线上修改账簿的风险。

如果系统能自动化保证账簿每时每刻100%准确,不能说一劳永逸地解决了所有问题,至少解决了绝大部分问题。

如何对账,能时刻确保账簿100%准确?

交易系统中,用户余额存储在账户表中。例如,一个比特币交易系统,假设用户有BTC和USD两种资产,要确保账簿余额是对的,一个设计的关键点就是:时刻保证整个系统的资产负债表为零!

设想账户表的初始状态,用户A、B、C、D分别存入了数量不等的BTC(Bitcoin)和USD(US dollar):

user currency balance
A BTC 1.2
B USD 4000
C BTC 2.8
D USD 6000

无论这些用户如何交易,以什么价位交易,最终的结果只是BTC和USD在账户之间移动,其总额并不会增减:

user currency balance
A BTC 0.2
A USD 3000
B BTC 1.0
B USD 1000
C BTC 0.8
C USD 6000
D BTC 2.0

把交易手续费考虑进来,其实也是一样的,只是用户的资产有很少一部分被移动到了系统手续费账户中:

user currency balance
A BTC 0.2
A USD 2997
B BTC 1.0
B USD 1000
C BTC 0.8
C USD 5994
D BTC 2.0
FEE USD 9

上面的账户表不好对账,是因为根据“资产负债表总额始终为零”这一基本原理,缺少一个关键的“负债”账户。

如果把初始状态加入负债账户:

user currency balance
DEBT BTC -4
DEBT USD -10000
A BTC 1.2
B USD 4000
C BTC 2.8
D USD 6000

整个账户表的余额加起来就一定为零。

随着交易的进行,无论资产如何转移,最终的账户余额也一定为零:

user currency balance
DEBT BTC -4
DEBT USD -10000
A BTC 0.2
A USD 2997
B BTC 1.0
B USD 1000
C BTC 0.8
C USD 5994
D BTC 2.0
FEE USD 9

因此,可以设计出对账的基本逻辑:

SELECT SUM(balance) FROM ACCOUNTS GROUP BY currency;

在每笔交易后执行该SQL语句,如果账簿无误,结果集必定每一行均为 0

考虑到对账程序的执行效率,可以把它放到只读从库执行,不影响交易本身。

更进一步,考虑系统初始状态的账户表:

user currency balance
(无记录) (无记录) (无记录)

当用户X存入USD 1500后,要保证资产负载表为0,该存款操作本质上是一个资产转移过程:USD 1500从DEBT账户转移到用户X的账户:

user currency balance
DEBT USD -1500
X USD 1500

取款过程则恰好相反,它是用户资产转移到DEBT账户的过程,体现为DEBT账户余额增加(从负更多到负更少)。

对于财务人员来讲,用户总资产其实就是 ABS(DEBT) - FEE ,计算极其简单。

可见,一个清晰简洁而可靠的设计,不但有力地保证了系统的安全性,而且大大降低了财务对账成本。

交易系统如何确保账簿100%准确相关推荐

  1. 徒手打造一款PK 名片全能王 的名片识别应用--名字篇之(如何100%准确提取名字)

    接上文,名片全能王,虽然自称王,且敢当王的肯定不白给,但不代表这款产品没有毛病的地步. 做为专业人士,不得不吐槽一下,中文名字处理问题就很大,片全能王还得有做更多的工作才配那78块钱和那个名字,先看个 ...

  2. 100 准确 预测 涨停股的Java程序

    首先声明,小弟绝对不是标题党.事实上,这是昨天小弟看到的某条新闻后(<100%准确预测涨停股?--新型股票诈骗伎俩揭秘>,原文地址:http://bit.ly/aYC8pd),有感而发杜撰 ...

  3. 100%准确“预测”涨停股的Java程序

    首先声明,小弟绝对不是标题党.事实上,这是昨天小弟看到的某条新闻后(<100%准确预测涨停股?--新型股票诈骗伎俩揭秘>,原文地址:http://bit.ly/aYC8pd ),有感而发杜 ...

  4. 揭秘!如何用Flutter设计一个100%准确的埋点框架?

    阿里妹导读:用户行为埋点是用来记录用户在操作时的一系列行为,也是业务做判断的核心数据依据,如果缺失或者不准确将会给业务带来不可恢复的损失.闲鱼将业务代码从Native迁移到Flutter上过程中,发现 ...

  5. 【91数据恢复】服务器感染了.halo勒索病毒,如何确保数据100%恢复?

    目录 前言:简介 一.了解什么是.halo勒索病毒? 二..halo后缀勒索病毒是如何传播的? 三.感染了.halo勒索病毒,数据如何解密恢复? 四..halo勒索病毒加密数据解密恢复案例 五.如何防 ...

  6. 判断数组有哪些方法,100%准确的方法

    Object.prototype.toStirng.call() 转载于:https://www.cnblogs.com/xiaoyaoweb/p/10537725.html

  7. 全球首个身份验证保险 提供每笔交易100万美金保额

    网络保险不便宜,而且公司被黑也未必会理赔. 位于美国亚利桑那州斯科茨代尔市的Trusona公司,自称为全球首个被投保的身份验证平台,投保Trutoken用户的身份和交易,最高保额达100万美元. 之前 ...

  8. 如何准确的向工程师传达动效设计?

    转自:http://www.cocoachina.com/design/20150305/11237.html 如何准确的向工程师传达动效设计? 2015-03-05 09:47编辑:pockry分类 ...

  9. 如何做一个股票自动交易系统的步骤

    如何做一个股票自动交易系统的步骤 1. 数据获取 股票自动交易系统需要获取的数据非常丰富,涉及到市场价格.资金流向.基本面报告等多方面信息.这些数据对于制定交易策略和决策分析至关重要. 首先,对于股票 ...

最新文章

  1. 机器学习-线性回归LinearRegression
  2. python经典题库和答案_吐血总结,Python经典面试题及答案
  3. C#二叉树遍历算法实现浅析
  4. cad画流程图的插件_流程图控件FlowChart.NET使用教程:安排组件的使用
  5. 【Linux】一步一步学Linux——readonly命令(219)
  6. 皮肤的实时3S渲染(OpenGL + GLSL)
  7. 如何确定python开发环境已经配置好_python学习第一天:window安装python开发环境完整篇...
  8. sklearn自学指南(part10)--Lasso及多任务Lasso
  9. 计算机视觉——openCV的简介
  10. 中文信息处理——初始概率,发射概率,转移概率
  11. [转]rsync命令中文文档
  12. 如何搭建Vue开发环境的步骤
  13. 计算空间点到直线的距离
  14. vba字典的key属性、item属性和keys方法、items方法、add方法
  15. 迪文屏K600+ 数据库的读写操作
  16. TDengine 荣获 CSDN IT 技术影响力之星 “年度开源项目” 、 “年度IT领军人物”奖项
  17. 利用tushare读取中国股市数据,并用绘制股票行情图形
  18. 九种引人瞩目的开源大数据技术
  19. 算法分析与设计(一)——0-1背包问题
  20. 如果实现类似微信附近的人功能

热门文章

  1. array.unshift_Ruby中带有示例的Array.unshift()方法
  2. ## c 连接字符_用于字符比较的C#程序
  3. MySQL 精选 60 道面试题(含答案)
  4. 设计模式常见面试题汇总
  5. VB另类技巧(可以用于VBA)-指针的使用
  6. pyTorch实现C3D模型的视频行为识别实践
  7. ASP.NET MVC 使用防伪造令牌来避免CSRF攻击
  8. oracle sum详解,oracle sum()聚合函数
  9. 用java编写奖金税率_企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%_java企业利润提成计算代码...
  10. vip会员管理系统c语言,路西牌会员管理系统。