Solidity 循环重入

Solidity Loop Reentrancy

我有一个函数可以根据循环的结果为标记赋值。

pragma solidity ^0.8.0;

        function generateId(uint myclassid) public
        {
            (found_,id_)=getAvailableId(myclassid);
             importantMapping[_id]=important_value;                
        }

        function getAvailableId(uint256 _tokenClassId) internal  returns (bool found,uint256 ext_id) 
        {
            //loop the avialble
            //if it is not 0, break and return 
            // if 0
            ext_id=0;
            uint256[] storage availables=tokenClass[_tokenClassId].available_list;
            found=false;
            for (uint i ; i < availables.length;) 
            {
                uint256 val=tokenClass[_tokenClassId].available_list[i];
                if (val!=0)
                {
                    tokenClass[_tokenClassId].available_list[i]=0;
                    ext_id=val;
                    found=true;
                    break;
                }
                unchecked { ++i ;}

            }
            return (found,ext_id);

        }

此函数由任何人都可以访问的 public 函数调用。

这里每个 tokenClass[_tokenClassId] 是一个结构,available_list 是一个数组,其中包含 [0,0,50,20,30]

等值

这个循环只是 return 第一个非零值并将其更改为 0。

但是,我的问题是重入风险。如果同时有 2 个条目进入循环会发生什么......它会 return 相同 ext_id 因为当它们都进入时,第一个非零将是相同的。或者 Solidty 内部是否有任何措施来防止这种情况发生?

一个简单的重入守卫会保护还是会产生更多问题?

What happens if there are 2 entries to the loop at the same time

您的函数在开始执行后没有实现任何跳出它的方法(例如调用另一个函数或另一个合约),这使其免受重入攻击。至少在这个问题中显示的上下文中。

EVM 串行执行所有交易,而不是并行执行。所以即使有2个用户同时提交了执行该功能的交易,并且他们的交易都在同一个区块中被挖出,矿工仍然会分别执行他们的交易,不会相互影响。