| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 区块链安全初探(二):区块链的层次 -> 正文阅读 |
|
[区块链]区块链安全初探(二):区块链的层次 |
随着比特币的发展,逐渐这个技术火出了圈。它提供的不可篡改、可追溯、不依赖第三方信任的特性看上去是那么的诱人,很多的行业都想借鉴这一技术。但是比特币的共识机制PoW实在是太浪费资源了(算力、电力),而且仅仅只能记录交易、平均每秒7笔的交易速度等等瓶颈都限制其在其他行业的发展。 于是,基于比特币思想的其他类型的技术就开始涌现出来[1]。 区块链的发展由于在”CCTC 2017 中国云计算技术大会“上,有一篇相关演讲《区块链技术回顾与展望》,较为详细的从相关密码学理论的起源开始阐述了区块链技术的发展史,不过该PPT好像并没有在大会的官网下载页面提供,可以从这里进行下载。或者查看[1]中的详细内容。 区块链1.0:数字货币随着中本聪在2009年1月上线了第一个版本,他挖出的创世区块和第一笔50个Bitcoin成为数字货币体系的开端。 但是,Bitcoin体系有着诸多的问题,比如区块的容量、生成区块的时间等等。当然,我认为中本聪在设计这一体系的时候,就是想用高昂的代价(时间成本、算力成本、电力成本)来保障数字货币的安全。因此,就有人在比特币的基础上进行“魔改”,如2011年发布的莱特币,将PoW中的 SHA256算法 替换成 Scrypt算法,使得普通计算机更容易加入挖矿。 随后,各种各样的魔改版本上线,彼时大家都称之为“XX币”,这项技术仍然在 数字货币 领域发展。 区块链2.0:图灵完备由于数字货币体系中,每个节点只是傻傻的记录静态数据,而不能完成更复杂的操作,比如“A在10天后向B转账1BTC”,这种操作在之前的系统中只能是到“10天后”这个时间点上由A操作,而不能在10天前就定义好由系统自动执行。 以太坊的出现,带来了智能合约的概念,扩展了原来单纯的数字货币的体系,使得区块链系统可以执行一些复杂操作,有点类似于“小程序”的概念。 区块链1.0是发一发文字消息,2.0允许有小程序了,更加智能、功能更加完善,也是由此区块链技术从单纯的数字货币、分布式账本开始向各行各业渗透。 区块链3.0:包罗万象目前来说,区块链3.0仍是一个概念。由于区块链描绘的“不依赖第三方的信任”、“不可篡改”的概念过于诱人,使得人们幻想能把全部的资产都上链进行管理。“在一个大的底层框架内构筑各式各样的应用,打造一个无信任成本、具备超强交易能力、风险极低的平台”[2]。 区块链技术的层次模型从区块链的发展中可以看出,虽然后续出现了各种各样的实现,但再怎么变化都是脱胎于中本聪的比特币。因此,即使看似已经是一个全新的技术了(比如Hyperledger Fabric),但核心思想依然和比特币是一致的。 比特币能够在一个多方参与的没有可信第三方的环境下维护其数字货币,主要技术有:
而随着“区块链2.0”的出现,带来了智能合约技术,以及构建在智能合约之上的应用。因此大致可以将区块链拆解成6个技术分类: ? 图1. 区块链的6层模型[3] ? 在这个模型中,不同区块链技术之间,越往下(靠近Data layer)就越趋同,而越往上(靠近Application layer)就差异越大。其中红色虚线标出的,是区块链2.0新增的技术。 但是,恰恰是底层的技术才是更加具有区块链特色的技术。 这里插一句,现在各方大谈区块链,那么区块链到底好在哪?百度百科"区块链"词条中给出的特点有: ? 区块链是一个分布式的共享账本和数据库,具有去中心化、不可篡改、全程留痕、可以追溯、集体维护、公开透明等特点。 ? 可以看到,其中最有价值的就是去中心化和不可篡改这两点,而本质上也是解决了信任问题。任何第三方都不是绝对可信的,因此区块链解决了这一问题。区块链技术的本质也正是如此,在没有可信第三方的分布式环境下保证用户交易(中本聪在论文里也是这样说的)。 理清这一点,再回头看区块链的各项技术就会非常清晰,所有的操作都是为了这个目标而进行的。 数据层 Data layer数据层可以说是整个区块链最核心的部分之一(个人观点,其次是共识层),也奠定了区块链广为流传的特性中的“不可篡改”的特点。 数字签名 Digital signature这个部分也是中本聪第一个提及的点,为了解决“究竟是不是我转的账”这和问题。 在用户发起交易(Transaction)的时候,通过用户的签名进行验证,可以保证该交易是用户本人发出的,而不是被恶意伪造的。这里的原理也比较好理解,和其他地方使用的签名并无不同。引用一张论文里的示意图: ? ?图2. Bitcoin中的交易示意图 ?这里就能很清晰的看出签名是如何在一条交易信息里被使用的。 时间戳 Timestamp在区块链中,时间戳的概念并不是一个时间。 在其他的领域里,时间戳可能是一个字符串,可以用各种方式表达,比如“年月日时分秒”,或者是从1900年以来的秒数/毫秒数等等。但是去请求某一个时间戳服务器却恰恰违背了“没有可信第三方”这个概念。 进一步思考,时间戳的意义是什么?无非就是去表达交易的前后顺序。比如我有1BTC,我把这个币转给了A,同时我又发了一条交易,将这个币转给B。一个币转给了两个人,那哪一次是有效的、哪一次是无效的? 当然你可以说,看时间早的那条就是有效的。可是时间戳有可能被更改,即使是权威服务器给出的时间戳。 因此中本聪提出,并不使用时间戳,而是哈希来解决这个问题。这个想法真的太精妙了。 在计算当前区块的哈希时,带上前一区块的哈希,这样一直下去,通过不断的迭代来强化前后顺序,在保证交易顺序的同时,也形成了“链”式结构(Chain structure)。这一经典的结构也是区块链这一名字的由来。 依然引用原文中的示意图: ? 图3. 中本聪描述的“时间戳”的概念示意图
数据区块 Data blocks区块链,顾名思义就是区块组成的链。它的基本元素就是数据区块(Data block),通过哈希指针的方式串联在一起,形成一个前后顺序,从而形成”链(Chain)“。 作为基本元素,区块承担了存储数据和校验两个功能。一个区块的结构如下图所示: ? 图4. 区块示意图[4] ? 其中主要是区块头(BlockHeader)和交易(Transactions)两个部分最为核心。 区块头。在区块头中,包含有上一个区块的哈希值(HashPrevBlock)以及当前区块中的交易的哈希(HashMerkleRoot)两个值。HashPrevBlock 是一个指向其父块的哈希指针,形成了链的结构。同时,也是一个“合法性”的证明(个人观点),说明了当前区块的来源,是哪一个块的后续。HashMerkleRoot 是对当前块中包含的交易的完整性校验,用来验证当前区块中的交易是否被篡改。 交易。交易就是转账记录,条数不固定,但容量最大为1M。组织数据的方式为哈希树(Merkle tree)。 哈希树 Merkle tree也有成为默克尔树的,由于其发明人姓Merkle,故有此称呼,也有翻译为默克树的。 这一结构可以快速校验数据,比如某个区块里有10个交易,其中1个被篡改了。如果没有这个结构,可以通过哈希计算发现实际哈希与区块头的哈希不一致,而究竟是哪一个交易被篡改了并不知道。而使用哈希树则可以快速判断出结果。 详细解释引用一篇知乎的文章,我觉得写得比较清晰:默克尔树是什么? 哈希算法 Hash functions区块链中用到哈希的地方有很多,比如比特币挖矿的时候算的哈希,签名机制里的哈希,区块头中的哈希等等。这里数据层中的哈希算法,指的是存储的数据中涉及哈希的字段用何种算法。比如交易签名中,需要生成交易数据的哈希;上一区块的哈希,等等。由于不同的哈希算法的安全性与计算复杂度各不相同(此处不展开说明),涉及到计算速度和安全性的平衡。 网络层 Network layer对于区块链的网络层来说,虽然它的特点之一是分布式网络结构,但是对于网络层没有什么特别的设计。中本聪的原文里的 "Network" 章节实际上说的是数据验证。 P2P网络和传输协议这两个部分放在一起讲,主要是这部分没有一些特殊的改动,主要目的就是将所有节点连接起来,并且准确、安全的传输数据。传输协议(Transmission Protocol)可以直接用TCP/UDP传明文,或者用TLS建立安全信道。这些选项并不会对功能造成影响,只是可能会遭受额外的攻击。 验证机制 Verification mechanism中本聪在论文里特别提及了验证机制: ? The steps to run the network are as follows: ? 其实从比特币的设计机制来看,这部分的工作和网络传输是解耦的。但是在流程上,确实是在收到数据包之后进行的,因此在文章中作者也把这部分机制的描述归结到网络层中了。 1)新的交易 (Transaction) 通过广播的方式发送给所有节点。 2)每一个节点将新的交易放进区块中。 3)每一个节点进行PoW(即挖矿的过程)。 4)当一个节点完成PoW的计算,将该区块广播出去。 5)其他节点在接收到区块后,验证该区块以及每条交易,保证区块的完整性以及每条交易中的比特币都是没有被花出去的(这里是验证机制的重点,由每个节点去保证区块的完整性并阻止双花)。 6)节点接受区块的表现,是在这个区块之上建立新的区块,并将该区块的哈希作为 "Previous hash" 包含在新的区块中。 共识层 Consensus layer比特币提出的共识协议是PoW,通过计算哈希的方式作为证明。但是PoW的方式会无谓的消耗硬件算力资源和电力资源,导致能源的浪费。之前在国内一些电价便宜的地方,比如内蒙、四川,就有大量矿场。 而随着”区块链“技术的兴起和发展,应用在其他领域,这种资源消耗是无意义的,因此就有很多其他的共识协议的提出,比如Proof-of-Stack (PoS, 权益证明),Delegated-Proof-of-Stack (DPoS, 委托权益证明),Pratical Byzantine Fault Tolerance (PBFT, 使用拜占庭容错)等等。 关于共识协议的解释,有很多相关文章,这里就不再赘述,给出几篇文章供参考: 区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple) 然而,比较有意思的是,随着适应新场景的新的共识协议的产生,这些共识协议变得越来越中心化。比如PoS,通过持有的货币的量和时长来分配记账权,或者超级账本(Hyper Ledger)提供的Raft协议去选举Leader节点等,显示出了作为中心化的系统的高效,或者说为了效率而牺牲了一部分的分布式的”对等“性,是非常有趣的现象。 另外,共识层涉及到”挖矿“获取收益的过程。每个节点在打包区块时,都会默认加上一条从”比特币系统(COINBASE)“给自己转账的交易。这样一旦成功,自己的账户就多了一笔挖矿收益。 这个部分可以从交易列表中看到。比如在某比特币浏览器中可以找到(一般在第一条): 图5. 挖矿收益示意图 另可参见挖矿原理 激励层 Incentive layer激励层是数字货币能吸引用户加入的核心,或者说体现其货币价值的基础。激励层规定了挖矿的奖励数额、交易中的手续费等和数字货币的产生与交易相关的机制。 比如对于比特币来说,其“发行机制Currency issue mechanism”是随时间递减的,初始挖矿奖励50比特币,每21万个区块后,挖矿奖励减半。而“分配机制 Currency distribution mechanism”是当小算力节点加入矿池之后,如何分配获取的奖励问题。 对于矿池这个概念,可以参考百度百科的“矿池”词条,在此也不做赘述了。 此外,中本聪还提到,激励层可以让参与者保持忠诚。 ? he incentive may help encourage nodes to stay honest. If a greedy attacker is able to assemble more CPU power than all the honest nodes, he would have to choose between using it to defraud people by stealing back his payments, or using it to generate new coins. He ought to find it more profitable to play by the rules, such rules that favour him with more new coins than everyone else combined, than to undermine the system and the validity of his own wealth. ? 即使当一个攻击者获取了超过50%的算力时,与其破坏账本数据,还不如继续挖矿。因为同样的算力继续挖矿的收益可能要远远大于破坏现有账本的收益更大。 合约层 Contract layer合约层经过发展,从最初的比特币脚本发展到后来的智能合约,为区块链的应用创造了无限可能。 比特币脚本 Script code由于比特币是没有”账户“这个概念的,因此A向B转账之后,虽然被记录下来,但在花出去这笔钱的时候,又如何证明花钱的人是B呢? 因此,脚本就是一种对身份的验证。比起单纯的验证公钥、签名等,使用脚本的方式可以使得验证更加灵活,比如可以规定,任何人只要能”够提供一个数据,它的SHA256是 智能合约 Smart contract由于比特币的脚本是图灵非完备的,”没有循环或者复杂流控制功能以外的其他条件的流控制[6]“,因此其复杂性有限,只能完成一些简单的验证操作。 而以太坊支持的智能合约,则是图灵完备的脚本语言,运行在以太坊虚拟机EVM中,任何人都可以编写脚本来执行任意的逻辑,甚至与在以太坊的基础上发布新的代币等。 以太坊官方对智能合约的解释如下: ?
? 可以在以太坊官网的”智能合约简介“页面了解详细内容。 应用层 Application layer应用层指的是区块链技术支持的应用场景。 只有底层的技术,它并不能成为一个可以使用的产品。比如比特币(注意这里指的是供用户使用的”产品“)就是一个应用。底层技术是为了承载比特币这个应用,提供给用户进行交易。 扩展到整个区块链技术上来说,就是各家最喜欢说的”落地“的产品。区块链医疗、区块链税务等等。 总结这篇文章如此之长,主要是尽量全面的以比特币作为例子介绍了区块链的各方面技术。 比特币作为区块链的鼻祖,是最具有代表性、特点最明确的一个大规模使用的技术,因此比较值得研究和借鉴。在其之上成长起来的区块链以及衍生出的各种技术,也是为了使得这个分布式账本技术融合到其他领域,发挥其独特的作用。 但是,无论怎么改变,区块链都应该秉持其分布式、不依赖第三方的信任的核心思想,这才是区块链技术应有的精髓。我认为,有些领域是否应该使用区块链,或者是否有更好的可替代技术,是更应该摆在第一位思考的问题,而不是如何强行将这一技术融入。 参考文献[1] 创业Daily. 软件好,才是真的好:区块链的1976—2017. https://zhuanlan.zhihu.com/p/29161177, 2017-09-08 [2] 区块链3.0到底是什么? - Starteos.io的回答 - 知乎 https://www.zhihu.com/question/280886318/answer/632614575 [3] Zhang R, Xue R, Liu L. Security and privacy on blockchain[J]. ACM Computing Surveys (CSUR), 2019, 52(3): 1-34. [4] Dasgupta D, Shrein J M, Gupta K D. A survey of blockchain from security perspective[J]. Journal of Banking and Financial Technology, 2019, 3(1): 1-17. [5] 深入理解比特币交易的脚本. https://www.liaoxuefeng.com/article/1124144362997184, 2017-1-8 [6] 比特币区块链(八) | 比特币中的脚本系统 - 苏小乐的回答 - 知乎 https://zhuanlan.zhihu.com/p/33157713 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 18:30:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |