比特币中的地址们

先决条件

一些必要的密码学知识,在非对称加密体系中,公钥和私钥的作用主要有两个,一个是加解密,一个是产生验证数字签名,要了解比特币地址的相关知识,就务必具备这些基础常识

  1. 公钥用于加密,私钥用于解密
  2. 私钥用于产生数字签名,公钥用于解锁(验证)数字签名

在比特币网络中,非对称加密采用的是椭圆曲线加密算法,其具体的算法内容参考这个链接

关于散列函数(哈希函数,Hash,hash,H)是一种单向函数,也就是说给定一个输入,会得到一个输出,但是从输出无法逆向得到输入,这个类比藏头诗,从一个完整的诗,可以推出藏头的信息,但是只有藏头的信息无法推出完整的诗。

此外关于隔离见证部分的介绍中,常常出现可锻性一词,这个词的意思如下:指金属材料在压力加工时,能改变形状而不产生裂纹的性能。隔离见证中借用了这个概念,即改变区块链的结构但不改变其性能(理论上)。

P2PKH(Pay to Public Key Hash)

比特币中,绝大多数交易都是支付到一个公钥的输出。由 P2PKH 脚本锁定的输出,通过出示公钥和相应的私钥产生的数字签名来进行解锁,从而可以花费这笔费用。

我们以一个例子来说明。A 向 B 支付一笔 P2PKH 的费用,其交易输出的格式如下:
OP_DUP OP_HASH160 <B Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG
其中 OP_DUP ,OP_HASH160 这些被称作操作码,关于更多的操作码以及它的含义可以点击这个链接

上述锁定脚本的解锁脚本的格式如下:
<B Signature> <B Public Key>

在验证的时候执行如下的操作:

<B Signature> <B Public Key> OP_DUP OP_HASH160
<B Public Key Hash> OP_EQUALVERIFY OP_CHECKSIG

这段脚本的具体含义可以参考这个链接,它用图示的方式很清楚的作出了解答。

P2SH(Pay to Script Hash)

P2SH 相比于 P2PKH 它支持了多重签名,这就让 P2SH 的支付逻辑更加的丰富,因为 P2PKH 是只能支持一个公钥匹配一个签名。

从多重签名开始

所谓多重签名其含义非常简单,有时候我们会在电影里看到这样的一个场景,有一个金库,金库的所有者有好三个人,为了使三个人形成相互的掣肘,三个人都不能单独打开这个金库,只有当三个人中的至少两个人在场时才能打开这个金库。在这个 2-of-3 的关系中,就是一个多重签名的逻辑。

所谓多重签名,即当存在 n 的公钥的时候,需要有 m 个签名与之匹配(n>m)。2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG看看这个多重签名条件的锁定脚本,即表示现在有三个公钥,只要要有两个签名与之匹配才能解锁脚本。其中 CHECKMULTISIG即是匹配操作符。

因此上面的脚本要被解锁,其格式应该如下,<Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG,但是因为历史原因,在代码层面的底层架构上存在一个 bug,这个 bug 要求解锁的参数个数计算错了,而比特币网络要改变共识又是几乎不可能的事情,所以实际的解锁脚本如下,0 <Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG通过 0 来代替那个误算的多的一个。

P2SH

可以看到前面的多重签名丰富了解锁脚本的场景,原来的 P2PKH 只能是一对一的场景,而多重签名支持将交易支付给一个 n-of-m 下的验证情景。

但是多重签名也有一个问题,请看下面,2 <Mohammed's Public Key> <Partner1 Public Key> <Partner2 Public Key> <Partner3 Public Key> <Attorney Public Key> 5 CHECKMULTISIG这个脚本中有 5 个公钥,而实际中,最多可以有 15 个公钥的上限,而往往大量的公钥中,作为 m 的部分的签名可能很少,这大大增加了交易空间的负担,而且比特币交易费也是通过脚本的长度来计算的,所以这也增加了更多的交易费。

于是 P2SH 地址出现了,它的作用很简单,就是将那个很长的公钥的部分进行 hash 加密,得到的脚本称为赎回脚本(redeem script),之所以称为赎回脚本是因为这个脚本不是锁定脚本的部分(锁定脚本是在上一个交易的输出部分,赎回脚本是在下一个交易的输入部分)。

我们以《精通比特币》中的例子为例,来构造一个 P2SH 地址
2 <Mohammed's Public Key> <Partner1 Public Key> <Partner2 Public Key> <Partner3 Public Key> <Attorney Public Key> 5 CHECKMULTISIG
这是一个多重签名的模型,而实际上它的脚本如下,
204C16B8698A9ABF84250A7C3EA7EEDEF9897D1C8C6ADF47F06CF73370D74DCCA01CDCA79DCC5C395D7EEC6984D83F1F50C900A24DD47F569FD4193AF5DE762C58704A2192968D8655D6A935BEAF2CA23E3FB87A3495E7AF308EDF08DAC3C1FCBFC2C75B4B0F4D0B1B70CD2423657738C0C2B1D5CE65C97D78D0E34224858008E8B49047E63248B75DB7379BE9CDA8CE5751D16485F431E46117B9D0C1837C9D5737812F393DA7D4420D7E1A9162F0279CFC10F1E8E8F3020DECDBC3C0DD389D99779650421D65CBD7149B255382ED7F78E946580657EE6FDA162A187543A9D85BAAA93A4AB3A8F044DADA618D087227440645ABE8A35DA8C5B73997AD343BE5C2AFD94A5043752580AFA1ECED3C68D446BCAB69AC0BA7DF50D56231BE0AABF1FDEEC78A6A45E394BA29A1EDF518C022DD618DA774D207D137AAB59E0B000EB7ED238F4D800 5 CHECKMULTISIG
可以看到非常的长,而我们就是要把这段脚本通过 SHA256+RIPEMD160 散列成 20 字节的加密散列取代。

而其得到的结果如下,
54c557e07dde5bb6cb791c7a540e0a4796f5e97e
可以看到结果大大缩小了。

总结一下吧,可以看到 P2SH 地址好处主要是两点,一个是更低的交易费,同时用户的公钥并没有被暴露出来(虽然公钥是可以被别人获取的,但是如无必要也不要随意散播你的公钥)。但 P2SH 不无缺点,那就是因为 P2SH 的地址总是以 3 开头,很容易在透明的区块链网络上被人知晓你这是一个支付给脚本的哈希。这就带来了安全性的问题,因为区块链交易网络中,最好的方式就是不要在任何时候暴露你的地址,因为通常每次使用不同的地址交易才符合安全性。

隔离见证

见证一次在比特币的语境中表示能够作为输入的解锁条件,验证 UTXO 的输出。其中数字签名就是一种“见证”,但是“见证”本身的范围更加宽泛,只要是能够证明你能使用这笔费用的方式都可以作为见证。见证说白了就是证明你可以使用这笔数据。

在隔离见证之前,交易的见证数据都是跟在每一个输入的交易脚本之中的,比如前面提到的用于验证的数字签名。而隔离见证将将用于解锁的字段单例出来,不和交易数据本身混在一起。为什么这么做呢?

我们知道比特币网络中,其实要解决的本质的问题无非就是不可能三角:去中心化,安全和性能(每一次升级只能最多满足其中的两点),隔离见证也是解决其中关于安全(匿名性)和性能的问题。不管是隔离见证的升级还是最近的 taproot 升级,其本质就是解决两个问题,一是让地址更加的匿名,无法从地址区分哪个是脚本支付,哪个是公钥支付。而是让交易数据尽可能的小,以便减少交易费。

所以回到刚才的问题,每一笔比特币的交易最核心的应该是交易本身的数据,而任何用于证明的数据,只是为了提供安全而附加上去的,把见证数据和交易本身分离开来,这是符合逻辑的,因为比特币的交易费是根据交易的数据的大小来确定的,而在把见证数据和交易数据隔离开之前,有时候见证数据(用于证明你可以使用这笔交易的证明)占了整个传输数据的 75%,这显示是主客颠倒的。

此外,隔离见证优化了签名算法的复杂度,将算法复杂度降低到常数级

隔离见证是软分叉

P2WPKH(Pay-to-Witness-Public-Key-Hash)

我们先来看看采用了隔离见证的 P2PKH(采用后称作 P2WPKH,W 就是 Witness,见证的意思)是怎么工作的。

同样这里借用《精通比特币》里面的数据,下面是原始的 P2PKH
DUP HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 EQUALVERIFY CHECKSIG
而采用了 P2WKH 的输出脚本是这样的,
0 ab68025513c3dbd2f7b92a94e0581f5d50f654e7
可以看到显著的缩短了长度,其中 0 表示版本好,ab… 就是见证的公钥的散列。

接下来看看解锁的条件,在原始的 P2PKH 中,解锁脚本是这样的,

[...]
“Vin” : [
"txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
"vout": 0,
     	 "scriptSig":<Bob’s scriptSig>”,
]
[...]

交易输入中包含了鲍勃的签名,用于验证确实这笔钱只有鲍勃能用。

而对于隔离见证的 P2PKH,输入脚本(解锁脚本)如下所示,

[...]
“Vin” : [
"txid": "0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2",
"vout": 0,
     	 "scriptSig": “”,
]
[...]
“witness”: “<Bob’s witness data>[...]

可以看到,scriptSig部分为空,而见证数据放在了一个交易输入外的,单独的字段,witness中。

对于隔离见证的 P2SH 来说,效果和上面类似,这里就不再赘述了。

隔离见证的问题

首先隔离见证在一定程度上并没有解决面临的安全问题,它只不过是补了一个坑而开启了一个新坑,因为从地址上观察,依旧可以轻易看出隔离见证的地址和普通地址长度的区别,同时地址开头的字母也“出卖了”地址的类别。

其次,隔离见证是软分叉,这导致很多社区成员并不赞同,甚至强烈反对隔离见证,他们认为隔离见证违背了中本聪的初心,于是最终导致了 btc 分裂出一部分为 bch。

参考

《精通比特币》
一文读懂隔离见证优势及工作原理
SegWit (Segregated Witness)
隔离见证有哪些缺陷
什么是比特币地址&三种地址格式对比 | CoinWallet讲堂
关于隔离见证的初学者指南
天了噜,竟然有大神用 5 分钟把隔离见证讲得这么清楚!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>