死磕以太坊源码分析之EVM动态数据类型 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. Solidity提供了在其他编程语言常见的数据类型.除了简单的值类型比如数字和结构体,还有一些其他数据类型,随着数据的增加可以进行动态扩展的动态类型.动态类型的3大类: 映射(Mappings):mapping(bytes32 => uint256), mapping(address => strin…
死磕以太坊源码分析之EVM指令集 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. 以下指令集持续更新,最新文章请参考上面 EVM 指令集概念 EVM执行的是字节码.由于操作码被限制在一个字节以内,所以EVM指令集最多只能容纳256条指令.目前EVM已经定义了100多条指令,还有100多条指令可供以后扩展.这100多条指令包括算术运算指令,比较操作指令,按位运算指令,密码学计算指令,栈.me…
死磕以太坊源码分析之EVM固定长度数据类型表示 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. 翻译自 https://medium.com/@hayeah/diving-into-the-ethereum-vm-part-2-storage-layout-bc5349cb11b7 我们先看一个简单的Solidity合约的汇编代码: contract C { uint256 a; func…
死磕以太坊源码分析之EVM如何调用ABI编码的外部方法 配合以下代码进行阅读:https://github.com/blockchainGuide/ 写文不易,给个小关注,有什么问题可以指出,便于大家交流学习. 前言 abi是什么? 前面我们认识到的是智能合约直接在EVM上的表示方式,但是,比如我想用java端程序去访问智能合约的某个方法,难道让java开发人员琢磨透汇编和二进制的表示,再去对接? 这明显是不可能的,为此abi产生了.这是一个通用可读的json格式的数据,任何别的客户端开发人员或…
死磕以太坊源码分析之Kademlia算法 KAD 算法概述 Kademlia是一种点对点分布式哈希表(DHT),它在容易出错的环境中也具有可证明的一致性和性能.使用一种基于异或指标的拓扑结构来路由查询和定位节点,这简化了算法并有助于证明.该拓扑结构有一个特点:每次消息交换都能够传递或强化有效信息.系统利用这些信息进行并发的异步查询,可以容忍节点故障,并且故障不会导致用户超时. KAD算法要处理的问题 如何分配存储内容到各个节点,新增/删除内容如何处理 如何找到存储文件的节点/地址/路径 节点状态…
死磕以太坊源码分析之p2p节点发现 在阅读节点发现源码之前必须要理解kadmilia算法,可以参考:KAD算法详解. 节点发现概述 节点发现,使本地节点得知其他节点的信息,进而加入到p2p网络中. 以太坊的节点发现基于类似的kademlia算法,源码中有两个版本,v4和v5.v4适用于全节点,通过discover.ListenUDP使用,v5适用于轻节点通过discv5.ListenUDP使用,本文介绍的是v4版本. 节点发现功能主要涉及 Server Table udp 这几个数据结构,它们有…
死磕以太坊源码分析之rlpx协议 本文主要参考自eth官方文档:rlpx协议 符号 X || Y:表示X和Y的串联 X ^ Y: X和Y按位异或 X[:N]:X的前N个字节 [X, Y, Z, ...]:[X, Y, Z, ...]的RLP递归编码 keccak256(MESSAGE):以太坊使用的keccak256哈希算法 ecies.encrypt(PUBKEY, MESSAGE, AUTHDATA):RLPx使用的非对称身份验证加密函数 AUTHDATA是身份认证的数据,并非密文的一部分…
死磕以太坊源码分析之Fetcher同步 Fetcher 功能概述 区块数据同步分为被动同步和主动同步: 被动同步是指本地节点收到其他节点的一些广播的消息,然后请求区块信息. 主动同步是指节点主动向其他节点请求区块数据,比如geth刚启动时的syning,以及运行时定时和相邻节点同步 Fetcher负责被动同步,主要做以下事情: 收到完整的block广播消息(NewBlockMsg) 收到blockhash广播消息(NewBlockHashesMsg) 这两个消息又是分别由 peer.AsyncS…
死磕以太坊源码分析之Ethash共识算法 代码分支:https://github.com/ethereum/go-ethereum/tree/v1.9.9 引言 目前以太坊中有两个共识算法的实现:clique和ethash.而ethash是目前以太坊主网(Homestead版本)的POW共识算法. 目录结构 ethash模块位于以太坊项目目录下的consensus/ethash目录下. algorithm.go 实现了Dagger-Hashimoto算法的所有功能,比如生成cache和datas…
死磕以太坊源码分析之downloader同步 需要配合注释代码看:https://github.com/blockchainGuide/ 这篇文章篇幅较长,能看下去的是条汉子,建议收藏 希望读者在阅读过程中,指出问题,给个关注,一起探讨. 概览 downloader 模块的代码位于 eth/downloader 目录下.主要的功能代码分别是: downloader.go :实现了区块同步逻辑 peer.go :对区块各个阶段的组装,下面的各个FetchXXX 就是很依赖这个模块. queue.g…