区块链是否能做到什么语言不是图灵完备备?

有一个常见的观点就是区块链技術是全新的如果有足够的时间,总有人会做一些有用的东西但与货币无关。我认为这叫做“要区块链不要比特币”综合症在这篇文嶂中,我将打破区块链即将投入使用的神话未来所有事物

有一个常见的观点就是区块链技术是全新的,如果有足够的时间总有人会做┅些有用的东西,但与货币无关我认为这叫做“要区块链不要比特币”综合症。在这篇文章中我将打破区块链即将投入使用的神话,未来所有事物都不一定会是去中心化的这也并非是一种革命性的新技术。

企业对区块链的痴迷始于2014年当时比特币刚刚进入他们的视线。他们没有关注比特币这种具备革命性、创新性、去中心化和数字稀缺性的货币而是从该软件中提取了一个概念,并将其称为“区块链”

当时成立了多个组织,如Hyper(超级账本)、R3以及Digital Asset Holdings(DAH)等他们试图围绕这一技术创造一个市场。

他们的共同点是把区块链这个词用作解决各行各業一系列问题的灵丹妙药按照典型的企业模式,他们把“区块链”这个词简化为他们想要的任何意思

“区块链”一词在2015年前后的发展囹人难以置信。很多人尤其是不懂技术的人,往往对比特币的运作方式只有模糊的认识他们会说“我相信这项技术,但我不相信比特幣”之类的话这显然是那些希望自己在技术上处于领先地位的商人的“共识”反应。

他们这样做的原因有两个首先,比特币在2011年至2015年咗右以及今天在某种程度上给人的印象都不太好比特币与购买毒品、甚至与无政府资本主义者、自由意志主义者等行为有关。其次通過对区块链技术的赞扬,一位高管可能会显得站在技术发展的前沿而这项技术实在太技术了,其他人无法提出有效的质疑

换句话说,支持“区块链”而不是比特币让很多企业给外界留下了很了解这项技术的印象,同时还不需要和比特币扯上关系从随后的行动中可以清楚地看出,他们不知道区块链是什么并为自己的无知埋下了祸根。

他们的无知导致很多对激励系统、博弈论甚至公钥密码学知之甚少嘚平庸的工程师假扮成区块链专家这些“专家”哄骗商业人士,让他们相信针对特定行业的关键问题都可以用区块链、一些开发者和錢来解决。我们的行为已经远远超出了自己的认知在 “要区块链不要比特币”综合症爆发之前,还存在大量的炒作形式

这种不懂装懂嘚行为导致了《区块链革命》等相关书目的出现,这本书承诺改进经济体中几乎所有领域同时含糊不清地解释了很多技术概念,导致许哆高管认为青少年害怕错过“区块链技术”这一新趋势

说句公道话,许多公司都被区块链能够解决本行业实际问题的承诺骗了在医疗荇业,区块链可以在正确的时间向医务工作者提供患者病历同时还不会侵犯患者的隐私。在法律行业区块链将创建完全公平的合约,哃时不需要昂贵的律师说到供应链来,区块链将能够证明某些部件不合格是谁的错或者部件交付数量不足应该如何问责。在艺术、音樂和电视领域区块链将奖励创作者,同时打击盗版和消灭中间人对于在线广告,区块链将准确进行跟踪减少欺诈,并剔除许多不同嘚中间人这些中间人获得了很大一部分利润。关于“区块链”可以解决什么难题我们可以一直说下去。

这些承诺对应着每个行业面临嘚巨大问题这并非巧合。区块链变成了一张空白的画布任何问题都可以在上面画出解决方案。实际上数百家初创企业和行业联盟(其Φ很多都发起了ICO)承诺,将用“区块链”解决所有行业中的低效问题

许多这样的初创公司都是由某个特定行业的资深人士创建的,他们认為唯一缺少的是开发者他们负责创建的区块链系统可以解决所有问题。他们给出的理由是自己有专业知识,知道问题出在哪里只要找几个区块链专家,就能让他们的行业变得更好为自己创造巨大的利润。

如果这些开发者能够满足业界资深人士的需求一切就行得通叻!一个完美的、可审计的、去中心化的加密数据库,能够用零知识证明互查的预言机快速有效地执行TB级的智能合约这能有多难呢?当然,幾行Solidity代码就可以创造一个可扩展、完全正常且可维护的系统从而解决某个行业的最大痛点,对吗?没有这种好事

区块链已经变成了一个毫无意义的流行语,用花哨的术语让人们相信挑战是可以解决的现实情况则大不相同。这些初创公司发现区块链并不是万能药。他们艏先遇到的问题是我们早就知道的比如预言机问题,或者共识问题或者什么语言不是图灵完备备合约的可分析性问题,或者搭便车(坐享其成)问题事实证明,区块链并不是万能的而是由于去中心化的需要,阻碍了这些解决方案的产生

更糟的是,负责创建这些系统的開发者常常完全无视用户和节点的激励机制以及在对抗性环境中可能存在的漏洞。

可悲的是这些诡计的结果是可以预测的。当你在一項很少有人懂的技术上用平庸的人才做出超出自己能力的承诺时,你将无法做出多大贡献这些努力大多没有取得任何成果。创建概念驗证项目的少数几家公司还没有推出成熟的产品已经发布的产品几乎没有吸引力(单日用户数量少于2000名被认为是一个app或网站的彻底失败)。

盡管如此ICO仍然在兜售去中心化区块链。当被指出承诺和结果之间的差异时通常会出现几种不同的争论。

除了比特币你怎么能确定区塊链技术不会有其他产出呢?

只要举一个反例就能证明我的观点:区块链实际上只对健全货币有用。然而在不破坏区块链这个词的基础上,区块链提供的精华是去中心化和权威修改数据很昂贵。这并不奇怪因为这些属性正是你想要的健全货币,如比特币

不幸的是,非貨币项目通常需要一个中心化、可升级的、可扩展的系统因为这是一个受监管、不断变化和发展的行业软件。当与区块链结合时每种需求都变得更加困难。换句话说区块链是不适合这些工作的工具。

即使奇迹般地在区块链上做出了一个流行的应用没有区块链的中心囮应用也会更便宜、更快、更可靠、更易于维护,同时不像去中心化区块链那样存在单点故障换句话说,任何流行的dApp都注定会在成本、速度、功能和规模上输给中心化的竞争对手

那么多人在研究区块链!一定会有产出的。

很多人在做某件事并不意味着愿望会神奇地变成现實(参见:炼金术、冷聚变、飞行汽车等)这么说可能夸张了这一点。飞行汽车至少是可行的而区块链项目大多都在研发方形圆圈或永动機:去中心化的服务进行中心化的控制,这在逻辑上就是不可能的

我都可以想到批评我的人会怎么说了:“Jimmy反对实验、创业和尝试新事粅!”实验是可以开始的,但把钱源源不断地投入失败的实验中只能算是浪费这些“区块链”实验是徒劳的,在现实中几乎没有任何基础是资本和人力的浪费,不会带来任何有用的商品或服务他们所做的就是允许骗子生根。

投入了这么多资金!一定有人能做出东西来!

某些笁程学上的挑战根本不在于资金问题而是创新问题。更糟糕的是当一家公司被要求使用像区块链这样特别麻烦的技术束缚住手脚时,從中得到任何好处的机会就更小了这是寻找解决方案的典型错误。不资金不会神奇地找到一个有利可图的市场问题,区块链也不一定昰最优方案

免责声明:文章不代表币圈子立场,不构成任何投资建议谨防风险。

版权声明:本文来源于币圈子网站转载请注明出处!侵权必究!

}

在之前的课程中我们从较高的层佽讨论它为什么会出现,它的正确性的保障从这一节开始,我们会讨论比特币的细节

比特币的共识机制生成了一个append-only的账本,一旦交噫在账本中再也不能更改。矿工——也即一些有较高计算力的节点生成区块,并且验证交易是正确的(签名是正确的、币没有重复花費)等账本和区块链网络使得比特币成为一种货币。在本文中将介绍一些细节。

区块链实际上就是一个账本账本就是要记账,账实際就是一笔笔的交易那首先看一下,使用下面的记账形式效果如何

第一个交易是形成区块的奖励25个比特币。Alice将17个币转给BobBob转8个给Carol,Carol转5個给Alice然后Alice转15个给David。这种记账方式非常符合我们的直觉因为现实生活中,支付宝、微信、银联都是这么做的但是这种做法的优缺点是什么?

上面的例子中前面的几笔交易我们可能都看的很顺,因为根据之前交易的情况我们很容易判断出交易能够顺利进行。但是看到朂后一笔交易的时候就得想一下Alice有这么多钱支付给David吗?

这种形式的账本也叫作account-based账本这种记账方式的问题是:必须对每个账户的余额进荇查询,才能确定一笔交易是否有效譬如在最后一个交易的时候,得去查一下Alice的账户总共还有多少币剩余。像上面的例子中如果没囿全局的数据结构维护用户的余额,那么可能得一路追踪回去到起始交易看看Alice到底剩多少钱。如果想要快一点那就得额外地维护数据結构,譬如有一个全局的数据结构在每次交易后更新账户余额。

由于这样的问题比特币并没有使用这样account-based的记账方法。比特币的记账方式是类似于这样的:

每一笔交易指明了输入和输出每一笔交易有唯一的标识符,每一笔交易可以有多个输入和多个输出上面的例子做叻简化,使得可以方便地使用序号来指代交易

第一个交易中没有输入,因为它是区块的第一个交易创造了新的币,Alice作为矿工获得了币这25个币也是交易1的唯一一个输出,在之后使用1[0]来指代Alice拥有的25个币在第二个交易中,输入是1[0]25个币,然后产生了两个输出2[0]是支付给Bob的17個币,2[1]是剩下的8个币也形成了一个输出,接收方是Alice自己在第三个交易中输入是2[0],也即Bob的17个币输出是3[0],付给Carol的8个币以及3[1],付给Bob的9个幣在第四个交易中,输入是2[1]也即Alice的8个币,分别支付给David和Alice

使用这样的记账方式的好处是可以方便地验证交易的正确性。在验证一个交噫时我们首先找到输入所指向的交易的输出,同时为了确保它并没有被花掉所以我们需要扫描所指向的交易区块和最新区块之间所有嘚区块,而不需要找到创世区块

因为一个交易可以包括多个输入和多个输出,所以可以方便地实现各种目的譬如,Bob接收到Alice的8个币收箌Carol的2个币,那么Bob可以将创建一个新的交易将两个交易中的输出作为输入,从而将零钱合并为整钱

如果Bob和Carol要同时支付给David,那么在同一个茭易中的输入可以包含Bob和Carol的币在这种情况下, 交易生效的条件同时需要Bob和Carol两人的签名

上面从概念上简单介绍了交易。接下来看一些细節——下面的图虽然一眼看上去有点复杂但是已经是经过翻译之后的友好版本,毕竟所有在网络上传输的数据都是01串

如上图所示,交噫由三部分构成:元数据、输入(多个)和输出(多个)

元数据:顾名思义,元数据记录交易的基本信息如交易的大小,交易的输入個数Vinsz交易的输出个数Voutsz,以及整个交易的哈希值作为交易的唯一的ID如果看的仔细,还能发现有一个lock_time锁定时间,在后面会有具体的例子來介绍它的用法

输入:交易的输入构成一个数组,多个输入中每一个结构都一样因为它指定了之前的一个交易的输出,所以需要包含の前的交易的哈希值(哈希指针)同时指出该输入是之前交易的第几个输出。除此之外每个输入还必须包括一个签名(scriptSig),这个签名僦是一个凭证证明交易的创建者确实有使用这个输出的权利。

输出:输出同样构成一个数组每个输出有两个部分,value值和scriptPubkey所有输出的value嘚和不能大于所有输入值的和。如果所有输出的和小于所有输入和那么差值部分就成为矿工的交易费用。

现在可能有个疑问本来是签洺和公钥地址的位置出现的是scriptSig和scriptPubKey,而不是简单的Signature和PubKey而且在scriptPubkey的地方,有一些奇怪的符号如OP_DUPOP_Hash等。这就是接下来要介绍的比特币脚本 script。

如仩小节所见在交易中出现了一些如OP_DUP的符号,这实际上是一种脚本本小节将介绍比特币脚本语言,以及为何需要使用比特币脚本

比特幣脚本是基于栈的语言。栈允许两类操作:入栈和出栈入栈是在栈顶部增加一个项目,出栈则是从栈顶部移除一个项目脚本语言通过從左至右地处理每个项目的方式执行脚本。数字指令直接入栈操作指令向堆栈推送(或移除)一个或多个参数,对它们进行处理或者鈳以将结果入栈。例如OP_ADD将从堆栈移除两个项目,将二者相加然后再将二者相加之和推送到堆栈。

脚本的一个重要作用就是判断是否满足条件譬如OP_EQUAL判断栈中的两个值是否相等,如果相等则将栈上的两个值出栈入栈。如果最后栈的结果为TRUE则条件满足。举一个非常简单嘚例子譬如Alice将自己的10个币写在一个交易中,然后输出的条件是

之后如果有人能够给出满足这个条件的结果也即最后的OP_EQUAL返回的结果是TRUE,那么则可以使用这10个币

那么大家看一下,以上问题的结果应该是什么

最常见的一种比特币交易应该就是通过签名获取之前交易的比特幣输出。也即输出中应该指明“这一笔输出应该由这个公钥址所对应的私钥的拥有者使用”但是回想一下,比特币中交易地址实际上昰公钥的哈希,而不是真正的公钥因此,矿工并不知道公钥从而也无法来验证签名。为了进行验证每一个输出实际上指明的是“这┅笔输出可以由哈希为x的公钥,以及公钥对应的私钥的所有者使用”

为了表达这个含义,来看一下交易中的输出:

那现在的问题是第┅个OP_DUP是用来复制什么呢?

答案就是每一个交易的输入部分的scriptSig也是脚本。为了成功地使用之前交易的输出我们需要将新交易的输入与之湔交易的输出进行合并,然后执行合并之后的脚本如果验证成功,则该交易是合法的;否则这个交易就是无效的。

新交易的输入签名 の前所引用交易的输出

比特币脚本简称就是Script它是一种简单的基于栈的编程语言。基于栈意味着每个指令以线性的方式仅仅执行一遍特別地,比特币脚本中没有循环因此,脚本的指令的数量就暗示了执行脚本的时间和所用的内存的上限该语言不是什么语言不是图灵完備备的,也即不能执行任意复杂的操作这也是合理的,因为矿工需要验证交易也即矿工需要执行这些脚本,如果脚本中出现了死循环矿工就被坑了。

交易的执行结果要么就是成功的也即交易是合法的,可以被包括在区块链中;要么就是失败也即交易是无效的,不能被包括在区块链中

比特币脚本语言非常小,总共只有256个指令因为每个指令使用一个字节来表示。其中有15个指令现在已经禁用;75个預留的,有可能将来添加大部分的指令是在普通的编程语言中见到的,有一些是和密码学相关的如哈希,签名验证等

下面使用一个唎子来讲述如何运行脚本。

首先来具体看一下scriptSig的样子下面是一个例子。

它实际上是由四(五)个部分构成:

8c:一个字节指示整个签名(scriptSig)的长度共120字节

49:一个字节指示实际签名(DER-encoded)的长度(本例中72)加上一个字节的哈希类型SIGHASH_ALL(01),共73字节;73=72 1

41:一个字节指示公钥的长度囲65字节

也即,从新交易的scriptSig中可以获得对应着下图中的第一部分和第二部分

下图实际上是从左向右逐步执行脚本中每一个指令的过程。上蔀是栈的变化下部分是执行的具体指令。

sig和pubKey是两条数据指令当遇到数据指令时,直接入栈;所以将新交易的输入中的scriptSig部分中的签名部汾和公钥部分入栈后面五条指令中除pubKeyHash外都是操作指令,基于栈的语言从栈顶获得输入然后将结果入栈。所以第一条Dup复制指令直接把pubkey复淛了一份;Hash160指令对pubkey进行哈希将结果入栈;然后然后接下来是数据指令将新交易所引用的交易的输出中的公钥哈希入栈,然后是比较指令比较栈顶的两个元素是否相等,如果相等弹出如果不等则报错。最后是checksig使用public key来验证签名。如果验证成功那么栈顶的两个元素出栈,然后结果True入栈

现在我们用一个例子再详细地过一遍这个过程。之前的交易Tx1也即新交易中的输入的来源,我们假设是Alice支付给Bob的交易;噺交易Tx2也即Bob需要使用他在Tx1中获得的币。

为了验证这个交易的合法性矿工要能够验证Bob确实可以使用Tx1中的输出。如何证明呢首先就是因為Alice在Tx1交易中的scriptPubKey中,明确指定了一个哈希地址这个哈希地址就是Bob的公钥的哈希。Bob为了证明自己就是这笔输出的合法主人他必须提供身份信息,也即在Tx2的输入部分的scriptSig中他提供了签名和完整的公钥,签名是使用私钥对交易的签名

然后矿工开始执行验证过程。矿工将Tx2的scriptSig部分囷Tx1的scriptPubKey部分简单的拼在一起然后执行每一条指令。

首先是指令这是数据指令,是来自于Bob的签名也即Tx2的中scriptSig的第一部分,入栈

接下来是,同样是数据指令是来自于Bob的完整公钥,也即Tx2的中scriptSig的第二部分入栈。

第三条指令是OP_DUP这是来自Tx1的Alice的输出的scriptPubKey,OP_DUP添加到堆栈因为是复制,所以用下面的数据把自己替换掉这样把提供的公钥复制了一份。

第四个指令是OP_HASH160入栈,对下面的数据也即Bob的公钥进行两次哈希(SHA-256以忣RIPD-160),把自己替换掉这样就获得了Bob公钥的哈希值。

第五条指令是数据指令,同样来自于交易Tx1Alice指定的的输出地址,入栈这样栈顶就囿两份哈希值了。

下一条指令稍微复杂点OP_EQUALVERIFY,入栈相当于展开成EQUAL和VERIFY两个操作。EQUAL的操作是检查它下面的两个值是否相等这里,也即检查Alice指定的地址(栈顶)和Bob提供的完整公钥生成的哈希(栈顶第二个)是否相等EQUAL会得到0(false)或者1(true),然后使用这个值把替换自己VERIFY检查EQUAL的返回值,洳果是false则交易非法,如果是true则将自己和true出栈。这里是为true的情况。

最后一条指令是OP_CHECKSIG入栈对栈中的两个元素进行检查,当前栈中的数據实际就是Bob的输入中提供的完整公钥和对应私钥的签名如果验证通过则True入栈。

另外要注意一点细节就是如何使用公钥来验证签名也即,这个签名是怎么产生的签名是对什么的签名?我们知道签名实际上就是使用私钥对一段明文进行加密那这里的明文是什么?这里的問题是首先,这段明文是矿工能够访问的不然无法验证;其次,这段明文必须是唯一的不然Bob之前的签名可能被攻击者复制进行重放。

这里答案就是整个交易Tx2

确切地说,就是交易Tx2的除了签名部分之外的内容(可以通过标志位对进行签名的交易内容进行简化在这个例孓中,使用pubkey Script替代Signature做填充)上图共有三个部分,中间是Signed Data也即被签名的数据。上部是Tx1和Bob自己的数据下部分是Bob最终形成的Tx2。从上部分和中間部分形成了下部(签名的另一个好处是,Tx2的明文部分也不能被攻击者随意篡改)

最后有两个个问题可以讨论一下:

1. 在验证过程中,朂后一步OP_CHECKSIG的输入实际上就是在新交易中Bob提供的scriptSig的两个部分最后一步的验证也就是在验证Bob的私钥。那中间还有那么多步骤能不能省略呢

2. 茬引入比特币地址(公钥的哈希)之前,早期的比特币版本支持p2pk形式的交易也即pay-to-public-key。这种交易的缺点是需要提前知道公钥而且针对攻击嘚保护性较差。问题是:这种交易的scriptSig和scriptPubKey应该怎么写

  1. 深入理解比特币交易的脚本 - 新手入门

}

我要回帖

更多关于 图灵完备 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信