Coverage Summary for Class: NetworkStateExporter (co.rsk.core)

Class Class, % Method, % Line, %
NetworkStateExporter 0% (0/1) 0% (0/5) 0% (0/41)


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.core; 20  21 import co.rsk.core.bc.AccountInformationProvider; 22 import co.rsk.db.RepositoryLocator; 23 import co.rsk.db.RepositorySnapshot; 24 import co.rsk.panic.PanicProcessor; 25 import com.fasterxml.jackson.databind.ObjectMapper; 26 import com.fasterxml.jackson.databind.ObjectWriter; 27 import com.fasterxml.jackson.databind.node.JsonNodeFactory; 28 import com.fasterxml.jackson.databind.node.ObjectNode; 29 import org.ethereum.core.Blockchain; 30 import org.ethereum.util.ByteUtil; 31 import org.ethereum.vm.DataWord; 32 import org.ethereum.vm.PrecompiledContracts; 33 import org.slf4j.Logger; 34 import org.slf4j.LoggerFactory; 35  36 import java.io.BufferedWriter; 37 import java.io.File; 38 import java.io.FileWriter; 39 import java.io.IOException; 40 import java.math.BigInteger; 41 import java.util.Iterator; 42  43 /** 44  * Created by mario on 13/01/17. 45  */ 46 public class NetworkStateExporter { 47  private static final Logger logger = LoggerFactory.getLogger(NetworkStateExporter.class); 48  49  private final RepositoryLocator repositoryLocator; 50  private final Blockchain blockchain; 51  52  private static final PanicProcessor panicProcessor = new PanicProcessor(); 53  54  public NetworkStateExporter(RepositoryLocator repositoryLocator, Blockchain blockchain) { 55  this.repositoryLocator = repositoryLocator; 56  this.blockchain = blockchain; 57  } 58  59  public boolean exportStatus(String outputFile) { 60  RepositorySnapshot frozenRepository = repositoryLocator.snapshotAt(blockchain.getBestBlock().getHeader()); 61  62  File dumpFile = new File(outputFile); 63  64  try(FileWriter fw = new FileWriter(dumpFile.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw)) { 65  JsonNodeFactory jsonFactory = new JsonNodeFactory(false); 66  ObjectNode mainNode = jsonFactory.objectNode(); 67  for (RskAddress addr : frozenRepository.getAccountsKeys()) { 68  if(!addr.equals(RskAddress.nullAddress())) { 69  mainNode.set(addr.toString(), createAccountNode(mainNode, addr, frozenRepository)); 70  } 71  } 72  ObjectMapper mapper = new ObjectMapper(); 73  ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter(); 74  bw.write(writer.writeValueAsString(mainNode)); 75  return true; 76  } catch (IOException e) { 77  logger.error(e.getMessage(), e); 78  panicProcessor.panic("dumpstate", e.getMessage()); 79  return false; 80  } 81  } 82  83  private ObjectNode createContractNode(ObjectNode accountNode, AccountInformationProvider accountInformation, RskAddress addr, Iterator<DataWord> contractKeys) { 84  ObjectNode contractNode = accountNode.objectNode(); 85  contractNode.put("code", ByteUtil.toHexString(accountInformation.getCode(addr))); 86  ObjectNode dataNode = contractNode.objectNode(); 87  while (contractKeys.hasNext()) { 88  DataWord key = contractKeys.next(); 89  byte[] value = accountInformation.getStorageBytes(addr, key); 90  dataNode.put(ByteUtil.toHexString(key.getData()), ByteUtil.toHexString(value)); 91  } 92  contractNode.set("data", dataNode); 93  return contractNode; 94  } 95  96  private ObjectNode createAccountNode(ObjectNode mainNode, RskAddress addr, AccountInformationProvider accountInformation) { 97  ObjectNode accountNode = mainNode.objectNode(); 98  Coin balance = accountInformation.getBalance(addr); 99  accountNode.put("balance", balance.asBigInteger().toString()); 100  BigInteger nonce = accountInformation.getNonce(addr); 101  accountNode.put("nonce", nonce.toString()); 102  Iterator<DataWord> contractKeys = accountInformation.getStorageKeys(addr); 103  if (contractKeys.hasNext() && !PrecompiledContracts.REMASC_ADDR.equals(addr)) { 104  accountNode.set("contract", createContractNode(accountNode, accountInformation, addr, contractKeys)); 105  } 106  return accountNode; 107  } 108 }