Напишите список адресов для смарт — контракта в одной транзакции-Массив строк для контракта

#arrays #ethereum #solidity

Вопрос:

Я хочу отправить несколько адресов в свой смарт — контракт, и контракт должен сохранить их на карте (например) — моя цель состоит в том, чтобы предоставить этим адресам специальную роль контроля доступа.

Как я могу выполнить итерацию по массиву, который был передан функции?

Или как я могу предоставить своему контракту/функции этот список/массив адресов?

 mapping(address => address) winnerAddresses;
// set the addresses in store
function setStore(address[] _winnerAddresses) public {
  winnerAddresses[_winnerAddresses] = _winnerAddresses;
}

 

После того, как мы сохраним адреса в контракте, я бы вызвал функцию addUserToRole для каждого заданного адреса.

Был бы счастлив, если бы вы могли мне помочь! Большое спасибо, mh

Ответ №1:

В зависимости от вашего варианта использования вы можете хранить значения как array вместо mapping :

 pragma solidity ^0.8;

contract MyContract {
    address[] winnerAddresses; // store as an array

    function setStore(address[] memory _winnerAddresses) public {
        winnerAddresses = _winnerAddresses;
    }
}
 

Или , если вы предпочитаете хранить их в a mapping , вам нужно выполнить итерацию ввода array и сохранить каждый элемент отдельно.

 pragma solidity ^0.8;

contract MyContract {
    // default value is `false`, so by default there's no winner
    // when you set the `winnerAddress[<some_address>]` to `true`, it means that this address is a winner
    mapping(address => bool) winnerAddresses;

    function setStore(address[] memory _winnerAddresses) public {
        for (uint i = 0; i < _winnerAddresses.length; i  ) {
            winnerAddresses[_winnerAddresses[i]] = true;
        }
    }
}
 

В настоящее время (плотность 0,8) невозможно передать a mapping в качестве аргумента функции.

Комментарии:

1. Спасибо, но он подумал, что невозможно иметь «открытый» массив, который не имеет определенной длины?

2. @LOM В солидности есть два типа массивов. Фиксированный размер и динамический размер (это то, что вы, вероятно, подразумеваете под «открытым»). Вы можете найти документы здесь … Существуют некоторые ограничения при работе с массивами в памяти — например, вы не можете изменять их размер (в памяти). Но здесь вы работаете с массивом хранения, поэтому можете безопасно изменить его размер (от 0 по умолчанию до длины входного параметра).