bitcoin 源码解析 - 交易 Transaction(三) - Script

之前的章节已经比较粗略的解释了在Transaction体系当中的整体运作原理。接下来的章节会对这个体系进行分解,比较详细描述细节的构成。

本章将要详细分析bitcoin交易中的交易脚本-script到底是什么东西。

回顾和概要

在前面的文章中提到,在bitcoin的体系中,一个交易是被发布到比特币的整体系统中的,而能够操控之前交易的的TxOut(被锁住的coin),是需要能够操控这个TxOut的人提供"钥匙"来控制。就像前文描述的,coin在整个系统中是像流水一样的在体系中进行流通,而coin在其中在分叉点的时候会有一个像 “锁” 的东西把coin锁在这个节点上。而根据这个锁产生了一个新的交易,继续流通被这个锁所锁住的coin,是需要提供一个"钥匙"的。

所以这里的比喻:“锁”和“钥匙”就是比特币交易中的交易脚本Script

其中

“锁” 对应着 scriptPubKey

“钥匙”对应着 scriptSig

但是单纯的把Script理解为“锁”和“钥匙”实在是太浅薄了。只能完成这点事情的并不能体现Script 的强大,也无法对后人创立“智能合约”有所启发。

所以在我看来,比特币的Script实际上是:

scriptPubKey 是上一个交易(out)提出的一个 “问题”

scriptSig 是我想使用上一个交易中钱,那么我就对你提出的这个问题提供我的“答案”

因为公私钥的关系,所以如果scriptPubKey 提出的问题是公钥相关的问题,那么很明显,只有持有私钥的人才能回答这个问题,所以就简化为刚才的所说的“锁”和“钥匙”的关系。

而另一方面,如何确认提供的“答案”就是能回答“问题”的呢?这就说明Script是需要被执行验证的,而且这个验证的过程只需要txin提供的scriptSig 和验证者自己从自己的记录中找到的txout的scriptPubKey ,而这个验证者就是广大的矿工们。

整个系统精妙的地方就在于,scriptPubKey是验证者(矿工)各自独立持有的东西,其安全性由自己所保证的,而想要完成交易的人只需要提供scriptSig给广大验证者就行,不需要一些多余的上下文(可以理解为上下文由验证者自己持有,虽然大家都互不信任,但是对于最广大的人来说,这个上下文都是相同的)。

另一个方面不太被大多数人所注意到的是:

实际上刚才的模型简化为了“问题”和“答案”,但是这个“问题”可不是很容易提供的。

这个“问题”应该满足2个方面的要求:

  1. 问题的答案必须是十分明确的,唯一的,不能是个模糊的要求(这点在代码中就是“代码就是法律”的体现吧(笑),或许这就是智能合约无法完成真正人们所向往的替代所有合同执行的原因,因为合同虽然签订了,但是其中的内容其实很多是有讨价划价,钻空子的空间的)
  2. 答案必须容易的被验证而不需要其他上下文环境。(这点就是这个问题提出的困难的地方,也就是这个问题要么正向很难,逆向很容易,要么验证需要提供其他的附加的上下文环境。)

而公私密钥的模式其实是完美的符合了这2方面的要求的。

那么有没有其他的问题呢?那是当然有的,比如我提出了一个数学问题,这个问题的解是唯一的并且可以很容易的验证我的回答对不对

那么我就可以创建一笔交易,而这笔交易的txin就提供这个问题的答案,只要我的这个tx优先被矿工打包进入区块中,并成为最长链,那么这个问题下的钱就归我了。

这个场景就是符合正向很难,逆向容易的场景。

接下来就解释 比特币系统中的 CScript 到底是怎么运作的。

CScript

在比特币源码当中,对于CScript 单独列出了 script.c/script.h 来实现这块体系(对比把tx,block等所有实现全部放在main.c/.h来说),可见得中本聪在一开始设计这套体系的时候就把这块的内容看的相当的重要。事实上这套体系也确实很复杂,但是也是得益于这套体系,才能取得现在的地位,如果没有这个设计,比特币的实用性会被大幅度减弱。

class CScript : public vector<unsigned char> { // 把各种类型的数据序列化到 vector 中 CScript& operator<<(char b) { return (push_int64(b)); } CScript& operator<<(short b) { return (push_int64(b)); } CScript& operator<<(int b) { return (push_int64(b)); } CScript& operator<<(long b) { return (push_int64(b)); } CScript& operator<<(int64 b) { return (push_int64(b)); } CScript& operator<<(unsigned char b) { return (push_uint64(b)); } CScript& operator<<(unsigned int b) { return (push_uint64(b)); } CScript& operator<<(unsigned short b) { return (push_uint64(b)); } CScript& operator<<(unsigned long b) { return (push_uint64(b)); } CScript& operator<<(uint64 b) { return (push_uint64(b)); } CScript& operator<<(opcodetype opcode) CScript& operator<<(const uint160& b) CScript& operator<<(const uint256& b) CScript& operator<<(const CBigNum& b) CScript& operator<<(const vector<unsigned char>& b) { // } bool GetOp(const_iterator& pc, opcodetype& opcodeRet, vector<unsigned char>& vchRet) const 

bitcoin 源码解析 - 交易 Transaction(三) - Script相关推荐

  1. Ardusub源码解析学习(三)——车辆类型

    APM_Sub源码解析学习(三)--车辆类型 一.前言 二.class AP_HAL::HAL 三.class AP_Vehicle 3.1 .h 3.2 .cpp 四.class Sub 4.1 . ...

  2. APM_ArduCopter源码解析学习(三)——无人机类型

    APM_ArduCopter源码解析学习(三)--无人机类型 一.前言 二.class AP_HAL::HAL 三.class AP_Vehicle 3.1 .h 3.2 .cpp 四.class C ...

  3. 【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanFactory体系】

    BeanFactory体系 BeanFactory整体结构体系图 顶层接口-BeanFactory 1.1.描述 1.2.方法解析(15个) 1.2.1.属性 1.2.2.获取bean实例 1.2.3 ...

  4. 激光SLAM源码解析S-LOAM(三)里程计图优化

    里程计,是通过累计帧间位姿变换得来的,因此会累积帧间误差. 如果想要纠正此累积误差,我们需要通过另一种方法得到可信位姿,以此校正相同时刻里程计位姿. SLAM图优化,是一种记录各帧时刻里程计,并通过可 ...

  5. Spring5源码 - 13 Spring事件监听机制_@EventListener源码解析

    文章目录 Pre 概览 开天辟地的时候初始化的处理器 @EventListener EventListenerMethodProcessor afterSingletonsInstantiated 小 ...

  6. Android View体系(五)从源码解析View的事件分发机制

    Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...

  7. Dubbo 实现原理与源码解析系列 —— 精品合集

    摘要: 原创出处 http://www.iocoder.cn/Dubbo/good-collection/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1.[芋艿]精尽 Dubbo 原理与源码专栏 2.[ ...

  8. 源码解析:Spring源码解析笔记(五)接口设计总览

    本文由colodoo(纸伞)整理 QQ 425343603 Java学习交流群(717726984) Spring解析笔记 启动过程部分已经完成,对启动过程源码有兴趣的朋友可以作为参考文章. 源码解析 ...

  9. React深入学习与源码解析笔记

    ***当前阶段的笔记 *** 「面向实习生阶段」https://www.aliyundrive.com/s/VTME123M4T9 提取码: 8s6v 点击链接保存,或者复制本段内容,打开「阿里云盘」 ...

  10. Spring 框架源码(二) 事务Transaction源码深度解析

    目录 一.基于xml形式开启Transaction 1. 创建数据库user 2. 创建一个maven 项目 3. 通过xml形式配置事务 1) 创建Spring 命名空间 2) 开启事务配置 3) ...

最新文章

  1. ADO.Net五个对象
  2. python怎么实现检验_[python skill]利用python实现假设性检验方法
  3. Windows Phone 如何振动手机?
  4. servlet多重映射_【简答题】请简要概述什么是Servlet的多重映射,并列出Servlet多重映射的实现方式。...
  5. Action类为何要继承ActionSupport
  6. 为什么不算法?常用算法概要大纲!
  7. linux 查看运行平台,linux查看程序运行相关命令
  8. Qt 启动应用程序的3种方式
  9. 自考计算机离散数学,计算机及应用自考资料2014 10 离散数学02324.doc
  10. 网页设计_导航条_下拉菜单
  11. c++取模运算/求余运算
  12. windows powershell 将U盘启动盘还原回普通U盘
  13. MD5以及SHA加密不在安全的分析
  14. C语言 大赛现场统分
  15. Pdfjs-dist 填坑日记
  16. 自定义Java注解处理器
  17. 基于STM32和阿里云的智能家居
  18. 青龙面板+傻妞sillyGirl+阿东自动登录全套保姆级一步到位教程(2021-10-09)
  19. Arnold渲染器适合什么样的电脑配置
  20. Moto P30(XT1943-1) 免解锁BL 免rec 保留数据 Magisk Xposed ROOT 救砖 ZUI 4.0.374

热门文章

  1. java jsonobject 清空_有没有办法,我可以清空整个JSONObject – java
  2. 电脑word在哪_永中PDF转WORD在线文档转换器——无需会员、没有限制
  3. hillstone debug 抓包
  4. Shreder:线程SSH协议密码爆破工具
  5. oracle数据库第十一章答案,[转载]《互联网数据库》网上作业练习题10-11章答案...
  6. Mac/Homebrew查找nginx安装目录和nginx.conf配置文件目录
  7. Algorithm——何为算法?
  8. Java NIO类库Selector机制解析(上)
  9. C# 线程同步 信号量 Semaphore
  10. Adobe向美国反垄断部门投诉苹果封杀Flash