上文讲到了隔离见证升级方案的曲折之路,今天主要讲一下原理。
首先聊一下隔离见证的交易结构。
我们需要清楚的是,对于那些没有升级为支持隔离见证的节点来说,他们在获取到隔离见证交易时是完全感知不到的,因为对于旧节点来说,交易结构并没有改变。
对于升级为支持隔离见证的节点来说,他们不仅能看到属于交易结构中的内容,并且还能看到这笔交易结构外部包含的一小块信息,这里的信息才是隔离见证的信息。信息里,包括了marker、flag、witness三个部分。
marker和flag都是标记,marker要求必须是1个字节的0,即0x00,flag要求必须是1字节的非0值,目前是0x01。
witness就是隔离见证(SegWit)中的见证(Wit)。即,对交易签名。
我们在比特币交易上锁的几大锁定规则文章中提到过,目前比特币的交易类型。文章提到的有:P2PKH、P2SH等等。不同的交易类型,对应着不同的隔离见证的方案。
我们先看P2PKH交易类型的交易,如果用了隔离见证,是什么样子的:
witness:
scriptSig: (empty)
scriptPubKey: 0
我们可以看到,witness部分,存放的是之前解锁工具里的东西。scriptSig是指原交易结构中的解锁工具,隔离见证的交易里,此处置空。scriptPubKey是指那把锁,也就是锁定脚本,包含两个部分,一个是0,另一个是20个字节的加密数据。
0的意思,是指隔离见证交易的版本号是0。未来可能会支持其它版本的交易。
很明显,我们能看出来,原交易结构中的解锁脚本置空,将本来存放于解锁脚本里的内容放入了witness中存储。
这样的话,当未升级的节点在进行验证时,发现解锁脚本中竟然是空的,并且锁定脚本也没有什么CHECK相关的操作,那么旧节点会认为这个地址里的币谁都可以花,但并不符合标准的交易类型,于是对于这种交易来说,他会拒绝, 对于包含这种交易的区块来说,会验证通过。(复杂的比特币升级分析(4)里讲过为什么对交易拒绝,对区块接受)
对于升级了的节点,首先要验证锁定脚本里开头是不是0,如果是0,判断后面的是不是20个字节。如果是,再去用witness里的公钥经过HASH160加密后与锁定脚本中的20字节数据对比是否一致。如果一致,再用witness中的私钥签名与公钥通过CHECKSIG操作进行验证,是否会返回TRUE。
我们把采用P2PKH交易类型的隔离见证交易称为P2WPKH,即pay-to-witness-public-key-hash。
我们把采用P2SH交易类型的隔离见证交易称为P2WSH,即pay-to-witness-script-hash。
对于P2WSH交易类型的交易,是什么样子的:
witness: 0
2 CHECKMULTISIG>
scriptSig: (empty)
scriptPubKey: 0
我们可以看到,witness部分就是原先解锁脚本的内容。scriptSig就是原交易结构中的需要存储解锁脚本的地方,此处置空。scriptPubKey是上笔收币地址的锁,也就是锁定脚本。
锁定脚本中的0,与P2WPKH类型里锁定脚本的0的意思是一样的,是指隔离见证交易的版本号是0。未来可能会支持其它版本的交易。
旧节点验证过程同P2WPKH。
对于新节点,在验证P2WSH交易类型的交易时,需要用witness里的多个公钥,进行SHA256加密,得到的结果与锁定脚本中的32个字节数据比对是否一致。然后再用witness里的签名与公钥,通过CHECKMULTISIG操作码去验证签名是否正确,如果返回TRUE,则代表没错。
这里需要提到的是,如果锁定脚本中,隔离见证版本号不是0,那么代表这个隔离见证交易的版本不是目前定义过的,于是会拒绝这样的交易。(unknown)
在比特币交易上锁的几大锁定规则(补充)文章末尾,我们提到的还剩几个隔离见证交易类型,今天已全部讲解完毕。
关注【通俗易懂区块链】,学懂区块链
领取专属 10元无门槛券
私享最新 技术干货