Contract-Development
地址的字母數字排名
如何在乙太坊合約中按字母數字順序對合約中 eth 發送者的公共地址進行排序?
一些觀察:
- 只有在每個人都送出了他們的 weis 之後,您才能進行分配。否則,你怎麼知道從哪裡開始增加地址
0x8F
?例如?如果您在每次送出時重新分配,則每個參與者的參賽作品的總 gas 成本將增加。- 排序是一種相當複雜的算法,如果你在智能合約中進行排序,那麼你的方法呼叫成本會更高,參與者越多。而且我認為你很可能會很快達到塊氣體限制(更不用說到那時為止的高昂交易成本)。我建議您考慮一種商業解決方案,在智能合約之外(在 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 樹。這種方式累積排序成本會更高,但它會在許多交易中分攤。