前言

本次给大家带来的是“智能合约审计系列”的第三篇——“变量覆盖&不一致性检查”。
在这篇文章中将会给大家介绍一些智能合约开发者在合约开发过程中经常会忽略的变量初始化与赋值问题,包括智能合约开发者在开发中因粗心导致的“一致性检查”问题。

变量覆盖

漏洞简介

在智能合约语言 Solidity当中,存在Storage(存储器)和 Memory(内存)两个不同的概念。Storage变量是指永久存储在区块链中的变量。Memory变量是临时的,这些变量在外部调用结束后会被移除。
Solidity中struct和数组在局部变量中默认是存放在storage中的,因此可以利用未定义的存储指针的问题,p会被当成一个指针,并默认指向slot[0]和slot[1],因此在进行p.name和p.mappedAddress赋值的时候,实际上会修改变量testA,testB的值:

数组也是类似的情况:

解决方案

结构体 Unintialised Storage Pointers 问题的正确的解决方法是将声明的 struct 进行赋值初始化,通过创建一 个新的临时 memory 结构体,然后将它拷贝到 storage 中。

数组Unintialised Storage Pointers 问题的正确解决方法是在声明局部变量 x 的时候,同时对 x 进行初始化操作。

Solidity 编译器开发团队在Solidity 0.4.25中对存在 Unintialised Storage Pointers问题的代码进行了修复,否则将无法正常通过编译。开发人员需要关注 Solidity版本,并且使用 Solidity >=0.4.25 编写代码。

案例分析

未初始化的结构体局部变量

pragma solidity ^0.4.22;

contract NameRegistrar {

    bool public unlocked = false;  // registrar locked, no name updates

    struct NameRecord { // map hashes to addresses
        bytes32 name;  
        address mappedAddress;
    }
点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖