Wie kann ein Vertrag den Array-Status des anderen Vertrags abrufen?

Ich habe zwei Verträge, Token und Voter. Ich möchte ein DAO initiieren, so dass zuerst jemand ein Token initialisiert und einige Anteile an wen er will verteilt.

Im Abstimmungsvertrag dürfen nur die Token-Inhaber für etwas stimmen (z. B. soll ein bestimmtes Projekt eine gewisse Finanzierung erhalten).

Ich verwende Remix IDE, um meine Verträge zu kompilieren, aber ich weiß nicht, wie der Vote-Vertrag den Vote-Vertrag aufrufen soll. Daher habe ich beide an der gleichen Stelle platziert.

Der Token-Vertrag speichert eine Reihe von Adressen, die demjenigen gehören, der die Token erhält. Jetzt sollte der Vote-Vertrag in der Lage sein, das Array abzurufen und zu prüfen, ob die Person, die abstimmt und den Vote-Vertrag aufruft, im Array ist (von Token gespeichert).

contract Token {
address [] publick voters;
//... some functions that assings values to the array...
}

contract Vote{
 // people first vote... Assume they've already done that.
 //Below we want to check which of them have tokens.

Token token= new Token();
address valid_voters = token.voters();// Here an error shows up

// then check
}

Frage 1: Wie kann auf eine Array-Variable in einem Vertrag von dem anderen zugegriffen werden? (z. B. Wähler im obigen Beispiel)

Frage 2: Wie kann im Remix ein Vertrag den anderen aufrufen? und wohin mit dem ersten? (z. B. wo soll der Token-Vertrag platziert werden und wie kann Vote ihn aufrufen)?

Antworten (1)

Der Kompilierungsfehler gibt den ersten Hinweis:

Falsche Argumentanzahl für Funktionsaufruf: 0 Argumente angegeben, aber 1 erwartet

Der Grund, warum der Aufruf ein Argument erwartet, ist, dass voterses sich um ein Array handelt, und Sie müssen den Index des Elements angeben, das Sie nachschlagen möchten. Sie können nicht das vollständige Array kopieren.

Hier ist ein funktionierendes Beispiel für die Suche nach dem ersten Element im votersArray:

pragma solidity ^0.4.15;

contract Token {
    address [] public voters;

    function Token(address first_voter) {
        voters.push(first_voter);
    }
}

contract Vote{
     // people first vote... Assume they've already done that.
     //Below we want to check which of them have tokens.

    function check_first_voter() returns (address) {
        Token token = new Token(0x123);
        address valid_voter = token.voters(0);  // Retrieve first voter

        // then check
        assert(valid_voter == 0x123);
        // Success!
        return valid_voter;
    }
}
danke für die Antwort. Könnten Sie mir bitte auch einen Hinweis zur zweiten Frage geben?
Eine Möglichkeit besteht darin, sie alle in derselben Datei abzulegen (wie oben). Alternativ können Sie Token in eine separate Datei namens "Token.sol" einfügen und dann diese Zeile oben in der Datei "Vote.sol" hinzufügen:import "./Token.sol";