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个用户同时提交了执行该功能的交易,并且他们的交易都在同一个区块中被挖出,矿工仍然会分别执行他们的交易,不会相互影响。
我有一个函数可以根据循环的结果为标记赋值。
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个用户同时提交了执行该功能的交易,并且他们的交易都在同一个区块中被挖出,矿工仍然会分别执行他们的交易,不会相互影响。