Contract-Development

地址的字母數字排名

  • March 15, 2022

如何在乙太坊合約中按字母數字順序對合約中 eth 發送者的公共地址進行排序?

一些觀察:

  1. 只有在每個人都送出了他們的 weis 之後,您才能進行分配。否則,你怎麼知道從哪裡開始增加地址0x8F?例如?如果您在每次送出時重新分配,則每個參與者的參賽作品的總 gas 成本將增加。
  2. 排序是一種相當複雜的算法,如果你在智能合約中進行排序,那麼你的方法呼叫成本會更高,參與者越多。而且我認為你很可能會很快達到塊氣體限制(更不用說到那時為止的高昂交易成本)。我建議您考慮一種商業解決方案,在智能合約之外(在 javascript 或 python 中)進行這些排序和投注分配,然後將相應的投注號碼分配給每個地址。

話雖如此,您實際上可以對事物進行solidity 排序。看看這個執行緒,看看如何。

在上面的範例中,他們正在對uint[] public data;數組進行排序。您可能會有一個address[] public deponents;需要排序的數組。

鑑於 ETH 地址是 20 字節值,可以對它們應用排序運算符,因此排序算法應該按原樣工作。

是的,有可能。您可以比較地址,從而對它們進行排序:

function sortAddresses (address [] memory addresses) public pure returns (address [] memory) {
   for (uint256 i = addresses.length - 1; i > 0; i--)
        for (uint256 j = 0; j < i; j++)
           if (addresses [i] < addresses [j])
               (addresses [i], addresses [j]) = (addresses [j], addresses [i]);

   return addresses;
}

輸入:

0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
0x742d35Cc6634C0532925a3b844Bc454e4438f44e
0x4E9ce36E442e55EcD9025B9a6E0D88485d628A67
0x53d284357ec70cE289D6D64134DfAc8E511c8a3D
0x66f820a414680B5bcda5eECA5dea238543F42054
0xab7c74abC0C4d48d1bdad5DCB26153FC8780f83E
0x61EDCDf5bb737ADffE5043706e7C5bb1f1a56eEA
0xDc76CD25977E0a5Ae17155770273aD58648900D3

輸出:

0x4E9ce36E442e55EcD9025B9a6E0D88485d628A67
0x53d284357ec70cE289D6D64134DfAc8E511c8a3D
0x61EDCDf5bb737ADffE5043706e7C5bb1f1a56eEA
0x66f820a414680B5bcda5eECA5dea238543F42054
0x742d35Cc6634C0532925a3b844Bc454e4438f44e
0xab7c74abC0C4d48d1bdad5DCB26153FC8780f83E
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
0xDc76CD25977E0a5Ae17155770273aD58648900D3

但是,由於氣體限制問題,一次對大量地址進行排序可能不是一個好主意。更好的方法是將發件人的地址保存到排序樹中,例如AVL 樹。這種方式累積排序成本會更高,但它會在許多交易中分攤。

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