LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 新闻观点 > 【译文】Cosmos技术文档-ABCI规范

【译文】Cosmos技术文档-ABCI规范

2020-01-17 灰狼 来源:区块链网络

ABCI规范

原文地址:https://github.com/tendermint/abci/blob/master/specification.md

1.消息类型

ABCI请求/响应在此架构文件中定义为简单的Protobuf消息。TendermintCore发送请求,ABCI应用程序发送响应。在这里,我们提供了消息类型的概述以及Tendermint如何使用它们。然后我们将每个请求-响应对描述为带有参数和返回值的函数,并添加一些使用说明。

某些消息(Echo、Info、InitChain、BeginBlock、EndBlock、Commit)不会返回错误,因为错误将指示应用程序中Tendermint无法处理的严重故障。在Tendermint和应用程序都重新启动的情况下问题应该得到解决。所有其他消息(SetOption、Query、CheckTx、deliverx)都返回特定于应用程序的响应uint32代码,其中只有0保留为OK。

某些消息(SetOption、Query、CheckTx、DeliverTx)以Info和日志的形式返回不确定的数据。日志用于应用程序记录器的文本输出,而Info是应返回的任何其他信息。

第一次启动新区块链时,Tendermint调用InitChain。从那时起,导致提交状态被更新的块执行序列如下:

BeginBlock, [DeliverTx], EndBlock, Commit

其中为块中的每个事务调用一个DeliverTx。对DeliverTx、EndBlock和Commit结果的加密提交包含在下一个块的头中。

Tendermint打开三个到应用程序的连接以处理不同的消息类型:

共识连接 - InitChain, BeginBlock, DeliverTx, EndBlock, Commit 内存池连接 - CheckTx 消息连接 - Info, SetOption, Query

Flush消息用于每个连接,Echo消息仅用于调试。

注意,消息可以在所有连接中并发发送-因此,典型的应用程序将为每个连接保持不同的状态。它们分别称为DeliverTx状态、CheckTx状态和Commit状态。

有关消息类型及其使用方式的详细信息,请参见下文。

2.请求/响应消息

Echo

Request: Message (string): echo返回字符串 Response: Message (string): 输入字符串 Usage: 输出一个字符串以测试abci客户端/服务实现

Flush

Usage: 表示应将客户端上排队的消息刷新到服务器。客户端实现定期调用它以确保异步请求被正确发送,并立即调用它以发出同步请求,该请求在Flush响应返回时返回。

Info

Request: Version (string): Tendermint版本号 Response: Data (string): 任意某些信息 Version (Version): 版本信息 LastBlockHeight (int64): 应用程序为其调用Commit的最新块 LastBlockAppHash ([]byte): 最新Commit结果 Usage: 返回有关应用程序状态的信息 用于在启动时与应用程序握手时同步Tendermint。 Tendermint期望在Commit期间更新LastBlockAppHash和LastBlockHeight,确保对于同一块高度从不调用两次Commit。

SetOption

Request: Key (string): 设置的键值 Value (string): 为键设置的值 Response: Code (uint32): 响应代码 Log (string): 应用程序日志输出,可能是不确定的。 Info (string): 其他信息。可能是不确定的。 Usage: 设置非共识的关键应用程序特定选项。 例如,Key=“min-fee”,Value=“100fermion”可以设置CheckTx所需的最低费用(但不是DeliverTx-这将是共识的关键)。

InitChain

Request: Validators ([]Validator): 初始创世验证程序 AppStateBytes ([]byte): 序列化的初始应用程序状态 Response: ConsensusParams (ConsensusParams): 初始化共识关键参数。 Validators ([]Validator): 初始验证程序集。 Usage: 在创世一次性调用。

Query

Request: Data ([]byte): 原始查询字节,可用于或代替路径。 Path (string): 请求的路径,类似于HTTP GET路径。可以与数据一起使用,也可以替代数据使用。 应用程序必须将“/store”解释为按关键字查询基础存储区。应在Data字段中定义键。 应用程序应允许查询特定类型,如“/accounts/…”或“/vots/…” Height (int64): 要查询的块高度(默认值为0,返回最近提交的块的数据)。注意,这是包含应用程序的Merkle根哈希的块的高度,它表示在Height -1提交块之后的状态。 Prove (bool): 如果可能,返回带响应的Merkle证明。 Response: Code (uint32): 响应代码。 Log (string): 应用程序日志输出,可能是不确定的。 Info (string): 附加信息,可能是不确定的。 Index (int64): 键在树中的索引。 Key ([]byte): 匹配数据的键值。 Value ([]byte): 匹配数据的值。 Proof ([]byte): 如果被请求,证明数据。 Height (int64): 获得数据的块高度。注意,这是包含应用程序的Merkle根哈希的块的高度,它表示在Height-1提交块之后的状态。 Usage: 查询应用程序当前或过去高度的数据。 选择性返回Merkle证明。

BeginBlock

Request: Hash ([]byte): 区块哈希,可以从块头派生。 Header (struct{}): 区块头。 Validators ([]SigningValidator): 当前验证器集中的验证器列表,以及它们是否在上次提交中签署了投票。 ByzantineValidators ([]Evidence): 恶意行为的验证者的证据清单。 Response: Tags ([]cmn.KVPair): 用于过滤和索引的键-值标签。 Usage: 表示新块的开始,在任何DeliverTxs之前调用。 区块头应至少包含高度。 Validators和ByzantineValidators可用于确定对验证器的奖惩。

CheckTx

Request: Tx ([]byte): 请求交易字节。 Response: Code (uint32): 响应代码。 Data ([]byte): 结果字节(如果有)。 Log (string): 应用程序日志输出,可能是不确定的。 Info (string): 附加信息,可能是不确定的。 GasWanted (int64): 交易的Gas需求量。 GasUsed (int64): 交易的Gas消耗量。 Tags ([]cmn.KVPair): 用于过滤和索引交易的键-值标签(如按账号)。 Fee (cmn.KI64Pair): 为交易支付的费用。 Usage: 在广播或提议之前,验证内存池交易。CheckTx应该对交易的有效性执行进行有状态但轻量级的检查(比如检查签名和账户余额),但不需要完全执行(比如运行智能合约)。

Tendermint同时运行CheckTx和DeliverTx,尽管它们分别运行在不同的ABCI连接(内存池连接和共识连接)上。

应用程序应保持单独的状态以支持CheckTx。在提交期间,可以将此状态重置为最新的Commit状态。在调用Commit之前,Tendermint将锁定并刷新内存池,确保所有现有的CheckTx都响应,并且没有新的CheckTx可以开始。Commit之后,内存池将为所有剩余的交易重新运行CheckTx,丢弃任何不再有效的交易。然后内存池将解锁并再次开始发送CheckTx。

标签中的键和值必须是UTF-8编码的字符串(例如,”account.owner”:”Bob”,”balance”:”100.0” , “date”:”2018-01-02”)

DeliverTx

Request: Tx ([]byte): 请求交易字节。 Response: Code (uint32): 响应代码。 Data ([]byte): 结果字节(如果有)。 Log (string): 应用程序日志输出,可能是不确定的。 Info (string): 附加信息,可能是不确定的。 GasWanted (int64): 交易的Gas需求量。 GasUsed (int64): 交易的Gas消耗量。 Tags ([]cmn.KVPair): 用于过滤和索引交易的键-值标签(如按账号)。 Fee (cmn.KI64Pair): 为交易支付的费用。 Usage: 分发由应用程序完全执行的交易。如果交易有效,则返回CodeType.OK。 标签中的键和值必须是UTF-8编码的字符串 (例如 "account.owner": "Bob", "balance": "100.0", "time": "2018-01-02T12:30:00Z")

EndBlock

Request: Height (int64): 刚执行的块的高度。 Response: ValidatorUpdates ([]Validator): 更改验证程序集(如果要删除将投票权设置为0)。 ConsensusParamUpdates (ConsensusParams): 共识关键时间、大小和其他参数的更改。 Tags ([]cmn.KVPair): 用于过滤和索引的键-值标签。 Usage: 表示块的结束。 在每次交易之后,提交之前调用。 验证程序集和共识参数将随结果更新。 验证程序共钥应该是go-wire编码的。

Commit

Response: Data ([]byte): Merkle根哈希 Usage: 保持应用程序状态。 返回应用程序状态的Merkle根哈希。 所有应用程序实例都返回相同的哈希值是非常重要的。否则,他们就不能同意下一个块,因为哈希包含在下一个块中!

3.数据消息

Header

Fields: ChainID (string): 区块链ID Height (int64): 区块在链中的高度 Time (int64): 区块的Unix时间 NumTxs (int32): 区块内的交易数量 TotalTxs (int64): 到目前为止区块链中的交易总数 LastBlockHash ([]byte): 上一个(父)块的哈希 ValidatorsHash ([]byte): 区块的验证程序集的哈希值 AppHash ([]byte): 上次Commit调用返回的数据-通常是执行前一个块的交易后应用程序状态的Merkle根 Proposer (Validator): 区块的原提案人 Usage: 在RequestBeginBlock中提供 提供关于区块链当前状态的重要上下文,特别是高度和时间。 提供当前块的提议者,用于基于提议者的奖励机制。

Validator

Fields: Address ([]byte): 验证器的地址(公钥的哈希) PubKey (PubKey): 验证器的公钥 Power (int64): 验证器投票权 Usage: 提供关于验证器的所有标识信息

SigningValidator

Fields: Validator (Validator):一个验证器 SignedLastBlock (bool): 表明验证程序是否在最后一个块上签名 Usage: 表示验证器是否在最后一个块签名,允许根据验证器的可用性进行奖励

PubKey

Fields: Type (string): 公钥的类型。像“ed25519”这样的简单字符串。在将来,可以表示一种序列化算法来解析Data,例如“amino”。 Data ([]byte): 公钥数据。对于一个简单的公钥,它只是原始字节。如果Type是编码算法,则这是已编码的公钥。 Usage: 一个通用的可扩展类型公钥

Evidence

Fields: Type (string): 证据的类型。像“duplicate/vote”这样的分层路径。 Validator (Validator): 违规验证器 Height (int64): 攻击提交时的高度 Time (int64): 块高度Height的Unix时间 TotalVotingPower (int64): 验证程序集在高度Height的总投票权

—-

编译者/作者:灰狼

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...