区块链知识系列 - 系统学习EVM(二)-存储与安全

这篇具有很好参考价值的文章主要介绍了区块链知识系列 - 系统学习EVM(二)-存储与安全。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

特点

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

存储

evm字节码中找到private数据,区块链知识系列,智能合约系列,# 以太坊系列,区块链,智能合约,安全,EVM,虚拟机

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函数,即 回退函数,没有名字,没有参数,没有返回值文章来源地址https://www.toymoban.com/news/detail-781894.html

function(){
}

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

到了这里,关于区块链知识系列 - 系统学习EVM(二)-存储与安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 以太坊EVM源码分析学习记录

    以太坊EVM源码分析学习记录

    analysis.go common.go contract.go contracts.go doc.go eips.go errors.go evm.go gas.go gas_table.go instructions.go interface.go interpreter.go jump_table.go logger.go memory.go memory_table.go opcodes.go operations_acl.go stack.go stack_table.go 2020年版本的evm结构 大致流程 编写合约 生成abi 解析abi得出指令集 指令通过opcode来映射成

    2024年02月01日
    浏览(14)
  • AWR1642 + DCA100EVM 学习笔记

    AWR1642 + DCA100EVM 学习笔记

       ~~     自己在学习TI的AWR1642与DCA1000EVM时候的一些笔记,前面大体上是按照TI论坛上的各种教程来进行的,后面会加自己具体工程的笔记和代码。 因为自己也是零基础,所以想尽可能的写详细一些,方便之后的同学能够快速上手,我也把自己碰到的各种BUG给总结了一下,希

    2023年04月17日
    浏览(44)
  • Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角

    Tokenview X-ray功能:深入探索EVM系列浏览器的全新视角

    Tokenview作为一家领先的多链区块浏览器,为了进一步优化区块链用户的使用体验,我们推出了X-ray(余额透视)功能。该功能将帮助您深入了解EVM系列浏览器上每个地址的交易过程,以一种直观、简洁的方式呈现地址的进出账情况,让您轻松掌握资产流转。 X-ray功能特性 1多级

    2024年02月07日
    浏览(13)
  • 揭秘EVM Opcodes

    揭秘EVM Opcodes

    本文主要源自Macro团队的Gilbert在ETHNewYork 2022分享 Demystifying EVM Opcodes,同时结合evm.codes来理解。 下图摘自Evolution of the EVM Pt. 1: 一个很赞的理解Opcodes的资料见EVM opcodes谜题: Learning Ethereum Virtual Machine Opcodes With EVM Puzzles(https://github.com/fvictorio/evm-puzzles javascript) 学习EVM Opcode

    2024年02月11日
    浏览(11)
  • Ethereum EVM简介

    Ethereum EVM简介

    首先需了解以下基本概念: 1)区块链 2)世界状态 3)账号 4)交易 5)消息 6)去中心化账本 7)原子性和顺序性 以太坊可看成是基于交易的状态机,交易代表了2个状态间的valid arc: 将多笔交易整理打包为区块,区块为package of data: 从状态的角度来看,可将以太坊看成是状

    2023年04月09日
    浏览(10)
  • 了解以太坊虚拟机(EVM)

    了解以太坊虚拟机(EVM)

    以太坊虚拟机(Ethereum Virtual Machine,简称EVM) 是以太坊网络的核心组件之一,它承担着 智能合约执行 的重要任务 智能合约执行环境 :EVM提供了一个安全的环境,用于 执行智能合约 。这些合约以 Solidity 等高级编程语言编写,并在以太坊区块链上部署和执行 不可篡改性 :

    2024年04月26日
    浏览(13)
  • TI毫米波级联雷达评估板 MMWCAS-DSP-EVM 和MMWCAS-RF-EVM

    TI毫米波级联雷达评估板 MMWCAS-DSP-EVM 和MMWCAS-RF-EVM

    本文主要是TI的MMWCAS-DSP-EVM 和MMWCAS-RF-EVM 两块评估板的一些使用心得和毫米波雷达的学习总结。 毫米波(mmWave)是一类使用短波长电磁波的特殊雷达技术。通过捕捉反射的信号,雷达系统可以确定物体的距离、速度和角度。毫米波雷达可发射波长为毫米量级的信号,短波长让所需

    2024年01月16日
    浏览(10)
  • 以太坊虚拟机 EVM 的原理

    作者:禅与计算机程序设计艺术 以太坊虚拟机(Ethereum Virtual Machine,简称EVM)是一个运行在以太坊区块链网络上执行智能合约、存储数据的软件。它负责部署、验证、执行智能合约的代码,并维护所有账户信息。用户可以通过发送交易数据到网络中请求执行智能合约。EVM是一

    2024年02月08日
    浏览(8)
  • 剖析Solidity合约创建EVM bytecode

    前序博客有: Ethereum EVM简介 揭秘EVM Opcodes 在以太坊中,当合约创建时,init code将作为交易的一部分发送,然后返回该合约的实际bytecode——runtime code。详细可参看以太坊黄皮书第7章。 当交易中的recipient地址为空(即0)时,该交易为创建合约交易: 创建合约交易中可包含v

    2024年02月02日
    浏览(11)
  • 以太坊虚拟机EVM介绍,智能合约详解

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

    指的是“一套以数字形式指定的承诺,包括合约参与方可以在上面执行这些承诺的协议”。早在1994年,美国计算机科学家尼克·萨博(Nick Szabo)就提出了智能合约的概念。 智能合约是一种基于区块链技术的自动执行合约的计算机程序。它们是一组以代码形式编写的、在区块

    2024年02月04日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包