Solidity
用 keccak256 比較結構和數組以節省氣體
昨天剛剛研究了一個可靠的程式碼,我發現除了比較字節,字元串等……
這
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))); } }