首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过调试理解EVM(#4):结束中止执行的5种指令

[6] 第 4 篇:结束/中止执行的 5 个指令[7] 第 5 篇:执行流 if/else/for/函数[8] 第 6 篇:完整的智能合约布局[9] 第 7 篇:外部调用和合约部署[10] 1....在指令 57 62 之间,它在 40 处重新加载内存(mload(0x40) ),并将结果与 0xa0(第 56 行的结果)相乘,即 0x20。 这里没有非常有趣的东西。...通常情况下,如果你用 solidity 将你的智能合约编译成 EVM 的字节码,除非在编译过程中出现错误,否则不应该有可访问的无效操作码。...进行与运算,结果是 0x0,在指令 53 78 之间的堆栈中出现 0x0。...REVERT RETURN 的返回值 下次见 ! ---- 本翻译由 Duet Protocol[12] 赞助支持。

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

深入Solidity数据存储位置 - 内存

可变 = 可以被覆盖改变。 相对于交易 = 来自于函数调用,构造函数 (=合约创建) 短期的 = 不持久的和在外部函数调用之间被删除。 EVM 内存是一个字节寻址的空间。...如果我们看一下黄皮书,我们可以看到一个操作码被定义为从内存读取(MLOAD),两个操作码被定义为写入内存:MSTOREMSTORE8。...但这里的假设是错误的,如果你运行这个函数,它将返回以下结果: 内存引用所带来的惊喜错误假设。 实际上,在底层发生的事情是,我们创建了两个指向内存的指针,由变量datagreetings命名。...调试强调了代码第 12 行,即外部调用target.doSomething()。 现在请注意下一个步骤!...此外,定义为 "memory"的参数使合约能够接收来自不同来源的调用参数,包括来自 EOA 外部合约调用(将有效载荷从 "calldata "加载到 "内存"),但也能够直接从内部函数中组合输入。

1.7K40

Solidity优化 - 减少智能合约gas消耗的8种方法

在合约的字节码中存储值 一种相对便宜的存储读取信息的方法是,将信息部署在区块链上时,直接将其包含在智能合约的字节码中。不利之处是此值以后不能更改。但是,用于加载存储数据的 gas 消耗将大大减少。...在上面的例子中,仅使用两次 SSTORE 操作码,一次用于存储a,bc,另一次用于存储d。这同样适用于在结构体外部的变量。...(0) mstore(0x10, x) b := mload(0) mstore(0x8, x) c := mload(0) }...只要我们只需要从外部验证信息,此方法就可以正常工作,甚至比默克尔根方法便宜一些。但是,另一方面,使用这种设计(尽管不会牺牲去中心化)从合约内访问这些信息实际上是不可能的。 8....] IPFS: https://learnblockchain.cn/2018/12/25/use-ipfs [13] 链下数据存储:以太坊IPFS: https://medium.com/@didil

3.7K20

【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

0 — 退出码起作用,标识错误信息 代码没执行完毕,程序出现异常 — 退出码无意义 以上就是进程退出的三种情况。 2. 进程退出的时候,可以从main函数return返回,以此结束进程。...可以利用位运算符来得到status的前7比特位8个比特位,以此来获取到子进程退出信息,是异常终止呢?还是正常终止,结果出错,结果正确呢?...进程等待的本质就是检测子进程退出信息,然后父进程将子进程退出信息(退出终止信号等)通过status变量获取,也就是通过waitpidwait等系统调用获取。...当执行一个新的程序的时候,exec系列函数是要比main函数先执行的,因为将程序加载到内存中,其实是通过linux加载exec系列函数实现的,程序肯定是先加载后执行的,所以一定是先执行exec后执行程序中的...带e的函数都需要自己组装环境变量,可以选择自己的、系统的、系统自己的环境变量。 5.派生子进程替换我们自己写的程序 1.

14.5K30

【Nginx学习笔记】-初识Nginx

Nginx能够根据应用服务处理页面返回的状态码、超时信息等检测服务是否出现故障,并及时返回错误的请求重新提交到其它节点上 采用Master/worker多进程工作模式 Nginx 基本功能...IMAP/POP3 后端; h)使用外部 HTTP 认证服务认证用户后连接重定向到内部的 SMTP 后端; 其他HTTP功能 a)基于名称基于IP的虚拟服务; b)支持Keep-alive...搭建静态资源服务 反向代理分发后端服务(可以nodejs搭配实现前后端分离)跨域问题 根据User Agent来重定向站点 开发环境测试环境切换(切换host) url重写,使用rewrie规则本地映射...,-h : 打开帮助信息 -v : 显示版本信息并退出 -V : 显示版本配置选项信息,然后退出 -t : 检测配置文件是否有语法错误,然后退出 -q : 在检测配置文件期间屏蔽非错误信息 -s signal...: 给一个 nginx 主进程发送信号:stop(停止), quit(退出), reopen(重启), reload(重新加载配置文件) -p prefix : 设置前缀路径(默认是:/usr/local

49130

重识Nginx - 17 Nginx支持的信号说明

最常用的信号是: 1 (HUP):重新加载进程。 9 (KILL):杀死一个进程。 15 (TERM):正常停止一个进程。...14 Term 来自alarm的计时到时信号 SIGTERM 15 Term 终止 SIGUSR1 30,10,16 Term 用户自定义信号1 SIGUSR2 31,12,17 Term 用户自定义信号...总线错误(内存访问错误) SIGPOLL Term Pollable事件发生(Sys V),与SIGIO同义 SIGPROF 27,27,29 Term 统计分布图用计时到时 SIGSYS 12,...6 Core IOT自陷,与SIGABRT同义 SIGEMT 7,-,7 Term SIGSTKFLT -,16,- Term 协处理堆栈错误(不使用) SIGIO 23,29,22 Term 描述符上可以进行...,kill 不是杀死的意思,-9 表示无条件退出,但由进程自行决定是否退出,这就是为什么 kill -9 终止不了系统进程守护进程的原因

92820

【Nginx02】Nginx学习:核心模块Core

比如说我们 reload 服务之后,会产生很多进程 shutdown ,也就是进行优雅退出,如果进程遇到问题一下不退出怎么办?这时就可以为它设置这个超时时间,如果还不退出,就强制关闭。...进程停止(停止),以便使用系统调试进行进一步分析。...文件加载 文件加载就是加载外部的配置文件,在默认的配置文件中其实就有很多地方用到了。 include file | mask; 在默认的配置文件中,你可能会看到这些。...,还有一个加载外部模块文件的配置项。...load_module file; 这个是用于加载外部一些 Nginx 模块的,将来用到的时候再说吧,它 include 其实也是类似的,但是它加载的不是纯文件的配置信息,而是指定的模块,就像我们为

21830

【转】Java中Runtime.exec的一些事 

这只有JVM在遇到SIGKILL信号或者windows中止进程的信号、本地方法发生类似于访问非法地址一类的内部错误时会出现。这种情况下并不能保证shutdown hook是否被执行。...JDK文档中的解释:因为本地的系统对标准输入输出所提供的缓冲池有效,所以错误的对标准输出快速的写入从标准输入快速的读入都有可能造成子进程的锁,甚至死锁。...在一个外部进程执行完之前你不能得到他的退出状态 在你的外部程序开始执行的时候你必须马上控制输入、输出、出错这些流。...答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程取得进程的相关信息。...用户需要用这些stream来向子进程输入数据获取子进程的输出。

2.4K20

Stack Too Deep(堆栈太深) 解决方案

如果你之前写过智能合约,这很可能是一个非常熟悉的错误消息,并且在不可预测的时间出现。但是通常在你时间紧迫的时候。 ? 不过请放心,这不是你的错。如果你正在为这个错误而苦苦挣扎,那么你不是唯一的一个。...为什么会出现错误? ? 原因是在EVM堆栈中如何引用变量方面存在限制。尽管其中可以包含16个以上的变量,但是一旦尝试引用16更高槽位中的变量,将失败。...(add(data, 36)) value2 := mload(add(data, 68)) value := add(value1, value2)...所有发送到合约的数据都存储此变量,因此我们可以注释掉变量ab,但仍接收它们的值。msg.data的前4个字节是函数选择[5]数据。之后是我们的前两个uint256,每个32位。...使用 msg.data 的方法仅适用于外部函数。一种变通方法是将其与公共函数一起使用, 方法是通过this.myPublicFunction()调用那些公共函数。 也许现在的堆栈对你来说足够了。

3.7K40

如何调试EVM智能合约 #2 :部署智能合约

[6] 第 4 篇:结束/中止执行的 5 个指令[7] 第 5 篇:执行流 if/else/for/函数[8] 第 6 篇:完整的智能合约布局[9] 第 7 篇:外部调用和合约部署[10] 在第二部分(...启动优化,runs 为 1,它可以帮助编译产生更有效的代码。(点击 "高级配置 " "启用优化") 使用 solidity 版本0.8.7编译上述代码。...| 011 SUB |0x40|0x80| MLOAD从内存中加载 Stack(0)位置的值到堆栈,在内联汇编中是 MLOAD(0x40) 。...EVM 复制了 80,并使用 MLOAD 在 Stack(0)处加载加载在 80 处内存数据,这是我们之前复制到内存的构造函数中的第一个参数。(即 1) 现在由于我们加载的每一个值,都在堆栈中。...mload(0x80) mload(0xa0) 之后,EVM 跳转到指令 30,堆栈中有 1 2,EVM 继续执行,将余额设置为 9(在第 30 40 指令之间执行构造函数)并将合约代码复制到区块链中

62120

GreenPlum装载卸载工具(外部表、gpfdist、gpload等)

通过让许多Segmentgpfdist服务参与到装载处理中,可以以非常高的速率被装载。...,需要先启动gpfdist进程及监听端口,这个命令在MasterSegment节点的GPHOME/bin目录下,如果配置了GP的环境变量,可以直接使用,如果在没有安装GP的服务上使用gpfdist工具...逗号分隔的CSV对于gpfdistfile协议有效 自定义格式适合于gphdfs 外部表中的错误数据: 为了在装载正确格式的记录时隔离错误数据,需要在定义外部表时使用单条记录出错处理 外部表备份恢复:...允许的错误行数。加载数据时,错误数据将被忽略。如果没有到达错误限制数量,所有正常行会加载到GP中,问题行会存放到err_table中。如果超过错误值,正常数据也不会加载。...WRITABLE EXTERNAL TABLE命令定义外部表并指出输出文件的位置格式 使用gpfdist协议的可写外部表 GP Segment将数据发送给gpfdist进程,该进程将数据写到指定名称的文件

93430

javascript开发后端程序的神器nodejs

随着ajax的兴起现代web2.0的技术的发展,主流浏览开发商尽可能的提升javascript的执行效率,最后Chrome V8出现了,Chrome V8是 Chromium 项目开源的 JavaScript...一般只会在开发 Node.js 本身的时候出现。 5 致命错误 – 在 V8 中有一个致命的错误。比较典型的是以 FATALERROR 为前缀从 stderr 打印出来的消息。...10 内部的 JavaScript 运行时失败 – 调用引导函数时,引导进程执行 Node.js 内部的 JavaScript 源代码抛出错误。一般只会在开发 Node.js 本身的时候出现。...SIGKILL SIGHUP,那么它的退出代码将是 128 加上信号的码值。...或者我们可以从程序内部发送这个信号: process.kill(process.pid, 'SIGTERM') env 因为process进程外部环境打交道的,process提供了env属性,该属性承载了在启动进程时设置的所有环境变量

1.1K41

javascript开发后端程序的神器nodejs

随着ajax的兴起现代web2.0的技术的发展,主流浏览开发商尽可能的提升javascript的执行效率,最后Chrome V8出现了,Chrome V8是 Chromium 项目开源的 JavaScript...一般只会在开发 Node.js 本身的时候出现。 5 致命错误 – 在 V8 中有一个致命的错误。 比较典型的是以 FATALERROR 为前缀从 stderr 打印出来的消息。...10 内部的 JavaScript 运行时失败 – 调用引导函数时,引导进程执行 Node.js 内部的 JavaScript 源代码抛出错误。 一般只会在开发 Node.js 本身的时候出现。...SIGKILL SIGHUP,那么它的退出代码将是 128 加上信号的码值。...或者我们可以从程序内部发送这个信号: process.kill(process.pid, 'SIGTERM') env 因为process进程外部环境打交道的,process提供了env属性,该属性承载了在启动进程时设置的所有环境变量

1K20

《Elasticsearch 源码解析与优化实战》第4章:节点启动关闭

启动流程做了什么 总体来说,节点启动流程的任务是做下面几类工作: 解析配置,包括配置文件命令行参数。 检查外部环境内部环境,例如,JVM版本、操作系统内核参数等。...检测jar冲突(JarHell),发现冲突则退出进程。 检测外部环境 ES中的“节点”在实现时被封装为Node模块。...串行收集检查 串行收集(serial collector) 适合单逻辑CPU的机器非常小的堆,不适合ES。使用串行收集对ES有非常大的负面影响。本项检查就是确保没有使用串行收集。...若要通过此项检查,则不要启用OnErrorOnOutOfMemoryError,而是升级到Java 8u92并使用ExitOnOutOfMemoryError。 12....主线程执行完启动流程后会退出,keepalive 线程是唯一的用户线程, 作用是保持进程运行。在Java程序中,至少要有一个用户线程。当用户线程数为零时退出进程

1K11

深入Solidity数据存储位置

最小化其执行成本(调用其公共内部函数时使用的 Gas 差异)。 强化安全性,防止潜在的错误。 数据位置 → 概述 本文旨在对这些不同的数据位置做一个很好的概述,数据可以被写入读出。...内存 (图来源: Simon Kadula[12] on Unsplash) EVM 内存是用来保存临时值的,在外部函数调用之间被擦除。然而,它的使用成本比较低。...它们在对其他合约的外部函数调用之间被擦除。 你可以从/到 EVM 内存中读取写入。在低层,用于从/向内存读写的 EVM 操作码是MLOAD, MSTORE, MSTORE8。...字节码包含了很多关于合约的信息逻辑,包括调度,以及合约元数据。...根据关键字 "storage " "memory",EVM 在幕后做了什么? 我在下面列出了两种获取类型的操作码序列(为了清晰简洁,左边没有写程序计数)。

98710

通过逆向调试深入EVM #7 - 与其他智能合约的交互

在 0x12D 的函数里有什么?...反编译: signature := mload(0xa0) mstore(0xa4, signature) jump 0x134 这段代码加载在内存[0xa0:0xc0] 的函数x() 签名,并在内存...这段代码JUMP 到 0x134,但是在函数_12d(uint,uint)的开头,参数不是 0x80 0x04,而是 0x20 0x04。...内存几乎以前一样,只有一个区别。函数签名在memory[0xa0:0xa8] 出现了 2 次,为什么会这样?这个函数的目的是什么?...(步入下一条指令,并跳过函数,如果有对函数的调用,无论这是一个内部外部函数。) 当你在字节 0xC7 时,例外地点击绿色按钮,跳过调用(你也可以测试一下,当你点击红色按钮时会发生什么)。 6.

56140

Qt软件开发_解决中文路径无法识别问题

QProcess执行-目录带中文 QProcess类用于启动外部程序并与它们通信。 运行进程要启动进程,请将要运行的程序的名称命令行参数作为参数传递给start()。...或者,可以将程序设置为使用setProgram()setArguments()运行,然后调用start()open()。...QProcess允许将进程视为顺序I/O设备。可以像使用QTcpSocket访问网络连接一样,对进程进行写入读取。...finished()信号提供进程退出代码退出状态作为参数,还可以调用exitCode()来获取最后一个完成的进程退出代码,并调用exitStatus()来获取其退出状态。...如果在任何时间点发生错误,QProcess将发出ErrorOccursed()信号。还可以调用error()来查找上次发生的错误类型,调用state()来查找当前进程状态。

2.4K30

智能合约Stack Too Deep解决方法

尽管其中可以包含16个以上的变量,但是一旦尝试引用16更高槽位中的变量,将失败。因此,并非总是很清楚为什么某些代码会失败,然后进行一些随机更改似乎可以解决问题。...它将抛出困扰我们的堆栈太深的错误消息。我们可以对它可以做些什么呢?...神奇的是,堆栈太深的错误会迫使我们编写更好的代码。...所有发送到合约的数据都存储此变量,因此我们可以注释掉变量ab,但仍接收它们的值。msg.data的前4个字节是函数选择[5]数据。之后是我们的前两个uint256,每个32位。...使用 msg.data 的方法仅适用于外部函数。一种变通方法是将其与公共函数一起使用, 方法是通过this.myPublicFunction()调用那些公共函数。 也许现在的堆栈对你来说足够了。

27200
领券