LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 【译文】Cosmos技术文档ABCI

【译文】Cosmos技术文档ABCI

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

区块链是用于多主状态机复制的系统。ABCI是定义复制引擎(区块链)和状态机(应用程序)之间边界的接口。使用socket协议,在一个进程中运行的共识引擎可以管理在另一个进程中运行的应用程序状态。

在过去,ABCI被称为TMSP。

社区提供了许多附加实现,参见Tendermint生态系统。

1.说明

ABCI方法和消息类型的详细说明包含在:

?散文规范

?protobuf文件

?Go接口。

有关ABCI、动机和tendermint的更多背景信息,请访问相关文档。要重点关注的两个指南是应用程序开发指南和使用ABCI-CLI。

2.Protocl Buffers

要编译protobuf文件,请运行:

make protoc

有关为其他语言编译的详细信息,请参阅--help和Protocol Buffers网站。注意,我们还包括一个GRPC服务定义。

3.安装ABCI-CLI

abci-cli是调试abci服务和运行一些示例应用程序的简单工具。要安装它:

go get github.com/tendermint/abci

cd $GOPATH/src/github.com/tendermint/abci

make get_vendor_deps

make install

4.实现

我们在Go中提供了三种ABCI实现:

Golang in-process ABCI-socket GRPC

注意:GRPC版本的维护主要是为了简化参与者入职培训和原型设计,而不是像其他版本一样受到安全和性能方面的关注。

4.1运行

最简单的实现只是在Go中使用函数调用。这意味着用Golang编写的ABCI应用程序可以用TendermintCore编译并作为单个二进制文件运行。

有关详细信息,请参见下面的示例。

4.2Socket (TSP)

ABCI最好作为流协议来实现。socket实现提供了通过unix或tcp的异步、有序消息传递。消息使用Protobuf3序列化,并且带有符号变量长度前缀。

例如,如果Protobuf3编码的ABCI消息是0xDEADBEEF(4字节),则长度前缀消息是0x08DEADBEEF,因为0x08是4的符号变量编码。如果Protobuf3编码的ABCI消息是65535字节长,那么长度前缀消息将类似于0xFEFF07…

请注意,与旧版本(整数编码为<len of len><big endian len>相比,使用这种可变编码的好处是,它是Protobuf中整数编码的标准方法。它通常也较短。

4.3GRPC

GRPC是一个Protocol Buffers 的原生rpc框架,支持多种语言。使用GRPC实现ABCI可以实现更快的原型,但预计要比有序的异步Socket协议慢得多。该实现也没有收到比较多的测试或审查。

注意,Socket实现中使用的长度前缀不适用于GRPC。

5.使用

abci-cli工具包装ABCI客户端,可用于探测/测试ABCI服务。例如,abci-cli测试将对运行计数器应用程序的监听服务运行测试序列(见下文)。它还可以用于运行一些示例应用程序。有关详细信息,请参阅文档。

5.1例子

查看example目录中的各种示例应用程序。它还包含Counter和kvstore应用程序引用的代码;这些应用程序内置在abci-cli二进制文件中。

5.1.1Counter

abci-cli counter应用程序演示了nonce签入事务。代码看起来像:

func cmdCounter(cmd *cobra.Command, args []string) error {

app := counter.NewCounterApplication(flagSerial)

logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout))

// Start the listener

srv, err := server.NewServer(flagAddrC, flagAbci, app)

if err != nil {

return err

}

srv.SetLogger(logger.With("module", "abci-server"))

if err := srv.Start(); err != nil {

return err

}

// Wait forever

cmn.TrapSignal(func() {

// Cleanup

srv.Stop()

})

return nil

}

可以在这个文件中找到。

5.1.2kvstore

abci-cli kvstore应用程序,它演示了一个简单的键值Merkle树

func cmdKVStore(cmd *cobra.Command, args []string) error {

logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout))

// Create the application - in memory or persisted to disk

var app types.Application

if flagPersist == "" {

app = kvstore.NewKVStoreApplication()

} else {

app = kvstore.NewPersistentKVStoreApplication(flagPersist)

app.(*kvstore.PersistentKVStoreApplication).SetLogger(logger.With("module", "kvstore"))

}

// Start the listener

srv, err := server.NewServer(flagAddrD, flagAbci, app)

if err != nil {

return err

}

srv.SetLogger(logger.With("module", "abci-server"))

if err := srv.Start(); err != nil {

return err

}

// Wait forever

cmn.TrapSignal(func() {

// Cleanup

srv.Stop()

})

return nil

}

—-

编译者/作者:灰狼

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

LOADING...
LOADING...