在第10课 交易安全性如何保证? – scriptSig/scriptPubKey/Script Engine里面,我们提到在比特币网络里面,设计了1种脚本语言,并且有1个脚本引擎来解释执行这个语言。
在这1课,我们将对脚本语言进行1个深入的讲解,因为这个是闪电网络的重要基础,也是以后要讲的“智能合约”的雏形。
因为脚本语言的存在,比特币网络变得极具灵活性和扩展性,也因此在这上面衍生出了各种各样的玩法,下面就对这个脚本语言进行一个详细介绍。
Stack-Based Script Language
对于任何一门语言,例如Java/C++来说,都有语言的一些基本要素:操作数,操作符,函数,IF-ELSE, FOR循环等。
同样的,比特币网络中的Script Language也具有类似的一些要素,不过呢,它要简单很多,功能没有Java/C++这种高级语言强大,比如没有FOR循环,是图灵不完备的。
并且在前面我们已经说过,这种语言是Stack-Based,也就是所有操作都是入栈/出栈来完成,变量的分配也全部都在栈上。
下面的表格列举了这种语言中,最常用的各种操作符:
(1)栈操作类的:
(2)加减乘除,算术运算类的:
(3)逻辑运算类的
(4)分支语句 IF-ELSE
(5)加解密,Hash函数类的
(6)TimeLock
上面列举了该语言最常用的一些操作符,没有列举完,有兴趣的去网上找到全部的介绍。
这里主要目的,是想让大家对这种脚本语言有1个直观认识,知道它大概具备什么功能。再次说明,所有的操作符,都对应着入栈/出栈操作。
分支语句
在上面的脚本语言中,大部分的操作符都比较容易理解,在前面第10课 交易安全性如何保证? – scriptSig/scriptPubKey/Script Engine, 我们也讲解了脚本语言是如何被Script Engine执行的。
这里要把分支语句单独拿出来讲,是因为这个东西和我们通常理解的分支语句不太一样,并且在接下来的闪电网络的另1个关键部分(HTLC)里面要用到。
我们知道,在Java/C++里面,我们写分支语句,通常是下面这样的:
if(condition 1)
statement A
else
statment B
end if
但在比特币的这个Script Language里面,由于它是Stack-Based,要执行操作符,必须要先把操作数压栈,所以写法变成了:
condition 1 //先把condition 1入栈
OP_IF //遇到OP_IF, 把condition 1出栈,判断TRUE/FALSE。
statment A //如果TRUE,statment A入栈
OP_ELSE
statment B //如果FLASE, statment B入栈。
OP_ENDIF
下面再举一个更复杂的,分支嵌套的例子:
if(condition 1)
statment A
else
if(condition 2)
statment B
else
statment C
end if
end if
这个例子,如果用Stack-Based的脚本语言来写,代码会是什么样呢?如下:
condition 2 //关键点:因为是栈,所以要先把condition 2入栈
condition 1 //condition1入栈,condition 1在condition 2的上面
OP_IF //condition 1在上面,所以先被执行
statement A
OP_ELSE
OP_IF
statment B
OP_ELSE
stament C
OP_ENDIF
OP_ENDIF
总结
通过上面对这个语言的介绍,我们发现,虽然其功能不像Java/C++这些高级语言那么强大,但已经具有了分支选择语句,和各种操作符。
正因为有了这种脚本语言的存在,比特币网络具有了很大的灵活性和扩展性,可以在上面基于这种语言设计各种合约。
这也就是我们下1节课要讲的,闪电网络的另1个关键点:HTLC