LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 闪电般的速度——揭露比特币交易原理

闪电般的速度——揭露比特币交易原理

2019-10-15 头等仓 来源:区块链网络

要了解闪电网络的工作原理,就要先明白比特币交易的工作原理,以及UTXO和比特币脚本的定义。闪电网络是在UTXO和比特币脚本之上设计的一种激励机制。

简单概括——两个系统与三种交易

闪电网络的诞生原因非常简单。如果你打算烹饪两个鸡蛋作为早餐,就不会每天都去Costco超市购买两枚鸡蛋。相反,你会一次性买上几十个鸡蛋囤起来,免去每天都去超时购买鸡蛋的麻烦。相对而言,比特币作为一种转账服务,交易速度本身较慢。每秒只能处理大约7笔交易,与Visa或万事达等其他支付网络相比相差甚远。为了解决交易速度慢的问题,就像存储食物一样,我们可以在比特币网络的线下储存一些代币,再建立一个支付系统,于是闪电网络出现了。

有两个系统需要区分下,一个是原始的比特币网络,另一个是闪电网络。两个网络系统用不同的交易方式来流通比特币,根据资金流向的不同,可以分为以下几类:

· 比特币网络,也就是当前大多数转移比特币的方式,我们称之为第一层交易。

· 闪电网络,一种更快转移比特币的方式,我们称之为第二层交易。

· 在闪电网络和比特币网络之间转移,我们称之为跨层交易。稍后,我们将看到,跨层交易本质上是一个第一层交易,而闪电网络是比特币区块链上一个独立实体。

在本系列中,我们将详细讨论这三种类型的交易。

第一层交易

比特币被形容为分布式账本,也就是说它是一本记录每个人账户信息的账本,人人手中都有一份副本。但是账本里面包含了什么内容?如何记录?使用什么格式?在继续之前,先把重点划出,这样便知把注意力放哪里了。我们无需关心比特币的生成过程,也就是说这里不讨论挖矿。我们关心的不是密码学的用途,而是它经受住了时间的考验。即便比特币应用的加密函数符合法律要求,也没有科学家或数学家能证明比特币万无一失。事实曾有高手试图破解比特币,但都失败了,这给了些许信心。

UTXO是什么——树和链表

你曾思考过计算机如何存储数据吗?计算机不能随随便便存储一条信息,就像图书馆里不能随意排放书籍一样。因此计算机需要以某种方式排列数据,便于管理才行。于是数据结构发挥作用了。计算机需要根据具体情况使用一组不同的预定义格式,以有序的方式存放数据。两种格式,也就是亟待我们理解的数据结构链式列表和树格式。

当我们观察母亲和她们的孩子时,树状结构就像她们的家谱。

1571034487282839.png

上图中最上方的Grandmother(祖母),用计算机术语来表示为树的“根”,最下方的一列称为树的“叶”(堂兄弟姐妹以及你)。链表是一种特殊的树,从树中的叶子浏览到根获取一段信息。譬如,你想列出所有为你捐过钱的人,它会是这样的,

1571034500689030.png

也可以表示为带有链接项的列表,

1571034515765558.png

现在让我们看看比特币如何在设计中应用树和链表的。

通常,当你通过银行转账时,比如你要给爱丽丝汇100美元。发生的情况是,钱将从你的银行账户中扣除,爱丽丝的账户余额将相应增加100美元。钱是从一个账户流向另一个账户,而比特币则不是这样。在比特币中,你没有账户,只有交易记录。例如,鲍勃是一个矿工,有一笔属于他的25个比特币的记录,这个记录会被真实地写成,

1571034505575260.png

当鲍勃决定花费这25个比特币时,他必须把25个比特币当作根,并形成树状结构。如果他想以1ETC的价格从埃隆·马斯克手中购买一辆特斯拉,他会产生3笔新记录,

· 支付给埃隆·马斯克1 BTC;

· 付给矿工的交易费,假设是0.00001 BTC;

· 剩下的钱以零钱的形式转回给自己,也就是23.99999。

这些记录将被放入树中,

1571034520756616.png

一旦这棵新树建立起来,鲍勃就会进行传播,告诉其他比特币账户所有者(比特币节点)更新他们的账簿,这样每个人都知道鲍勃已经发送了1 BTC给埃隆·马斯克。但如何确保别人不会作弊呢?似乎没有任何保护措施阻止他人改写这些记录,其他人能简单地把这些记录的所有者变成他们自己,从而窃取这些钱吗?这个问题,我们稍后再讨论。

一旦埃隆·马斯克听到广播,并对交易获得的确认数感到满意,他就可以把特斯拉交给鲍勃了。好了,现在埃隆·马斯克觉得无聊了,他决定从两个经销商50 Cent和Snoop Lion手里购买一些大麻,每人支付0.001 BTC, 埃隆·马斯克会像鲍勃那样更新记录,将交易记录做成一棵树,用1 BTC作为根,看起来就是这样,

1571034524118234.png

现在整个账本看起来是,

1571034528795536.png

如果鲍勃此时决定再次花费记录的25个BTC来作弊,他能做到吗?当然,他可以随心所欲地画这棵树。然而,由于每个人都有一份原始记录的副本,表明鲍勃已经花费了25个BTC,如果鲍勃试图广播伪造的记录,整个网络将拒绝它,因为它与“真实的”历史不同。要成功地完成第一层交易,通常需要三个步骤。

1.创建交易,在原来的树上添上交易,更新原来的树。

2.在交易上签字,证明你花的钱属于你本人。目前,我们使用Owner字段来表示所有权。稍后,我们会看到,我们在记录上签名来花费这笔钱。

3.广播,将交易记录发送到比特币网络,其他人验证、确认和更新自己的记录。

整个过程就像用支票转账一样。任何人都可以在支票上写上金额,但支票只有在你签字后才有效,而且收件人需要将支票存入自动柜员机才算支付完成。你可以但没必要签署大量的支票,只要支票成功存入便可以了。在比特币中,你可以创建大量相同记录的交易,却不广播。因为一经广播,只会接受(确认)一笔交易。这个特性使闪电网络成为可能,在大多数情况下,闪电网络所做的就是创建交易而不广播这些交易。

一个小小修改

在真实的比特币交易中,不会明确记录支付的交易费用。相反,交易费用是隐式给出的。

创建新交易时,遵循新记录的比特币总额不能大于旧记录总额的规则。便是用旧费用减去新费用的总额来计算所支付的交易费用。在鲍勃的例子中,交易费用为25-23.99999-1=0.00001BTC。更新后的分类帐数据如下所示,

1571034534317536.png

从技术上讲,你可以不支付交易费用,但没有人这样做,因为这样你交易会一直悬在空中。

输入和输出

到目前为止,我们只提到了单个记录和单个记录形成的树。但交易到底是什么呢?

1571034539949420.png

在我们的例子中,如果鲍勃决定再次花费比特币,他将遵循以下步骤,

1.在整个树中查找a)属于他的记录(所有者:鲍勃)和b)他还没有花费的记录,在我们的示例中,余额是23.9999 BTC。

2.将把23.9999 BTC记录作为根,并在其上绘制一个新的子树,子树上的叶子是发送给接收者的记录。

3.将新创建的子树广播到网络中,一旦它被验证,子树就将包括在整个树中,也就是每个人手中共享的账本当中。

根据我们的示例,子树是最接近代表交易的术语。如果我们将交易过程看成一个管道,将未花费的记录作为输入,新创建的记录作为输出,交易就是转化输入和输出的一段信息,回答钱来自哪里转向何处的问题。这也表明我们可以同时有多个输入。如果鲍勃在树中有多个未花费的记录,一次只能使用一条记录,那么使用这些钱将是一段乏味的体验。因此,尽管分类账的结构保持一致,但交易数据却有所不同,如下图所示,

1571034587583972.png

鲍勃的交易

1571034604545633.png

埃隆·马斯克的交易

好奇鲍勃是怎样得到自己这笔钱的?这里有一笔coinbase交易,向系统生成比特币,

1571034614457992.png

Coinbase交易

对于使用比特币的人来说,需要一直在交易的输出部分找到未花费的记录。在比特币中,不存在账户的概念。相反,一个可花费的单元是一个未花费的交易输出,因此我们将它命名为未花费的交易输出,简称UTXO。在此阶段,记录ID的概念可能会被抛弃。如果你从Transaction 00检查到Transaction 02,三个交易输出都在一笔交易当中,三个交易输入都来自旧交易的输出,因此没必要再给每个输出一个单独ID。可以参考交易输出中的序列号,即Transaction 00中的第二个输出或Transaction 02中的第三个输出。最终的交易数据如下:

1571034621568279.png

鲍勃的交易

1571034630955007.png

埃隆·马斯克的交易

于是你有了一个基于交易的系统,即比特币。现在我们深入探讨如何确保交易的安全性。

比特币脚本——基础

在上述的例子当中,要发送交易时,只需在所有者字段中写下接受者姓名,并祈祷其他记账者不会动用这笔资金。但世界不是这样运作的。在传统世界,没有第三方的干涉、监督与管理,就无法建立信任。比特币用解决难题的方法建立信任,发送者创建一个难题,能解决这个难题的人就能花费这笔钱。例如,如果爱丽丝要给鲍勃发送1个BTC,她会使用自己其中的一个UTXO,并创建一个如下所示的交易,

1571034649903924.png

爱丽丝发送一个BTC给鲍勃

一旦爱丽丝广播了这笔交易,网络就会意识到爱丽丝的UTXO已经用完了,谁能解开这个难题,谁就拥有这笔钱。当鲍勃从网络上看到爱丽丝完成付款时,就可以交付之前承诺的商品或服务了。

如果鲍勃想花费他的钱,将钱发送给查理,他需要,

1.解出UTXO中指定的原本难题,就像解锁属于自己的钱一样。

2.提供一个只有查理答案的新难题,就像用查理的锁把钱锁起来一样。

简化的交易如下所示,

1571034662922198.png

鲍勃发送一个BTC给查理

当查理想要使用自己的UTXO时,也是同样的流程。爱丽丝的UTXO也是来自其他人(或属于她自己),当她使用它时,她也需要为指定的难题提供一个答案。整个交易全貌如下,

1571034668513498.png

链接在一起的UTXO列表

现在你了解了。UTXO由三部分组成,

· 前业主的解决方案;

· 比特币数量;

· 当前所有者的新难题。

很快,我们将把这三个部分映射到交易的全貌中。

验证交易

交易难题相当于一把锁,确保只有特定的所有者才能打开这把锁。但作为接收者,如何确定自己已经拿到钱了?

让我们看看之前的例子,一个简化的树结构,

1571034673309060.png

如果想要检查从埃隆·马斯克那里收到的钱是否合法,就要重点检查这颗树上的链表。

1571034678102570.png

要检查就需要验证这个链表当中的所有难题解。按降序排列,会是这样,

· 检查埃隆·马斯克提供的解(蓝色框)可以解出埃隆·马斯克的难题(棕色框);

· 鲍勃提供的解(棕色框)可以解出为鲍勃的难题(灰色框);

· 检查矿工提供的解(即灰色框中的鲍勃)可以解出矿工的难题。

一旦验证完毕,就能确保交易是合法的。针对所有的记账者,即比特币节点,每当他们收到新交易,这个验证流程是他们在更新自己副本数据前需要做的。针对50美分的最后一步是检查难题确保钱是给到他。如果是,就等待一段时间,直到该交易获得足够的确认数。一旦钱到账,就能确定这笔钱是属于他的。

什么是难题?

难题可以是任何内容,只要它是可计算的。例如,A加B等于4(求A,B),也算是一个简单的难题。再例如,像宇宙的目的是什么就不算一个难题,因为这个问题没有答案,至少这个问题还无法定论。

那么,从结构和语义上来说,难题到底是什么呢?

第一步是理解难题使用的语言。当你想让电脑为你做某事时,你需要说一种它能理解的语言。比特币存在于电脑中。当你想用比特币做一个难题时,你必须说它能理解的语言。在这种情况下,难题使用的是一种名为比特币脚本的语言。

这个时候你可能会犹豫要不要学习一门外语,其实只要会一些基础知识你就能明白比特币的强大。比特币脚本是一门相当简单的语言,我会进行演示,而不用语言来解释为什么这样为什么那样,足以让所有人理解闪电网络的工作原理。如果你感兴趣,可以观看这个讲座,以及阅读这本书。

比特币脚本魔法

在纸上做加法时,比如二加三,你只需要写,

1571034694582304.png

在比特币脚本中,你可以这样写,

1571034698770884.png

如果你与大多数人一样,从左读到右,再从上读到下,可能会对比特币脚本的顺序感到迷惑。之所以这样写,是因为计算机对事物的理解与常人不同。

要理解比特币脚本如何工作,一个方法是想象经典学校游戏“河内塔”(towers of Hanoi)的画面。

1571034703634575.png

比特币使用的是一个变化版本。左边的一堆盒子,类似比特币脚本中的指令。

1571034707716561.png

当比特币处理它的脚本时,它用的是一个死板且相当严格的方法。它会从左边的棍子里拿出一个盒子,然后放到右边。根据指令的内容,它可以使用预定义的规则执行额外的任务。例如,上面提到的加法脚本可以表示为:

1571034711564376.png

程序如下,

1.电脑作用于最上面的盒子。在本例中,提取整数2并放到右边。

1571034714123856.png

2. 再次提取左边最上面的盒子,即整数3,并将其放到右边。

1571034719136078.png

3.它一直作用于最上面的盒子,直到提取完所有盒子。最后一个盒子OP_ADD表示加法运算,提取出来并放到右边。OP_ADD是一个预定义的指令,它所做的就是将下方的两个盒子相加,并创建一个新盒子来返回总和。所以在右边的棍子上留下了一个数值为5的盒子。

1571034723760585.png

OP_ADD是许多预定义指令之一,我们将这些指令统称为指令集或操作码。完整的指令集可以查看这里的链接。本文,我们只重点关注闪电网络的工作的指令集。

比特币使用的语言被称为比特币脚本。然而,当一组指令放在一起形成一段代码时,我们称之为脚本。如果把比特币中的操作码放在一起,我们也把它命名为一个脚本,或者更具体地说,一个比特币脚本。

脚本

现在该揭开前面提到的用比特币脚本编写的难题和解对的面纱了。技术术语是锁定脚本(puzzle)和解锁脚本(solution)。验证完后,我们会将解锁脚本放在锁定脚本之上,并通过一个比特币客户端运行它。

1571034734297310.png

如果结果错误(用数字0表示),通常意味着所提供的解锁脚本(解决答案)不正确,因此交易无效。否则,如果结果为正确,且是除0之外的任何整数,则可以确保交易有效。

在我们前面的例子中,脚本2 3 OP_ADD是一个糟糕的锁定脚本,因为它返回了数字5,这意味着验证结果总是为正确,因此任何人都可以使用5作为答案。如果鲍勃从爱丽丝接收到一个交易,他希望的是只有爱丽丝提供的锁定脚本才能解锁。

使用一个名为数字签名的加密应用程序解决了这一问题,数字签名是当今互联网上广泛使用的一种工具。在讨论数字签名时,需要关注四点,

· 签署的消息可以是任何内容,从句子到文档。签署的消息是鲍勃想要取得所有权的东西。在本例中,是爱丽丝发送UTXO交易中包装的内容。

· 私钥,由鲍勃作为秘密保存。他使用私钥对消息进行签名,这涉及一个复杂的数学过程并输出签名。

· 签名,使用私钥签署消息的结果。

· 公钥,一把公钥匹配一把私钥。每个公钥只能映射一个私钥。正如“公钥”一词意味着公开,因此所有人都能看到鲍勃的公钥。

除了鲍勃的私钥是隐秘之外,所有交易内容都是公开的。原始消息、签名和公钥之间存在一种奇妙的关系。在私钥不暴露的情况下,任何人只要知道鲍勃公钥和原始信息,就能验证该签名是否由鲍勃的私钥签署的。由于身处互联网时代,人们都倾向隐藏一些隐私,所以鲍勃的名字不会公开。鲍勃只需公开自己的签名和公钥。在比特币中,公钥就代表鲍勃的身份,同时公钥还有另外一层含义,一旦变化编码,便是比特币地址。

现在,比特币交易是由新UTXO组成,而新UTXO是用旧UTXO作为输出。每花费一笔UTXO,你需要提供一个解锁脚本来解开锁定脚本中的难题,并为你的接收者创建新的锁定脚本。从结构上看,我们将解锁脚本放入输入部分,新的锁定脚本放入输出部分。一个常见的做法是应用数字签名,将资金发送给特定的收件人。譬如鲍勃给爱丽丝发送1BTC,鲍勃发起的完整交易如下,

1571034756777938.png

除了在脚本中应用数字签名,人们还想出了各种各样的难题。比特币脚本确实很强大,闪电网络正是利用了比特币脚本的优势,做出了一个有趣的设计,使比特币交易达到闪电般的速度。

以下是一笔真实的交易,

1571034765732741.png

注意下图,输入脚本和输出脚本是花费的UTXO(旧UTXO)的解锁脚本,也是新UTXO的锁定脚本。

详细的解码交易如下图所示,

1571034787466578.png

其他方法——多重签名和时间锁

在所有的比特币脚本中,有三大脚本功能值得注意,即前面提到的数字签名,加上下面要讲到的多重签名与时间锁。

多重签名是多个签名(OP_CHECK多重签名)的缩写,顾名思义,它是一个涉及到使用多个签名进行验证的函数。它检查提交的签名,如果签名相匹配则返回true(正确)。多重签名就像中国古代的虎符,本质上是一把特殊的锁,只有匹配的钥匙才能解锁。

在比特币中,多重签名函数放在锁定脚本中,指定要解锁的签名。在解锁脚本中,花费者(接收者)需要一起提供签名来解锁脚本,这样他们就可以使用UTXO。

例如,如果爱丽丝和鲍勃决定创建一个共同账户,这个共同账户需要两人一致同意才生效,两人将分别创建一个新的UTXO,如下图所示,

1571034795694444.png

于是一个账户余额为2BTC的共同账户便创建了,由爱丽丝和鲍勃共同决定如何使用。

时间锁的功能就像比特币的计时器。它会根据当前时间检查预置日期,直到给定时间过去后才会继续执行任务。比如,如果设定在日期2099/01/01 00:00:00之前不进行2+3的计算,我们就会创建类似于2099/01/01 00:00:00,check time lock, 2,3, OP_ADD这样的任务,它可以表示为,

1571034803567589.png

当我们运行这个脚本时,因为还没有达到指定的时间2099/01/01 00:00:00,所以无法执行其他步骤。时间锁的一个实际作用是延迟付款。如果鲍勃想要给发送爱丽丝 1个BTC,但是他不希望爱丽丝一个星期后才能花费它,他可以在锁定脚本中设置时间限制,

1571034808402525.png

当爱丽丝收到鲍勃的这个UTXO时,她必须等上一个星期,才能满足步骤1的条件,然后提供自己的签名来花费这笔UTXO。比特币中,有应用几种达到时间锁的方法。特别的是,闪电网络使用的OP_CHECKLOCKTIMEVERIFY和OP_CHECKSEQUENCEVERIFY。两种方法工作几乎相似,只是前一种使用的是绝对时间(例如2019/09/23 00:00:00)提交到一个比特币块中,而后者使用一个相对的(例如,未来3天之内)。

了解比特币UTXO和比特币脚本了,了解闪电网络的工作原理就轻松了。

原文:https://blog.goodaudience.com/till-its-lightning-fast-uncover-bitcoin-transactions-9c2a5cc94144

稿源(译):https://first.vip/shareNews id=2259&uid=1

—-

编译者/作者:头等仓

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...