CometBFT
DOC
您可以在本節(jié)中找到幾個技術(shù)術(shù)語的概述,包括每個術(shù)語的解釋和進(jìn)一步資源的鏈接——在使用Cosmos SDK進(jìn)行開發(fā)時,所有這些都是必不可少的。
在本節(jié)中,您將了解以下術(shù)語:
-
Cosmos and Interchain
-
LCD
-
RPC
-
Protobuf -協(xié)議緩沖區(qū)
-
gRPC, gRPC-web和gRPC- gateway
-
Amino
所有這些術(shù)語都與如何在Cosmos SDK區(qū)塊鏈中進(jìn)行節(jié)點交互有關(guān)。
一、Cosmos and Interchain
Cosmos指的是特定于應(yīng)用程序的區(qū)塊鏈網(wǎng)絡(luò),由鏈間(Interchain )棧構(gòu)建,并通過區(qū)塊鏈間通信協(xié)議(Inter-Blockchain Communication Protocol,IBC)相互連接。然而,Cosmos 將很快被稱為 Interchain
。術(shù)語“Cosmos”、“Cosmos 生態(tài)系統(tǒng)(Cosmos Ecosystem)”和“ Interchain ”可以理解為同義詞。
二、Interchain 棧
Interchain 開發(fā)人員可用的各種工具可以統(tǒng)稱為 Interchain 棧。
Tools within the Interchain Stack, which contain “Cosmos” in their name will remain unchanged by current terminology changes, such as the Cosmos SDK and CosmWasm. Any chain built with the Cosmos SDK can typically be referred to as “a Cosmos chain” or “appchain”.
名稱中包含“Cosmos”的Interchain Stack中的工具將不會因當(dāng)前的術(shù)語變化而改變,例如 Cosmos SDK 和 CosmWasm。任何使用Cosmos SDK構(gòu)建的鏈都可以被稱為“Cosmos鏈”或“應(yīng)用鏈(appchain)”。
三、Cosmos Hub
Cosmos Hub是一個鏈,作為 Interchain 的經(jīng)濟(jì)中心和其他 Cosmos鏈的服務(wù)提供商。該中心使用Interchain Stack構(gòu)建,是ATOM令牌、鏈間安全(Interchain Security)以及Cosmos SDK、Tendermint和IBC構(gòu)建器的所在地。
四、Light client daemon (LCD)
與完整節(jié)點相比,輕客戶端(light client
)只跟蹤區(qū)塊鏈上的某些信息片段。輕客戶端不跟蹤區(qū)塊鏈的整個狀態(tài),也不包含鏈的每個交易/區(qū)塊。
在Tendermint的共識中,輕客戶端協(xié)議允許客戶端受益于完整節(jié)點受益的相同程度的安全,同時帶寬需求被最小化。客戶端可以接收區(qū)塊鏈狀態(tài)和事務(wù)的加密證明,而無需同步所有塊甚至它們的頭。
查看Ethan Frey在Tendermint共識中的輕客戶端(打開新窗口),了解更多關(guān)于輕客戶端如何在Tendermint共識中使用的信息。
因此,輕客戶端對于區(qū)塊鏈間通信協(xié)議(IBC)如何跟蹤時間戳、根哈希和下一個驗證器集哈希等信息也至關(guān)重要。這節(jié)省了空間并提高了狀態(tài)更新處理的效率。
light client daemon (LCD)是Cosmos SDK公開的HTTP1.1服務(wù)器,其默認(rèn)端口是1317
。它為鏈公開了一個REST API,這意味著一個 representational state transfer
應(yīng)用程序編程接口——這個API允許與RESTful web服務(wù)進(jìn)行交互。傳統(tǒng)上,每個查詢都為LCD重新實現(xiàn),并在幕后路由到RPC。
為什么稱為
light client daemon(LCD)
?
在SDK v0.40之前,要獲得REST API,必須打開新窗口運行另一個后端服務(wù)(或 daemon,一個繼承自Unix的術(shù)語),例如使用gaiacli rest-server --laddr 0.0.0.0:1317 --node localhost:26657
。在Cosmos SDK v0.40中,REST被移動到節(jié)點服務(wù)(node service)中,使其成為Cosmos SDK的一部分,但術(shù)語“daemon”仍然存在,導(dǎo)致了light client daemon(LCD)的名稱。
五、Remote procedure call (RPC)
遠(yuǎn)程過程調(diào)用(emote procedure call,RPC)是一種軟件通信協(xié)議。這個術(shù)語經(jīng)常出現(xiàn)在分布式計算中,因為RPC是一種實現(xiàn)進(jìn)程間通信(IPC)的技術(shù),它允許程序在不同的地址空間(不同的機(jī)器)中執(zhí)行子例程過程。
RPC可以理解為客戶端-服務(wù)器交互,其中“調(diào)用者”是客戶端,更具體地說是請求程序,而“執(zhí)行者”是服務(wù)器,更具體地說是提供服務(wù)的程序。交互是通過請求-響應(yīng)消息傳遞系統(tǒng)(request-response message-passing)實現(xiàn)的。
簡而言之,RPC是一種請求-響應(yīng)協(xié)議,由客戶機(jī)向遠(yuǎn)程服務(wù)器發(fā)送請求以執(zhí)行子例程發(fā)起。
RPC允許調(diào)用不同的地址空間的函數(shù)。通常,被調(diào)用的函數(shù)在與調(diào)用它們的計算機(jī)不同的計算機(jī)上運行。然而,使用RPC,開發(fā)人員編碼時就好像子例程是本地的一樣;開發(fā)人員不必為遠(yuǎn)程交互編寫詳細(xì)的代碼。因此,使用RPC意味著所有的調(diào)用過程基本上是相同的,不管它們是本地調(diào)用還是遠(yuǎn)程調(diào)用。
由于RPCs 實現(xiàn)了遠(yuǎn)程請求-響應(yīng)協(xié)議,需要注意的是,如果出現(xiàn)網(wǎng)絡(luò)問題,遠(yuǎn)程過程調(diào)用可能會失敗。
六、RPC請求是如何工作的?
通常,當(dāng)調(diào)用遠(yuǎn)程過程調(diào)用時,**過程參數(shù)(procedure parameters)**將通過網(wǎng)絡(luò)傳輸?shù)綀?zhí)行過程的執(zhí)行環(huán)境。一旦完成,被調(diào)用的過程調(diào)用的結(jié)果將被轉(zhuǎn)移到調(diào)用環(huán)境。然后在調(diào)用環(huán)境中恢復(fù)執(zhí)行,就像在常規(guī)的本地過程調(diào)用中一樣。
一個循序漸進(jìn)的RPC請求可能如下所示:
- 客戶端調(diào)用客戶機(jī)存根——一段轉(zhuǎn)換參數(shù)的代碼,該代碼在RPC期間在客戶端和服務(wù)器之間傳遞。該調(diào)用是一個本地過程調(diào)用。
存根是代替較長程序的小程序例程。這使得機(jī)器的行為就像遠(yuǎn)程機(jī)器上的程序在本地操作一樣??蛻舳擞幸粋€與遠(yuǎn)程過程接口的存根,而服務(wù)器有一個與原始請求過程接口的存根。
在RPC中,客戶端存根替代了提供請求過程的程序。存根接受并將請求轉(zhuǎn)發(fā)給遠(yuǎn)程過程。一旦遠(yuǎn)程過程完成請求,它將結(jié)果返回給存根,而存根又將結(jié)果傳遞給請求過程。
服務(wù)器還有一個與遠(yuǎn)程過程接口的存根。
- 客戶端存根將過程參數(shù)打包到消息中。
Packing procedure parameters is called marshaling.
打包(Packing)過程參數(shù)稱為封送處理(marshaling)。
具體來說,這是從一個或多個應(yīng)用程序收集數(shù)據(jù)、將數(shù)據(jù)塊放入消息緩沖區(qū)以及將數(shù)據(jù)組織成規(guī)定的數(shù)據(jù)格式的過程。
封送處理對于將用一種語言編寫的程序的輸出參數(shù)作為輸入傳遞給用另一種語言編寫的程序至關(guān)重要。
- 客戶端存根然后發(fā)出一個系統(tǒng)調(diào)用來發(fā)送消息。
- 客戶端的本地操作系統(tǒng)(OS)通過相應(yīng)的傳輸層將消息從客戶端(機(jī)器A)發(fā)送到服務(wù)器(機(jī)器B)。
- 服務(wù)器操作系統(tǒng)將傳入的數(shù)據(jù)包傳遞給服務(wù)器存根。
- 服務(wù)器存根將消息及其所包含的過程參數(shù)解包(unpacks )——這稱為解封送(
unmarshaling
)。 - 服務(wù)器存根調(diào)用服務(wù)器過程并執(zhí)行該過程。
- 一旦過程完成,輸出就返回到服務(wù)器存根。
- 服務(wù)器存根將返回值打包到消息中。
- 消息被發(fā)送到傳輸層,傳輸層將消息發(fā)送到客戶端的傳輸層。
- 客戶端存根對返回參數(shù)進(jìn)行解封送,并將它們返回給原始調(diào)用客戶端。
七、RPC and Cosmos
在Cosmos中,命令行界面(CLI)以及其他使用 RPCs 訪問鏈。一個節(jié)點公開幾個端點——gRPC、REST和Tendermint 端點(Tendermint endpoint)。
由Tendermint公開的Tendermint RPC端點是一個HTTP1.1服務(wù)器。默認(rèn)端口號為 26657。gRPC服務(wù)器的默認(rèn)端口為9090,REST服務(wù)器的默認(rèn)端口為1317。Tendermint RPC獨立于Cosmos SDK,可以進(jìn)行配置。它使用HTTP POST和JSON-RPC 2.0進(jìn)行數(shù)據(jù)編碼。
有關(guān)Tendermint RPC、gRPC和REST服務(wù)器的更多信息,建議仔細(xì)查看Cosmos SDK文檔。
Cosmos暴露了Tendermint RPC 和 Cosmos LCD。例如,CosmJS使用RPC來實現(xiàn)JSON-RPC API。
八、Protobuf
Protobuf(Protocol Buffers, 即“協(xié)議緩沖區(qū)”)是谷歌開發(fā)的一種開源、跨平臺的數(shù)據(jù)格式。它幫助序列化結(jié)構(gòu)化數(shù)據(jù),并幫助網(wǎng)絡(luò)中的程序通信或存儲數(shù)據(jù)。
如果你想學(xué)習(xí) Protobuf,看看官方文檔可以幫助你深入了解,并提供指南和教程。
也可以看看關(guān)于這個平臺上Protobuf的部分。
在Cosmos中,Protobuf是開發(fā)人員用來描述消息格式的數(shù)據(jù)序列化方法。在Cosmos應(yīng)用程序中有很多內(nèi)部通信,而Protobuf是如何完成通信的核心。
隨著Cosmos SDK v0.40, Protobuf開始取代Amino作為鏈狀態(tài)和交易的數(shù)據(jù)編碼格式,部分原因是Protobuf的編碼/解碼性能比Amino更好。此外,開發(fā)人員工具也更適合Protobuf。切換的另一個好處是促進(jìn)了gRPC
的使用,因為Protobuf自動定義和生成gRPC函數(shù)。因此,開發(fā)人員不再需要為RPC、LCD和CLI實現(xiàn)相同的查詢。
九、gRPC
gRPC是一個開源、高性能的遠(yuǎn)程過程調(diào)用(RPC)框架。它由谷歌開發(fā)用于處理rpc,并于2016年發(fā)布。gRPC可以在任何環(huán)境中運行,并支持多種編程語言。
有關(guān)gRPC的更多信息和非常有用的入門信息,請參閱gRPC文檔
gRPC使用HTTP2進(jìn)行傳輸,使用協(xié)議緩沖區(qū)(Protobuf)對數(shù)據(jù)進(jìn)行編碼。gRPC有一個單一的規(guī)范,這使得所有的gRPC實現(xiàn)一致。
十、gRPC and Cosmos
在 Cosmos 中,gRPCs 是使用Protobuf提供服務(wù)的傳輸控制協(xié)議(TCP) ,也用于數(shù)據(jù)編碼。默認(rèn)端口號為9090
。
傳輸控制協(xié)議(TCP)是一種主要的互聯(lián)網(wǎng)協(xié)議,它允許在客戶端和服務(wù)器之間建立連接以發(fā)送數(shù)據(jù)。TCP使應(yīng)用程序與internet協(xié)議(IP)之間的通信成為可能。
在Cosmos SDK中,Protobuf是主要的編碼(encoding )庫。
在Cosmos SDK中的編碼
連線編碼協(xié)議(wire encoding protocol)是定義數(shù)據(jù)如何從一點傳輸?shù)搅硪稽c的協(xié)議。連線協(xié)議(Wire protocols)描述了在應(yīng)用程序級別交換信息的方式。因此它是應(yīng)用層協(xié)議中的通信協(xié)議,而不是傳輸協(xié)議。為了定義數(shù)據(jù)交換,連線協(xié)議需要以下特定屬性:
- Data types(數(shù)據(jù)類型) – 數(shù)據(jù)單位、消息格式等。
- Communication endpoints (通信端點)
- Capabilities (能力)——交付保證、溝通方向等等。
有線協(xié)議可以是基于文本的協(xié)議,也可以是二進(jìn)制協(xié)議。
在Cosmos SDK中,有兩類二進(jìn)制連線編碼類型(binary wire encoding types):客戶端編碼和存儲編碼??蛻舳司幋a處理的是交易處理和交易簽名,而存儲編碼處理的是狀態(tài)機(jī)交易以及Merkle樹中存儲的內(nèi)容。
Cosmos SDK使用兩種二進(jìn)制連線編碼協(xié)議:
Amino: 一個對象編碼規(guī)范。每個Cosmos SDK模塊都使用氨基編解碼器來序列化類型和接口。
協(xié)議緩沖區(qū)(Protocol Buffers,Protobuf):一種數(shù)據(jù)序列化方法,開發(fā)人員使用它來描述消息格式。
由于諸如性能缺陷和缺乏跨語言/客戶端支持等原因,協(xié)議緩沖區(qū)比氨基越來越多地使用。
有關(guān)Cosmos SDK中編碼的更多信息,請參考 Cosmos SDK documentation
十一、gRPC-web
gRPC支持不同的軟件和硬件平臺。gRPC-web
是針對瀏覽器客戶端的gRPC的JavaScript實現(xiàn)。gRPC-web
客戶端通過一個特殊的代理連接到gRPC
服務(wù)。
關(guān)于
gRPC-web
的更多信息,建議仔細(xì)查看gRPC存儲庫。
要深入研究如何使用gRPC-web進(jìn)行開發(fā),文檔的快速入門和基礎(chǔ)教程是非常有價值的資源。
與一般的gRPC一樣,gRPC-web使用帶有Protobuf的HTTP2進(jìn)行數(shù)據(jù)編碼。默認(rèn)端口號為9091
。
Secret.js
is a JavaScript SDK used to write applications interacting with the Secret Network, which usesgRPC-web
.
十二、gRPC-gateway
gRPC-gateway
是一種將gRPC
端點公開為REST端點的工具。它幫助提供 RESTful 風(fēng)格的APIs,讀取gRPC
服務(wù)定義并生成反向代理服務(wù)器,可以將RESTful JSON API轉(zhuǎn)換為gRPC。對于Protobuf Query
服務(wù)中定義的每個gRPC端點,Cosmos SDK提供了相應(yīng)的REST端點。
gRPC- gateway
的目標(biāo)是“為您的gRPC服務(wù)提供HTTP+JSON接口”。有了它,開發(fā)人員可以從gRPC
的所有優(yōu)勢中受益,同時,仍然提供一個 RESTful API——例如,當(dāng)你想開發(fā)一個 web 應(yīng)用程序,但瀏覽器不支持 HTTP2 時,這是一個非常有用的工具。這有助于確保向后兼容性和多語言、多客戶端支持。
如果您想探索
gRPC-Gateway
,建議仔細(xì)查看gRPC-Gateway文檔。
在Cosmos SDK中,gRPC-Gateway
提供了一個帶有REST API的HTTP1.1服務(wù)器和一個base64編碼的Protobuf用于數(shù)據(jù)編碼;它將gRPC端點公開為REST端點。它在服務(wù)器上路由到gRPC
并與LCD
連接,因此它也在端口1317
上。
例如,如果由于瀏覽器不支持HTTP2而不能在應(yīng)用程序中使用gRPC
,那么仍然可以使用Cosmos SDK
。SDK通過gRPC-Gateway
提供REST路由。
Terra.js , a JavaScript SDK for applications interacting with the Terra blockchain, uses gRPC-gateway.
十三、Amino
Amino是一個對象編碼規(guī)范。在Cosmos SDK中,每個模塊都使用Amino 編解碼器(Amino codec)來幫助序列化類型和接口。Amino通過在具體類型(concrete type )前加上字節(jié)前綴來處理接口。
通常,Amino 編解碼器類型和接口被注冊在模塊的域中。
具體類型是實現(xiàn)已注冊接口的非接口類型。當(dāng)類型存儲在接口類型字段中或存儲在帶有接口元素的列表中時,需要注冊類型。
作為最佳實踐,初始化時請確保:
- 注冊接口。
- 實現(xiàn)具體類型
- 檢查問題,如沖突的前綴字節(jié)。
每個模塊公開一個函數(shù)RegisterLegacyAminoCodec
。有了它,用戶可以提供一個編解碼器和注冊所有類型。應(yīng)用程序為必要的模塊調(diào)用此方法。
使用Amino,當(dāng)模塊沒有基于protobuf的類型定義時,原始線字節(jié)被編碼并解碼為具體的類型或接口。
要了解更多關(guān)于Go的Amino規(guī)范和實現(xiàn),請參閱Tendermint Go Amino文檔
Amino基本上是經(jīng)過一些修改的JSON。例如,JSON規(guī)范沒有定義大于2^53的數(shù)字,所以在Amino中編碼大于uint64/int64的類型時使用字符串。文章來源:http://www.zghlxwxcb.cn/news/detail-765024.html
要了解更多關(guān)于Amino類型及其在JSON中的表示,請參閱Secret.js文檔文章來源地址http://www.zghlxwxcb.cn/news/detail-765024.html
到了這里,關(guān)于Cosmos 基礎(chǔ)教程(一) -- 不可不知的開發(fā)術(shù)語的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!