首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

区块链(二)交易记账过程文字叙述

男人就应该这样

-- 比利

《巨人的陨落》一书,比利第一次下井,遭受戏谑之后,接受同伴质问时说出的话,当时感动了,就以此作为开篇吧!

今天要写的是区块链中的交易,从本质上讲区块链是一个分布式系统,所以其交易列表是可以记录任意内容的,而今大家也在积极探讨区块链在各个行业中落地方案,而我所在的支付行业关于区块链的讨论堪称火爆,因为区块链的技术最初就是应用在比特币系统中的嘛,是典型的金融应用,顺便在这里说一下关于比特币的理解,比特币狭义的理解是一种电子货币,广义的理解是一种协议栈,它包含了很多技术如密码学、会计学、计算机科学等等。在支付行业中,从技术角度上讲,有两个问题值得我们关注的,一个是数据一致性问题,业务角度描述就是长短流水,属于清结算的职能范畴,划款之前,要对账,各种对账,我所在的支付公司,要对账的内容按范围划分外部对账和内部对账,外部对账即我们公司与我们特约商户之间的对账、我们公司与各个支付渠道之间的对账;内部对账包含业务系统与支付网关之间的对账、支付网关与账务之间的对账;这些都对完了,账务才出账给清分,清分计算完手续费,交由清算出商户对账单,出划款单给划付系统,通过代付渠道划款给各商户,你看这里还要包含划付系统对代付渠道一层对账,我们公司由于业务需要导致代付渠道还不止交行一家,如果一切没问题,自然是万事大吉,一旦有一家商户对账单不对,那查起来简直麻烦透顶。如果所有交易涉及各方是记的一本账,那要省多少事,而且数据冗余也没有,节约了不少资源。另外一个问题就是系统复杂性问题,由此引出的系统负载、过度设计等一系列的软件工程实施过程中问题,也可以避免了,什么多渠道、支付网关、清分、清算等系统统统将被一个统一的记账系统所取代,还有管理成本要比现在降低N倍!这是我最近一些时日理解区块链所带来的好处的一些感触,当然好处还远不止这些……

下面回归正题,因为要实操一个区块链系统,写一个简单的省略了太多细节,太多出彩的设计理念,所以决定实现一个与比特币系统一模一样的系统,当然比特币协议在不断演化,出于研究目的并不打算兼容所有比特币协议,只实现其中一个版本。起初在没有阅读《精通比特币》这本书之前,我的比特币账务系统概要设计仍然与当前传统的设计是一样的,一个账户表用以记录各账户当前余额,和一个流水表进行记录各账户的变更流水,但比特币系统不是这么玩的,在详解比特币系统怎么玩之前,我们先来分析一下实际支付场景。实际支付场景分两类:一类是账户金额恰巧等于支付金额 即 用10元钱 购买 10元的苹果;一类是账户金额大于支付金额,有找零 即 用20元购买10元苹果,找回10元;在比特币系统中将账户金额抽象成一个叫“交易输入”的概念,找零抽象成一个叫“交易输出的概念”,这两个概念都是相对于交易而言的,比较容易理解。那么一笔交易输入就可以是上一笔交易的交易输出了。这样的话我们可以归纳出几种常见交易类型,分别如下图所示(图来自《精通比特币》):

另一种常见的交易形式是集合多个输入到一个输出的模式,相当于用两张5元支付10元的苹果场景,这种交易叫集合型交易,如下图:

还有一种叫“分散型”交易,就像公司给员工发工资,如下图所示:

还有一种交易只有输出,没有输入,比特币区块链系统的交易列表第一笔交易叫coinbase,这笔交易只有输出,输出给成功挖到新区块记账权的矿工,是一个奖励,给矿工的奖励不仅仅包含挖到新区块的奖励还包含成功记账的交易费。之所以提一下这个交易类型,我觉得这种交易类型是现实中现金兑换成特定电子货币的关键。

弄清楚了几种交易类型(之所以提一下这几种交易类型,是想说明为什么比特币系统在记账时只抽象出“交易输入”和“交易输出”的概念的原因),还得先了解一个要点即货币所有权认定的问题,才能叙述区块链详细记账过程,在比特币系统中,比特币所有权由三个部分组成,分别是一个私钥、一个公钥和数字签名,公钥充当了比特币账户,私钥当然是产生公钥和数字签名之用,数字签名是一笔交易输出的归属,只有三者共同作用才确定一笔交易的所有权。还有两个概念需要了解一下,一个叫未使用交易,所谓未使用交易是指这笔交易输出还没有充当过任何一笔交易的交易输入角色,一个叫已使用交易,所谓已使用交易是与未使用交易相对的,就是已经充当过一笔交易的交易输入者角色,那么这笔交易将被标记为已使用,未来的交易将不得再使用此笔交易输出作为交易输入。下面叙述一下整个交易过程(屏蔽了一些细节),以Alice用0.02比特币向Bob支付一杯咖啡0.01比特币场景为例,一笔0.02BTC 交易输入 产生一笔0.01BTC交易输出和一笔0.005BTC的交易输出,交易输入总和与交易输出总和之间的差值是0.005BTC的交易费,奖励给矿工记账的费用,作为交易输入的0.02BTC交易输出在交易完成后被标记为已使用,从未使用交易池中移除,0.01BTC的一笔交易输出中包含有Bob的公钥地址(即Bob的比特币账户地址)和Bob的私钥数字签名,0.005BTC的一笔交易输出则包含有Alice的公钥地址和Alice的私钥数字签名,交易完成后(准确的说交易完成的第一步,总共分为六步),迅速将此交易信息向附近的节点广播,附近节点接收的此笔交易后,第一步工作就是交易验证即用公钥地址解密私钥签名,如果为真,则是合法交易(验证交易合法性,不仅仅包含这点,有一大票的验证规则),继而继续将此笔交易向纵深节点扩散(这就保证整个区块链系统能承受巨大攻击的原因,非法交易传播至多经过一个节点),接着将此笔交易放入待记账交易池中,第二步交易处理结束,第三步到第五步是区块链之用新区块产生过程,下篇再叙,第六步,将此笔交易记入新的区块中,至此整个交易过程完成。记账完成后,0.01BTC和0.005BTC的交易输出才能作为下一次交易的交易输入。当然整个交易过程还有其他细节没有叙述,大家向知道的话,可以再深入一下,作为技术人员吹牛的话,这些已经够了,但依靠这些写出可用的代码出来还不行,在后续篇章到实际代码时,会有注解详细阐述。

到此为止,还有一个账户余额的概念没有提及,区块链是一个分布式账本系统(也可以作为它用,不限于记账,比如合同,信用等方面)相当于传统账务系统里面的账户余额变更流水表,那么比特币账户余额怎么来的?这是我惊叹比特币系统设计巧妙之处其中之一,区块链的客户端也就是比特币钱包软件在接入比特币网络后,从整个网络的未使用交易输出中聚合自己的公钥地址(也就是钱包账户),就可以得到自己钱包账户余额了,设计巧妙之二:用上一笔交易的交易输出作为下一笔交易的交易输入真正实现了无锁并发;设计巧妙之三:省去了账户信息记录;设计巧妙之四:再也不用担心泄漏用户账户信息了,记录在区块链公开的系统中不包含任何用户隐私信息,特别是私钥;设计巧妙之四:整个交易过程不存在信任问题;设计巧妙的地方很多,后续篇章慢慢道来。

之所以今天写这篇,是因为我在实现过程中,关于区块链系统是保证交易安全和用户账户余额的细节不是很清楚,做了一遍才能更加深刻理解。另外,末了再提一下学习新东西的一个关键:一定要想尽办法搞到一手知识。因为二手知识是经过别人提炼过了,他在讲解时大多数会忽略掉应该知道的细节,或者他理解的是有偏差的,这就更坑了,误人子弟了。

嗯,如果大家不怕我瞎叨叨错了,那么请稍候下回继续分解区块链吧!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180207G01X8E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券