Solidity - список содержит

данный address[] wallets. Каков правильный метод проверки того, что список содержит заданный адрес?

Обеспечивает ли целостность какой-либо собственный список функций?

Если нет, это единственный способ выполнить полную итерацию массива и проверить каждый элемент?

Есть ли более эффективные способы памяти, возможно, отображение?

4 голоса | спросил mono 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 30 Sep 2017 15:44:46 +0300 2017, 15:44:46

3 ответа


6

Solidity не предоставляет метод contains, вам придется вручную перебирать и проверять.

Использование массива для того, что вы пытаетесь достичь, будет очень неэффективным. Лучшим и наиболее экономичным методом является использование структуры данных сопоставления. Задайте ключ как адрес, а значение - логическим. Слишком длинные списки имеют возможность исчерпать газ, когда вы пытаетесь перебирать их.

Если вам нужно перебирать все ключи в сопоставлении, вам нужно иметь внешнюю базу данных, чтобы получить все ключи. База данных может быть заполнена и обновлена ​​на основе событий из смарт-контракта (т. Е. Событие, когда адрес добавлен или удален).

ответил Miguel Mota 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 30 Sep 2017 23:36:12 +0300 2017, 23:36:12
2

Если бы я был вами, я бы использовал такой шаблон:

contract myWallets
{
    mapping (address => bool) public Wallets;

    function setWallet(address _wallet) public{
        Wallets[_wallet]=true;
    }

    function contains(address _wallet) returns (bool){
        return Wallets[_wallet];
    }
}
ответил István András Seres 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 30 Sep 2017 17:34:11 +0300 2017, 17:34:11
0

Если вы начинаете с несортированного массива, и вы не знаете индекс, в котором живут данные, все, что вы можете сделать, это цикл через него. Газ, необходимый для этого, растет, как это делает список, и может стать настолько большим, что контракт становится непригодным.

Очевидным решением является сохранение данных в сопоставлении с помощью address => bool. Это дает вам постоянную стоимость поиска независимо от количества сохраненных элементов.

Если данные отсортированы, у вас есть несколько других опций, включая двоичный поиск, но это не так просто или просто, как сопоставление.

Одна окончательная возможность, если вам действительно нужно сохранить данные в несортированном массиве, - это заставить программное обеспечение пользователя итерировать массив на стороне клиента, чтобы найти индекс своего адреса, а затем передать его в контракт в качестве параметра. Тогда вам просто нужно проверить, действительно ли данные находятся в этом индексе. Однако это становится неудобно, если индекс изменяется, потому что к моменту поступления транзакции пользователю к контракту данные могут быть больше не там, где они его нашли.

ответил Edmund Edgar 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 30 Sep 2017 17:24:01 +0300 2017, 17:24:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132