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 }