理解区块
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读TxList 解读oracle 原理和实现交易池分析MPT树区块同步geth源码学习——介绍How Geth starts its server 结构定义 区块 首先我们需要明白区块的结构。 123456789101112131415161718192021// Block represents an entire block in the Ethereum blockchain.type Block struct { header *Header //区块头 uncles []*Header //引用的叔块 transactions Transactions //交易 // caches hash atomic.Value //区块哈希 size atomic.Value //区块大小 // Td is used by package core to store the total...
理解收据receipt
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读TxList 解读oracle 原理和实现交易池分析MPT树区块同步geth源码学习——介绍How Geth starts its server 核心结构 收据主要包括交易类型、交易是否成功的状态码、交易是否成功的编码、直到这笔交易区块消耗的 gas、和布隆过滤器。为了方便处理交易,也添加了交易的信息,包括交易哈希、合约地址和消耗的 gas。为了检查交易和收据是否匹配,提供了区块哈希、区块高度和交易在区块中的索引。 12345678910111213141516171819202122232425262728// Receipt represents the results of a transaction.type Receipt struct { // Consensus fields: These fields are defined by the Yellow Paper Type uint8 ...
智能合约学习资源
智能合约的经典漏洞智能合约的审计工具智能合约学习资源智能合约安全学习路线区块链相关学习材料 这些资源主要来自笔者的经历和学习,也参考了许多人的总结,作为自己的系统作结,应该对大家有帮助。 帮助和交流平台 gitter 在线频道。 reddit ethereum 讨论区 以太坊的 stackexchange stackoverflow 还有一些 discord 服务器,感兴趣可以加入。 优质社区 以太坊社区网络,他们的文章整理的不错,文档也很好。 以太坊维基百科,可以浏览基本的概念,很有帮助。 以太坊基金会博客,可以得到很多前沿信息。 登链社区,许多翻译的文章质量很高,并且有一些文档翻译。 以太坊知识库,虽然许多东西没有更新,但是有些文章翻译的很好,例如 新手入门、以及它开发者提供的参考 都可以看出来是花了很长时间整理的,可以浏览,增长见识。比较可惜的是,后续没有继续更新,可能是小白成为大佬的过程常常写很多的文章,但是成为大佬后都应对复杂问题,就没有继续写下去了吧。 layer2 方案的备忘录,以后深入以太坊拓展方案后可以很快对 layer2...
智能合约安全学习路线
智能合约的经典漏洞智能合约的审计工具智能合约学习资源智能合约安全学习路线区块链相关学习材料 前言 笔者相对擅长合约安全方面,因此这个学习路线大致是偏向于智能合约开发和智能合约安全,对于很多从事开发的朋友,可能显得比较学院派,不是那么切合工作实际,不过抛砖引玉,欢迎讨论和补充。学习的资源可以在下方的资源汇总中找到,笔者日后将会写合约审计方面的文章。 我们学习的心得、理论基础和源码分析,都会写在仓库里,欢迎交流学习 https://github.com/learnerLj/geth-analyze 这下面的内容笔者也没有完全掌握,但是会逐渐的学习,在未来 3-5 年研究生毕业后也许能够在合约安全、安全的区块链系统构建等方面有一定的成就。 第一步:完成简单 DApp 开发 一开始入门就要求做简单的 DApp 可能看起来不合理,因为读者可能现在都不知道 DApp 是什么。但是项目驱动的学习将会非常有效,并且掌握的开发技能将会在后续的学习中发挥重要作用。 将会学会的知识有: 编程语言:JavaScript, Solidity, (HTML, CSS) 完成前端与合约交互往往用的...
交易的签名
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读TxList 解读oracle 原理和实现交易池分析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 ...