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

特点

  • EVM出于所谓运算速度和效率方面考虑,采用了非主流的256bit整数。
  • 不支持浮点数
  • 缺乏标准库支持,例如字符串拼接、切割、查找等等都需要开发者自己实现
  • 给合约打补丁或是部分升级合约代码在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.0pragma 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 web3url = ""
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系列

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

  1. 区块链知识系列 - BTC和ETH的区别

    Bitcoin的出块时间 Bitcoin的区块平均产生时间是10分钟,每个区块的大小限制在1M左右 一个事务有了6个确认,我们就认为这个事务已经确定了,所以一个事务要1小时左右才能保证成功(最快),不 ...

  2. 区块链知识系列 - App 与 DApp 的区别

    App vs DApp App = frontend + server DApp = frontend + contracts App DApp 入口 电脑浏览器/手机 Dweb浏览器/数字钱包 协议 ...

  3. 区块链知识系列 - 区块链大事记

    突然想要整理一下区块链界的大事记,正是这些有趣的事迹,使得这门基于密码学的学科,充满了趣味与人性,吸引着我继续去探究. 区块链大事记 2008年11月1日,中本聪发布了比特币白皮书<比特币:一种 ...

  4. 区块链知识系列 - PBFT 共识

    了解 BFT 拜占庭容错(Byzantine Fault Tolerance), 是算法的属性 共识协议要解决的核心问题是在网络中有节点作恶时如何能够达成共识. 要解决这个困难,首先需要了解" ...

  5. 区块链应用系列 - DID

    参考: https://mp.weixin.qq.com/s/3pUC0uRwQAJJ-QC_FF-QTg https://w3c.github.io/did-core https://www.w3. ...

  6. 区块链应用系列 - 溯源

    分类: 实物溯源 信息溯源 标准: 基于移动互联网的防伪溯源验证通用技术条件 国标: 标准号:GB/T 38563-2020 标准制订查询 GB/T 38563-2020.pdf 标准规定区块链服务的 ...

  7. 以太坊开发入门,如何搭建一个区块链DApp投票系统

    点击关注异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 第一节 概述 对于初学者,需要了解以太坊开发相关的基本概念,另外就是如何构建一个基于以太坊的完整去中心化应用例如一个区块链投票 ...

  8. 区块链、比特币的学习

    来源 stormzhang 星球「姚晗」的分享: 首先,区块链和比特币几乎可以说是两个完全不同的领域,唯一的联系就是比特币底层实现的所有技术集合我们称之为区块链. 比特币是由日本中本聪提出的一种货币, ...

  9. 区块链入门系列之梅克尔帕特里夏树

    区块链入门系列文章 区块链基本概念和名词解释 P2P 共识算法 梅克尔-帕特里夏树 从零开始搭建区块链 这里写自定义目录标题 区块链入门系列文章 前言 Merkle树 MPT 总结 前言 在讲基本概念 ...

最新文章

  1. 大火的Apache Spark也有诸多不完美
  2. 专访小书作者刘传君:练太极的“读书机器”
  3. [unreal4入门系列之十二] 在UE4中创建非玩家角色(NPC)
  4. 京瓷 打印 打印机 账户_UV打印机市场竞争的关键是什么?
  5. android系统自带的Service原理与使用
  6. 升级 Visual Studio 2015 CTP 5 的坑、坑、坑
  7. Activiti多人会签例子
  8. linux VPS上装FTP
  9. 大岩俊之实用性阅读指南pdf_《实用性阅读指南》:二八法则、笔记法......开启你的阅读技能...
  10. Oracle 19c: RAC 集群技术的坚持与放弃(含PPT下载)
  11. Java基础学习总结(2)——接口
  12. 蓝屏代码大全 蓝屏全攻略
  13. python中多态是什么意思_python类的多态是什么
  14. c中纠结不清的点(1)
  15. 数电基础 逻辑门电路 学习截图
  16. mysqlcount效率,总结到位
  17. 赵文婧:深入了解 Azure 云平台容器技术服务
  18. mysql 分批提交_spark dataframe 数据批量写入 redis(pipeline、分批提交)
  19. 《写给大家看的设计书》粗读整理
  20. ubuntu下如何控制风扇速度?

热门文章

  1. Vscode 自动保存以及保存格式
  2. 【操作系统篇】第五篇——调度(概念,层次,调度时机,切换与过程,方式,评价指标)
  3. R6034错误的解决(转)
  4. python怎么处理通达信ctp接口数据?
  5. python 创建和使用字典
  6. Python----操作MySql数据库2
  7. 查找并下载开放的音乐数据(.mp3)
  8. Mysql连接数据库url的参数解析
  9. 维度表,实体表,事实表之间的关系
  10. S5PV210 裸机开发驱动之LED灯