首页
学习
活动
专区
圈层
工具
发布

以太坊虚拟机EVM的工作原理是怎样的

如果你打算尝试在以太坊区块链上开发智能合约,或者已经在该领域工作了一段时间,可能会遇到EVM一词,EMV是太坊虚拟机的缩写。 虚拟机本质上是在执行代码和执行的机器之间创建一个抽象级别。...于合约交互的成本(gas fee) 由于所有合约的执行都是由运行以太坊节点的个人运行的,攻击者可以尝试创建包含大量计算成本高的操作的合约来减慢网络速度。...计算成本高的指令比简单、直接的指令收取更高的 gas 费用。 最重要的是,每笔交易都以 21000 gas 开始。 当执行减少状态大小的指令时,gas 也可以退还。...此字节码充当构造函数,需要在将运行时字节码复制到合约代码之前将初始变量写入存储。 在部署期间,创建字节码只会运行一次,而运行时字节码将在每次合约调用时运行。...如果一个参数包含超过 32 个字节(256 位)的数据,如数组或字符串,则该参数将拆分为多个字,这些字会在包含所有其他参数后添加到输入数据中。

1.4K30

第三十课 以太坊智能合约solidity如何节省GAS费?

1,摘要 在以太坊上,代码即法律,交易即金钱。每一笔智能合约的运行,都要根据复杂度消耗一笔GAS费(ETH)。...因此,如果我们从交易成本中减去执行成本,我们应该得到21464 gas。...它应该是所有指令中最昂贵的。如果创建多个合约实例,则GAS消耗可能很大。 建议: 避免将合约用作数据存储。...由于EVM操作都是以32字节为单位执行的,因此编译器将尝试将变量打包成32字节集进行访问,以减少访问时间。 但是,编译器不够智能,无法自动优化变量分组。它将静态大小的变量分组为32个字节的组。...这里有一些可能在执行过程中节省GAS的方法。 3.8.1 减少昂贵的操作 昂贵的操作是指一些需要更多GAS值的操作码,例如SSTORE。以下是一些减少昂贵操作的方法。

5.2K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    区块链智能合约开发的优化

    尽量减少对状态变量的写入,优先使用内存变量。使用更小的数据类型:选择合适的数据类型(如 uint8 代替 uint256)可以节省存储空间和 Gas。批量处理:将多个操作合并为一个交易,减少交易次数。...避免循环中的高 Gas 操作:在循环中避免调用外部合约或写入状态变量。2.代码优化模块化设计:将合约拆分为多个模块,便于维护和重用。...使用库(Library):将通用功能封装到库中,减少合约大小和部署成本。内联函数:对于简单的函数,使用 internal 或 private 修饰符,编译器可能会将其内联以减少调用开销。...7.合约升级与维护优化代理模式:使用代理合约(如透明代理或 UUPS 代理)实现合约的可升级性。模块化升级:将核心逻辑与可升级部分分离,便于单独升级。版本控制:为合约添加版本号,便于管理和维护。...跨链互操作性:使用跨链桥或多链协议,实现不同区块链之间的资产和数据交互。总结智能合约优化需要从 Gas 消耗、代码结构、数据结构、安全性、测试、升级维护等多个方面综合考虑。

    71710

    智能合约Gas 优化的几个技术

    用户调用方法时,输入参数作为交易数据的一部分。交易将永远存储在区块链上,这意味着你将永远能够从链外应用程序中读取交易数据的内容(其中包含输入参数)。...按原样返回,不进行转换,让检索数据的链外应用程序做这些工作(从数组中提取某些值等等)。...使用映射来代替长数组,映射是一个哈希表,可以让你在一次操作中使用其键来访问任何值,而不是在数组中循环,直到找到你要找的键。...内存位置(或存储位置) 以太坊有 4 个内存位置,从最便宜的到最贵的:calldata,栈,内存和存储。如果使用得当,你将节省大量的交易 Gas。...solidity 编译器会尝试将变量打包在一个槽中,但需要这些变量定义在彼此的旁边。 例如,如果你接连定义了 2 个uint128,它们都会被打包到同一个存储槽中,因为它们各占 16 字节。

    1.6K20

    介绍以太坊 gas 限制项目(EGL)

    TL;DR:DeFi 热潮重新出现了关于“正确”gas 限制的长期争论的最新版本——在以下因素之间取得了理想的平衡: 降低gas限制,所以任何人都可以运行一个节点 更高的gas限制,所以任何人都可以负担得起交易费用...以太坊尝试了一种不同的范式——如果我们将区块大小的控制权交给矿工会怎样?在以太坊中,每个区块的矿工都可以将后续区块大小更改为 0.1%。...为了激励从 EGL 中受益最多的一级参与者的参与,EGL 采用了两步机制。 要通过每周计数,必须有最低限度的 EGL 参与投票,并且该阈值会随着时间的推移逐渐增加。...EGL 中并投票决定失去他们的价值从 EGL 捕获。...ETH 2.0 与合并 “合并”是将 ETH 过渡到 PoS 的第一步,在 ETH2 共识中确认 ETH 块。这对 ETH 来说是巨大的,但并不能缓解 gas 限制问题。

    1.6K40

    智能合约gas评估与优化方法小结

    不会直接给出gas情况,在执行部署合约以及合约交互时一般可以通过promise中的交易hash获取回执,从回执中得到结果。...基于Yul IR的优化器: 可以跨函数工作,更强大,函数可能被内联,调整顺序,合并或重写以消除冗余。yul优化器有多个模块,多个模块之间的序列还可以自己处理。...这意味着它是代码大小(部署成本)和代码执行成本(部署后的成本)之间的一个折衷参数。 一个 “运行” 参数为 “1” 将产生简短的合约但昂贵的执行代码。...相反, 一个较大的 “运行” 参数将产生较大的合约但更省gas的执行代码。 该参数的最大值为 2^32-1。...,而是直接从calldata中读取, 相反如果public函数的参数就要存入内存中。

    1.5K10

    区块链Web3项目开发的注意事项

    关键措施:代码审计:必须由专业机构(如CertiK、SlowMist)进行漏洞扫描(重点检查重入攻击、整数溢出、权限控制失效等问题);开发规范:复用经过验证的开源库(如OpenZeppelin提供的安全合约模板...),避免自行编写复杂逻辑;升级机制:采用Proxy模式(代理合约)实现功能升级,同时确保旧版本合约的资金可迁移。...操作引导:将复杂概念(如Gas费、私钥备份)转化为通俗提示(如“Gas费是交易手续费,网络拥堵时会变贵,请耐心等待低价时段”),避免用户因术语困惑流失。2....Gas费与交易优化动态提示:实时显示当前网络的Gas价格(如以太坊的“慢/中/快”档位),允许用户选择合适时机提交交易;批量处理:合并多个操作(如同时转账多笔资产)以减少Gas消耗;对高频操作(如游戏内的道具交易...反馈与教育实时状态反馈:交易提交后,清晰展示“确认中→成功/失败”状态,并提供错误原因(如“Gas不足,请增加费用”);新手引导:通过教程(如视频/图文)解释Web3基础概念(如私钥重要性、NFT所有权

    28710

    以太坊如何计算交易成本 原

    **如果i为0,则此循环将执行1000次,或者更多,如果它是负数。 为了以公平的方式支付这种计算成本,因为它必须立即在所有矿工的机器上执行,并且他们将资源和时间花在它上面,这里引入了gas的概念。...此外,VM允许我们在Linux上使用Windows游戏,或者允许我们轻松地在相同编程语言环境的不同版本中编程,而不会混淆它们。 EVM 以太坊虚拟机内置于以太坊协议上运行的软件中。...如果我们将wei作为以太的基本单位,我们得到下面的定义表: ? 这就是在以太网单元之间的单位转换。 根据这个信息网站,目前的天然气平均价格是10GWei(10千兆wei)。...如果代码在以太网中列出,那么每当以太的价值波动时我们就必须更新代码,以便将计算工作的价格保持在正常范围内并保持系统可用,这显然是不可持续的。...结论 gas是以太坊虚拟机中每次计算操作所花费的工作单位。这是以太币,以太坊协议的代币,并且每个计算操作都有不同的gas成本。

    1.3K30

    躲避子弹:以太坊状态问题

    此外,仅仅两个月之后,到了 2019 年 12 月,Partiy Ethereum 就宣布要退出了,OpenEthereum 项目接管了 Parity 客户端的代码维护工作。...协议层工作 处理此类攻击的第一个思路是这个。在 2020 年2 月,其正式版本作为 EIP 2583 发布。该提案背后的观念是增加一个惩罚措施,每次树查找导致 miss (“未找到”)时就触发。...开发工作 Peter 尝试用动态的状态快照解决这个问题,时值 2019 年 10 月。 快照是一个次级的数据结构,用来以扁平格式(flat format)存储以太坊状态。...这些工作为后来的 snap/1 同步算法打下了基础。这一算法已在 2020 年 3 月合并到了代码库中。 有了 “动态快照” 功能,我们就能喘口气了。...如果以太坊网络遭到攻击,那会是很痛苦的,但至少,我们能通知用户打开快照功能。生成快照需要花一些时间,而且还没有办法同步快照,但网络至少能继续运行了。

    58430

    轻松理解以太坊工作原理

    以太坊使用工作量证明共识协议防止区块链被篡改。 工作量证明系统需要解决一个复杂问题以创建一个新的区块。 在工作量证明系统中,创建区块的过程称为挖矿。 矿工(miner)是网络中挖区块的节点。...在无效块上工作的网络是在无效块上挖下一个区块,结果是网络算力损失,因为算力用在了没有用的事情上。所以,在挖出下一个区块之后,难度值将降低,原因是用于挖区块的时间比平均时间更长。...因此需要有交易费,否则整个网络里将充斥着垃圾交易,而且没有交易费用矿工就没有理由在区块中接纳交易,它们将开始挖空区块。 11、gas gas(燃料)是计算资源的计量单位。...如果交易gas价格低于矿工决定的gas价格,矿工将拒绝挖交易。 如果gas价格低于期望,矿工可以拒绝将交易接纳入区块。 gas价格以wei为单位。...运行以太坊时,它会尝试发现一个本地geth实例并与之连接。如果它不能发现geth正在运行,它就启动自己的geth节点。

    2.2K10

    区块链web3软件的性能优化

    智能合约优化 (降低 Gas 费用和执行时间)Gas 费用是 Web3 应用程序中性能和用户体验的主要瓶颈之一。减少链上存储: 链上存储是最昂贵的操作。...批处理操作: 将多个小操作合并成一个交易,以减少交易开销和 Gas 费用。谨慎使用外部调用: 对其他合约的外部调用会增加 Gas 成本和潜在的安全风险。尽量减少不必要的外部调用。...数据压缩: 压缩存储在 IPFS 上的数据,以减少传输时间和存储成本。...减少链上读操作: 缓存链上数据: 使用本地存储(Local Storage)、IndexedDB 或 Redux 等状态管理库来缓存从区块链读取的数据,减少不必要的重复请求。...自定义后端服务: 对于某些需要复杂聚合或实时通知的场景,可以运行一个自定义的后端服务,监听链上事件并将其存储在传统数据库中,然后通过 API 提供给前端。

    33310

    区块链智能合约的优化

    选择合适的数据类型: 使用占用空间更小的数据类型,例如uint8而不是uint256来存储较小的数值。优化变量顺序: 在struct中,将占用空间较小的变量放在前面,可以减少存储空间的浪费。...使用库(Libraries): 将常用的功能封装成库,可以减少合约代码的重复,并提高代码的复用性和可维护性。使用内联汇编可以进一步优化Gas消耗,但需要谨慎使用,以避免引入安全漏洞。...提高执行效率:优化算法: 使用更高效的算法和数据结构,例如使用哈希表进行快速查找。避免不必要的循环和判断: 减少代码的复杂度,提高执行效率。使用缓存: 缓存常用的计算结果,避免重复计算。3....编写安全的代码: 使用最新的Solidity版本,并启用溢出检查。 使用SafeMath库进行数学运算。...其他优化策略:链下计算: 将一些计算密集型的任务放在链下进行,只在链上进行必要的验证和存储。状态通道: 使用状态通道技术可以减少链上交易的次数,提高交易速度和降低Gas消耗。

    84210

    写给技术小白的以太坊完整工作原理和运行机制!

    网络中任何声明自己是「矿工」的节点都可以尝试创建和验证区块,全世界有许多矿工试图同时创建和验证区块。...此外,交易失败的记录会被记录下来,显示尝试过哪些交易,失败了哪些交易。由于系统已经在Gas用光之前做完了运算工作,所以从逻辑上看,Gas不会被退还给发送方。 那么,这些Gas的钱到底去哪了呢?...; v, r, s:用于生成识别交易发送方的签名; Init(只存在于创建合同的交易中):用于初始化新合约帐户的EVM代码片段,它只运行一次,然后被丢弃,当init第一次运行时,它会返回帐户代码的主体,...; 从发送方的余额中扣除这个新账户余额的增加部分; 将存储设置为空; 将合约的codeHash设置为空字符串的哈希值; 一旦帐户完成了初始化就可以创建帐户了,使用与交易一起发送的init代码。...栈中条目是从该系列最左边的部分中添加或删除。表现为,在每个循环中,从剩余的Gas中减少适当的Gas,并且程序计数器递增。

    4.9K51

    Arbitrum 桥中的消息陷阱

    -在 Optimism 中显示成功标志的代码屏幕截图- 不知道 Arbitrum 中的这种行为,尝试完成其工作的中继可能会尝试再次执行失败的 L2-to-L1 消息。然后再次。然后再次。...查看从Bridge到目标的调用: -显示没有 gas 限制的代码截图- Optimism 做了什么?恰好相反。...ExcessivelySafeCall 存储库[30]对其进行了最好的解释: 当字节从返回数据复制到内存时,内存扩展成本[31]被支付。...我们可以减轻这些威胁,放置每一个可以想象的防御机制来减少攻击面和漏洞利用影响的可能性。 桥的安全有很多方面。确保中继能够在安全的环境中可靠运行就是其中之一。...他们可以在桥梁本身的背景下控制 gas 消耗。目标可以随时改变它们的行为,甚至可以尝试在执行 L2-to-L1 消息之前预先运行中继交易来设计击。 最重要的是,中继交易的成功取决于消息的成功。

    88820

    智能合约开发中13种最常见的漏洞

    withdraw 函数中,我们首先尝试向用户转账,然后才减少他们的余额。...不当的继承顺序: 在智能合约开发中,不当的继承顺序可能会导致意料之外的行为,尤其是在处理权限控制和函数覆盖时。当一个合约从多个父合约继承时,构造函数的执行顺序和函数的覆盖规则变得尤为重要。...4、使用中位数时间协议(Median Time Protocol,MTP):类似于比特币网络中的中位数时间协议,可以使用最近多个区块时间戳的中位数来计算一个更稳定的时间参考点。...... } } 通过将时间依赖改为区块高度依赖,我们减少了矿工操纵时间戳的能力,从而增强了合约的公平性和安全性。...当一笔交易开始执行时,它会从交易者提供的Gas总量中扣除费用,直到合约执行完成或Gas耗尽。如果在执行过程中Gas耗尽,那么交易将被回滚,且已经消耗的Gas不会退还给用户。

    1.6K11

    Solidity 优化 - 控制 gas 成本

    读者应该已经对 Solidity 中的编码以及 EVM 的总体工作方式所有了解。 我们讨论在 Solidity 中编写高性能智能合约时应注意的重要事项。...将多个小变量打包到单个字中 译者注:标题中的"字", 也称为字长,表示每个指令操作的数据长度。 EVM 在 32 字节字长存储模型下运行。...可以将小于 32 个字节的多个变量打包到一个存储槽中,以最大程度地减少SSTORE操作码的数量。...尽管 Solidity 自动尝试将小的基本类型打包到同一插槽中[9],但是糟糕的结构体成员排序可能会阻止编译器执行此操作。考虑下面的Good和Bad结构体。 ?...https://ethereum-magicians.org/t/state-fees-formerly-state-rent-pre-eip-proposal-version-3/2654 [9] 自动尝试将小的基本类型打包到同一插槽中

    1.1K20

    【刘文彬】【精解】开发一个智能合约

    Solidity编写的智能合约代码运行在EVM,即以太坊虚拟机,正如java编写的代码运行在JVM一样,在同一个区块链中每一个结点的EVM都是相同的运行环境。...当然我们也可以使用Remix进行运行、测试以及调试工作,下面酌情展示。 gas 区块链中比较有意思的命名,相当于手续费但又有些不同。...智能合约也是一样的,当一个发起者部署运行一段智能合约时,以太坊会收取gas费用,就像汽车行驶需要烧油一样,直到你的智能合约运行完毕,“油箱”中剩余的gas会退还给你,如果你的代码死循环了,耗尽了你“油箱...,Remix帮我们将代码转成了EVM可识别的样子,也就是将Solidity代码编译成web3的版本,其中也帮我们估算好了gas的金额,当我们执行这段合约时会自动扣掉我们余额中相应的数值作为gas费用。...我们从大款那再转账一个以太币过来。然后关闭重启geth console,重复上面的操作。 TODO: 余额仍旧未减少。不知道gas扣到哪去了。

    60930

    以太坊升级带来的⑤个改变

    以太坊EVM就像一台超级计算机,运行在以太坊网络中的不同计算机(节点)上。EVM存储执行智能合约的代码并允许用户与dApp进行交互。...此外,eWASM 旨在与当前的Web标准兼容,因此更易于在常规浏览器中运行。这将使用户更加便捷地从浏览器访问dApp,而无需依赖浏览器扩展。...减少碳足迹 以太坊转向PoS权益证明共识机制将减少电力消耗并减少对环境的消极影响。实际上,比特币和以太坊1.0等PoW工作量证明的能源密集型特性已经引起了环保主义者和监管机构的担忧。...合并后,整个以太坊网络将切换到 PoS共识机制。 第1阶段 根据以太坊基金会的计划,第1阶段将在2022年晚些时候或2023年的某个时间发生。...该阶段的升级将引入分片,但代码开发和审计难度较大,因此具体时间将根据实际情况来调整。 第2阶段 以太坊2.0的最后阶段涉及到用以太坊Web组件(eWASM)替换以太坊虚拟机(EVM)。

    61150

    EVMPatch:自动修补以太坊智能合约

    本研究升级方案将新修补的合约代码部署到新地址,并向先前部署的代理合约发出专用交易,这会将逻辑合约的地址从旧的易受攻击版本切换到新修补的版本。现在,任何进一步的事务都由修补的逻辑合约处理。...EVM还具有专用的呼叫指令,但是这些指令仅用于将控制权转移到完全独立的合约中。因此,它们在重写字节码时不需要修改。常量数据引用:所谓的CODECOPY指令用于将数据从代码地址空间复制到内存地址空间。...在代码中失败的报告事务(作为补丁程序的一部分)被标记为潜在攻击事务。如果报告的交易由于补丁代码中的用尽gas而失败,将以增加的gas预算重新运行同一笔交易。...尽管这样可以减小代码大小(如果需要在多个位置进行检查),但它总是需要执行其他指令(从而增加了开销)来调用内部函数并从中返回。相反,EVMPATCH内联了安全的数字运算,从而减少了gas费用。...开发人员研究表明,自动修补方法可以大大减少修补智能合约所需的时间,并且实现EVMPATCH实际上可以集成到智能合约开发人员的工作流程中。

    86620

    Solidity:库函数

    简介 在Solidity中,库(Libraries)是一种特殊类型的合约,它们包含了一些可重用的函数,可以在其他合约中调用。库函数可以帮助我们减少代码冗余,提高代码的可读性和可维护性。...使用库的一个主要优点是,它们的代码在部署时不会被复制到调用它们的合约中,而是通过DELEGATECALL操作码在原地执行。这可以帮助我们节省gas,特别是当我们在多个合约中使用相同的库函数时。...你需要编译库合约的源代码,然后将编译后的字节码部署到Ethereum网络上。以下是一个简单的步骤: 1.编译库合约:首先,你需要使用Solidity编译器(solc)来编译库合约的源代码。...4.注意gas消耗:虽然库函数的代码在部署时不会被复制到调用它们的合约中,但是每次调用库函数都会消耗一定的gas。...因此,如果你在一个函数中多次调用同一个库函数,你可能需要考虑将这些调用合并到一起,以减少gas消耗。5.库不能继承其他合约或库:虽然库可以被其他合约继承,但是它们不能继承其他合约或库。

    33710
    领券