• Почему дублируются байты, которые не влезли в размер буффера, при получении с помощью socket.recv?

    Vindicar
    @Vindicar
    RTFM!
    try:
                                data = self.sock.recv(constants.BUF_SIZE)
                            except socket.timeout:
                                message_ended = True
    
                            buff += data

    Если отработает except, предыдущее значение data не изменится, и к buff оно ВСЁ РАВНО приклеится.
    Закинь buff += data в ветку try-else.
    Ответ написан
    Комментировать
  • Зачем нужно наследование от потока в питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А для чего вы вырезали куски кода в методах? Там вполне может быть ответ на ваш вопрос, а нам как-то гадать надо на кофейной гузе?
    К примеру в NodeConnection.__init__ вызывается наверно конструктор через super и туда вполне может быть передан target, а там может быть что угодно полезное и нужное, что обясняет ситуацию.
    Почему не вставить полностью код для ясности?
    UPD.
    Наследование от треда здесь применяется потому, что каждый NodeConnection породит свой поток, в котором будет вычитываться свой инкапсулированный сокет) в который кажому инстансу NodeConnection передаются какие-то данные.
    Можно было сделать просто отдельный класс и в него инкапсулировать и сокет и тред, но автор выбрал сокет инкапсулировать в тред.

    В обзем NodeConnection - это тред с инкапсулированным сокетом для передачи ему данных из другого потока.
    Ответ написан
  • Что с Traceback?

    Vindicar
    @Vindicar
    RTFM!
    BoyFromDubai, тебе же ясно написали:
    бразуеры при открытии страницы сайта делают дополнительный запрос к сайту, чтобы получить favicon. Этот запрос прилетает в ваш обработчик block.

    Т.е. запрос на /favicon.ico браузер сделает по своей инициативе, и тебе придётся с этим иметь дело. Вообще на будущее имей ввиду, что клиент может сделать любой бредовый запрос, так что ВСЕГДА нужно проверять, что тебе пришло.
    Возможных решений 3.
    1. Сменить url запроса, например так.
    @views.route('/block/<height>', methods=['GET'])
    Тогда у тебя запрос не будет конфликтовать с запросом favicon, но всё ещё будет ломаться, если клиент запросит /block/foobar вместо /block/123
    2. Указать тип параметра
    @views.route('/<height: int>', methods=['GET'])
    Тогда фреймворк отфильтрует нечисловые запросы, и сам преобразует стркоу в число. Это умеет и Django, и Flask. Но запрос сломается, если полученное число не будет корректным индексом/ключом для chain[].
    3. Вставить try-except
    try:
        block = blockchain.chain[int(height) - 1]
    except (ValueError, LookupError):
        # ловим ValueError от вызова int() и возможный LookupError от обращения к chain[]
        # хотя я фз что ещё может выбросить chain[]
        return "ОШИБКА БЛИН" # ну или более подробное сообщение об ошибке
    else:
        from main import blockchain
        return render_template("block.html", block = block, blockchain=blockchain)


    Я бы посоветовал сочетание методов 2 и 3. Пусть преобразованием в int занимается Flask, но всё же проверь, подходит ли это число.
    Ответ написан
    1 комментарий
  • Как работает кошелёк Биткоин?

    vabka
    @vabka
    Токсичный шарпист
    Как устанавливается заново это соответствие между количеством монет и конкретным кошельком?

    В биткоине нет понятия "количество монет" есть только информация о транзакциях.
    То, что транзакции эти твои - ты подтверждаешь при помощи приватного ключа.
    Кошельков есть по сути два вида:
    1. Работает по аналогии с киви, где есть какой-то сервер, который уже посчитал, сколько у тебя монет должно быть, и кошелёк эту информацию просто запрашивает (запросить может кто угодно, ибо информация публичная, даже без ключей)
    2. Выкачать самостоятельно весь блокчейн (сколько он там уже гигов? Или уже на терабайты счёт?) и найти в нём нужные транзакции.

    Это всё описывается в любой статье о работе блокчейна.
    Ответ написан
    9 комментариев
  • Как узел переключается на более длинный блокчейн на практике?

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

    Есть симулятор можешь посмотреть в живую https://web3scout.github.io/forcecons-sim/
    Ответ написан
    8 комментариев