邓明 中生代技术

摘要:国付宝CTO为你讲解区块链的起源及基本概念,对第三支付的影响,其他领域的应用,以及国付宝在区块链技术方面尝试。

邓明,海航旗下国付宝CTO,他在IT行业有超过17年的技术经验,曾是IBM中国全球咨询服务部的IT认证架构师,并多年担任GBS部门架构师评审委员会专题组组长。在其职业经历中,参与和领导过如下项目的实施:第一代CFCA证书系统、建设银行总部级ESB、中国银行GPP全球支付系统、北京移动Web门户、国航PSS核心业务云系统咨询、国航电商网站、山东农信和山东城商银行核心系统及大小额支付系统等。


大家好,我是国付宝CTO邓明。

今天很高兴能跟大家分享一下区块链相关的信息。从今年年初开始,相信大家陆陆续续在很多媒体、场合看到对区块链的宣传,很多时候都将区块链作为一项颠覆式的技术,与互联网等技术相提并论。本次分享,我们也希望通过对区块链技术本质的分析,共同探讨其对业务带来的影响。

本次培训主要是针对初次接触区块链的听众,所以前面会花些时间讲解一些基本概念,已经了解这些概念的大拿可以直接跳过。讲解过程中如有不当,也请指正。

 区块链技术分享_Java

在介绍区块链之前,先介绍一下国付宝的情况。国付宝是一家第三方支付公司,成立于2011年,其前身是商务部中国电子商务中心下面的一个内部支付平台,2011年与海航集团合资成立国付宝公司,开始独立为商户和个人提供支付服务。

区块链技术分享_Java_02

今天的介绍将分为几个部分展开,首先是结合比特币介绍区块链的起源和基本概念;由于国付宝是第三方支付公司,第二部分会重点介绍一下区块链对第三方支付的影响;第三部分会介绍区块链在其他领域的应用,通过案例让大家了解一下区块链可能带来的革命性的变化;最后一部分将介绍一下国付宝和海航在区块链技术方面的一点尝试,希望能给大家带来启发。

区块链技术分享_Java_03


区块链的技术去源于比特币,应该说比特币到目前为止,还是区块链最成功的应用。2008年中本聪在一个密码邮件群组中发表了一篇文章,《比特币:一种点对点的电子现金系统》,在这篇文章里首次提到了区块链的思想。区块链也叫分布式账本,我们可以比较一下传统账单和区块链账单的区别。传统账单中记录了一些基本信息,包括记账人信息,日期等,这类似于一个区块(Block);在区块链账本中,除了上述信息,还记录了当前的页码,以及上一页的页码,这样将所有的记账页(也就是区块)形成一个链。所以“区块链”这个词其实指的是一个区块+链形成的数据结构。

如果区块链只是一个数据结构那就太Low了,后面我们将逐步揭示与它相关的其他技术。区块链技术分享_Java_04


这张图解释了区块链形成的全过程:首先会用非对称加密算法对交易信息进行签名,并将交易信息在网上广播,大家可以拿公钥对信息进行快速验证;然后,通过验证的交易信息会在区块中进行存储,交易信息以Merkle Tree的方式进行存储,交易信息的一点变化也能很快通过Hash值的改变反应出来,防止信息篡改;第三步,将生成的新区块指向上一个区块,与历史区块形成一个链条;生成的新区块通过全网广播发送出去,因为所有人都可以生成区块,为了决定到底以谁记录的区块为准,需要利用一个“共识机制”来解决链分叉的问题,共识机制在后面会重点介绍;所有上面的这些步骤,形成了一个分布式的网络存储,由于区块链信息是全网广播全网验证的,所有的存储节点都是对等的,是一个去中心化的系统。

通过链的方式串接区块还带来一个好处,越是时间长的区块,想要修改越是困难,因为一旦改动这个区块,其链条后续的区块都需要做改动,由于区块生成规则的原因,任何一个区块的改动都需要相当的计算成本,这导致旧区块的篡改基本是不可能的。后续会结合区块的生成解释为什么计算成本高。区块链技术分享_Java_05


在介绍一些技术细节之前,我们先了解一下比特币里是怎么实现价值转移的。我们知道在现有的金融体下,实现转账通常都需要有一个中间机构,这个中间机构可能是银行,也可能是第三方支付。简单来说,从A到D转账,通常需要A和D都在中心机构O开账户,然后把钱从A在中心机构的账户划转到D的账户。

在比特币中,信息流和资金流是合二为一的:A要把比特币转给D,只要发一条带签名的交易信息到比特币网络;网络上的矿工(矿工就是比特币网络的参与者,可能同时也是汇款人/收款人)会抢着记账,因为一旦记账成功会有比特币奖励;一旦交易信息被成功记录到区块链中,交易就完成了。这中间有两个要点需要注意:

第一个,前面提到,所有矿工都可以记账,那么到底以谁记的帐为准?这里涉及到前面提到的共识机制,也就是大家如何达成共识,具体到比特币里,是采用的POW Proof of work,工作量证明机制。后面会详细介绍这个机制的原理。为了实现POW,需要大量计算,类似于矿工挖金矿,所以这个过程也形象地比喻成挖矿。

第二个,怎么保证记录的不是假账?怎么保证同一笔比特币不会被使用多次(也就是双花问题)?首先,对于假账问题,在比特币的交易都会签名,这个非对称加密算法的签名大家都可以验证;只要签名合法,就可以认为是经过比特币所有人授权的合法交易。对于双花问题,比特币引入了UTXO(Unspent Transaction Output)的概念,追踪每一笔比特币的来源,确保不会被重复支付。这在后面也会有介绍。区块链技术分享_Java_06


前面提到POW是比特币中很重要的共识机制,这个共识机制与比特币区块头的构成有很大关系。比特币区块头一共80个字节,包括了前一个区块的Hash值(这是指向前一个区块的指针),本区块交易信息的Merkle root(代表了本区块中所有信息的集合),时间戳,以及一个随机数(nonce)。这个随机数是POW的关键。

这个随机数的要求是,要保证加入随机数以后,这个区块头的SHA256散列计算的结果小于某个目标值。这个目标值可以简单地理解成前面有N个0的16进制数,前面的0越多计算这个随机数的难度越大,因为大家知道散列算法是没有规律的,只能一个一个试,直到碰到一个数可以满足目标值的要求。这也是为什么比特币区块链生成过程被叫做挖矿的原因,比特币网络的参与者通过自己的电脑或其他设备,不断重复着收集数据、计算随机数的过程,就像挖金矿的矿工在不断重复体力劳动一样。

目标值的设定也很有讲究。这个目标值不能设的过小,过小的话可能导致10分钟之内(比特币区块链是每10分钟生成一个新区块)没人能生成一个合法的区块;也不能过大,过大表示计算难度不高,可能同时会有很多矿工同时挖到矿,容易产生分叉。而且大家也知道,由于摩尔定律,计算机的算力一直在提高,所以目标值还不能一直不变。所以在比特币中,有一个最大目标值的常数(前面8个0),同时每2周还会根据全网算力对目标值进行一次调整,使其适合全网新的算力水平。到今年5月份,这个目标值已经是前面有17个0了。

大家可能也会通过很多媒体看到,人们在诟病比特币的时候会说它浪费资源,指的就是这个挖矿过程。最初的时候,随便一台电脑或笔记本都可以挖到矿,后来人们发现用显卡计算更快,就开始用显卡挖矿,发展到现在,已经发明出了专用的矿机,集成专用芯片用来挖矿。在这个过程中设备越来越专业,使用的电力也越来越多。区块链技术分享_Java_07


前面提到,比特币区块链在设计的时候重点考虑了如何避免双花,也就是同一组比特币,如何保证不会被使用两次或多次。比特币交易的基本单位是未经使用的交易输出UTXO(Unspent Transaction Output)。UTXO是不能再分割的、被所有者锁住,并被整个网络识别的比特币货币。因为比特币交易需要全网广播,每个人拿到广播的交易信息后,都需要验证UTXO的出处是否合法,如果不合法可以拒绝。这种方法就可以避免“双花”的情况出现。

前面也提到,如果同时有两个矿工挖到新的区块,有可能导致区块链的分叉。这个时候,在整个区块链网络中,可能有一部分参与者接受了新区块A,另一部分参与者接受了新区块B。通常情况下,大家还会在分支A和B的后面继续生成新区块,直到某个时间点,A分支明显比B分支要长,这时候大家就会抛弃B分支,都转向到A分支。不管是A分支还是B分支,都不允许UTXO存在双花的情况。

由于分叉的存在,如果某一部分矿工拥有了全网算力的51%,他们有可能通过一些协作实现双花,所以有“51%攻击”的说法。

比特币里还有两个很有趣的数字,2100万和每秒7笔,这里也简单说明一下。

先说2100万比特币,这是跟比特币的生成机制有关系的。比特币网络中生成新比特币只有一个办法,就是挖矿,每挖到一个新的区块就会奖励比特币。最初每生成一个区块产生50个比特币;每4年减半,从2008年到现在,已经减半过一次,也就是25个比特币,并且今年的某个时候还会再减半。依此类推,到2140年,产生了约2100万比特币以后,就不会再生成新的比特币了。

现在很多人会说比特币交易的性能有问题,最多只支持每秒7笔交易,这是怎么来的呢?前面提到,比特币每10分钟生成一次区块,但是每个区块只有1M大小,这1M大小的区块要记录10分钟内全网所有的交易信息;每条交易信息大约250个字节,这样计算下来平均每秒只能记录约7笔交易。区块链技术分享_Java_08

 

前面介绍比特币的时候,重点介绍了其POW共识机制,就是怎么通过计算随机数获得记录区块账本的记账权。所谓共识机制,就是在去中心化的系统中,通过某种方式让众多参与者达成共识。除了前面提到的PoW工作量证明方式以外,还有一些PoW的变种,PoS, DPoS,这些都是因为大家意识到PoW方式对算力的浪费很大,在PoW基础上做了一些优化。这些机制一般在像互联网这种不可信网络环境下使用,这种区块链也叫公有链。

传统分布式计算系统中用到的共识算法,像Paxos/Raft等,越来越多地在可信网络环境下的区块链中使用,也叫联盟链和私有链等,后面会有介绍。区块链技术分享_Java_09


目前区块链根据使用的范围,分为公有链(比特币是典型的公有链),联盟链和私链。

通过前面对比特币中区块链技术的了解,我们可以发现区块链的几个特点。

首先,去中心化/去中介化,比如在比特币中,没有一个中心的发币机构,也没有中心的交易机构,所有交易可以点对点完成,也不需要中介。当然,这里面的中心和中介不完全等同。

其次,稳定可靠,所有节点都是对等的,都有全量数据,任何一个单点的故障都不会影响全局。

然后是有共识机制自动达成一致,并且可以执行智能协议。智能协议现在是区块链的一个新热点,可以通过代码把协议的执行逻辑记录下来,然后签名放到区块链中,一旦符合一定条件自动执行。比如在比特币里做支付,可以约定一个支付时间,在支付交易写到区块链中一个月后再实现比特币的划转,这就是一个简单的智能合约。

最后,公开透明不可更改,这很容易理解。区块链技术分享_Java_10


现在开始介绍一下区块链在支付中的应用。

前面我们提到了传统支付与区块链支付的不同,完全的区块链支付是可以做到信息流和资金流合二为一的,但是前提是其货币发行和记账都是通过区块链完成的。现在除了比特币,已经有一些组织在做类似的尝试。包括中国央行行长周小川,今年年初也表态说中国会研究基于区块链的数字货币。区块链技术分享_Java_11


R3是比较早在银行领域尝试区块链的一家美国创业公司,国际上很多大行都加入了其区块链联盟,包括中国的平安集团和招商银行。R3在商业票据和分布式账本方面尝试了区块链技术,因为近期R3将Corda分布式账本的白皮书公布出来,后面将针对Corda做一些分析。区块链技术分享_Java_12


根据介绍,Corda是一个记录和处理金融智能合约的分布式账本,但是它跟最早的区块链账本又有所不同。Corda白皮书中介绍到,其设计的一个核心思路是数据一致性能够降低业务复杂度。做过支付的同学可能会有这种共鸣,支付过程中以及支付之后的多方对账会很复杂。所以Corda认为这是区块链账本的一个很大的优势,并将账本信息的权威性作为其另一个设计思路,也就是一切以签名确认之后的区块信息为准。它跟传统区块链最大的区别在于,它不要求做全信息的全局共享,强调交易信息只有参与方才能看到,这也很容易理解,因为很多商业合作是需要保密的。其智能合约的记录也很有特点,强调将合约程序代码和合同文本同时记录到区块链中,兼顾机器执行和人的阅读。它防止双花的机制有些类似UTXO。上图左下角是在Corda中签发货币的例子,ABC银行通过特定的交易签发了100英镑的电子货币,通过左上角的交易将这100英镑转交给了XYZ公司,类似的方式可以实现点对点支付。区块链技术分享_Java_13


Corda还不是R3的全部,其愿景是开发一个叫Concord的平台,可以支撑金融衍生产品、贸易融资等各种业务。其中Concord Vault是其区块链,Corda是Concord的底层分布式账本。

大家可以看到,如果Corda真的在银行和企业之间实现了,就能实现企业与企业,个人与个人,以及个人与企业的点对点支付,完全不需要第三方支付机构了。同时如果第三方支付能够积极介入的化,也可以通过这种模式发行电子货币,参与到业务处理流程中。

区块链技术分享_Java_14

前面提到中国央行也在考虑利用区块链技术发行电子货币,这个思路已经在英国由想法转换成了行动。英格兰银行和伦敦大学合作开发了RSCoin,通过这套系统可以由央行控制和发行基于区块链的数字货币。

在RSCoin的体系中,将记录区块链的角色分为2种:bank,也就是中央银行;还有mintette。Bank向mintette发数字证书,类似PKI证书体系,因此是一种联盟链。

Mintette负责生成lower-level block,并上传给bank生成higher-levelblock。Mintette每隔一段时间(这段时间叫做epcho,时长可变,每个mintette都可能不一样)生成一次lower-level block,mintette之间的block可以有交叉引用。这样做是为了打破之前说的比特币区块链每秒7笔的限制。

Mintette每隔较长时间(Period,这个时间是固定的)将lower-levelblock上传给bank,由bank生成higher-level block,并构成主区块链。

在这个体系下,货币的发行是由bank完成的。区块链技术分享_Java_15


RSCoin通过mintette实现了lower-levelblock的记账,但是每个mintette记录lower-level block的时间间隔都不一样,在这种情况下怎么避免双花呢?RSCoin里设计了一套类似两阶段提交的方式来避免双花。

在RSCoin的交易体系中,利用了addrid的概念,addrid表示了交易方的公钥以及交易信息。每个addrid分配给一组mintette。在交易时先通过公共服务查询input addrid的归属mintette,并确定数字货币没有被消费;然后系统会通知output addrid的mintette确认交易,等到mintette都将交易记录到block中以后,就完成了交易。

在RSCoin的模式下,没有明确说明只有商业银行才可以承担mintette的角色,因此第三方支付理论上也可以作为mintette记账。但是第三方支付机构应该更积极地参与到相关设计中。区块链技术分享_Java_16


前面介绍了R3 Corda和RS Coin,都是传统公司希望设计满足现有金融业务的区块链系统。现在也有更多原来做比特币业务的公司开始涉足传统金融业务。Circle就是一家这样的公司。Circle最初定位是做比特币银行,但是最近将重心转移到了社交支付,并发布了基于iMessage的支付产品。目前其在中国开立了分公司,但是业务主要还是在欧美。

区块链技术分享_Java_17

区块链技术始于比特币,比特币和区块链的出现也给各个行业,尤其是金融业带来了很大的震撼。比特币最初的设计是去中心化和去中介模式的,但是现在最大的金融中介,银行也在开始尝试利用区块链技术改善业务;比特币最初希望创造没有中央管控的货币,现在各国央行也在尝试利用区块链技术发行央行货币。可见比特币背后的区块链技术有着非常强大的潜力,大家也都寄予了厚望。

后面会介绍一下其他行业的案例,以国外的案例为主。区块链技术分享_Java_18这是证券交易所运用区块链的案例。从业务属性上说,证券交易所提供的服务主要是信息撮合、支付服务、和信息公证,最后的证券交易结果由交易所背书。由于区块链的技术属性,可以通过签名验证交易的有效性,通过区块+链的数据结构保证信息的不可篡改,从技术层面可以很大程度替代交易所的信息公证能力。所以纳斯达克尝试运用区块链技术记录私人股权交易,也就是Pre-IPO阶段在二级市场进行的股权交易。以前通常这类信息只是在Excel文件里做一些记录,很难保证公证性。

区块链技术分享_Java_19 

这是另外一种类型的区块链初创项目。The DAO是构建在以太坊智商的一个Dapp(去中心化应用),它的愿景是实现“去中心化的自治组织”。DAO成立之初就引起很大关注,通过众筹得到超过1.6亿美元的资助,号称是全球最大的众筹案例。我们看看为什么大家对它有这么大的热情。

DAO本身没有业务,它提供了运行业务的平台。以其中的一个项目,Mobotiq为例。Mobotiq是一个共享电动汽车的项目,发起者首先在The DAO平台上发布项目的建议书,对项目感兴趣的人可以参与众筹;参与众筹的人在项目实际运行中拥有投票权,可以投票确定项目资金的使用、具体事项的决策等;等到共享电动汽车投入实际运行,用户支付的也是以太坊的电子货币,这些货币可以投入公司持续运行,也可以用来回馈投资者。这里面所有的投票决策规则、支付规则等,都是用代码签名写入到区块链中的智能合约,实现了一个没有公司实体的公司。

参加The DAO项目的人,不用互相认识,甚至有可能彼此感觉不到对方的存在,只要相信区块链里记录的信息,包括智能合约信息,就可以一起经营一个类似于公司的实体。不能不说这是一个很大的变革。

当然,虽然DAO吸引的投资很大,但是现在也还只是一个实验性的项目。不过这个案例也让人从另外一个侧面看到了区块链技术改造现有业务模式的潜力。区块链技术分享_Java_20


日本的瑞穗实业银行希望能构建一个系统实现跨境证券交易的自动化处理,这是一个跨企业的业务合作流程。起初他们尝试建立一套传统的IT系统,但是发现这中间的投入和复杂度很高:需要构建独立的IT系统,需要构建独立的团队,需要对现有的业务流程做很大的改造。后来他们利用区块链的方式构建了新系统,减少了交易状态和数据的核对工作,也减少了人员组织上的开销,大大提高的交易的处理效率。

从这个案例里我们会发现,传统的跨企业系统集成思路会带来很大的系统开销和组织开销,区块链技术的去中心化特征通常为我们带来了解决问题的另一个思路。

区块链技术分享_Java_21 

Onename尝试通过区块链技术解决网上个人身份公证问题。用户可以把自己所有的网上账号在区块链上做记录并签名,比如自己的QQ号,邮箱号等。这样即使被盗号了,大家也知道这个账号是你的。这种方式利用区块链的防篡改特性,提供了一种在网络上证明“你是你”的方法。

区块链技术分享_Java_22

如果说onename是个人身份的公证,Stampery则是将公证的范围扩得更大。它利用区块链的防篡改机制实现了所有权证明,存在证明,真实性证明,协议证明,接收证明等。

区块链技术分享_Java_23

前面介绍了很多国外区块链应用的案例,国内的区块链初创企业和应用也如火如荼。基本上前面提到的所有区块链方面的尝试,国内都有公司在实施。今年以来,国内也陆续出现了多个大型的区块链联盟组织,共同推进区块链的业务创新。

国内的大型互联网公司也在纷纷试用区块链技术,像蚂蚁金服用区块链记录和跟踪公益捐款,微众银行用区块链实现联合贷款的业务,降低清算对账的成本。

区块链技术分享_Java_24

海航生态科技和国付宝也在尝试区块链的应用。为了找到适合的业务场景,充分发挥区块链的作用,我们把区块链的关键技术及其业务效果做了一个映射。

数字签名技术,利用非对称密钥实现数字签名,达到识别身份和防篡改的目的。业务效果是可以去中介,只需要信任签名就可以完成业务,其他的由区块链系统根据智能合约和共识机制自动执行。这个过程降低了业务的复杂度。

区块链全局账本,让大家看到同一本帐,无法篡改,达到信息透明的目的。

智能协议,把业务逻辑签名后放到区块链中,大家监督,自动执行,降低了人工成本,并且规则透明化以后更容易达成一致。

分布式共识机制,不需要中介参与或中心化的协调,通过实现约定的规则达成共识,在非可信的环境下可以避免恶意欺诈,降低风险;因为系统整体是分布式的,也能提高稳定性。当然,在可信环境下,共识机制可以简化。

P2P数据分享,可以让数据及时同步,不用反复核对数据,降低复杂度。

大家可以看到,所有这些都不是新技术,但是一旦组合到一起,就产生了像比特币这样革命性的产品。

这让我们进一步反思,我们是不是把技术的力量用到了极致,很多时候是不是被现有的思路束缚住了。区块链技术分享_Java_25


这是国付宝近期开发的一套区块链系统,利用区块链的分布式账本分享黑名单,主要是在海航内部的互联网金融企业之间实现征信数据的共享。

因为海航系的互联网金融公司较多,有第三方支付,也有P2P理财公司,以前各个公司都是独立维护自己的黑名单。我们希望通过这套系统,利用非中心化的方式实现黑名单共享。

这个场景下采用区块链技术的好处是,每个公司可以安装一套自己的系统,各自的风控部门负责黑名单的录入和获取;同时因为黑名单的录入过程有数字签名,信息可追溯。

目前系统已经在海航的几家企业之间试用。

除此之外,我们也在尝试将国付宝与商户之间的接口通过区块链技术进行改造,提高对账的效率。区块链技术分享_Java_26


海航生态科技在最近召开的中国区块链技术和产业发展论坛上,也发布了基于区块链智能合约技术的航旅新生态蓝图,致力于构建完整的区块链应用场景。

区块链技术分享_Java_27

前面花了很多篇幅介绍区块链的来源,区块链在比特币中的使用,以及现在区块链正在尝试使用的场景,希望能给大家带来启发。从提高效率,节省成本,和业务创新角度,相信大家能找到不少区块链使用的场景。但是任何一项技术都不是万能的,区块链在比特币中能给大家带来惊喜,但是并不表示它适用于其他的场景。前面的案例介绍中也结合区块链的技术特点简单说明了每种场景为什么会用区块链,以及区块链带来的价值。

区块链技术分享_Java_28

我的介绍就到这里,有不当之处请指正,也希望跟大家有更多的交流。谢谢各位!