No se pueden agregar números a una matriz en Solidity

tengo una función que recibe un número, autentic evalúa si ya está en una matriz, si lo está, debería devolver falso, si no lo está, devolver verdadero. Entonces onlyOneVote agregará el número a la matriz si es verdadero y no si es falso. El problema es que la función nunca agrega nada a la matriz.

uint32[100] public people;
uint8 public counter;

function onlyOneVote(uint32 ida) public returns(bool) {
  bool a = autentic(ida);
  if (a == true) {
    people[counter] = ida;
    counter = counter + 1;
  }
  return a;
}

function autentic(uint32 idb) public returns(bool) {
  bool b;
  for(uint i = 0; i< people.length; i++) {
    if (people[i] == idb) {
      b = false;
      break;
    } else {
      b = true;
    }
  }
  return b;
} 

Respuestas (2)

Creo que es seguro decir que su código se puede reducir a esto:

uint32[100] public people;
uint8 public counter;

mapping (uint32 => bool) public alreadyVoted;

function vote(uint32 id) public returns(bool) {
  if (alreadyVoted[id]) return(false);
  alreadyVoted[id] = true;
  people[counter] = id;
  counter = counter + 1;
  return(true);
}

Llámalo con web3 así:

contractInstance.vote.sendTransaction(id, {from: _from});

dónde _fromestá la dirección de su cuenta (web3.eth.accounts[0] tal vez).

sigue siendo el mismo problema. cuando se prueba con ID, no hay nuevos ID en la matriz, aún están vacíos después de la prueba: > contractInstance.vote.call(1) true > contractInstance.vote.call(1) true
En Ethereum, puede llamar a funciones en contratos usando dos métodos diferentes: call() o sendTransaction(). Cuando la función cambia el estado de la cadena de bloques (y ese es el caso de esta función), debe usar sendTransaction().
Gracias. Tengo una última pregunta, ¿a qué "dirección de cuenta" te refieres? No entiendo esa parte.. Perdón por tantas preguntas XD
La dirección de la cuenta desde la que se origina la transacción. Puedes usar cuentas[0]
me envía "Error de referencia: las cuentas no están definidas
Lo siento, mi error, quise decir web3.eth.accounts[0].

Este código lo hará, está probado y aquí tienes la dirección para interactuar con él en Kovan: 0xc807caebda01eaffd7998ab7fd9fcc4a2cf5730c

pragma solidity ^0.4.18; 


contract Test {

uint32[100] public people;
uint256 public counter; // Is uint256 because the on the array[100], 100 is a uint256 variable.
mapping(uint32 => bool) public voteVerifier; //mapping saves you so much gas at checking if it's in the array


function onlyOneVote(uint32 ida) public returns(bool) {
  require(!voteVerifier[ida]); //If false, enter to add the uint32 to array.

    people[counter] = ida; //Add the ida to the array
    counter = counter + 1;

    voteVerifier[ida] = true;//Set on the mapping that this uint32 is now on the array.
  return true;
}

}

Algunas cosas para comentar:

  • Es mucho mejor usar un mapeo para verificar si un número está en la matriz porque no es una búsqueda dependiente del tiempo . Find params on arrays te permite operar mucho más a medida que aumenta el tamaño de la matriz . Pero con las asignaciones, la búsqueda dura y cuesta lo mismo incluso si se incluyeron millones de valores en la matriz .

Aquí tienes información: http://solidity.readthedocs.io/en/v0.4.21/types.html#mappings

Este código:people[counter] = ida; //Add the ida to the array counter = counter + 1;

Se pueden reemplazar para ser más precisos y más baratos en el gasto de gas:people.push(ida)//Puts on the last array's position the item ida;

¡¡Espero eso ayude!!

No puede enviar a una matriz con su tamaño definido. people.push(id) no se compilará.
Lo sé, es por eso que no está en el código de la solución, es solo un consejo :)
Gracias por los útiles consejos sobre el mapeo para usar mucha menos gasolina. podría usar una matriz o mapeo definido 'sin tamaño' debido al problema del bucle infinito y, en este caso, sé la cantidad de votantes, comencé a usar push pero no compilé.
Como dijo Bordalix, push solo se puede usar con arreglos dinámicos, no con arreglos fijos. Entonces, para limitar la cantidad de votos si sabe que es 100, haga un requerimiento en la función que agrega números a la matriz que la controla.