[{"data":1,"prerenderedAt":203},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fcore-tech\u002Fproposal-for-i-o-layer-and-p2p":3,"docs-surround-\u002Fdocs\u002Fcore-tech\u002Fproposal-for-i-o-layer-and-p2p":193},{"id":4,"title":5,"body":6,"description":94,"extension":185,"image":186,"meta":187,"navTitle":186,"navigation":188,"path":189,"seo":190,"stem":191,"__hash__":192},"docs\u002Fdocs\u002Fcore-tech\u002FProposal-for-I-O-layer-and-P2P.md","Proposal For I O Layer And P2P",{"type":7,"value":8,"toc":176},"minimark",[9,14,19,23,68,72,132,136,150],[10,11,13],"h2",{"id":12},"нынешнее-видение-по-организации-сетевого-в-тч-p2p-модуля","Нынешнее видение по организации сетевого (в т.ч. p2p) модуля",[15,16,18],"h3",{"id":17},"несколько-уровней-внутри-самого-модуля","Несколько уровней внутри самого модуля",[20,21,22],"p",{},"Для тестирования самое то. Код понятный, кусок логики не придется искать в других директориях. Снизу наверх:",[24,25,26,30,54],"ol",{},[27,28,29],"li",{},"IO уровень: оперирует соединениями, сырыми байтами, реконнектами, таймаутами и асинхронностью (там поллинг самого общего плана)",[27,31,32,33],{},"Peer уровень:",[34,35,36,39,42,45,48,51],"ul",{},[27,37,38],{},"протокол и сериализация,",[27,40,41],{},"коллекция peers,",[27,43,44],{},"броадкасты,",[27,46,47],{},"персистентное хранилище, связанное с peers (пусть отдельно будет от хранилища блокчейна),",[27,49,50],{},"ban\u002Funban",[27,52,53],{},"Dandelion (да, он здесь, а не в уровне 3)",[27,55,56,57],{},"Integration layer:",[34,58,59,62,65],{},[27,60,61],{},"фильтр и cache (это множество хешей, которые позволят не отправлять TX или блок в узел, у которого он есть, а также не отсылать в другие модули то, что им уже известно)",[27,63,64],{},"бридж с основной системой, т.е. формирование и трансляция запросов\u002Fответов между ней (API модулей) и уровнем 2",[27,66,67],{},"межпоточное взаимодействие",[15,69,71],{"id":70},"основные-моменты-подробнее","Основные моменты подробнее",[24,73,74,96,113,124],{},[27,75,76,77],{},"Один поток на все вышесказанное (сетевая логика, а также уровни 2 и 3)",[34,78,79,82,85,88],{},[27,80,81],{},"Тут логика, которая не требует вычислений, можно иметь очень много активных соединений, пределом может стать только сеть или память, но не cpu",[27,83,84],{},"Исключение: может понадобиться отдельный поток, который зипует громоздкие ответы. Пусть они асинхронно формируются по мере надобности в них",[27,86,87],{},"Взаимодействие с другими потоками или через очереди (если это запросы\u002Fответы) или напрямую (явно сделать, чтоб было понятно, что это константный кусок памяти). Мьютексы ставить на небольшие кусочки обновляемых данных (ну например { total_difficulty, total_height }), которые можно быстро прочитать",[27,89,90,91],{},"В очередях только что-то легко копируемое или immutable data, напр. { Type type; shared_ptr",[92,93,95],"const",{"tx":94},""," и т.п.}",[27,97,98,99],{},"Сетевое хозяйство и протокол",[34,100,101,104,107,110],{},[27,102,103],{},"Ограничиваемся TCP и IPv4. Потом успеем добавить если что понадобится, а так пусть меньше сначала кода будет",[27,105,106],{},"В качестве библиотеки по сетевым вещам и асинхронности очень желаю libuv. Обоснование ниже.",[27,108,109],{},"Можно взять за основу протокол из grin, что-то убрать\u002Fдобавить проблем не составит",[27,111,112],{},"Dandelion: надо определиться с одной из 2х схем, прописанных в документации по grin",[27,114,115,116],{},"Peers",[34,117,118,121],{},[27,119,120],{},"Логику взять у grin, для начала",[27,122,123],{},"Для хранилища (не блокчейн, только для peers, оно отдельное должно быть) взять sqlite как наиболее проверенную временем штуку. Она гибкая (индексы и т.д.). Кстати, in-memory sqlite тоже хорошо себя зарекомендовало как штука для работы с табличными данными и сложными индексами. Когда\u002Fесли будут видны ограничения по performance или станет ясно, что не нужно индексирование, можно быдет подобрать key-value storage побыстрее",[27,125,126,127],{},"Кэши и фильтры",[34,128,129],{},[27,130,131],{},"То же, что и у grin для начала. Можно будет какой-нибудь bloom filter попробовать, чтоб избежать ограничений, которые мы в этой части видим у grin",[15,133,135],{"id":134},"доводы-в-пользу-libuv","Доводы в пользу libuv",[20,137,138,139,145,146],{},"Оно здесь: ",[140,141,142],"a",{"href":142,"rel":143},"http:\u002F\u002Fdocs.libuv.org\u002Fen\u002Fv1.x\u002F",[144],"nofollow",", ",[140,147,148],{"href":148,"rel":149},"https:\u002F\u002Fgithub.com\u002Flibuv\u002Flibuv",[144],[34,151,152,161,164,167,170,173],{},[27,153,154,155,160],{},"Качественная и компактная вещь. На ней весь node.js и его асинхронность и ",[140,156,159],{"href":157,"rel":158},"https:\u002F\u002Fgithub.com\u002Flibuv\u002Flibuv\u002Fwiki\u002FProjects-that-use-libuv",[144],"много еще чего",".",[27,162,163],{},"Можно зафиксировать версию и исходники встроить в build system",[27,165,166],{},"У меня с ней очень положительный опыт и не один. Вообще могу всю эту часть взять на себя и гарантировать хороший результат, и быстрый, т.к. изнутри знаю, что там",[27,168,169],{},"Будет на несколько % медленнее самописного решения на epoll, но зато mature и не один линукс",[27,171,172],{},"Туда же приделывается асинхронность и таймеры, API можно вывести приличное, на std::function, например",[27,174,175],{},"Также можно приделать, когда понадобится, http и TLS",{"title":94,"searchDepth":177,"depth":177,"links":178},2,[179],{"id":12,"depth":177,"text":13,"children":180},[181,183,184],{"id":17,"depth":182,"text":18},3,{"id":70,"depth":182,"text":71},{"id":134,"depth":182,"text":135},"md",null,{},true,"\u002Fdocs\u002Fcore-tech\u002Fproposal-for-i-o-layer-and-p2p",{"description":94},"docs\u002Fcore-tech\u002FProposal-for-I-O-layer-and-P2P","PyeLh99ua8PRVSEQCsCSuds5dl9kQ7JS4vlpDOExZPE",[194,199],{"title":195,"path":196,"stem":197,"description":198,"children":-1},"Programming Beam Wallet Transactions","\u002Fdocs\u002Fcore-tech\u002Fprogramming-beam-wallet-transactions","docs\u002Fcore-tech\u002FProgramming-Beam-Wallet-Transactions","This section describes the structure of Beam transactions. Transactions are created and managed locally in the Beam wallet.",{"title":200,"path":201,"stem":202,"description":94,"children":-1},"README","\u002Fdocs\u002Fcore-tech\u002Freadme","docs\u002Fcore-tech\u002FREADME",1783006055191]