比特币 区块链 几种交易标准详解 P2PKH、P2PK、MS、P2SH加密方式 - Go语言中文社区

比特币 区块链 几种交易标准详解 P2PKH、P2PK、MS、P2SH加密方式


快速术语检索

以下文中会可能会用到,以及看此文前可能会需要理解的几个术语。

地址

比特币地址(例如:1DSrfJdB2AnWaFNgSbv3MZC2m74996JafV)由一串字符和数字组成,以阿拉伯数字“1”开头。就像别人向你的email地址发送电子邮件一样,他可以通过你的比特币地址向你发送比特币。

比特币

“比特币”既可以指这种虚拟货币单位,也指比特币网络或者网络节点使用的比特币软件。

区块

一个区块就是若干交易数据的集合,它会被标记上时间戳和之前一个区块的独特标记。区块头经过哈希运算后会生成一份工作量证明,从而验证区块中的交易。有效的区块经过全网络的共识后会被追加到主区块链中。

区块链

区块链是一串通过验证的区块,当中的每一个区块都与上一个相连,一直连到创世区块。

哈希

二进制数据的一种数字指纹。(比特币中大部分使用的是SHA256)

网络

比特币网络是一个由若干节点组成的用以广播交易信息和数据区块的P2P网络。

私钥

用来解锁对应(钱包)地址的一串字符,例如5J76sF8L5jTtzE96r66Sf8cka9y44wdpJjMwCxR3tzLh3ibVPxh。

交易

简单地说,交易指把比特币从一个地址转到另一个地址。更准确地说,一笔“交易”指一个经过签名运算的,表达价值转移的数据结构。每一笔“交易”都经过比特币网络传输,由矿工节点收集并封包至区块中,永久保存在区块链某处。


私钥、公钥、地址

聊到交易,不得不先提下这三样东西。私钥运算可以产生公钥,公钥运算可以产生地址(又可成为Public Key Hash,公钥哈希),并且其中的运算虽然开源但是都不可逆。

详细步骤:


由上图可以看出,第一步是私钥,经过ECDSA,也就是椭圆曲线算法得到公钥,然后公钥要经过数个步骤到第9步,才能得到比特币交易中的地址。很明显,大部分人会有疑问,6,7步SHA256为什么要执行两次,原因是这张图做的不够直观,具体可以看下图:

可以说,地址就是公钥经过SHA256+RIPEMD160之后的产物,原先6,7步的SHA256只是为了在末尾添加校验码。因为SHA256+RIPEMD160都是作用在二进制层面的,最后使用BASE58还原为易于人所能识别的钱包地址。因此,地址有可以称为公钥哈希。


交易标准

为了让所有节点都能识别交易,因此将交易信息标准化是必不可少的,比特币的区块链社区主要支持以下五种交易标准:P2PKH、P2PK、MS(限15个密钥)、P2SH和OP_Return。OP_Return将不会介绍,因为其存储的是信息(或者说只是字节),并非比特币货币。

比特币脚本语言:

可以理解为类HTML的语言,所有的节点都能理解,并且按照步骤进行编译。而在交易过程中,发送方会将自己的UTXO(字符串,在比特币区块链中能代表一定数额的比特币,使得比特币可以追踪)使用锁定脚本进行锁定,锁定在接收方的地址上(也就是表示只有证明自己是接收方,才能够使用)。接收方如果要使用,必须使用解锁脚本,证明自己是这个地址的主人,各个节点才认可这笔交易。

在比特币社区使用的脚本语言,是一种基于逆波兰表示法的基于堆栈的执行语言。如下图:

P2PKH(Pay-to-Public-Key-Hash):

现在的比特币网络上,大部分交易都是以P2PKH的方式进行的,以下是P2PKH的锁定脚本与解锁脚本:


<sig>表示签名,<PubK>表示Public Key,具体操作步骤如下:

可以看出,主要验证两个验证,第一是Public Key是否能够转换成正确的地址,第二是Signature是否正确,也就是证明你是否是这个Public Key的主人。

Signature签名:

签名内容主要是此交易摘要(也就是交易信息的Hash)与私钥进行运算。验证的话,将签名与公钥进行运算,如果能正确的得到交易摘要,则成功。


P2PK(Pay-to-Public-Key)

P2PK锁定版脚本形式如下:

<Public Key A> OP_CHECKSIG
用于解锁的脚本是一个简单签名:

<Signature from Private Key A>
经由交易验证软件确认的组合脚本为:

<Signature from Private Key A> <Public Key A> OP_CHECKSIG
根据上方的规则去运行就可以发现,此规则比P2PKH要简单的多,只有一步验证,少了上方的地址验证。其实,P2PKH被创建主要目的一方面为使比特币地址更简短,使之更方便使用,核心内容还是P2PK的。


MS(Multiple Signatures)多重签名

通用的M-N多重签名锁定脚本形式为:

M <Public Key 1> <Public Key 2> ... <Public Key N> N OP_CHECKMULTISIG
其中,N是存档公钥总数,M是要求激活交易的最少公钥数。

例如,2-3多重签名条件:

2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG

上述锁定脚本可由含有签名和公钥的脚本予以解锁:

OP_0 <Signature B> <Signature C>
OP_0为占位符,没啥实际意义。

两个脚本组合将形成一个验证脚本:

OP_0 <Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG


P2SH(Pay-to-Script-Hash)

P2SH是MS多重签名的简化版本,如果使用P2SH进行和上方相同的2-3多重签名条件,步骤如下:

锁定脚本:

2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
对锁定脚本,首先采用SHA256哈希算法,随后对其运用RIPEMD160算法。20字节的脚本为:

8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731
于是锁定脚本变为:

OP_HASH160 8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731 OP_EQUAL

此锁定脚本要比原先使用MS的锁定脚本要简短的多,当接收方要使用此交易中的UTXO时,需要提交解锁脚本(这里又可称为赎回脚本):

<Sig1> <Sig2> <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG>
与锁定脚本相结合:

<Sig1> <Sig2> <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731 OP_EQUAL
使用逆波兰表达式运算,就能很明显的得知,验证过程分两步,首先验证的是接收方附上的赎回脚本是否符合发送方的锁定脚本,如果是,便执行该脚本,进行多重签名的验证。

P2SH的特点是,将制作脚本的责任给了接收方,好处是可以暂缓节点存储的压力。




版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jerry81333/article/details/56824166
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-04 17:13:26
  • 阅读 ( 2674 )
  • 分类:区块链

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢