比特币源码研读三(交易脚本)
这是我在菜班长的课程基础上写的第三篇研读记录,课听了三遍才能明白点皮毛,感谢班长的鼓励与支持,虽然速度很慢,但我会持续做下去的。以下是正文
比特币交易中包含两个脚本对象,分别是:在交易输入当中的解锁脚本,在交易输出当中的锁定脚步,这两个脚本既保证了准确的交易执行,也保证了交易的安全性,它们是怎么做到的呢?今天我先讲两点。
1、什么是脚本
比特币交易脚本语言称为脚本,是一种类似以Forth的逆波兰表达式的基于堆栈的执行语言。包含了三个关键内容:
1)Forth语言:是 Charles Moore 在 20 世纪 60 年代发明的基于堆栈、交互式、具有简单性哲学思想的计算机编程语言和环境,已被证明特别适合于软件代码在千行数量级的中规模嵌入式系统应用,被广泛应用于天文、军事、航空、航天、工业自动化、图形、仪器仪表、工作站领域。
2)逆波兰表达式:又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示。波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法,按此方法,每一运算符都置于其运算对象之后,故称为后缀表示。如:正常表达式a+b;逆波兰表达式:a、b、+
3)堆栈:是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。
2、脚本的操作符
位于源码src/script/script·h文件中,类型是opcodetype枚举,意为操做代码类型。1)脚本植入栈操作符,以下所示:
关键字:OP_ Pushdata1
字节:0x4c
描述:下一个脚本字节包括N,会将接下来的N个字节压入堆栈。OP_pushdata2:下两个脚本字节包括N,会将接下来的N个字节压压入堆栈;OP_pushdata4:下四个脚本字节包括N,会在接下来的N个字节压入堆栈
脚本植入栈操作符2)条件流量控制操作符
关键字: OP_notif
字节 :ox64
描述 :如果栈顶元素不为0,语句将被执行。
OP_verif:终止-交易无效
OP_vernotif:终止-交易无效
OP_else:如果前述的OP_if或OP_notif或OP_else未被执行,这些语句就会被执行。
条件流量控制操作符3)控制堆栈操作符
关键字:OP_2dup(duplication)
字节:0x6e
描述:复制栈顶两个元素
OP_dup:复制栈顶的一个元素
控制堆栈操作符4)字符串操作符
已禁用,只用于数字压栈,不允许字符串的压栈。
OP_size:把栈顶元素的字符串长度压入堆栈。
字符串操作符5)二进制运算与布尔逻辑运算符
关键字:OP_equal
字节:0x87
描述:如果输入的两个数相等,返回1,否则返回0
OP_equalverify:与OP_equal一样,如果结果为0,之后运行OP_verify。
二进制运算与布尔逻辑运算符6)数值操作符
关键字:OP_1add
字节:0x8b
描述:输入值加1
OP_1sub:输入值减1
OP_add:输出输入两项之和
OP_sub:输出输入(第二项减去第一项)之差
数值操作符7)加密函数操作(使用最频繁)
关键字:OP_ripemd160
字节:0xa6
描述:返回栈顶项的ripemd160哈希值
OP_sha256:返回栈顶sha256哈希值
OP_hash160:栈顶项进行两次hash,先用sha256再用ripemd-160
OP_hash256:栈顶项目sha-256算法hash两次
OP_checksig:交易所用的签名必须是哈希值和公钥的有效签名,如果为真,则返回1。
OP_checksigverify:与checksig一样,但之后运行op_verify
OP_verify:对于每对签名和公钥运行checksig。所有的签名要与公钥匹配
OP_checkmultisigverify(多签名验证):与checkmultisig一样,但之后运行OP_verify。
加密函数操作符区块链研习社源码研读班方建强