The longest chain not only serves as proof of the sequence of events witnessed, but proof that it came from the largest pool of CPU power. As long as a majority of CPU power is controlled by nodes that are not cooperating to attack the network, they'll generate the longest chain and outpace attackers.
几个典型的加密哈希函数:
哈希指针的值是通过数据计算出来的且指向数据所在位置,所以哈希指针可以告诉我们数据存储位置及数据的哈希值。通过哈希指针,我们可以很容易判断出数据是否有被篡改。
区块链是一个基于哈希指针构建的一个有序的,反向链接的交易块链表,也就是说在区块链中每个区块都通过哈希指针连接到前一个区块上。
区块链也常被看做一个垂直的堆栈,区块在栈顶一次追加,第一个区块也就是整个堆栈的基础。所以也常常用“高度”(height) 这个词来描述某个区块到第一个区块的距离。
区块链中的每一个区块都有一个对区块头部进行哈希函数计算得出的哈希值作为标识。以及每个区块头部专门有一个字段用来存储前一个区块(也叫父区块)的哈希值。
(反链接: 假设把网页文档A中包含的指向B的链接命名为“A-B”,则对B来说这个“A-B”即为一个反向链接。对某个网页文档来说,所有来自其他文档指向自己的链接都叫“反向链接”。一个网页文档的反向链接越多,说明这个文档的“知名度”或“支持率”越高。)
结构:区块的头部的组成分为3大块。第一块是前面区块的哈希值。第二块包含了一个随机数,一个点数(用来表示找到这个区块的难度),和一个时间戳,这三个字段都与挖矿的过程息息相关。第三块是 merkle tree 的树根。
创世区块如下:从任何一个区块向前追溯,最终都会到达创世区块。
merkle tree在区块链中用于组织和记录存储在区块中的交易,以便高效的验证某个交易是否存在在区块中。通过不断的递归计算节点的哈希值直到只有一个hash值来构建。
merkle tree是自底向上构建的 ,通过二次哈希得到
H(A) = SHA256(SHA256(A))
H(AB) = SHA256(SHA256(H(A) + H(B)))
该树是一棵二叉树,它需要偶数个叶子节点。如果恰好是奇数个交易,那么最后一笔交易会被复制一遍,来创造偶数个叶子节点,以便达到平衡。一个区块通常要记录几百到上千的交易。
将该数字货币的前一次转账和本次转账的接收方公钥的Hash通过数字签名的方式添加到该数字货币末尾的方式,来完成所有权的转移。接收方可以通过校验数字签名的方式来确定该数字货币的拥有者。
为了解决数字货币“重复支付”的问题(即一个货币的拥有者同时用该货币买多种商品)。在实体金币的时代,我们通过信任第三方机构或者铸币厂来检查每一个货币的真伪来确定是否存在“重复交易”的情况。我们需要一种方法来确保该数字货币的支付者没有对更早的另一笔支付签名。在没有第三方的情况下达成这个目的,一笔转账的发生必须向公众公布。只有大部分节点都同意该笔转账最先发生,这笔转账才奏效。
以时间戳服务作为基础。时间戳服务器通过Hash的方式对一块数据打上时间标记,并向全网广播。每个时间戳的Hash中还包含了上一块数据的时间戳,这样形成的链条强化了数据的真实性。
工作量证明机制通过检查数据经过Hash运算(如SHA-256)之后的结果,保证其以规定个数的“0”位开始。通过计算表明,生成这种Hash的工作量随着“0”位的个数增加呈指数级增长。通过对数据增加一个随机数再进行Hash运算的方式来获取满足“0”位要求的Hash值。一旦通过CPU的运算产生了符合要求的Hash,这一块数据就无法被更改了。
运行步骤如下:
在一笔交易之后已经产生了足够多的区块时,我们就可以不再保存这笔交易以及其之前的交易以节省存储的空间。
每个压缩后的区块数据量约为80bytes。如果每10分钟产生一个新的区块,则每年所需的存储空间约为 80bytes *6*24*365 = 4.2MB。当前(2008年)的民用计算机系统普遍拥有2GB内存,按照摩尔定律预测每年内存增长1.2GB的话,这些数据就算全部存储在内存中也没有问题。
用户无需通过所有网络节点。用户可以通过不断地请求网络上的其它节点中的数据,直到获得最长的区块链数据为止,同时可以根据连接到区块头部的哈希树来获取交易数据。用户无法自行检查交易数据的真伪,但是通过判断该交易链接到的区块是否在最长的区块链中,就可以判定该交易的真伪。
对交易中的每一份币值都进行单独操作的话则显得过于笨重。我们通过将多个输入和输出合并在一次转账中的方式来实现币值的分解与合并。通常,输入的部分或者包含一个较大的输入,或者包含多个较小的输入,这些输入都来自于之前的转账的输出。输出部分至多包含两个,一个用于支付,另一个用于将找零返还给输入中的用户。
传统的银行通过限制信息的获取来达到一定程度的隐私保护。而比特币交易中每笔转账都是公开的,则无法通过这种方式来进行隐私的保护了。但我们可以通过保持公钥的匿名性来保护隐私。即只有交易的时间和金额,却没有交易双方的身份信息。
1.货币是一连串的哈希值,会随着交易变得越来越长吗?
参考交易方法,前一交易和接收方的公钥以数字签名的方式重新添加到货币末尾,因此不会变长。
2.什么是满足0位需求的hash值?( the required zero bits. )
为了控制区块的创建速度,设置了一个目标值。一个有效区块的头部哈希值必须要满足目标条件(比如30个0开头)。目标值是一个以一串0开头的64位的字符串,开头的0越多难度越大,每新产生2016个区块之后目标值会调整一次。区块的头部有个随机数的字段,其实挖矿的过程也就是找到一个可以使区块头部哈希值小于目标值的随机数的过程,也叫做解迷。
3.工作量证明机制中nonce 和Tx是什么?
TX是交易,transaction。nounce是一个随机数,比特币新区快的本质就是寻找nounce,使其区块头的哈希满足一定条件。
4.转账广播并不需要覆盖所有的节点。只要该区块被一定数量的节点接受,它不久后就会被加入到区块链中。这是什么机制?
参考问题7,一般是矿工来挖矿,收听交易记录,记账。而工作量证明机制和算力机制又使得矿工不会成为攻击者。因为攻击网络需要的算力特别多,即便达到了那个算力,还不如作忠实用户挣的钱多。
5.分叉怎么办?
“最长链原则”来解决分叉。如果同时有两个或多个相同长度的链,则都保存起来等一下,等待矿工广播新的区块,总会有一个更长的链。
6.文中说比特币不会有通货膨胀问题,如果有人大范围收集比特币,只进不出,那市面上流通的比特币就少了。相应的物价就会下跌,然后此人在大范围收购市面上最有价值的商品,就会收获更多的财富。也是一个问题。
7.有效无效的转账指的是什么?
从发出交易到矿工打包需要几步? 当你发起一笔转账后,比特币通过怎样的流程才到达收款方呢?当你发起一笔比特币转账后,你需要将交易广播至全网,挖矿节点接到这笔交易后,先将其放入本地内存池进行一些基本验证,比如该笔交易花费的比特币是否是未被花费的交易。如果验证成功,则将其放入“未确认交易池”(Unconfirm Transaction),等待被打包;如果验证失败,则该交易会被标记为“无效交易”(Invalid Transaction),不会被打包。也就是说,挖矿节点在比拼算力的同时还需要及时验证每笔交易,更新自己的“未确认交易池”。节点抢到记账权后,将从“未确认交易池”中抽取约近千笔“未确认交易”进行打包。有时候我们的交易不能被及时打包,是因为“未确认交易池”中的交易笔数太多,而每个区块能记录的交易笔数有限,这时候就会造成区块拥堵。
另外,存在入不敷出状况,即支付的钱多于拥有的钱,或者签名不合法。
8.找到新区块后按照校验前一区块的方法怎么让别的节点认可?即合法性
区块版本号,表示本区块遵守的验证规则,遵循相应的版本来验证。
9.比特币一共有2100万个,挖完全部的区块之后是不是新的交易就没办法进行了?
10分钟出一个,要4000年才能全部出现。
10.接问题 2. 只要找到小于目标值的随机数就行的话会有很多吧?生成的区块不久不唯一了? 参考问题7
ps: 喜欢的话,记得点赞哦~~