sr节点: 超级节点,负责出块,全网只有27个超级节点
fullnode节点: 从sr节点同步区块
这篇文章主要介绍深入分析TRON的节点配置文件中vm.minTimeRatio和vm.maxTimeRatio这两个标志的意义。
这两个标志的表示的是节点(包括sr和fullnode)验证区块中智能合约交易的时间比例(时间容忍度)。
什么是时间容忍度?
在tron中,sr节点打包一个智能合约交易时,允许执行智能合约的最大时间是50ms,如果超过50ms就产生OutOfTime错误,让后将错误保存到contractRet中,并且回滚所有执行的状态。同时扣除energylimit指定的所有费用,所以这样的交易是可以被打包的,开发者要非常小心,避免出现这样的情况,否则人财两失。
这里的50ms时间是机器的绝对时间,也就是说当sr开始执行智能合约时,会获取一下系统时间记为vmStartInUs ,然后计算一个截止时间vmShouldEndInUs,vmShouldEndInUs = 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-t