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 到底是怎么运作的。

https://www.cnblogs.com/mfryf/p/8284801.html

bitcoin 源码解析 - 交易 Transaction的更多相关文章

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

    bitcoin 源码解析 - 交易 Transaction(三) - Script 之前的章节已经比较粗略的解释了在Transaction体系当中的整体运作原理.接下来的章节会对这个体系进行分解,比较 ...

  2. bitcoin 源码解析 - 交易 Transaction(二) - 原理篇

    这篇文章我断断续续写了呃···· 应该快三个星期了? 所以前后的风格可能差别相当大.真是十分的怠惰啊··· 最近实在是不够努力.用python重写bitcoin的项目也卡在网络编程部分(这方面真是我的 ...

  3. bitcoin源码解析 - 交易 Transcation (一)

    比特币中的交易可谓是比特币的最核心部分.比特币由交易产生,而区块就是用来存储交易的.所以,交易是比特币存在的载体,同时也是比特币中最复杂的部分.交易的运作层层相扣,各个部分缺一不可,十分严密,由此体现 ...

  4. Surface在C++层的创建源码解析

    Surface在C++层的创建源码解析 源码为:android4.4.4 1.创建SurfaceComposerClient绘图客户端 // create a client to surfacefli ...

  5. EventBus源码解析 源码阅读记录

    EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...

  6. spring事务源码解析

    前言 在spring jdbcTemplate 事务,各种诡异,包你醍醐灌顶!最后遗留了一个问题:spring是怎么样保证事务一致性的? 当然,spring事务内容挺多的,如果都要讲的话要花很长时间, ...

  7. Flume-ng源码解析之Channel组件

    如果还没看过Flume-ng源码解析之启动流程,可以点击Flume-ng源码解析之启动流程 查看 1 接口介绍 组件的分析顺序是按照上一篇中启动顺序来分析的,首先是Channel,然后是Sink,最后 ...

  8. 以太坊go-ethereum签名部分源码解析

    以太坊go-ethereum签名部分源码解析 golang标准库里的crypto/ecdsa椭圆曲线加密算法所提供的函数有: ecdsa.PublicKey结构体通过持有一个elliptic,Curv ...

  9. MyBatis源码解析(四)——DataSource数据源模块

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634880.html 1.回顾 上一文中解读了MyBatis中的事务模块,其实事务操作无非 ...

随机推荐

  1. I.MX6 2G DDR3 16G eMMC

    /************************************************************************* * I.MX6 2G DDR3 16G eMMC ...

  2. I.MX6 AW-NB177NF p2p support

    /***************************************************************************** * I.MX6 AW-NB177NF p2 ...

  3. POJ2689:Prime Distance(大数区间素数筛)

    The branch of mathematics called number theory is about properties of numbers. One of the areas that ...

  4. spring+mybatis 多数据源整合--temp

    <!-- 数据源配置 -->   <bean id="ds1" class="org.apache.commons.dbcp.BasicDataSour ...

  5. PhpStorm比较高级的一些设置

    开始使用phpstorm工具,总体感觉还是不错的.有点不舒服的就是他占用内存比较高,反应速度有时会卡,这跟他的功能强大有关系.有些功能对于 我来说是不怎么需要的,比如自动保存功能,会频繁的保存一些文件 ...

  6. 【旧文章搬运】遍历EPROCESS中的ActiveProcessLinks枚举进程

    原文发表于百度空间,2008-7-25========================================================================== 前面对PEB ...

  7. js、匿名函数、闭包、回调函数

    234567891011121314151617181920212223242526272829303132333435 闭包 闭包:闭包是指有权访问另一个函数作用域中的变量的函数 函数嵌套一个函数, ...

  8. https://www.luogu.org/blog/An-Amazing-Blog/mu-bi-wu-si-fan-yan-ji-ge-ji-miao-di-dong-xi

    https://www.luogu.org/blog/An-Amazing-Blog/mu-bi-wu-si-fan-yan-ji-ge-ji-miao-di-dong-xi

  9. StructLayoutLayout 属性无法通过GetCustomAttributes 或者 Attributes获得

    http://stackoverflow.com/questions/17684664/retrieve-the-structlayout-attribute-of-a-struct 这是一个type ...

  10. pyrcharm 编程规范

    正常变量赋值, 等号左右各一个空格: 参数赋值, 等号左右都没有空格: 注释#后面一个空格 类定义和函数定义,前后各两行,而在类的里面定义成员函数,只需要空一行 文件最后一个空行 变量.函数.类最好都 ...