Solidity

如果合約的呼叫者是另一個合約,則恢復

  • July 10, 2022

我試圖將合約中的函式訪問權限限制為僅限普通使用者地址,以防止此處描述的“恢復並重試攻擊” 。

該連結的快速摘錄:

victim.tryMyLuck();
require(victim.conditionOutcome() == favorable);

換句話說,攻擊者可以選擇僅在“隨機”試驗的結果有利時才送出事務,否則中止。在後一種情況下,唯一的成本很小:執行交易所花費的氣體。即使在 tryMyLuck() 試驗中存在價值轉移,該攻擊仍然有效:如果交易中止,其效果將被恢復。

回到問題:require()交易是否可能來自使用者地址和區塊合約?

可以EXTCODESIZE通過檢查呼叫者合約大小(被呼叫)是否超過零來要求呼叫來自合約地址。

但是您不能要求它來自使用者地址。第二個陳述的問題是契約 在施工期間的契約規模為零。

如果您想將智能合約中的功能訪問權限限制在普通使用者地址。

將其插入函式的第一行:

require(msg.sender.code.length == 0, "Only normal user allowed, Smart Contracts not allowed");

msg.sender返回呼叫函式的地址

0xAddress.code返回任意地址的字節碼。對於普通使用者地址來說,這沒什麼。

例如,如果將呼叫 OnlyTrueUsersCanCall() 函式,它將true為普通使用者和false機器人/智能合約返回。實際上,您可以包括進一步的步驟。

pragma solidity >= 0.8.0 < 0.9.0;
contract StoreData  {
 function OnlyTrueUserCanCall() public view returns(bool){
   if(msg.sender.code.length==0){
     return(true);
     // do your stuff here
   }else{
     return(false);
   //in case of bot or smart conract call the function
   }
 }
}

Solidity Bots 無法呼叫該函式

引用自:https://ethereum.stackexchange.com/questions/131486