区块链的核心概念
区块
区块作为区块链的基本结构单元,由包含元数据的区块头和包含交易数据的区块主体构成。
区块头
字段 | 描述 |
---|---|
版本号 | 区块版本号,表示本区块遵守的验证规则 |
父区块头哈希值 | 前一区块的哈希值,使用SHA256(SHA256(父区块头))计算 |
当前区块的哈希值 | id |
Merkle(默克尔)根 | 该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算 |
时间戳 | 该区块产生的近似时间,精确到秒的UNIX时间戳 |
难度目标 | 该区块工作量证明算法的难度目标,已经使用特定算法编码 |
Nonce | 随机数,用于工作量证明算法的计数器 |
区块体
这段时间内的交易数据
区块链系统大约每10分钟会创建一个区块,包含这段时间的所有交易。每个区块包含前一个区块的ID(父区块头哈希值),这使得每个区块都能找到其前一个区块的节点,这样就形成了一条完整的交易链条。全网形成了一条唯一的主区块链。
哈希算法
哈希算法是区块链中保证交易信息不被篡改的单向密码机制。
特点:
- 加密过程不可逆
- 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都会导致输出的散列数据的变化。
区块链通常使用SHA-256
上面说过区块头包含很多内容,其中有当前区块体的哈希,还有上一个区块的哈希。这意味着,如果当前区块体的内容变了,或者上一个区块的哈希变了,一定会引起当前区块的哈希改变。
这一点对区块链有重大意义。如果有人修改了一个区块,该区块的哈希就变了。为了让后面的区块还能连到它(因为下一个区块包含上一个区块的哈希),该人必须依次修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于后面要提到的原因,哈希的计算很耗时,短时间内修改多个区块几乎不可能发生,除非有人掌握了全网51%以上的计算能力。
正是通过这种联动机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改。这就像历史一样,发生了就是发生了,从此再无法改变。
公钥和私钥
公钥和私钥 - 俗称非对称加密方式。通常都是用公钥加密信息,用私钥解密信息。是对对称加密方式(账号和密码)的提高。对称加密方式缺点是显而易见的,如果被人知道了密钥和加密方法,于是按照加密方法反着来就能解密。
在比特币系统中,私钥的本质上是32个字节组成的数组,公钥和地址的生成都依赖私钥。有了私钥就能生成公钥和地址,就能花费对应地址上面的比特币。
在区块链中,使用公钥和私钥来标识身份。
公钥是公开的,任何人都可以获取。私钥是保密的,只有拥有者才能使用。
他人使用你的公钥加密信息,然后发送给你,你用私钥解密,取出信息。反过来,你也可以用私钥加密信息,别人用你的公钥解开,从而证明这个信息确实是你发出的,且未被篡改,这叫做数字签名。(详见什么是数字签名)
比特币主要用了ECDSA(椭圆曲线签名算法),这个算法有两个特性:
- 只要知道私钥,可以算出相应的公钥
- 你用私钥签名过的东西,可以用公钥算一下是不是你签的
私钥:
- 私钥占256bit的空间。私钥是由比特币的客户端完成的,不要我们去干预。
- 私钥是其实就是一个随机数,它是位于1--1.15810^77-1之间的一个数,1.1581077略小于2256
公钥:
- 私钥使用椭圆曲线算法可以得到公钥
- 椭圆曲线算法是在一个曲线上找到一个点,这个点的坐标就是公钥
- x=F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
- y=07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
这个算法有一个很奇妙的地方就是通过公钥无法得出私钥。我觉的这就是数学很奇妙的地方,由A可以得到B,但是B无法得出A。
时间戳
区块链中的时间戳从区块生成的一刻起就存在区块中,它对应每一次交易记录的认证,保证真实性。一旦修改,哈希值就会变化。
Merkle(默克尔) Tree
Merkle Tree,是一种树(数据结构中所说的树),网上大都称为Merkle Hash Tree,这是因为 它所构造的Merkle Tree的所有节点都是Hash值。Merkle Tree具有以下特点:
- 它是一种树,可以是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点
- Merkle树的叶子节点上的value,是由你指定的,这主要看你的设计了,如Merkle Hash Tree会将数据的Hash值作为叶子节点的值;
-
非叶子节点的value是根据它下面所有的叶子节点值,然后按照一定的算法计算而得出的。如Merkle Hash Tree的非叶子节点value的计算方法是将该节点的所有子节点进行组合,然后对组合结果进行hash计算所得出的hash value。
这里有个问题,如果哈希次数是单数怎么办,
比如上图,多个交易E。这时候会复制交易E,然后哈希E+E
比特币的工作流程
在区块链中,所有节点向上回溯,都会到达源头,区块链中的第一个区块 -- 创世区块
在创世区块诞生之后,比特币的用户通过不断的通过计算寻找满足特定SHA-256哈希值对应的数值解。这个过程就是比特币中的挖矿。
当任意一个用户首先算出符合要求的数值解时,就会在全网广播,然后网络中的其他节点收到这条信息会进行验证,如果通过的话,其他节点就会放弃计算,并将新的区块加到前一个区块的后面。
哈希算法的难度也会不断调整,以此控制用户们解出数据所用的时间。
区块链的分叉
按照兼容性不同,分为硬分叉和软分叉。
硬分叉:永久性的
软分叉:暂时性的
硬分叉是指比特币区块格式或者交易格式(共识)发生改变时,未升级的节点拒绝验证已经升级的节点生产出的区块,不过已经升级的节点可以验证未升级节点生产出的区块,然后大家各自延续自己认为正确的链,所以分成两条链。
硬分叉特点:
- 没有向前兼容性,之前的版本不可再用,需要强制升级
- 在区块链层面会有分叉的两条链,一条旧链,一条分叉新链
- 需要在某个时间点全部同意分叉升级,不同意将会进入旧链
软分叉的指比特币的数据结构发生改变时,未升级的节点可以验证已经升级的节点生产出的区块,而且已经升级的节点也可以验证未升级的节点生产出的区块
软分叉的特点:
- 有较好的兼容性,之前版本的部分功能可用,可不升级
- 在区块链层面没有分叉的链,只有组成链的区块有新区块和旧区块之分
- 相当长的时间里,可允许不进行升级,继续使用原版本生成的旧区块,新旧并存