Ich kann den Wert einer öffentlichen Zustandsvariablen nicht abrufen

Ich entwickle einen Smart Contract, bei dem ich zwei Verträge habe ( A und B ). Ich habe eine Array-Variable in A und fülle sie mit Werten, aber wenn ich diese Variable von B bekomme , ist die Array-Adresse leer.

Pragma Solidität ^0.4.10;

Vertrag 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;
}

}

Vertrag MinisterioInterior{

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;
}

}

Ist Ihr Array in A öffentlich? Könnten Sie Ihren Quellcode teilen?
Ja, A ist öffentlich
Außerdem bin ich mir nicht sicher, wie ich von B auf die Funktionen von A zugreifen soll.
Ich suche deinen Code. Aber hier ist ein Tipp: if(propuestasList.length == 0) return false;. das solltest du vermeiden. Du solltest schnell und hart scheitern. Wenn die Array-Länge Null ist, sollte es nicht aufgerufen werden, da Sie hier Gas ausgeben. IMHO, sollten Sie verwendenrequire(propuestasList.length>0)
Diese Codezeile ist notwendig, weil ich ohne diese Codezeile getestet habe und einen Opcode-Fehler erhalten habe, aber mit dieser Codezeile behebe ich den Opcode-Fehler. Vor allem ist es notwendig, weil Sie in der ersten Iteration ein leeres Array haben und Sie kein Element in das Array eingeben können.

Antworten (1)

So sollten Sie einen Vertrag in einem anderen Vertrag deklarieren und aufrufen.

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);

Und hier finden Sie ein gutes und gut geschriebenes Ladenmuster, das Ihnen hilft:

Hier sind einige einfache und nützliche Muster in aufsteigender Reihenfolge der Nützlichkeit. - Gibt es gut gelöste und einfache Speichermuster für Solidity?