区块链安全

区块链安全第 7 课——智能合约安全性铺垫

1. 关于 Vyper

Vyper 是另一种开发智能合约的语言。

从编码习惯来说,Solidity 更像 C 的语法和风格;而 Vyper 因为是用 python 开发的,所以风格更加 pythonic。记住所有 Vyper 语法都是有效的 Python3 语法。

Vyper 的追求是更高的安全性,主要是通过删去对一些危险的语言 feature 来实现的,这也导致了 Vyper 代码具有更高的可读性。

因为个人觉得 Vyper 比较简单,于是跳过,留给读者自己对着官方文档学。毕竟会 Python 的话基本就掌握了 Vyper 语法。

2. 部分安全分析工具的使用

Mythril OSS 是 EVM 字节码的安全分析工具,可以分析 sol 文件和合约地址。这个工具是 github 上面开源的所以自查自取。

在 macos+python 3.8.2 的情况下,在安装了 leveldb 之后,安装 mythril 依然遇到了报错,看了一下项目的 issues 发现可能是 python 版本的问题,可能是跟 python3.6 更加适配。于是我转而想通过 docker 来使用此工具。装 docker 太慢了…… 所以跳过剩下的部分。

实测据一个朋友说这个工具的效果没有 remix 下面的 「SOLIDITY STATIC ANALYSIS」插件的检出效果好。
remix 编译器上面有这个插件 「SOLIDITY STATIC ANALYSIS」。可以直接 activate 此插件。会做一些智能合约漏洞方面的检查,并计算各个函数预计消耗的 gas。读者可以尝试下:

3. 智能合约的数据写入

之所以把这个点拎出来说因为觉得可能是一个面试考点。

智能合约可以将数据写进两个地方:

  • 全局状态

智能合约的状态变量(合约中的变量)存储在以太坊全局状态树中,并且每个智能合约只能存储、读取和修改与其自身地址相关的数据(智能合约不能读写其他智能合约的数据)。

  • 日志

智能合约也可以通过日志事件将数据写入以太坊区块链数据中。但是虽然智能合约可以对以太坊链数据进行写入操作(通过事件日志),但是它们无法对所创建的链上日志进行读操作,emmm 可写不可读。尽管如此,通过日志事件对以太坊链数据进行写操作的一个好处是,这些日志数据可以被公链上的轻客户端读取和发现。例如,已经被挖掘的块中的 logsBoom 值可以表明该块是否存在日志事件。一旦确定该日志事件存在,人们就可以获得指定交易收据的日志数据。

4. 后话

到目前为止,智能合约安全的铺垫工作就学完了。接下来会逐渐讲述智能合约中的一些攻击类型,尽量结合代码实例。感觉要先拆分去学,最后再次总结有哪些类型,也就是分-总结构。
下节课见!