#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 по умолчанию до длины входного параметра).