智能合约的审计工具
智能合约的经典漏洞智能合约的审计工具智能合约学习资源智能合约安全学习路线区块链相关学习材料 开源审计工具 建议在 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...
以太坊的数据组织
初步理解以太坊虚拟机以太坊的数据组织EVM的设计与原理 这篇文章主要介绍以太坊的数据组织形式,构建以太坊各部分数据结构是如何组织的系统观。随后,我将会选取黄皮书中的核心设计思想,写得相对通俗易懂。各部分具体的数据结构,将会在后续的源码解读中给出。 概览 以太坊的区块由区块头和区块体构成,区块头存储元数据,通过区块哈希形成链式结构。区块体用于存储交易的集合和其他数据,大致结构如下: Trie Tree Trie Tree 被称作字典树,或者 前缀树 (prefix Tree),用于管理键值对类型的多叉树。字典树的 Key 不是直接保存在某一个节点,而是通过节点在树中的位置确定,类似于哈夫曼编码树。因此,可知子节点都有相同的前缀。只有叶子节点才存放 Value,从根节点到叶子节点形成的路径上的节点,按照顺序排列构成 Value 的 Key. 假如 节点 d 存储 Value,则 and 是它的 Key 总体如下: 根节点不包含字符,根节点外的所有节点都只包含一个字符。 从根节点到某个节点,路径上经过的的字符连起来,为该节点对应的 Key. 每个节点的 Key...
(八)合约的高级特性(完)
区块链基础(一)初步理解智能合约(二)代码结构和合约特性(三)控制结构(四)类型(五)字面量和内置单位、函数(六)应用二进制接口(七)特殊函数(八)合约的高级特性(完) 继承 继承的机制和 python 的非常相似,但是存在差异。一般而言使用过 C++, 基本已经掌握。 当合约继承其他的合约时,只会在区块链上生成一个合约,所有相关的合约都会编译进这个合约,调用机制和写在一个合约上一致。 继承时,全局变量无法覆盖,如果出现可见的同名变量会编译错误。通过例子来体会细节,重点理解语法,而不是程序逻辑。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657// SPDX-License-Identifier: GPL-3.0pragma solidity >=0.7.0 <0.9.0;contract Owned { constructor() { owner =...
DeFi攻击事件研究
前言:本文只为了交流学习,为了快速学习,已有的写的较好的资料直接照抄,并且在参考中注明来源。介绍的都非常简略,但是读者可以根据参考链接得到详细的讲解。 汇总表格 发生时间 名字 类型 损失金额 简述原因 代码 txhash 2022 年 07 月 25 日 LPC BNB 约 45,715 美元 实际的账户余额在后续操作中变化了,但是变量 recipientBalance 没有再次更新,导致后续计算余额偏大。 0x0e970ed84424d8ea51f6460ce6105ab68441d4450a80bc8d749fdf01e504ed8c 2022 年 06 月 27 日 XCarnival NFT ETH,业务逻辑漏洞 约 380 万美元 未考虑抵押物被取出不能借款的业务逻辑,主要是 isWithdraw(bool) 未在 borrow...