主页 > imtoken官网网址 > 以迪斯科舞为例解释为什么比特币需要闪电网络
以迪斯科舞为例解释为什么比特币需要闪电网络
本文由 Ambi Labs 赞助
(也想赞助橙皮书?)
从特朗普发推到孙哥道歉,最近圈内发生了很多“吸睛”事件,但它们真的会对整个生态产生什么重大影响吗?
我不这么认为,随着时间维度的拉长,技术进步是关键的影响因素。
今天的文章是上周 Reddit 上最受欢迎的帖子之一。 它用一个非常流行的例子来解释为什么比特币需要闪电网络以及比特币支付是如何逐渐完善的。
文章很长,建议先敲代码再看,enjoy~
1个
第一代:中本聪的破nSequence频道
虽然中本聪做了产品,但是中本聪的版本(包括支付通道)真的很烂。 我们必须自己修复它,将 RBF 添加为附加功能
初始规则是,如果交易 A 的输入与交易 B 的输入相同,并且 A 的 nSequence 更大,则 mempool 将 B 替换为 A。
0xFFFFFFFF是nSequence可以取的最大值,这会导致事务被标记为“最终事务”,无法在内存池中被替换。
nLockTime 和 nSequence 正是“nSequence 通道”具有如此奇怪规则的原因。 nLockTime 只能在 nSequence 小于 0xFFFFFFFF 时起作用。 如果 nSequence 为 0xFFFFFFFF,则 nLocktime 将不起作用。
举一个简单的例子:
1. 你去酒吧告诉酒保你会在酒吧关门时付钱。 因为我们在比特币宇宙中,时间是以区块高度的形式来衡量的,所以柱子收盘的时间就是未来某个区块高度。
2.当你喝第一杯酒的时候,你从你的资金中拿出一笔钱,做一笔交易来支付给调酒师。 此事务有一个从 0 开始的 nSequence 和一个 nLocktime(相当于柱的关闭时间)。 你创造交易,酒保给你饮料。
3.如果想多喝几杯,需要重新创建一个类似的交易,把多出的钱加到调酒师的交易中(这样随着酒水钱的增加,交易的产出会不断增加),但是这个n 一笔交易的Sequence在原来的基础上加1。
4. 无论哪种方式,您最终可能会出于以下两个原因离开酒吧:
(1) 酒吧打烊了,当nLockTime标记的打烊时间到来时,酒保可以广播最新的交易,然后让保安把你踢出门。
(2)你不想再喝酒伤肝了,于是你把最近一笔交易的nSequence辞去0xFFFFFFFF,这是它能达到的最大值。 这允许酒保立即拿到他的钱(如果 nSequence 为 0xFFFFFFFF,nLocktine 不起作用),因此他可以礼貌地请保安护送您出门。
这是支付渠道,通过创建包含之前交易的“最终”交易来关闭。 当然这里没有 rounting,因为通道是单向的并且有最大生命周期限制。 但是让中本聪走吧,他需要休息一下比特币为什么要收款码,而且他正忙于发明比特币。
还记得我说过这个支付渠道坏了吗?
这是因为 mempool 规则不是共识规则,无法验证(mempool 中的任何内容都无法在链上验证,每当我听到有人说“让我们根据 mempool 的大小来确定块大小吧!”我不得不感叹,内存池的状态无法通过链上数据验证)。 全节点看不到你签署的所有交易,只有nSequence最大的交易才真正上链。
所以你可以这样做:
1.成为吴忌寒的朋友,因为他拥有超过51%的算力。
2.给吴忌寒一些你点的酒,作为与你合作的奖励。 比如你点了100杯酒,你和吴忌寒分了酒给他50杯。
3. 酒吧打烊的时候,吴忌寒让自己的矿机去挖那笔nSequence为0的交易,只付一杯酒水的deal。
4、由于全节点没有办法验证nSequence,所以会接受nSequence=0的版本然后确认,把只付了一杯酒的钱写入区块链。
5.酒保怒火中烧,从吧台底下掏出一把枪,想射死你和吴忌寒。
6、吴忌寒用他的神通(其实是矿机的蒸汽)让子弹减速,子弹就像风吹花瓣一样轻轻碰到你。
7.酒保嘴里念叨着听不见的话,突然衣服被扯掉了,真的变成熊了!
8. 你盯着它看,心想如果莱昂纳多躲过熊掌,你也能,他只是个有钱的演员,然后你摆个姿势说“找我耍把戏!”
9.有人可以继续帮我补吗?
下面是知识点:
1. 遇到熊很糟糕。
2. 你不能因为闪电网络不在链上就立即否定闪电网络并启用所谓的“中本聪版本”。
Nakamoto 版本是一个带有 nSequence 支付通道的半成品。 在该方案中,链上交易代表多个逻辑交易支付的总和,这与现代版本的链下技术几乎相同。 该技术实际上是如何工作的)。 nSequence(仅指这个领域,不是现代意义上的)早在Windows Alpha 0.1.0就存在了。
3. 矿工完全可以绕过内存池规则。 事实上,nSequence 可以成为可选函数(RBF),因为矿工受到 nSequence 系统的激励,始终遵守 RBF 规则。
我是说,你给吴忌寒的酒,除了是你给矿工挖特定版本交易的费用,还能是什么?
4.中本聪也犯过错误,最初的nSequence设计就是其中之一。 今天,我们不再像这样使用 nSequence。
改进中本聪的原始版本是比特币开发的一部分,因为随着时间的推移,我们会学到中本聪永远不会知道的事情。 中本聪是这项技术的里程碑。 但他永远不会是最后一个,也不会是最重要的一个。 他将被历史铭记,但只是作为先驱。
2个
斯皮尔曼频道
Spilman 通道是一种激励兼容的限时单向通道,实际上是中本聪通道的改进版。
现在,我们知道如果你试图在贸易通道作弊,调酒师会变成熊来咬你。 而且我们知道你是吴忌寒的好朋友,酒保绝对不会接受让客户和矿工联手骗人的支付渠道方案。
好消息是,杰里米·斯皮尔曼 (Jeremy Spilman) 想出了一个新的解决方案,可以防止顾客欺骗调酒师。 首先,你和酒保执行这样的仪式:
1. 你拿出一些资金,创建一个资金交易来支付你和酒保之间的 2/2 多重签名地址。 您现在不广播交易:您只需对其进行签名并获取交易 ID。
2. 您创建另一笔交易以返还上述资金。 此交易有一个 nLocktime,其值是柱的收盘时间加上区块高度。 您签名并将退款交易(但不是上面提到的资金交易)交给调酒师。
3.调酒师签署退款交易并退还给您。 现在这是合法的,因为你和调酒师都签了名。
4. 现在您将第一笔交易广播到链上。 你和调酒师在开始消费之前等待交易得到深入确认。
闪电网络用户可能对上述步骤有些陌生。 这是支付通道的资金创建过程! 支付给 2/2 多重签名地址的第一笔交易用于为通道提供资金。
然后你开始这样买酒:
1. 对于第一杯酒,你创建一个支出注资交易(即第一笔交易)的输出,将酒的成本发送给调酒师,然后将剩余的返还给你。
2. 您签署协议并将其交给调酒师,他为您提供第一杯饮品。
3. 为了再喝一杯酒,你要创建一个类似的交易,先把买新酒的钱加到你之前给酒保的钱上,然后把剩下的钱还给你。 您签署协议并将其发送给调酒师,调酒师再给您一杯酒。
4.最后:
(1) 如果到了酒店关门的时间,酒保将签署最新的交易,完成所需的双重签名并将交易广播到比特币网络。 由于退款交易的广播时间为收盘时间+1,收盘前不能使用。
(2)如果你的肝受不了,想早点离开,只需要告诉调酒师关闭频道即可(调酒师可以随时播报最新版本的交易关闭频道,调酒师不这样做是因为他想让你多呆一会儿,再喝两杯)。
(3) 如果您只是在酒吧闲逛但从不买任何东西,那么在关闭时间 +1 时您广播您的退款交易并取回所有资金。
现在,即使你给吴忌寒50杯酒,你也不能让他挖到原来的交易(那笔交易只付了一杯酒的钱),因为它是一个2/2的多重签名地址但是它只有你自己的签名。
您需要调酒师的签名才能使交易合法,但他当然不会愚蠢到调酒师不给签名以使旧版本的交易合法并为自己少拿钱。
那么,问题解决了,对吧? 解决这个问题? 让我们试试吧。 你得到你的资金,将它们放入资金交易,完成退款交易,确认资金交易......
确定注资交易的深度后,酒保意味深长地笑了笑。 他打电话给保安,威胁地盯着你。
“我拒绝为您服务,”酒保说。
“好,那我走了”你坏笑道,“我会通过退款交易把钱要回来,给大众点评差评!”
“等一下,”酒保说。 他的声音让你背脊发凉,仿佛还记得刚才你逗他似的,“你看刚刚确认的那笔注资交易的交易ID。”
“它出什么问题了?” 你勇敢地问,打开你的笔记本电脑,找到一个值得信赖的区块链浏览器。
你接下来看到的会让你害怕。
“搞什么?交易ID变了?!你他妈的改了我的签名??这怎么可能?我把唯一的私钥藏在一个密封的信封里,放在一个神秘的戈壁滩上的保险柜里,一群勇敢的人游牧民族守护着它,他们以自己孩子的鲜血发誓,誓死捍卫这个秘密!”
“你不知道吗?” 酒保笑了。 “签名只是非常大的数字。签名中的令牌可以更改,从正数变为负数,或从负数变为正数,但签名仍然有效。即使不知道私钥,任何人都可以这样做。但比特币包括签名在生成的时候在交易ID里面,所以这个小改动也改变了交易ID,有人想把签名和交易主体分开,他们说签名延展性(signature malleability)不会再影响交易ID比特币为什么要收款码,但我敢打赌,我可以让我的好哥们吴忌寒拖延这个'Sepsig'(单独签名)项目很长一段时间。
吴忌寒是个好人,只要我给他51瓶啤酒,他就愿意挖那个变价的deal。”他笑得更开心了,“你的退款deal恐怕不行了,因为它要的那个spend 交易id根本不存在。
好吧,让我们谈谈吧。 你把你注资交易中99%的资金给我,作为交换,我会在链上为你签署那笔交易。 如果你说不,你就什么都没有了。 但是我和所有的 HODLers 都会为发行量少一点而高兴。 接受这笔交易,您将剩下 1%。 你拒绝我,我也不会失去什么,你好好想想吧! "他的眼里闪着贪婪的光。
你学到什么了吗?
(1) 报复很糟糕。
(2) 交易延展性较差。 这就是我们在隔离见证中修复此错误的原因。 MtGox 声称他们受到了这种漏洞的攻击。 有人一直在搞乱他们的交易签名,导致他们的资金被反复提取,但修复交易延展性的主要目的是支持支付渠道。
(3) 包含签名得到哈希,最终判定交易ID的设计是错误的。 中本聪犯了很多这样的错误。 我们必须重申“中本聪不是智慧无穷的天龙人”。
3个
CLTV 受保护的 Spilman 频道
使用 CLTV 作为退款分支。
这个和Spilman通道的区别在于退款交易被退款分支代替了。 2015年以后启用OP_CHECKLOCKTIMEVERIFY(CLTV)后才有这个解决方案。
正如我们在 Spilman 频道中讨论的那样,交易延展性意味着任何在链下预注册的交易都可以在资金交易未确认时通过更改资金交易的签名来使预注册交易无效。
这可以通过简单地向比特币脚本中的特定分支添加一些特殊要求来避免。 现在,退款分支可以为支付通道创建最大生命周期,从我们之前对 OP_CHECKLOCKTIMEVERIFY 的介绍,我们知道这只有在有预注册的 nLockTime 的情况下才有可能。
通过CLTV,我们可以在你要付费的脚本中加入很多分支判断,使其避免上述问题。
为了设置资金交易,您现在支付给一个脚本,而不是支付给 2/2 地址,这基本上等同于开始时的 2/2,但随着时间的推移变成 2/2 单签名地址。 这消除了预先注册交易的需要。
您稍后可以使用任何已确认资金交易的交易 ID 来创建您的退款交易。 既然资金交易已经确认,就不可能更改交易ID。
4个
托德微支付网络
闪电网络最直接的前身是 Peter Todd 介绍的 hub-spoke 模型。
在这种模式下,付款人和收款人没有直接连接,付款人和收款人都连接到一个中心枢纽。
这允许任何付款人使用集线器上的相同支付渠道向任何收款人付款。 同样,它允许任何收款人使用同一渠道从任何付款人处收款。
还记得之前的 Spilman 例子吗? 开通调酒频道后,需要等待资金交易确认。 这可能需要一个小时。 然后想象一下,你需要与所有你想付钱的人开放渠道。 这是不可扩展的。
因此,中心辐射模型有一个清算所,可以将资金从付款人转移到收款人。 “月光”项目就是采用这种模式。 当然,在这种模式下,hub 会知道谁是付款人和收款人,因此 hub 具有审查交易的能力。 当然,通常hub审核更高效的方式是不再维护它要审核的payer和payee的channel(因为如果hub不处理交易,channel中的资金只能被锁在它没用)。
具有监控支付的能力意味着中心可以出售私人交易数据以获取利润。 今天,这种侵犯隐私的行为是不能容忍的。
还有一点值得注意的是,如果真的大规模推广这样的网络,但它只有一个单向通道可以使用。 但是一个人可能是付款人,也可能是收款人,你需要分别创建收款通道和支付通道。 更糟糕的是,如果你想将资金从接收渠道转移到支付渠道,你需要在链上关闭和打开它们。
5个
Poon-Dryja闪电网络
Poon-Dryja 是双向双向通道。
Poon-Dryja 通道的机制有两个重要变化:它是双向的,没有时间限制。
中本聪原始版本和Spilman变体都是单向的:这里有两个不同的当事人,付款人和收款人,如果收款人想要退款,或者收款人想从付款人那里买东西,他们也不能使用同一个频道。
Poon-Dryjam 机制可以使信道双向。 您不仅仅是付款人或收款人,只要您的交易对手在线,您就可以随意收付。
此外,与 Spilman 变体不同,这些段落没有时间限制。 您可以根据需要使频道保持活动状态。
这两个特性结合在一起,形成了大多数人没有意识到的强大的扩展性。 在单向支付通道中,您需要单独开通收款和支付通道。 您需要定期在链上执行操作以“反转”支付通道的方向。 其次,由于 Spilman 通道具有固定的生命周期,您必须定期关闭和重新打开通道。
一个无限生命周期的双向通道,你一生中可能只需要进行两次链上交易,一次是在你开通通道的时候,一次是在你死后分配遗产的时候。 这就是这个频道的力量。
Poon-Dryja双向通道的交易结构我就不多说了,非常复杂,大家可以到别处找通俗易懂的图来了解它的机制。
下面说说Poon-Dryja通道的一些常被人们忽略的缺点(因为它们被完美解决了)。
您必须存储此通道的所有撤销密钥。 每次频道更新都需要存储一个revocation key,也就是说仅仅一个频道,一生中需要存储数百万个key,大小会达到几兆。
RustyReddit 解决了这个问题,我们可以从一个种子密钥开始生成所有密钥。 每个密钥都是该种子密钥的重复 SHA256。
例如,让我告诉你,我的第一个撤销密钥是 SHA256 (SHA256(seed))。 您可以将其存储在 O(1) 中。 下一次撤销时,我会通知您撤销密钥是 SHA256(种子)。 从SHA256(seed)开始,可以自己计算SHA256(SHA256(seed))(也就是之前的吊销密钥)。 所以你只需要记住最近的撤销密钥,你就可以计算出之前的每一个密钥。 当你打开一个频道时,你对你的种子密钥执行一百万次 SHA256,然后将最终结果作为第一次使用的撤销密钥。 每当您需要撤销密钥时,只需将其删除即可。 一层 SHA256。 RustyReddit 还提出了一种非常高效的存储结构 O(log n),shachain。 如果出现问题,您可以快速找到原始吊销密钥。 人们不再谈论这个存储问题,因为它被完美地解决了。
另外我要强调的是,当闪电网络论文从旧的 hub-spoke 模型发展而来时,现代闪电网络已经吸取了教训,不再区分“hub”和“spoke”。
闪电网络中的任何节点都可以用作其他节点的枢纽。 所以,即使你只在执行期间支付,或者只转发交易,至少到最后你仍然是部分转发节点(“hubs”)。 这大大减少了只有几个枢纽节点带来的隐私问题:转发节点只能通过它们获取很少的信息,因为付款人和收款人之间的距离太大,最终的收款人和付款人可以是任何人闪电网络。
又到了知识点时间:
(1)只要我们足够努力,就可以实现去中心化!
(2) 只要我们都是枢纽,枢纽也可以成为好东西。
(3)聪明人能解决问题,所以才聪明。
6个
未来
在闪电网络之后,是 Decker-Wattenhofer 双工微支付通道 (DMC)。 它使用了一个很棒的“nSequence 递减通道”,使用了一种新型的 nSequence(不是中本聪破坏的那个)相对时间锁语义。 它使用多个“递减 nSequence”结构,终止于一对 Spilman 通道,每个方向一个。
通道结构实际上可以在其中包含更多通道构造(Decker-Wattenhofer 将一对 Spilman 通道放入一系列“递减 nSequence 通道”中),这使我们更进一步并提出 Burchert-Decker-Wattenhofer 通道工厂。
基本上,您可以持有多个包含在一个更大的多方“通道”中的两个参与者的通道结构(即,在一个“工厂”中持有多个通道)。
更进一步,我们还有 Decker-Russell-Osuntokun 或“eltoo”结构。 这篇文章够长了,我稍后再讨论。
比特币的链下可扩展性比你想象的要强大得多。