Contract-Development
比較兩個字節記憶體時出錯
我正在 Remix 中測試智能合約,嘗試使用“==”比較兩個字節記憶體時出現以下錯誤:
TypeError: Operator == 與字節記憶體和字節記憶體類型不兼容。
這是我的程式碼:
function removeCertificate(bytes memory CertificateHash, address holder) external isAProvider isTheProviderOrHimself(holder, CertificateHash) { address provider = _CertificatesPerHolder[holder]._CertificateFromProvider[CertificateHash]; bytes[] memory listOfCert = _CertificatesPerHolder[holder]._ListOfCertificates; for(uint i=0; i < listOfCert.length; i++){ if(CertificateHash == listOfCert[i]){ ArrayRemoveResize(i, _CertificatesPerHolder[holder]._ListOfCertificates); break; } } delete _CertificatesPerHolder[holder]._CertificateFromProvider[CertificateHash]; emit _RemoveCertificateIdEvent(provider, holder); }
我在以下行收到錯誤:“ if(CertificateHash == listOfCert
$$ i $$){"
listOfCert
是類型bytes
,listOfCert[i]
是那些字節的一個元素。CertificateHash
是類型bytes
。因此,您無法與bytes
單個byte
. Remix 一定引起了你的注意。如果要比較兩個
bytes
值,可以檢查它們是否具有相同的長度,如果它們相等,則繼續逐個循環遍曆元素。但是由於兩個相等的字節序列將具有相等keccak256
的雜湊值,所以在 Solidity 中比較兩個字節序列的一種更省氣的方法是比較它們的雜湊值:bytes memory a = hex"00112233"; bytes memory b = hex"00112233"; bool areEqual = keccak256(a) == keccak256(b);
你甚至可以嘗試:
bool areEqual = a.length == b.length && keccak256(a) == keccak256(b);
如果您經常比較長度不等的長字節序列,這可能會帶來一些好處,但代價是額外的程式碼。
最好的方法是實施所有三種方法,並比較不同場景下氣體使用量的變化情況,然後選擇最適合您需求的方法。