比特币深入:
- 独立验证:
产生的交易将被发送到比特币网络临近的节点, 在交易传递到临近的节点时,每一个收到交易的比特币节点将会先验证该交易,以确保只有有效的交易才会在网络中传播,而无效的交易将会在第一个节点处被废弃。
每一个节点在校验每一笔交易时,都需要对照一个长长的标准清单:
▷交易的语法和数据结构必须正确。
▷输入与输出列表都不能为空。
▷交易的字节大小是小于MAX_BLOCK_SIZE (1Mbyte)。
▷每一个输出值,以及总量,必须在规定值的范围内 (小于2,100万个币,大于0)。
▷没有哈希等于0,N(序号)等于-1的输入。
▷对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝(double spend)。
▷对于每一个输入,在主分支和交易池中寻找引用的输出交易。如果输出交易缺少任何一个输入,该交易将成为一个孤立的交易。如果与其匹配的交易还没有出现在池中,那么将被加入到孤立交易池中。
▷对于每一个输入,引用的输出是必须存在的,并且没有被花费。
▷每一个输入的解锁脚本必须能解开相应输出的锁定脚本。
……
- 采矿竞赛:
采矿节点时时监听传播到比特币网络的新区块,对于矿工们来说,获得一个新区块意味着某个参与者赢了,而他们则输了这场竞争。然而,一轮竞争的结束也代表着下一轮竞争的开始。
采矿节点验证此新区块,区块头哈希值是否小于难度目标,若是,则将此区块串入区块链中,结束目前采矿工作。
新一轮采矿开始,将交易池中交易依优先级纳入候选区块中,加上创币区块,求得Merkle根值,将父区块哈希值、新难度目标、时间戳、及Merkle根值等放入此区块头中,形成完整的候选区块。改变候选区块头的4byte nonce值使区块头哈希值小于难度目标。同时继续接收新交易,验证后将交易纳入交易池中。
若算出小于难度目标的Hash,即采矿成功,则将此成功候选区块加入区块链并广播到比特币网络,结束此回合采矿。若收到比特币网络传送来新区块,表示输了,结束此回合采矿。无限循环。
难度目标:
- 难度目标在区块头中以“尾数-指数”的格式编码并存储,这种编码的首字节表示指数,后面的3字节表示尾数(系数)。
- 例如:难度目标值 0x1903a30c
0x19是指数的十六进制格式,后半部0x03a30c是系数。
难度目标值 系数* 2^(8 * (指数– 3))= 0x03a30c * 2^(0x08 * (0x19 -0x03)) = 238,348*2^176
=22,829,202,948,393,929,850,749,706,076,701,368,331,072,452,018,388,575,715,328
转化为十六进制后为:难度目标值 = 0x0000000000000003A30C00000000000000000000000000000000000000000000
这个数字