Solidity

用 keccak256 比較結構和數組以節省氣體

  • June 1, 2018

昨天剛剛研究了一個可靠的程式碼,我發現除了比較字節,字元串等……

Keccak256將是比較大型數組或大型結構的完美解決方案。因為正如雜湊函式屬性所說:

給定x 和 y 並假設 (x != y) => 我們可以假設H(x) != H(y)

因此,比較它的雜湊值將使我們花費比迭代數組少得多的 Gas,並向我們證明它們是否相等(與哪個索引無關)。

舉個例子:

假設我們有 2 個相同類型的大數組。是否有可能做一些事情:

Assert.equal(keccak256(array1)), keccak256(array2));

例如,這就是您為了比較字元串所做的事情。(如果我沒記錯的話,最後被解釋為數組)。

為了不做類似的事情:

Assert.equal(array1[i], array2[i]); 
//Implemented on a for loop from i=0 to i=minlength(arr1,arr2)

顯然,添加映射或類似的東西的其他實現可以很好地解決這個問題,但我很想知道是否有任何技巧可以讓你將這種類型的結構與keccak256().

謝謝。

就在這裡!

正如keccak256在 Solidity 中產生的bytes32值一樣,您可以使用==.

一個例子:

pragma solidity 0.4.24;

contract KeccakCompare {
   struct Example {
       uint256 age;
       bytes32 name;
   }

   Example[] public examples;

   function pushExample(uint256 _age, bytes32 _name) external {
       examples.push(Example({
           age: _age,
           name: _name
       }));
   }

   function equals(uint256 _firstIndex, uint256 _secondIndex) external view returns (bool) {
       return equals(examples[_firstIndex], examples[_secondIndex]);
   }

   function equals(Example storage _first, Example storage _second) internal view returns (bool) {
       // Just compare the output of hashing all fields packed
       return(keccak256(abi.encodePacked(_first.age, _first.name)) == keccak256(abi.encodePacked(_second.age, _second.name)));
   }
}

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