Не удалось прочитать массив адресов в функции

function approveUsers(address[] users) onlyOwner {
   for(uint i=0; i<users.length; i++) {
       approvedUsers[users[i]] = true; //Mapping {address: bool}
       ApproveUserForPreSale(users[i], approvedUsers[users[i]]); //Event
   }
 }

Я получаю массив нулевой длины с этим фрагментом. И если я возьму пользователей как статический массив (адрес [10] пользователей), я получу правильную длину, но содержимое будет 0 (0x0..).

edit Это работает в Remix Studio, как и ожидалось, но не в кошельке Ethereum.

Как ты звонишь approveUsers? Это из javascript или из другого контракта на солидность?
appendUser вызывается развертывателем контракта. (через графический интерфейс кошелька etherium).

Ответы (1)

Здесь происходит несколько вещей.

Главная проблема

Ваша функция ничего не возвращает. Похоже, он устанавливает бит в mappingзначение true, и я ожидаю, что это, вероятно, работает, насколько это возможно.

** Другая проблема №1 **

Использование динамического массива в сигнатуре функции означает, что в настоящее время эта функция не сможет взаимодействовать с другими контрактами. Рассмотрите подход с подписью фиксированной длины, например, ``` function AppAppUser(адрес пользователя) onlyOwner return(bool Success) { ApprovedUsers[user] = true; // событие ... вернуть true; }

** Другая проблема №2 **

for i<0; i<unlimited ...— это антипаттерн, который перестанет работать, когда стоимость газа превысит блок gasLimit. Подход с фиксированной длиной, который имеет дело с одним пользователем за раз, решит эту проблему.

Приведенные здесь шаблоны могут сэкономить вам время: существуют ли хорошо решенные и простые шаблоны хранения для Solidity?

Надеюсь, поможет.

Мне нужно одобрить много пользователей одновременно. Одобрение всех пользователей по одному было бы большой работой и очень дорого. В любом другом случае я могу добавить несколько записей, которые приведут к отображению. Почему я даже не могу прочитать то, что было передано.
Это не означает увеличения ручного труда или значительного увеличения стоимости газа. Это означает, что итерация будет выполняться интеллектуальным клиентом или сервером, который будет делать несколько недорогих вызовов, а не одной функцией, которая выполнит огромную работу одним глотком.