Contract-Development

比較兩個字節記憶體時出錯

  • May 20, 2021

我正在 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是類型byteslistOfCert[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);

如果您經常比較長度不等的長字節序列,這可能會帶來一些好處,但代價是額外的程式碼。

最好的方法是實施所有三種方法,並比較不同場景下氣體使用量的變化情況,然後選擇最適合您需求的方法。

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