zoukankan      html  css  js  c++  java
  • 从技术人视角看闪电网络之闪电路由

      在上一篇从技术人视角看闪电网络之微支付通道 里,我们知道微支付通道在一对一高频交割场景下的作用。

      如果打造这种保险箱(多签地址,合约),使这种保险箱必须在时限内传入一把钥匙R才能把币给解锁人,否则就返还给发布人,这样就变成HTLC(Hashed Time Lock Contract,哈希时间锁)

      如果Alice和Eric之间要转账,但手续费不允许,又没有通道直接转账,就需要在已有的通道间进行价值传输(如果Alice和Eric特意再开个通道,需要再锁一定的准备金,可能会遇到资金短缺的问题),这里需要Eric打一把钥匙(秘钥R),然后给Alice一把对应锁头(对应的hash值H(R)),Alice把这把锁头的模型(也是对应的hash值H(R))发给其他人,让其他人能识别是不是R钥匙,并把R钥匙从Eric那里拿过来;并且在通道上串联一条HTLC合约,在指定区块高度之内给了正确钥匙的人,能拿到币,其他通道也发布类似合约。下图的情况是,闪电网络之中,路由的选路机制将Alice->Bob->Carol->Diana->Eric这4条通道连起来。

      

      因为整个价值传输的过程可能要横跨BTC的出块周期,基础的区块高度不稳定,用在合约上的高度条件必须用相对高度差(相对现在的UTXO块高度)。

      因为整个网络传输可能会有延迟,通道的价值传输可能要耗费时间,每条通道的合约指定的时限(相对高度差),离收款方Eric越近,时限越紧(高度差越小);反之亦然。

      一般网络不会响应超过10分钟,高度差只需增减1就行。从Alice开始路由其他节点,每进过一条通道,时限缩小1个高度,传输的币也会少(要给结点路由手续费)。

      

      这种合约也要在闪电通道上执行(不然干脆在主链上转账更好,手续费比多个结点全打包一次更低),双方在通道上创建新交易,格式是一样的,只不过需要锁定本次通道费用到单独的HTLC合约里,其他的费用放到RSMC合约和钱包地址。

      HTLC合约要同时考虑断通道惩罚、违约惩罚和超时返回、H(R)锁头的解锁,故收发方的合约内容相似,但是内容可以说完全不同的:

      

      在交易还没到下一阶段时,由A单方断开通道,并且对方时限内没拿到R;或者由B单方断开通道,并且在时限内拿到R开锁;这两种情况下HTLC的币是属于主动断通道的地址的,需要延时收币;另外2种情况,就是HTLC的币属于对方的,要优先取到币。这就是HTRD1a和HERD1b交易的作用。

      无法理解的是为什么还有HED1a和HTD1b这俩交易。。。为什么会在同一个输出里面分叉出2个0.1BTC。。。

      后面考虑到违约惩罚就好理解了,从同一个输出里面分叉出的2个0.1BTC其实是同样的BTC,属于同个输出的2个执行分支,作用是防止对方在下一次交易时发布本次交易。

      

      这是上图交易作为历史交易被发布之后,所做的一系列违约惩罚行为。由于白皮书配图太大,只截关于HTLC合约的部分。

      值得注意的是和HTLC有关的钥匙编码是不同的,那是因为钥匙都是另打的,双方都要防止不同分支(有没在时限内用R开锁)下,发布了交易,结果对方都能用同种钥匙开锁。

  • 相关阅读:
    验证一下spark Row getAS类型以及控制问题
    Spark异常处理有时间好好拜读一下,spark拍错好文章
    Hive SQL 报错
    Objenesis类库学习一下,没有符合的构造器也可以创建对象
    Scala可变参数方法或者函数传参问题
    大数据相关英文博客,感觉还不错。Mark一下http://dwgeek.com/
    Tomcat 7 'javax.el.ELException' 的解决方式(failed to parse the expression [${xxx}])
    The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
    在Tomcat中进行数据池连接是所需的包
    EL表达式
  • 原文地址:https://www.cnblogs.com/dgutfly/p/10781174.html
Copyright © 2011-2022 走看看