比特币是什么东西:一笔旧交易为何牵动之后所有区块
比特币是什么东西?从数据结构看,它是一种去中心化的加密货币,也是一条由区块首尾相连组成的公开账本。读者问“为什么改动一笔历史交易就必须改动它之后的所有区块”,答案就藏在两个哈希里:记录该交易的区块头中的默克尔根,以及每个区块头中保存的前一区块头哈希。前者把交易锁进本区块,后者把本区块锁进整条链。
先看交易如何进入区块头。一个区块把一批新交易放进交易数据部分;每笔交易经过哈希得到摘要,这些摘要两两配对再哈希,逐层向上,直到只剩一个哈希,即默克尔根(merkle root)。默克尔根被写入区块头。区块头体量很小,却通过这棵哈希树代表区块内全部交易。按比特币开发者文档“Block Chain”概览页的口径,这一机制的作用是:交易不能被修改,除非同时修改记录它的区块以及之后的所有区块。
按哈希原理推演,关键在于哈希的单向性:输入稍变,输出即变,且无法从输出反推输入。假设某个历史区块中有一笔交易被改动,它的交易哈希就会变,沿默克尔树一路上推,该区块的默克尔根必然改变。默克尔根在区块头里,区块头哈希随之改变。而下一个区块头保存着“前一区块头哈希”,这个指针立刻对不上;再下一个区块又保存着被改动后的区块头哈希,于是不匹配沿链向后传递。要让整条链重新自洽,只能把该区块之后的所有区块逐一重算。这正是“改动一笔历史交易就必须改动它之后所有区块”的机制来源。
这里还需区分两层锁定。默克尔根把交易集合锁进单个区块头,解决“块内交易是否被换掉”;前一区块头哈希把区块锁进链条,解决“块与块顺序是否被换掉”。二者叠加,才形成链式防篡改。文档同时指出,交易之间也彼此衔接:每笔交易花费的是早前交易的输出,输出与交易标识符(TXID)绑定,同一输出在链上只能作为输入使用一次,否则即构成双重支付。因此历史交易不仅被哈希结构固定,也被后续花费关系牵住。
适用条件要说清楚:上述结论针对完整节点按共识规则验证并接受的区块数据。每个完整节点独立保存经自己验证的区块链;当多个节点持有相同区块时,才处于共识。改动历史区块意味着与全网多数节点保存的链不一致,除非其后所有区块被相应重算并与网络共识一致,否则不会被接受。这是数据结构与共识规则共同作用的结果,而非某个软件界面的显示效果。
回到最初的问题:比特币是什么东西?它是一份有序、带时间戳的交易记录,用默克尔根把交易锁进区块头,用前一区块头哈希把区块串成链。一笔旧交易被改动,哈希不匹配便逐块向后传导,所以必须改动它之后的所有区块——这就是链式结构给出的答案。