Coverage Summary for Class: RskSystemProperties (co.rsk.config)

Class Method, % Line, %
RskSystemProperties 13.2% (7/53) 12.4% (14/113)
RskSystemProperties$MockitoMock$974318108
RskSystemProperties$MockitoMock$974318108$auxiliary$0DMJ1gIB
RskSystemProperties$MockitoMock$974318108$auxiliary$0veLsN4k
RskSystemProperties$MockitoMock$974318108$auxiliary$0wRv7ERg
RskSystemProperties$MockitoMock$974318108$auxiliary$1AoRApvO
RskSystemProperties$MockitoMock$974318108$auxiliary$1H6V8X0p
RskSystemProperties$MockitoMock$974318108$auxiliary$1levtL7I
RskSystemProperties$MockitoMock$974318108$auxiliary$2LPRntKQ
RskSystemProperties$MockitoMock$974318108$auxiliary$34hYK9tD
RskSystemProperties$MockitoMock$974318108$auxiliary$4C8PL5gq
RskSystemProperties$MockitoMock$974318108$auxiliary$54vVEyoh
RskSystemProperties$MockitoMock$974318108$auxiliary$5Otbrlr6
RskSystemProperties$MockitoMock$974318108$auxiliary$6D0R0oww
RskSystemProperties$MockitoMock$974318108$auxiliary$6mlNjGfG
RskSystemProperties$MockitoMock$974318108$auxiliary$6Pls2UqY
RskSystemProperties$MockitoMock$974318108$auxiliary$6sTShqvo
RskSystemProperties$MockitoMock$974318108$auxiliary$7i6r3nNz
RskSystemProperties$MockitoMock$974318108$auxiliary$8pGCPHIB
RskSystemProperties$MockitoMock$974318108$auxiliary$8PJcIAFY
RskSystemProperties$MockitoMock$974318108$auxiliary$8vKLRgrA
RskSystemProperties$MockitoMock$974318108$auxiliary$9cWBoLDN
RskSystemProperties$MockitoMock$974318108$auxiliary$9drbMzrK
RskSystemProperties$MockitoMock$974318108$auxiliary$9ko11fnr
RskSystemProperties$MockitoMock$974318108$auxiliary$9uoLuhVy
RskSystemProperties$MockitoMock$974318108$auxiliary$9wsdZR5p
RskSystemProperties$MockitoMock$974318108$auxiliary$AIe10aMG
RskSystemProperties$MockitoMock$974318108$auxiliary$ajJQrwnA
RskSystemProperties$MockitoMock$974318108$auxiliary$Api7PRat
RskSystemProperties$MockitoMock$974318108$auxiliary$avtDaFx5
RskSystemProperties$MockitoMock$974318108$auxiliary$axx9pH9B
RskSystemProperties$MockitoMock$974318108$auxiliary$BPaNJ24L
RskSystemProperties$MockitoMock$974318108$auxiliary$BUgMkH62
RskSystemProperties$MockitoMock$974318108$auxiliary$C9W8HsDv
RskSystemProperties$MockitoMock$974318108$auxiliary$CBJ6jjz5
RskSystemProperties$MockitoMock$974318108$auxiliary$cCpv0mQo
RskSystemProperties$MockitoMock$974318108$auxiliary$cELhRXUv
RskSystemProperties$MockitoMock$974318108$auxiliary$CJ6cdh9H
RskSystemProperties$MockitoMock$974318108$auxiliary$CmLGOCSs
RskSystemProperties$MockitoMock$974318108$auxiliary$CXvevTK3
RskSystemProperties$MockitoMock$974318108$auxiliary$Czuj7ArT
RskSystemProperties$MockitoMock$974318108$auxiliary$D2HxASwu
RskSystemProperties$MockitoMock$974318108$auxiliary$dGWOIctB
RskSystemProperties$MockitoMock$974318108$auxiliary$DKj7spaf
RskSystemProperties$MockitoMock$974318108$auxiliary$DmFO7U6D
RskSystemProperties$MockitoMock$974318108$auxiliary$duC7pJlF
RskSystemProperties$MockitoMock$974318108$auxiliary$dvMMBml7
RskSystemProperties$MockitoMock$974318108$auxiliary$eArHfTbY
RskSystemProperties$MockitoMock$974318108$auxiliary$EEpwfaF1
RskSystemProperties$MockitoMock$974318108$auxiliary$EgNfZpbB
RskSystemProperties$MockitoMock$974318108$auxiliary$EQmYWrLk
RskSystemProperties$MockitoMock$974318108$auxiliary$ERwlS4a8
RskSystemProperties$MockitoMock$974318108$auxiliary$eS80XWO0
RskSystemProperties$MockitoMock$974318108$auxiliary$Ex5EQU8Y
RskSystemProperties$MockitoMock$974318108$auxiliary$fBvddFgO
RskSystemProperties$MockitoMock$974318108$auxiliary$fgu9VRQJ
RskSystemProperties$MockitoMock$974318108$auxiliary$gFsXtwbE
RskSystemProperties$MockitoMock$974318108$auxiliary$GJHx75TJ
RskSystemProperties$MockitoMock$974318108$auxiliary$GQ2qLckW
RskSystemProperties$MockitoMock$974318108$auxiliary$GRWmHp91
RskSystemProperties$MockitoMock$974318108$auxiliary$gUyqivqQ
RskSystemProperties$MockitoMock$974318108$auxiliary$h6JDGuJ4
RskSystemProperties$MockitoMock$974318108$auxiliary$HbIT8h6M
RskSystemProperties$MockitoMock$974318108$auxiliary$hGpknwQ0
RskSystemProperties$MockitoMock$974318108$auxiliary$HhNHVq2E
RskSystemProperties$MockitoMock$974318108$auxiliary$hjrLbsTn
RskSystemProperties$MockitoMock$974318108$auxiliary$hPdfDfVW
RskSystemProperties$MockitoMock$974318108$auxiliary$HU4ux2U4
RskSystemProperties$MockitoMock$974318108$auxiliary$I2rxuR4D
RskSystemProperties$MockitoMock$974318108$auxiliary$IVQncECU
RskSystemProperties$MockitoMock$974318108$auxiliary$izGnPIje
RskSystemProperties$MockitoMock$974318108$auxiliary$jEKw1d68
RskSystemProperties$MockitoMock$974318108$auxiliary$JSpwY9bY
RskSystemProperties$MockitoMock$974318108$auxiliary$Jy9jzPOc
RskSystemProperties$MockitoMock$974318108$auxiliary$KcOJu4gW
RskSystemProperties$MockitoMock$974318108$auxiliary$KmPgIqhe
RskSystemProperties$MockitoMock$974318108$auxiliary$KMR5AJkL
RskSystemProperties$MockitoMock$974318108$auxiliary$KMYQeBTh
RskSystemProperties$MockitoMock$974318108$auxiliary$kNb7yRTy
RskSystemProperties$MockitoMock$974318108$auxiliary$KNc5YRrh
RskSystemProperties$MockitoMock$974318108$auxiliary$l5jGtfSO
RskSystemProperties$MockitoMock$974318108$auxiliary$L9tGnIrK
RskSystemProperties$MockitoMock$974318108$auxiliary$lcrhTPcj
RskSystemProperties$MockitoMock$974318108$auxiliary$ljWJxevd
RskSystemProperties$MockitoMock$974318108$auxiliary$lT5GRBWh
RskSystemProperties$MockitoMock$974318108$auxiliary$Ltaybtk3
RskSystemProperties$MockitoMock$974318108$auxiliary$m18iY1jB
RskSystemProperties$MockitoMock$974318108$auxiliary$mIdLvO5Q
RskSystemProperties$MockitoMock$974318108$auxiliary$mmP2R2H5
RskSystemProperties$MockitoMock$974318108$auxiliary$mngmuya9
RskSystemProperties$MockitoMock$974318108$auxiliary$mOT371cN
RskSystemProperties$MockitoMock$974318108$auxiliary$MUCp5FMo
RskSystemProperties$MockitoMock$974318108$auxiliary$NJjLdIIa
RskSystemProperties$MockitoMock$974318108$auxiliary$nNxgIi7c
RskSystemProperties$MockitoMock$974318108$auxiliary$nUZcg0cP
RskSystemProperties$MockitoMock$974318108$auxiliary$OmIM66JP
RskSystemProperties$MockitoMock$974318108$auxiliary$OrDBjeLY
RskSystemProperties$MockitoMock$974318108$auxiliary$P05cDEM9
RskSystemProperties$MockitoMock$974318108$auxiliary$P2i7YFFP
RskSystemProperties$MockitoMock$974318108$auxiliary$PrNBWkUF
RskSystemProperties$MockitoMock$974318108$auxiliary$Q6hN8hSp
RskSystemProperties$MockitoMock$974318108$auxiliary$Q9cTlRbK
RskSystemProperties$MockitoMock$974318108$auxiliary$Qb0XfOaY
RskSystemProperties$MockitoMock$974318108$auxiliary$qZGdwsAx
RskSystemProperties$MockitoMock$974318108$auxiliary$r0Vwfrpn
RskSystemProperties$MockitoMock$974318108$auxiliary$RH7bcGvz
RskSystemProperties$MockitoMock$974318108$auxiliary$rMenj1QC
RskSystemProperties$MockitoMock$974318108$auxiliary$RvZww4I7
RskSystemProperties$MockitoMock$974318108$auxiliary$s8fbNZA7
RskSystemProperties$MockitoMock$974318108$auxiliary$THilTiPh
RskSystemProperties$MockitoMock$974318108$auxiliary$tnIZMPcw
RskSystemProperties$MockitoMock$974318108$auxiliary$u9AG6pYf
RskSystemProperties$MockitoMock$974318108$auxiliary$UcyegjKV
RskSystemProperties$MockitoMock$974318108$auxiliary$UkMyvCRs
RskSystemProperties$MockitoMock$974318108$auxiliary$uULVrmNt
RskSystemProperties$MockitoMock$974318108$auxiliary$uxSqGi4b
RskSystemProperties$MockitoMock$974318108$auxiliary$VllEQxaU
RskSystemProperties$MockitoMock$974318108$auxiliary$VOTctLzA
RskSystemProperties$MockitoMock$974318108$auxiliary$vPyqV7TC
RskSystemProperties$MockitoMock$974318108$auxiliary$w63TBrLk
RskSystemProperties$MockitoMock$974318108$auxiliary$w7YWNzww
RskSystemProperties$MockitoMock$974318108$auxiliary$weCbcTEM
RskSystemProperties$MockitoMock$974318108$auxiliary$wVvjWhCg
RskSystemProperties$MockitoMock$974318108$auxiliary$XKyBI4Iz
RskSystemProperties$MockitoMock$974318108$auxiliary$XpUZIDnk
RskSystemProperties$MockitoMock$974318108$auxiliary$Yf5r00V1
RskSystemProperties$MockitoMock$974318108$auxiliary$YPhEscPy
RskSystemProperties$MockitoMock$974318108$auxiliary$yVGtubQC
RskSystemProperties$MockitoMock$974318108$auxiliary$zLjtpAHR
RskSystemProperties$MockitoMock$974318108$auxiliary$ZxYEwVdp
Total 13.2% (7/53) 12.4% (14/113)


1 /* 2  * This file is part of RskJ 3  * Copyright (C) 2017 RSK Labs Ltd. 4  * 5  * This program is free software: you can redistribute it and/or modify 6  * it under the terms of the GNU Lesser General Public License as published by 7  * the Free Software Foundation, either version 3 of the License, or 8  * (at your option) any later version. 9  * 10  * This program is distributed in the hope that it will be useful, 11  * but WITHOUT ANY WARRANTY; without even the implied warranty of 12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13  * GNU Lesser General Public License for more details. 14  * 15  * You should have received a copy of the GNU Lesser General Public License 16  * along with this program. If not, see <http://www.gnu.org/licenses/>. 17  */ 18  19 package co.rsk.config; 20  21 import co.rsk.core.RskAddress; 22 import co.rsk.rpc.ModuleDescription; 23 import com.typesafe.config.Config; 24 import com.typesafe.config.ConfigObject; 25 import org.ethereum.config.Constants; 26 import org.ethereum.config.SystemProperties; 27 import org.ethereum.core.Account; 28 import org.ethereum.crypto.ECKey; 29 import org.ethereum.crypto.HashUtil; 30  31 import javax.annotation.Nullable; 32 import java.nio.charset.StandardCharsets; 33 import java.time.Duration; 34 import java.util.ArrayList; 35 import java.util.Collections; 36 import java.util.List; 37  38 /** 39  * Created by ajlopez on 3/3/2016. 40  */ 41 public class RskSystemProperties extends SystemProperties { 42  /** while timeout period is lower than clean period it doesn't affect much since 43  requests will be checked after a clean period. 44  **/ 45  private static final int PD_DEFAULT_CLEAN_PERIOD = 15000; //miliseconds 46  private static final int PD_DEFAULT_TIMEOUT_MESSAGE = PD_DEFAULT_CLEAN_PERIOD - 1; //miliseconds 47  private static final int PD_DEFAULT_REFRESH_PERIOD = 60000; //miliseconds 48  49  private static final String REGTEST_BLOCKCHAIN_CONFIG = "regtest"; 50  51  private static final String MINER_REWARD_ADDRESS_CONFIG = "miner.reward.address"; 52  private static final String MINER_COINBASE_SECRET_CONFIG = "miner.coinbase.secret"; 53  private static final int CHUNK_SIZE = 192; 54  55  //TODO: REMOVE THIS WHEN THE LocalBLockTests starts working with REMASC 56  private boolean remascEnabled = true; 57  58  private List<ModuleDescription> moduleDescriptions; 59  60  public RskSystemProperties(ConfigLoader loader) { 61  super(loader); 62  } 63  64  @Nullable 65  public RskAddress coinbaseAddress() { 66  if (!isMinerServerEnabled()) { 67  //todo(diegoll): we should carefully handle the case when you don't have a coinbase and want to execute pending blocks 68  return new RskAddress(new byte[20]); 69  } 70  71  // validity checks are performed by localCoinbaseAccount 72  Account account = localCoinbaseAccount(); 73  if (account != null) { 74  return account.getAddress(); 75  } 76  77  String coinbaseAddress = configFromFiles.getString(MINER_REWARD_ADDRESS_CONFIG); 78  if (coinbaseAddress.length() != Constants.getMaxAddressByteLength() * 2) { 79  throw new RskConfigurationException(MINER_REWARD_ADDRESS_CONFIG + " needs to be Hex encoded and 20 byte length"); 80  } 81  82  return new RskAddress(coinbaseAddress); 83  } 84  85  @Nullable 86  public Account localCoinbaseAccount() { 87  if (!isMinerServerEnabled()) { 88  return null; 89  } 90  91  // Regtest always has MINER_COINBASE_SECRET_CONFIG set in regtest.conf file. When MINER_REWARD_ADDRESS_CONFIG is set both values exist 92  // and that does not pass the checks below. If MINER_REWARD_ADDRESS_CONFIG exists, that value must be used so consider that 93  // special regtest case by adding this guard. 94  if(configFromFiles.getString(PROPERTY_BC_CONFIG_NAME).equals(REGTEST_BLOCKCHAIN_CONFIG) && 95  configFromFiles.hasPath(MINER_REWARD_ADDRESS_CONFIG)) { 96  return null; 97  } 98  99  if (configFromFiles.hasPath(MINER_COINBASE_SECRET_CONFIG) && 100  configFromFiles.hasPath(MINER_REWARD_ADDRESS_CONFIG)) { 101  throw new RskConfigurationException("It is required to have only one of " + MINER_REWARD_ADDRESS_CONFIG + " or " + MINER_COINBASE_SECRET_CONFIG); 102  } 103  104  if (!configFromFiles.hasPath(MINER_COINBASE_SECRET_CONFIG) && 105  !configFromFiles.hasPath(MINER_REWARD_ADDRESS_CONFIG)) { 106  throw new RskConfigurationException("It is required to either have " + MINER_REWARD_ADDRESS_CONFIG + " or " + MINER_COINBASE_SECRET_CONFIG + " to use the miner server"); 107  } 108  109  if (!configFromFiles.hasPath(MINER_COINBASE_SECRET_CONFIG)) { 110  return null; 111  } 112  113  String coinbaseSecret = configFromFiles.getString(MINER_COINBASE_SECRET_CONFIG); 114  return new Account(ECKey.fromPrivate(HashUtil.keccak256(coinbaseSecret.getBytes(StandardCharsets.UTF_8)))); 115  } 116  117  public boolean isMinerClientEnabled() { 118  return configFromFiles.getBoolean("miner.client.enabled"); 119  } 120  121  public Duration minerClientDelayBetweenBlocks() { 122  return configFromFiles.getDuration("miner.client.delayBetweenBlocks"); 123  } 124  125  public Duration minerClientDelayBetweenRefreshes() { 126  return configFromFiles.getDuration("miner.client.delayBetweenRefreshes"); 127  } 128  129  public boolean minerClientAutoMine() { 130  return configFromFiles.getBoolean("miner.client.autoMine"); 131  } 132  133  public boolean isMinerServerEnabled() { 134  return configFromFiles.getBoolean("miner.server.enabled"); 135  } 136  137  public boolean isMinerServerFixedClock() { 138  return configFromFiles.getBoolean("miner.server.isFixedClock"); 139  } 140  141  public long minerMinGasPrice() { 142  return configFromFiles.getLong("miner.minGasPrice"); 143  } 144  145  public double minerGasUnitInDollars() { 146  return getDouble("miner.gasUnitInDollars", 0); 147  } 148  149  public double minerMinFeesNotifyInDollars() { 150  return getDouble("miner.minFeesNotifyInDollars", 0); 151  } 152  153  public boolean bloomServiceEnabled() { 154  return getBoolean("bloom.service", false); 155  } 156  157  public int bloomNumberOfBlocks() { 158  return getInt("bloom.blocks", 64); 159  } 160  161  public int bloomNumberOfConfirmations() { 162  return getInt("bloom.confirmations", 400); 163  } 164  165  public boolean waitForSync() { 166  return getBoolean("sync.waitForSync", false); 167  } 168  169  public boolean isWalletEnabled() { 170  return getBoolean("wallet.enabled", false); 171  } 172  173  public List<WalletAccount> walletAccounts() { 174  if (!configFromFiles.hasPath("wallet.accounts")) { 175  return Collections.emptyList(); 176  } 177  178  List<WalletAccount> ret = new ArrayList<>(); 179  List<? extends ConfigObject> list = configFromFiles.getObjectList("wallet.accounts"); 180  181  for (ConfigObject configObject : list) { 182  WalletAccount acc = null; 183  if (configObject.get("privateKey") != null) { 184  acc = new WalletAccount(configObject.toConfig().getString("privateKey")); 185  } 186  187  if (acc != null) { 188  ret.add(acc); 189  } 190  } 191  192  return ret; 193  } 194  195  public GarbageCollectorConfig garbageCollectorConfig() { 196  return GarbageCollectorConfig.fromConfig(configFromFiles.getConfig("blockchain.gc")); 197  } 198  199  public int flushNumberOfBlocks() { 200  return configFromFiles.hasPath("blockchain.flushNumberOfBlocks") && configFromFiles.getInt("blockchain.flushNumberOfBlocks") > 0 ? 201  configFromFiles.getInt("blockchain.flushNumberOfBlocks") : 20; 202  } 203  204  public int soLingerTime() { 205  return configFromFiles.getInt("rpc.providers.web.http.linger_time"); 206  207  } 208  209  //TODO: REMOVE THIS WHEN THE LocalBLockTests starts working with REMASC 210  public boolean isRemascEnabled() { 211  return remascEnabled; 212  } 213  214  //TODO: REMOVE THIS WHEN THE LocalBLockTests starts working with REMASC 215  public void setRemascEnabled(boolean remascEnabled) { 216  this.remascEnabled = remascEnabled; 217  } 218  219  public long peerDiscoveryMessageTimeOut() { 220  return getLong("peer.discovery.msg.timeout", PD_DEFAULT_TIMEOUT_MESSAGE); 221  } 222  223  public long peerDiscoveryRefreshPeriod() { 224  long period = getLong("peer.discovery.refresh.period", PD_DEFAULT_REFRESH_PERIOD); 225  226  return (period < PD_DEFAULT_REFRESH_PERIOD)? PD_DEFAULT_REFRESH_PERIOD : period; 227  } 228  229  public List<ModuleDescription> getRpcModules() { 230  if (this.moduleDescriptions != null) { 231  return this.moduleDescriptions; 232  } 233  234  List<ModuleDescription> modules = new ArrayList<>(); 235  236  if (!configFromFiles.hasPath("rpc.modules")) { 237  return modules; 238  } 239  240  List<? extends ConfigObject> list = configFromFiles.getObjectList("rpc.modules"); 241  242  for (ConfigObject configObject : list) { 243  Config configElement = configObject.toConfig(); 244  String name = configElement.getString("name"); 245  String version = configElement.getString("version"); 246  boolean enabled = configElement.getBoolean("enabled"); 247  List<String> enabledMethods = null; 248  List<String> disabledMethods = null; 249  250  if (configElement.hasPath("methods.enabled")) { 251  enabledMethods = configElement.getStringList("methods.enabled"); 252  } 253  254  if (configElement.hasPath("methods.disabled")) { 255  disabledMethods = configElement.getStringList("methods.disabled"); 256  } 257  258  modules.add(new ModuleDescription(name, version, enabled, enabledMethods, disabledMethods)); 259  } 260  261  this.moduleDescriptions = modules; 262  263  return modules; 264  } 265  266  public boolean hasMessageRecorderEnabled() { 267  return getBoolean("messages.recorder.enabled",false); 268  } 269  270  public List<String> getMessageRecorderCommands() { 271  if (!configFromFiles.hasPath("messages.recorder.commands")) { 272  return new ArrayList<>(); 273  } 274  275  return configFromFiles.getStringList("messages.recorder.commands"); 276  } 277  278  public long getTargetGasLimit() { 279  return getLong("targetgaslimit",6_800_000L); 280  } 281  282  public boolean getForceTargetGasLimit() { 283  return getBoolean("forcegaslimit", true); 284  } 285  286  // Sync config properties 287  288  public boolean getIsHeartBeatEnabled() { 289  return getBoolean("sync.heartBeat.enabled", false); 290  } 291  292  public int getExpectedPeers() { 293  return configFromFiles.getInt("sync.expectedPeers"); 294  } 295  296  public int getTimeoutWaitingPeers() { 297  return configFromFiles.getInt("sync.timeoutWaitingPeers"); 298  } 299  300  public int getTimeoutWaitingRequest() { 301  return configFromFiles.getInt("sync.timeoutWaitingRequest"); 302  } 303  304  public int getExpirationTimePeerStatus() { 305  return configFromFiles.getInt("sync.expirationTimePeerStatus"); 306  } 307  308  public int getMaxSkeletonChunks() { 309  return configFromFiles.getInt("sync.maxSkeletonChunks"); 310  } 311  312  public int getMaxRequestedBodies() { 313  return configFromFiles.getInt("sync.maxRequestedBodies"); 314  } 315  316  public int getLongSyncLimit() { 317  return configFromFiles.getInt("sync.longSyncLimit"); 318  } 319  320  // its fixed, cannot be set by config file 321  public int getChunkSize() { 322  return CHUNK_SIZE; 323  } 324  325  public VmConfig getVmConfig() { 326  return new VmConfig(vmTrace(), vmTraceOptions(), vmTraceInitStorageLimit(), dumpBlock(), dumpStyle(), getNetworkConstants().getChainId()); 327  } 328  329  public long peerDiscoveryCleanPeriod() { 330  return PD_DEFAULT_CLEAN_PERIOD; 331  } 332  333  public int getPeerP2PPingInterval(){ 334  return configFromFiles.getInt("peer.p2p.pingInterval"); 335  } 336  337  public Integer getGasPriceBump() { 338  return configFromFiles.getInt("transaction.gasPriceBump"); 339  } 340  341  public Integer getNumOfAccountSlots() { 342  return configFromFiles.getInt("transaction.accountSlots"); 343  } 344  345  public int getStatesCacheSize() { 346  return configFromFiles.getInt("cache.states.max-elements"); 347  } 348  349  public int getReceiptsCacheSize() { 350  return configFromFiles.getInt("cache.receipts.max-elements"); 351  } 352  353  public int getBtcBlockStoreCacheSize() { 354  return configFromFiles.getInt("cache.btcBlockStore.size"); 355  } 356  357  public int getBtcBlockStoreCacheDepth() { 358  return configFromFiles.getInt("cache.btcBlockStore.depth"); 359  } 360  361  public long getVmExecutionStackSize() { 362  return configFromFiles.getBytes("vm.executionStackSize"); 363  } 364  365  public String cryptoLibrary() { 366  return configFromFiles.getString("crypto.library"); 367  } 368  369  public boolean isPeerScoringStatsReportEnabled() { 370  return configFromFiles.getBoolean("scoring.summary.enabled"); 371  } 372  373  public long getPeerScoringSummaryTime() { 374  return configFromFiles.getLong("scoring.summary.time"); 375  } 376  377  public boolean fastBlockPropagation() { 378  return configFromFiles.getBoolean("peer.fastBlockPropagation"); 379  } 380 }