首先,该本账本并不存在于一个单一中央服务器内,而是存在于所有装了客户端的电脑硬盘上,也就是所谓的区块链分布式存储。这里你可以想象区块链就是一部电影,每个客户端(钱包)安装完成后,都会从网上自动下载一部和原片一模一样的副本,保存到本地硬盘。这里用到的技术相信下载过BT的人都知道,叫做P2P。但该账本是加密的,在没有私钥的情况下,谁都无法查看账本内的详细交易记录,也不能交易,关于私钥,具体请参考详情参考《聊聊钱包 私钥 公钥 地址》。
其次,该账本一共有四十七万页之多,也就是四十七万个区块。每页或者说每个区块里都记录着成百上千的交易记录,要保证四十七万页的顺序不出错,是不是想着就头大了呢!物理世界的书本或账本每一页都会有页码表示前后关系,区块链世界里每个区块都由区块头和数据主体构成。区块头相当于页码,记录了本区块头,前一区块头,下一区块头的hash值。通过这些hash值的前后关联,保证了区块的顺序,所以区块头即是页码和链。
下图是第19999个区块,第20000个区块和第20001个区块头之间的指向关系,每个区块头里都有一个唯一hash值,并记载了前一个区块头的hash,和后一个区块的hash,彼此互联,成为一条链。
需要注意的是,比特币区块的起始区块,0号区块(创世区块),是不指向任何之前区块的,因为它是第一块。
那有人可能会问,能不能把区块头黑掉,替换成我编写的信息呢?
答案是,几乎不可能!
因为区块头的hash值是对区块头数据进行SHA256算法加密后生成的一段字符串。该字符串会因为输入的数据不同而不同,区块头本身是一串二进制数据,你改了其中任何一个数字,通过SHA256算法后,就会产生不同的hash值。(举个例子,我们从网上下载zip文件包时,通常也会包含一段MD5的字符串,该字符串原理类似SHA256,它的作用是验证文件的完整性。)
如果hash值变了,那就需要去更改本区块之前和之后对应的区块,然后是和那些区块对应的区块,以此类推生生不息,你需要修改整条链上的所有区块,并且还需要把网络上超过51%的副本都修改了,才能起作用,考虑到这本账本有四十七万页之多,以及网络上的众多副本,这个修改的工作量将会大的惊人。