Технический анализ и обзор

ОБЩИЙ ОБЗОР

Я просматривал код с последних нескольких дней с критическим внешним взглядом, чтобы дать команде свои предложения и рекомендации после внутреннего аудита (компиляция, структурирование и проверка кода).

Работа, которую я проделал, направлена ​​на то, чтобы дать лучшую обратную связь сообществу и основной команде разработчиков. Мне не платили за проведение этого обзора, и моя обязанность как технического консультанта проекта - публично изложить вам свои мысли.

Прежде всего, следующий анализ покажет вам моделирование кода, чтобы лучше понять структуру 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.

Терпение ведет к спасению, спешка - к несчастью. Тот, кто хочет творить великие дела, должен глубоко задуматься над деталями, потому что зло уже позади. Будьте терпеливы, революция скоро наступит.