以太坊入门
1. 以太坊简介
Vitalik Buterin 在 2013 年 11 月提出了以太坊的概念,其关键思想是:开发一种图灵完备(Turing-Complete) 的语言,以允许开发用于区块链和去中心化应用的任意程序(智能合约)。该概念与比特比相反,因为后者的脚本语言本质上是受限制的,并且仅允许进行必要的操作。
下表显示了以太坊从第一个版本到计划的最终版本在内的所有版本。
版本 | 发布日期 |
Olympic(奥林匹克) | 2015 年 5 月 |
Frontier(前沿) | 2015 年 7月 |
Homestead(家园) | 2016 年 3月 |
Metropolis (大都会) Byzantine (拜占庭,大都会的第一阶段) | 2017 年 10 月 |
Constantinople(君士坦丁堡,大都会的第二阶段) | 2019 年 3 月 |
Serenty(宁静,以太坊最终版) | 即将发布 |
以太坊的第一个版本为 Olympic (奥林匹克),于 2015 年 5 月发布。
大约两个月后,即 2015 年 7 月,以太坊的一个名为 Frontier (前沿)的版本发布。
2016 年 3 月,发布了具有改进功能的名为 Homestead (家园) 的版本。
2017 年 10 月,Byzantium (拜占庭)版本发布,这是 Metropolis (大都会) 版本的第一阶段。此版本于 2017 年 10 月在区块高度为 4370000 的区块上实施了 Constantinople (君士坦丁堡)硬分叉,这也是 Metropolis 版本的第二阶段。
2019 年 3 月,以太坊网络在区块高度为 708000 的区块上实施了 Constantinople(君士坦丁堡)硬分叉,这也是 Metropolis 版本的第二阶段。
以太坊的最终计划发行版本称为 Serenity (宁静),它将计划引入基于 PoS 的最终版本而不是 PoW。
在以太坊黄皮书中已经描述了以太坊的正式规范,该规范可用于开发以太坊实现。现在我们就来认识一下这个黄皮书。
1.1 黄皮书
以太坊黄皮书由 Ethereum & Parity 公司创始人 Gavin Wood 博士撰写,并作为以太坊协议的正式定义。任何人都可以通过遵循该黄皮书定义的协议规范来实现以太坊客户端。其网址如下:
https://ethereum.github.io/yellowpaper/paper.pdf
尽管普通人阅读该黄皮书可能有些挑战,尤其是对于没有代数或数学背景并且不熟悉数学符号的读者来说,想要全面理解可能需要多做功课,但它包含了以太坊的完整、正式规范,该规范可用于实现完全兼容的以太坊客户端。
下面将提供该黄皮书中所有符号及其含义的列表,以帮助你更轻松地阅读以太坊黄皮书。在理解了这些符号的含义之后,就能轻松理解该黄皮书所描述的概念和规范。
1.2 有用的数学符号
1.3 以太坊区块链
就像其他任何区块链一样,以太坊区块链可以可视化为基于交易的状态机。Gavin Wood 博士在以太坊黄皮书中提到了这个定义。其核心思想是:在以太坊区块链中,通过逐步执行交易,将初始状态转换为最终状态,然后将最终转换后的状态作为绝对无可争议的版本。
在下图中,显示了以太坊状态转换函数,其中交易的执行已导致状态转换。
原文 | 译文 | 原文 | 译文 |
INITAL STATE | 初始状态 | FINAL STATE | 最终状态 |
TRANSACTION | 交易 |
在上图中,启动了两个以太坊从地址 4718bf7a 到地址 741f7a2 的转移。初始状态表示交易执行之前的状态,而最终状态则表示交易执行之后的状态。
状态将作为世界状态(World State) 存储在以太坊网络上,这也称为以太坊区块链的全球状态(Global State)。
2. 从用户角度观察以太坊
下面将从用户的角度了解以太坊的工作方式。为此,我们将介绍最常见的转帐示例。
在本示例中,将从一个用户(刘玄德)转帐到另一个用户(张翼德)。我们将使用两个以太坊客户端,一个用于汇款,另一个用于接收汇款。此过程涉及以下步骤:
(1)转帐双方都可以发起操作。收款人可以通过将请求发送给付款人来要求转帐,付款人也可以直接决定将钱款发送给收款人。
收款人发起请求时,可以将收款人的以太坊地址发送给付款人。例如,有两个用户(刘玄德和张翼德),如果张翼德粮草不足,要求刘玄德付款,则可以使用二维码将请求发送给刘玄德。刘玄德收到此请求后,将扫描二维码或手动输入张翼德的以太坊地址,然后将以太币发送到张翼德的以太坊地址。该请求被编码为如下图所示的二维码
原文 | 译文 |
Tap to copy this address.Share it with the sender via email or text. | 点击以复制此地址。可通过电子邮件或短信与发送者(付款人)共享 |
可以通过电子邮件、文本或任何其他通信方式共享。Jaxx 钱包的下载地址如下:https://jaxx.io
(2)一旦刘玄德收到此请求,他将扫描二维码或在以太坊钱包软件中复制以太坊地址并启动交易,如下图所示
其中,iOS 上的 Jaxx Ethereum 钱包软件用于向张翼德汇款。该图还显示,刘玄德已输入了用于发送以太币的金额和目标地址。在发送以太币之前,最后一步是确认(Confirm)交易。
(3)一旦在钱包软件中构造了汇款请求(交易),它将被广播到以太坊网络。交易由发送方(刘玄德)进行数字签名,以证明他是该以太币的所有者。
(4)该交易由以太坊网络上称为矿工的节点进行拾取,以进行验证并将其包含在区块中。在此阶段,交易仍未确认。
(5)一旦被验证并包含在区块中,PoW 过程就会开始。
(6)一旦矿工找到了 PoW 问题的答案(通过使用新的随机数重复对区块进行哈希处理),则该区块将立即被广播到其余节点,然后其他节点将验证该区块和 PoW。
(7)如果所有验证都通过,则此区块将添加到区块链中,并相应地向矿工支付奖励。
(8)张翼德得到以太币,并在他的钱包软件中显示出来,如下图所示:
在区块链上,此交易由以下交易哈希标识:
0xc63dce674e1640abd63ee63027c3352aed8cdb92b6a02ae25225666e171009e |
可以在 https://etherscan.io/ 的区块浏览器中查看有关该交易的详细信息,如下图所示。
在上述示例中,我们完成了最常见的以太坊网络操作,即将以太币从一个用户转帐到另一个用户。本示例只是对交易过程的大致介绍,目的是让你形成对以太币交易的粗略概念。
3. 以太坊网络
和比特币网络一样,以太坊网络也是一个点对点网络,节点参与其中以维护区块链并促进共识机制。根据需求和使用情况,以太网络可以分为 3 种类型:主网、测试网络和私有网络。
3.1 主网
主网(Mainnet) 是以太坊当前的实时网络。主网的当前版本为 Byzantium(Metropolis),其链 ID 为1。链 ID 用于标识网络,可以使用以太坊浏览器探索以太坊区块链。
3.2 测试网络
以太坊的测试网络(Testnet) 也称为 Ropsten,是以太坊区块链广泛使用的测试网络。该测试区块链用于在部署到生产实时区块链之前测试智能合约和 DApp。此外,作为测试网络,它也可以进行实验和研究。
主测试网络称为 Ropsten,其中包含针对特定版本创建的其他较小和专用测试网络的所有功能。其他的测试网络包括测试拜占庭版本而开发的 Kovan 和 Rinkeby。在这些较小的测试网络上实现的更改也已在 Ropsten 上实现。现在,Ropsten 测试网络包含 Kovan 和 Rinkeby 的所有属性。
3.3 私有网络
私有网,顾名思义就是可以通过生成新的创世区块而创建的私有网络(Private Net)。在私有区块链分布式帐本网络中通常就是这种情况,在该类网络中,一组私有实体启动其区块链并将其用作许可的区块链。
下表显示了以太坊网络及其网络 ID 的列表,这些网络 ID 被以太坊客户端用来标识网络。
网络名称 | 网络ID/链 |
以太坊主网 | 1 |
Morden | 2 |
Ropsten | 3 |
Rinkeby | 4 |
Kovan | 42 |
经典以太坊主网 | 61 |
4. 以太坊生态系统的组成部分
以太坊区块链堆栈包含多个组成部分。
首先,其核心是在对等以太坊网络上运行的以太坊区块链。
其次,有一个运行在节点上的以太坊客户端(通常是 Geth)。客户端连接到点对点以太坊网络,从该网络下载区块链并存储在本地。它提供了各种功能,例如挖矿和帐户管理。区块链的本地副本定期与网络同步。
还有一个组件是 web3.js 库,该库允许通过远程过程调用(Remote Procedure Call,RPC)接口与 geth 客户端进行交互。
下图显示了以太坊显示的架构。
原文 | 译文 |
WEB3 OR CUSTOM INTERFACE | web3 或自定义接口 |
RPC | 远程过程调用(RPC) |
ETHEREUM CLIENT | 以太坊客户端 |
LOCAL BLOCK CHAIN | 本地区块链 |
Synced with main network | 与主网同步 |
以下是以太坊区块链中所有高级元素的正式列表:
- 密钥和地址
- 帐户
- 交易和消息
- 以太坊加密货币/代币
- 以太坊虚拟机(EVM)
- 智能合约
5. 交易和消息
以太坊中的交易是使用私钥进行数字签名的数据包,其中包含的指令在完成后会导致消息调用或合约创建.
交易可以根据它们产生的输出又分为以下两种类型:
- 消息调用交易。此交易仅产生一个消息调用,该消息调用用于将消息从一个合约帐户传递到另一个合约帐户.
- 合约创建交易。合约创建交易,顾名思义就是交易导致创建新的合约帐户.这意味着,成功执行此交易后,它将创建一个具有关联代码的帐户。
下图对此结构进行了可视化处理,
5.3 消息
在下图中,显示了两种类型的交易(合约创建和消息调用)之间的区别。
6. 以太坊区块链中的状态存储
从根本上讲,以太坊区块链是一种由交易和共识驱动的状态机。状态需要永久存储在区块链中。为此,世界状态、交易和交易收据都将以区块的形式存储在区块链上。
下图显示了世界状态以及它与帐户字典树、帐户和区块标头之间的关系。
下图显示了交易收据的生成过程。
7. 以太币
作为对矿工的激励,以太坊会发放它自己的货币,也就是以太币.
在 DAO 遭到入侵后,提出了一个硬分叉来解决该问题。现在出现了两个以太坊区块链:一是经典以太坊(Ethereum Classic) ,其货币以 ETC 表示; 二是硬分叉版本的代币 ETH,它将继续增长并且正在积极地进行开发。
8. 以太坊虚拟机
以太坊虚拟机是一个简单的基于堆栈的执行机,它运行字节码指令以将系统状态从一种状态转换为另一种状态。虚拟机的字长设置为 256 位。堆栈大小限制为 1024 个元素,并且基于后进先出(Last In,First Out,LIFO)队列。
下图显示了 EVM 的设计。
执行环境可以可视化为包含 10 个元素的元组,如下图所示。
8.3 迭代器函数
机器状态可以看作是一个元组,如下图所示
相关文章:

以太坊入门
1. 以太坊简介 Vitalik Buterin 在 2013 年 11 月提出了以太坊的概念,其关键思想是:开发一种图灵完备(Turing-Complete) 的语言,以允许开发用于区块链和去中心化应用的任意程序(智能合约)。该概念与比特比相…...
秃姐学AI系列之:实战Kaggle比赛:狗的品种识别(ImageNet Dogs)
目录 前置准备 整理数据集 图片增广 读取数据集 微调预训练模型 训练函数 训练和验证模型 Kaggle提交结果 前置准备 常规导包 import os import torch import torchvision from torch import nn from d2l import torch as d2l 使用小规模数据样本 d2l.DATA_HUB[dog…...

图神经网络介绍3
1. 图同构网络:Weisfeiler-Lehman 测试与图神经网络的表达力 本节介绍一个关于图神经网络表达力的经典工作,以及随之产生的另一个重要的模型——图同构网络。图同构问题指的是验证两个图在拓扑结构上是否相同。Weisfeiler-Lehman 测试是一种有效的检验两…...
浅谈 React Fiber
想象一下,你正在搭建一个乐高积木城堡。 传统的搭建方式:一次性把所有积木拼好,如果中途发现某个地方拼错了,就需要拆掉重新拼。这个过程就像 React 15 之前的版本,一旦开始渲染,就很难中断,效…...

Winform实现石头剪刀布小游戏
1、电脑玩家类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace RockScissorsClothApp {public class Computer{public Card Play(){Random random new Random();int num random.Next(0, 3…...

计算机的错误计算(九十)
摘要 计算机的错误计算(八十九)探讨了反双曲余切函数 acoth(x)在 附近的计算精度问题。本节讨论绝对值为大数的反双曲余切函数值的计算精度问题。 Acoth(x) 函数的定义为: 其中 x 的绝对值大于 1 . 例1. 计算 acoth(1.000000000002e15) .…...
对游戏语音软件Oopz遭遇DDoS攻击后的一些建议
由于武汉天气太热,因此周末两天就没怎么出门。一直在家打《黑神话:悟空》,结果卡在广智这里一直打不过去,本来想找好友一起讨论下该怎么过,但又没有好的游戏语音软件。于是在网上搜索了一些信息,并偶然间发…...
解锁Android开发利器:MVVM架构_android的mvvm
// 从网络或其他数据源获取天气数据return Weather(city, "25C") }} 2.定义View:class WeatherActivity : AppCompatActivity() { private lateinit var viewModel: WeatherViewModel override fun onCreate(savedInstanceState: Bundle?) {super.onCre…...
llama.cpp demo
git clone https://github.com/ggerganov/llama.cpp cd llama.cpp 修改Makefile使能mfma参数 MK_CFLAGS -mfma -mf16c -mavx MK_CXXFLAGS -mfma -mf16c -mavx 安装python3依赖 cat ./requirements/requirements-convert_legacy_llama.txt numpy~1.26.4 sentencepie…...

OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到一个包围输入的二维点集的最小面积旋转矩形。 该函数计算并返回指定点集的最小面积边界矩形(可能是旋转的)。开发者…...

[SWPU2019]Web1 超详细教程
老规矩先看源码,没找到啥提示,后面就是登录口对抗 弱口令试了几个不行,就注册了个账户登录进去 可以发布广告,能造成xss,但是没啥用啊感觉 查看广告信息的时候,注意到url当中存在id参数,可能存…...
【区块链通用服务平台及组件】基于向量数据库与 LLM 的智能合约 Copilot
智能合约是自动执行、无需信任的代码,可以在区块链上运行,确保了数据和程序的透明性和不可篡改性。然而, 智能合约的编写、调试和优化仍然是一个具有挑战性的过程,因为它需要高度的技术专长,且发布后的智能合约代码通常…...

mfc140u.dll丢失有啥方法能够进行修复?分享几种mfc140u.dll丢失的解决办法
你是否曾遇到过这样的情况:当你满怀期待地打开一个应用程序时,却被一个错误提示拦住了去路,提示信息中指出 mfc140u.dll 文件丢失。这个问题可能会让你感到困惑和无助,但是不要担心,本文将为你详细解读 mfc140u.dll 丢…...

【PyQt6 应用程序】在用户登录界面实现密码密文保存复用
在开发现代应用程序中,为用户提供既安全又便捷的登录体验是至关重要的。特别是在那些需要用户认证的应用中,实现一个功能丰富且用户友好的登录界面不仅能增强用户满意度,还能提升整体的安全性。基于PyQt6框架和QtDesigner,本文将展示如何在已有的用户登录页面基础上,进一步…...
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践 AI 语音交互大模型其实有两种主流的做法: All in LLM多个模块组合, ASR+LLM+TTS实际应用中,这两种方案并不是要对立存在的,像永劫无间这种游戏的场景,用户要的是低延迟,无障碍交流。并且能够触发某些动作技…...

游戏论坛网站|基于Springboot+vue的游戏论坛网站系统游戏分享网站(源码+数据库+文档)
游戏论坛|游戏论坛系统|游戏分享网站 目录 基于Springbootvue的游戏论坛网站系统游戏分享网站 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…...

【go】pprof 性能分析
前言 go pprof是 Go 语言提供的性能分析工具。它可以帮助开发者分析 Go 程序的性能问题,包括 CPU 使用情况、内存分配情况、阻塞情况等。 主要功能 CPU 性能分析 go pprof可以对程序的 CPU 使用情况进行分析。它通过在一定时间内对程序的执行进行采样࿰…...

Python | Leetcode Python题解之第397题整数替换
题目: 题解: class Solution:def integerReplacement(self, n: int) -> int:ans 0while n ! 1:if n % 2 0:ans 1n // 2elif n % 4 1:ans 2n // 2else:if n 3:ans 2n 1else:ans 2n n // 2 1return ans...

JDBC使用
7.2 创建JDBC应用 7.2.1 创建JDBC应用程序的步骤 使用JDBC操作数据库中的数据包括6个基本操作步骤: (1)载入JDBC驱动程序: 首先要在应用程序中加载驱动程序driver,使用Class.forName()方法加载特定的驱动程序…...
633. 平方数之和-LeetCode(C++)
633. 平方数之和 2024.9.11 题目 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 b2 c 。 0 < c < 2的31次方 - 1 示例 示例 1: 输入:c 5 输出:true 解释:1 * 1 2 * 2 5示…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...