Как один контракт может получить состояние массива другого контракта?

У меня есть два контракта, Token и Voter. Я хотел бы инициировать DAO, чтобы сначала кто-то инициализировал токен и раздал некоторые доли кому угодно.

В контракте Vote только держатели токенов могут голосовать за что-либо (например, определенный проект должен получить некоторое финансирование).

Я использую remix IDE для компиляции своих контрактов, но я не знаю, как контракт Vote должен вызывать контракт Vote. Поэтому я поставил оба в одном месте.

Контракт токена хранит массив адресов, принадлежащих тому, кто получает токены. Теперь контракт Vote должен иметь возможность получить массив и проверить, находится ли человек, который голосует и вызывает контракт Vote, в массиве (хранится токеном).

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
}

Вопрос 1: Как другой контракт может получить доступ к переменной массива в одном контракте? (например, избиратели в приведенном выше примере)

Вопрос 2: Как в ремиксе один контракт может вызывать другой? а куда ставить первую? (например, куда поместить контракт Token и как Vote может его вызвать)?

Ответы (1)

Ошибка компиляции дает первую подсказку:

Неверное количество аргументов для вызова функции: передано 0 аргументов, но ожидается 1

Причина, по которой вызов ожидает аргумент, заключается в том, что votersэто массив, и вы должны указать индекс элемента, который вы хотите найти. Вы не можете скопировать весь массив.

Вот рабочий пример поиска первого элемента в votersмассиве:

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;
    }
}
Спасибо за ответ. Кроме того, не могли бы вы дать мне подсказку по второму вопросу?
Один из вариантов — поместить их все в один файл (как указано выше). Кроме того, вы можете поместить токен в отдельный файл с именем «Token.sol», а затем добавить эту строку в начало файла «Vote.sol»:import "./Token.sol";