Estoy desarrollando un contrato inteligente que tengo dos contratos ( A y B ). Tengo una variable de matriz en A y la lleno con valores, pero cuando obtengo esa variable de B , la dirección de la matriz está vacía.
solidez de pragma ^0.4.10;
contrato Censo{
struct Persona{
string name;
uint age;
uint weight;
uint number;
uint position;
address[] propuestasVotadas;
}
address personaAutorizada;
mapping(address => Persona) public personas;
address[] public personasList;
function Censo(){
personaAutorizada = msg.sender;
}
function existePersona(address _address) public constant returns(bool){
if(personasList.length == 0) return false;
return (personasList[personas[_address].position] == _address);
}
function addPersona(address _address, string _name, uint _age, uint _weight, uint _number) public{
require(!existePersona(_address));
personas[_address].name = _name;
personas[_address].age = _age;
personas[_address].weight = _weight;
personas[_address].number = _number;
personas[_address].position = personasList.push(_address) - 1;
}
function getNumPersonas() public returns(uint){
return personasList.length;
}
}
contrato Ministerio Interior{
struct Propuesta{
string nombre;
string descripcion;
uint numVotos;
uint position;
}
event PropuestaAdded(address _address, uint now);
event PersonaVotePropuesta(address _addressPropuesta, address _addressPersona, uint now);
mapping(address => Propuesta) propuestas;
address[] propuestasList;
address personaAutorizadaMinisterio;
function MinisterioInterior(){
personaAutorizadaMinisterio = msg.sender;
}
function existePropuesta(address _address) returns(bool){
if(propuestasList.length == 0) return false;
return (propuestasList[propuestas[_address].position] == _address);
}
function crearPropuesta(address _address, string _nombre, string _descripcion) returns(bool){
require(!existePersona(_address));
propuestas[_address].nombre = _nombre;
propuestas[_address].descripcion = _descripcion;
propuestas[_address].numVotos = 0;
propuestas[_address].position = propuestasList.push(_address) - 1;
return true;
}
}
Así es como debe declarar y llamar a un contrato dentro de otro contrato.
Censo trustedCenso; //it is a good practice to mark a variable as "trusted" if it was written by yourself, so it is trusted, secure.
trustedCenso = Censo(_censoAddress);
trustedCenso.existePersona(_personAddress);
Y aquí puedes encontrar un patrón de tienda bueno y bien escrito para ayudarte:
Aquí hay algunos patrones simples y útiles en orden creciente de utilidad. - ¿ Existen patrones de almacenamiento sencillos y bien resueltos para Solidity?
Luis Soares
en flor
en flor
Luis Soares
if(propuestasList.length == 0) return false;
. deberías evitar esto. Deberías fallar rápido y duro. Si la longitud de la matriz es cero, no debe llamarse porque está gastando gasolina aquí. En mi humilde opinión, deberías usarrequire(propuestasList.length>0)
en flor