Coverage Summary for Class: Web3RskImpl (co.rsk.rpc)
Class |
Class, %
|
Method, %
|
Line, %
|
Web3RskImpl |
100%
(1/1)
|
50%
(2/4)
|
14.3%
(5/35)
|
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.rpc;
20
21 import co.rsk.config.RskSystemProperties;
22 import co.rsk.core.NetworkStateExporter;
23 import co.rsk.logfilter.BlocksBloomStore;
24 import co.rsk.metrics.HashRateCalculator;
25 import co.rsk.mine.MinerClient;
26 import co.rsk.mine.MinerServer;
27 import co.rsk.net.BlockProcessor;
28 import co.rsk.rpc.modules.debug.DebugModule;
29 import co.rsk.rpc.modules.eth.EthModule;
30 import co.rsk.rpc.modules.evm.EvmModule;
31 import co.rsk.rpc.modules.mnr.MnrModule;
32 import co.rsk.rpc.modules.personal.PersonalModule;
33 import co.rsk.rpc.modules.rsk.RskModule;
34 import co.rsk.rpc.modules.trace.TraceModule;
35 import co.rsk.rpc.modules.txpool.TxPoolModule;
36 import co.rsk.scoring.PeerScoringManager;
37 import org.ethereum.core.Block;
38 import org.ethereum.core.BlockHeader;
39 import org.ethereum.core.Blockchain;
40 import org.ethereum.crypto.HashUtil;
41 import org.ethereum.db.BlockStore;
42 import org.ethereum.db.ReceiptStore;
43 import org.ethereum.facade.Ethereum;
44 import org.ethereum.net.client.ConfigCapabilities;
45 import org.ethereum.net.server.ChannelManager;
46 import org.ethereum.net.server.PeerServer;
47 import org.ethereum.rpc.Web3Impl;
48 import org.ethereum.util.BuildInfo;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52 import java.io.File;
53 import java.io.FileWriter;
54 import java.io.IOException;
55 import java.io.PrintWriter;
56 import java.util.LinkedList;
57 import java.util.List;
58
59 /**
60 * Handles requests for work and block submission.
61 * Full responsibility for processing the request is delegated to MinerServer.
62 *
63 * @author Adrian Eidelman
64 * @author Martin Medina
65 */
66 public class Web3RskImpl extends Web3Impl {
67 private static final Logger logger = LoggerFactory.getLogger("web3");
68 private final NetworkStateExporter networkStateExporter;
69 private final BlockStore blockStore;
70
71 public Web3RskImpl(
72 Ethereum eth,
73 Blockchain blockchain,
74 RskSystemProperties properties,
75 MinerClient minerClient,
76 MinerServer minerServer,
77 PersonalModule personalModule,
78 EthModule ethModule,
79 EvmModule evmModule,
80 TxPoolModule txPoolModule,
81 MnrModule mnrModule,
82 DebugModule debugModule,
83 TraceModule traceModule, RskModule rskModule,
84 ChannelManager channelManager,
85 PeerScoringManager peerScoringManager,
86 NetworkStateExporter networkStateExporter,
87 BlockStore blockStore,
88 ReceiptStore receiptStore,
89 PeerServer peerServer,
90 BlockProcessor nodeBlockProcessor,
91 HashRateCalculator hashRateCalculator,
92 ConfigCapabilities configCapabilities,
93 BuildInfo buildInfo,
94 BlocksBloomStore blocksBloomStore,
95 Web3InformationRetriever retriever) {
96 super(eth, blockchain, blockStore, receiptStore, properties, minerClient, minerServer,
97 personalModule, ethModule, evmModule, txPoolModule, mnrModule, debugModule, traceModule, rskModule,
98 channelManager, peerScoringManager, peerServer, nodeBlockProcessor,
99 hashRateCalculator, configCapabilities, buildInfo, blocksBloomStore, retriever);
100
101 this.networkStateExporter = networkStateExporter;
102 this.blockStore = blockStore;
103 }
104
105 public void ext_dumpState() {
106 Block bestBlcock = blockStore.getBestBlock();
107 logger.info("Dumping state for block hash {}, block number {}", bestBlcock.getHash(), bestBlcock.getNumber());
108 networkStateExporter.exportStatus(System.getProperty("user.dir") + "/" + "rskdump.json");
109 }
110
111 /**
112 * Export the blockchain tree as a tgf file to user.dir/rskblockchain.tgf
113 *
114 * @param numberOfBlocks Number of block heights to include. Eg if best block is block 2300 and numberOfBlocks is 10, the graph will include blocks in heights 2290 to 2300.
115 * @param includeUncles Whether to show uncle links (recommended value is false)
116 */
117 public void ext_dumpBlockchain(long numberOfBlocks, boolean includeUncles) {
118 Block bestBlock = blockStore.getBestBlock();
119 logger.info("Dumping blockchain starting on block number {}, to best block number {}", bestBlock.getNumber() - numberOfBlocks, bestBlock.getNumber());
120 File graphFile = new File(System.getProperty("user.dir") + "/" + "rskblockchain.tgf");
121 try (PrintWriter writer = new PrintWriter(new FileWriter(graphFile))) {
122
123 List<Block> result = new LinkedList<>();
124 long firstBlock = bestBlock.getNumber() - numberOfBlocks;
125 if (firstBlock < 0) {
126 firstBlock = 0;
127 }
128 for (long i = firstBlock; i < bestBlock.getNumber(); i++) {
129 result.addAll(blockStore.getChainBlocksByNumber(i));
130 }
131 for (Block block : result) {
132 writer.println(HashUtil.toPrintableHash(block.getHash().getBytes()) + " " + block.getNumber() + "-" + HashUtil.toPrintableHash(
133 block.getHash().getBytes()));
134 }
135 writer.println("#");
136 for (Block block : result) {
137 writer.println(HashUtil.toPrintableHash(block.getHash().getBytes()) + " " + HashUtil.toPrintableHash(block.getParentHash().getBytes()) + " P");
138 if (includeUncles) {
139 for (BlockHeader uncleHeader : block.getUncleList()) {
140 writer.println(HashUtil.toPrintableHash(block.getHash().getBytes()) + " " + HashUtil.toPrintableHash(uncleHeader.getHash().getBytes()) + " U");
141 }
142 }
143 }
144 } catch (IOException e) {
145 logger.error("Could nos save node graph to file", e);
146 }
147 }
148 }