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 }