假如有这样一个账本,账本的数据分别存在王二、张三、李四、赵五的电脑上,每个人都记录一份数据。
那么,万一张三偷偷将自己的余额修改了,比如改成300
那么网络中如何判别出张三修改后的假数据呢
Hash(原始信息) = 摘要信息
同样的原始信息用同一个哈希函数总能得到相同的摘要信息原始信息任何微小的变化都会哈希出面目全非的摘要信息从摘要信息无法逆向推算出原始信息
假如说有这样一个账本
会包括账本序号、记账时间、交易信息
对这样一个账本记录进行Hash之后就可以得到一个摘要信息,即787635A
如果有修改的假数据,那么其哈希值会发生很大的变化
然后对序号、时间戳、Hash值、交易记录保存下来就形成了一个区块
序号、时间戳、Hash值称为区块的头
此时,如果来了第二个账本
记账时间比刚才那个推迟了10分钟
比特币的记账时间是每十分钟记一次
再对这个账本进行哈希的时候会加入第一个账本的哈希值
第二个账本也会形成一个区块
然后由此类推,就会产生第三个块、第四个块......第n个块
这就是形成了区块链
然后每个节点在核对数据的时候,只需要核对最后一个区块的摘要信息。如果最后一个区块的摘要信息能对上,说明整个区块链的账本是正确的。
比特币是点对点交易的,如何在没有第三方银行的参与下,确定账户的所有权呢?
账户是用一个地址来表示的。转账的过程是把比特币从一个地址转移到另外一个地址,账本上是不保存任何个人信息的
这样一条信息就是一个转账记录,如果谁能用这个地址进行支付,谁就拥有这个账户的所有权
一个地址(一个账户)有一个对应的私钥,谁拥有这个私钥,谁就能用这个地址进行支付
所以私钥一定要保管好,如果私钥泄露了的话,比特币就有可能会丢失
不像银行一样丢失了我们可以重置密码,私钥泄漏的话没办法重置或者去找
比特币地址(账户)和私钥是非对称的关系,私钥经过两次哈希运算之后就可以得出比特币的地址,地址不能反推私钥
如何在不泄露私钥的情况下来证明我们拥有某个地址的私钥 ?
你在交易的时候如果要亮出私钥给别人看,那么私钥就泄露了
通过非对称加密技术——交易签名
签名过程
①对原始交易记录进行hash运算得到摘要信息
②用私钥对摘要信息进行签名运算
③签名运算之后付款的节点就会向相邻节点进行广播。
广播内容会包含交易的原始信息、交易的签名信息。
当节点收到广播并且验证通过之后,会向与自己相邻的节点进行广播,直到广播到整个网络
验证过程
签名和验证是逆运算
其他节点收到广播信息之后就会开始来验证,验证签名的信息是不是付款方用私钥对原始信息签名产生的
可以看作,付款人的地址是公钥
签名的过程是对摘要进行加密的过程,验证是一个解密的过程
整个账户里面是没有个人信息的。即使我的地址上有1w个比特币,也没有任何人能够知道这个比特币是我的,而我依然可以用来支付
在银行卡里的钱,如果银行认为来路不明,我们的账户就可能会被冻结。比特币系统中没有这个问题
记账就是把交易的记录、时间、账本序号等信息进行Hash打包的过程
记账的过程叫做挖矿
自然,记账的过程是需要消耗计算机计算资源的
那么节点为什么要参与记账呢?完成记账的节点可以获得系统一定数量的比特币奖励的。这个奖励其实也就是比特币的发行过程。
记账是有奖励的,每次记账是先发行一定数量的比特币到记账的账户
这样的话就会出现大家都去争相记账。所以,要有具体的规则来限制大家进行记账
①一段时间内只有一人可以记账成功②通过解决密码学难题(即工作量证明)竞争获得唯一记账权③其他节点复制记账结果
挖到矿的节点,会在交易中添加一笔给自己转账的交易,即挖矿奖励
我们之前讲的是
为了保证一段时间内只有人可以记账,提高了记账的难度
要求Hash计算得到的结果必须要以n个0开头
通过改变随机数的值不断尝试
这是一个真实的区块,512884号区块。这个区块的哈希值是以18个0开头
哈希值是16进制字符串,得到一个0的概率是1/16,所以如果要得到18个0的话,需要16^18=4,722,366,482,869,645,213,696的计算量,需要投入巨大的计算资源,包括电力
目前已经没有独立的矿工去挖矿了, 现在都是矿工联合起来组成矿池进行挖矿
并且,我国由于电力成本比较低,相对收益更高,所以中国的算力占据了整个网络的一半以上
如果两个节点同时完成工作量证明,用谁的区块?
区块链中无第三方仲裁机构裁决,所以引入了共识机制
共识机制就是大家共同遵守的规范和协议
共识机制认可累计工作量最大的区块链
这样大家在挖矿的时候都会去选择工作量最大的区块链然后去延长它
共识机制最终的目的是要保证比特币不停的在工作量最大的区块上运转,每次都选择最长的链去挖矿
将累积了最大工作量的区块链称为主链
不同矿工在几乎同时同时挖了一个矿,打出了两个包 3458A和3458B,然后立刻在网络上进行广播,先是传给邻近的节点
有的节点会先收到3458A,有的节点会先收到3458B
收到A块的就会把A块添加到主链上,收到B块的会把B块添加到主链上。随后收到的另一个会作为备用链保存
这样就出现分叉了
此时两条链会竞争,但是总会有一方抢先发布工作量证明,比如是B块
然后下一个3459B再产生了之后,在网络上给广播,之前保存3458A的区块在收到3459B之后就会将3458B这个链条作为主链了