智能合约学习小记

1.什么是智能合约? “智能合约”(smart contract)这个术语至少可以追溯到1995年,是由多产的跨领域法律学者尼克·萨博(Nick Szabo)提出来的。他在发表在自己的网站的几篇文章中提到了智能合约的理念。他的定义如下:“一个智能合约是一套以数字形式定义的承诺(promises) ,包括合约参与方可以在上面执行这些承诺的协议。”
智能合约程序不只是一个可以自动执行的计算机程序:它自己就是一个系统参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。这个程序就像一个可以被信任的人,可以临时保管资产,总是按照事先的规则执行操作。
2.智能合约的实现 【智能合约学习小记】智能合约概念并不是随着区块链技术诞生的。区块链技术天然给智能合约带来得天独厚的应用前提。如果说区块链落地应用,比特币和以太坊就是最大的应用了。由于技术有限暂时简单的研读了下以太坊的智能合约,Solidity 是一种语法类似 JavaScript 的智能合约高级语言,它被设计成以编译的方式生成 以太坊虚拟机(Ethereum Virtual Machine,EVM) 代码。这段代码发布之后,以太坊将智能合约和交易一起打包成块记录到链上。如图是查询了以太坊官方教程的合约地址。以此保证智能合约的公开透明性以及不可更改。
智能合约学习小记
文章图片
3.智能合约的安全 由于智能合约目前还只是初级阶段,相信各种安全问题会不断的发现。新加坡国立大学的Loi Luu提出了现在的智能合约存在的几种安全漏洞。
智能合约中的安全漏洞交易顺序依赖合约 交易顺序依赖就是智能合约的执行随着当前交易处理的顺序不同而产生差异。例如,有两个交易T和T[j],两个区块链状态S[1]和S[2],并且S[1]状态处理完交易T[j]后才能转化为状态S[2]。那么,如果矿工先处理交易T,交易T调用的就是S[1]状态下的智能合约;如果矿工先处理交易T[j]再处理交易T,那么由于先执行的是T[j],合约状态就转化为S[2],最终交易T执行的就是状态S[2]时的智能合约。
时间戳依赖合约 矿工处理一个新的区块时,如果新的区块的时间戳大于上一个区块,并且时间戳之差小于900秒,那么这个新区块的时间戳就是合法的。这是以 太坊协议所规定的。时间戳依赖顾名思义就是指智能合约的执行依赖当前区块的时间戳,随着时间戳的不同,合约的执行结果也有差别。
误操作异常 在以太坊中,一个合约调用另一个合约可以通过send指令或直接调用另一个合约的函数。然而在调用过程中可能会出现错误,调用的合约就会回退到之前的状态。那么这个异常就可能无法很好地被调用者获知,这取决于调用方式。例如,通过send指令调用的合约应该通过检查返回值来验证合约是否被正确执行。
可重入攻击 在以太坊中,当一个合约调用另一个合约的时候,当前的操作就要等到调用结束之后才会继续。这时,如果被调用者需要使用调用者当前所处的状态,那么这就产生了问题。著名的DAO攻击事件就是因为这个漏洞而发生的。

    推荐阅读