×

《精通比特币第二版》中文版第十二章比特币应用3/3

96
乔延宏
2017.11.19 22:56* 字数 7650

精力有限,后期修订以github为主,建议大家移步github链接阅读更新版本,感谢理解:
https://github.com/tianmingyun/MasterBitcoin2CN

邀请你的加入,和我一起研读

本文7000字。

12.6.4不对称可撤销承诺

处理先前承诺状态的更好方法是明确撤销它们。但是,这不容易实现。比特币的一个关键特征是,一旦交易有效,它一直有效,不会过期。取消交易的唯一方法是在交易被挖矿前用另一笔交易双重支出它的输入。这就是为什么我们在上述简单支付通道示例中使用时间锁定,以确保最新的承诺交易可以在旧承诺生效之前被花费。然而,把承诺在时间上排序造成了许多限制,使得支付通道难以使用。

虽说一个交易无法取消,但是它可以被构造成无法再使用的样子。我们这样做我们实现它的方法是通过给予每一方一个 撤销密钥,如果对方试图欺骗,可以用来进行惩罚。撤销先前承诺交易的这种机制首先被作为闪电网络的一部分提出。

为了解释撤销密钥,我们将在由Hitesh和Irene经营的两个交易所之间构建一个更加复杂的支付通道。 Hitesh和Irene分别在印度和美国运营比特币交易所。 Hitesh的印度交易所的客户经常向Irene的美国交易所的客户发送付款,反之亦然。目前,这些交易发生在比特币链上,但这意味着支付手续费用并等待几个块进行确认。在交易所之间设置支付通道将大大降低成本并加快交易流程。

Hitesh和Irene通过合作建立资金交易来启动通道,每人向通道注资5个比特币。初始余额为Hitesh有5比特币且Irene有5比特币。资金交易将通道状态锁定在2-2多重签名中,就像在简单通道的例子中一样。

资金交易可能有一个或多个来自Hitesh的输入(加起来5个比特币或更多),以及Irene的一个或多个输入(加起来5个比特币或更多)。投入必须略微超过通道容量才够支付交易费用。该交易有一个将总共10个比特币锁定到由Hitesh和Irene控制的2-of-2多重地址的输出。如果他们的输入超过他们需要贡献的数值,资金交易也可能有一个或多个输出将找零返回给Hitesh和Irene。这是由双方提供和签署的多个输入形成的单一交易。在发送之前,它必须被合作构建起来并且由各方签署。

现在,代替双方签署单一承诺交易的是, Hitesh和Irene创造了两个不对称的承诺交易。

Hitesh有一个带有两个输出的承诺交易。第一个输出立即支付Irene欠她的5比特币。第二个输出支付Hitesh欠他自己的5比特币,但条件是只有在1000个区块的时间锁之后。交易输出如下所示:

Input: 2-of-2 funding output, signed by Irene

Output 0 <5 bitcoin>:
<Irene's Public Key> CHECKSIG

Output 1:
<1000 blocks>
CHECKSEQUENCEVERIFY
DROP
<Hitesh's Public Key> CHECKSIG

Irene有带有两个输出的不同的承诺交易。 第一个输出支付Hitesh欠他的5比特币。 第二个输出支付Irene,欠她自己的5比特币,但同样只有经过1000个区块的时间锁。 Irene持有的承诺交易(由Hitesh签署)看起来像这样:

Input: 2-of-2 funding output, signed by Hitesh

Output 0<5 bitcoin>:
<Hitesh's Public Key> CHECKSIG

Output 1:
<1000 blocks>
CHECKSEQUENCEVERIFY
DROP
<Irene's Public Key> CHECKSIG

这样一来,双方各有一笔承诺交易,以花费2 -2的资金输出。 该承诺交易的输入是由对方签署的。 在任何时候,持有承诺交易的一方都可以签字(完成2-2签名)并进行广播。 然而,如果他们广播承诺交易,承诺交易会立即支付对方,而他们自己的必须等待短时间锁到期。通过在其中一个输出强制执行赎回拖延,我们可以做到让各方在选择单方面广播承诺交易时处于轻微的不利地位。 但是单靠时间延迟还不足以鼓励公平的行为。

下图12-8显示两个不对称承诺交易,其中承诺持有人的有延迟支付

image

现在我们介绍这个方案的最后一个要素:一个撤销密钥,允许被欺诈的一方通过占有通道的所有余额来惩罚骗子。

每个承诺交易都有一个“延迟”的输出。 该输出的兑换脚本允许一方在1000个区块后兑换它,或者另一方如果拥有撤销密钥也可兑换它。 所以当Hitesh为Irene签署承诺交易时,他将把第二个输出定义为在1000块之后可输出支付给自己,或者是任何可以出示撤销密钥的人。 Hitesh构建了这个交易,并创建了一个由他秘密保管的撤销密钥。当他准备转移到新的通道状态并希望撤销这一承诺时, 他才会把撤销密钥透露给Irene 第二个输出脚本如下所示:

Output 0<5 bitcoin>:
<Irene's Public Key> CHECKSIG

Output 1<5 bitcoin>:
IF # Revocation penalty output
<Revocation Public Key>
ELSE
<1000 blocks>
CHECKSEQUENCEVERIFY
DROP
<Hitesh's Public Key>
ENDIF
CHECKSIG

Irene可以自信地签署这笔交易,因为一旦被发送它将立即支付她被欠的欠款。 Hitesh持有交易,但知道如果他在单方通道关闭时发送,他将不得不等待1000个块才能获得支付。

当通道进入下一个状态时,Hitesh必须在Irene同意签署下一个承诺交易之前撤销此承诺交易。要做到这一点,他所要做的就是将撤销密钥发送给Irene。一旦Irene拥有这一承诺的撤销密钥,她就可以自信地签署下一个承诺。她知道,如果Hitesh试图通过发布先前的承诺交易来作弊,她可以使用撤销密钥来兑换Hitesh的延迟输出。如果Hitesh作弊,Irene会得到BOTH(两方)输出。

撤销协议是双边的,这意味着在每一轮中,随着通道状态的进一步发展,双方交换新的承诺,交换用于之前承诺的撤销密钥,并签署彼此的承诺交易。当他们接受新的状态时,他们通过给予对方必要的撤销密钥来惩罚任何作弊行为,使先前的状态不可能再被使用。

我们来看一个它的工作例子。 Irene的客户之一希望向Hitesh的客户发送2比特币。要通过通道传输2比特币,Hitesh和Irene必须更新通道状态以反映新的余额。他们将承诺一个新的状态(状态号2),通道的10个比特币分裂,7个比特币属于Hitesh和3个比特币属于Irene。为了更新通道的状态,他们将各自创建反映新通道余额的新承诺交易。

如上述内容所说,这些承诺交易是不对称的,所以每一方所持的承诺交易都迫使他们等待兑换。至关重要的是,在签署新的承诺交易之前,他们必须首先交换撤销密钥以使先前的承诺无效。在这种情况下,Hitesh的利益与通道的真实状态是一致的,因此他没有理由广播先前的状态。然而,对于Irene来说,状态号1中留给她的余额比状态2中的更高。当Irene给予Hitesh她以前的承诺交易(状态号1)的撤销密钥时,她实际上废除了自己可以回滚通道状态到前一状态而从中获益的能力。因为有了撤销密钥,Hitesh可以毫不拖延地兑换先前承诺交易的两个输出。也就是说一旦Irene广播先前的状态,Hitesh可以行使其占有所有输出的权利。

重要的是,撤销不会自动发生。虽然Hitesh有能力惩罚Irene的作弊行为,但他必须勤勉地观察区块链中作弊的迹象。如果他看到先前的承诺交易广播,他有1000个区块时间采取行动,并使用撤销密钥来阻止Irene的欺骗行为并占有所有余额也就是全部10比特币来惩罚她。

带有相对时间锁(CSV)的不对称可撤销承诺是实现支付通道的更好方法,也是区块链技术非常重要的创新。通过这种结构,通道可以无限期地保持开放,并且可以拥有数十亿的中间承诺交易。在闪电网络的原型实现中,承诺状态由48位索引识别,允许在任何单个通道中有超过281兆(2.8×10^14)个状态转换!

12.6.5哈希时间锁合约(Hash Time Lock Contracts,HTLC)

支付通道可以通过特殊类型的智能合同进一步扩展,以允许参与者将资金用于可赎回的具有到期时间的秘密(secret)。 此功能称为哈希时间锁定合约或HTLC,并用于双向和路由的支付通道。

首先我们来解释HTLC的“哈希”部分。 要创建一个HTLC,预期的收款人将首先创建一个秘密(secret)R。他们然后计算这个R的哈希H:

H = Hash(R)

这步产生可以包含在输出的锁定脚本中的哈希H。 知道秘密的任何人可以用它来兑换输出。 秘密R也被称为哈希函数的前图像。 前图像就是用作哈希函数输入的数据。

HTLC的第二部分是“时间锁”组件。 如果秘密没有被透露,HTLC的付款人可以在一段时间后得到“退款”。 这是通过使用绝对时间锁CHECKLOCKTIMEVERIFY来实现的。实现HTLC的脚本可能如下所示:

IF

Payment if you have the secret R

HASH160 <H> EQUALVERIFY
ELSE

Refund after timeout.

<locktime>
CHECKLOCKTIMEVERIFY DROP
<Payee Pubic Key> CHECKSIG
ENDIF

任何知道可以让哈希等于H的对应秘密R的人,可以通过行使IF语句的第一个子句来兑换该输出。

如果秘密没有被透露,HTLC中写明了,在一定数量的块之后,收款人可以使用IF语句中的第二个子句申请退款。

这是HTLC的基本实现。 任何 拥有秘密R的人都可以兑换这种类型的HTLC。通过对脚本进行微调,HTLC可以采用许多不同的形式。 例如,在第一个子句中添加一个CHECKSIG运算符和一个公钥来限制将哈希值兑换成一个指定的收件人,这个人必须知道秘密R.

12.7可路由的支付通道(闪电网络)

闪电网络是一种端到端连接的双向支付通道的可路由网络。这样的网络可以允许任何参与者穿过一个通道路由到另一个通道进行支付,而不需要信任任何中间人。闪电网络由Joseph Poon和Thadeus Dryja于2015年2月首次描述,其基础是许多其他人提出和阐述的支付通道概念。

“闪电网络”是指路由支付通道网络的具体设计,现已由至少五个不同的开源团队实施。这些的独立实施是由“闪电技术基础”(BOLT)论文中描述的一组互通性标准进行协作。

闪电网络的原型实施已经由几个团队发布。现在,这些实现只能在testnet上运行,因为它们使用segwit,还没有在比特币区块主链(mainnet)上激活。

闪电网络是实现可路由支付通道的一种可能方式。还有其他几种旨在实现类似目标的设计,如Teechan和Tumblebit。

12.7.1闪电网络示例

让我们看看它是如何工作的。

在这个例子中,我们有五个参与者:Alice, Bob, Carol, Diana, and Eric。这五名参与者已经彼此之间开设了支付通道。Alice和Bob有支付通道。Bob连接Carol,Carol连接到Diana,Diana连接Eric。为了简单起见,我们假设每个通道每个参与者都注资2个比特币资金,每个通道的总容量为4个比特币。

下图12-9显示一系列通过双向支付的通道连接在一起形成闪电网络以支持一笔从Alice到Eric的付款 展示了闪电网络中五名参与者,通过双向支付通道连接,可从Alice付款到Eric(路由支付通道(闪电网络))。

Alice想要支付给Eric1个比特币。 不过,Alice并未通过支付通道连接到Eric。 创建支付通道需要资金交易,而这笔交易必须首先提交给比特币区块链。 Alice不想打开一个新的支付通道并支出更多的手续费。 有没有办法间接支付Eric?

下图12-10 显示了通过在连接各方参与者的支付通道上通过一系列HTLC承诺将付款从Alice路由到Eric的逐步过程。

[图片上传中...(image-40cd4b-1510903420675-0)]

Alice正在运行闪电网络(LN)节点,该节点正在跟踪其向Bob的付费通道,并且能够发现支付通道之间的路由。Alice的LN节点还具有通过互联网连接到Eric的LN节点的能力。 Eric的LN节点使用随机数生成器创建一个秘密R。Eric的节点没有向任何人泄漏这个秘密。相反,Eric的节点计算秘密R对应的哈希H,并将此哈希发送到Alice的节点(请参阅图12-10步骤1)。

现在Alice的LN节点构建了Alice的LN节点和Eric的LN节点之间的路由。所使用的路由算法将在后面进行更详细的解释,但现在我们假设Alice节点可以找到一个高效的路由。

然后,Alice的节点构造一个HTLC,支付到哈希H,具有10个区块时间的退款超时(当前块+10),数量为1.003比特币(参见图12-10的步骤2)。额外的0.003将用于补偿参与此支付路由的中间节点。Alice将此HTLC提供给Bob,从和Bob之间的通道余额中扣除1.003比特币,并将其提交给HTLC。 该HTLC具有以下含义:“如果Bob知道秘密,Alice将其通道余额的1.003支付给Bob,或者如果超过10个区块时间后,则退还入Alice的余额”。 Alice和Bob之间的通道余额现在由承诺交易表示,其中有三个输出:Bob的2比特币余额,Alice的0.997比特币余额,Alice的HTLC中承诺的1.003比特币。承诺在HTLC中的金额从Alice的余额中被减去。

Bob现在有一个承诺,如果他能够在接下来的10个区块生产时间内获得秘密R,他可以获取Alice锁定的1.003。手上有了这一承诺,Bob的节点在和Carol的支付通道上构建了一个HTLC。Bob的HTLC提交1.002比特币到哈希H共9个区块时间,这个HTLC中如果Carol有秘密R她可以兑换(参见图12-10步骤3)。Bob知道,如果Carol要获取他的HTLC,她必须出示秘密R。如果Bob在9个区块的时间内有R,他可以用它来获取Alice的HTLC给自己。通过承诺自己的通道余额9个区块的时间,他也赚了0.001比特币。如果Carol无法获取他的HTLC,并且他也无法获取Alice的HTLC,那么一切都将恢复到以前的通道余额,没有人会亏损。 Bob和Carol之间的通道余额现在是:2比特币给Carol,0.998给Bob,1.002由Bob承诺给HTLC。

Carol现在有一个承诺,如果她在接下来的9个区块时间内获得R,她可以获取Bob的锁定1.002比特币。现在她可以在她与Diana的通道上构建HTLC承诺。她提交了一个1.001比特币的HTLC到哈希H,共计8个区块时间,如果Diana有秘密R ,她就可以兑换(参见图12-10步骤4)。从Carol的角度来看,如果能够实现,她就可以获得的0.001比特币,否则也没有失去任何东西。她提交给Diana的HTLC,只有在R被泄漏的情况下才可行,到那时候她可以从Bob那里索取HTLC。Carol和Diana之间的通道余额现在是:2给Diana,0.999给Carol,1.001由Carol承诺给HTLC。

最后,Diana可以提供给Eric一个HTLC,承诺1比特币,7个区块时间,到哈希H(参见图12-10的步骤5)。Diana与Eric之间的通道余额现在是:2给Eric,1给Diana,1由Diana承诺给HTLC。

然而,在这条路上,Eric拥有秘密R,他可以获取Diana提供的HTLC。他将R发送给Diana,并获取1个比特币,添加到他的通道余额中(参见图12-10的步骤6)。通道平衡现在是:1给Diana,3给Eric。

现在,Diana有秘密R,因此,她现在可以获取来自Carol的HTLC。Diana将R发送给Carol,并将1.001比特币添加到其通道余额中(参见图12-10的步骤7。现在Carol与Diana之间的通道余额是:0.999给Carol,3.001给Diana。Diana已经“赚了”参与这个付款路线0.001比特币。

通过路由回传,秘密R允许每个参与者获取未完成的HTLC。Carol从Bob那里获取1.002个比特币,将他们通道余额设为:0.998给Bob,3.002给Carol(参见闪电网络步骤8)。最后,Bob获取来自Alice的HTLC(参见闪电网络步骤9)。他们的通道余额更新为:0.997给Alice,3.003给Bob。

在没有向Eric打开通道的情况下,Alice已经支付了Eric 1比特币。付款路线中的中间方不必要互相信任。在他们的通道内做一个短时间的资金承诺,他们可以赚取一小笔费用,唯一的风险是,如果通道关闭或路由付款失败,退款有段短短的延迟时间。

12.7.2闪电网络传输和路由

LN节点之间的所有通信都是点对点加密的。 另外,节点有一个长期公钥,

它们用作标识符并且彼此认证对方

每当节点希望向另一个节点发送支付时,它必须首先通过连接具有足够容量的支付通道来构建通过网络的路径。节点宣传路由信息,包括他们已经打开了什么通道,每个通道拥有多少容量,以及他们收取多少路由支付费用。路由信息可以以各种方式共享,并且随着闪电网络技术的进步,不同的路由协议可能会出现。一些闪电网络实施使用IRC协议作为节点宣布路由信息的一种方便的机制。路由发现的另一种实现方式是使用P2P模型,其中节点将通道宣传传播给他们的对等体,在“洪水泛滥”模型中,这类似于比特币传播交易的方法。未来的计划包括一个名为Flare的建议,它是一种具有本地节点“邻居”和较长距离的信标节点的混合路由模型。

在我们前面的例子中,Alice的节点使用这些路由发现机制之一来查找将她的节点连接到Eric的节点的一个或多个路径。一旦Alice的节点构建了路径,她将通过网络初始化该路径,传播一系列加密和嵌套的指令来连接每个相邻的支付通道。

重要的是,这个路径只有Alice的节点才知道。付款路线上的所有其他参与者只能看到相邻的节点。从Carol的角度来看,这看起来像是从Bob到Diana的付款。 Carol不知道Bob实际上是中继转发Alice的汇款。她也不知道Diana将会向Eric中继转发付款。

这是闪电网络的一个重要特征,因为它确保了付款的隐私,并且使得很难应用监视,审查或黑名单。但是,Alice如何建立这种付款途径,而不向中间节点透露任何内容?

闪电网络实现了一种基于称为Sphinx的方案的洋葱路由协议。该路由协议确保支付发送者可以通过闪电网络构建和通信路径,使得:

  • 中间节点可以验证和解密其部分路由信息,并找到下一跳。

  • 除了上一跳和下一跳,他们不能了解作为路径一部分的任何其他节点。

  • 他们无法识别支付路径的长度,或者他们自己在该路径中的位置。

  • 路径的每个部分被加密,使得网络级攻击者不能将来自路径的不同部分的数据包彼此关联。

  • 不同于Tor(互联网上的洋葱路由匿名协议),没有可以被监视的“退出节点”。付款不需要传输到比特币区块链,节点只是更新通道余额。

使用这种洋葱路由协议,Alice将路径的每个元素包裹在一层加密中,从尾端开始倒过来运算。她用Eric的公钥加密了Eric的消息。该消息包裹在加密到Diana的消息中,将Eric标识为下一个收件人。给Diana的消息包裹在加密到Carol的公钥的消息中,并将Diana识别为下一个收件人。对Carol的消息被Bob的密钥加密。这样一来,Alice已经构建了这个加密的多层“洋葱”的消息。她发送给Bob,他只能解密和解开外层。在里面,Bob发现一封给Carol的消息,他可以转发给Carol,但不能自己破译。按照路径,消息被转发,解密,转发等,一路到Eric那里。每个参与者只知道各自这一跳的前一个和下一个节点。

路径的每个元素包含承载于HTLC的必须扩展到下一跳的信息,HTLC中的要发送的数量,要包括的费用以及CLTV锁定到期时间(以块为单位)。随着路由信息的传播,节点将HTLC承诺转发到下一跳。

在这一点上,您可能会想知道节点怎么知道路径的长度及其在该路径中的位置。毕竟,他们收到一个消息,并将其转发到下一跳。难道它不会将路径缩短,或者允许他们推断出路径大小和位置?为了防止这种情况,路径总是固定在20跳,并用随机数据填充。每个节点都会看到下一跳和一个要转发的固定长度的加密消息。只有最终的收件人看得到没有下一跳。对于其他人来说,似乎总是有20多跳要走。

12.7.3闪电网络优势

闪电网络是第二层路由技术。它可以应用于支持一些基本功能的任何区块链,如多重签名交易,时间锁定和基本的智能合约。

如果闪电网络搭建在在比特币网络之上,则比特币网络可以大大提高容量,隐私性,粒度和速度,而不会牺牲无中介机构的无信任操作原则:

隐私

闪电网络付款比比特币区块链的付款更私密,因为它们不是公开的。虽然路由中的参与者可以看到在其通道上传播的付款,但他们并不知道发件人或收件人。

流动性

闪电网络使得在比特币上应用监视和黑名单变得更加困难,从而增加了货币的流动性。

速度

使用闪电网络的比特币交易将以毫秒为单位,而不是分钟,因为HTLC在不用提交交易到区块上的情况下被结算。

粒度

闪电网络可以使支付至少与比特币“灰尘”限制一样小,甚至更小。一些建议允许子聪级增量(subsatoshi increments)。

容量

闪电网络将比特币系统的容量提高了几个数量级。每秒可以通过闪电网络路由的付费数量没有具体上限,因为它仅取决于每个节点的容量和速度。

无信任操作

闪电网络在不需要互相信任就可以作为对等体使用的节点之间使用比特币交易。因此,闪电网络保留了比特币系统的原理,同时显著扩大了其操作参数。

当然,如前所述,闪电网络协议不是实现路由支付通道的唯一方法。其他被提出的系统包括Tumblebit和Teechan。然而,在这个时候,闪电网络已经部署在testnet上了。几个不同的团队已经开发了正在竞争的LN实现,并且正在努力实现一个通用的互操作性标准(称为BOLT)。闪电网络很可能是第一个部署在生产实际中的路由支付通道网络。

12.8结论

我们仅研究了几个可以使用比特币区块链作为信任平台构建的新兴应用程序。这些应用程序将比特币的范围扩大到超出付款和超越金融工具的范围,以涵盖许多信任至关重要的其他应用程序。通过去中性化的信任基础,比特币区块链是一个会释放将在各种行业中产生许多革命性应用的平台。

本章完。

参考内容:
1、本文部分内容摘自《精通比特币》第一版中译本,特此说明并致谢。


我正在发起“和我一起研读《精通比特币第二版》”活动。
我声明,这不是讲课,是讨论,是研读学习,所以需要你的加入,更需要你的参与。
我把这种学习方式作为一次认知学习法[注]的实践。
我希望大家可以和我一起通过将认知学习法与《精通比特币第二版》的研读结合起来,尝试总结出一套可行的区块链知识技能快速入门的方法。
尝试,反思,总结,生成以及组合进行的实践、检验并逐步迭代升级,这是我们的经历也是我们的结果。
这个结果也将成为我们大家一起合作编写的一本书《认知学习比特币》的雏形(所有有价值的讨论都将成为这本书的素材)。
我更希望大家通过本次认知学习方法论的实践以及迭代升级,将这种经过实践的学习方法迁移到更多领域的学习中。
所以希望我们携手走入第二季,第三季......

欢迎扫描二维码加入。

欲知详情请扫描二维码
精通初稿
Web note ad 1