Arrays
如何將地址推送到動態數組而不重複?
我正在使用 Ethereum SmartContract 開發一個 Web 應用程序。我有一個問題。
我想將地址添加到地址數組而不重複。但我不能沒有重複。即使數組包含相同的值,它也會添加所有地址。下面是程式碼。
function addTokenHolder(address _tokenHolder) returns (bool success) { uint len = tokenHolders.length; for(uint i = 0; i > len; i++) { if (tokenHolders[i] == _tokenHolder) return false; } tokenHolders.push(_tokenHolder); return true; }
請指教。
麥克斯所說的
>
。在我看來,通常最好避免
for
這種事情的循環。每次迭代都會消耗gas。列表越大,成本越高,因此無法擴展;要麼是因為交易成本變得不可接受,要麼是因為實際超過了區塊氣體限制,交易無法以任何價格執行。這是一種使用映射進行隨機訪問的可擴展方式。我們只是設置了一些記錄已知地址,這樣我們就可以避免重複。
這為以任何規模檢查和插入提供了固定成本。
希望能幫助到你。
contract Unique { address[] public tokenHolders; // scalable way with no iteration mapping(address => bool) public tokenHolderKnown; function scalableAddTokenHolder(address tokenHolder) returns(bool succes) { if(!tokenHolderKnown[tokenHolder]) { tokenHolders.push(tokenHolder); tokenHolderKnown[tokenHolder] = true; return true; } return false; } }
更新:這裡有一些簡單的儲存模式:部落格:Solidity 中的簡單儲存模式
由於循環條件,您的循環永遠不會循環。
嘗試反轉條件
i > len
:for(uint i = 0; i < len; i++) { if (tokenHolders[i] == _tokenHolder) return false; }