区块链知识系列 - 系统学习EVM(二)

news2024/12/29 10:31:58

特点

  • EVM出于所谓运算速度和效率方面考虑,采用了非主流的256bit整数。
  • 不支持浮点数
  • 缺乏标准库支持,例如字符串拼接、切割、查找等等都需要开发者自己实现
  • 给合约打补丁或是部分升级合约代码在EVM中是完全不可能的

存储

image-20221125135742652

Code

code 部署合约时储存 data 字段也就是合约内容的空间,即专门存储智能合约的二进制源码的空间

Storage

Storage 是一个可以读写修改的持久存储的空间,也是每个合约持久化存储数据的地方。Storage 是一个巨大的 map,一共 2 256 2^{256} 2256 个插槽 (slot),每个插糟有 32 bytes,合约中的“状态变量”会根据其具体类型分别保存到这些插槽中。

Stack

stack 即所谓的“运行栈",用来保存 EVM 指令的输入和输出数据。可以免费使用,没有 gas 消耗,用来保存函数的局部变量,数量被限制在 16 个。stack 的最大深度为 1024 ,其中每个单元是 32 byte。

Args

args 也叫 calldata,是一段只读的可寻址的保存函数调用参数的空间,与栈不同的地方的是,如果要使用 calldata 里面的数据,必须手动指定偏移量和读取的字节数。

Memory

Memory 一个简单的字节数组,主要是在运行期间存储数据,将参数传递给内部函数。基于 32 byte 进行寻址和扩展。

安全

溢出攻击

EVM 的 safeMath 库不是默认使用,例如开发者对 solidity 的 uint256 做计算的时候,如果最终结果大于 uint256 的最大值,就会产生溢出变为一个很小的数,这样就产生了溢出漏洞。诸如 BEC、SMT 等相关币种都遭受过溢出攻击,带来了极度严重都后果
对策: 利用一些第三方的safemath库来保证这个数字操作的安全

重入攻击

solidity 一大特性是可以调用外部其他合约,但在将 eth 发送给外部地址或者调用外部合约的时候, 需要合约提交外部调用。如果外部地址是恶意合约,攻击者可以在 Fallback 函数中加入恶意代码,当发生转账的时候,就会调用 Fallback 函数执行恶意代码,恶意代码会执行调用合约的有漏洞函数,导致转账重新提交。最严重的重入攻击发生在以太坊早期,即知名的 DAO 漏洞 - (先转账再扣钱,结果转账到一个恶意合约地址)。
对策: 在金额转移之前,一定要先扣钱

非预期函数执行

EVM 没有严格检查函数调用,如果合约地址作为传入参数可控,可能导致非预期行为发生。

权限问题,如果构造函数(0.4.20之前的版本)名和合约名写的不一致,就会被外部或者其他合约所调用,恶意的攻击者可能获取了我们当前智能合约的所有权
对策: 注意编码规范,保证合约名与构造函数名相同。如果现在使用构造函数,我们建议使用constractor来创建

时间戳依赖

时间戳就可以被矿工修改的

可预测的随机数

使用区块变量生成随机数,所有的区块变量都可以被矿工操纵.因为这些区块变量在同一区块上是共用的。攻击者通过其恶意合约调用受害者合约,那么此交易打包在同一区块中,其区块变量是一样的。

对策: 通过Oracle获取随机数

服务攻击

withdraw时,不要直接把币转到用户指定的某个地址(可能是个恶意合约), 而是让用户主动提取自己的押金

不要空投,而是让人主动来领取.

私有数据

不要以为声明为private的变量外部就无法访问到

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract DCA {
    uint counter;
    uint private age;

    constructor(uint _c) {
        counter = _c;
        age = _c + 2;
    }
}

通过api可直接按内存地址访问到private的数据

import web3

url = ""
w3 = web3.Web3(web3.HTTPProvider(url))

w3.eth.get_storage_at(address, 0x0)
#一个uint占256bit, 即32字节 #HexBytes('0x0000000000000000000000000000000000000000000000000000000000000005')
w3.eth.get_storage_at(address, 0x1)
# HexBytes('0x0000000000000000000000000000000000000000000000000000000000000007')

注意

tx.origin和msg.sender区别

  • msg.sender (address): 消息发送方 (当前调用)

  • tx.origin(address): 交易发送方(完整调用链上的原始发送方)

用户A -> 合约1 -> 合约2

若在合约2中使用 msg.sender,会得到合约1的地址

若在合约2中使用 tx.origin,会得到用户A,即整个调用链的起点

合约间的调用方式call、delegatecall

调用方式修改storage调用者的msg.sender被调用者的msg.sender执行上下文件
call修改被调用者的合约storage交易的发起者地址调用者地址在被调用者里
delegatecall修改调用者的合约storage交易的发起者地址调用者地址在调用者里

receive 和 fallback 调用流程

接收以太功能函数

solidity 接收函数 receive 没有参数、没有返回值。

solidity 向合约转账,发送 Eth,就会执行 receive 函数。

如果没有定义接收函数 receive,就会执行 fallback 函数。

fallback函数,即 回退函数,没有名字,没有参数,没有返回值

function(){
}

往期精彩回顾:
区块链知识系列
密码学系列
零知识证明系列
共识系列
公链调研系列
BTC系列
以太坊系列
EOS系列
Filecoin系列
联盟链系列
Fabric系列
智能合约系列
Token系列

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

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

相关文章

08-linux网络管理-iptables扩展模块

文章目录1. 概述2. icmp 模块2.1 示例&#xff08;禁止本机ping其它主机&#xff09;2.2 示例&#xff08;其他主机ping本机&#xff09;2.3 --icmp-type 说明3. iprange模块4. multiport 模块5. state 模块5.1 语法5.2 完整示例6. limit模块6.1 语法6.2 完整示例7. connlimit7…

[2019红帽杯]easyRE1题解

迷蒙马背眠&#xff0c;月随残梦天边远&#xff0c;淡淡起茶烟。 ——松尾芭蕉 目录 1.查壳 2.拖入64位IDA&#xff0c;找到主函数 3.静态分析主函数 4.wp 1.查壳 ELF文件&#xff0c;64bit 2.拖入64位IDA&#xff0c;找到主函数 没有标明main函数&#xff0c;我们打开str…

OSCP_VULHUB COVFEFE: 1

文章目录前言信息收集渗透过程权限提升前言 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/covfefe-1,199/ 攻击机&#xff1a;kali&#xff08;192.168.132.139&#xff09; 靶机&#xff1a;covfefe&#xff08;192.168.132.146&#xff09; 下载好靶机之后直接使…

vivo 超大规模消息中间件实践之路

作者&#xff1a;vivo 互联网存储技术团队-Luo Mingbo、中间件团队- Liu Runyun 本文根据“2022 vivo开发者大会"现场演讲内容整理而成。 本文主要介绍超大数据规模场景下分布式消息中间件在vivo的应用实践。 在线业务侧主要从RocketMQ集群部署架构、平台系统架构、日常运…

EMC基础:电容的频率特性

本文将对其中使用电容和电感降噪的对策进行介绍&#xff0c;这也可以称为“噪声对策的基础”。在这里使用简单的四元件模型。如果要进一步表达高频谐振时&#xff0c;可能需要更多的元件模型。 电容的频率特性 探讨利用电容器来降低噪声时&#xff0c;充分了解电容器的特性是…

设计模式——软件设计原则

目录 3.软件设计原则 3.1 开闭原则 3.2 里氏代换原则 3.3 依赖倒转原则 3.4 接口隔离原则 3.5 迪米特法则 3.6 合成复用原则 3.软件设计原则 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要…

8、Servlet——Servlet生命周期、Servlet特性

目录 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 1.2 初始化 1.3 服务 1.4 销毁 2、Servlet执行流程 3、代码演示 二、 Servlet特性 1、线程安全问题 2、如何保证线程安全 一、Servlet生命周期 1、生命周期的四个阶段 1.1 实例化 当用户第一次访问Ser…

flutter裁剪三角形,并设置三角形最长边阴影(类似钉钉登录页右上角图标样式)

需求 需要使用flutter创建类似钉钉登录页右上角图表样式 过程 图标 图标直接从阿里巴巴图标库中下载png文件&#xff0c;并设置相应颜色 三角形阴影 样式的主要难点在三角形及三角形阴影这里 1、三角形的裁剪有两种方法&#xff1a; 第一种是 使用边框实现三角形 参考博客…

springboot自动加载--自定义启动器

创建自定义启动器 0、项目总览 1、创建项目&#xff0c;引入依赖 创建项目 spring-boot-jdbc-starter&#xff0c;引入依赖&#xff0c;pom文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apa…

b站黑马Vue2后台管理项目笔记——(1)登录功能

说明&#xff1a; 此项目中使用的是本地SQL数据库&#xff0c;Vue2。 其他功能请见本人后续的其他相关文章。 本文内容实现的最终效果如下图&#xff1a; 目录 一&#xff0e;登录功能的实现 1.登录页面的布局&#xff1a; &#xff08;1&#xff09;查看当前工作区是否干净…

读锁应该插队吗?什么是锁的升降级?

背景 ReentrantReadWriteLock可以设置公平或非公平&#xff0c;为什么&#xff1f; 读锁插队策略 每次获取响应锁之前都要检查能否获取 readerShouldBlockwriterShouldBlock 公平锁 final boolean writerShouldBlock() {return hasQueuedPredecessors(); } final boolean …

打造智慧工地,低代码平台助力基建行业全链路数字化升级

编者按&#xff1a;基建行业数字化转型需求迫切&#xff0c;低代码平台有助于加快数字化转型速度&#xff0c;赋能建筑工程企业升级。本文分析了低代码在基建行业中的应用价值&#xff0c;并指出基建行业对于低代码平台的需求&#xff0c;最后通过相关案例的展示了低代码平台在…

低代码平台解读:“低代码+PaaS”的技术创新实践

数字化转型已经成为必然趋势&#xff0c;几乎所有传统行业都喊出了数字化转型的口号。但在数字化转型中&#xff0c;很多企业面临着成本高、周期长的难题。低代码是其中一种破解难题的方式&#xff0c;如今的低代码已经是企业数字化的核心引擎。 低代码平台越来越多&#xff0…

数据结构——链表(五)

数据结构 文章目录数据结构前言一、什么是链表二、实现单链表1.单链表的结构2.单链表的初始化3.单链表的插入4.遍历链表5.链表长度总结前言 接下来学习一下链表&#xff0c;链表比数组用的更多。 一、什么是链表 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存…

《从0开始学大数据》之如何自己开发一个大数据SQL引擎

背景 大数据仓库 Hive&#xff0c;作为一个成功的大数据仓库&#xff0c;它将 SQL 语句转换成 MapReduce 执行过程&#xff0c;并把大数据应用的门槛下降到普通数据分析师和工程师就可以很快上手的地步。 但是 Hive 也有自己的问题&#xff0c;由于它使用自己定义的 Hive QL …

Linux常用命令——repquota命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) repquota 报表的格式输出磁盘空间限制的状态 补充说明 repquota命令以报表的格式输出指定分区&#xff0c;或者文件系统的磁盘配额信息。 语法 repquota(选项)(参数)选项 -a&#xff1a;列出在/etc/fstab文…

gRPC 基础(二)-- Go 语言版 gRPC-go

gRPC-Go Github gRPC的Go实现:一个高性能、开源、通用的RPC框架&#xff0c;将移动和HTTP/2放在首位。有关更多信息&#xff0c;请参阅Go gRPC文档&#xff0c;或直接进入快速入门。 一、快速入门 本指南通过一个简单的工作示例让您开始在Go中使用gRPC。 1.1 先决条件 Go:…

word排版技巧:这几种特殊版式轻松搞定

我们在许多报刊、杂志中会见到一些带有特殊效果的文档&#xff0c;如首字下沉、分栏排版、竖排文档等形式的排版效果。这些效果其实不是只有专业排版软才能实现&#xff0c;利用Word我们可以轻松完成这些排版效果。1、首字下沉首字下沉是一种突出显示段落中的第一个汉字的排版方…

3小时快速上手sharding-jdbc

今日目标 1、理解分库分表基础概念【垂直分库分表、水平分库分表】 2、能够说出sharding-jdbc为我们解决什么问题 3、理解sharding-jdbc中的关键名词 4、理解sharding-jdbc的整体架构及原理 5、掌握sharding-jdbc的集成方式1.分库分表介绍 1.1 分库分表概述 分库分表就是为了…

普元EOS_工作流引擎相关数据表记录---工作流工作笔记002

由于现在在用普元的工作流引擎,但是,说明文档中没有对数据表的说明 所以整理一下记录下来: 业务流程(com.eos.workflow.data.WFProcessDefine) 属性 名称 类型 processDefID 业务流程ID long processDefName 业务流程名称 String processChName 业务流程显示名称 String desc…