「区块链基础概念100」:验证 | 032
「区块链基础概念100」由火星财经「学习区块链」频道出品,在区块链基础概念之上延展深度阅读,并紧密连接产业,关注产业发展热点和趋势。
1. 基础概念
验证/ Verification
验证是对于交易的一种确认,通过区块链网络中节点的共识机制,将交易数据在区块链网络广播并由其他节点确认,即验证该笔交易的合法性。
2.深度解读
形式验证如何帮助防止Gridlock错误
最近在Edgeware的Lockdrop智能合约中发现了一个隐藏的DoS错误(称为Gridlock),该合约已锁定了价值数亿美元的以太币。 由于存在此错误,Edgeware必须重新部署合约的稳定版本。因此,当前在主网上并行存在两个Lockdrop合约(旧版本和新版本)。(这意味着您可以向这两个合约中的任何一个发送交易以锁定您的以太币,直到旧的合约遭到攻击并无法使用为止。)
在本文中,我们将回顾Gridlock错误,并讨论形式验证如何有助于防止此类错误。
正如Neil McLaren的博客文章中所描述的那样,这个错误源于一个错误的(但非常合理的)假设,即新创建的帐户余额总是为零。
要了解更多详细信息,让我们看一下原始buggy合约(简化)代码片段:
本质上,lock函数会绕过收到的以太币金额(即msg.value)创建一个新lock合约账户,并确保新创建的账户(lockAddr)具有绕过的以太币余额。
尽管乍看之下看起来不错,但是此代码仅在新创建的帐户的余额为零时才有效,但不幸的是并非总是如此。 这是因为可以预先计算新帐户的地址,因此恶意用户甚至可以在通过lock函数创建之前向其发送一些以太币。 一旦发生这种情况,assert语句将在任何进一步的lock函数调用中继续失败,这意味着该函数将永远无法执行应做的事情,变得完全无法使用。
(请注意,此行为特定于EVM。在可以识别不存在的帐户并禁止其收取资金的其他VM中,该错误可能并不存在。)
形式验证可以帮助吗?
现在让我们解释一下如何通过正式验证,尤其是在EVM字节码级别的验证来发现Gridlock错误。
形式验证的基本过程之一是通过符号执行来探索给定程序的所有可能行为(在这种情况下为Lockdrop合同的EVM字节码)。在这里,我们使用KEVM验证程序来象征性地执行字节码。长话短说,上述lock函数字节码的符号执行将产生以下行为(例如由于用尽gas而导致的功能故障)。
1. 如果在新帐户地址上已经存在一个帐户,且现有帐户的代码为非空或其现时值为非零,则还原(由于第3行的新合同创建失败)。
2. 还原(由于第5行断言失败),如果新帐户地址上已经存在一个帐户,现有帐户的代码为空,其现时值为0,余额为非零。
3. 成功终止后,如果在新帐户地址上已经存在一个帐户,该帐户的现有代码为空,其现时数为零,其余额为零。 (如果现有帐户为非空,则清除其存储。)
4. 如果新帐户地址没有帐户,则成功终止。
(注意,第三个和第四个行为需要更多的条件,例如没有用完gas,或者正确地给出了枚举类型参数,但是为了简单起见,我们在这里省略了它们。)
一旦研究了合同的所有可能行为,下一个重要步骤便是仔细检查每种行为,以确保它是有意或无意的,否则就很难被利用。确实在上述四种可能的行为中,只希望有第四种,并且我们需要分析其他行为以检查它们是否可利用。
如果可以利用第一行为和第二行为,则可以将其用于DoS攻击。但是,据我们所知,第一个行为几乎是无法利用的,因为在密码上很难在给定的特定地址创建合约帐户(即具有非空代码的帐户)。 (为此,需要使用CREATE2操作码来查找对应于特定地址的盐,这与查找SHA3哈希的原像一样困难。)但是第二种行为是可利用的,因为可以轻松地启动一个如前所述,只需向其发送一些以太币即可在任何特定地址的非合同账户(即无代码的账户)。
另一方面,第三种行为(如果可以利用)可以用来耗尽其他人的“locked”以太币,这确实是致命的。然而据我们所知,由于与第一种情况相似的原因,它几乎无法被利用。 (一个人可以很容易地在一个特定的地址“启动”一个帐户,但是很难“拥有”该帐户,因为这需要找到密钥。)
综上所述,对lock函数节码的符号执行可能揭示了这三种不良行为,并且仔细检查它们可能发现其中一种可被DoS攻击利用,从而在部署之前修复了Gridlock错误。
吸取教训
EVM通常是不直观的。
Gridlock错误源自对EVM设计中某些非显而易见部分的错误理解。如果不考虑EVM级别的智能合约,就很容易错过这种EVM问题,并且可能会再次引入类似的bug。
形式验证可以提供帮助。
如果不采用有原则的方法,那么探索所有可能的行为(尤其是在EVM级别)并非易事。形式验证,尤其是它的符号执行过程,可以系统地探索给定智能合约的所有可能行为,这比仅手工检查代码要严格得多。
具体来说,我们的KEVM验证程序使用的是EVM的确切规范(又称KEVM),不会让您摆脱错误的假设。如上所示,它甚至会发现执行路径非常不可能,例如攻击者找到哈希的预映像并将其合同部署到下一个地址的情况。
形式验证不是万灵丹。
虽然形式验证引导我们系统地探索和严格地推理给定程序的所有可能行为,实际上,它是找到程序的关键问题的最终途径,如果有的话,它仍然需要大量的人工努力,有时在智力上具有挑战性。例如即使我们自动找到了lock函数的三个不良行为,我们仍然需要手动地对它们的可利用性进行推理,这是非常重要的,并且需要安全专业知识。必须确保在手动推理过程中不遗漏任何关键细节。
导读:在本文中,我们将回顾Gridlock错误,并讨论形式验证如何有助于防止此类错误。
通往百万TPS之路(三)——提高SPV节点的安全、高效和可扩展
第0章 引言
前面三篇文章介绍了什么是UTXO、(full node里)UTXO证明的设计和各种节点如何参与UTXO证明,本文讲SPV钱包如何使用UTXO证明。
第1章 交易验证和支付验证
如何验证一笔交易是不是双花,钱包如何判断你收的币是不是假的,这是比特币(包括BTC和BCH)的首要设计目标。比特币白皮书分别在第2章和第8章提供了两种验证双花的机制——交易验证和支付验证。
交易验证是完整区块链节点(full node)才能做到的,主要涉及验证是不是有足够的UTXO,是否存在双花,判断解锁脚本等。一个交易验证主要要完整这些任务:
0前提:区块链节点收到一笔交易,区块链节点同步好所有区块并在本地构造出UTXO集。
1节点会遍历所有UTXO集,定位到这笔交易输入所在的区块高度,以此来查这笔交易是否有足够的未花费输出(UTXO);
2节点要依次查难此高度后面所有的交易,以此保证这笔UTXO不存在双花;
3节点要验证这笔交易的解锁脚本是不是对的,以此验证交易的输入是不是被合法私钥解锁的;
4节点要验证这笔交易的锁定脚本是不是对的,以此验证交易会不会发到非法的地址上。
交易验证过程是非常复杂的,各种细节,包括要查交易是不是coinbase交易;交易大小是不是小于100K;交易里的指令是不是少于2万个;交易各个字段是不是合规……。而且各种交易格式,如p2pkh,p2sh,等,又有各自的验证规则,复杂死了,没有一天的功夫,估计没人能读完交易验证那一块代码。
绝大多数用户一般不会运行一个完整区块链节点,而是使用一个手机安装一个轻钱包。这一类轻钱包无法实现交易验证功能,它们要确认自己收的交易是不是假的需要使用的是支付验证。轻钱包叫SPV钱包,英文是Simplified Payment Verification,简化支付确认,这是中本聪白皮书里第8章描述的。
但支付验证就要简单很多。支付验证是为SPV钱包设计的,支付验证的目标是为了让SPV钱包获得这笔交易是否已经被完整区块链节点收录进区块链里了,即验证这笔交易是否被打包,并处于最长链就可以了。
0前提:SPV钱包节点收到一笔交易tx,SPV钱包节点下载好了所有的区块头;
1SPV钱包节点随机向full node节点索要tx的梅克尔树(merkle tree)的路径(交易在区块里的排序是按梅克尔树算法进行排序的);
2SPV钱包节点使用tx和获得的Mmerkle tree路径计算出merkle_root_hash,并且和区块头上的merkle_root_hash对比,如果相等,则确认tx是有确认的;
3依据该tx所处的区块高度,确定该交易已经得到多少个确认。
要注意的是,有一类手机钱包是依赖于服务器来实现验证的,它们用的不是支付验证,它们是委托服务器做交易验证。
第2章 SPV钱包的尴尬地位
现在市场上真正的SPV钱包很少人用,大家用的手机钱包往往是一个公司的钱包产品,公司提供服务器来帮用户做交易验证。这种公司的中心化的钱包的安全性本质上是依赖于公司的信用的,并不是一个去中心化的解决方案。
SPV钱包有两个尴尬的问题,第一个是为什么full node要搭理spv钱包的请求服务呢?
我们假设一个极端情况,未来有 5亿人使用BCH,全网有只有1万full node节点,那一个full node节点需要服务5万个SPV钱包。Full node会被这些用户给拖累死。因为SPV只是将一个txid发给full node,但full node要在区块中读出这笔交易的梅克尔树的路径,并且发给SPV钱包。这个读写过程是要消耗资源的,发送过程是需要带宽的。如果未来区块大到了1G,一 个区块里有几百万笔交易,那要读出这个梅克尔树路径都是很难的事。
SPV钱包每次同步区块高度,都是要向完整节点做余额验证来更新自己的余额。而且SPV钱包为了防止full node欺诈它,SPV钱包需要连接多个full node来完成支付验证和各种工作,这又呈倍数地加大了Full node服务SPV节点的难度。
如果你用过一家公司开发的轻钱包,钱包是通过公司的服务器来完成收币发币的,你一定遇到过服务器维护的情况,用户一多,服务器就要累死。
从上面这个问题就可以看出,SPV节点需要full node配合做支付验证的模式,是很难扩展的。
那怎么办?
另外一种尴尬就是SPV钱包必须将完整的txid随机广播给周围的节点,那隐私就没那么强了。
想保护隐私,其实最好是运行full node来当钱包用。
第3章 SPV节点使用UTXO证明来完成支付验证
我们一设想SPV节点的一种新的“支付验证”,使用UTXO证明来完成支付验证。
现在假设全网已经通过硬分叉将UTXO证明塞进了区块头,并且full node都在本地构造始终为100高度的UTXO区块链,也会构造UTXO的梅克尔树,网络也允许输出UTXO区块链。
一个SPV钱包节点通过下载区块头,就可以获得所有的UTXO证明。
有了UTXO证明,SPV节点就可以下载和自己相关的UTXO,自己就可以在本地保存自己的UTXO和UTXO梅克尔树路径。这样就可以不再向full node请求余额验证,可以大大降低full node的服务压力。这样做的目的是可以让整个网络变的更加高效。
SPV节点可以像做交易的支付验证一样,向full node请求“UTXO支付验证”,过程是这样的:
0前提:SPV钱包节点收到一笔交易tx,SPV钱包节点下载好了所有的区块头;
1SPV钱包节点随机向full node节点索要UTXO的梅克尔树(merkle tree)的路径(交易在区块里的排序是按梅克尔树算法进行排序的);
2SPV钱包节点使用tx的UTXO和获得的Mmerkle tree路径计算出UTXO证明,并且和区块头上的区块头里的UTXO证明对比,如果相等,则确认tx是有确认的;
3依据该tx所处的区块高度,确定该交易已经得到多少个确认。
这和SPV支付验证是一样的。但full node检索UTXO数据,要比检索一个区块里的交易要更难,事实上这种UTXO支付证明的方式是会加重full node的工作量。要解决full node的工作量问题,下一篇文章来分析分片的技术。
另外一种SPV可以利用UTXO的模式是,随机选择两个full node,向一个索要SPV支付验证,向另一个索要“UTXO支付验证”,这样可以提供SPV节点的安全性。
第4章 结束语
我们需要更加努力一点,找到将BCH系统扩展到更高效的办法。
导读:交易验证是完整区块链节点(full node)才能做到的,主要涉及验证是不是有足够的UTXO,是否存在双花,判断解锁脚本等。
Bitcoin-NG:可扩展区块链协议与现实的碰撞
Bitcoin-NG协议是康纳尔大学研发的、具有极强耐性、与比特币具有相同的信任模型,旨在提升区块链网络吞吐量的拜占庭式容错区块链协议。
基于比特币并由其领导的加密货币已显示出有望成为匿名在线支付、廉价汇款、去信任化数字资产交换和智能合约的基础设施。但是,由于衍生自比特币的区块链协议固有的可扩展性,因此无法在吞吐量和延迟之间进行权衡,从而无法发挥这种潜力。
本文将介绍旨在扩展的新型区块链协议https://hbr.org/2018/06/what-blockchain-cant-do
导读:区块链可以做到一些神奇的事情。它能提供一种无法篡改的电子记录,并可以承担帮助轻松,简捷的验证数据的准确性这一重担。
简单的区块链数据验证应用程序
简介
在本文中,我将用示例代码来讲述我所知道的最简单的区块链应用程序的数据验证问题。
想象一下下面的用例。您收到一份经过多方认可的文件,但是又希望确保其的真实性。该文件可能是您正在购买的汽车的服务手册,也可能是一份购房文件,证明您正在购买的房子确实属于卖方。
对文件进行数字签名以防止被篡改,这已经不是什么新鲜事。您可以获取文件的内容并使用你的私钥进行加密,生成一个加密文件,将该签名与文件一起发送给对方。
文档的接收者可以再次生成签名,并验证它是否与所提供的签名匹配。验证文档内容是否被篡改。
这是MD5校验和的结果,使用起来非常方便。它的缺点是您需要接收签名来验证文档的真实性。
由于从个人获取数据并非易于信任,因此有时第三方会介入提供记录保存服务以获取利润。这种利润动机是保持记录保持者诚实的原因。但不是一个完美的解决方案。但是可怕的是,如果经济激励措施改变,记录保管人可能会发生腐败。监管之人,谁人监管?
区块链可以为你做什么?
区块链数据存储是分散的、健壮的和不可更改的。
- 分散意味着数据分布式存储在不同的设备上。
- 健壮意味着即使某些参与者离开或停止合作,数据存储也将继续运行。
- 不可更改意味着一旦数据存储在区块链中,就不能更改。
区块链以优雅的方式解决文档注册问题。一旦我们在区块链注册表中输入一个签名,我们就不必担心签名会被修改以匹配被篡改的文档。要做到这一点,需要大部分网络参与者一致达到共识,这使得它几乎不为人所知。
在此上下文中,文档可以是任何数据集。同样的模式也适用于证明任何商业交易、物联网数据集或用户身份的真实性,以及其他许多模式。
现在,了解如何使用这个构建区块来设计更复杂的解决方案是非常有用的。所有区块链解决方案都依赖于存储用户生成的数据,这些数据可以在不依赖任何人的情况下被信任。
用例实施
这次我没有从头开始编写合同。我正试图停止重新发明轮子,区块链注册表已由十几个实施。
智能合约设计非常简单,只有一个相关的合同变量和两个函数。
- 文档映射将为文档计算的哈希与添加该哈希的区块相链接。
- add方法接受哈希并将其存储在映射中。
- verifiy方法返回哈希的时间戳。
前端可以使用contract.add上载文档,并将签名计算为文档内容的sha256。
前端还可以允许上载带有contract.verify的文档,以及是否在上载之前,它将告知您大约何时上载。
这就是实现一个分布式的文档注册表所需要的全部内容,操作两件事情:
1.签署文件
2.验证文件签名后是否发生了更改。
这是因为两个不同的文档具有相同签名的可能性非常接近于零。同时时间戳可以确定您提供的文档是在什么时候注册到注册表的。
智能合约的代码可以根据实际情况进行更新和改进,但这17行代码属于整个实现的核心部分。
结论
文档注册表是最具有商业价值的区块链应用程序的最简单实现。今天,它们在许多领域仍然是有相关的构建块之一,您可以在更复杂的解决方案中反复使用它们。
文档注册中心有效地利用区块链的分散性和不可篡改的属性,消除了信任任何人所提供的数据都是真实的。虽然这个想法很简单,但是具有革命性。
导读:想象一下下面的用例。您收到一份经过多方认可的文件,但是又希望确保其的真实性。该文件可能是您正在购买的汽车的服务手册,也可能是一份购房文件,证明您正在购买的房子确实属于卖方。
荷兰将区块链技术用于废物治理
长久以来,荷兰的边境口岸都停靠着大量垃圾车,这些垃圾车都必须接受人工检查。
荷兰的废物治理机构开始实施一项计划,他们打算将区块链和移动应用程序相结合,消除废物治理流程中的人工环节。这个项目是欧盟废物运输部门进行概念性验证的一个实例。
该项目由荷兰技术设施部环境和运输检查机构(ILT)负责实施。ILT希望通过区块链技术和移动应用程序的结合来实现多项任务的自动化这一目标。
ILT为了管理这些从其他欧盟国家运来的废物,监督废物的这一治理过程,必须和多方联系。这一过程目前对人工手动处理的依赖性较强,但通过区块链技术,可以把这流程中的人力腾出来,用到其他更需要他们的地方去。
埃利奥特·多纳塔就职于ILT,目前担任高级顾问,他表示,在欧盟范围内的公司产生的废物,包括进口、出口和运输,目前都是由多个政府机构进行监督并授权的。
欧盟对这些废物治理过程的监督,包括许可证的发放,通知运输废物过程中会涉及的各方以及监测这个过程中的财务安全。这些过程涉及大量工作,现阶段大部分都是通过纸张和邮件来完成的。我们有理由相信,结合了区块链技术之后,通过使用智能手机的应用程序接收和验证数据,废物的跨境转移将变得更高效、便捷。
通过使用区块链技术,政府机构和公司能够对废物治理流程中的每一步都进行实时验证。
这个名为“欧洲废物运输”的项目主要运输的是位于荷兰和佛兰德斯间的废物。ILT为这个名项目聘请了软件公司LegalThings One和Safety Changer,废物回收公司Indaver和AVR,此外比利时弗拉芒废物管理局也参与了这个项目。
项目参与方LegalThings One的创始人里克施密茨表示:
我们可以想象一下,每一个卡车司机都不需要携带任何纸张,也不必为了边境检查而停车。现在,每年仅在荷兰就涉及到近60多万次的跨境运输,使用了区块链技术以后,能因此省下的时间和金钱都不可估量。
区块链技术因比特币而逐渐被熟知,首先在金融服务领域扎下了根,紧接着在很多领域都得到了应用。区块链技术所特有的数据安全保证、参与方对数据的共享以及数据无法被篡改,这些特点让人们对该技术的应用场景充满无限想象。
瑞典土地注册管理局Lantmäteriet正在尝试将区块链技术用于记录与财产相关的交易。
迪拜政府推出了一种基于区块链的生物识别边境检查系统,以确保只有数字护照持有者和相关部门可以看到敏感数据。
文章原标题:荷兰将区块链技术用于废物治理 编译作者:Joie
导读:结合了区块链技术之后,通过使用智能手机的应用程序接收和验证数据,废物的跨境转移将变得更高效、便捷。
导读:大盘却似乎和BCH无关。
来源:学习区块链
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。