Рубрики
Без рубрики

Создание небольшой библиотеки в солидности

Привет, ребята, надеюсь, у вас все отлично !!! 😎. В наши дни блокчейн довольно популярен. Я имею в виду, что это … помечено блокчейном, солидностью, Ethereum, JavaScript.

Привет, ребята, надеюсь, у вас все отлично !!! 😎. В наши дни блокчейн довольно популярен. Я имею в виду, что это безумие в сети, особенно с ростом стоимости биткойнов. Следуя этой тенденции, я бы написал самую большую статью всех времен. 😈. Я шучу .. лол. Итак, в этом посте я бы говорил о том, как я создал небольшую библиотеку в солидности. То, что побудило меня сделать это, было связано с тем, что мне нужен был способ воссоздать функцию в солидности, которая ведет себя как функция JavaScript ниже.

function getPositiveAndSquare(arr){
  return arr.filter(i=>i>0).map(i=>i*i)
}

console.log(getPositiveAndSquare([2,3,4,0,2]))
// returns [4,9,16,4]

Приведенная выше функция принимает массив в качестве аргумента, фильтруют числа в массиве, оставляя только положительные числа, и, наконец, она преобразует положительные числа в свой квадрат 🥱. Хорошо, это, кажется, довольно легко сделать в JavaScript, но попытка повторить функцию, которая имеет аналогичную логику в солидности, не была такой простой.

Поэтому, чтобы разобраться, я вошел в государство Аватар, чтобы разблокировать свою чакра 🦾.

Но это было слишком много, чтобы справиться, заставляя меня тратить много времени, выясняя это. Это заставило меня задать себе большой вопрос, Мое государство подлинно? , я могу согнуться? , Могу ли я кодировать? , Для меня есть прочность? . Мне хотелось плакать Но потом я услышал голос сверху, говорил со мной. Голос заставил меня чувствовать себя заряженным, и я чувствовал один со своим кодом. Я называю это запутанное просветление или то, что смертные называют состояние потока Анкет Я начал видеть скрытые коды вселенной безрассудны. Я мог видеть изображения и текст в простом двоичном формате. В этот момент я был готов решить это 😎

Мое решение проблемы

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

library util {
    function filterFunc(
        int256[] memory self,
        function(int256) pure returns (uint256) f
    ) internal pure returns (uint256[] memory newArr) {
        uint256[] memory tempArr = new uint256[](self.length + 1);

        for (uint256 i = 0; i < self.length; i++) {
            if (self[i] > 0) {
                tempArr[tempArr.length - 1] = tempArr[tempArr.length - 1] + 1;
                tempArr[tempArr[tempArr.length - 1] - 1] = f(self[i]);
            }
        }

        newArr = new uint256[](tempArr[tempArr.length - 1]);
        for (uint256 j = 0; j < newArr.length; j++) {
            newArr[j] = tempArr[j];
        }
    }
}

contract MyContract {
    using util for int256[];

    function getPositiveAndSquare(int256[] memory arr)
        public
        pure
        returns (uint256[] memory)
    {
        return arr.filterFunc(square);
    }

    function square(int256 val) private pure returns (uint256) {
        return uint256(val * val);
    }
}

Поток кода

Сначала я создал контракт с именем, MyContract Анкет Внутри контракта я создал функцию с именем, getPositiveAndsquare .

function getPositiveAndSquare(int256[] memory arr)
        public
        pure
        returns (uint256[] memory)
    {
        return arr.filterFunc(square);
    }

GetPositiveAndsquare Функция принимает массив со значениями без знака целых чисел с память в качестве места хранения и обру как имя его параметра. Он возвращает массив не подписываемых целых чисел.

В пределах GetPositiveAndsquare Функция вы можете увидеть FilterFunc Метод добавляется к обру параметр. Это стало возможным благодаря созданию библиотеки прочности, которая имеет функцию ( filterfunc ), которая соответствует тому же типу, что и обру (Int256). FilterFunc Функция принимает функцию с именем квадрат Анкет

Проверка определения FilterFunc Функция в разделе библиотеки вы можете видеть, что он принимает два параметра.

Так почему я передаю только квадрат функционировать в это? Это потому, что обру Параметр соответствует определению типа первого фильтровая функция параметр. Итак, arr Paremter становится первым аргументом FilterFunc функция, пока квадрат Функция становится его вторым аргументом.

квадрат Функция принимает подписанное целое число и возвращает неподписанное целое число.

    function square(int256 val) public pure returns (uint256) {
        return uint256(val * val);
    }

Это потому, что квадрат Функция действует на подписанные целые числа я параметр FilterFunc функция Типы должны быть одинаковыми, чтобы предотвратить ошибки. Он возвращает неподписанное целое число, потому что возвращаемое значение должно быть положительным целым целом.

В договоре, MyContract , вы можете увидеть эту линию:

using util for int256[];

Это означает прикрепление функций библиотеки Solidity к типу Int256 [] в контракте. Вот что сделано прикреплять FilterFunc к arr возможно. Это также сделано arr быть первым аргументом FilterFunc функция

В библиотеке у меня есть только одна функция с именем, FilterFunc Анкет У него есть два параметра я и f

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

library util {
    function filterFunc(
        int256[] memory self,
        function(int256) pure returns (uint256) f
    ) internal pure returns (uint256[] memory newArr) {
        uint256[] memory tempArr = new uint256[](self.length + 1);

        for (uint256 i = 0; i < self.length; i++) {
            if (self[i] > 0) {
                tempArr[tempArr.length - 1] = tempArr[tempArr.length - 1] + 1;
                tempArr[tempArr[tempArr.length - 1] - 1] = f(self[i]);
            }
        }

        newArr = new uint256[](tempArr[tempArr.length - 1]);
        for (uint256 j = 0; j < newArr.length; j++) {
            newArr[j] = tempArr[j];
        }
    }
}

Причина, по которой это заняло больше времени, чем ожидалось, заключается в том, что массивы памяти не реализуют поп и push функционирует как член, длина Участник только для чтения, а библиотека Solidity не позволяет определять в нем переменные состояния.

Поэтому, чтобы обойти этот барьер, мне пришлось создать новый массив памяти под названием Temparr Анкет Temparr был создан как один индекс дольше, чем я множество. Я использовал последний индекс Temparr чтобы хранить

При создании динамического массива памяти в солидности все индексы инициализируются с 0 для типа INT. Так что это означает все или нет все индексы Temparr Массив будет обновлен. Некоторые останутся нулю. Например, проверьте псевдод ниже

//self array
self = [2,3,0,-1]
//during initialization of tempArr
temArr = [0,0,0,0,0]
//after lopping through self array
tempArr = [4,9,0,0,2]

Наконец, я создал динамический массив памяти под названием Newarr Анкет Он был построен с использованием значения последнего индекса Temparr как его длина, когда он заполняется значениями темпара до индекса значения последнего индекса Temparr Анкет

Так вот как я смог реализовать функцию фильтра в солидности

Примечание: этот пост основан на версии Solidity 0.8.0

И я надеюсь, что вы узнали что -то новое о прочности 😁. Вы также можете помочь мне поделиться этим и прокомментировать. Большое спасибо 🙏

Оригинал: “https://dev.to/sammychinedu2ky/making-a-small-library-in-solidity-5917”