1. 智能合约的经典漏洞
  2. 智能合约的审计工具
  3. 智能合约安全学习路线
  4. 智能合约学习资源
  5. 区块链相关学习材料

前言

笔者相对擅长合约安全方面,因此这个学习路线大致是偏向于智能合约开发和智能合约安全,对于很多从事开发的朋友,可能显得比较学院派,不是那么切合工作实际,不过抛砖引玉,欢迎讨论和补充。学习的资源可以在下方的资源汇总中找到,笔者日后将会写合约审计方面的文章。

我们学习的心得、理论基础和源码分析,都会写在仓库里,欢迎交流学习

https://github.com/learnerLj/geth-analyze

这下面的内容笔者也没有完全掌握,但是会逐渐的学习,在未来 3-5 年研究生毕业后也许能够在合约安全、安全的区块链系统构建等方面有一定的成就。

第一步:完成简单 DApp 开发

一开始入门就要求做简单的 DApp 可能看起来不合理,因为读者可能现在都不知道 DApp 是什么。但是项目驱动的学习将会非常有效,并且掌握的开发技能将会在后续的学习中发挥重要作用。

将会学会的知识有:

  1. 编程语言:JavaScript, Solidity, (HTML, CSS)

完成前端与合约交互往往用的 JavaScript 的 API,这是必会的技能。JavaScript 也不必学的多深入,能够熟练的掌握 promis/async 之类的异步操作,编写函数和类即可。学习 JavaScript 对于编写合约的测试用例和一些重复工作的自动化非常有帮助。每次实验中不可能重复部署实验环境,而是一次编写,反复实验和调整。

Solidity 是编写智能合约最主流的语言,也将会是只能合约开发和智能合约安全的基础,是我们后续需要精通的语言。

至于 HTML 和 CSS 本身不难,和区块链关系不大,视自身情况学习,可以弱化。

  1. Linux 的熟练使用

Linux 是以太坊客户端运行的主要系统环境,因为它相对于 windows 有更完善的命令行工具,过去的许多教程也是要么基于 MacOS,要么基于 Linux。这里推荐使用 Ubuntu 20.04 长期支持版,这是用的最多的带图形交互页面的 Linux 系统。

  1. 区块链入门知识

市面上关于区块链的书多如牛毛,笔者在刚入门时几乎借助 掌阅、微信读书等电子书平台和学校图书馆,读遍了所有中文书籍。可惜的是,笔者发现它们的内容稂莠不齐,甚至怀疑写书的人是否真的理解他所表达的内容,要么毫无洞见,要么写成教材式的死记硬背概念,少有佳作。笔者选出几本觉得还可以的书作为入门的阅读材料。

《精通以太坊》、《区块链架构之美——从比特币、以太坊、超级账本看区块链架构设计》《深入理解以太坊》是可以仔细阅读的,部分内容读不懂也没关系,可以会过来再读。

《深入浅出区块链核心技术与项目分析》、《深入以太坊智能合约开发》《区块链:以太坊 DApp 开发实战》值得略读,浏览内容,了解区块链的方方面面。其中《区块链:以太坊 DApp 开发实战》的中继服务器开发,值得以后掌握 Go 语言和具有一定的源码基础后尝试实践。

除此之外,可以阅读笔者其他的文章,会持续更新。也可以浏览下面的资源汇总,大致的看一遍,建立对区块链的模糊认识。

  1. 开发框架和库

实现 DApp 时交易使用 truffle 或者 hardhat 这样的集成开发框架。truffle 主要使用 web3.js 而 hardhat 主要使用 ether.js,这两个都可以,但是后者最近较为流行。

除了 web3.js 和 ether.js 这样的用 JavaScript 编写的完整的库外,还有其他语言编写的库,如 web3j、web3.py,但是建议和所使用的框架配套。

第二部分:深入合约开发和合约安全

通过第一部分的学习,我们可以假设读者

  • [ ] 能够在 Linux 命令行熟练使用框架.
  • [ ] 熟悉区块链的基本概念,包括区块、合约、账户、交易池、区块生成过程、交易的核心数据部分(如 valuedata)、receiptgas、基本了解 PoS 和 PoW 、最长链原则
  • [ ] 掌握编写合约的主要知识,例如 receive 函数 和 fallback 函数,编写合约的测试脚本。
  • [ ] 能够使用 geth 这样的客户端,搭建基本的网络
  • [ ] 知道在区块浏览器上查询信息

接下来开始了解区块链的相对高级的主体,注意偏向合约开发和合约安全方向:

  • [ ] 了解 ABI 的编码方式,并且能够使用 Solidity 内置的 ABI 相关函数。
  • [ ] 了解函数签名的生成方式以及在合约执行时的作用。
  • [ ] 了解预言机的确切含义,以及在链上的实现方式。
  • [ ] 理解以太坊虚拟机
    • [ ] 了解交易发送到调用合约的整个过程。
    • [ ] 熟悉合约中的数据在存储中的组织形式、内存的组织形式、calldata 的组织形式。
    • [ ] 初步理解 Solidity 编译器的原理,能够读懂汇编
  • [ ] 了解以太坊的字节码、操作码,能供单步调试,观察栈、内存的变化。
  • [ ] 了解合约的内联汇编,直接操作数据。
  • [ ] 根据自己的实际要求,选择是否需要熟悉各种业务代码,例如代币等等

然后,阅读以太坊的源码,建议阅读 geth,因为它时最主流也是最活跃的区块链项目。

对于合约开发方向,深入底层似乎有些有些不必要了,但是对于合约安全来说,接下来的内容可能才算开始“入门”。

  • [ ] 理解以太坊最重要的数据组织形式:状态树、收据树、交易树
    • [ ] 掌握 Trie Tree、Patrica Tree、Merkle Tree 的数据结构基础。
    • [ ] 掌握重要的编码方式: HP 编码、 RLP 编码。
  • [ ] 看懂源码中的 core 部分,从源码实现层次
    • [ ] 理解区块链中的数据结构的确切定义和实现的方法。例如,从代码层次,掌握 blocktransctionlogreceipt 的定义和对应的方法。
    • [ ] 理解创世块的的生成方式
    • [ ] 看懂交易池(非常重要),例如交易排序、并发执行、交易广播实时更新数据
    • [ ] 看懂交易广播、区块形成过程等等
  • [ ] 掌握合约的常见漏洞和审计工具的使用

第三部分:高级智能合约安全研究

  • [ ] 深入理解字节码,合约存储、链上和链下数据完整性和安全性方案
  • [ ] 掌握合约安全分析的方法,理解原理,包括
    • [ ] 用机器学习方法分析
    • [ ] 符号执行方法
    • [ ] 模糊测试分析
    • [ ] 污点分析
    • [ ] 形式验证分析
  • [ ] 掌握区块链系统态势感知模型,能够设计系统方案,动态、整体地监控链上数据,并且自动分析可能的安全威胁。