以太坊虚拟机EVM介绍,智能合约详解

以太坊为例:什么是智能合约?智能合约怎么部署、调用、执行?智能合约的原理?智能合约存在哪儿?如何区分调用的是智能合约?世界状态数据库、EVM、智能合约它们之间的关系?

什么是智能合约

指的是“一套以数字形式指定的承诺,包括合约参与方可以在上面执行这些承诺的协议”。早在1994年,美国计算机科学家尼克·萨博(Nick Szabo)就提出了智能合约的概念。

智能合约是一种基于区块链技术的自动执行合约的计算机程序。它们是一组以代码形式编写的、在区块链上运行的规则和逻辑。智能合约定义了在满足特定条件时应该执行的操作,而无需中介方的干预。

以太坊是最为著名的支持智能合约的区块链平台之一。在以太坊中,智能合约是用一种称为Solidity的编程语言编写的。这些合约代码被部署到以太坊区块链上,并由全网节点验证执行。智能合约的执行结果和状态存储在区块链上,确保了透明性和不可篡改性。

智能合约可以执行各种任务,包括但不限于转移数字货币,管理数字身份,执行投票和投资等。由于其自动执行和透明的特性,智能合约在去除信任第三方的同时提供了更多的安全性。

智能合约怎么部署、执行

拿以太坊来说,可以在以太坊虚拟机EVM中部署和调用智能合约。
在以太坊上,合约的执行是通过向合约地址发送交易来触发的。合约地址是由合约创建者的地址和创建者账户的 nonce 生成的,所以在区块链上唯一标识一个合约。

执行合约的过程如下:

  1. 创建合约: 首先,有人(创建者)通过发送一个特殊的交易(称为合约创建交易)来部署合约。这个交易包含了合约的字节码(即合约的编译后的代码)以及其他必要的参数。在这个交易中,创建者将以太币(ETH)发送到合约地址,作为合约的初始资金。

  2. 合约创建交易: 这个合约创建交易被广播到整个以太坊网络,并被矿工包含在一个区块中。

  3. 区块链确认: 矿工通过执行交易中的合约字节码来创建新的区块。这就是合约在以太坊网络中的创建过程。

  4. 触发合约: 一旦合约被创建,任何人都可以通过向合约地址发送交易来调用合约。这个交易中包含了调用合约的数据,也就是要执行的合约函数及其参数。

  5. 合约执行: 当这个交易被矿工打包并写入区块链后,以太坊网络中的每个节点都会执行合约的字节码,模拟合约的执行过程。这确保了所有节点都达成相同的结果。

通过这种方式,合约的执行是通过向合约地址发送交易并将要执行的数据包含在交易中来触发的。以太坊网络的节点根据交易中的数据,按照合约的逻辑执行相应的操作。

智能合约的原理

智能合约与区块链框架图
在上面的图中展示了智能合约的结构,它一般具有“值”和“状态”两个属性,代码中用If-Then和What-If语句预置了合约条款的相应触发场景和响应规则。智能合约经多方共同协定、各自签署后随用户发起的交易(transaction,Txn)提交,经P2P网络传播、矿工验证后存储在区块链特定区块中。用户得到返回的合约地址及合约接口等信息后即可通过发起交易来调用合约。“矿工”受系统预设的激励机制激励,将贡献自身算力来验证交易。

“矿工”收到合约创建或调用交易后在本地沙箱执行环境(如以太坊虚拟机)中创建合约或执行合约代码,合约代码根据可信外部数据源[也称为预言机(Oracle Machines)]和世界状态的检查信息自动判断当前所处场景是否满足合约触发条件以严格执行响应规则并更新世界状态。交易验证有效后被打包进新的数据区块。新区块经共识算法认证后链接到区块链主链,所有更新生效。

以太坊虚拟机EVM

EVM是一个计算引擎,有助于智能合约的部署和操作。没有EVM,就不可能在以太坊协议上执行软件程序。因此,EVM是以太坊核心架构的关键部分。

虚拟机

虚拟机是模拟物理计算机行为的程序。虚拟机有它的存储和处理单元,在你的电脑上作为进程运行。这有点像一台电脑在另一台电脑上运行。

虚拟机类似于普通的Windows或MacOS软件。这里的区别在于虚拟机被设计为执行更高级的功能。此外,与常规操作系统不同,虚拟机无法访问计算机的其他部分,如存储或带宽。

如果你使用模拟器在PC上玩过Android游戏,那么虚拟机可能很熟悉。虽然模拟器和虚拟机有很大不同,但它们都接近硬件的能力,可以在“Sandbox(沙盒)”环境中执行代码。

图灵完备性

英国数学家艾伦·图灵(Alan Turing)发明了第一台图灵机器,它是当今计算机的先驱。只要有足够的时间和资源,图灵整机可以处理任何计算,无论多么复杂。

现在,让我们将这些想法结合起来,定义以太坊虚拟机:

以太坊虚拟机(EVM)是一个巨大的虚拟机,允许部署和执行代码。您只需安装必要的客户端软件即可访问EVM,并使用它在以太坊上执行程序。本质上,EVM充当“世界计算机”,在分散的环境中执行软件操作。

由于没有集中控制,EVM由几个个人/公司维持,这些个人/公司向系统提供计算能力,以换取奖励。因此,它有助于创建任何一方都无法单方面关闭的抗审查应用程序。

EVM是图灵完备的,因为它可以用于执行各种复杂度的计算。这就是以太坊与比特币的区别,因为比特币是图灵不完整的,限制了其功能。

比特币的主要功能是“分布式账本”,它规定了价值转移的规则。除了处理价值转移,以太坊(通过EVM)还支持智能合约的部署。因此,以太坊被描述为“分布式状态机”。

“State”(状态)是指在任何时间点有关系统的信息。在以太坊中,状态指的是特定时刻存在的地址、账户余额和智能合约代码。每个事务都会导致以太坊的状态发生变化(状态转换),这种变化会反映在整个网络中。

智能合约存在哪儿

在以太坊中,合约的代码并不一直存储在以太坊虚拟机(EVM)中。相反,合约的代码在合约被创建时被写入区块链,并存储在区块链的合约账户中。

当你部署一个合约时,一笔特殊的交易会被创建,其中包含合约的字节码(即合约的二进制表示)。这笔交易会触发区块链上的一个区块,其中包含了合约的创建,并在合约账户中存储了合约的字节码。

合约地址是通过合约创建者的地址和创建者账户的 nonce 计算得到的。这确保了合约地址在以太坊网络中的唯一性。

当你向一个合约地址发送交易时,以太坊节点会检查这个地址是否与合约地址匹配。如果匹配,以太坊节点将执行合约账户中存储的合约代码,并提供交易数据供合约执行。

合约账户

在以太坊中,合约账户的存储方式与普通账户有所不同。合约账户并不像普通账户那样关联着私钥和地址,而是关联着合约代码和存储空间。

合约账户的存储位置是以太坊的世界状态数据库中。以太坊使用类似数据库的结构来存储全网状态,其中包括账户余额、合约代码、合约存储数据等。这个数据库的每个状态都对应一个区块,因此以太坊的全网状态会随着每个区块的产生而更新。

具体而言,合约账户的数据存储在该账户的地址下。合约地址是由创建合约的交易的发送者地址和发送者账户的 nonce 值计算得到的。这个地址唯一地标识了一个合约账户,并在以太坊的世界状态数据库中存储了该合约的代码和数据。

需要注意的是,虽然合约账户的地址是由创建者和 nonce 计算得到的,但账户的私钥并不直接存在。私钥用于签署交易和控制账户,而合约账户没有私钥,其执行是由交易触发的,依赖于合约代码的逻辑。

世界状态数据库

在以太坊中,世界状态数据库是一个持久性的、全局的状态存储系统,用于跟踪和管理整个以太坊区块链网络上的账户和合约的状态信息。它的作用主要包括:

  1. 存储账户信息: 世界状态数据库存储了每个账户的当前余额、合约代码、合约存储数据等信息。

  2. 提供全局状态: 通过记录每个账户的状态,世界状态数据库提供了全局的区块链状态,反映了每个账户的当前情况。

  3. 支持智能合约: 智能合约是以太坊上的自动执行代码,合约的状态和数据存储在世界状态数据库中。这使得合约可以随着交易和区块的执行而改变状态。

  4. 存储区块链历史: 世界状态数据库还存储了区块链的历史状态,每个区块都对应一个状态。这使得可以回溯查看历史状态,验证交易的有效性。

原理:
世界状态数据库的原理涉及默克尔树和数据结构的设计。每个区块包含一个状态根,这个状态根是默克尔树的根节点,包含了所有账户状态的哈希值。当一个新的区块生成时,世界状态数据库会更新,新的状态被计算并存储,形成新的状态树。这确保了数据的不可篡改性和完整性。

通过采用默克尔树结构,以太坊实现了高效的状态变化和验证机制。当需要验证一个账户的状态时,只需检查相应的默克尔证明即可,而不需要遍历整个数据库。这样的设计在保持全局一致性的同时,提高了性能和可扩展性。

在以太坊中,每个节点都有自己的本地世界状态数据库。这是因为以太坊是一个分布式的区块链网络,每个节点都需要独立地维护和更新自己的状态数据库。每个节点都通过区块链网络接收和验证交易,执行智能合约,然后更新本地的世界状态。

尽管每个节点都有自己的本地状态数据库,但由于区块链的共识机制,最终每个节点都应该达到相同的共识状态。这就是分布式共识的核心概念:尽管每个节点可能从不同的出发点开始,但通过共识算法,最终它们将达到相同的状态,即相同的世界状态。这确保了整个网络的一致性。

如何区分我调用的是智能合约?

以太坊中,交易中包含一个称为 to 的字段,该字段指定了交易的接收者地址。如果 to 字段为 null 或未设置,那么这笔交易将被认为是一个合约创建交易。

当你发送一个交易给一个合约地址时,以太坊网络通过这个地址找到相应的合约,并执行合约中与交易数据相对应的函数。这是通过交易中的输入数据(称为 input data)来实现的。

合约的地址是由合约的创建者和创建者账户的 nonce 生成的,所以在区块链上是唯一的。当你向一个合约地址发送交易时,以太坊网络知道这个地址是一个合约地址,因此会执行与交易数据相对应的合约代码。

简而言之,以太坊知道你调用的是一个合约而不是一个简单的交易,主要是通过交易中的 to 字段和交易的输入数据。如果 to 字段指定了一个合约地址,以太坊网络就会执行该合约中与输入数据相对应的函数。

世界状态数据库、EVM、智能合约的关系

在以太坊中,世界状态数据库(World State)、EVM(Ethereum Virtual Machine)和智能合约之间有密切的关系。以下是它们之间的关系:

  1. EVM与智能合约:

    • 执行环境: EVM是以太坊的运行时环境,负责执行智能合约的字节码。
    • 智能合约代码: 智能合约是由开发者用 Solidity、Vyper 等语言编写的程序代码。这些代码被编译成EVM可执行的字节码。
  2. EVM与世界状态数据库:

    • 状态维护: EVM通过读取和更新世界状态数据库来维护智能合约的状态。
    • 状态读写: 在执行智能合约时,EVM可以读取状态世界数据库中的当前状态,并根据智能合约的执行结果更新这些状态。
  3. 世界状态数据库与智能合约:

    • 状态存储: 世界状态数据库是以太坊的全局数据库,存储了所有账户(包括用户账户和智能合约账户)的当前状态。
    • 智能合约状态: 智能合约的状态,包括变量值等信息,被存储在世界状态数据库中。每个智能合约都有一个唯一的地址,对应世界状态数据库中的一个条目。

综合而言,智能合约通过EVM执行,并在执行过程中读写世界状态数据库。EVM作为虚拟机执行智能合约的字节码,而世界状态数据库则负责存储智能合约和账户的当前状态。这三者的协同工作构成了以太坊上智能合约的执行和状态管理机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/235343.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab论文插图绘制模板第130期—函数曲面图

在之前的文章中,分享了Matlab函数折线图的绘制模板: 函数三维折线图: 函数网格曲面图: 进一步,再来分享一下函数曲面图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中&a…

新公众号没有留言功能怎么办?

为什么公众号没有留言功能?从2018年2月开始,新注册的微信公众号取消了留言功能,原因是为了规避一些营销号通过虚假留言骗取读者信任。不过大部分公众号运营者对TX此举感到失望,一方面大片的留言就像店前排队的顾客,能体…

Java - java.util.Date和java.sql.Date的区别

java.sql.Date是java.util.Date的子类 因此,两者都有getTime方法,java.sql.Date没有重写,返回long类型,即时间戳: the number of milliseconds since January 1, 1970, 00:00:00 GMT represented by this date. publ…

Git篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Git 中的“裸存储库”?二、Git 是用什么语言编写的?三、在Git中,你如何还原已经 push 并公开的提交?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文…

高仿B站视频网站系统源码 附带完整的搭建教程

现如今,视频分享网站逐渐成为人们休闲娱乐和学习知识的重要平台。B站作为中国最大的弹幕视频网站之一,以其独特的弹幕系统、丰富的内容和良好的用户体验赢得了广大用户的喜爱。然而,对于一些想要搭建自己的视频分享网站的用户来说&#xff0c…

Vue之数据绑定

在我们Vue当中有两种数据绑定的方法 1.单向绑定 2.双向绑定 让我为大家介绍一下吧&#xff01; 1、单向绑定(v-bind) 数据只能从data流向页面 举个例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

Springboot自定义start首发预告

Springboot自定义start首发预告 基于Springboot的自定义start , 减少项目建设重复工作, 如 依赖 , 出入参包装 , 日志打印 , mybatis基本配置等等等. 优点 模块化 可插拔 易于维护和升级 定制化 社区支持(后期支持) 发布时间 预告: 2023-12-10 预计发布: 2024-1-1 , 元旦首…

Landsat7_C2_SR数据集(大气校正地表发射率数据集)

Landsat7_C2_SR数据集是经大气校正后的地表反射率数据&#xff0c;属于Collection2的二级数据产品&#xff0c;空间分辨率为30米&#xff0c;基于Landsat生态系统扰动自适应处理系统&#xff08;LEDAPS&#xff09;&#xff08;版本3.4.0&#xff09;生成。水汽、臭氧、大气高度…

6.4 U-boot 移植

一、ST 官方 U-boot 编译测试 1. ST 官方 uboot 源码打补丁 1.1 获得 ST 官方的 uboot 源码 https://www.cnblogs.com/toutiegongzhu/p/17578847.html 这里可以看如何下载uboot源码。解压完后输入以下命令&#xff1a; cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/s…

05.仿简道云公式函数实战-扩展和自定义操作符和函数

1. 前言 在上一篇文章中我们学习了QLExpress的基础操作符和java对象的操作&#xff0c;通过大量的测试用例&#xff0c;我们学习了QLExpress的基础语法与使用&#xff0c;本篇文章&#xff0c;我们介绍使用QLExpress的进阶内容&#xff0c;主要知识点是扩展操作符和自定义操作…

基于SpringBoot实现的毕业设计管理系统

一、 系统架构 前端&#xff1a;html | jquery | vue 后端&#xff1a;springboot | thymeleaf | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 教务管理-控制台 03. 教务管理-选题管理-选题大厅 04. 教务管理-选题…

CS106L2023 and CS106B 环境配置(详细教程)

1.问题&#xff1a; &#xff08;1&#xff09;CS106L 运行./setup.sh 脚本时出错 &#xff08;windows 请下载git&#xff0c;在git bash 打开运行&#xff09; &#xff08;2&#xff09;CS106B&#xff0c;QT构建 构建错误&#xff1a;一般构建错误&#xff0c;例如 Erro…

数据护航:用过这款上海迅软DSE文件加密软件,你再也不用担心文件泄露

企业在业务发展过程中避免不了需要将一些重要文件外发给合作伙伴、代理商等情况&#xff0c;而这些外发出去的明文文件存在着巨大的泄密风险。因此迅软DSE文件加密软件结合文件加密功能及外发文件管控&#xff0c;实现对企业文件不同使用途径的安全保护。 迅软DSE文件加密软件…

`vtkClip`多面裁切之闭裁 `vtkClipClosedSurface`(1)

vtkClip多面裁切之闭裁 vtkClipClosedSurface(1) vtkClipClosedSurface文档 详细说明 使用平面集合剪裁闭合曲面。 vtkClipClosedSurface 将使用剪裁平面集合 vtkPlaneCollection剪裁闭合的多边形数据图面。它将通过创建新的多边形面来生成新的闭合表面&#xff0c;其中输入…

STM32F103时钟树

STM32芯片时钟来源 RCC时钟树简图 RCC时钟树详细图 1&#xff0e;当HSI被用于作为PLL时钟的输入时&#xff0c;系统时钟能得到的最大频率是64MHz。 2&#xff0e;用户可通过多个预分频器配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和 APB2域的最大频率是72MHz。APB1域…

visual studio历史版本下载

点击比较发行声明 https://visualstudio.microsoft.com/zh-hans/downloads/ 点击当前发行说明 https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes

JS:让2个li标签排列在同一行

前言 在js中&#xff0c;ul元素中li标签是块级元素&#xff0c;现在需要让2个分行的li元素显示在同一行&#xff0c;并且去掉li元素自带的标记符号 li元素处理前的样式如下&#xff1a; 实现 html代码 <div><ul><li>数据1&#xff1a;</li><li&…

freeRTOS使用

创建第一个FreeRTOS程序 1、官网源码下载 &#xff08;1&#xff09;进入FreeRTOS官网FreeRTOS professional services for application and RTOS development and consulting. FreeRTOS is an Open Source Code RTOS &#xff08;2&#xff09;点击下载FreeRTOS 2、处理目录 &…

Golang channle(管道)基本介绍、快速入门

channel(管道)-基本介绍 为什么需要channel&#xff1f;前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但不完美 1)主线程在等待所有goroutine全部完成的时间很难确定&#xff0c;我们这里设置10秒&#xff0c;仅仅是估算。 2)如果主线程休眠时间长了&#xff0c…

解决idea 通过build project 手动触发热部署失败

在debug运行项目的过程中&#xff0c;并且保证&#xff08;不添加方法&#xff0c;不修改方法名&#xff09;一定的规则的情况下&#xff0c;可以通过build project 来手动热部署项目&#xff0c;也就是会交换class文件与resouces文件。 设置项 Edit Configurations Modify Op…