区块链入门 | 一文了解闪电网络交易全过程

[复制链接]
7823 |0
发表于 2019-11-8 20:06:24 | 显示全部楼层 |阅读模式
作者:哥伦比亚大学学生Y.
翻译 :头等仓(First.VIP)Gisele
编者:原标题为《一文遍历闪电网络发展进程》

本文概述了闪电网络发展的历程。
假定读者了解UTPundiO,BTC脚本和数字签名的概念。
闪电网络为BTC扩容而生。
如果两个参与者决定加入闪电网络,第一步是创建一个多重签名地址建立共同帐户,即在他们之间打开一条通道。建立通道后,将维护用于在网络内的转移资金。如果出于某种原因需要将资金提取到BTC网络中,则参与者可以合作关闭通道。如果参与者决定开放通道,资金就会从BTC网络流向闪电网络,除非他们希望关闭通道,否则资金绝不能反向流动。一般而言,跨层交易的两个预期场景是打开和关闭通道,不同的是,当某个参与者长时间不响应或作恶时,其他相关参与者可以单方面关闭该通道。
建立共同账户
要使用闪电网络,第一步是发送BTC。参与者将一起创建多重签名地址,比特币将被发送到该地址。例如,Alice和Bob决定开设一个总余额为1.5比特币的通道,Alice提供0.5比特币,Bob提供1比特币。
他们各自创建一笔交易,以便为公共账户提供资金,除非双方同意,否则锁定在该地址中的资金将无法支出。

为了演示,省略了输入中的交易ID和输出编号。

为了演示,省略了输入中的交易ID和输出编号。
现在考虑以下情况,
• 其中一位参与者拒绝合作怎么办?
• Alice或Bob或两者决定关闭通道并收回他们的钱怎么办?
• 需要更新通道余额怎么办?假设,Alice从Bob那里买了东西,付给Bob0.1 比特币?
在解决这些问题之前,需要强调,闪电网络的设计应兼备安全性和去中心化。在闪电网络中进行资金转移应该像在BTC网络中一样,即不需要依赖任何第三方。因此,需要使用BTC脚本更复杂的设计。BTC网络的安全性依赖于算力,而闪电网络通过在其系统中引入惩罚机制来提高资金安全性。
先解决资金问题,第一层交易分三步完成,
1.创建交易;
2.对交易签名,或更笼统地说,提供解锁脚本;
3.广播已签名的交易;
也许在这之间可以存在一个天才的设计?
原始方式:无需签名即可提供资金
Alice和Bob可以在不签名的情况下创建上述相同的交易。未签名的目的是在任何人拒绝合作时可以退出通道。由于交易是未签名的,没有人做出承诺,因此目前不会造成损失。通过引用未签名的交易,Alice和Bob可以创建一个新交易,以决定多签名地址中锁定的资金应该去哪里。在当前情况下,应该给Alice0.5比特币,给Bob1比特币。

创建完成后,与该交易有关的两个问题:
1.他们应该签署新交易吗?是的。因为目前大家都没有亏损风险。如果Alice签署了交易但Bob拒绝了,她可以立即中止合作,不需要承担任何费用。反之亦然。
2.他们应该广播新交易吗?否。新交易的目的是防止因参与者不响应而造成的损失。除非另一方没有反应,或者参与者决定关闭通道,否则该新交易将永远不会被广播。
一旦Alice和Bob各自拥有完全签名的新交易副本,则应该签名并广播原始资金交易。新交易类似于租赁公寓时的保证金,是为了表明自己对合约的承诺,当合约失效时,可以拿回保证金。因此,该新交易通常称为承诺交易。
总而言之,Alice和Bob安全打开通道的过程如下,
1.Alice和Bob各自创建了一笔资金交易,但不签名。
2.Alice和Bob根据资金交易创建并签署承诺交易。例如,Alice创建承诺交易,对其进行签名,然后发送给Bob,Bob签名后将其发送回去。或者他们可以为该特定交易交换其签名。无论哪种方式,结果都是它们具有相同的可支出承诺交易。
3.Alice和Bob广播他们的资金交易。
一旦交易得到确认,该通道将获得资金,他们需要找到一种发送BTC的方法。但是,在设计BTC脚本以使余额更新可行之前,这里的关键问题是,如何才能花费未签名交易的输出?
签名类型
通常,以BTC发送交易时,假定所有输入和输出均由同一人签名。同时,在其他情况下,并非所有输入和输出都需要签名,即,用户可能有一个包含多个输入和输出的交易,而用户只想签名某些输入和/或输出。为了提供灵活的交易签名方式,BTC定义了各种签名模式并将其命名为签名标志。就在这时,有四个激活签名标记:SIGHASH_ALL、SIGHASH_NONE、SIGHASH_SINGLE和SIGHASH_ANYONECANPAY,最常见的标志是SIGHASH_ALL。
言归正传,通过从一个未签名的交易中引用UTPundiO来构建交易在目前看来是不可行的。为了实现这种功能,需要对BTC进行更新,即BIP118,它提出对交易签名时要使用的新签名标记SIGHASH_NOINPUT。简言之,该标志是要放入解锁脚本(ScriptSig)中的新指令,它使用户能够基于未签名的交易构建新的交易。BIP118于2016年首次提出,目前仍在开发中。如果进行升级,它将不仅为当前的闪电网络启用双方资金功能,而且还将启用其他第二层协议,例如eltoo,它设想了一种独立的,可理解的方式来更新闪电网络中的余额。
备选方案——单方面资金
闪电网络的实际实施是通过改变资金交易的签名和广播方式来使用单方面资金。首先,任何一个参与者都可以是出资者。Alice决定向Bob购买商品,她可以将付款视为与Bob开通通道的资金。后来,当Bob从其他人那里进行购买时,他可以在不与BTC网络互动的情况下,使用通道中的资金。随着通道数量增加,每个参与者最终都将在帐户中保持一定的余额,这首先意味着要获得双方资金。
如果Alice是最初的出资者,那么至关重要的是确保当Bob没有响应时,她的资金交易是可以追回的。
在BTC中构建交易时,在输入部分中需要参考交易ID和输出编号。因此,对于Alice而言,无需先广播即可创建她的资金交易,并且当与Bob共享她的资金交易ID和输出编号是绝对安全的。当Bob获得信息时,因为没有Alice的签名,所以他对Alice的资金交易无计可施,只能创建一个承诺交易,承诺交易将把钱退还给Alice。步骤总结如下:
1.Alice创建一笔资金交易,对其进行签名,并与Bob共享交易ID和输出编号。
2.Alice和Bob根据资金交易的ID和输出编号创建并签署承诺交易。请注意,资金交易将Alice的钱放入一个多重签名的地址中,如果他们想使用承诺交易将其发送回Alice,则需要Alice和Bob的签名。
3.Alice广播她的资金交易。此时,如果Bob不响应,Alice可以广播承诺交易以收回其资金。

Alice的资金交易保持不变。但是,她不会广播它,也不会与Bob共享签名的交易,而只会给Bob 交易ID(00)和输出编号(0)。

由于BTC在交易中使用UTPundiO,因此这种单方面的资金计划消除了出资者资金损失的风险。尽管该计划可以进一步扩展为双方资金,但雷电协议选择了单方面资金,因为如果单方面资助,则需要的节点间通信较少。
账户余额更新
现在我们有一个可终止的帐户,如何进行更新?Alice发送了0.5比特币来开通通道,她将向Bob发送0.1比特币用于交换笔记本,他们在闪电网络中如何完成呢?
一个简单的解决方案是Alice和Bob可以创建新交易以反映其最新余额。
对于Alice,她将按照以下方式创建交易,对其进行签名,然后将其发送给Bob。由于该交易已经由Alice签署,因此Bob可以签署交易并广播。

注意,我们引用的是Alice的资金交易,而不是承诺交易。
对于Bob来说,除了签名并将交易发送给Alice之外,其他都是一样的。目前,两个参与者都并行执行了两个有效交易,到目前为止,我们总共看到了五笔交易,如下所示:
• 来自Alice的资金交易,已经广播;
• 我们将Alice的承诺交易(归还她的钱)贴上标签TPundi A1。
• Bob也有承诺交易的副本,我们将其标记为TPundi B1。
• 为Alice新创建的交易记录了余额,并更新了余额并提供了Alice0.4比特币和Bob0.1比特币 TNPXS A2。
• Bob还拥有新创建的交易的副本,标记为TPundi B2。
交易简化如下:

这四笔交易在进入BTC网络之前都是有效的,并且如果被同时广播的话,被矿工接受的机会均等。这里可以将BTC当作Tom,他是一个记账者,可以根据听到的第一笔交易来更新分类帐,后面的交易可以不更新。
在当前情况下,从经济上合理的角度来讲,Alice可以广播TPundi A1以换取她应该给Bob的0.1比特币。对于Bob而言,他可能广播TPundi B2,因为这样就有机会将获得0.1 比特币。如果同时广播这两个交易,公平交易的机率是50%,这是不可接受的。
那么该如何解决这个问题?具体来说,我们如何确保所有参与者始终广播最新交易,而不广播旧交易?
先回顾一下交易类型,因为在研究闪电网络中发生的所有交易时很容易感到困惑。
• 如果交易与闪电网络无关,换句话说,它仅发生在BTC网络中,则称为第一层交易。
• 如果交易将资金从BTC网络带入闪电网络,即打开一个通道,或将资金从闪电网络带入BTC网络,即关闭一个通道,这种通常成为跨层交易,因为它与两个网络交互。
• 如果该交易留在闪电网络中,则称为第二层交易。虽然,如果第二层交易被恶意或意外地广播到BTC网络,则它将成为跨层交易。闪电网络就是要确保第二层交易不被交叉。
本质上,在闪电网络中进行的交易可以合法地广播到BTC网络中,这意味着第二层交易可以看作是专门的第一层交易。因为BTC网络速度慢而闪电网络速度快,所以整个设计是要确保尽可能少进行第一层交易。
升级锁定脚本
以前,所有涉及的锁定脚本都只应用了多签(multisig)函数。现在,是否可以通过操纵交易中的输出部分来找到一种更新余额的安全方法。目标很简单,我们将对作恶者实施惩罚,作恶者为广播旧交易的任何人。闪电网络不采取任何可能的惩罚方式,而是一旦对方在一定时间内发现到作恶行为,另一方将损失金钱。
示例中,如果Alice尝试广播TNPXS A1,并记入她0.5比特币的积分,我们希望将其纳入设计中,这样Bob就有足够的时间发现并采取行动,而Alice的0.5比特币将作为惩罚。
时间锁开始发挥作用,尤其是OP_CHECKSEQUENCEVERIFY。它的作用是在广播交易(或更准确地说,是矿工接受)时开始倒计时,并锁定资金直到经过指定的时间范围。如果今天广播具有40天序列时间锁的交易,那么直到40天后才能花费。如果是一年后广播的,则要等到一年后再过40天才能使用。此相对时间锁可以合并到我们的新锁定脚本中,
• TPundi A1万一Bob变得迟迟不响应,Alice可以广播来索要她的资金。
• 她必须等待2个星期,才能使用TPundi A1中的UTNPXSO 。
• 如果Bob没有响应,并且发现Alice已经广播TPundi A1,他可以获得所有资金作为对Alice的惩罚。
升级后的TNPXS A1(我们只关注输出部分):

如果Alice试图在TPundi A1上进行跨层交易,则必须等到两周后才能拿到钱,这是由时间锁强制执行的。同时,如果Bob监视BTC网络并发现TPundi A1已经广播,他可以立即花费0.5比特币。
当前的设计将确保如果广播了较旧的交易,则将Alice的钱作为罚款。另一方面,由于Bob的签名可以花光所有钱,所以它赋予Bob太多的权力,可能使Bob作恶。让Alice能够收回其0.5比特币的目的是保护她免受参与者响应延迟的困扰。尽管如此,Bob还是有可能去欺骗Alice故意不响应,并随后拿走Alice钱。
如此一来,就必须改进设计。
RSMC(序列到期可撤销合约)
当我们使用诸如Alice的签名之类的密钥时,指的是由Alice的密钥之一生成的签名。这里有Alice签名的概念,而从本质上讲,总是有一个私钥创建此签名。另一方面,Alice可以根据需要创建任意多个私钥。这很重要,因为它是不可或缺的属性,可以减少先前设计创建的Bob的优势。
不是在锁定脚本中询问Bob的签名,而是使用了多重签名功能来阻止Bob窃取金钱。当参与者同意通过创建新交易来更新其余额时,将多签函数从旧交易中指定的私钥。
为了演示起见,将私钥命名为保持跟踪。作为一个起点,Alice生成四个私钥,A1,Rick,Batman和Tom。Bob的四个私钥分别为B1,Morty,Robin和Jerry。
对于Alice来说,新的TPundi A1如下:

对于Bob来说,TNPXS B1中的锁定脚本很简单,因为他没有广播它的动机。

通过在TNPXS A1中应用多签函数,Bob的优势被剥夺了。如果没有更新进行的,也就是说,TNPXS A2和TPundi B2不存在,即使Bob不响应,Alice的资金也能得以保护,因为他没有私钥。如果他们想进一步更新其余额,则可以使用类似的锁定脚本来创建新交易。在创建过程中,他们将交换在最后一个交易中指定的私钥。特别是,Alice在创建TPundi A2时将私钥Rick发送给Bob。此举将改变游戏规则,它破坏了Alice广播TPundi A1的动力,由于Bob将使用Rick和Morty解锁脚本,因为Alice可能失去所有的资金。
对于Alice来说,新的TNPXS A2如下图:

Bob的TPundi B2:

如果Alice进行另一次更新并支付Bob0.2比特币,则步骤如下,
1. 创建新交易。Alice和Bob都将生成新的私钥,以便创建上面显示的类似交易。新的交易TPundi A3和TNPXS B3将记入Alice0.2 比特币和Bob 0.3 比特币。
2. 交换旧私钥。Alice将给Bob专用密钥Batman,Bob将给Alice专用密钥Jerry。这样一来没人会广播旧交易。

重申一遍,BoB对广播旧交易TPundi B2没有兴趣。如果Alice决定通过广播TPundi A2来作恶,她将等待两个星期才能花钱。但是,由于Bob拥有私钥Batman,该私钥是由Alice在更新其余额时提供的,并且Robin由他控制,因此他可以立即花费这笔钱。不广播旧交易是Alice的最大利益,Bob必须监视区块链以检查Alice是否作弊。问题得到解决,只要每个人的利益最大化,就不会有人欺骗。这种复杂的,经济的激励驱动设计被称为RSMC,序列到期可撤销合约,它是闪电网络发展的基础。
顾名思义,它是可撤销的,因为可以用新交易代替第二层交易。它使用时间锁函数OP_CHECKSEQUENCEVERIFY,因此有一个序列,表示区块链中的时间(如区块高度或时间戳)。由于资金是按时间锁定的,因此它会到期,直到经过足够的时间才可以花掉。则会就是“序列到期可撤销合约”。
RSMC有其局限性,因为它一次只能服务两个参与者。我们想要的是扩展网络,以便人们可以无缝地在闪电网络上付款。在RSMC上稍加修改,以达到火币全球生态通证LC,哈希时间锁定合约。
火币全球生态通证LC(哈希时间锁定合约)
想象一下,我们有三个参与者和两个通道。一个通道在Alice和Bob之间打开,另一个通道在Bob和Charlie之间打开。如果Alice想给Charlie发送代币,有两种选择,
1. Alice和Charlie可以打开一条新通道进行交易;
2. Alice和Charlie可以利用当前通道。
第一种方法似乎有效,但是随着参与者人数的增加,它无法解决问题。让我们做一个简单的数学。
• 对于3位参与者,我们需要3个通道;
• 对于4名参与者,我们需要6通道;
• 对于10位参与者,我们需要45个通道;
• 对于1000位参与者,我们需要499,500个通道!
通道太多了(计算公式为Cn2)。与Alice和Charlie向Bob求助的替代方法相比,这种方法并不可取。由于他们每个人都已经与Bob建立了通道,为什么不将其进一步发展为来回转移资金的通道呢?
加密哈希函数
为了实现通道之间的路由,我们需要从加密技术中借用一个工具——加密哈希函数,并了解其本能和属性。
哈希函数只是将任何输入映射到固定大小的输出。例如,一个简单的散列函数可以是,取一个单词并按首字母分组。

输入是单词(apple,agent),输出是字母(a)。另一个简单的哈希函数可以是简单的模块运算。例如,我们可以定义一个哈希函数,它接受任意数字作为输入,对它们进行7的模块运算以产生输出。所有输出的固定在0到6之间。

这些哈希函数用于演示密码哈希函数的两个属性,
• 单向函数,即给定输出,很难找到输入。如果输出是1,则很难确定输入值是否为2,9,还是产生余数1的任何数字。或者,给定字母a,很难确定输入是apple还是agent。
• 防碰撞性,这意味着很难找到两个产生相同输出的输入。简单哈希函数没有此属性,因为很容易发现2和9产生相同的结果2,并且apple和agent都被哈希到字母a中。
密码哈希函数通过应用复杂的数学函数实现了这些属性。无需费神就可以轻松理解其设计背后的本能。要建立单向函数,它需要一个数学函数,该函数易于在提供答案时进行验证,但难以求解。或者,更确切地说,要找到有效答案要比验证答案更难。在密码学中,难度越大意味着需要更多的计算能力和时间。因式分解是一个很好的例子。考虑以下,
• 挑战一,找到两个可以相乘得到2449的数字。
• 挑战二,确认31 x 79等于2449。
显然,第二个挑战比第一个挑战容易得多。尽管密码学依赖于复杂的数学模型(例如,离散对数),但其原理不变。另一方面,为了实现抗碰撞性,需要大幅增加可能的唯一输出的大小,以使不同的输入不太可能发生冲突以生成相同的输出。常用算法是SHA256,产生2²⁵⁶的可能输出,这是一个超出想象的天文数字。
密码哈希函数的一个简单用例是隐藏一个秘密,然后将其透露出来(零知识证明)。Alice声称她是第一个知道魔术贴的人,这将使人们成为亿万富翁,但Charlie却不买账。如果Alice直接告诉Charlie消息,Bob将跳出来声称自己拥有真实性。为避免盗用知识产权,Alice将在魔术贴上应用加密哈希函数,与所有人共享结果,并声称她知道魔术贴而无需先将其透露出来。
她使用SHA256对她的魔术贴进行哈希处理,从而生成输出,
8816cee3feb85ccaad0557ffb2f6b38947a27bea4ccdea1835fded53ad71c31a
然后,Alice与Charlie分享了它。Charlie现在可以要求Bob显示与该输出相对应的原始消息。当然,Bob不知道答案,也不能伪造答案。现在,Alice可以安全地告知魔术贴,“金钱是一种社会建构”。
隐藏和揭示秘密
如果Alice想向Charlie发送1个BTC,只要求Bob转账就太天真了。Bob有所有理由自己拿钱。为了解决此问题,在设计中应用了密码哈希函数。如果Alice想向Charlie发送1个比特币,则Charlie要发起付款请求。这是他需要做的
1. Charlie将生成一个随机数r并将其保密。
2. Charlie将应用加密功能对秘密进行哈希处理r,并将哈希结果R与1比特币的请求费用Alice一起发送给Bob。
3. Charlie将等待Bob向他支付1比特币。
Bob收到付款请求以及哈希值后R,会将其转发给Alice,并要求她通过以下锁定脚本进行交易,向他发送1个比特币,
• 如果3天过去了,并且出现了Alice的签名,那么Alice将钱退回。
• 否则,如果出现来自Bob的签名和可以哈希的值R(这是密钥r),那么Bob就会得到钱。

如果Bob可以从Charlie 那里获得密钥r,那么他将能够解锁交易并花费UTPundiO。否则,一旦3天过去了,Alice就能收回她的1个比特币。3天条件是一个绝对时间锁,与之前的时间锁不同。如果Bob不能在3天内提供秘密,它可以让Alice取回她的钱。现在,Bob放心了,如果他知道A的值r,他将从Alice获得1比特币 ,然后可以通过使用锁定脚本创建类似的交易来向Charlie发送1 比特币,如下所示,
• 如果2天过去了,并且Charlie出示了Bob的签名,那么Bob将钱退回。
• 否则,如果显示来自Bob的签名和可以散列的值R,那么Charlie会得到这笔钱。

为了索要这笔钱,Charlie必须向Bob透露密钥r。一旦Bob知道r,他就可以花费他和Alice之间创建的交易。锁定时间的长度随着它靠近最终接收者而减少,即Charlie有2天的时间显示密钥r,而Bob有3天的时间,因此每个参与者都有足够的时间采取行动。Bob 将密钥r透露给Alice 的举动证明,他已将自己的1个比特币发送给了Charlie,因为那是Bob唯一了解密钥的方法。
但是有人可以作恶吗?
Alice的钱仅受3天期限的限制。解锁时间锁后,无论Bob有没有密钥,Alice都可以自由地花钱。至于Bob,他对密钥r的了解完全决定了他花费输出的能力。即使3天过去了,只要Bob可以提供密钥信息,这笔钱对他还是可以花费的 。无论更新余额如何,如果当前设计看起来不错,
• Bob在得知密钥r后便会立即使用他的UTPundiO ,这意味着他将在3天之内广播此交易。
• Alice将在3天后尽快使用她的UTNPXSO,这意味着她将在3天后(如果适用)广播此交易。
但是,如果广播了第二层交易,它将成为跨层交易并触及BTC网络,这违反了闪电网络的原理:尽可能将交易保留在其中。因此,需要一种具有RSMC类似效果的新设计——我们不依赖诚实的人,而是将惩罚那些不诚实的人。

20191108100557_rWKt.jpg

20191108100557_rWKt.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门版块
快速回复 返回顶部 返回列表