Ответы пользователя по тегу Blockchain
  • Может кто-то посоветовать книги для создания блокчейна?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Хорошие книги:
    Андреас Антонопулос - Осваиваем биткойн. Программирование блокчейна.
    Имран Башир - Блокчейн архитектура криптовалюты
    Калле Розенбаум - Грокаем технологию Биткоин
    Ответ написан
    Комментировать
  • Ефир это solidity, то как называется язык для контрактов на bsc?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Тоже solidity, в BSC работает тот же EVM от эфира.
    Т.е. вы можете даже разрабатывать и деплоить смарт-контракты из Remix.
    Ответ написан
    Комментировать
  • Как узнать цену токенов через web3?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    В смарт-контракте самого токена (ERC-20), в котором вы получаете баланс, информации о цене нет.
    Информацию о цене нужно получать на биржах, т.е. там, где эти токены торгуются.

    Самый простой способ получения цены - по API биржи, обычно это HTTP или WebSocket.
    Например у тех пар, что торгуются на бинанс можно получить вот так https://binance-docs.github.io/apidocs/spot/en/#sy...

    Если же нужно получать цены с децентрализованной биржи или получать цену внутри своих смарт-контрактов - то нужно брать цены из смарт-контрактов самих DEX.

    Например для Pancake вот так можно узнать цену
    // 0.0001 - кол-во токена1
    // 18 - кол-во знаков после запятой
    const token1AmountIn = ethers.utils.parseUnits('0.0001', 18)
    const amounts = await pancakeRouterV2Contract.getAmountsOut(token1AmountIn, [Token1Address, Token2Address])
    // в amounts[1] будет кол-во токенов2, которые можно получить после обмена на кол-во токена 1
    const price = amounts[1] / token1AmountIn


    Код контракта Pancake Router можно посмотреть тут https://bscscan.com/address/0x10ed43c718714eb63d5a...
    Ответ написан
    Комментировать
  • Можно ли обойти лимит запросов на BSC and ETH?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Если вы делаете запросы без ключа доступа к API - достаточно установить на сервере дополнительные IP адреса и делать запросы к API с разных IP.

    Еще, как вариант, можно отправлять запросы через прокси.
    Но вариант с IP лучше, т.к. прокси часто тормозят, глючат и т.д. + с них может еще кто-то, кроме вас, отправлять запросы. Ну и по цене значимой разницы не будет.
    Этот вариант можно использовать только если докупить доп. IP на сервер не возможно.
    Но тогда лучше просто поменять сервер/хостера ))

    Если же делаете запросы с "ключём доступа" к API - тогда придётся сделать несколько аккаунтов чтобы получить несколько таких ключей доступа, т.к. в этом случае отслеживаются запросы именно по ключу.
    Но, для надёжности, лучше взять еще и отдельный IP под каждый такой ключ чтобы на стороне BSC/ETH вас было труднее вычислить.

    Для Node.js будет что-то типа такого
    var http = require('http');
    
    var options = {
      hostname: 'www.example.com',
      localAddress: '202.1.1.1', // сюда нужно будет по очереди подставлять IP, которые у вас будут
    };
    
    var req = http.request(options, function(res) {
      res.on('data', function (chunk) {
        console.log(chunk.toString());
      });
    });


    UPD: если у вас запросы однотипные, например проверка баланса 1000 пользователей, перевод токенов сразу на 100 кошельков - есть вариант сделать отдельный смарт-контракт типа "multicall", т.е. вы делаете смарт-контракт, который в параметре принимает список кошельков для проверки балансов, в цикле делает запросы и отдаёт ответ с данными балансов всех запрошенных кошельков. По такому принципу работают "multisend" контракты, т.е. когда вы за одну транзакцию делаете сразу несколько переводов на разные кошельки.
    Ответ написан
    Комментировать
  • Dapp разработка с чего начать?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Для разработки Dapps нужно, как минимум, разобраться как делается фронтенд - HTML/CSS/JavaScript + научиться работать фреймворками типа React/Vue.js и т.д.

    Вот отличный roadmap фронтенд разработчика https://roadmap.sh/frontend

    Далее, нужно разобраться с предметной областью, начать можно с этого roadmap https://github.com/OffcierCia/DeFi-Developer-Road-Map

    Хорошая книга Имран Башир: Блокчейн: архитектура, криптовалюты, инструменты разработки, смарт-контракты

    Далее, лучше изучить Solidity, т.к. начинать писать смарт-контракты на C/C++ будет многократно сложнее и дольше.

    Очень советую книги:
    Фролов - Создание смарт-контрактов SOLIDITY для блокчейна
    Бурков - Ethereum работа с сетью (немного устарела, но зато там много реальных примеров)
    После этих книг у меня сложилась чёткая картина

    Ну и, полезные ссылочки на официальные сайты
    https://ethdocs.org/
    https://docs.ethers.io/
    https://docs.soliditylang.org/
    Ответ написан
    Комментировать
  • Как получить список новых смарт конрактов?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Я с такой задачей еще не сталкивался, но вижу, что пока вообще никто не ответил.
    Постараюсь помочь.

    С уверенностью можно сказать то, что "копать" нужно в сторону анализа транзакций.

    Транзакция в результате которой был создан смарт-контракт выглядит вот так
    https://ropsten.etherscan.io/tx/0x5aa752d86932b36e...

    Обратите внимание на поле "To"
    614f96bae07ca718175271.png

    Не исключаю, что если правильно декодировать поле "Input Data" - также можно получить информацию о том, что в этой транзакции должен создаться смарт-контракт.
    614f9716b7e63008558709.png
    Т.е. определить, что в результате этой транзакции создаётся смарт-контракт и после этого взять его адрес из поля To.

    Знаю три варианта, которые можно рассмотреть для поиска решения:

    1) https://docs.etherscan.io/, это бесплатное API от Ethereum (то, что на скриншотах).

    2) https://infura.io, там, при помощи библиотек от эфира github.com/ethereum/go-ethereum я вычитывал транзакции и декодировал input data. Также там можно делать подписки.

    3) можно попробовать поставить ноду эфира к себе на сервер и библиотеками эфира подключаться уже к ней, вместо infura.io и анализировать логи. Этот вариант имеет смысл только если вам не подходит ни etherscan.io, ни infura.io

    Надеюсь это вам поможет.
    Ответ написан
    Комментировать
  • Как парсить данные с блокчейна?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Смотря какая именно вам нужна информация.

    Если брать coinmarketcap - сначала нужно сформировать список монет.
    Его можно взять из API бирж + один из способов формирования списка монет - добавление их вручную, через заявку https://support.coinmarketcap.com/hc/en-us/article....

    Если нужно узнать цены монет, объём торгов - нужно делать запросы к API бирж, на которых есть эти монеты (они бесплатные с разумными лимитами).

    Если нужно узнать эмиссию - тут тоже много вариантов, например у токенов стандарта ERC20 на блокчейне эфира - можно вызывать метод контракта totalSupply.

    Если нужны какие то данные о движениях внутри блокчейнов - тогда нужно анализировать логи транзакций каждого конкретного блокчейна.
    При этом, если не пользоваться чужими API - придётся ставить ноды нужных блокчейнов к себе на сервер и ихними же библиотеками их анализировать.
    Ответ написан
    2 комментария
  • С чего и как начать углубляться в сферу разработки под блокчейн и криптовалюты?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    > решил посмотреть в сторону разработки сервисов для криптовалют и стартапов на базе блокчейна
    Как я понимаю речь идёт о создании децентрализованных приложений.

    Сначала нужно разобраться с предметной областью, начать можно с этого roadmap https://github.com/OffcierCia/DeFi-Developer-Road-Map

    Хорошая книга Имран Башир: Блокчейн: архитектура, криптовалюты, инструменты разработки, смарт-контракты

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

    Лучше начать изучение с этой книги:
    Фролов - Создание смарт-контрактов SOLIDITY для блокчейна
    После её прочтения у вас начнёт складываться картина.

    Потом, я бы посоветовал прочесть Бурков - Ethereum работа с сетью, там много примеров смарт-контрактов, реально добавит понимания.
    Правда эти две книги уже устарели, синтаксис сейчас уже немного отличается, но альтернативы пока не знаю.

    Ну и, прочитать полностью все материалы на этих сайтах
    https://ethdocs.org/
    https://docs.soliditylang.org/
    https://web3js.readthedocs.io/

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

    Если приложение будет работать в броузере - нужно будет прокачать front-end разработку.
    Вот хороший roadmap по frontend разработке https://roadmap.sh/frontend

    Если это будет мобильное приложение - значит мобильную разработку.
    Для мобильной разработки рекомендую использовать Flutter, на нём можно сделать приложение сразу и под iOS и под Android, но при этом оно будет нормально и быстро работать.

    Надо отметить, что разработка смарт-контрактов, front-end, mobile - это три разных специальности.
    Обычно front-end и мобильный разработчик - это разные люди, которые участвуют в разработке проекта.

    Также надо сказать, что смарт-контракты делаются достаточно быстро (ERC-20 токен можно сделать и опубликовать за несколько минут). В реальности, конечно, всё сильно зависит от ваших задач, но в целом объём работы не соизмерим с front-end/mobile.

    Скорее всего зарабатывать стабильные деньги разработкой только смарт контрактов вряд ли получится.
    Ответ написан
  • Можно ли после выпуска токенов довыпустить еще определённое кол-во?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Можно, как вариант, использовать что-то типа такого:
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity >=0.7.0 <0.9.0;
    
    import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
    
    contract YourContractName is ERC20{
        address owner;
    
        constructor() ERC20("Your token name", "YourSymbol") {
             // запоминаем кошелёк, который загружал токен, чтобы только он мог допечатывать деньги
            owner = msg.sender;
        }
        
        function printCoins(uint256 amount) public {
            require(msg.sender == owner, "Forbidden");
            _mint(owner, amount); // зачисляем деньги на кошелёк владельца контракта
        }
    }
    Ответ написан
    Комментировать
  • Как создать Dapps (децентрализованное приложение) для определённой группы лиц?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Можно заложить такой функционал в смарт-контракт.
    Например можно сделать пару функций типа grantAccess, revokeAccess, которые будут разрешать какому то кошельку (адресу) доступ к смарт контракту или отзывать разрешенный доступ.
    В этих функциях сделать проверку, чтобы их мог вызывать только владелец кошелька или как вы решите.
    А во всех остальных функциях смарт-контракта делать проверку выдавался ли ранее доступ или нет.
    Примерная реализация:
    // SPDX-License-Identifier: GPL-3.0
    pragma solidity >=0.7.0 <0.9.0;
    
    contract ACL {
        // тут храним кошельки, которые могут выдавать/отзывать полномочия админа.
        mapping (address => bool) public admins;
    
        // тут те, кому разрешен доступ
        mapping (address => bool) public accessGranted;
    
        constructor() {
            // наделяем полномочиями админа того, кто деплоил контракт чтобы он потом мог выдать полномочия кому-то еще.
            admins[msg.sender] = true;
        }
        
        function grantAdmin(address to) public {
            require(admins[msg.sender] == true, "Forbidden");
            admins[to] = true;
        }
    
        function revokeAdmin(address to) public {
            require(admins[msg.sender] == true, "Forbidden");
            delete admins[to];
        }
    
        function grantAccess(address to) public {
            require(admins[msg.sender] == true, "Forbidden");
            accessGranted[to] = true;
        }
    
        function revokeAccess(address to) public {
            require(admins[msg.sender] == true, "Forbidden");
            delete accessGranted[to];
        }
        
        // эта функция доступна всем
        function publicOK() public pure returns (string memory) {
            return "public OK";
        }
    
        // эта доступна только тем, кому был предоставлен доступ
        function protectedOK() public view returns (string memory) {
            require(accessGranted[msg.sender] == true, "Forbidden");
            return "protected OK";
        }
    }
    Ответ написан
    4 комментария