在所有普通的交易中,由于发币人不同、收币人不同,交易额不同,不会有完全一样的交易。
但在创币交易中,创币交易只包含序列号、创币签名、收币地址、收币金额。创币签名即coinbase,是矿工随便填写的。序列号也是一样的。那么,如果矿工的收币地址没变,收币金额也没变,并且coinbase的内容也是相同的话,那么不同区块的两笔创币交易所包含的内容将会完全一致。
由于交易id是由交易内容经过哈希加密生成的,那么如果内容完全一致,在生成交易的id时,这两笔交易的id将完全一样。也即,这两笔内容完全一样。
有人会问,交易内容一样没关系吧?毕竟收币地址收到这两次交易的币了。
实际上,假设同一个地址A在不同时间收到了10币、20币,来自交易A和交易B,在下一次用此地址发起交易时,矿工是需要追溯收币的那些交易的,假设发起者准备发送30个币,此时追溯到了交易A和交易B,由于这两笔交易是不同的交易信息,所以地址A在交易A中的10个币可以花费出去、地址A在交易B中的20个币也可以花费出去。
实际上,区块链中并不是记录了地址A总共存储了30个币,而是,地址A可以追溯到交易A和交易B,地址A在交易A中记录了10个币,地址A在交易B中记录了20个币。
当持币者花费他的币时,系统需要通过地址找到此地址作为收币地址时的那笔交易的交易id,将前一笔交易的id记录在即将花费的交易中,比特币机制是根据前一笔交易是否被包含在现有的交易中来判断那笔交易是否被花费掉。
所以,当两笔一模一样的交易先后生成后(假设是交易a和交易b,a和b包含的信息是一模一样的,唯一的区别是被包含的区块不同。假设a和b分别给收币地址a发送了50个比特币),系统没办法区分这个收币地址所对应的前后两笔交易,因为交易id都是一模一样的。
这就导致了持币者想用此地址发起50个比特币的交易时,系统由于只根据交易id追溯,虽然追溯到了交易a和b,但因为b跟a的id是一样的,系统会认为这是同一笔交易,于是在持笔者发起交易后,交易a的收币地址被标明被花费掉,同时,交易b中的收币地址的币也会被同时被标明被花费掉,也就是说,作为挖矿的矿工,白白损失掉了50个比特币,对于收币者来说,他并没有多收到50个币,也就是说,相同交易使得其中的50个币凭空消失了。
e3bf3d07d4b0375638d5f1db5255fe07ba2c4cb067cd81b84ee974b6585fb468
这笔交易在不同区块时被创建,但是交易的coinbase相同,收币方相同,交易id完全相同。这就导致了矿工亏了50个比特币。
如果当你看完这篇文章,仍有不懂的地方,请在下方留言,我会尽量解答你的困惑。
关注【通俗易懂区块链】,学懂区块链
领取专属 10元无门槛券
私享最新 技术干货