Сравнение адресов в Солидности - PullRequest
0 голосов
/ 29 июня 2018

У меня есть ситуация, когда я хотел бы выполнить массив с элементами, которые не являются дубликатами (установлены одинаково), поэтому я написал простую функцию для сравнения адресов перед вставкой.

Функция довольно проста, но она не работает, поэтому я должен попросить о помощи ... заранее спасибо.

// function to prevent insertion of duplicates in array
function isDuplicate() public view returns (bool){
    for(uint i = 0; i < addressIndices.length; i++){
        if(addressIndices[i] == msg.sender) return true;
        else return false;
  }
}

Для полноты вопроса я предоставлю вам дополнительную информацию:

Первый: Основные структуры:

struct Match{
    bytes32 teamHome;
    bytes32 teamAway;
    uint teamHomeGoals;
    uint teamAwayGoals;
    uint  oddsTeamHome;
    uint  oddsTeamAway;
    uint  oddsDraw;
    uint outcome; // outcome of a match ( possible values: '1', 'X', '2', mapped to, because of uint, as: '1', '2', '3');
}
struct Bet{
    address bettor; // address a of creator of a bet;
    bytes32 name; // name in a relation with ^ a provided address;
    uint amount; // deposit on bet;
    uint bet; // match index being bet on;
    uint outcome; // bet placed on a outcome; defined as: '1', 'X', '2', mapped to, because of uint, as: '1', '2', '3';

Второй: функция для размещения ставки.

function placeBet(bytes32 name, uint _outcome, uint desiredMatchIndex, uint _amount) public payable{
// find a way to store a bid in order to be easily searchable, in order to easily send money to winners;
    //   require(!roundEnd, "Interactions with contract are locked, be careful next time!");
    //   require(state == State.Active, "Betting is over, game have already started!");
      require(msg.value > 0, "It isn't possible to place a bet without a money ");
    if(!isDuplicate()){
        addressIndices.push(msg.sender);
    }
      existingBets[msg.sender].push(Bet({
          bettor: msg.sender,
          name: name,
          amount: _amount,
          bet: desiredMatchIndex,
          outcome: _outcome
      }));
    // emit event, finally;
}

Проблема действительно странная: После того, как я сделаю 3 ставки с 3 разными адресами, длина моего массива, который я пытаюсь использовать в качестве набора, равна 7. Если функция сработала, она должна быть 3, если нет, то должна быть 9.

Есть идеи?

Редактировать: функция isDuplicate () работает только для первого вставленного адреса

1 Ответ

0 голосов
/ 02 июля 2018

Текущая функция никогда не выходит за пределы первого элемента массива. Возвращает либо true, либо false немедленно. Попробуйте это вместо этого, но, как я отметил в своем комментарии, mapping позволит вам избежать итерации:

// function to prevent insertion of duplicates in array
function isDuplicate() public view returns (bool) {
    for(uint i = 0; i < addressIndices.length; i++){
        if(addressIndices[i] == msg.sender) return true;
    }

    return false;
}
...