作者:初吻给了烟200309 | 来源:互联网 | 2023-08-20 17:55
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。它利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。它利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据。
通俗的讲,区块链就是一种去中心化的分布式(分布在多地、能够协同运转的)账本数据库系统。
1 区块
区块链由一个个区块(block)组成。区块很像数据库的记录,每次写入数据,就是创建一个区块。
区块链的数据结构示意图
区块头
区块头中记录了版本号、上一个区块的Hash地址、merkle根、区块创建时间戳、区块的工作量难度目标以及用于计算目标的参数值。
所谓Hash就是计算机可以对任意内容,计算出一个长度相同的特征值。区块链的Hash长度是256位,这就是说,不管原始内容是什么,最后都会计算出一个256位的二进制数字。而且可以保征只要原始内容不同,对应的Hash一定是不同的。
- 每个区块的Hash都是不一样的,可以通过Hash标识区块。
- 如果区块的内容变了,它的Hash一定会改变。
比特币使用SHA-256哈希函数,该函数生成一个大小为256位(32字节)的哈希值(输出)。如图所示
Bob在向Alice下订单时,创建了一条类似于上面所示的消息。把这个消息通过哈希函数生成32字节的哈希值。
哈希值的特点是,哈希值对于对于消息内容是唯一的,消息内容有任何改动,哪怕是多了个字符,生成的哈希值也是不一样的。
所以哈希值通常可以用来校验内容是否篡改。
时间戳
区块链中的时间戳从区块生成那一刻起就存在于区块中,它对应的是每一次交易记录的认证,证明交易记录的真实性。
默克尔树(Merkle Tree)
区块链作为分布式账本,原则上网络中的每个节点都应包含整个区块链中全部区块,随着区块链越来越长,节点的硬盘有可能放不下。区块链中引入了默克尔树解决这个问题。
区块链中,为节省空间,只保存交易的哈希值,不保存交易本身的信息,哈希值对于校验来说足够了。
默克尔树具体来说,一个区块中的所有交易都会求取哈希值,得到的哈希值,再两两组合成新文本求取哈希值,以此类推,直到生成最后一个哈希值,即根哈希值,这些哈希值组成的二叉树就是默克尔树。如下图所示:
区块头现在包含:
- 前一区块的哈希值
- 一个Nonce
- 默克尔树的根哈希值
由于这个根哈希值包含了区块中所有交易的哈希值,因此可以去除这些交易以节省存储空间。
可以看到区块链中,只保存了区块头,这可以大大节省存储空间。这一策略被普通节点使用,普通节点只用于收付款,例如虚拟币钱包。但对于矿工节点,就需要保存区块的完整内容。
用一个加法来代替hash来看交易是否在这个区块里面。5+6等于11,11+12等于23,23+25等于48,35+48等于83,那么只要绿色的和红色的这些数据我就可以证明交易是否在83这个头hash下面,就可以证明没有被篡改,存在这个区块链中。
区块链的难度系数:是设计区块链挖矿难易的关键因子,难度系数越低,挖矿越容易。难度系数越高,相应越难。例如比特币的难度系数是18。
难度系数一般是hash值的前置0的个数。
例如难度系数定为6,也就是区块的有效hash,必须前面有6个0
例如难度系数为6的有效hash为:
00000048bfdc5e67aa448686438f1350a6cc7f4477feb5562b0368a808fdef57
区块体
区块体中记录了该区块存储的交易数量以及交易数据。
2 区块链类型
公有区块链
公有区块链(Public Block Chains)是指:世界上任何个体或者团体都可以发送交易,且交易能够获得该区块链的有效确认,任何人都可以参与其共识过程。公有区块链是最早的区块链,也是应用最广泛的区块链,各大bitcoins系列的虚拟数字货币均基于公有区块链,世界上有且仅有一条该币种对应的区块链 。
联合(行业)区块链
行业区块链(Consortium Block Chains):由某个群体内部指定多个预选的节点为记账人,每个块的生成由所有的预选节点共同决定(预选节点参与共识过程),其他接入节点可以参与交易,但不过问记账过程(本质上还是托管记账,只是变成分布式记账,预选节点的多少,如何决定每个块的记账者成为该区块链的主要风险点),其他任何人可以通过该区块链开放的API进行限定查询 。
私有区块链
私有区块链(Private Block Chains):仅仅使用区块链的总账技术进行记账,可以是一个公司,也可以是个人,独享该区块链的写入权限,本链与其他的分布式存储方案没有太大区别。传统金融都是想实验尝试私有区块链,而公链的应用例如bitcoin已经工业化,私链的应用产品还在摸索当中 。
3 核心技术
(1)分布式账本
分布式账本指的是交易记账由分布在不同地方的多个节点共同完成,而且每一个节点记录的是完整的账目,因此它们都可以参与监督交易合法性,同时也可以共同为其作证。
跟传统的分布式存储有所不同,区块链的分布式存储的独特性主要体现在两个方面:一是区块链每个节点都按照块链式结构存储完整的数据,传统分布式存储一般是将数据按照一定的规则分成多份进行存储。二是区块链每个节点存储都是独立的、地位等同的,依靠共识机制保证存储的一致性,而传统分布式存储一般是通过中心节点往其他备份节点同步数据。没有任何一个节点可以单独记录账本数据,从而避免了单一记账人被控制或者被贿赂而记假账的可能性。也由记账节点足够多,理论上讲除非所有的节点被破坏,否则账目就不会丢失,从而保证了账目数据的安全性。
(2)非对称加密
存储在区块链上的交易信息是公开的,但是账户身份信息是高度加密的,只有在数据拥有者授权的情况下才能访问到,从而保证了数据的安全和个人的隐私。
非对称加密算法需要两个**:公开**(public key)和私有**(private key)。公开**与私有**是一对,如果用公开**对数据进行加密,只有用对应的私有**才能解密;如果用私有**对数据进行加密,那么只有用对应的公开**才能解密。因为加密和解密使用的是两个不同的**,所以这种算法叫作非对称加密算法。
(3)共识机制
共识机制就是所有记账节点之间怎么达成共识,去认定一个记录的有效性,这既是认定的手段,也是防止篡改的手段。区块链提出了四种不同的共识机制,适用于不同的应用场景,在效率和安全性之间取得平衡。
1、POW(Proof of work)
POW即工作量证明,就是众所周知的挖矿,它是一种竞争共识,通过工作量的证明来获得生成区块的权力。它的优点是完全的去中心化,各个节点完全平等,而且可以***的进出;缺点则是POW会造成大量的挖矿资源浪费,达成共识的周期也比较长。
2、POS(Proof of Stake)
POS即权益证明,是POW的一种升级共识机制,它主要解决了POW工作量计算浪费的问题。当前POS已有很多不同的变种,但基本还是根据每个节点所占有代币的数量和时间(即权益)来决定其挖矿的难度。它的优点是缩短了各个节点之间达成共识的时间,缺点则是同POW一样仍然需要挖矿,并且POS会使得“富者更富”。
3、DPOS(Delegate Proof of Stake)
DPOS即股份授权证明机制,是POS的一个变种。它的原理是让每个持有代币的人进行投票,由此产生一定数量的“超级节点”,由这些节点来轮流产生区块。它的优点是不再需要通过挖矿来产生区块,从而可以大幅缩小交易确认的时间,能够达到秒级的共识验证,缺点则是DPOS还是得依赖于代币,不适用于一般的商业应用。
4、POOL
验证池POOL验证池是基于传统分布式一致性算法加上数据验证的机制,也是目前行业链大范围在使用的共识机制。它的优点是无需建立代币,在成熟的分布式一致性算法(Pasox、Raft)的基础上,能够实现实时共识验证;缺点是性能会随着节点数的增加而变差,并且去中心化程度不够。
区块链的共识机制具备“少数服从多数”以及“人人平等”的特点,其中“少数服从多数”并不完全指节点个数,也可以是计算能力、股权数或者其他的计算机可以比较的特征量。“人人平等”是当节点满足条件时,所有节点都有权优先提出共识结果、直接被其他节点认同后并最后有可能成为最终共识结果。以比特币为例,采用的是工作量证明,只有在控制了全网超过51%的记账节点的情况下,才有可能伪造出一条不存在的记录。当加入区块链的节点足够多的时候,这基本上不可能,从而杜绝了造假的可能。
(4)智能合约
智能合约是基于这些可信的不可篡改的数据,可以自动化的执行一些预先定义好的规则和条款。以保险为例,如果说每个人的信息(包括医疗信息和风险发生的信息)都是真实可信的,那就很容易的在一些标准化的保险产品中,去进行自动化的理赔。在保险公司的日常业务中,虽然交易不像银行和证券行业那样频繁,但是对可信数据的依赖是有增无减。因此,笔者认为利用区块链技术,从数据管理的角度切入,能够有效地帮助保险公司提高风险管理能力。具体来讲主要分投保人风险管理和保险公司的风险监督。
4 流程
1.身份验证
当双方通信时,在发送方和接收方之间建立信任是很重要的。特别是,接收者必须信任消息的来源。例如,Bob向Alice发送一些钱,用于从她那里购买一些商品,让我们看看如何在Bob和Alice之间建立这种信任。
- 首先,如果Bob想给Alice支付钱,他必须创建一对自己的私钥/公钥。注意,这2个**总是成对的,只能配对使用,不能混用。
- 现在,Bob要支付10美元给Alice,他创建了一条消息发送给Alice,其中包含Bob的(发送方)公钥、Alice的(接收方)公钥和金额(10美元)。
- 此笔汇款的目的,如“我想从你这里买电子书”也添加到信息中。现在,整个消息都使用Bob的私钥签名。当Alice收到这条消息时,她将使用Bob的公钥来验证消息确实来自Bob。
类似的,Bob也可以通过同样方式,验证Alice的身份。
2.消息加密
现在,Alice已经收到了付款,她想电子书发给Bob。Alice创建一条消息,并将其发送给Bob,如图所示
- Alice创建一条消息,比如“这是电子书”,用Bob的公钥加密。
- Alice发的消息,由于用Bob的公钥加密,所以只能由Bob的私钥解密,拦截消息的人,由于没有Bob的私钥,无法解密消息内容。这就确保了只有Bob能访问电子书网址。
这就保证了消息的私密性。
3.挖矿
区块链中,当Bob付款给Alice时,创建了一个转账交易,但他不会将其单独发送给Alice。相反,交易消息将在他所连接的整个网络上广播。Bob的网络如图所示。
消息传递到所有连接的节点(机器),图中的一些节点被标记为矿工。由于整个网络是广泛分布的,网络中的每个矿工,在任何给定的时间内都会接收来自多人的多个消息。矿工所做的是将这些消息打包到一个区块中。如图所示
在形成一个消息块之后,矿工使用前面描述的哈希函数,在该块上生成一个哈希值。现在,如果任何第三方修改了这个块的内容,那么它的哈希(散列)值将无效。
另外,每个消息都有时间戳,因此时间顺序是不能修改的,因为改了时间戳,哈希值就会无效。
因此,区块中的内容、区块的顺序是完全不能篡改的。我们可以进一步理解,为什么区块链机制可以保护网络中的交易不被篡改。
4.链接区块
由不同矿工创建的区块被连接在一起,形成了所谓的真正分布式公共账本。
链中的每个块包含多个消息(事务),如上图所示。链条上的一个区块可能来自任何矿工。在创建区块链时,可以看到会把前一个区块的哈希值添加到当前区块中。
因此,矿工在创建新区块时,获取链中最顶端区块的哈希值,将它与自己的消息集组合起来,并为新区块创建哈希值。这个新创建的区块现在成为链的新顶端,随着矿工添加越来越多的区块,链将继续增长。
5.工作量证明
区块链中,每个人手上都有账本,每个人都可以记账,但怎么能让这些账本的内容保持一致,让大家都认这个账,就需要共识机制。
人类社会中,通常的共识机制是,如果某个人能完成某项艰难的任务,他就可以做某些事。要推翻这个共识,就也要完成这些艰难的任务,所以共识不是那么容易被推翻。孙悟空当上美猴王,是因为做了难的事(穿过水帘洞)。
类似地,区块链中的共识机制使用同样原理,只有完成了某项艰难的任务,才有记账的权力,这就是工作量证明。区块链中,这项艰难任务是,计算一个数学难题。
现在,我们介绍工作量证明的具体过程。我们向每个块添加一个名为Nonce的项,如下图所示
Nonce是使区块的哈希值满足一定条件的一个数字。例如,这个条件可能是,生成的哈希值前面4位必须为零。
因此,生成的哈希值看起来会像000010101010xxx。通常,矿工在计算Nonce值时,会从0开始,并不断增加,直到生成的哈希值满足指定条件。
注意,哈希生成是随机进行的,并且超出了你的控制范围 — 也就是说,你不能强制哈希函数生成特定的哈希值。
因此,可能需要多次迭代,直到生成满足条件的哈希值。在比特币系统中生成一个区块的预期时间为10分钟。一旦矿工成功地生成了Nonce值,即成功地开采了这个区块,他就会在系统中释放这个区块,使其加入链中,成为最顶端的一个区块。
注意,有多个矿工在竞争生成合法的区块。比特币系统通过给第一个成功的矿工特定的比特币来奖励他。
一般来说,计算能力更强的矿工是早期的赢家。这可能会导致拥有巨大处理能力的人攻击整个系统。
6.交易流程与挖矿
- 区块链网络中,任何想支付的人,需创建一个交易,里面的内容大致是,买家付给卖家多少钱。
- 在一定时间内,网络中可能会发生多笔交易。
- 所有交易,都会通过网络广播,但交易不一定要到达网络中的每个节点。
- 接收到新交易的矿工,将多个新交易组装成一个块。注意,多个矿工之间新建区块中的交易集有可能是不一样的,这是没关系的,系统确保在合理的时间内,网络上广播的交易都包含在某个块中。通常,发送方会向矿工提供一定数量的比特币作为激励矿工可能会优先选择那些激励高的交易放进区块。
- 矿工接下来的工作是为新区块计算工作证明。
- 当矿工计算好工作证明后,它将把组装好的新区块向网络广播。
- 接收到新区块的其他节点,会验证新区块中的所有交易是否有效,比特币是否重复支付,没有问题才会接受。
- 如果该区块被接受为有效的,其他矿工必须对自己正在组建的区块重新组装,删除与已接受区块重复的交易,另外,这些矿工会把已接受区块的哈希值作为自己区块的前向哈希值。
- 类似地,一个区块一个区块就这样被添加到区块链上。