以太坊基础知识结构详解
以太坊的历史和发展
初创阶段
- 2013年:Vitalik Buterin 发表了以太坊白皮书,提出了一个通用的区块链平台,不仅支持比特币的货币功能,还能支持更复杂的智能合约。
- 2014年:以太坊项目启动,进行了首次ICO(Initial Coin Offering),筹集了约31,000 BTC(当时价值约1800万美元)。
- 2015年7月:以太坊主网正式上线,发布了第一个版本“Frontier”。
发展阶段
- 2016年3月:以太坊发布了第二个版本“Homestead”,标志着以太坊从实验阶段进入生产阶段。
- 2016年6月:The DAO 事件发生,导致以太坊硬分叉,产生了两个独立的区块链:以太坊(Ethereum, ETH)和以太坊经典(Ethereum Classic, ETC)。
- 2017年10月:以太坊发布了第三个版本“Metropolis”,引入了多项改进,如Zk-Snarks、隐私保护等。
- 2020年12月:以太坊2.0(Eth2)正式启动,旨在通过权益证明(PoS)机制提高网络的可扩展性和安全性。
未来展望
- 以太坊2.0:计划逐步实现从工作量证明(PoW)到权益证明(PoS)的过渡,提高网络的性能和可扩展性。
- Layer 2 解决方案:通过Rollups、侧链等技术,进一步提升以太坊的交易处理能力和用户体验。
以太坊的工作原理详解
核心概念
区块链
- 定义:区块链是一种分布式数据库,记录所有交易历史,确保数据的不可篡改性和透明性。
- 结构:每个区块包含一组交易记录,并通过哈希值与前一个区块相连,形成链式结构。
交易
- 定义:以太坊网络中的基本操作单位,可以是转账、调用智能合约等。
- 格式:每笔交易包含发送方地址、接收方地址、金额、数据字段等信息。
区块
- 定义:包含一组交易记录的数据结构,由矿工生成并通过共识机制确认。
- 结构:每个区块包含区块头(Block Header)和区块体(Block Body)。
- 区块头:包含前一个区块的哈希值、时间戳、难度值等信息。
- 区块体:包含一组交易记录。
账户
- 定义:以太坊中有两种类型的账户:外部账户(EOA)和合约账户。
- 外部账户:由用户控制,通过私钥签名交易。
- 合约账户:由智能合约代码控制,可以执行预定义的逻辑。
共识机制
工作量证明(Proof of Work, PoW)
- 定义:通过计算复杂的数学问题来生成新区块,确保网络的安全性和一致性。
- 过程:
- 交易收集:矿工收集未确认的交易,形成一个新的区块。
- 哈希计算:矿工通过不断改变区块头中的随机数(Nonce),寻找符合难度要求的哈希值。
- 区块广播:找到符合条件的哈希值后,矿工将新区块广播到网络中。
- 区块确认:其他节点验证新区块的有效性,并将其添加到区块链中。
- 奖励分配:矿工获得区块奖励和交易费用。
权益证明(Proof of Stake, PoS)
- 定义:通过质押一定数量的代币来参与区块生成和验证,减少能源消耗。
- 过程:
- 质押:用户将一定数量的ETH质押到网络中,成为验证者。
- 区块提议:验证者按比例被选中,提议新区块。
- 区块验证:其他验证者对提议的区块进行验证。
- 区块确认:验证通过后,新区块被添加到区块链中。
- 奖励分配:验证者获得区块奖励和交易费用。
智能合约
定义
- 智能合约:运行在以太坊虚拟机(EVM)上的自动化合约,可以执行预定义的逻辑。
- 编程语言:以太坊的主要智能合约编程语言是Solidity,类似于JavaScript。
编译和部署
- 编译:智能合约需要编译成字节码,然后部署到以太坊网络上。
- 部署:通过发送一笔特殊的交易,将智能合约的字节码部署到以太坊网络中,生成合约地址。
调用
- 调用方法:用户可以通过发送交易来调用智能合约的方法。
- Gas:执行智能合约操作所需的费用,以太坊网络中的交易需要消耗Gas。
以太坊虚拟机(EVM)
定义
- EVM:一个沙盒环境,负责执行智能合约代码。
- 特点:图灵完备,支持多种编程语言,隔离性强,确保智能合约的安全执行。
运行机制
- 字节码执行:EVM将智能合约的字节码逐条执行,每条指令消耗一定的Gas。
- 状态管理:EVM维护一个全局状态,记录所有账户的余额、合约代码等信息。
Gas
- 定义:执行智能合约操作所需的费用,以太坊网络中的交易需要消耗Gas。
- 作用:防止恶意攻击,确保网络的稳定性和安全性。
交易和区块的生命周期
交易的生命周期
- 创建:用户创建一笔交易,包含发送方地址、接收方地址、金额、数据字段等信息。
- 签名:用户使用私钥对交易进行签名,确保交易的完整性和不可否认性。
- 广播:用户将签名后的交易广播到以太坊网络中。
- 验证:节点验证交易的有效性,包括签名、余额等。
- 打包:矿工将验证通过的交易打包到新的区块中。
- 确认:其他节点验证新区块的有效性,并将其添加到区块链中。
- 执行:EVM执行交易中的智能合约代码,更新全局状态。
区块的生命周期
- 交易收集:矿工收集未确认的交易,形成一个新的区块。
- 哈希计算:矿工通过不断改变区块头中的随机数(Nonce),寻找符合难度要求的哈希值。
- 区块广播:找到符合条件的哈希值后,矿工将新区块广播到网络中。
- 区块验证:其他节点验证新区块的有效性,包括交易的有效性、哈希值等。
- 区块确认:验证通过后,新区块被添加到区块链中。
- 奖励分配:矿工获得区块奖励和交易费用。
以太坊网络架构解析
P2P网络
- 定义:以太坊使用Kademlia DHT(分布式哈希表)协议,实现节点之间的通信和数据共享。
- 节点类型:
- 全节点:存储完整的区块链数据,参与区块验证和交易处理。
- 轻节点:只存储部分区块链数据,依赖全节点进行交易验证。
- 归档节点:存储完整的区块链数据和历史状态,用于历史数据查询。
数据层
- 区块链:记录所有交易历史,确保数据的不可篡改性和透明性。
- 状态树:记录当前网络的状态,包括账户余额、合约代码等。
- 交易池:未被确认的交易暂时存储在这里,等待矿工处理。
共识层
- 工作量证明(PoW):当前主要的共识机制,通过计算复杂的数学问题来生成新区块。
- 权益证明(PoS):未来的共识机制,通过质押ETH来参与区块生成和验证。
应用层
- 智能合约:运行在EVM上的自动化合约,可以执行预定义的逻辑。
- 去中心化应用(DApps):基于以太坊构建的应用程序,可以是金融、游戏、社交等各种类型。
以太坊2.0
目标
- 提高可扩展性:通过分片(Sharding)技术,将网络分成多个子网络,提高交易处理能力。
- 提高安全性:通过权益证明(PoS)机制,减少能源消耗,提高网络的安全性。
- 提高可持续性:通过优化共识机制和网络架构,降低运营成本,提高网络的可持续性。
技术路线
- 阶段0:信标链(Beacon Chain)上线,引入权益证明(PoS)机制。
- 阶段1:分片链(Shard Chains)上线,提高交易处理能力。
- 阶段2:实现EVM的升级,支持更多的编程语言和更复杂的智能合约。
以太坊的共识机制:PoW vs PoS
工作量证明(Proof of Work, PoW)
定义
- PoW:通过计算复杂的数学问题来生成新区块,确保网络的安全性和一致性。
工作流程
- 交易收集:矿工收集未确认的交易,形成一个新的区块。
- 哈希计算:矿工通过不断改变区块头中的随机数(Nonce),寻找符合难度要求的哈希值。
- 区块广播:找到符合条件的哈希值后,矿工将新区块广播到网络中。
- 区块验证:其他节点验证新区块的有效性,并将其添加到区块链中。
- 奖励分配:矿工获得区块奖励和交易费用。
优点
- 安全性高:攻击者需要拥有超过50%的算力才能成功攻击网络。
- 去中心化:任何人都可以参与挖矿,无需许可。
缺点
- 能源消耗大:计算哈希值需要大量的计算资源,导致能源浪费。
- 扩展性差:区块生成速度受限于计算能力,难以支持大规模交易。
权益证明(Proof of Stake, PoS)
定义
- PoS:通过质押一定数量的代币来参与区块生成和验证,减少能源消耗。
工作流程
- 质押:用户将一定数量的ETH质押到网络中,成为验证者。
- 区块提议:验证者按比例被选中,提议新区块。
- 区块验证:其他验证者对提议的区块进行验证。
- 区块确认:验证通过后,新区块被添加到区块链中。
- 奖励分配:验证者获得区块奖励和交易费用。
优点
- 能源消耗低:不需要大量计算资源,减少了能源浪费。
- 扩展性好:区块生成速度不受计算能力限制,可以支持更多交易。
- 安全性高:攻击者需要持有大量代币,增加了攻击成本。
缺点
- 中心化风险:持有大量代币的用户可能控制网络,导致中心化。
- 无利害关系问题:验证者可能不关心网络的安全性,因为他们的损失相对较小。
以太坊虚拟机(EVM)深入解析
定义
- EVM:一个沙盒环境,负责执行智能合约代码。它是图灵完备的,支持多种编程语言,确保智能合约的安全执行。
运行机制
字节码执行
- 字节码:智能合约编译后的二进制代码。
- 执行:EVM将智能合约的字节码逐条执行,每条指令消耗一定的Gas。
状态管理
- 全局状态:EVM维护一个全局状态,记录所有账户的余额、合约代码等信息。
- 状态树:使用Merkle Patricia Trie(MPT)数据结构,高效地存储和查询状态信息。
Gas
- 定义:执行智能合约操作所需的费用,以太坊网络中的交易需要消耗Gas。
- 作用:防止恶意攻击,确保网络的稳定性和安全性。
内存模型
- 内存:临时存储数据,每次交易结束后清空。
- 存储:永久存储数据,保存在区块链上。
- 栈:用于存储临时变量和操作数,最大深度为1024。
指令集
- 基本指令:如加法、减法、乘法等。
- 控制流指令:如跳转、条件分支等。
- 存储和内存操作指令:如读取、写入等。
以太坊的区块结构详解
区块概述
以太坊的区块是区块链的基本组成单位,每个区块包含一组交易记录,并通过哈希值与前一个区块相连,形成链式结构。区块的主要目的是记录和验证交易,确保网络的一致性和安全性。
区块结构
区块头(Block Header)
区块头包含了一些元数据,用于验证区块的有效性和连接前后区块。区块头的主要字段包括:
parentHash
:前一个区块的哈希值,用于链接区块。sha3Uncles
:叔块的哈希值列表,用于奖励未能成功生成区块的矿工。miner
:生成该区块的矿工地址。stateRoot
:状态树的根哈希值,表示区块生成时的全局状态。transactionsRoot
:交易树的根哈希值,表示区块中的所有交易。receiptsRoot
:收据树的根哈希值,表示交易执行的结果。logsBloom
:布隆过滤器,用于快速查找日志。difficulty
:挖矿难度,用于调整挖矿难度。number
:区块高度,表示该区块在区块链中的位置。gasLimit
:区块的最大Gas限制,用于限制区块中交易的数量。gasUsed
:区块中所有交易消耗的总Gas。timestamp
:区块生成的时间戳。extraData
:额外数据,可以包含矿工的一些自定义信息。mixHash
:混合哈希值,用于PoW算法。nonce
:随机数,用于PoW算法。
区块体(Block Body)
区块体包含了一组交易记录和其他辅助数据。区块体的主要字段包括:
transactions
:区块中的所有交易列表。uncles
:叔块列表,用于奖励未能成功生成区块的矿工。
以太坊的交易流程解析
交易概述
以太坊中的交易是网络的基本操作单位,可以是转账、调用智能合约等。交易的主要目的是在区块链上记录和执行特定的操作。
交易结构
交易字段
nonce
:交易计数器,用于防止重放攻击。gasPrice
:每单位Gas的价格,以 wei 为单位。gasLimit
:交易的最大Gas限制。to
:接收方地址,如果为空则表示创建新合约。value
:交易金额,以 wei 为单位。data
:附加数据,用于调用智能合约方法或初始化新合约。v、r、s
:交易签名字段,用于验证交易的合法性。
交易流程
交易创建
- 创建交易:用户创建一笔交易,包含上述字段。
- 签名交易:用户使用私钥对交易进行签名,确保交易的完整性和不可否认性。
交易广播
- 广播交易:用户将签名后的交易广播到以太坊网络中。
- 交易池:交易被节点接收后,暂时存储在交易池中,等待矿工处理。
交易验证
- 验证交易:节点验证交易的有效性,包括签名、余额、Gas限制等。
- 选择交易:矿工从交易池中选择一批有效的交易,打包到新的区块中。
区块生成
- 生成区块:矿工通过计算哈希值生成新区块。
- 广播区块:矿工将新区块广播到网络中。
区块验证
- 验证区块:其他节点验证新区块的有效性,包括交易的有效性、哈希值等。
- 添加区块:验证通过后,新区块被添加到区块链中。
交易执行
- 执行交易:EVM执行交易中的智能合约代码,更新全局状态。
- 记录结果:交易执行的结果被记录在区块的收据中。
以太坊的Gas机制详解
Gas概述
Gas是以太坊网络中的一种计量单位,用于衡量执行交易或智能合约操作所需的计算资源。Gas机制的主要目的是防止恶意攻击,确保网络的稳定性和安全性。
Gas相关概念
Gas Limit
- 定义:交易的最大Gas限制,用于限制交易中可以执行的操作数量。
- 作用:防止交易执行无限循环或消耗过多资源。
Gas Price
- 定义:每单位Gas的价格,以 wei 为单位。
- 作用:用户可以通过设置更高的Gas价格来优先处理交易。
Gas Used
- 定义:交易实际消耗的Gas数量。
- 作用:用于计算交易费用。
Transaction Fee
- 定义:交易费用,等于Gas Used * Gas Price。
- 作用:支付给矿工的报酬,激励矿工处理交易。
Gas计算
基本操作
- 简单操作:如加法、减法等,消耗较少的Gas。
- 复杂操作:如存储、调用智能合约等,消耗较多的Gas。
存储操作
- 存储读取:读取存储中的数据,消耗较少的Gas。
- 存储写入:写入存储中的数据,消耗较多的Gas。
智能合约调用
- 内部调用:调用同一合约中的方法,消耗较少的Gas。
- 外部调用:调用其他合约中的方法,消耗较多的Gas。
Gas退款
- 定义:某些操作(如删除存储中的数据)会退还部分Gas。
- 作用:鼓励用户优化智能合约,减少资源消耗。
Gas限制
- 区块Gas限制:每个区块的最大Gas限制,用于限制区块中可以包含的交易数量。
- 交易Gas限制:每个交易的最大Gas限制,用于限制交易中可以执行的操作数量。
相关文章:

以太坊基础知识结构详解
以太坊的历史和发展 初创阶段 2013年:Vitalik Buterin 发表了以太坊白皮书,提出了一个通用的区块链平台,不仅支持比特币的货币功能,还能支持更复杂的智能合约。2014年:以太坊项目启动,进行了首次ICO&…...

安全见闻(完整版)
目录 安全见闻1 编程语言和程序 编程语言 函数式编程语言: 数据科学和机器学习领域: Web 全栈开发: 移动开发: 嵌入式系统开发: 其他: 编程语言的方向: 软件程序 操作系统 硬件设备…...

LeetCode100之反转链表(206)--Java
1.问题描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 示例1 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2 输入:head [1,2] 输出:[2,1] 示例3 输入:head [] 输…...

牛客周赛第一题2024/11/17日
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 时间限制:C/C/Rust/Pascal 1秒,其他语言2秒 空间限制:C/C/Rust/Pascal 256 M,其他语言512 M 64bit IO Format: %lld 题目描述 小红这天来到了三…...

麒麟Server下安装东方通TongLINK/Q
环境 系统:麒麟Server SP3 2403 应用:TLQ8.1(Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.17.0.tar.gz) 安装Server 将文件解压到/usr/local/tlq。 cd /opt/tlq/ mkdir /usr/local/tlq/ tar -zxvf Install_TLQ_Standard_Linux2.6.32_x86_64_8.1.1…...

BERT的中文问答系统33
我们在现有的代码基础上增加网络搜索的功能。我们使用 requests 和 BeautifulSoup 来从百度搜索结果中提取信息。以下是完整的代码,包括项目结构、README.md 文件以及所有必要的代码。 项目结构 xihe241117/ ├── data/ │ └── train_data.jsonl ├── lo…...

Ubuntu下的Eigen库的安装及基本使用教程
一、Eigen库介绍 简介 Eigen [1]目前最新的版本是3.4,除了C标准库以外,不需要任何其他的依赖包。Eigen使用的CMake建立配置文件和单元测试,并自动安装。如果使用Eigen库,只需包特定模块的的头文件即可。 基本功能 Eigen适用范…...

【spring 】Spring Cloud Gateway 的Filter学习
介绍和使用场景 Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关,它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中,Filter 扮演着非常重要的角色&#…...

每秒交易数(Transactions Per Second:TPS)详细拆解
每秒交易数(TPS)是指计算机网络每秒可以处理的交易数量。TPS是衡量不同区块链和其他计算机系统速度的关键指标。然而,TPS并不是用来衡量区块链速度的唯一指标。许多人认为,虽然TPS很重要,但最终性实际上是一个更重要的…...

【初阶数据结构与算法】链表刷题之链表分割、相交链表、环形链表1、环形链表I、环形链表II
文章目录 一、链表分割二、相交链表三、环形链表I四、环形链表|| 一、链表分割 题目链接:https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70 我们来看看链表分割的题目描述和它给出的函数: 这个题虽然是以C形式来做࿰…...

【STL】set,multiset,map,multimap的介绍以及使用
关联式容器 在C的STL中包含序列式容器和关联式容器 1.关联式容器:它里面存储的是元素本身,其底层是线性序列的数据结构,比如:vector,list,deque,forward_list(C11)等 2.关联式容器里面储存的…...

新能源二手车交易量有望破百万,二手车市场回暖了吗?
这些年,伴随着新能源汽车市场的高速发展,各种新能源车的二手车也在逐渐增加,不过之前的二手车市场相对比较冷清,就在最近一则新闻传出新能源二手车交易量有望破百万,二手车市场这是回暖了吗? 一、新能源二手…...

哈佛商业评论 | 项目经济的到来:组织变革与管理革新的关键
在21世纪,项目经济(Project Economy)逐步取代传统运营,成为全球经济增长的核心动力。项目已不再是辅助工具,而是推动创新和变革的重要载体。然而,只有35%的项目能够成功,显示出项目管理领域存在巨大的改进空间。本文将详细探讨项目经济的背景、项目管理的挑战,以及适应…...

web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
如果你使用 window.open() 方法打开 PDF 文件,但浏览器不是预览而是下载文件,这可能是由于以下几个原因: 服务器配置:服务器可能将 PDF 文件配置为下载而不是预览。例如,服务器可能设置了 Content-Disposition 响应头…...

【GeekBand】C++设计模式笔记12_Singleton_单件模式
1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题, 但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…...

Pyhon基础数据结构(列表)【蓝桥杯】
a [1,2,3,4,5] a.reverse() print("a ",a) a.reverse() print("a ",a)# 列表 列表(list)有由一系列按照特定顺序排序的元素组成 列表是有顺序的,访问任何元素需要通过“下标访问” 所谓“下标”就是指元素在列表从左…...

Linux篇(权限管理命令)
目录 一、权限概述 1. 什么是权限 2. 为什么要设置权限 3. Linux中的权限类别 4. Linux中文件所有者 4.1. 所有者分类 4.2. 所有者的表示方法 属主权限 属组权限 其他权限 root用户(超级管理员) 二、普通权限管理 1. ls查看文件权限 2. 文件…...

深入理解 Spark 中的 Shuffle
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...

leetcode-8-字符串转整数
题解: 代码:...

SQL注入注入方式(大纲)
SQL注入注入方式(大纲) 常规注入 通常没有任何过滤,直接把参数存放到SQL语句中。 宽字节注入 GBK 编码 两个字节表示一个字符ASCII 编码 一个字节表示一个字符MYSQL默认字节集是GBK等宽字节字符集 原理: 设置MySQL时错误配置…...

OpenCV基础(1)
1.图像读写与窗口显示 1.1.imread读取图像文件 Mat cv::imread(const string &filename,int flags IMREAD_COLOR); filename:要读取的图像文件名flags:读取模式,可以从枚举cv::ImreadModes中取值,默认取值是IMREAD_COLOR&am…...

【freertos】FreeRTOS信号量的介绍及使用
FreeRTOS信号量 一、概述二、PV原语三、函数接口1.创建一个计数信号量2.删除一个信号量3.信号量释放4.在中断释放信号量5.获取一个信号量,可以是二值信号量、计数信号量、互斥量。6.在中断获取一个信号量,可以是二值信号量、计数信号量7.创建一个二值信号…...

React Native 全栈开发实战班 - 图片加载与优化
在移动应用中,图片加载与优化 是提升用户体验和减少资源消耗的重要环节。图片加载不当可能导致应用卡顿、内存泄漏甚至崩溃。本章节将介绍 React Native 中常用的图片加载方法,包括 Image 组件的使用、第三方图片加载库(如 react-native-fast…...

Golang云原生项目:—实现ping操作
熟悉报文结构 ICMP校验和算法: 报文内容,相邻两个字节拼接到一起组成一个16bit数,将这些数累加求和若长度为奇数,则将剩余一个字节,也累加求和得出总和之后,将和值的高16位与低16位不断求和,直…...

mysql如何查看当前事务的事务id
-- 开启一个事务,但不执行写操作 START TRANSACTION; -- 查询 InnoDB 事务信息 SELECT * FROM information_schema.innodb_trx;在 MySQL 的 MVCC (多版本并发控制) 中,事务 ID (Transaction ID) 是由 InnoDB 存储引擎分配的,它的分配机制与事…...

在linux里如何利用vim对比两个文档不同的行数
在Linux中,可以使用vimdiff命令来对比两个文档中不同的行。首先确保你的系统中安装了vim编辑器。 打开终端,使用以下命令来启动vimdiff: vimdiff file1 file2 这里file1和file2是你想要对比的两个文件的路径。 vimdiff会以并排方式打开两…...

深入解析Python中的逻辑回归:从入门到精通
引言 在数据科学领域,逻辑回归(Logistic Regression)是一个非常重要的算法,它不仅用于二分类问题,还可以通过一些技巧扩展到多分类问题。逻辑回归因其简单、高效且易于解释的特点,在金融、医疗、广告等多个…...

【数据库】mysql数据库迁移前应如何备份数据?
MySQL 数据库的备份是确保数据安全的重要措施之一。在进行数据库迁移之前,备份现有数据可以防止数据丢失或损坏。以下是一套详细的 MySQL 数据库备份步骤,适用于大多数情况。请注意,具体的命令和工具可能因 MySQL 版本的不同而有所差异。整个…...

C语言——鸡兔同笼问题
没注释的源代码 #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int tou 10; i…...

数据结构王道P234第二题
#include<iostream> using namespace std; int visit[MAxsize]; int color[MaxSize];//1表示红,2表示白; bool dfs(Graph G, int i){visit[i]1;ArcNode *p;bool flag1;for(pG.vertices[i].firsrarc; p ; pp->next){int jp->adjvex;if(!visi…...