Hello , 我是09

此篇内容为我2018~2020年在【库神】工作时,对部分重要知识做的学习总结

随着比特币冲破10万美金,行业又再次兴起,希望相关从业者可以学习到你需要的内容

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

Image-xkvj.png

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

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

Image-lskl.png

解锁脚本中:

<sig>: 签名数据

<PubK>:PublicKey公钥

Image-kcvu.png

Image-lysi.png

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

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。

P2PKH被创建的主要目的为使比特币地址更简短,使之更方便使用,核心内容还是P2PK。

MS(Multiple Signatures)多重签名

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

M <Public Key 1> <Public Key 2> ... <Public Key N> N OP_CHECKMULTISIG

M是要求激活交易的最少公钥数,N是存档公钥总数。如下如果公钥总数为3,激活交易最少需要为2,那么锁定脚本为以下数据:

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

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

对锁定脚本,采用Hash160算法能够。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的特点是,将制作脚本的责任给了接收方,好处是可以暂缓节点存储的压力。

P2WSH、P2PKH后续有时间继续补充