想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】
链客,有问必答!!
Solidity作为一个程序语言,写出来的Smart Contract就跟所有程序一样,有时候会有Bug。然而Smart Contract上的Bug很可能比一般程序中的Bug还要严重,因为一旦放到链上就再也无法被修改了,最知名的莫过于DAO attack。于是有人将脑筋动到另一个依然还未被广泛应用的领域上— —正规验证(Formal Verificatinon,也有人称为形式化验证)。
本篇文章介绍的内容则是正规验证前必须的工作,即定义一个语言的语意(semantics)。在一个语言中,一个语句的语义指的是这段指令所代表的「意思」。看到这大家可能会有个疑惑,为什么一个指令的意思需要另外定义?不是全部都写在规格书跟编译器里了吗?原因是,就算是写在规格中的语法,其真正的意思也时常是没被精确定义的,如果仅是写在规格书中,那一个指令结束后,整个电脑的状态(在EVM可以指整个Ethereum的Global State)常是无法被确定的,必须了解编译行为、以及编译后的bytecode才能了解会发生什么事。然而一个好的程式语言,应该让程式设计师只看高阶的程式码就能判断会及不会发生什么行为。
什么是正规语意?以虚拟码与Hoare Logic 为例
一个典型用Hoare Logic进行分析的程式会具有三元的结构{ P } C { Q },不严谨的解释是对于一个程式C,其执行前的状态P(前件)会在执行后变成状态Q(后件)。状态P , Q都是由命题构成集合。
我们先看一句简单的指令:x := x+1
这个指令做的事很简单,「将x加上1后赋值给自己」。但在撰写程式时我们其实是对这个指令执行前与执行后会发生的事已经在脑内有许多的预设了,才会写下这样的程式。而Hoare Logic正是将这些脑内的预设写下来。例如,若我在写下这行程式时,我确信执行前的x的值为42,那在一个语法没有其他作用的程式语言中,这行程式执行完x的值会变为43。在Hoare Logic中可以写成{ x =42} x := x +1{ x =43}。
我们再看另一行程式
y := x
若在写这行程式时我们已经想好x的值会是43,那执行完y应当要是43。写成Hoare Logic便是{ x =43} y := x { y =43}。
当我们发现第一个程式的后件与第二个程式的前件相同,便能将上面两行程式连接起来,而变成{ x =42} x := x +1; y := x { y =43}。
<