Solidity
如果合約的呼叫者是另一個合約,則恢復
我試圖將合約中的函式訪問權限限制為僅限普通使用者地址,以防止此處描述的“恢復並重試攻擊” 。
該連結的快速摘錄:
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 } } }