精确定义智能合约——Solidity的语意正规化

本文探讨了智能合约语言Solidity的语意正规化,强调了正规验证在确保智能合约安全中的重要性。通过Hoare Logic和Matching Logic与K-Framework的示例,解释了如何定义语言的语意,并介绍了如何使用规则来描述程序执行的过程。Solidity已被实现在K-Framework中,允许进行动态测试和潜在的正规验证。
摘要由CSDN通过智能技术生成
想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】
链客,有问必答!!

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}。

<
Solidity是一种智能合约语言,它是以太坊平台上的主要编程语言之一。以下是Solidity的教程: 1. 智能合约的基础结构 Solidity智能合约由两个部分组成:状态变量和函数。状态变量是合约内部存储的数据,而函数是合约内部的代码,用于处理状态变量或执行其他操作。 2. Solidity的数据类型 Solidity支持各种数据类型,包括布尔值、整型、地址、字符串、数组、结构体等。例如: - 布尔值:bool - 整型:int、uint - 地址:address - 字符串:string - 数组:array - 结构体:struct 3. Solidity的函数 函数是Solidity合约中最重要的部分之一。函数可以接受参数,也可以返回值。例如: ``` function add(uint a, uint b) public returns (uint) { return a + b; } ``` 这个函数接受两个整数作为参数,并返回它们的和。 4. Solidity的控制流 Solidity支持各种控制流结构,包括if、for、while、do-while等。例如: ``` function isEven(uint x) public returns (bool) { if (x % 2 == 0) { return true; } else { return false; } } ``` 这个函数接受一个整数作为参数,并返回它是否为偶数。 5. Solidity的事件 事件是Solidity合约中的一种通知机制,它可以向外部应用程序发送消息。例如: ``` event Transfer(address indexed _from, address indexed _to, uint _value); ``` 这个事件表示在合约中发生了一次转账操作,它包含了发送方地址、接收方地址和转账金额。 6. Solidity的继承 Solidity支持继承,一个合约可以从另一个合约中继承状态变量和函数。例如: ``` contract A { uint public x = 1; } contract B is A { uint public y = 2; } ``` 在这个例子中,合约B从合约A中继承了状态变量x,并且定义了自己的状态变量y。 以上就是Solidity的基础教程,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值