Coverage Summary for Class: BootstrapImporter (co.rsk.db.importer)
Class |
Class, %
|
Method, %
|
Line, %
|
BootstrapImporter |
0%
(0/1)
|
0%
(0/5)
|
0%
(0/37)
|
1 /*
2 * This file is part of RskJ
3 * Copyright (C) 2019 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.db.importer;
20
21 import co.rsk.core.BlockDifficulty;
22 import co.rsk.db.importer.provider.BootstrapDataProvider;
23 import co.rsk.trie.Trie;
24 import co.rsk.trie.TrieStore;
25 import co.rsk.trie.TrieStoreImpl;
26 import org.ethereum.core.Block;
27 import org.ethereum.core.BlockFactory;
28 import org.ethereum.crypto.Keccak256Helper;
29 import org.ethereum.datasource.HashMapDB;
30 import org.ethereum.db.BlockStore;
31 import org.ethereum.util.RLP;
32 import org.ethereum.util.RLPElement;
33 import org.ethereum.util.RLPList;
34
35 import java.math.BigInteger;
36 import java.util.ArrayList;
37 import java.util.List;
38
39 public class BootstrapImporter {
40
41 private final BootstrapDataProvider bootstrapDataProvider;
42 private final BlockStore blockStore;
43 private final TrieStore trieStore;
44 private final BlockFactory blockFactory;
45
46 public BootstrapImporter(
47 BlockStore blockStore,
48 TrieStore trieStore,
49 BlockFactory blockFactory, BootstrapDataProvider bootstrapDataProvider) {
50 this.blockStore = blockStore;
51 this.trieStore = trieStore;
52 this.blockFactory = blockFactory;
53 this.bootstrapDataProvider = bootstrapDataProvider;
54 }
55
56 public void importData() {
57 bootstrapDataProvider.retrieveData();
58 updateDatabase();
59 }
60
61 private void updateDatabase() {
62 byte[] encodedData = bootstrapDataProvider.getBootstrapData();
63 RLPList rlpElements = RLP.decodeList(encodedData);
64 insertBlocks(blockStore, blockFactory, rlpElements.get(0));
65 insertState(trieStore, rlpElements.get(1));
66 }
67
68 private static void insertState(TrieStore destinationTrieStore, RLPElement rlpElement) {
69 RLPList statesData = RLP.decodeList(rlpElement.getRLPData());
70 RLPList nodesData = RLP.decodeList(statesData.get(0).getRLPData());
71 RLPList valuesData = RLP.decodeList(statesData.get(1).getRLPData());
72 HashMapDB hashMapDB = new HashMapDB();
73 TrieStoreImpl fakeStore = new TrieStoreImpl(hashMapDB);
74
75 List<Trie> nodes = new ArrayList<>();
76
77 for (int k = 0; k < nodesData.size(); k++) {
78 RLPElement element = nodesData.get(k);
79 byte[] rlpData = element.getRLPData();
80 Trie trie = Trie.fromMessage(rlpData, fakeStore);
81 hashMapDB.put(trie.getHash().getBytes(), rlpData);
82 nodes.add(trie);
83 }
84
85 for (int k = 0; k < valuesData.size(); k++) {
86 RLPElement element = valuesData.get(k);
87 byte[] rlpData = element.getRLPData();
88 hashMapDB.put(Keccak256Helper.keccak256(rlpData), rlpData);
89 }
90
91 nodes.forEach(destinationTrieStore::save);
92 }
93
94 private static void insertBlocks(BlockStore blockStore,
95 BlockFactory blockFactory,
96 RLPElement encodedTuples) {
97 RLPList blocksData = RLP.decodeList(encodedTuples.getRLPData());
98
99 for (int k = 0; k < blocksData.size(); k++) {
100 RLPElement element = blocksData.get(k);
101 RLPList blockData = RLP.decodeList(element.getRLPData());
102 RLPList tuple = RLP.decodeList(blockData.getRLPData());
103 Block block = blockFactory.decodeBlock(tuple.get(0).getRLPData());
104 BlockDifficulty blockDifficulty = new BlockDifficulty(new BigInteger(tuple.get(1).getRLPData()));
105 blockStore.saveBlock(block, blockDifficulty, true);
106 }
107
108 blockStore.flush();
109 }
110 }