原文参考:https://blog.csdn.net/jerry81333/article/details/56824166
详细步骤:
由上图可以看出,第一步是私钥,经过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的锁定脚本与解锁脚本:
可以看出,主要验证两个验证,第一是Public Key是否能够转换成正确的地址,第二是Signature是否正确,也就是证明你是否是这个Public Key的主人。
Signature签名:
签名内容主要是此交易摘要(也就是交易信息的Hash)与私钥进行运算。验证的话,将签名与公钥进行运算,如果能正确的得到交易摘要,则成功。
P2PK(Pay-to-Public-Key)
P2PK锁定版脚本形式如下:
[html] view plain copy
用于解锁的脚本是一个简单签名:
[html] view plain copy
经由交易验证软件确认的组合脚本为:
[html] view plain copy
根据上方的规则去运行就可以发现,此规则比P2PKH要简单的多,只有一步验证,少了上方的地址验证。其实,P2PKH被创建主要目的一方面为使比特币地址更简短,使之更方便使用,核心内容还是P2PK的。
MS(Multiple Signatures)多重签名
通用的M-N多重签名锁定脚本形式为:
[html] view plain copy
M
其中,N是存档公钥总数,M是要求激活交易的最少公钥数。
例如,2-3多重签名条件:
[html] view plain copy
2
上述锁定脚本可由含有签名和公钥的脚本予以解锁:
[html] view plain copy
OP_0
OP_0为占位符,没啥实际意义。
两个脚本组合将形成一个验证脚本:
[html] view plain copy
OP_0
P2SH(Pay-to-Script-Hash)
P2SH是MS多重签名的简化版本,如果使用P2SH进行和上方相同的2-3多重签名条件,步骤如下:
锁定脚本:
[html] view plain copy
2
对锁定脚本,首先采用SHA256哈希算法,随后对其运用RIPEMD160算法。20字节的脚本为:
[html] view plain copy
8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731
于是锁定脚本变为:
[html] view plain copy
OP_HASH160 8ac1d7a2fa204a16dc984fa81cfdf86a2a4e1731 OP_EQUAL
此锁定脚本要比原先使用MS的锁定脚本要简短的多,当接收方要使用此交易中的UTXO时,需要提交解锁脚本(这里又可称为赎回脚本):
[html] view plain copy
与锁定脚本相结合:
[html] view plain copy
使用逆波兰表达式运算,就能很明显的得知,验证过程分两步,首先验证的是接收方附上的赎回脚本是否符合发送方的锁定脚本,如果是,便执行该脚本,进行多重签名的验证。
P2SH的特点是,将制作脚本的责任给了接收方,好处是可以暂缓节点存储的压力。