以太坊虚拟机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作为虚拟机执行智能合约的字节码,而世界状态数据库则负责存储智能合约和账户的当前状态。这三者的协同工作构成了以太坊上智能合约的执行和状态管理机制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hive】启动beeline连接hive报错解决

1、解决报错2、在datagrip上连接hive 1、解决报错 刚开始一直报错&#xff1a;启动不起来 hive-site.xml需要配置hiveserver2相关的 在hive-site.xml文件中添加如下配置信息 <!-- 指定hiveserver2连接的host --> <property><name>hive.server2.thrift.bin…

机器人与3D视觉 Robotics Toolbox Python 二 空间位姿描述

空间位姿描述 二维空间位姿描述 二维空间位姿表示方法 from spatialmath.base import * from spatialmath import * T1 SE2(x3,y3,theta30,unit"deg") trplot2(T1.A,frame"T1",dims[0, 5, 0, 5]) T2transl2(3, 4) trplot2(T2,frame"T2",dims…

如何理解 RPC 远程服务调用?

本文主要讲解 RPC 远程服务调用相关的知识。 RPC 远程服务调用是分布式服务架构的基础&#xff0c;无论微服务设计上层如何发展&#xff0c;讨论服务治理都绕不开远程服务调用&#xff0c;那么如何理解 RPC、有哪些常见的 RPC 框架、实现一款 RPC 框架需要哪些技术呢&#xff…

解决electron修改主进程后需要重启才生效

nodemon 是一种工具&#xff0c;可在检测到目录中的文件更改时通过自动重新启动节点应用程序来帮助开发基于 node.js 的应用程序 nodemon 特性 自动重新启动应用程序。检测要监视的默认文件扩展名。默认支持 node&#xff0c;但易于运行任何可执行文件&#xff0c;如 python、…

自动驾驶学习笔记(十七)——视觉感知

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 分类 目标检测 语义分割 实例分割 …

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…

【unity实战】一个通用的FPS枪支不同武器射击控制脚本

文章目录 前言模型素材文章用到的粒子火光特效射击效果换弹瞄准开枪抖动效果设置显示文本最终代码不同武器射击效果1. 手枪2. 机枪3. 狙击枪4. 霰弹枪5. 加特林 其他感谢完结 前言 实现FPS枪支不同武器效果&#xff0c;比如手枪&#xff0c;喷子&#xff0c;狙击枪&#xff0c…

《使用ThinkPHP6开发项目》 - 创建应用

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 根据前面的步骤&#xff0c;我们现在就可以开发我们的项目开发了&#xff0c;根据项目开发的需要…

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第四次作业

云数据库研究 云计算与云数据库背景 云计算&#xff08;cloud computing&#xff09;是 IT 技术发展的最新趋势&#xff0c;正受到业界和学术界的广泛关注。云计算是在分布式处理、并行处理和网格计算等技术的基础上发展起来的&#xff0c;是一种新兴的共享基础架构的方法。它…

[足式机器人]Part4 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

最新Redis7持久化(权威出版)

首先我们要知道什么是持久化&#xff1a;持久化是指将数据保存到磁盘上&#xff0c;以确保在Redis服务器重启时数据不会丢失。 Redis支持两种主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面让我依次给你介绍一下&#xff1a; RDB持久化 作用 这是将Redis数据保存…

Java语言概述及保姆级入门教程(JDK 17版本)

笔记来自尚硅谷老师-康老师 学习教程&#xff1a;https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from333.337.search-card.all.click 1、Java基础全程脉络图 1.1 本章专题与脉络 2. 抽丝剥茧话Java 2.1 当前大学生就业形势 麦可思研究院发布了《2022年中国大学生就业…

C#图像处理OpenCV开发指南(CVStar,09)——边缘识别之Scharr算法的实例代码

1 边缘识别之Scharr算法 算法文章很多&#xff0c;不再论述。 1.1 函数原型 void Cv2.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType&#xff09; 1.2 参数说明 src 代表原始图像。dst 代表目标图像。ddepth 代表输出图像的深度。CV_16Sdx 代表x方向上的求导阶数…

uniApp应用软件在运行时,不符合华为应用市场审核标准。解决方案合集!

&#xff08;暂时用不到的也建议收藏一下&#xff0c;因为文章持续更新中&#xff09; 最新更改时间&#xff1a;20023-12-10 第一次做App应用开发相信大家一定都遇到过华为应用市场审核的“驳回”&#xff01; 有些问题一看就明白可以立马修改&#xff0c;而有一些问题修改意…

Dubbo入门直接上手,结合微服务详解

Dubbo 高性能、轻量级的 Java RPC 框架 RPC&#xff1a; Remote Procedure Call 远程过程调用&#xff0c;简单来说就是它允许一个计算机程序通过网络请求调用另一个计算机上的程序&#xff0c;就像本地调用一样。有非常多的协议和技术来都实现了RPC的过程&#xff0c;比如&a…

Elasticsearch 8.9 refresh刷Es缓冲区的数据到Lucene,更新segemnt,使数据可见

一、相关API的handler1、接受HTTP请求的hander(RestRefreshAction)2、往数据节点发送刷新请求的action(TransportRefreshAction)3、数据节点接收主节点refresh传输的action(TransportShardRefreshAction) 二、在IndexShard执行refresh操作1、根据入参决定是使用lucene提供的阻塞…

【设计模式--创建型--原型模式】

设计模式--创建型--原型模式 原型模式概述结构实现结果 案例代码结果使用场景 扩展&#xff08;深\浅克隆&#xff09;浅克隆演示&#xff1a;结果&#xff1a;使用深克隆&#xff08;利用对象流&#xff09;结果 原型模式 概述 用一个已经创建的实例作为原型&#xff0c;通过…

Spring Cloud Gateway + Nacos + LoadBalancer实现企业级网关

1. Spring Cloud Gateway 整合Nacos、LoadBalancer 实现企业级网关 前置工作&#xff1a; 创建 SpringBoot 多模块项目创建网关&#xff08;gateway-service&#xff09;、用户&#xff08;user-service&#xff09;模块用户模块添加 Nacos discovery 支持以及 Spring Web&am…

gitbash下载安装

参考教程 零、下载 官网地址 2.43.0win64 链接&#xff1a;https://pan.baidu.com/s/16urs_nmky7j20-qNzUTTkg 提取码&#xff1a;7jaq 一、安装 图标组件&#xff08;Additional icons&#xff09;&#xff1a;选择是否创建桌面快捷方式&#xff1b;桌面浏览&#xff08;Win…

逸迅科技丁红阳:三种能力帮助企业打造GBI “护城河”

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;由上海市经济和信息化委员会、上海市科学技术委员会指导&#xff0c;数据猿与上海大数据联盟联合主办的“2023企业数智化转型升级发展论坛”在上海举行。本次论坛以“释放数字价值驱动智能升级”为主题&#xf…