Solidity

字節轉換中的預期主要表達式

  • August 27, 2022

我有一個契約(Implementation.sol),它委託呼叫另一個契約(Attacker.sol)來自毀。當我嘗試在 Remix 上編譯 Implementation.sol 時,我收到Expected primary expression該行的錯誤require(success && dat != byte(0x0), "call failed");。不知道該怎麼辦。

contract Implementation {

 function delegateTheCall (address target, string calldata action, address to) public returns (bytes memory) {

   (bool success,bytes memory dat) = target.delegatecall(abi.encodeWithSignature(action, to));
   require(success && dat != byte(0x0), "call failed"); 
   return dat;
 }

比較strings 和bytesSolidity 是很棘手的。這兩種類型在 Solidity 中的處理方式完全相同,只是string在智能合約之外返回時會以 UTF-8 解碼。

要比較這些類型,請使用keccak256

require(success && keccak256(dat) != keccak256(""), "call failed"); 

空字元串 ("") 被視為空bytes數組,這正是您所需要的。

嘗試做這樣的事情來檢查結果,你會明白我的意思。將keccak256空字節數組的keccak256雜湊值與空字元串的雜湊值(與空字節數組相同)進行比較:

bytes memory dat;
require(keccak256(dat) != keccak256(""));

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