白话区块链技术 第16讲|小额快速支付
欢迎来到《王毅白话区块链技术》专栏第十六讲:小额快速支付。
大家都知道在区块链上完成一笔交易其实是比较耗时间的,采用不同共识算法的区块链完成一笔交易的确认时间也是不尽相同的。采用POW算法的区块链共识周期会相对长一点,而对于使用POS、DPOS共识协议的区块链,共识周期相对较短。
Ripple区块链网络采用了自己独特RPCA共识算法,保证了生成一个区块最快是2秒,也就意味着一笔交易最快2秒就可以完成,在区块链的世界里这个速度已经算很快的了,但一般要多个区块以后,才能确认这个交易已经成功,以前的区块才不会被推翻。因此真正确认一笔交易所消耗的时间大大超过一个区块生成的时间。
在真实的商业世界里,买卖双方有可能要进行很频繁的账务交易,要是每笔交易都要等着共识周期的完成、等着多个区块的确认,这是很浪费时间的一件事。ripple网络专注于金融领域资产流转服务,也切实关注到了这个问题,同时提出了自己的解决方案,并在ripple区块链上编码实现,我个人认为这是一个非常不错的一个创新,往往都是看起来很简单的一个IT功能,却能帮我们解决实际中的大问题。
今天我们要介绍的主角就是:payment channel。
1
Payment channel
Payment channel是在两个账户之间设立的一个专有通道,这两个账户基于这个通道,可以异步、快速、高频进行资产单向流转。这个资产流转是以“保证”的形式在区块链外进行,不需要经过区块链共识,最终买卖双方多笔交易完成后,来一次总的结账,在ripple网络上进行一个结算,完成资产的真正转移。
回过头来讲何谓“保证”的形式,即买方给卖方提供一个信物,使得卖方能够基于这个信物,无条件在ripple网络上基于这个专有通道执行这个信物所标定的资产,使得资产真正转移到卖方。
再往回推,在买方设置这个payment channel的时候,就会在ripple网络上写明,我设置一定金额的资产用于我与某个接收方的保证单,如果卖方能够提供一定的凭证,就可以获取凭证中所标定金额的资产,但是不能超过保证单的总额。
2
案例
技术总是很晦涩,我们用个简单的比喻来说明这个原理:
-
Alice作为买方,Bob作为手机充值卡的卖方,Alice与Bob每天有大概1000笔、约10万XRP的业务量往来。
-
每笔业务都等共识的话,是很慢的,那Alice与Bob就商量:我们用ripple的payment channel这个功能吧。
-
Alice在ripple网络上创建个意愿单,包含资产10万XRP,意愿单的目标方指明是Bob。
-
意愿单的金额可以分多次提取,提取的凭据就是Alice发出的授权单,当然,这授权单里是包含了资产金额的。
-
只要有授权单,作何人可以将其发送到ripple网络上,这个意愿单就会被执行,转移授权单中指定的金额到Bob。
3
技术点
从上面我们可以看出,核心的技术点有这么几个:
-
意愿单,即Payment channel的创建,指定目标账户,指定最高意愿金额
-
授权单只要发出,就可以用来执行意愿单。因此在商品交割的过程中,我们只需要交割授权单,只要检查授权单即可。而授权单的交割是可以脱离ripple区块链而进行的。
-
只要提供授权单,意愿单就会被执行,转移授权单中指定金额的资产。这一步是在线进行,是要到区块链网络上执行的。
-
最重要一点,发起人不能随意关闭这个payment channel,必须有一个过期时间的限定。
我们可以看到,在商品交易的过程中,Alice只要付给Bob授权单就行,Bob也没必要拿到授权单就立即发往ripple区块链,可以等到这个意愿单快要过期时,可以当日交易结束时再去执行授权单即可。
4
具体执行
下面我们看一下具体的交易如何操作。
-
Payment channel的创建,使用交易paymentChannelCreate交易,提供Amount、Destination、settleDelay、publicKey、cancelAfter.
settleDelay的作用在于:买方也可以关闭这个channel,但是有一个延迟时间,这个延迟时间用于卖方去执行自己的授权单。不然会出现,卖方刚收到授权单,买方就把channel给关闭了。卖方尤其要注意这个参数,弄不好会钱物两空。
cancelAfter的作用在于:超过这个时间的任何操作都会引起channel的关闭操作。
Publickey是买方提供的channel的公钥,这个公钥可以是自己帐号的公钥,也可以是任意的公钥,买方一定得拥有对应的私钥,因为授权单得由买方提供给卖方,那时需要用这个私钥签名。
2. 卖方要检查这个payment channel,用accout_channels方法。
得到类似下面的结果:
卖方在这一步是不能大意的,要检查刚才说的时间、目标地址、金额、tag,然后要记下channel_id与公钥,一会用来确认授权单。
3. 买方签发授权单。
得到签名结果,这一步可以离线实现,主要为了得到一个签名结果。
4. 买方将授权单的签名发给卖方。
5. 卖方验证签名
这一步十分关键,并不是只要验证签名正确就好。
对于金额,我们并不是要验证本次应该收到多收多少金额,而是要确认这个金额是多次交易的一个总金额,比如上次买方已经给我了500XRP的授权单,这次的交易额为100XRP,那本次的授权单就应该是600XRP。这里明白了吧,授权单的金额是一个累加关系,而不是并行的,这个方便于卖方最终在ripple网络上进行一次执行操作。
对于channel_id的确认也非常关键,因为买卖双方之间是可能有多个channel的。
6. 卖方提供商品或服务。
7. 重复第3—6步。
8. 所有交易结束,卖方去ripple网络上执行授权单。
9. 卖方执行完授权单,买方去关闭channel.
这时会有两种情况发生:
1> Channel中已经无XRP剩余,channel立即被关闭
2> Channel中还有XRP,不会被关闭,等待过期时间到达才行
10. 过期时间过后,任何人都可以触发关闭channel的动作。
以上就是用payment channel进行商品交割的流程。步骤看起来很多,核心东西就一点:离线验证授权单。奉上ripple担任的一张图供大家参考。
图例
总结
今天主要介绍了ripple的payment channel的功能,这个功能上线已经很长时间了,各种原因都没有去深入学习,今天写出来与大家共勉。Payment channel这个功能与先期推出的escrow功能都是同一类功能,都是用来类似托管、强制执行的概念。不同点在于escrow只能全额执行,而payment channel却可以增量执行。一点点的区块,给广大用户带来了极大的方便,使得固定双方之间的交易量得到指数级别的提高,由衷地佩服。
本期作者|王 毅
本期编辑|靳亚峰
祝你晚安早安午安心安