Arrays

如何將地址推送到動態數組而不重複?

  • March 13, 2017

我正在使用 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;
}

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