TRON节点验证交易的时间容忍度

这篇文章主要介绍深入分析TRON的节点配置文件中vm.minTimeRatiovm.maxTimeRatio这两个标志的意义。

这两个标志的表示的是节点(包括sr和fullnode)验证区块中智能合约交易的时间比例(时间容忍度)。

注:

  • sr节点: 超级节点,负责出块,全网只有27个超级节点
  • fullnode节点: 从sr节点同步区块

什么是时间容忍度?

在tron中,sr节点打包一个智能合约交易时,允许执行智能合约的最大时间是50ms,如果超过50ms就产生OutOfTime错误,让后将错误保存到contractRet中,并且回滚所有执行的状态。同时扣除energylimit指定的所有费用,所以这样的交易是可以被打包的,开发者要非常小心,避免出现这样的情况,否则人财两失。

这里的50ms时间是机器的绝对时间,也就是说当sr开始执行智能合约时,会获取一下系统时间记为vmStartInUs ,然后计算一个截止时间vmShouldEndInUsvmShouldEndInUs = vmStartInUs + 50 ms, 然后每执行一条智能合约指令,都会比较系统当前时间是不是超过了截止时间,一旦超过,就会触发异常,立即停止执行指令。假设有一笔交易执行的时间是49ms,没有超过50ms,并且也没有其他错误, 所以被记为succes,记录到交易的receipt.result中。

当sr把包含这个49ms的交易广播出去后,某一个fullode节点收到这个区块,并且执行区块中的每一个交易,当执行49ms的交易时,那这个fullnode执行这笔交易的总时间一定也是49ms吗?答案肯定是不一定的, 因为sr节点的机器配置和fullnode不一定完全相同,假如fullnode节点配置比sr节点差一些,很可能执行的总时间会超过50ms,假设是51ms,fullnode会发现这个结果和交易的receipt.result不一致,log日志输出 “[pool-34-thread-1] DB Different resultCode ”,直接导致整个区块验证失败。那这肯定是不能容忍的,不能因为小小的机器误差就导致区块无法同步?

tron的解决方案是,所有节点验证执行其他的节点广播过来的区块中的交易时, 允许的时间不是50ms, 而是一个可以自己设置的值。怎么设置呢, 这里就用到了maxTimeRatiominTimeRatio

当执行的一笔交易的receipt.result的不为OutOfTime,那么执行这笔交易最大的时间是50 *maxTimeRatio,如果这笔交易的receipt.result本来就是OutOfTime,那么执行这笔交易最大的时间是50*minTimeRatio。一般tron的节点启动配置文件中minTimeRatio默认为0,maxTimeRatio默认为5。

还是刚才我们举的例子,sr执行交易的时间为49ms,那其他节点验证执行这笔交易只要不超过250ms(505),都不会认为是OutOfTime。如果sr打包的交易的本来就是OutOfTime,那么其他节点验证执行这笔交易的时间不能超过0ms(500),也就是直接认为是超时的。即便多了5倍的时间,有一些性能比较差的机器还是会将本来没有问题的交易误认为是超时交易。所以如果fullnode节点的性能一般,可以将maxTimeRatio调大一些,以防止由于自身的性能原因导致对一个正常的交易验证失败,最终导致区块不能同步。

推荐将minTimeRatio设为0, 为什么呢?为什么对sr认为超时的交易验证要更加严苛呢,我的理解是如果别的sr已经认为是OutOfTime超时了, 我就使用最小的时间系数来验证这个交易,是为了尽量也产生OutOfTime的结果, 和sr达成一致。不过这样似乎不太公平,相当于某一个sr的机器性能成为了交易执行时间的上限,只要出块节点认为是timeout, 那其他节点也会服从。

总结

  • maxTimeRatio 表示的是验证节点对没有超时的交易验证时允许的时间相对于出块节点执行的比例。
  • minTimeRatio 表示的是验证节点对超时交易验证时允许的时间相对于出块节点执行时间的比例。
TRON 区块链中,节点数据的下载和同步可以通过部署全节点(FullNode)或固态节点(SolidityNode)来实现。TronDeployment 是一个推荐的一键部署工具,它简化了 TRON 网络节点的搭建过程,支持本地或服务器环境下的部署[^1]。 ### 下载和同步 Tron 节点数据的方法 #### 1. 使用 TronDeployment 部署节点 TronDeployment 是一个开源项目,能够帮助用户快速部署 TRON节点和 SolidityNode,甚至 gRPC Gateway。以下是基本步骤: - **克隆项目仓库** ```bash git clone https://github.com/tronprotocol/java-tron.git cd java-tron ``` - **构建项目** ```bash ./gradlew build ``` - **运行 FullNode 或 SolidityNode** - 启动 FullNode: ```bash nohup java -jar build/libs/FullNode.jar --config conf/config.conf & ``` - 启动 SolidityNode: ```bash nohup java -jar build/libs/SolidityNode.jar --config conf/solidity_config.conf & ``` 通过这种方式,节点将自动开始同步区块链数据[^1]。 #### 2. 手动配置节点参数 在配置文件中可以调整节点监听端口、RPC 端口等信息。例如,在 `config.conf` 中设置如下内容: ```conf node { trustNode = "127.0.0.1:50051" listen.port = 18889 // 修改为你需要的端口号 } rpc { port = 50052 } ``` 确保配置文件中的参数符合你的网络需求,然后启动节点服务以开始同步数据[^3]。 #### 3. 直接使用官方提供的 Java-TRON 项目 TRON 的核心代码托管在 GitHub 上,你可以直接从 [Java-TRON](https://github.com/tronprotocol/java-tron) 获取源码并进行编译和部署。该方法适合希望深入了解 TRON 协议底层实现的技术人员。 #### 4. 使用 Docker 部署 如果你熟悉 Docker 技术,也可以使用官方镜像来部署 TRON 节点。Docker 提供了一种更便捷的方式来管理依赖项和环境配置。例如: ```bash docker run -d -p 18889:18889 -p 50051:50051 -p 50052:50052 tronprotocol/full-node ``` 此命令将启动一个包含 FullNode 的容器,并自动开始同步区块链数据。 #### 5. 查看日志确认同步状态 当节点启动后,可以通过查看日志文件确认同步进度。例如: ```bash tail -f logs/tron.log ``` 日志中会显示最新的区块头 ID 和其他相关信息,表明节点正在正常同步数据[^4]。 --- ### 注意事项 - **网络连接**:确保节点所在的服务器或本地机器有稳定的互联网连接。 - **硬件要求**:TRON 节点对 CPU、内存和磁盘 I/O 有一定要求,建议使用高性能服务器。 - **防火墙设置**:开放必要的端口(如 18889、50051、50052),以便节点能够与其他节点通信。 - **定期备份**:为防止数据丢失,建议定期备份节点数据目录。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥的技术杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值