Coverage Summary for Class: AutoMinerClient (co.rsk.mine)

Class Class, % Method, % Line, %
AutoMinerClient 0% (0/1) 0% (0/7) 0% (0/28)


1 /* 2  * This file is part of RskJ 3  * Copyright (C) 2018 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.mine; 20  21 import co.rsk.bitcoinj.core.BtcBlock; 22 import org.ethereum.rpc.TypeConverter; 23 import org.slf4j.Logger; 24 import org.slf4j.LoggerFactory; 25  26 import java.math.BigInteger; 27  28 /** 29  * MinerClient for automine setting 30  */ 31 public class AutoMinerClient implements MinerClient { 32  private static final Logger logger = LoggerFactory.getLogger("minerClient"); 33  34  private final MinerServer minerServer; 35  36  private volatile boolean stop = false; 37  private volatile boolean isMining = false; 38  39  public AutoMinerClient(MinerServer minerServer) { 40  this.minerServer = minerServer; 41  } 42  43  @Override 44  public void start() { 45  isMining = true; 46  } 47  48  @Override 49  public boolean isMining() { 50  return this.isMining; 51  } 52  53  @Override 54  public boolean mineBlock() { 55  // if miner server was stopped for some reason, we don't mine. 56  if (stop) { 57  return false; 58  } 59  60  MinerWork work = minerServer.getWork(); 61  62  co.rsk.bitcoinj.core.NetworkParameters bitcoinNetworkParameters = co.rsk.bitcoinj.params.RegTestParams.get(); 63  co.rsk.bitcoinj.core.BtcTransaction bitcoinMergedMiningCoinbaseTransaction = MinerUtils.getBitcoinMergedMiningCoinbaseTransaction(bitcoinNetworkParameters, work); 64  co.rsk.bitcoinj.core.BtcBlock bitcoinMergedMiningBlock = MinerUtils.getBitcoinMergedMiningBlock(bitcoinNetworkParameters, bitcoinMergedMiningCoinbaseTransaction); 65  66  BigInteger target = new BigInteger(1, TypeConverter.stringHexToByteArray(work.getTarget())); 67  findNonce(bitcoinMergedMiningBlock, target); 68  69  logger.info("Mined block: {}", work.getBlockHashForMergedMining()); 70  minerServer.submitBitcoinBlock(work.getBlockHashForMergedMining(), bitcoinMergedMiningBlock); 71  72  return true; 73  } 74  75  @Override 76  public void stop() { 77  stop = true; 78  isMining = false; 79  } 80  81  /** 82  * Find a valid nonce for bitcoinMergedMiningBlock, that satisfies the given target difficulty. 83  */ 84  private void findNonce( 85  BtcBlock bitcoinMergedMiningBlock, 86  BigInteger target) { 87  long nextNonceToUse = 0; 88  bitcoinMergedMiningBlock.setNonce(nextNonceToUse++); 89  90  while (true) { 91  // Is our proof of work valid yet? 92  BigInteger blockHashBI = bitcoinMergedMiningBlock.getHash().toBigInteger(); 93  if (blockHashBI.compareTo(target) <= 0) { 94  return; 95  } 96  // No, so increment the nonce and try again. 97  bitcoinMergedMiningBlock.setNonce(nextNonceToUse++); 98  if (bitcoinMergedMiningBlock.getNonce() % 100000 == 0) { 99  logger.debug("Solving block. Nonce: {}", bitcoinMergedMiningBlock.getNonce()); 100  } 101  } 102  } 103 }