首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

隔离见证交易的结构、规则、验证过程

上文讲到了隔离见证升级方案的曲折之路,今天主要讲一下原理。

首先聊一下隔离见证的交易结构。

我们需要清楚的是,对于那些没有升级为支持隔离见证的节点来说,他们在获取到隔离见证交易时是完全感知不到的,因为对于旧节点来说,交易结构并没有改变。

对于升级为支持隔离见证的节点来说,他们不仅能看到属于交易结构中的内容,并且还能看到这笔交易结构外部包含的一小块信息,这里的信息才是隔离见证的信息。信息里,包括了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)

在比特币交易上锁的几大锁定规则(补充)文章末尾,我们提到的还剩几个隔离见证交易类型,今天已全部讲解完毕。

关注【通俗易懂区块链】,学懂区块链

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180301G1J44E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券