java-tron核心模块¶
代码结构¶
java-tron是基于Java语言开发的TRON网络客户端,它实现了TRON白皮书中所提到的所有功能,包括共识机制、密码学、数据库、TVM虚拟机、网络管理等。我们可以通过启动java-tron来运行一个TRON网络节点。在本文中,我们将详细描述java-tron的代码结构,介绍其各个功能模块的作用,便于开发者后续的代码分析与开发。
java-tron采用模块化的代码结构,代码结构清晰,易于维护与扩展。java-tron 的核心由 7 个模块组成:protocol、common、chainbase、consensus、actuator、crypto、framework,本文将分别介绍这 7 个核心模块的功能及其代码组织结构。除此之外,java-tron 还包含两个辅助模块:
plugins- 节点维护工具集(Toolkit),提供数据库的 lite、convert、copy、move、archive 等离线操作工具platform- CPU 架构适配模块,按common/x86/arm分别提供与具体架构相关的实现(如数学运算、市场订单比较器等)
protocol¶
对于区块链这种分布式网络,简洁高效的数据交互协议非常重要,protocol模块定义了:
- 节点间通信协议
- 节点内部模块间的通信协议
- 对外提供的服务协议
上述协议采用了Google Protobuf数据交互格式,相比于JSON和XML,Google Protobuf格式更高效和灵活,可以通过ProtoBuf编译器为定义的协议文件生成特定语言的序列化和反序列化的源代码。Protobuf是 java-tron 实现跨语言跨平台的基础。
protocol 模块的代码路径为https://github.com/tronprotocol/java-tron/tree/develop/protocol,其目录结构如下:
|-- protocol/src/main/protos
|-- api
| |-- api.proto
| |-- zksnark.proto
|-- core
|-- Discover.proto
|-- Tron.proto
|-- TronInventoryItems.proto
|-- contract
api/- java-tron节点对外提供的gRPC接口及数据结构core/- 节点间及节点内部各个模块间通信的数据结构Discover.proto- 节点发现相关的数据结构TronInventoryItems.proto- 节点间区块传输相关数据结构contract/- 合约相关的数据结构Tron.proto- 其它重要的数据结构定义,其中包括账户、区块、交易、资源、超级代表、投票、提案相关的数据结构。
common¶
common模块对公共组件和一些工具类进行了封装,比如异常处理、指标监控工具等,以方便其他模块调用。
common 模块的代码路径为https://github.com/tronprotocol/java-tron/tree/develop/common, 其目录结构如下:
|-- common/src/main/java/org/tron
|-- common
| |-- args
| |-- cache
| |-- config
| |-- cron
| |-- entity
| |-- es
| |-- exit
| |-- log
| |-- logsfilter
| |-- math
| |-- parameter
| |-- prometheus
| |-- runtime
| |-- setting
| |-- utils
|-- core
|-- config
|-- db
|-- db2
|-- exception
|-- vm
common/prometheus- prometheus指标监控common/utils- 基础数据类型封装类core/config- 节点配置相关类core/exception- 所有的TRON网络异常处理相关类
chainbase¶
chainbase 模块是数据库层面的抽象,像 PoW、PoS、DPoS 这类基于概率性的共识算法不可避免的会以一定的概率发生切链,因此 chainbase 定义了一个支持可回退数据库的接口标准,该接口要求数据库实现状态回滚机制、checkpoint容灾机制等。
另外 chainbase 模块具有良好的接口抽象设计,任何满足接口实现的数据库都可以作为区块链的底层存储,赋予开发者更多的灵活性,LevelDB和RocksDB是默认提供的两种具体实现。
chainbase 模块的代码路径为https://github.com/tronprotocol/java-tron/tree/develop/chainbase,其目录结构如下:
|-- chainbase/src/main/java/org/tron
|-- common
| |-- bloom
| |-- error
| |-- overlay
| |-- runtime
| |-- storage
| | |-- leveldb
| | |-- rocksdb
| |-- utils
| |-- zksnark
|-- core
|-- actuator
|-- capsule
|-- db
| |-- RevokingDatabase.java
| |-- TronStoreWithRevoking.java
| |-- ......
|-- db2
| |-- common
| |-- core
| |-- SnapshotManager.java
| |-- ......
|-- net
|-- service
|-- store
common/- 公共组件,比如异常处理类、工具类storage/leveldb/实现了使用LevelDB作为底层存储数据库storage/rocksdb/实现了使用RocksDB作为底层存储数据库
-
core/- chainbase模块核心代码-
capsule/各个数据结构的封装类,比如AccountCapsule,BlockCapsule等,AccountCapsule为Account数据结构的封装类,提供了账户数据的修改与查询;BlockCapsule为Block数据结构的封装类,提供了区块数据的修改与查询。
-
store/各个数据库,比如
AccountStore,ProposalStore等。AccountStore是账户数据库,数据库名称为account,存储了TRON网络中的所有账户信息;ProposalStore是提案数据库,数据库名称为proposal,存储了TRON网络中的所有提案信息。 -
db/和db2/实现了可回退数据库。
db/目录提供核心接口与基类(如RevokingDatabase、TronStoreWithRevoking),而实际的回滚实现是位于db2/目录下的SnapshotManager。SnapshotManager提供稳定的数据回滚机制,并支持底层数据库的扩展,是 java-tron 用于回退数据库的实现,其中的几个重要接口及实现类如下:RevokingDatabase.java是数据库容器的接口,用于所有可回退数据库的管理,SnapshotManager是该接口的一个实现TronStoreWithRevoking.java是支持可回退的数据库的基类,所有的可回退数据库都是它的具体实现,比如BlockStore,TransactionStore等
-
chainbase 模块的详细解析——交易处理、状态回滚、区块持久化与数据持久化——见 ChainBase 深入解析。
consensus¶
共识机制是区块链中非常重要的模块,常见的有 PoW、PoS、DPoS、PBFT 等,联盟链以及其他一些可信网络中也会采用 Paxos、Raft 等共识机制,共识的选择需要和业务场景相匹配,比如对共识效率敏感实时游戏类就不适合采用 PoW,而对实时性要求极高的交易所来说 PBFT 可能是首选。所以支持可替换的共识是非常有必要的,同时也是实现特定应用区块链的重要一环,consensus 模块最终目标是能够让应用开发者能够像配置参数那样简单的切换共识机制。
consensus 模块的代码路径为https://github.com/tronprotocol/java-tron/tree/develop/consensus,其目录结构如下:
|-- consensus/src/main/java/org/tron/consensus
|-- Consensus.java
|-- ConsensusDelegate.java
|-- base
| |-- ConsensusInterface.java
| |-- ......
|-- dpos
|-- pbft
start- 启动共识服务,可以自定制启动参数stop- 停止共识服务receiveBlock- 定义接收区块的共识逻辑validBlock- 定义验证区块的共识逻辑applyBlock- 定义处理区块的共识逻辑
目前java-tron基于 ConsensusInterface 接口实现了DPOS共识和PBFT共识,分别位于dpos/和pbft/目录下,开发者也可以根据自身业务需求实现 ConsensusInterface 接口,来自定义共识机制。
actuator¶
以太坊初创性的引入了虚拟机并定义了智能合约这种开发方式,但对于一些复杂的应用,智能合约不够灵活且受限于性能,这也是 java-tron 提供创建应用链的一个原因。为此 java-tron 独立出来了 actuator 模块,该模块为应用开发者提供一种新的开发范式:可以将应用代码直接植入链中而不再将应用代码跑在虚拟机中。
actuator是交易的执行器,可以将应用看成是不同交易类型组成的交易集,每类交易都由对应的 actuator 负责执行。
actuator 模块的代码路径为https://github.com/tronprotocol/java-tron/tree/develop/actuator,其目录结构如下:
|-- actuator/src/main/java/org/tron/core
|-- actuator
| |-- AbstractActuator.java
| |-- ActuatorCreator.java
| |-- ActuatorFactory.java
| |-- TransferActuator.java
| |-- VMActuator.java
| |-- ......
|-- utils
|-- vm
actuator/- TRON网络中各种类型交易的执行器,定义了不同类型交易的处理逻辑,比如TransferActuator是转账TRX交易的处理类,FreezeBalanceV2Actuator是质押TRX获取资源交易的处理类utils/- 执行交易所需的工具类vm/- 虚拟机相关代码
actuator模块定义的 Actuator 接口有4个方法:
execute- 负责交易具体需要执行的动作,可以是状态修改、流程跳转、逻辑判断validate- 负责验证交易的正确性getOwnerAddress- 获取交易发起方的地址calcFee- 定义交易手续费计算逻辑
开发者也可以根据自身业务实现 Actuator 接口,来实现自定义交易类型的处理。
crypto¶
crypto是一个相对独立的模块,但也是非常重要的模块,java-tron中的数据安全几乎全由该模块来保证,目前支持SM2和ECKey加密算法。
crypto模块的路径为https://github.com/tronprotocol/java-tron/tree/develop/crypto,其目录结构如下:
|-- crypto/src/main/java/org/tron/common/crypto
|-- Blake2bfMessageDigest.java
|-- ECKey.java
|-- Hash.java
|-- SignInterface.java
|-- SignUtils.java
|-- SignatureInterface.java
|-- cryptohash
|-- jce
|-- sm2
|-- zksnark
sm2和jce- 提供SM2和ECKey加密算法和签名算法zksnark- 提供零知识证明算法
framework¶
framework是 java-tron 的核心模块,也是节点的入口,framework 模块负责各个模块的初始化及业务逻辑的跳转,framework包含了节点对外提供的服务、区块广播及处理流程;底层的节点发现与连接传输由外部依赖 libp2p 提供,而 TRON 协议层(握手、保活、消息分发、同步与广播)仍由 framework 的 core/net 负责。
framework模块的代码路径为https://github.com/tronprotocol/java-tron/tree/develop/framework,其目录结构如下:
|-- framework/src/main/java/org/tron
|-- common
| |-- application
| |-- backup
| |-- client
| |-- logsfilter
| |-- runtime
| |-- zksnark
|-- core
| |-- Wallet.java
| |-- capsule
| |-- config
| |-- consensus
| |-- db
| |-- metrics
| |-- net
| |-- services
| |-- trie
| |-- zen
|-- keystore
|-- program
| |-- FullNode.java
program/FullNode.java- 它是程序的入口点,初始化对外的HTTP、gRPC和json-rpc接口服务core/services- 定义了对外提供的服务,其子目录http/包含了所有的http接口处理类,jsonrpc/包含了所有的json-rpc接口处理类core/net- 消息处理及网络业务逻辑,其子目录service/为交易及区块广播、区块抓取及同步逻辑core/db/Manager.java- 交易及区块校验并处理逻辑
说明:早期版本中,节点发现与节点连接管理的底层实现位于 framework 模块的
common/overlay目录(discover、server等子目录)。该 P2P 网络底层现已抽离为独立的外部依赖io.github.tronprotocol:libp2p,framework 中不再保留common/overlay与common/net目录。底层的节点发现与连接传输现由 libp2p 库提供,framework 通过core/net(如TronNetService)与之对接;其上的 TRON 协议层——握手、保活、消息分发、同步、广播以及 peer 业务状态管理——仍保留在core/net中。其上的网络层位于
core/net。P2P 网络子系统的详细解析——区块同步、区块和交易广播——见 P2P 网络深入解析。
总结¶
本文主要介绍了java-tron的代码结构,以及各个功能模块的作用、位置及目录结构,通过本文您会对java-tron的整体结构及关键接口有了大致的了解,方便后续的代码分析和开发。