智能合约安全学习路线
智能合约的经典漏洞智能合约的审计工具智能合约学习资源智能合约安全学习路线区块链相关学习材料 前言 笔者相对擅长合约安全方面,因此这个学习路线大致是偏向于智能合约开发和智能合约安全,对于很多从事开发的朋友,可能显得比较学院派,不是那么切合工作实际,不过抛砖引玉,欢迎讨论和补充。学习的资源可以在下方的资源汇总中找到,笔者日后将会写合约审计方面的文章。 我们学习的心得、理论基础和源码分析,都会写在仓库里,欢迎交流学习 https://github.com/learnerLj/geth-analyze 这下面的内容笔者也没有完全掌握,但是会逐渐的学习,在未来 3-5 年研究生毕业后也许能够在合约安全、安全的区块链系统构建等方面有一定的成就。 第一步:完成简单 DApp 开发 一开始入门就要求做简单的 DApp 可能看起来不合理,因为读者可能现在都不知道 DApp 是什么。但是项目驱动的学习将会非常有效,并且掌握的开发技能将会在后续的学习中发挥重要作用。 将会学会的知识有: 编程语言:JavaScript, Solidity, (HTML, CSS) 完成前端与合约交互往往用的...
交易的签名
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读oracle 原理和实现交易池分析TxList 解读MPT树区块同步geth源码学习——介绍How Geth starts its server 在阅读交易的签名之前,请先阅读 理解交易 以理解源码中交易的定义和实现,这里不做重复的说明。这篇文章暂时只关注逻辑和实现,密码学函数日后单独讨论。 核心接口 Signer core/types/transaction_signing.go 中主要定义了签名器 Signer,他是一个接口,封装了签名相关的方法。 123456789101112131415161718// Note that this interface is not a stable API and may change at any time to accommodate// new protocol rules.type Signer interface { // Sender returns the sender address of the...
(一)初识软件分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 这篇文章,或者说软件分析这一个系列更像是学习笔记,绝大部分内容来自于“北大-熊英飞-软件分析”,以及南大的静态分析课程,感谢他们提供高质量的公开课,课程资源将会在文末给出。除了老师们的公开课,文章中可能会包括我自己的总结以及从其他学习资料(如博客、书等)中的内容,补充完善这篇文章。 为什么学习智能合约安全需要学习软件分析呢?因为,合约的代码安全非常重要,而代码的分析,乃至代码编译成的字节码的分析,可以笼统的归纳为软件工程的内容。当合约审计人员熟悉了合约审计工具的使用,能够避免目前已经被发现的漏洞时,如果还希望再进一步,从 DApp...
智能合约的审计工具
智能合约的经典漏洞智能合约的审计工具智能合约学习资源智能合约安全学习路线区块链相关学习材料 开源审计工具 建议在 linux 或者 MacOS 下运行。 mythril Mythril 是 EVM 字节码的安全分析工具。它检测以太坊、Hedera、Quorum、Vechain、Roostock、Tron 和其他与 EVM 兼容的区块链构建的智能合约中的安全漏洞。它使用静态分析的方法,如符号执行、SMT 解决和污点分析来检测各种安全漏洞。另外,他还有收费版本的 MythX。 在我实际使用时,我发现他的漏洞检测只局限在少数几个简单的漏洞,如溢出、重入等。我感觉不是很满意,也许主要精力去做收费版了,这个开源版本维护的很少。 使用示例 安装编译器 123pip3 install solc-selectsolc-select install 0.8.7solc-select use 0.8.7 安装 mythril 1pip3 install mythril 开始 1myth analyze <solidity-file> OR 1myth analyze -a...
智能合约的经典漏洞
智能合约的经典漏洞智能合约的审计工具智能合约学习资源智能合约安全学习路线区块链相关学习材料 以下总结的常见漏洞基本涵盖一般的漏洞类型,部分内容可能过于细致,或许有更加合理的分类方法。不过,应该能给大家提供一定的参考。 整数溢出 注意,Solidity 0.8.0 开始,加入了自动检查溢出,此版本之后的合约,可不必担心这个漏洞。 下面用 Beauty Chain 的例子说明,源码在这里,可见如下: 从区块链浏览器将代码复制到 remix IDE,仔细看第 259 行的 batchTransfer 函数,它用于给地址列表中的所有地址都转账 _value: 12345678910111213function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) { uint cnt = _receivers.length; uint256 amount = uint256(cnt) * _value; require(cnt > 0...
(三)函数调用
(一)初步认识EVM字节码(二)状态变量的赋值(三)函数调用 普通函数调用 简单赋值 注意:需要区分部署时和运行时字节码,参考下面这张图。虽然现在的字节码有小改动,但是仍然有参考意义。 所以在编译成字节码是应该使用 solc --bin-runtime FILE_NAME 12345678910111213141516// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract Storage { uint256 number; function store(uint256 num) public { number = num; } function retrieve() public view returns (uint256){ return number; }} 我们在部署时字节码正常的流程中是看不到函数的调用流程的。虽然 solc 产生的汇编使用...
(二)状态变量的赋值
(一)初步认识EVM字节码(二)状态变量的赋值(三)函数调用 状态变量的字节码 对于最简单的情况,我们观察它部署时的情况 123456// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract Empty{ uint a;} EVM 汇编如下 1234567891011121314151617181920212223242526272829303132======= Empty.sol:Empty =======EVM assembly: /* "Empty.sol":69:95 contract Empty{... */ mstore(0x40, 0x80) callvalue dup1 iszero tag_1 jumpi 0x00 dup1 reverttag_1: pop dataSize(sub_0) dup1 dataOffset(sub_0) 0x00 ...
(一)初步认识EVM字节码
(一)初步认识EVM字节码(二)状态变量的赋值(三)函数调用 前言 在开始之前,我们默认读者已经初步理解 EVM, 包括字节码、操作码、堆栈、内存、存储、calldata。理解 ABI,能够根据文档计算对应变量的 ABI,并且具有一定的编译基础。因此,如果阅读过程中觉得困难,请先阅读 EVM 的其他文章,如 初步理解以太坊虚拟机。 本文编译器版本采用 0.8.10,EVM 版本是 London。没有特殊说明的条件下,默认关闭编译优化。建议读者复现时采用相同的编译器和 EVM,避免不一样的结果,虽然一般而言小版本的变化区别不大。 合约创建 字节码和运行时字节码 我们首先部署一个空的合约 Empty.sol,观察合约部署的字节码。这里需要注意区分运行时代码和部署时代码,creation bytecode 在部署后被舍弃,RETURN 的运行时字节码写入区块链。 123456// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract Empty {} 在...
EVM的设计与原理
初步理解以太坊虚拟机以太坊的数据组织EVM的设计与原理 前言 在阅读这篇文章之前,请您先阅读初步理解以太坊虚拟机和以太坊的数据组织,它将会介绍 EVM 的基本知识,帮助您形成基本的认识。在开始之前,假设您已经掌握了上文中的基础,我们根据黄皮书进一步地补充理论基础。由于原始的黄皮书公式过多,不易阅读,可以参考按照论文重写后的版本。其次,本文使用的图片来自其他资料,会在参考资料部分注明。 非常推荐读者观看这个视频:EVM: From Solidity to byte code, memory and storage ,这是配套的 PDF。 它梳理源码到字节码的流程,演示操作码的变化,非常棒。如果读者通过前面提到的文章以及理解 EVM 的存储空间布局的话,这个视频可以为您提供字节码编写合约的基础:smirk_cat:.请善用 Remix IDE 的单步调试功能,可以通过实操,大大加深理解。 EVM 设计原理 以太坊可以抽象的分成两部分,一部分是状态,另外一部分是用于改变状态的...
初步理解以太坊虚拟机
初步理解以太坊虚拟机以太坊的数据组织EVM的设计与原理 体系结构 存储层 一般的客户端采用 LevelDB 数据库,而 OpenEthereum 采用了 RocksDB。LevelDB 是 Key-Value 的、基于 Log-Structured Merge Tree 的非关系数据库。例如 geth 的所有区块数据都是存储在 LevelDB 中,而 LevelDB 的实现在源代码的 ethdb 包内。 数据层 以太坊的数据层主要定义了数据结构、数据模型、哈希函数、签名算法等。以太坊采用独特的数据结构保护区块头和区块体,区块头含有交易的 Merkle 根哈希值,还有账户状态的 Merkle 根哈希值、日志的 Merkle 根哈希值。以太坊中 Merkle 根哈希值是采用 Merkle Patricia Tree 计算的。哈希函数使用 keccak256,数字签名采用 ECDSA。 网络层 以太坊节点通信采用的 p2p 协议是 DEVp2p,包含了 RLPx、Discv4 等子协议。RLPx 是安全的数据传输协议,采用 ECIES(Elliptic Curve...