这里主要用于补充区块链重要基础知识7——比特币的运行机制中标准协议P2SH的说明
五大标准脚本分别为P2PKH、P2PK、MS(限15个密钥)、P2SH和OP_Return。

这里主要介绍P2PKH、P2SH,因为这两个比较常见。

1.P2PKH

Alice向Bob咖啡馆支付的案例。Alice下达了向Bob咖啡馆的比特币地址支付0.015比特币的支付指令,该笔交易的输出内容为以下形式的

1.1 锁定脚本(用堆栈实现hash值的对比):

O P _ D U P O P _ H A S H 160 < C a f e P u b l i c K e y H a s h > O P _ E Q U A L O P _ C H E C K S I G OP\_DUP \space OP\_HASH160 \space <Cafe \space Public \space Key \space Hash> \space OP\_EQUAL \space OP\_CHECKSIG OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSIG
Cafe Public Key Hash即为咖啡馆的比特币地址,但这个地址不是基于 B a s e 58 C h e c k Base58Check Base58Check编码的,是十六进制

1.2 锁定脚本的解锁版脚本是:

< C a f e S i g n a t u r e > < C a f e P u b l i c K e y > <Cafe \space Signature> \space <Cafe \space Public \space Key> <Cafe Signature> <Cafe Public Key>

1.3 判断

只有当解锁版脚本与锁定版脚本的设定条件相匹配时,执行组合有效脚本时才会显示结果为真(Ture)

也就是只有当解锁脚本得到了咖啡馆的有效签名,交易执行结果才会被通过(结果为真),该有效签名是从与公钥哈希相匹配的咖啡馆的私钥中所获取的。

1.4 图示

指令 指令词源 16进制字节码 功能说明
O P _ D U P OP\_DUP OP_DUP duplicate 0x76 复制栈顶元素
O P _ H A S H 160 OP\_HASH160 OP_HASH160 hash 0xa9 弹出栈顶元素,先进行SHA-256哈希,再进行RipeMD160哈希处理,将结果压入栈。
O P _ E Q U A L V E R I F Y OP\_EQUALVERIFY OP_EQUALVERIFY equal verify 0x88 弹出栈顶两个元素,如果两个内容一致,则返回1,脚本继续执行。否则返回0,脚本中断执行。
O P _ C H E C K S I G OP\_CHECKSIG OP_CHECKSIG check signature 0xac 弹出栈顶两个元素,用公钥检查输入中的签名,验证该签名是否拥有该公钥的用户用其私钥签署的。如果签名符合,则将true(true = 1) 压入栈顶。
O P _ C H E C K M U L T I S I G OP\_CHECKMULTISIG OP_CHECKMULTISIG check multiple signature 0xae 用多个公钥检查多重签名的正确性。
O P _ R E T U R N OP\_RETURN OP_RETURN return 0x6a 标记交易无效
O P _ P U S H OP\_PUSH OP_PUSH 下面多少个字节要被压入堆栈
O P _ T R U R / O P _ 1 OP\_TRUR/OP\_1 OP_TRUR/OP_1 数字1被压入堆栈
O P _ F A L S E / O P _ 1 OP\_FALSE/OP\_1 OP_FALSE/OP_1 一个字节空串被压入堆栈


2.P2SH

对应有锁定脚本与赎回脚本,这就是我们经常称它为赎回脚本的原因,其实就是hash匹配之后将原本的hash之前的值拿回来

2.1 最初的多重签名:

顾客的任何支付都需要至少两个签名才能解锁,一个来自Mohammed,另一个来自其合伙人或拥有备份钥匙的代理人。这样的多重签名机制能为公司治理提供管控便利,同时也能有效防范盗窃、挪用和遗失。带来的问题就是脚本特别长。
2 < M o h a m m e d ′ s P u b l i c K e y > < P a r t n e r 1 P u b l i c K e y > < P a r t n e r 2 P u b l i c K e y > < P a r t n e r 3 P u b l i c K e y > < A t t o r n e y P u b l i c K e y > 5 O P _ C H E C K M U L T I S I G \begin{array}{l} {\rm{2 < Mohammed's \space Public Key > < Partner1 \space Public Key > < Partner2 \space Public Key > }}\\ {\rm{ < Partner3 \space Public Key > < Attorney \space Public Key > 5 \space OP\_CHECKMULTISIG}} \end{array} 2<Mohammed′s PublicKey><Partner1 PublicKey><Partner2 PublicKey><Partner3 PublicKey><Attorney PublicKey>5 OP_CHECKMULTISIG​
虽然多重签名十分强大,但其使用起来还是多有不便。多重签名导致过长的公钥,使得脚本也不断增加长度,那么一个长的交易脚本将一直记录在所有节点的随机存储器的UTXO集中1直到该笔资金被使用。所有这些都使得在实际交易中采用复杂输出脚本显得困难重重。

a.付款前必须发送给
b.产生的脚本过长,保存在UXTO中
b.产生的脚本过长,保存在UXTO中
多重签名
每一位客户
1.使用产生脚本的比特币钱包软件
2.利用脚本来完成交易
3.多重签名组合导致过长的公钥
导致复杂脚本输出处理困难

2.2 P2SH

P2SH就是为了解决这一难题而诞生,同时它所使用得方法思想也一直在影响我们对签名认证的处理,当一个签名过程时,我们都会试图通过对其进行hash处理,

在P2SH交易中,锁定脚本由哈希取代,哈希指代的是赎回脚本。因为它在系统中是在赎回时出现而不是以锁定脚本模式出现。

2.2.1 使用P2SH与不使用对比

  1. 不含P2SH的复杂脚本

    Locking Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
    Unlocking Script Sig1 Sig2
  2. P2SH的复杂脚本

    Redeem Script 2 PubKey1 PubKey2 PubKey3 PubKey4 PubKey5 5 OP_CHECKMULTISIG
    Locking Script OP_HASH160 <20-byte hash of redeem script> OP_EQUAL
    Unlocking Script Sig1 Sig2 redeem script

2.2.2 脚本支付

1. 锁定脚本

一笔P2SH交易运用锁定脚本将输出与哈希关联,而不是与前面特别长的脚本所关联。使用的锁定脚本为:

O P _ H A S H 160 54 c 557 e 07 d d e 5 b b 6 c b 791 c 7 a 540 e 0 a 4796 f 5 e 97 e O P _ E Q U A L OP\_HASH160 \space 54c557e07dde5bb6cb791c7a540e0a4796f5e97e \space OP\_EQUAL OP_HASH160 54c557e07dde5bb6cb791c7a540e0a4796f5e97e OP_EQUAL

这个P2SH等同于“向含该哈希的脚本支付”

2. 支付过程

顾客在向Mohammed公司支付时,只需在其支付指令中纳入这个非常简短的锁定脚本即可。当Mohammed想要花费这笔UTXO时,附上原始赎回脚本(与UTXO锁定的哈希)和必要的解锁签名即可

指令中纳入简短的锁定脚本
原始赎回脚本hash+必要解锁签名
顾客
Mohammed公司支付
花费顾客所给的交易

如:

< S i g 1 > < S i g 2 > < 2 P K 1 P K 2 P K 3 P K 4 P K 5 5 O P _ C H E C K M U L T I S I G > <Sig1> <Sig2> <2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG> <Sig1><Sig2><2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG>

两个脚本经由两步实现组合:

  1. 将赎回脚本与锁定脚本比对以确认其与哈希是否匹配——进行hash匹配: < 2 P K 1 P K 2 P K 3 P K 4 P K 5 5 O P _ C H E C K M U L T I S I G > O P _ H A S H 160 < r e d e e m s c r i p t H a s h > O P _ E Q U A L <2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG> \space OP\_HASH160 \space <redeem \space scriptHash> OP\_EQUAL <2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG> OP_HASH160 <redeem scriptHash>OP_EQUAL
  2. 假如赎回脚本与哈希匹配,解锁脚本会被执行以释放赎回脚本——匹配好了之后,释放赎回脚本,将公钥信息放出来: < S i g 1 > < S i g 2 > 2 P K 1 P K 2 P K 3 P K 4 P K 5 5 O P _ C H E C K M U L T I S I G <Sig1> \space <Sig2> \space 2 \space PK1 \space PK2 \space PK3 \space PK4 \space PK5 \space 5 \space OP\_CHECKMULTISIG <Sig1> <Sig2> 2 PK1 PK2 PK3 PK4 PK5 5 OP_CHECKMULTISIG

3. 与比特币地址一样同样的优势——hash编译为地址

P2SH的另一重要特征是它能将脚本哈希编译为一个地址,Mohammed可以将该地址发送给他的客户,这些客户可以采用任何的比特币钱包实现简单支付,就像这是一个比特币地址一样。只是这里的地址能够对应到一组公钥也就是一个脚本

4. 优点

  1. 在交易输出中,复杂脚本由简短电子指纹取代,使得交易代码变短(那么对比时间就会大大减少,只是传输时间不变而已,因为确认之后依旧要传输公钥信息等)。
  2. 脚本能被编译为地址,支付指令的发出者和支付者的比特币钱包不需要复杂工序就可以执行P2SH。
  3. P2SH将构建脚本的重担转移至接收方,而非发送方。
  4. P2SH将长脚本数据存储的==负担从输出方(存储于UTXO集,影响内存)转移至输入方(仅存储于区块链)==。
  5. P2SH将长脚本数据存储的重担从当前**(支付时)转移至未来(花费时)**。
  6. P2SH将长脚本的交易费成本从发送方转移至接收方,接收方在使用该笔资金时必须含有赎回脚本

参考文章:

1.UTXO交易模型

2.精通比特币.第五章.第七节


  1. (Unspent Transaction Outputs)是未花费的交易输出,它是比特币交易生成及验证的一个核心概念。交易构成了一组链式结构,所有合法的比特币交易都可以追溯到前向一个或多个交易的输出,这些链条的源头都是挖矿奖励,末尾则是当前未花费的交易输出。 ↩︎

区块链重要基础知识7-1——标准脚本P2PKH、P2SH相关推荐

  1. 密码学系列(三):区块链+密码学基础知识

    密码学系列(三):区块链+密码学基础知识 一.区块链的概念 区块链概述 区块链的特点 区块链变化 市场现状 二.区块链政策与标准 区块链的特点与发展 三.区块链的定义 区块链的价值 四.区块链开发语言 ...

  2. 区块链/比特币基础知识

    [三分钟讲清区块链/比特币]之一:区块链入门教程 [三分钟讲清区块链/比特币]之二:比特币入门教程 [三分钟讲清区块链/比特币]之三:加密货币的本质

  3. 区块链重要基础知识6——匿名性以及如何去中心化

    1. 匿名性 1.1 化名与匿名之间的区别 化名:在交易的时候不使用真实的姓名 匿名:或者在交易的时候完全不使用任何名字. 在计算机中的定义,匿名指的是具有无关联性(unlinkability)的化名 ...

  4. BlockChain:区块链技术基础概念综合理解——个人总结

    BlockChain:区块链技术基础概念综合理解--个人总结 目录 区块链的进阶与意义 1.区块链技术的进阶 2.区块链技术三大意义-传递价值.建立可信用环境.提高效率和降低成本 1.传递价值 2.建 ...

  5. 区块链技术相关知识笔记

    区块链是一种源自比特币基础技术的新型技术系统.其最初的定义是一种分布式账本, 而账本是由分布式系统的每个节点共享的.每个节点运作方式是将一段时间内接收的事务数据和代码采用特殊的散列算法和 Merkle ...

  6. cmmi实践访谈测试ppt_CMMI模型基础知识考试试题-(标准答案).xls

    CMMI模型基础知识考试试题-(标准答案).xls CMMICMMI模模型型基基础础知知识识考考试试题题 姓姓名名 部部门门 题号 题分题目选项 标准 答案 12 CMMI是 是一种过程改进方法 为组 ...

  7. 基于c#的区块链编程_C#编程之C#区块链零基础入门,学习路线图

    本文主要向大家介绍了C#编程之C#区块链零基础入门,学习路线图,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. 一.1分钟短视频<区块链100问>了解区块链基本概念 http: ...

  8. 入门区块链游戏必备知识和注意事项(第一期)

    我们会分几期为玩家介绍整个链游圈的情况和提供数据: 第一期内容:介绍链游情况.必备知识和注意事项. 第二期内容:国外自媒体注册方法和工具使用,各个钱包的使用 第三期内容:链游避坑指南和如何挑选链游项目 ...

  9. 区块链技术基础:术语和用例

    一:区块和区块链网络 区块链是一种在整个业务网络上共享的分布式账本.业务交易被永久记录在有顺序的.仅可附加的.防篡改的账本区块中.所有经过确认和证明的交易都通过哈希算法从创始区块一直链接到最新的区块, ...

最新文章

  1. 一文看尽2018全年计算机视觉大突破
  2. MySQL日期格式符
  3. 【BZOJ1079】【codevs2428】着色方案,DP
  4. zuul转发服务一直报404_SpringCloud之Zuul的多个使用场景
  5. Ionic2学习笔记
  6. SpringCloud Eureka 高可用
  7. 1月17日云栖精选夜读:阿里云云数据库开了一个未来大会,谈了谈2038年的数据库趋势...
  8. 史秀峰计算机网络技术与应用第二版,史秀峰版《计算机网络技术与应用》期中测试.doc...
  9. Java实现生成二维码(含logo)
  10. jmeter进行http压力测试(图文小教程)
  11. TUIO+激光投影互动制作解析
  12. JAVA 三个框架结合运用思路_SSM框架的整合与使用——实现简单的转账系统
  13. 用户名修改后进入不了计算机,更改计算机用户名后不能登录到桌面怎么办?
  14. 服务器的正向代理与反向代理
  15. 团队协作常见问题分析与解决
  16. dne服务器没检测到有响应,设备或资源dns没检测到有响应 网络无法连接
  17. 错过“复联4”在所不惜,迅雷链技术沙龙北京站有哪些更精彩的地方?
  18. iOS应用内跳转到手机淘宝天猫
  19. 用Photoshop制作2寸照片方法
  20. Hello OsChina

热门文章

  1. 今日行情应该怎么看?
  2. 30行代码就可以实现看图识字!python使用tensorflow.keras搭建简单神经网络
  3. 安卓打开rpm文件_在PC上如何运行Android系统?
  4. 64.qt quick-qml使用高德地图插件实现V2版本(新增:位置搜索、路径规划、轨迹编辑等)
  5. 张小龙谈移动互联网产品设计原则
  6. 微信读书的 debugger 虽斩断了你的调试的念头,但我有一招
  7. Api自动化框架分享
  8. matlab测血压,开源全部代码,可下载:Matlab仿真示波法Oscillometric测血压
  9. 2020软件测试行业趋势
  10. 各大数据竞赛 Top 解决方案汇总