CREDITS : API CODE REVIEW

CREDITS | Indonesia
8 min readMay 4, 2018

--

GAMBARAN UMUM

Saya telah melalui kode sejak beberapa hari terakhir dengan mata eksternal yang kritis untuk memberikan kepada tim saran dan rekomendasi saya setelah audit internal (kompilasi, penyusunan struktur dan tinjauan kode).

Pekerjaan yang telah saya lakukan sejak beberapa hari adalah sungguh-sungguh untuk memberikan umpan balik yang lebih baik kepada masyarakat dan tim pengembangan inti. Saya tidak dibayar untuk melakukan tinjauan ini dan itu adalah tugas saya sebagai penasihat teknis proyek untuk memberi Anda pendapat saya secara publik.

Pertama-tama, analisis berikut akan menunjukkan kepada Anda modelisasi kode untuk lebih memahami struktur API.

Modul API dari platform CREDITS sudah tersedia untuk akun github CREDITS dan termasuk file-file berikut

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

Keadaan kode aktual menunjukkan tidak adanya lisensi dalam file header kode. Saya tahu ini bukan versi final, tetapi saya sangat menyarankan Anda untuk menambahkannya sesegera mungkin

Saya perhatikan bahwa sebagian besar komentar dalam kode Anda adalah dalam bahasa Rusia. Dalam tujuan untuk meningkatkan kesiapan saya menyarankan Anda untuk menerjemahkannya dalam bahasa Inggris, bahasa Shakespeare. Namun saya ingin sekali membacanya dalam bahasa Moliere.

Dengan cara sebagai server API, kode tersebut terutama akan dijalankan dan dikompilasi pada platform Linux. Berdasarkan fakta ini, saya tidak menemukan Makefile apa pun untuk membantu saya melakukannya dengan benar. Saya sangat menyarankan Anda untuk membuat Makefile yang digunakan untuk membangun program biner dari kode sumber dan membuat alur kerja Anda direproduksi.

Untuk bagian validasi, struktur kode diimplementasikan sebagai makro. Sementara penerapan ini memberikan kemampuan beradaptasi yang besar, ia mengorbankan banyak hal yang mudah dipahami dan kesiapan. Menggunakan pustaka uji standar bisa menjadi awal yang baik jika Anda berencana untuk mengubahnya.

Anda juga dapat memisahkan uji unit dari file “prod”. Ini memungkinkan kontributor untuk menambahkan tes mereka sendiri selama periode pengujian yang Anda rencanakan untuk dijalankan dalam beberapa hari mendatang.

Selami lebih dalam setiap file

Saya menganalisis masing-masing file yang disajikan secara terpisah dan memodelkannya untuk memberikan sebanyak mungkin rincian arsitektur yang dipilih oleh tim inti CREDIT.

APIHandler.cpp

  • #include “APIHandler.h”
  • #include “DebugLog.h”
  • #include “csconnector/csconnector.h”
  • #include “CallStats.h”
  • #include “Validation.h”

Grafik dari file header terlihat sebagai berikut:

Nama space:

  • csconnector
  • csconnector::detail

Fungsi:

  • VALIDATE(source)
  • VALIDATE(target)
  • VALIDATE(currency)

APIHandler.h

#include <mutex>

#include “APIHandlerInterface.h”

Grafik file header yang disertakan terlihat sebagai berikut:

Grafik file yang disertakan file ini:

Classes:

class csconnector::APIHandler

Nama space:

csconnector

Remark:

Header file menggambarkan metode dan parameternya. Ada tidak ada pernyataan relevan lainnya yang saya perhatikan saat ini.

APIHandlerBase.h

#include “API.h”

Grafik file header yang disertakan untuk APIHandlerBase.h:

Grafik file, file ini termasuk dalam:

Classes:

struct csconnector::APIHandlerBase

Nama space:

csconnector

Remarks:

Header file menggambarkan metode dan parameternya. Tidak ada komentar yang relevan.APIHandlerInterface.h

#include “API.h”
#include “APIHandlerBase.h”

Grafik file header yang disertakan untuk APIHandlerBase.h:

Grafik file, file ini termasuk dalam:

Classes:

struct csconnector::APIHandlerInterface

Namespace:

сsconnector

Remark:

Header file menggambarkan metode dan parameternya. Tidak ada komentar yang relevan.CallStats.cpp

#include “CallStats.h”
#include <atomic>
#include <array>
#include <thread>
#include “DebugLog.h”

Grafik file header yang disertakan untuk CallStats.cpp:

Tipe Definisi:

  • using csconnector::call_stats::Counter = std::atomic<int>
  • using csconnector::call_stats::NumCallsPerCommand = std::array<Counter, NumCommands>
  • using csconnector::call_stats::NumCallsPerCommandStats = std::array<int, NumCommands>

Fungsi:

NumCallsPerCommandStats csconnector::call_stats::get ()

void csconnector::call_stats::count (Commands command)

void csconnector::call_stats::clear ()

void csconnector::call_stats::start ()

void csconnector::call_stats::stop ()

Variables:

  • constexpr size_t csconnector::call_stats::NumCommands = (size_t)Commands::Max
  • NumCallsPerCommand csconnector::call_stats::numCallsPerCommand
  • std::chrono::steady_clock::time_point csconnector::call_stats::lastUpdateTime = std::chrono::steady_clock::now()
  • std::thread csconnector::call_stats::thread
  • std::atomic_bool csconnector::call_stats::quit {false}

Remarks:

CallStats.h

#include <csconnector/csconnector.h>

Grafik file header yang disertakan untuk CallStats.cpp:

Grafik file, file ini termasuk dalam:

Namespace:

csconnector

csconnector::call_stats

Functions:

void csconnector::call_stats::start ()

void csconnector::call_stats::stop ()

void csconnector::call_stats::count (Commands command)

Remarks:

The file header describes the methods and their parameters. There are no relevant remarks.

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>

Grafik file header yang disertakan untuk csconnector.cpp:

Namespace:

csconnector

csconnector::detail

Type definitions:

typedef std::lock_guard< std::mutex > csconnector::detail::ScopedLock

Functions:

  • void csconnector::detail::start (const Config &config)
  • void csconnector::detail::stop ()
  • void csconnector::start (const Config &config)
  • void csconnector::stop ()

Variables:

  • td::unique_ptr< TThreadedServer > csconnector::detail::server = nullptr
  • std::mutex csconnector::detail::mutex
  • std::thread csconnector::detail::thread

Remarks:

DBHandlers.cpp

#include “DBHandlers.h”

#include <csdb/csdb.h>

#include “csconnector/csconnector.h”

#include <algorithm>

#include <cstring>

Grafik file header yang disertakan untuk DBHandlers.cpp:

Namespace:

db_handlers

Type definitions:

using db_handlers::PoolNumber = uint64_t

Functions:

  • void db_handlers::init ()
  • void db_handlers::deinit ()
  • void db_handlers::BalanceGet (BalanceGetResult &_return, const Address &address, const Currency &currency)
  • void db_handlers::string_to_uuid (const std::string &uuid_str, uuid_t uuid)
  • bool db_handlers::GetTransaction (const TransactionId &transactionId, Transaction &transaction)
  • void db_handlers::TransactionGet (TransactionGetResult &_return, const TransactionId &transactionId)
  • void db_handlers::SubstituteTransactionHash (api::Transaction &transaction, const std::string &newHash)
  • Thats actually a hack.
  • std::string db_handlers::FormatTransactionHash (const std::string &poolHash, size_t transacionNumber)
  • void db_handlers::TransactionsGet (TransactionsGetResult &_return, const Address &address, const int64_t offset, const int64_t limit)
  • void db_handlers::PoolListGet (PoolListGetResult &_return, const int64_t offset, const int64_t limit)
  • void db_handlers::PoolGet (PoolGetResult &_return, const PoolHash &hash)

Remarks:

DBHandlers.h

#include “API.h”

Grafik file header yang disertakan untuk DBHandlers.h:

Grafik file, file ini termasuk dalam:

Namespace:

db_handlers

Functions:

  • 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 offset, const int64_t limit)
  • void db_handlers::PoolGet (api::PoolGetResult &_return, const api::PoolHash &hash)

Remark:

Header file menggambarkan metode dan parameternya. Tidak ada komentar yang relevan.

DebugLog.h

#include <iostream>

Grafik file header yang disertakan untuk DebugLog.h:

Grafik file,file ini termasuk dalam:

Macros:

#define DEBUG_LOG

Functions:

void Log ()
template<typename T , typename… Args>
void Log (T t, Args… args)
template<typename T , typename… Args>
void DebugLog (T t, Args… args)
Macros:

DEBUG_LOG

#define DEBUG_LOG

Functions:

DebugLog()

template <typename T , typename… Args>

void DebugLog ( T t,Args… args)

Call graph:

Grafik panggilan fungsi:

Log() [1/2]

void Log

Grafik panggilan fungsi:

Log() [2/2]

template<typename T , typename… Args>

void Log(T t,

Args… args

)

Call graph:

Remarks:

There are no relevant remarks at thsi stage of the development.

Validation.h

#include <string>

#include <vector>

#include <memory>

#include <tuple>

#include <functional>

Grafik dari file header yang disertakan untuk Validation.h:

Grafik file, file ini termasuk dalam:

Classes:

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 >

Namespace:

validation

Macros:

#define VALIDATE_BEGIN_(C, D)

#define VALIDATE_BEGIN(C) VALIDATE_BEGIN_(C, Dummy)

#define VALIDATE_BEGIN_EX(C, D) struct D{}; VALIDATE_BEGIN_(C, D)

#define VALIDATE(F)

#define VALIDATE_END()

Type definition:

using validation::FieldId = uint8_t

using validation::ValidatorId = uint8_t

using validation::ValidationResult = std::tuple< FieldId, ValidatorId >

Enumerations:

enum validation::StringLengthOperation { validation::Less, validation::More, validation::Equal }

Variables:

constexpr ValidationResult validation::NoError = { 0, 0 }

Macros:

VALIDATE

#define VALIDATE ( F )

Macro definition:

Remarks:

The file header describes the methods and their parameters. There are no relevant remarks at this stage of the development.

ValidationTests.cpp

#include “Validation.h”

#include <assert.h>

Grafik file header yang disertakan untuk ValidationTests.cpp:

Classes:

struct Test

Functions:

VALIDATE (x).EqualTo(1)

VALIDATE (s).Length< More >(2)

void validationTest ()

Functions:

VALIDATE() [1/2]

VALIDATE ( x )

VALIDATE() [2/2]

VALIDATE ( s )

validationTest()

void validationTest ()

Grafik panggilan fungsi:

Remarks:

KESIMPULAN
Seperti yang terlihat beberapa perbaikan dalam kode masih diperlukan tetapi struktur kode tampaknya dirancang untuk dapat terukur. Sebagai penasihat teknis dari Kredit, saya merasa yakin pada proyek dan apa yang tim coba capai.

Memang, membangun protokol baru dari awal di belakang komunitas yang kuat membutuhkan waktu. Tim inti akan mempublikasikan bagian demi bagian kode pada GitHub untuk melibatkan anggota komunitas untuk menerima umpan balik. Tim CREDITS sudah mulai berbagi bagian dari kode dan mereka akan terus melakukannya dalam beberapa hari mendatang.

Komunitas akan semakin terlibat ketika versi stabil akan siap digunakan. Secara pribadi, saya jarang melihat dalam ruang komunitas blockchain tim sedekat komunitas mereka seperti Kredit.

Kesabaran membawa pada keselamatan, terburu-buru menuju kesengsaraan. Siapa yang ingin melakukan hal-hal hebat harus memikirkan secara mendalam rinciannya karena kejahatan ada di belakang. Bersabarlah revolusi akan segera datang.

--

--

CREDITS | Indonesia

CREDITS is an open blockchain platform with autonomous smart contracts and the internal cryptocurrency