『学概念找员外』比特币脚本

作者: 刘员外__ | 来源:发表于2019-04-06 13:30 被阅读3次

    作为一个程序员,经常遇到的一个问题就是已经上线的系统总是会出现各种各样的莫名其妙的问题,有些问题能提前规避,但是总有那么少数的意外是无法避免的,所以需要不定时的维护更新自己写的程序,这种频率一般还挺高的,所以对一套系统来说,它的运营维护成本总是要高出开发成本若干倍。你可能会说,那还是你的技术水平不行,你看人家中本聪08年开发出来的比特币,能平稳的运行到现在,算起来的有10个年头了,人家是怎么做到的呢?当然不可否认,这是所有的程序员都打心底里倾佩的一个地方,都认为中本聪就是一个神级的人物。所以接下来员外给大家说道说道这个比特币的脚本到底是怎么做到安全运行10余载的。

    脚本的样子

    可能有很多小伙伴不理解脚本是什么,比特币的脚本其实就是比特币的控制语言。最常见的比特币交易,就是通过某人的签名去取得他在前一笔交易中获得的资金。这种情况下,交易的输出包含这样的信息:“凭借地址X的所有者的签名,才可以获得这笔资金。”我们知道地址其实就是一个公钥的哈希值,所以仅仅说地址X并没有告诉我们公钥在哪里,也没有给我们一个检查签名的方法。所以,交易输出必须这样描述:“凭借哈希值为X的公钥,以及这个公钥所有者的签名,才可以获得这笔资金。”这实际上就是最常见的比特币脚本。

    例如:

    OP_DUP
    OP_HASH160
    69e02e18...
    OP_EQUALVERIFY
    OP_CHECKSIG
    

    谁执行脚本

    那么谁执行这个脚本?这一系列指令是如何完成的呢?其实交易的输入包括了脚本(而不是签名)。为了确认一笔交易正确地获取了上一笔交易所输出的资金,我们把交易的输入脚本和上一笔交易的输出脚本串联起来,这个串联脚本必须被成功地执行后才可以获取资金。这两个脚本,一个是输出脚本(scriptPubKey),另一个是输入脚本(scriptSig)。输出脚本只是指定了一个公钥(或是公钥哈希值的地址),输入脚本指定了一个对应公钥的签名。

    例如:

    <sig>
    <pubKey>
    ------------------
    OP_DUP
    OP_HASH160
    <pubKeyHash?>
    OP_EQUALVERIFY
    OP_CHECKSIG
    

    为了确认当前交易是否正确地获取了前一笔交易输出的资金,我们把两个脚本链接起来,把上一笔交易的输出脚本(虚线下方)添加到当前交易的输入脚本(虚线上方)之后,形成一个新的脚本。请注意<pubKeyHash?>里面有一个“?”,用作标识来确认它是否与当前交易提供的公钥的哈希值一致。

    比特币语言的介绍

    这个脚本语言是专门为比特币开发的,它是一种简单的堆栈式编程语言。比特币的脚本语言设计原则就是简明扼要,并内生地支持加密操作。比如,脚本里面有目的性的指令用来计算哈希值和检验签名。这种脚本语言因为是堆栈式的,意味着每个指令只被执行一次,是线性的,无法循环执行。所以指令的数目给了我们一个执行时间与内存使用的上限。这个语言不是图灵完备的,意味着不能随意运行强大函数功能。但这是有意设计的,因为矿工需要去执行这些网络上任意交易提交者所递交的脚本,设计者并不希望让他们提交可能无限循环的脚本,那样的话会增加很多意想不到的工作量。

    执行比特币脚本只能产生两个结果:要么被成功执行,这种情况下,交易有效;要么脚本执行出现错误,这种情况下,整个交易无效,拒绝记入区块链。这个脚本语言十分简单。只有256个指令,每个只用一个字节。256个指令中,有15个目前不可用,有75个被保留还没有具体定义(以后或许可以被用来扩展),剩下的才是可用的。

    许多在其他语言里常见的基本指令这里面都有。例如,基本的算数、逻辑语句(如If、then)、抛出错误、过早返回等。而且,还有密码指令,比如哈希函数语句、签名验证语句等。

    员外觉得也正是因为比特币脚本的简单,越是简单的语言在运行起来也就能将报错率降到最低,或许这才是比特币能安全运行10年的一个最根本的原因吧。

    相关文章

      网友评论

        本文标题:『学概念找员外』比特币脚本

        本文链接:https://www.haomeiwen.com/subject/knnwdqtx.html