Solidity

使用 Solidity 比較 2 個不同數組中的項目的最有效方法是什麼?

  • April 11, 2022

在 Solidity 智能合約中,我有 2 個需要比較的數組。我希望輸出是 3 個不同的數組,可用於契約中的其他邏輯。

數組範例:

contract myLists {

   string[5] public listOne = ['AAA','BBB','CCC','DDD','EEE'];
   string[5] public listTwo = ['AAA','BBB','DDD','FFF','GGG'];

}

輸出應該是:

#Output 1: items in listTwo that do not exist in listOne   
string[] public output1['FFF','GGG']
#Output 2: items in listTwo that exist in listOne
string[] public output2['AAA','BBB','DDD']
#Output 3: items in listOne that do not exist in listTwo
string[] public output3['CCC','EEE']

從我所有的研究來看,Solidity 中的數組功能似乎非常有限,唯一的方法可能是 for 循環。

使用陣列實現這一目標的最省氣的方法是什麼。或者,是否有更有效的方法使用不同的儲存方法,例如結構?

謝謝。

我可能在這裡犯了一些小錯誤,但你明白了。使用 keccak256(abi.encodePacked(“ABC”)) 能夠比較字元串。然後一次循環遍歷list2的一個元素並將其與list1中的所有元素進行比較,當它看到一個相同的元素時,它將其添加到新列表中,跳出內部循環並進入下一個元素在 list2 中並將其與 list1 中的所有元素進行比較……等等。


   //Output: items in listTwo that exist in listOne
   function compare() public view returns(string[] memory) {
       // write to memory to save gas when looping through
       string[5] memory list1 = listOne; 
       string[5] memory list2 = listTwo;

       string[] memory l2Inl1;
       uint nonce;
       for(uint i; i < 5; i++){
           for(uint j; j < 5; j++){
               if(keccak256(abi.encodePacked(list2[i])) == keccak256(abi.encodePacked(list1[j]))){
                   l2Inl1[nonce] = list2[i];
                   nonce++;
                   break
               }
           } 
       }
       return l2Inl1;
   }

您需要為您需要的每個輸出建構類似的東西。根據您執行的鏈,在每個字元串上​​執行 keccak256(abi.encodePacked()) 的氣體成本可能會變得昂貴。我會考慮在鏈下做這個。或者首先將字元串轉換為(或從一開始就使用)字節列表,您可以對其進行比較。但是,將它們轉換回來可能會返回意外結果,這完全取決於您的案例,我不知道。但這至少應該能給你一些想法!

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