Solidity
字節轉換中的預期主要表達式
我有一個契約(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; }
比較
string
s 和bytes
Solidity 是很棘手的。這兩種類型在 Solidity 中的處理方式完全相同,只是string
在智能合約之外返回時會以 UTF-8 解碼。要比較這些類型,請使用
keccak256
:require(success && keccak256(dat) != keccak256(""), "call failed");
空字元串 ("") 被視為空
bytes
數組,這正是您所需要的。嘗試做這樣的事情來檢查結果,你會明白我的意思。將
keccak256
空字節數組的keccak256
雜湊值與空字元串的雜湊值(與空字節數組相同)進行比較:bytes memory dat; require(keccak256(dat) != keccak256(""));