承接上文,接下来,我们来了解什么是区块链,以及区块链的原理和作用
什么是区块链
区块链是一种分布式数据库技术,具有不可篡改性和透明性。它是一个由许多区块组成的链,每个区块包含了一些数据,如交易信息。新的区块在链的末尾被添加,并且由多个节点维护。
区块链的关键特征是不可篡改性。这意味着,一旦数据在区块链上被写入,就不能被更改或删除。这是因为,当一个新的区块被添加到链上,它会被所有节点确认,并且数据将被多个节点备份,这使得区块链具有很高的安全性。
区块链技术在很多领域都有广泛应用,如加密货币、智能合约、供应链管理、身份管理等。它具有很高的透明性和安全性,因此被认为是一种有前途的技术。
区块链是做什么的
区块链的一个典型应用是加密货币,如比特币。在这种情况下,区块链被用来维护一个数字货币的交易记录。每当一个人想要转移比特币,就会创建一笔交易,并且该交易将被添加到区块链上。由于区块链具有不可篡改性,因此交易记录是可信的。
另一个例子是供应链管理。区块链可以被用来维护一个全球供应链的交易记录,以确保来自各个环节的数据是可信的。每当一个产品从一个环节转移到另一个环节时,都会创建一笔交易,并且该交易将被添加到区块链上。这有助于防止供应链中的欺诈和误导行为,并且可以让客户对产品的质量和来源有更多的了解。
还有一个例子是身份管理。区块链可以被用来维护一个分布式身份管理系统。每当一个人需要证明自己的身份时,就会创建一笔交易,并且该交易将被添加到区块链上。由于区块链具有不可篡改性,因此该系统是安全的。
这些例子只是区块链的一些潜在应用,它还可以用于其他领域,例如投票,合同管理和数据存储。在这些领域中,区块链的不可篡改性和去中心化特性都可以被利用。
区块链原理
区块链的原理建立在分布式数据存储和加密技术的基础上。它是一个由一系列数据块组成的链,每个数据块都包含了交易数据和一个指向上一个数据块的链接。每个数据块在创建之前都必须通过一个复杂的数学问题进行验证,然后才能被加入到区块链上。由于所有参与者都可以查看区块链上的数据,并且数据在被加入到区块链之后不能被修改,因此区块链可以用于存储可靠的数据和信息。
专业一点说,区块链主要包含区块头和区块主体两部分。区块头主要由父区块哈希值(Previous Hash)、时间戳(Timestamp)、默克尔树根(Merkle TreeRoot)等信息构成;区块主体一般包含一串交易的列表。每个区块中的区块头所保存的父区块的哈希值,便唯一地指定了该区块的父区块,在区块间构成了连接关系,从而组成了区块链的基本数据结构。
区块链的基础技术主要包括: 哈希运算、数字签名、P2P网络、共识算法以及智能合约等
在区块链中,每个区块头包含了上一个区块数据的哈希值,这些哈希层层嵌套,最终将所有区块串联起来,形成区块链。区块链里包含了自该链诞生以来发生的所有交易,因此,要篡改一笔交易,意味着它之前的所有区块和父区块哈希全部要篡改一遍。这需要进行大量的运算。如果想要篡改数据,必须靠伪造交易链实现,即保证在正确的区块产生之前能快速地运算出伪造的区块。
在以比特币为代表的区块链系统中,要求连续产生一定数量的区块之后,交易才会得到确认,即需要保证连续伪造多个区块。只要网络中节点足够多,连续伪造的区块运算速度都超过其他节点几乎是不可能实现的。另一种可行的篡改区块链的方式是,某一利益方拥有全网超过50%的算力,利用区块链中少数服从多数的特点,篡改历史交易。
然而在区块链网络中,只要有足够多的节点参与,控制网络中50%的算力也是不可能做到的。即使某一利益方拥有了全网超过50%的算力,那已经是既得利益者,肯定会更坚定地维护区块链网络的稳定性。
在区块链中默克尔树就是当前区块所有交易信息的一个哈希值。但是这个哈希值并不是直接将所有交易内容计算得到的哈希,而是一个哈希二叉树。首先对每笔交易计算哈希值;然后进行两两分组,对这两个哈希值再计算得到一个新的哈希值,两个旧的哈希值就作为新哈希值的叶子节点,如果哈希值数量为单数,则对最后一哈希值再次计算哈希值即可;然后重复上述计算,直至最后只剩一个哈希值,作为默克尔树的根,最终形成一个二叉树的结构。
在区块链中,我们只需要保留对自己有用的交易信息,删除或者在其他设备备份其余交易信息。如果需要验证交易内容,只需验证默克尔树即可。若根哈希验证不通过,则验证两个叶子节点,再验证其中哈希验证不通过的节点的叶子节点,最终可以准确识别被篡改的交易。
默克尔树在生活中其他领域应用也非常广泛。例如BT下载,数据一般会分成很多个小块,以保证快速下载。在下载前,先下载该文件的一个默克尔树,下载完成后,重新生成默克尔树进行对比校验。若校验不通过,可根据默克尔树快速定位损坏的数据块,重新下载即可。
在密码学领域,一套数字签名算法一般包含签名和验签两种运算,数据经过签名后,非常容易验证完整性,并且不可抵赖。只需要使用配套的验签方法验证即可,不必像传统物理签名一样需要专业手段鉴别。数字签名通常采用非对称加密算法,即每个节点需要一对私钥、公钥密钥对。所谓私钥即只有本人可以拥有的密钥,签名时需要使用私钥。不同的私钥对同一段数据的签名是完全不同的,类似物理签名的字迹。数字签名一般作为额外信息附加在原消息中,以此证明消息发送者的身份。公钥即所有人都可以获取的密钥,验签时需要使用公钥。因为公钥人人可以获取,所以所有节点均可以校验身份的合法性
在区块链网络中,每个节点都拥有一份公私钥对。节点发送交易时,先利用自己的私钥对交易内容进行签名,并将签名附加在交易中。其他节点收到广播消息后,首先对交易中附加的数字签名进行验证,完成消息完整性校验及消息发送者身份合法性校验后,该交易才会触发后续处理流程。
共识算法:为什么要共识? 区块链通过全民记账来解决信任问题,但是所有节点都参与记录数据,那么最终以谁的记录为准?或者说,怎么保证所有节点最终都记录一份相同的正确数据,即达成共识?在传统的中心化系统中,因为有权威的中心节点背书,因此可以以中心节点记录的数据为准,其他节点仅简单复制中心节点的数据即可,很容易达成共识。然而在区块链这样的去中心化系统中,并不存在中心权威节点,所有节点对等地参与到共识过程之中。由于参与的各个节点的自身状态和所处网络环境不尽相同,而交易信息的传递又需要时间,并且消息传递本身不可靠,因此,每个节点接收到的需要记录的交易内容和顺序也难以保持一致。更不用说,由于区块链中参与的节点的身份难以控制,还可能会出现恶意节点故意阻碍消息传递或者发送不一致的信息给不同节点,以干扰整个区块链系统的记账一致性,从而从中获利的情况。因此,区块链系统的记账一致性问题,或者说共识问题,是一个十分关键的问题,它关系着整个区块链系统的正确性和安全性
有哪些共识算法? 当前区块链系统的共识算法有许多种,主要可以归类为如下四大类:
- 工作量证明(Proof of Work, PoW)类的共识算法
- PoS的凭证类共识算法
- 拜占庭容错(Byzantine Fault Tolerance, BFT)类算法
- 结合可信执行环境的共识算法
对等计算机网络(Peer-to-Peer Networking,P2P网络),是一种消除了中心化的服务节点,将所有的网络参与者视为对等者(Peer),并在他们之间进行任务和工作负载分配。P2P结构打破了传统的C/S模式,去除了中心服务器,是一种依靠用户群共同维护的网络结构。由于节点间的数据传输不再依赖中心服务节点,P2P网络具有极强的可靠性,任何单一或者少量节点故障都不会影响整个网络正常运转。同时,P2P网络的网络容量没有上限,因为随着节点数量的增加,整个网络的资源也在同步增加。由于每个节点可以从任意(有能力的)节点处得到服务,同时由于P2P网络中暗含的激励机制也会尽力向其他节点提供服务,因此,实际上P2P网络中节点数目越多,P2P网络提供的服务质量就越高。
在区块链系统中,要求所有节点共同维护账本数据,即每笔交易都需要发送给网络中的所有节点。如果按照传统的C/S这种依赖中心服务节点的模式,中心节点需要大量交易信息转发给所有节点,这几乎是不可能完成的任务。P2P网络的这些设计思想则同区块链的理念完美契合。在区块链中,所有交易及区块的传播并不要求发送者将消息发送给所有节点。节点只需要将消息发送给一定数量的相邻节点即可,其他节点收到消息后,会按照一定的规则转发给自己的相邻节点。最终通过一传十、十传百的方式,最终将消息发送给所有节点。
以传统的银行系统为例。传统银行系统均采用C/S网络架构,即以银行服务器为中心节点,各个网点、ATM为客户端。当我们需要发起转账时,首先提供银行卡、密码等信息证明身份,然后生成一笔转账交易,发送到中心服务器后,由中心服务器校验余额是否充足等信息,然后记录到中心服务器,即可完成一笔转账交易。
而在区块链网络中,并不存在一个中心节点来校验并记录交易信息,校验和记录工作有网络中的所有节点共同完成。当一个节点需要发起转账时,需要指明转账目的地址、转账金额等信息,同时还需要对该笔交易进行签名。由于不存在中心服务器,该交易会随机发送到网络中的邻近节点,邻近节点收到交易消息后,对交易进行签名,确认身份合法性后,再校验余额是否充足等信息。均校验完成后,它则会将该消息转发至自己的邻近节点。以此重复,直至网络中所有节点均收到该交易。最后,矿工获得记账权后,则会将该交易打包至区块,然后再广播至整个网络。区块广播过程同交易的广播过程,仍然使用一传十、十传百的方式完成。收到区块的节点完成区块内容验证后,即会将该区块永久地保存在本地,即交易生效。
什么是复杂的数学问题
“复杂的数学问题”指的是一个加密算法,通常称为“工作量证明(Proof-of-Work)”。这是一个计算问题,必须通过大量的计算才能解决,而且解决的难度随着时间的推移而增加。工作量证明的目的是防止恶意用户对区块链进行攻击,例如创建大量的假数据块。当一个数据块通过工作量证明验证后,它就可以被加入到区块链上。因此,工作量证明可以用作区块链上数据的可靠性和安全性的保证。
什么是挖矿
挖矿是区块链技术中的一种重要概念。在区块链系统中,挖矿是指用计算机资源“解决复杂的数学问题”,并在区块链上创建新块的过程。
通过挖矿,可以验证交易,确保数据安全,并通过奖励系统获得加密货币。挖矿者通过使用计算机硬件进行挖矿活动,可以获得相应的加密货币奖励。
随着加密货币市场的不断发展,挖矿已经成为了一项全球性的活动,涉及到许多用户、企业和投资者。然而,由于挖矿需要大量的计算资源和电力,因此也面临着一些技术和环境挑战。
挖矿为什么是计算机而不是人类
挖矿是一个需要大量计算资源和处理能力的数学问题,因此必须使用计算机进行挖矿。人类不具有解决这样复杂数学问题的能力,用人类计算“解决复杂的数学问题”是不现实的
此外,计算机挖矿能够自动执行挖矿任务,并在实时进行数据验证,从而确保区块链系统的安全性和效率。因此,计算机挖矿是区块链技术的重要组成部分。
为什么使用显卡挖矿而不是其他硬件
使用显卡挖矿主要是因为显卡具有强大的计算能力,可以大幅提高挖矿速度和效率。显卡是针对图形处理和计算密集型任务进行设计和优化的硬件,因此具有高效的矩阵运算能力和多计算单元,使得显卡比普通的中央处理器(CPU)更适合挖矿。
此外,不同的加密货币对不同类型的硬件有不同的要求,因此使用显卡挖矿的情况也取决于挖矿的加密货币。对于一些加密货币,使用显卡挖矿效率更高,而对于其他加密货币,则更适合使用其他类型的硬件进行挖矿。
总的来说,显卡具有比其他硬件更高的计算能力和效率,可以更快地解决数学问题,并帮助保证区块链系统的安全性。
什么是哈希算法
哈希算法(HashAlgorithm)是一种计算机程序,通过把任意长度的输入(又叫做预映射,pre-image),变换成固定长度的输出,该输出就是散列值(hash value)。哈希算法主要是用于数字签名、数据校验和散列函数等场景中,常用的哈希算法有:MD5,SHA-1,SHA-256,SHA-512等
例如morning的哈希为c7c3169c21f1d92e9577871831d067c8 bitcoin的哈希为cd5b1e4947e304476c788cd474fb579a
哈希通常用十六进制表示,因为哈希算法是一个单向函数,所以无法通过输出反推输入,只能暴力穷举
哈希碰撞是指在哈希算法中,对不同的输入数据生成的哈希值相同的情况。这是因为哈希算法的哈希值长度是有限的,因此不同的输入数据可能会生成相同的哈希值,这种情况称为哈希碰撞。解决哈希碰撞的方法是使用更长的哈希值或使用不同的哈希算法
哈希算法的作用是,如果两个输入的哈希相同,我们认为两个输入是相同的。
如果输入的内容就是文件内容,而两个文件的哈希相同,说明文件没有被修改过。当我们从网站上下载一个非常大的文件时,我们如何确定下载到本地的文件和官方网站发布的原始文件是完全相同,没有经过修改的呢?哈希算法就体现出了作用:我们只需要计算下载到本地的文件哈希,再和官方网站给出的哈希对比,如果一致,说明下载文件是正确的,没有经过篡改,如果不一致,则说明下载的文件肯定被篡改过
和文件类似,如果两份数据的哈希相同,则可以100%肯定,两份数据是相同的。比特币使用哈希算法来保证所有交易不可修改,就是计算并记录交易的哈希,如果交易被篡改,那么哈希验证将无法通过,说明这个区块是无效的
区块链的哪部分需要用到哈希计算
在区块链系统中,哈希计算主要用在区块头部的数字签名以及确认交易历史的链式验证。区块头部包含了当前区块的哈希值,以及上一个区块的哈希值,哈希值的计算是通过对当前区块内的所有数据进行哈希算法处理得到的。这样,通过链式验证,可以确保历史交易的不可篡改性。
区块链使用哪种哈希算法
区块链系统通常使用SHA-256(Secure Hash Algorithm 256-bit)或其他类似算法来计算哈希值。有些区块链系统使用更加先进的哈希算法,如Scrypt、Ethash、SHA-512等。这些算法的选择取决于区块链系统的具体需求
SHA-256的理论碰撞概率是:尝试2的130次方的随机输入,有99.8%的概率碰撞。注意2130是一个非常大的数字,大约是1361万亿亿亿亿。以现有的计算机的计算能力,是不可能在短期内破解的。
比特币使用两种哈希算法,一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256或者dhash。
另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。
区块链如何应用哈希
假设一个区块有4个交易,我们计算每个交易数据的hash,得到4个哈希值a1,a2,a3和a4,然后带入此文章中讲过的默克尔树里面,把a1,a2,a3,a4进行哈希计算,然后把a1+a2进行哈希计算得到b1,把a3+a4进行哈希计算得到b2,然后把b1+b2进行哈希计算得到根哈希(Merkle Hash)
如果交易的数量不恰好是4个怎么办?例如,只有3个交易时,第一个和第二个交易的哈希a1和a2可以拼起来算出b1,第三个交易只能算出一个哈希a3,这个时候,就把a3直接复制一份,算出b2,这样,我们也能最终计算出Merkle Hash
如果有5个交易,我们可以看到,a5被复制了一份,以便计算出b3,随后b3也被复制了一份,以便计算出c2。总之,在每一层计算中,如果有单数,就把最后一份数据复制,最后一定能计算出Merkle Hash
┌─────────┐
│ merkle │
└─────────┘
▲
┌───────────┴───────────┐
│ │
┌───┐ ┌───┐
│c1 │ │c2 │
└───┘ └───┘
▲ ▲
┌─────┴─────┐ ┌─────┴─────┐
│ │ │ │
┌───┐ ┌───┐ ┌───┐ ┌ ─ ┐ │b1 │ │b2 │ │b3 │ b3 └───┘ └───┘ └───┘ └ ─ ┘ ▲ ▲ ▲ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ │ │ │ │ │ │ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌ ─ ┐ │a1 │ │a2 │ │a3 │ │a4 │ │a5 │ a5 └───┘ └───┘ └───┘ └───┘ └───┘ └ ─ ┘
Block Hash
区块本身用Block Hash——也就是区块哈希来标识。但是,一个区块自己的区块哈希并没有记录在区块头部,而是通过计算区块头部的哈希得到的:
区块头部的Prev Hash记录了上一个区块的Block Hash,这样,可以通过Prev Hash追踪到上一个区块
由于下一个区块的Prev Hash又会指向当前区块,这样,每个区块的Prev Hash都指向自己的上一个区块,这些区块串起来就形成了区块链。
区块链的第一个区块(又称创世区块)并没有上一个区块,因此,它的Prev Hash被设置为00000000...000。
如果一个恶意的攻击者修改了一个区块中的某个交易,那么Merkle Hash验证就不会通过。所以,他只能重新计算Merkle Hash,然后把区块头的Merkle Hash也修改了。这时,我们就会发现,这个区块本身的Block Hash就变了,所以,下一个区块指向它的链接就断掉了
由于区块的哈希必须满足一个难度值,因此,攻击者必须先重新计算这个区块的Block Hash,然后,再把后续所有区块全部重新计算并且伪造出来,才能够修改整个区块链。
在挖矿中,我们会看到,修改一个区块的成本就已经非常非常高了,要修改后续所有区块,这个攻击者必须掌握全网51%以上的算力才行,所以,修改区块链的难度是非常非常大的,并且,由于正常的区块链在不断增长,同样一个区块,修改它的难度会随着时间的推移而不断增加
挖矿实际上做了什么
挖矿是通过计算当前区块(包括交易记录和上一个区块的哈希值)的哈希值,直到满足条件(通常是哈希值前几位为零),然后将其作为新区块的哈希值,并等待其他矿工验证。如果验证通过,则该新区块将被添加到比特币区块链上,并获得挖矿奖励
挖矿是一种确认和打包交易的过程,参与挖矿的矿工可以获得回报,其中一个回报就是新生成的加密货币奖励。在比特币网络上,每个新生成的区块都会获得一定数量的比特币奖励,该奖励是通过挖矿过程计算出的哈希值而获得的。因此,挖矿就是一种通过使用计算能力来获得比特币的方式
比特币挖矿的奖励是指,当矿工计算出新的区块的哈希值,并将其验证通过之后,将获得一定数量的比特币作为奖励。这是比特币系统为了鼓励矿工继续加入区块链网络并维护该网络安全健康的一种机制。此奖励是固定的,每210,000个块减半一次,目前奖励是6.25个比特币,同时奖励也可以通过比特币的系统参数进行调整
什么是矿池
矿池是一个由矿工组成的群体,通过共享计算资源(如计算机的处理能力)来增加挖矿的效率和概率。在矿池中,每个矿工都会把自己的计算能力捐赠给矿池,矿池在进行挖矿时使用这些能力。如果挖出了新的区块,那么矿池会把挖矿奖励分配给参与该矿池的每个矿工