forked from Qortal/qortal
Added simplistic blockchain validation on startup
This commit is contained in:
parent
f167d0c831
commit
8b949dc1a1
@ -7,10 +7,10 @@ import java.io.Reader;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.MathContext;
|
import java.math.MathContext;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import javax.xml.bind.JAXBContext;
|
import javax.xml.bind.JAXBContext;
|
||||||
import javax.xml.bind.JAXBException;
|
import javax.xml.bind.JAXBException;
|
||||||
@ -27,9 +27,7 @@ import org.eclipse.persistence.exceptions.XMLMarshalException;
|
|||||||
import org.eclipse.persistence.jaxb.JAXBContextFactory;
|
import org.eclipse.persistence.jaxb.JAXBContextFactory;
|
||||||
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
|
import org.eclipse.persistence.jaxb.UnmarshallerProperties;
|
||||||
import org.qora.controller.Controller;
|
import org.qora.controller.Controller;
|
||||||
import org.qora.crypto.Crypto;
|
|
||||||
import org.qora.data.block.BlockData;
|
import org.qora.data.block.BlockData;
|
||||||
import org.qora.data.network.BlockSummaryData;
|
|
||||||
import org.qora.network.Network;
|
import org.qora.network.Network;
|
||||||
import org.qora.repository.BlockRepository;
|
import org.qora.repository.BlockRepository;
|
||||||
import org.qora.repository.DataException;
|
import org.qora.repository.DataException;
|
||||||
@ -316,6 +314,27 @@ public class BlockChain {
|
|||||||
// Check first block is Genesis Block
|
// Check first block is Genesis Block
|
||||||
if (!isGenesisBlockValid())
|
if (!isGenesisBlockValid())
|
||||||
rebuildBlockchain();
|
rebuildBlockchain();
|
||||||
|
|
||||||
|
// TODO: walk through blocks
|
||||||
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||||
|
Block parentBlock = GenesisBlock.getInstance(repository);
|
||||||
|
BlockData parentBlockData = parentBlock.getBlockData();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
BlockData childBlockData = parentBlock.getChild();
|
||||||
|
if (childBlockData == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!Arrays.equals(childBlockData.getReference(), parentBlock.getSignature())) {
|
||||||
|
LOGGER.error(String.format("Block %d's reference does not match block %d's signature", childBlockData.getHeight(), parentBlockData.getHeight()));
|
||||||
|
rebuildBlockchain();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
parentBlock = new Block(repository, childBlockData);
|
||||||
|
parentBlockData = childBlockData;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isGenesisBlockValid() throws DataException {
|
private static boolean isGenesisBlockValid() throws DataException {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user