Как поместить из (уменьшить длину) массив памяти в Solidity

У меня есть функция, которая получает массив адресов из другого контракта, условно удаляет msg.sender из массива, а затем сохраняет новый массив обратно в этот контракт.

Поскольку массив backerList находится в памяти, я не могу выполнить backerList.length--;

Но я не могу объявить backerList как массив хранения, потому что массив массивов не может быть преобразован в хранилище.

Я застрял здесь, что мне делать?

 address[] memory backerList = syndicate.getBackerList();

 if(syndicate.individualTotalBacking(msg.sender) == 0){

        uint index;

        for(uint i=0; i<backerList.length; i++){
            if (backerList[i] == msg.sender){
                index = i;
            }

        //shifting array

            for(uint k=index; k<backerList.length-1; k++){
                backerList[k]=backerList[k+1];
            }

        }

        backerList.length--;
        syndicate.setBackerList(backerList);
    } else {}
3 голоса | спросил Rick Chen 23 J0000006Europe/Moscow 2018, 11:41:33

2 ответа


3

Вот способ сделать backerList.length--; на address[] memory backerList с помощью встроенной сборки:

assembly { mstore(backerList, sub(mload(backerList), 1)) }

Некоторые важные моменты для запоминания:

  • Убедитесь, что этот код сборки никогда не запускается, когда backerList.length == 0 (не допускайте, чтобы длина массива была ниже)

  • Не пытайтесь использовать это для увеличения размера массива (путем замены sub на add)

  • Используйте его только для переменных с типом типа ...[] memory (например, не используйте его в address[10] memory или address)

Отказ от ответственности: использование встроенной сборки обычно не рекомендуется. Используйте его с осторожностью и на свой страх и риск:)

ответил Jesse Busman 23 J0000006Europe/Moscow 2018, 13:30:04
-1

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

Однако размер массива не изменится, он останется таким же. Вам нужно создать дополнительную переменную для отслеживания размера массива.

ответил Sarvesh Jain 23 J0000006Europe/Moscow 2018, 16:01:29

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

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

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