C語言實現的ABCI

來源:互聯網
上載者:User

本文主要介紹用 C 語言實現的 Tendermint ABCI,以及如何在此之上構建一個屬於自己的應用

原文作者:許莉
英文版本:C-ABCI 簡介

首先簡單介紹一下 Tendermint 和 ABCI。

Tendermint 的核心就是共識引擎,它主要負責兩點: 節點之間共用交易和區塊 建立一個規範且不可改變的交易順序(也就是區塊鏈)

ABCI(Application BlockChain Interface)是 Tendermint 與應用程式之間的一個介面,它可以使用各種語言來實現。目前已經實現的語言有 C++,JavaScript,Java和 Erlang,尚無 C 語言實現,故而本文實現了 C 版本的 ABCI。

如果對於 Tendermint 和 ABCI 尚不熟悉,或者想要瞭解更多有關內容,可自行參閱以下資料: Tendermint Intro ABCI Overview Tendermint Intro 中文翻譯

C-ABCI 的GitHub源碼:chainx-org/c-abci。 運行樣本 安裝 Tendermint

在編譯啟動 C-ABCI 之前,首先需要安裝 Tendermint,這裡是官方的安裝指南。 編譯執行 c-dummy

Tendermint 安裝完成之後,從 GitHub 下載 C-ABCI 源碼到本地:

1
git clone https://github.com/chainx-org/c-abci.git ~/c-abci

進入到目錄 c-abci ,執行 make 對源碼進行編譯:

12
cd ~/c-abcimake

編譯成功, 可以看到如下資訊:

編譯完成後,會在 bin 目錄下產生一個叫做 c-dummy 的可執行程式,執行該程式:

12
cd bin./c-dummy

啟動 Tendermint

c-dummy 啟動後,開始啟動 Tendermint。如果是首次執行Tendermint,需要先進行初始化再啟動節點

12
tendermint inittendermint node

如果之前有啟動過 Tendermint,先對 Tendermint 進行重設再啟動節點:

12
tendermint unsafe_reset_alltendermint node

這就是整個啟動過程了,下面有個C-ABCI啟動過程的視頻: 代碼架構

Tendermint 提供了 GRPC 和 TSP 兩種通訊方式,C-ABCI 使用了後者,用基於 TCP 協議的 Socket 來完成通訊模組。Tendermint 會保持3個串連:記憶體池串連(Mempool Connection)、共識串連(Consensus Connection)、查詢串連(Query Connection),三個串連簡介。在 C-ABCI 的實現中,每個串連都擁有一個獨立的進程來專門處理此串連的所有請求,後期可能會增加用獨立線程來處理的版本。

前面提到 ABCI 是一個介面,對 C 語言來說,它其實就是一個庫。C-ABCI 就是一個用 C 語言實現的庫,應用程式調用這個庫來與 Tendermint 進行資料互動。C-ABCI 對於 Tendermint 與應用程式之間通訊的具體資料並不感興趣,它只是作為一個傳遞者而已。C-ABCI 與 Tendermint 之間資料的傳輸是通過 TCP Socket 來實現的,與應用程式之間資料的傳輸則是通過回呼函數來實現的。

應用程式、C-ABCI、Tendermint 三者之間處理流程: Tendermint 向 C-ABCI 發送請求 C-ABCI 接收請求,並解析資料,然後調用應用程式實現的回呼函數,並將解析的資料通過回呼函數的參數傳遞給應用程式 應用程式所實現的回呼函數會根據不同的請求類型對資料進行不同的處理,並將處理的結果通過回呼函數的傳回值返回給 C-ABCI C-ABCI 將返回的結果按照 Tendermint 要求的資料格式進行處理,並將處理的最後資料響應給 Tendermint

C-ABCI 源碼中,一共有 7 個目錄,除了 include 目錄之外每個目錄都代表著一個模組,對於 socket,encoding,dlist 三個目錄,是完全獨立的,可以移出來放在任何項目中使用,後期有時間會把這三個獨立的模組抽取出來繼續完善。

下面具體說明一下每個目錄的作用:

目錄 功能
include 標頭檔目錄,包含所有模組的標頭檔
socket 通訊模組,主要功能是實現TCP協議的通訊,提供了綁定監聽連接埠,串連連接埠,關閉連接埠,以及接收,發送資料的介面
encoding 字元轉換模組,主要功能是實現大小端整型資料與字串之間的轉換,分別提供了大端和小端不同位元的無符號整型與無符號字串之間互相轉換的介面
dlist 資料存放區模組,主要功能是使用迴圈雙向鏈表來實現資料的儲存,提供了鏈表的建立,銷毀,增加,刪除,尋找介面
type 資料類型處理模組,主要功能是實現資料結構體的的相關操作,提供結構體的建立,銷毀等介面。Tendermint使用的資料類型儲存在一個types.proto檔案中,使用第三方軟體protobuf-c軟體將此檔案產生C檔案格式
core C-ABCI的核心模組,主要功能就是實現一個服務端,給應用程式提供了初始化服務,開始服務以及停止服務的介面
demo 實現了一個簡單的應用程式,關於資料存放區使用了dlist模組。
應用程式樣本

在 C-ABCI 的源碼中,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.