比特币脚本简介
脚本是一种类Forth、基于栈操作、逆波兰式、图灵不完整语言。 挨个解释下:
图灵不完备
图灵不完备语言的功能有限,无法跳跃或循环,因此不会进入无限循环。图灵完备,意味着给定资源及内存,程序能解决任何问题。Solidity语言就是图灵完备的。
为什么比特币脚本是图灵不完备的?
因为没必要。
比特币脚本不用像以太坊智能合约那么复杂。脚本图灵完备,相当于为恶意方开启随意创建复杂交易的自由门,后果就是耗尽比特币网络算力从而拖慢整个网络。
逆波兰式
逆波兰表达式的语法规定,表达式必须以逆波兰表达式的方式给出。 逆波兰表达式又叫做后缀表达式。
意思是:
• 3+4 长成34+。
长一点的算术长这样:
• 5*3+4 长成 534+*。
基于栈操作
堆栈是种很流行的数据结构,可以理解成是线性结构,一堆那种。 只能在一端插入或删除数据,这个端叫栈顶。
或者这么理解:最后一个进,第一个出。

如图,三本书什么顺序被放桌上的?
那么,把这三本书从桌上拿开,什么顺序?

最后一个进,第一个出对吧。
有两种堆栈操作了解下:
• 推:添加至堆栈的动作
• 弹:从堆栈移除的动作,后进先出,别忘了。

类Forth
这个简单明了。 比特币脚本类似Forth语言,然后Forth语言碰巧也是基于堆栈操作的。
脚本定义及解析完毕。下面挪入比特币交易。
插播一句,有关比特币交易原理,可参看一下:
How Do Bitcoin Transactions Actually Work? - Blockgeeksblockgeeks.com
有请加密界的外国李雷韩梅梅。
说Alice又想给Bob转比特币了。
与法币交易不同,Alice想给Bob两块钱的时候,首先得从钱包了掏出两块纸币,然后给Bob。
比特币不是这样的,因为比特币不是币,不是实体。Alice有的是自己持有比特币的若干证明。
还有:
• 矿工把交易打包进挖出区块的过程,就是确认交易的过程。作为服务方,矿工可以收取一定费用。
• 法币体系中,一般不会追踪纸币来源。好比,现在打开钱包,里边有35块钱:有一张10块、一张20、三张1块、两个5毛硬币、10个一毛硬币。 能记住这些纸币硬币都怎么来的么? 一般不会注意的这么仔细。 但是,比特币不一样了,每笔交易都记录的清清楚楚。
现在回到Alice、Bob的例子。 交易有两方面:输入、输出。
交易输入
上面说过,每个比特币都有迹可循。那么Alice首先要看一圈之前的交易,好比想买东西,口袋里钱至少得够吧。
Alice看了一圈,发现之前的三笔交易凑一块,正好(或大于)够给Bob转账,我们把这三笔交易叫TX(0)、TX(1)和TX(2)。 三笔交易之和,叫TX(输入)。
用图解释的话,长这样:

就是加法其实。
交易输出
输出意思就是Bob内边收到的比特币数量。
上面说了,Alice凑出来的比特币有可能大于要转给Bob的金额,那么多出来的比特币,会以找零的形式返回给Alice,留着以后花。
用图解释的话,长这样:

这是个最简单的例子了,只有一个输出和一个找零。要知道,很多交易可能有多个输出的。
比特币交易就这么个流程。 但是,为交易成功,必须满足一些条件。
交易条件
• TX(输入)> TX(输出)。
这个简单了,首先,1块钱买不了5块的东西。 其次,这里边还涉及交易费。任何交易中,输入和输出(含找零)之间的差额是矿工收取的交易费。
交易费 = TX(输入) - 【TX(输出)+ 找零】
• 输入侧:TX(0)+ TX(1)+ TX(2)= TX(输入)。若Alice的资金不够,矿工直接拒绝处理交易。
• Alice会用Bob的公共地址锁住转账金额。Bob想拿到比特币的话,就得用自己的私钥进行解锁操作。
•当然了, Alice还要证明下自己是自己,花的也是自己的钱。 具体来说,就是要用自己的数字签名(私钥)签署交易。 其他人可以用Alice的公钥验证签名信息,意思是说能判断出签发交易的是Alice本人。 这个“签名数据”的概念记住了,后面还要用的。
那么,整个交易该怎么称呼?
输入(包括签名数据)、输出数据被放在一起,然后用SHA-256哈希算法计算出的结果,就是此交易的名称。
下节,我们到幕后看看交易真实的样子。
未完待续
The Best Step-by-Step Bitcoin Script Guide: Part One (Blockgeeks)blockgeeks.com
网友评论