| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 区块链 -> 区块链基本原理概述 -> 正文阅读 |
|
[区块链]区块链基本原理概述 |
1. 简介有关区块链的介绍文章太多了,自己读了很多篇,感觉还是理解不深。我在这里也以自己的理解来做个说明,个别图片和表格来自网络,如果原作者认为不合适可以联系作者删除。本文的主要内容已作为ICAA 2021英文会议论文“Overview of the basic principles of blockchain”发表,觉得有必要与国内读者分享。 作为比特币的底层实现技术,区块链受到了政府部门和企业的高度关注,并在金融领域和非金融领域展开了广泛研究与应用。区块链本质上是一个由若干区块构成的数据链,这条数据链被分散保存到多个计算机节点。这些计算机节点相互独立,相互勿须信任,没有一个权威的中心节点,因而区块链被认为是一个“去中心化”、“去信任”的系统。在这两个概念中,“去中心化”是方法,“去信任”是目的,后者需要通过前者来解决;很多人强调前者,但后者才是根本。“去信任”是指去除第三方信任,交易双方不经过可信的第三方而直接交易。然而,区块链本身并不要求交易双方互信,交易数据允许存在造假和欺骗,由此导致在比特币的底层可能同时存在多条区块链,但通过“共识机制”、“奖励”、“造假惩罚”等措施,最终区块链为比特币建立了一套可靠的、可信任的解决方案。然而,在一些小型应用中,“共识机制”和“奖励”并不能从根本上解决“去信任”或数据造假问题。当前开发的很多区块链应用,某种程度上都建立在“信任”的基础上,与比特币的区块链有较大区别;即便如此,其中的一些系统仍能解决其他技术所难以解决的问题,并具有较高应用价值。本文重点阐述比特币的区块链的基本原理,并为基于区块链技术开发应用提供一些合理化建议。 2. 区块链与比特币2.1 区块链发展历史比特币是上层应用,区块链是比特币的底层实现软件。区块链的发展经历了三个阶段,分别是1.0、2.0、3.0。 区块链1.0是以比特币为代表的虚拟货币时代,实现了货币的去中心化与支付手段,涌现出了大量的山寨币等。区块链1.0支持两个人之间的虚拟货币交易,无法普及到其他行业。 区块链2.0多了智能合约的概念。一个交易允许多个人共同签名后发送给别人。智能合约给金融领域提供了更加广泛的应用场景,譬如多方合同下的商品买卖。区块链2.0的代表是以太坊,支持智能合约并提供编程接口,用户可以开发自己的虚拟货币。区块链2.0通常应用于金融领域。 ??????? 区块链3.0则将区块链应用于金融行业之外的其他行业。区块链3.0被称为互联网技术之后的新一代技术创新,足以推动更大的产业改革。由于不再依赖于第三方或某机构获取信任与建立信用,区块链技术能够提高整体系统的工作效率。区块链3.0的代表是Hyperledger Fabric,该软件在交易时不需要手续费。 2.2 比特币的价值和获取??????? 比特币从诞生之日起,具有浓厚的投机性,且缺乏第三方监管。像人民币、美元、欧元都是依赖国家信用和黄金储备等而作为流通货币,但比特币的信用却是一些数学算法。由于不具备明确的价值基础,因而在中国被认为是非法活动。 ??????? 比特币至少可以通过三种途径获得。一是从一些交易网站上购买获得;二是别人通过比特币软件转账而获得;三是通过比特币软件挖矿获得。“挖矿”是区块链的核心概念之一,在后续将逐步对其展开描述。本文不讨论非法交易,只是对区块链的基本原理进行探讨研究。 3. 两个数学算法?????? 区块链采用了两个基础的数学算法:非对称加密和哈希函数。通过这两个算法对数据进行加密和解密,并使得数据很难被第三方破解。 3.1 非对称加密算法?????? 对称加密只有一个密钥,加密和解密都使用它。譬如,用“123456”作为密码压缩一个文件夹,在解压时也同样使用该字符串。 ?????? 非对称加密则有两个不同的密钥:公钥和私钥。如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。通常将公钥发给其他人,私钥自己留着;其他人可以通过公钥进行加密,但只有自己才有私钥解密,因而安全性较高。 3.2 哈希算法??????? 数学中的模运算(取余数)是一种极简单的哈希算法。譬如1,2,3,4,5,6,7,10001除以4后的余数分别为1,2,3,0,1,2,3,1。以另一种形式可以写成:hash(1)=1, hash(2)=2, hash(3)=3, hash(4)=0, hash(5)=1, hash(6)=2, hash(7)=3, hash(10001)=1。可以看出,在哈希算法中,不同的数可能有相同的值。 ??????? 科学家们创建了很多更复杂的哈希算法,譬如MD5、SHA1、SHA256等。下表列出了字符串“Hello World!”对应的各个哈希算法的取值。
??????? 这些哈希算法具有这样的特点:
?????? 虽然从理论上来说,可能有多个key对应同一个value,但实际上概率很低。因此,可以近似地认为key与value是一一对应的,value被称为key的数据指纹。数据指纹意味着很难造假,一个value只能找到一个匹配的key。 4. 区块链逻辑结构4.1 链表区块链由“区块”和“链”两个词组成。“区块”用于保存数据。对于比特币来说,大约每10分钟产生1个区块,由其存放10分钟内的所有交易。交易存放的是货币所有权从一个人到另外一个人的流转信息。每个交易都需要一定的手续费,在区块链中被称之为“汽油”。 数据链有正向链、反向链、双向链之分。
区块链采用反向链,便于从后向前追溯。对比几种链表结构,有下列结论。 命题1. 高性能不是区块链考虑的根本因素。 另外,区块链中的第一个区块被称之为“创世区块”。 4.2 去中心化??????? 如图1所示,上方是一个中心化的架构。节点5中的数据库可以被其他4个节点所共享,便于读取和修改操作。 ??????? 图1下方是一个去中心化的P2P架构,所有节点对等,并且每个节点都保存一个完整的区块链。这种架构本质上是一种多副本备份机制,具有更好的可靠性。
命题2. 区块链不能太大。 对于比特币来说,世界上任何人都可以参与挖矿。区块链太大可能导致普通电脑无法保存整个区块链,导致很多人无法参与。10多年以来,当前的区块链只有300g之多,能够为一般电脑所保存。 命题3. 区块链不要更新太快。 再次强调,这里是指比特币的区块链。一个区块需要包括一段时间之内的几乎所有的交易。由于交易在互联网的所有节点之间进行传递,如果更新太快,则可能有些交易不能被打入区块链;另外,由于所有节点都可以挖矿,互联网上会存在多个不一致的区块链。 4.3 挖矿区块链由多个区块组成,所谓挖矿是指生成一个新区块的过程。 如图2所示,一个区块由区块头和区块体组成[参见: https://cloud.tencent.com/developer/news/167233?; http://www.woshipm.com/blockchain/1022259.html]。 区块体包含10分钟内的所有交易。图中显示了4个交易,给每个交易求哈希值,得到hash1、hash2、hash3、hash4。然后每两个再求hash值,一直到最后得到一个hash1234,即为区块头中的默克尔根。如果在区块体中添加、删除、修改某一个交易,则默克尔根就会变化。 区块头主要包括6个要素:hash(parent)、版本、默克尔根、时间戳、难度目标、随机数。所谓挖矿,就是确定这6个值。 在前一个区块也包含这6个要素,它们的hash值即为hash(parent)。由此可知,如果某一个区块造假,则需要修改它后面所有区块的hash(parent),难度很大。 为了使得每10分钟生成一个区块,设置了难度目标值。随着计算机的性能越来越高,该值是动态变化的。如下面公式所示,系统每隔2016 个区块会根据上一周期的挖矿时间来调整挖矿难度。对于一个具体的区块而言,该值是固定不变的。 DifficultyTarget = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF/Difficulty 从这里可以查到,第674000区块的难度为21,448,277,761,059.70。从674001区块查到第674000区块中6个要素的哈希值如下。这个哈希值前面有19个0,要满足这个条件就必须进行大量的计算,求出其他的几个要素。 00000000000000000007f8d1652e3bf35c9d2672be4834fef6ebc6f1c407bd8c 在6个要素中,hash(parent)、版本、默克尔根、难度目标都是固定的。时间戳表示区块生成的时间,随机数是可变的。在分布式系统中,不要求每个计算机的时钟完全一致,时间戳的变化对别人而言意义不大;因而为了简化挖矿难度,时间戳也可以事先确定。这样,在6个要素中只需要求出随机数。 随机数通常从0开始一个个地尝试,看6个要素的哈希值是否满足难度。如果某个随机数满足难度,就表示挖矿成功。新的区块生成后被广播到相邻的其他节点。 第674000区块的随机数为4,275,554,107,可见挖矿的工作量挺大。在区块链中,把这样的工作量叫做工作量证明POW。 从事挖矿的人称为矿工。由于第1个挖矿成功的人会有比特币奖励,并且能收获所有交易的手续费,因而矿工都在想方设法提高挖矿效率。 命题4. 高性能是矿工追求的因素。 4.4 共识机制若同一时段只有一个合法区块被生产出来,而没有与之竞争的其他合法区块,该区块将会被接收;若存在竞争区块,则51%以上的节点确认,累计难度最大且最长的链最终会被接收,没有被接收的其他合法区块则成为孤块,被淘汰出局。 所谓共识机制,即指得到大多数(51%以上)节点确认。 4.5 去信任在互联网中,节点之间没有绝对的信任。实际上,如果大多数节点都造假,则区块链将没有价值。为了防止造假,除了去中心化外,区块链至少还采用了下面几项措施。
命题5. 区块链造假代价很高。 5. 区块链类型区块链分为三种类型:公有链、私有链、联盟链。 5.1 公有链比特币的区块链是一种公有链,它有如下特点。 1)公有的、全开放的、去中心化; 2)数据全网公开,不适合银行、政府、证券等; 3)不能篡改数据; 4)处理交易速度慢、效率低:全网节点共同参与,每个节点都参与决策(判断真伪); 5)如果发行电子货币,则是各国政府所不能支持的行为。 私有链、联盟链就是对公有链的开放性、效率进行改进的结果。 5.2 私有链私有链不对外开放,只有被授权节点才能参与,是部分“去中心化”的区块链。主要用户有金融机构、大型企业、政府部门等。譬如央行发行的数字货币,只能由央行进行记账,个人不能参与。另外,阿里、百度、京东等大型公司也会构建自己的私有链,侧重区块链的数据安全。 5.3 联盟链??????? 联盟链也称行业链,是公司与公司、组织与组织之间构建的区块链。通常选定多个节点参与区块共识决策,其他节点仅参与交易而不参与决策,这是一种“多中心化”的区块链。用户群体包括银行、证券、保险、集团企业等。 6. 区块链应用6.1 应用开发考虑随着区块链技术的发展,越来越多的区块链应用开始出现。特别是由于政府的鼓励支持,需要避免不结合实际情况而一窝蜂地采用区块链技术的过热情形。在确定采用区块链技术开发应用之前,需要从下面几个方面来综合考虑。
性能。如果应用频繁更新,采用区块链意味着数据量很大,需要很大的存储设备,对于一些不具备条件的应用则不适合。另外,在区块链中检索数据极不方便,效率极低。 6.2 融合传统数据库的开发方法在确定采用区块链技术开发应用之后,需要考虑一个问题:是否将所有数据都保存到区块链? 区块链在性能、数据检索等方面都不如传统数据库;另外,如果所有数据都保存到区块链,则会特别大。一种可行的方法是在应用中采用“区块链+数据库”的方式来保存数据。那些防止造假需要追溯的重要信息可放到区块链,其他信息则放到数据库。在区块链应用方面,数据通常保存在多处。因此数据库应具有性能高、支持多备份的特点;甚至可以采用高性能、高可用、高可扩展的Ceph分布式存储系统来保存数据。 7. 总结区块链具有“去中心化”、“去信任”、“去第三方”的特点,本质上是一个分布式数据存储系统。将区块链保存到多个计算机节点,通过“共识机制”、“奖励”、“造假惩罚”等措施,最终区块链为比特币建立了一套可靠的、可信任的解决方案。然而,区块链也存在一些缺点,包括性能较差、检索困难等,进而出现了公有链、私有链、联盟链等适合不同应用场合的类型。私有链和联盟链在某种程度上已经不再是“去中心化”、“去信任”的区块链。在开发应用时,应综合考虑多种因素来确定是否有必要采用区块链技术;在一些区块链应用中,可以采用“区块链+数据库”的方式来保存数据,即将需要追溯的关键信息保存到区块链,而其他信息保存到数据库或分布式存储系统。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 20:34:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |