比特币的基础架构:区块链
科普一下比特币的区块链是什么,老手们可以直接跳过这一部分了。这里说的比特币,是2017年8月以前的比特币,后来分为了 有隔离见证的BTC 和没有隔离见证的 BCH 两条链。下面会有不少看起来很专业的东西,不过请放心,我不是专业的程序员,不会讲太深的。稍微理解一点比特币的架构和转账的方法,对理解隔离见证的骗局很有帮助。比特币链条大概是长这个样子:
上图我们可以看到几个区块(Block),可以看到每个区块都有两个部分:一部分是虚线画出来的 Prev.block 指向上一个区块,这部分我们叫它“区块头”,另外一部分是“区块主体” Transaction,即这个区块里交易的信息。由于每个区块头都指向上一个区块的头,所以这个系统我们叫他区块链。再详细点看这个区块头:
上图我们可以看到3个区块(Block),可以看到每个区块头里都有4个信息。其中 Nonce 就是矿机去搜寻的数,这个数很难找所以要用很快的矿机烧很多电费,谁先找来一个 Nonce,能让这4个信息合起来的 Hash 结果符合一定的条件,谁就可以发布这个区块,并拿区块奖励12.5个币。Prev-Hash 是上一个区块的这4个信息合起来的Hash 结果,Timestamp 是目前的时间,有这两个的限制,矿工至少要收到上一个区块的区块头,才能开始挖下一个区块。Tx_Root 是这个区块的主体里所有交易的Merkle Root,如果有任何一个交易被改变,这个 Tx_Root 就会有变化。 如此,比特币的区块形成了一条不能被更改的链:加入这个 Block11里面的 Tx1被改变了,那他上面的 Hash1就会变,Tx_Root 也就变了,这样 Block11的4个信息合起来的 Hash 结果会不一样,就和 Block12的 Prev_Hash 断开了,Block12就无效,以此类推。
支付脚本
区块链里的交易,大概可以理解为是 “A 地址转给 B 地址 xx 个币”,“B 地址转给 C 地址 xx 个币”这样的信息。如果 C地址收到了 xx 个币,但没有往外转,那这就会在 UTXO 数据库里记一条:“C 地址还有 xx 币没花掉”。假如 C 地址是普通的1打头的比特币地址,要花掉这笔钱,就需要用到一个脚本,这个脚本是“B 地址转给 C 地址 xx 个币”时规定的,定了这笔钱要怎么才能被C 地址花掉。一般这个脚本是这样的两部分
- scriptPubKey部分: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
- scriptSig部分: <sig> <pubKey>
不会编程的朋友请不要害怕,不难看懂的。scriptPubKey部分有几个“操作码”,是 OP 打头的,表示几种操作。<pubKeyHash>就是比特币地址的中间部分,不带开头的版本号1和末尾的几位校验码,这部分是对公钥进行 Hash 的结果。scriptSig部分要由想转账的这个人提供,公钥<pubKey>,和用私钥对这笔交易的签名<sig>。由私钥可以推导出公钥,公钥可以推导出比特币的地址,这两个步骤都不能反推(在当今科技下)。如果一个人可以展示私钥对这笔交易的签名,又可以提供这个地址的公钥,那我们就相信这笔转账是他授权的,别人伪造不了。矿池收到了提供的交易,和交易的签名,要怎么验证呢?就是运行一遍上面的脚本,看看结果是不是“True”。如果结果是 True 那就算通过了。首先要把scriptSig里的东西“堆”起来,形成一个“堆栈”:
<pubKey>
<sig>
然后,就一个一个地执行scriptPubKey部分。先是一个 OP_DUP,这个是复制操作,这些操作都是对着堆栈的顶部操作。所以复制操作后堆栈变成了:
<pubKey>
<pubKey>
<sig>
然后是一