Технический анализ и обзор
ОБЩИЙ ОБЗОР
Я просматривал код с последних нескольких дней с критическим внешним взглядом, чтобы дать команде свои предложения и рекомендации после внутреннего аудита (компиляция, структурирование и проверка кода).
Работа, которую я проделал, направлена на то, чтобы дать лучшую обратную связь сообществу и основной команде разработчиков. Мне не платили за проведение этого обзора, и моя обязанность как технического консультанта проекта - публично изложить вам свои мысли.
Прежде всего, следующий анализ покажет вам моделирование кода, чтобы лучше понять структуру API.
Модуль API платформы CREDITS уже доступен для CREDITS учетной записи github и включает следующие файлы:
APIHandler.cpp
APIHandler.h
APIHandlerBase.cpp
APIHandlerBase.h
APIHandlerInterface.h
CallStats.cpp
CallStats.h
csconnector.cpp
DBHandlers.cpp
DBHandlers.h
DebugLog.h
Validation.h
ValidationTests.cpp
Состояние фактического кода показывает отсутствие лицензии в файлах заголовков кода. Я знаю, что это не окончательная версия, но настоятельно рекомендую вам добавить ее как можно скорее.
Я заметил, что большая часть комментариев в вашем коде написана на русском языке. В целях повышения готовности предлагаю вам перевести его на английский, шекспировский язык. Однако я бы с удовольствием прочитал это на языке Мольера.
Кстати, как сервер API, код в первую очередь будет запускаться и компилироваться на платформе Linux. Исходя из этого факта, я не нашел ни одного Makefile, который помог бы мне сделать это правильно. Я настоятельно рекомендую вам создать Makefile, который используется для сборки двоичных программ из исходного кода и делает ваш рабочий процесс воспроизводимым.
Для части проверки структура кода реализована в виде макросов. Хотя эта реализация дает большую адаптируемость, она приносит в жертву понятность и готовность. Использование стандартной тестовой библиотеки может стать хорошим началом, если вы планируете ее изменить.
Вы также можете отделить модульный тест от файлов «prod». Это позволяет участникам добавлять свои собственные тесты в течение тестового периода, который вы планируете запустить в ближайшие дни.
Погрузитесь в каждый файл
Я проанализировал каждый из представленных файлов отдельно и смоделировал его, чтобы дать как можно больше подробностей об архитектуре, выбранной основной командой CREDITS.
APIHandler.cpp
- #include «APIHandler.h»
- #include «DebugLog.h»
- #include «csconnector / csconnector.h»
- #include «CallStats.h»
- #include «Validation.h»
График заголовочных файлов выглядит следующим образом:
Пространство имен:
- csconnector
- csconnector :: деталь
Функции:
- ПРОВЕРИТЬ (источник)
- ПРОВЕРИТЬ (цель)
- VALIDATE (валюта)
APIHandler.h
#include ‹mutex›
#include «APIHandlerInterface.h»
График включенных файлов заголовков выглядит следующим образом:
График файлов, в которые включен этот файл:
Классы:
класс csconnector :: APIHandler
Пространство имен:
csconnector
Замечание:
Заголовок файла описывает методы и их параметры. Других замечаний по теме, которые я сейчас заметил, нет.
APIHandlerBase.cpp
#include «APIHandlerBase.h»
График включенных файлов заголовков выглядит следующим образом:
Классы:
структура csconnector :: detail :: APIRequestStatus
Пространство имен:
csconnector
csconnector :: деталь
Переменные:
APIRequestStatus csconnector :: detail :: statuses [static_cast ‹size_t› (APIHandlerBase :: APIRequestStatusType :: MAX)]
Замечание:
Правильное применение типов данных для уменьшения объема используемой памяти при присвоении статуса вызова функции.
APIHandlerBase.h
#include «API.h»
График включенных файлов заголовков для APIHandlerBase.h:
График файлов, в которые входит этот файл:
Классы:
структура csconnector :: APIHandlerBase
Пространство имен:
csconnector
Примечания:
Заголовок файла описывает методы и их параметры. Нет соответствующих замечаний.
APIHandlerInterface.h
#include «API.h»
#include «APIHandlerBase.h»
График включенных файлов заголовков для APIHandlerBase.h:
График файлов, в которые входит этот файл:
Классы:
структура csconnector :: APIHandlerInterface
Пространство имен:
соединитель
Замечание:
Заголовок файла описывает методы и их параметры. Нет соответствующих замечаний.
CallStats.cpp
#include «CallStats.h»
#include ‹atomic›
#include ‹array›
#include ‹thread›
#include «DebugLog.h»
График включенных файлов заголовков для CallStats.cpp:
Определения типов:
- используя csconnector :: call_stats :: Counter = std :: atomic ‹int›
- используя csconnector :: call_stats :: NumCallsPerCommand = std :: array ‹Counter, NumCommands›
- используя csconnector :: call_stats :: NumCallsPerCommandStats = std :: array ‹int, NumCommands›
Функции:
NumCallsPerCommandStats csconnector :: call_stats :: get ()
void csconnector :: call_stats :: count (команда "Команды")
void csconnector :: call_stats :: clear ()
void csconnector :: call_stats :: start ()
void csconnector :: call_stats :: stop ()
Переменные:
- constexpr size_t csconnector :: call_stats :: NumCommands = (size_t) Команды :: Макс.
- NumCallsPerCommand csconnector :: call_stats :: numCallsPerCommand
- std :: chrono :: stable_clock :: time_point csconnector :: call_stats :: lastUpdateTime = std :: chrono :: stable_clock :: now ()
- std :: thread csconnector :: call_stats :: thread
- std :: atomic_bool csconnector :: call_stats :: quit {false}
Примечания:
CallStats.h
#include ‹csconnector / csconnector.h›
График включенных файлов заголовков для CallStats.cpp:
График файлов, в которые входит этот файл:
Пространство имен:
csconnector
csconnector :: call_stats
Функции:
void csconnector :: call_stats :: start ()
void csconnector :: call_stats :: stop ()
void csconnector :: call_stats :: count (команда команд)
Примечания:
Заголовок файла описывает методы и их параметры. Нет соответствующих замечаний.
csconnector.cpp
#include «csconnector / csconnector.h»
#include «DebugLog.h»
#include «APIHandler.h»
#include «DBHandlers.h»
#include «CallStats.h»
#include ‹thread›
#include ‹memory›
#include ‹thrift / protocol / TBinaryProtocol.h›
#include ‹thrift / transport / TServerSocket.h›
#include ‹thrift / transport / TBufferTransports.h›
#include ‹thrift / server / TThreadedServer.h›
График включенных файлов заголовков для csconnector.cpp:
Пространство имен:
csconnector
csconnector :: деталь
Определения типов:
typedef std :: lock_guard ‹std :: mutex› csconnector :: detail :: ScopedLock
Функции:
- void csconnector :: detail :: start (const Config и config)
- void csconnector :: detail :: stop ()
- void csconnector :: start (const Конфигурация и конфигурация)
- недействительный csconnector :: stop ()
Переменные:
- td :: unique_ptr ‹TThreadedServer› csconnector :: detail :: server = nullptr
- std :: mutex csconnector :: detail :: mutex
- std :: thread csconnector :: detail :: thread
Примечания:
DBHandlers.cpp
#include «DBHandlers.h»
#include ‹csdb / csdb.h›
#include «csconnector / csconnector.h»
#include ‹algorithm›
#include ‹cstring›
График включенных файлов заголовков для DBHandlers.cpp:
Пространство имен:
db_handlers
Определения типов:
используя db_handlers :: PoolNumber = uint64_t
Функции:
- void db_handlers :: init ()
- void db_handlers :: deinit ()
- void db_handlers :: BalanceGet (BalanceGetResult & _return, const адрес и адрес, const валюта и валюта)
- void db_handlers :: string_to_uuid (const std :: string & uuid_str, uuid_t uuid)
- bool db_handlers :: GetTransaction (const TransactionId и transactionId, транзакция и транзакция)
- void db_handlers :: TransactionGet (TransactionGetResult & _return, const TransactionId и transactionId)
- void db_handlers :: SubstituteTransactionHash (api :: Transaction & transaction, const std :: string & newHash)
- Это на самом деле взлом.
- std :: string db_handlers :: FormatTransactionHash (const std :: string & poolHash, size_t transacionNumber)
- void db_handlers :: TransactionsGet (TransactionsGetResult & _return, адрес и адрес const, смещение const int64_t, ограничение const int64_t)
- void db_handlers :: PoolListGet (PoolListGetResult & _return, смещение const int64_t, ограничение const int64_t)
- void db_handlers :: PoolGet (PoolGetResult & _return, const PoolHash и хеш)
Примечания:
DBHandlers.h
#include «API.h»
График включенных файлов заголовков для DBHandlers.h:
График файлов, в которые входит этот файл:
Пространство имен:
db_handlers
Функции:
- void db_handlers :: init ()
- void db_handlers :: deinit ()
- void db_handlers :: BalanceGet (api :: BalanceGetResult & _return, const api :: Address & address, const api :: Currency & currency)
- void db_handlers :: TransactionGet (api :: TransactionGetResult & _return, const api :: TransactionId и transactionId)
- void db_handlers :: TransactionsGet (api :: TransactionsGetResult & _return, const api :: Address & address, const int64_t offset, const int64_t limit)
- void db_handlers :: PoolListGet (api :: PoolListGetResult & _return, смещение const int64_t, ограничение const int64_t)
- void db_handlers :: PoolGet (api :: PoolGetResult & _return, const api :: PoolHash и хеш)
Замечание:
Заголовок файла описывает методы и их параметры. Нет соответствующих замечаний.
DebugLog.h
#include ‹iostream›
График включенных файлов заголовков для DebugLog.h:
График файлов, в которые входит этот файл:
Макросы:
#define DEBUG_LOG
Функции:
- void Журнал ()
- шаблон ‹typename T, typename… Args›
- void Журнал (T t, Args… args)
- шаблон ‹typename T, typename… Args›
- void DebugLog (T t, Args… args)
Макросы:
DEBUG_LOG
#define DEBUG_LOG
Функции:
DebugLog ()
шаблон ‹typename T, typename… Args›
void DebugLog (T t, Args… args)
График звонков:
График вызова функции:
Журнал () [1/2]
недействительный журнал
График вызова функции:
Журнал () [2/2]
шаблон ‹typename T, typename… Args›
недействительный журнал (T t,
Аргументы… аргументы
)
График звонков:
Примечания:
На данном этапе разработки нет актуальных замечаний.
Validation.h
#include ‹string›
#include ‹vector›
#include ‹memory›
#include ‹tuple›
#include ‹functional›
График включенных файлов заголовков для Validation.h:
График файлов, в которые входит этот файл:
Классы:
struct validation :: Validator ‹T›
struct validation :: StringLengthValidator ‹O›
struct validation :: StringLengthValidator ‹O› :: Int2Type ‹I›
struct validation :: NonEmptyValidator
struct validation :: NonZeroValidator
struct validation :: EqualToValidator ‹T›
struct validation :: CustomValidator ‹T›
struct validation :: ValidatorBuilder ‹T›
struct validation :: Dummy
struct validation :: ValidationTraits ‹T, D›
Пространство имен:
Проверка
Макросы:
#define VALIDATE_BEGIN_ (C, D)
#define VALIDATE_BEGIN (C) VALIDATE_BEGIN_ (C, пустышка)
#define VALIDATE_BEGIN_EX (C, D) struct D {}; VALIDATE_BEGIN_ (C, D)
#define VALIDATE (F)
#define VALIDATE_END ()
Определение типа:
используя validation :: FieldId = uint8_t
используя validation :: ValidatorId = uint8_t
используя validation :: ValidationResult = std :: tuple ‹FieldId, ValidatorId›
Перечисления:
enum validation :: StringLengthOperation {validation :: Less, validation :: More, validation :: Equal}
Переменные:
constexpr ValidationResult validation :: NoError = {0, 0}
Макросы:
ПРОВЕРИТЬ
#define VALIDATE (F)
Определение макроса:
Примечания:
Заголовок файла описывает методы и их параметры. На данном этапе разработки нет соответствующих замечаний.
ValidationTests.cpp
#include «Validation.h»
#include ‹assert.h›
График включенных файлов заголовков для ValidationTests.cpp:
Классы:
struct Test
Функции:
ПРОВЕРИТЬ (x) .EqualTo (1)
ПРОВЕРИТЬ (s). Длина ‹Подробнее› (2)
недействительный validationTest ()
Функции:
ПРОВЕРИТЬ () [1/2]
ПРОВЕРИТЬ (x)
ПРОВЕРИТЬ () [2/2]
ПРОВЕРИТЬ (s)
validationTest ()
недействительный validationTest ()
График вызова функции:
Примечания:
ЗАКЛЮЧЕНИЕ
Как было замечено, некоторые улучшения в коде по-прежнему необходимы, но структура кода кажется масштабируемой. Как технический советник Credits, я уверен в проекте и в том, чего команда пытается достичь.
Действительно, создание нового протокола с нуля при наличии сильного сообщества требует времени. Основная команда собирается по частям публиковать код на GitHub, чтобы привлечь членов сообщества к получению отзывов. Команда CREDITS уже начала делиться частью кода и продолжит это в ближайшие дни.
Сообщество будет вовлечено все больше и больше, когда стабильная версия будет готова к развертыванию. Лично я редко видел в пространстве сообщества блокчейнов команду, столь же близкую к их сообществу, как Credits.
Терпение ведет к спасению, спешка - к несчастью. Тот, кто хочет творить великие дела, должен глубоко задуматься над деталями, потому что зло уже позади. Будьте терпеливы, революция скоро наступит.