From 2897ec6d028a0aa0aaaa8db6d077b97fdb6b44dc Mon Sep 17 00:00:00 2001 From: Chi Nul Date: Thu, 16 Aug 2018 18:19:29 +0200 Subject: [PATCH] Move GenesisTxParser.findGenesisTx() into TxParser The GenesisTxParser class was unused except for the one static method findGenesisTx. Move that method into TxParser and remove GenesisTxParser. --- .../core/dao/node/parser/GenesisTxParser.java | 61 ------------------- .../bisq/core/dao/node/parser/TxParser.java | 30 ++++++++- .../core/dao/node/full/BlockParserTest.java | 3 - ...sisTxParserTest.java => TxParserTest.java} | 12 ++-- 4 files changed, 35 insertions(+), 71 deletions(-) delete mode 100644 src/main/java/bisq/core/dao/node/parser/GenesisTxParser.java rename src/test/java/bisq/core/dao/node/parser/{GenesisTxParserTest.java => TxParserTest.java} (91%) diff --git a/src/main/java/bisq/core/dao/node/parser/GenesisTxParser.java b/src/main/java/bisq/core/dao/node/parser/GenesisTxParser.java deleted file mode 100644 index a87a52d5..00000000 --- a/src/main/java/bisq/core/dao/node/parser/GenesisTxParser.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is part of Bisq. - * - * bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with bisq. If not, see . - */ - -package bisq.core.dao.node.parser; - -import bisq.core.dao.node.parser.exceptions.InvalidGenesisTxException; -import bisq.core.dao.state.blockchain.RawTx; -import bisq.core.dao.state.blockchain.TempTx; -import bisq.core.dao.state.blockchain.TempTxOutput; -import bisq.core.dao.state.blockchain.TxOutputType; -import bisq.core.dao.state.blockchain.TxType; - -import org.bitcoinj.core.Coin; - -import java.util.Optional; - -/** - * Verifies if a given transaction is a BSQ genesis transaction. - */ -public class GenesisTxParser { - public static Optional findGenesisTx(String genesisTxId, int genesisBlockHeight, Coin genesisTotalSupply, RawTx rawTx) { - boolean isGenesis = rawTx.getBlockHeight() == genesisBlockHeight && - rawTx.getId().equals(genesisTxId); - if (!isGenesis) - return Optional.empty(); - - TempTx tempTx = TempTx.fromRawTx(rawTx); - tempTx.setTxType(TxType.GENESIS); - long remainingInputValue = genesisTotalSupply.getValue(); - for (int i = 0; i < tempTx.getTempTxOutputs().size(); ++i) { - TempTxOutput txOutput = tempTx.getTempTxOutputs().get(i); - long value = txOutput.getValue(); - boolean isValid = value <= remainingInputValue; - if (!isValid) - throw new InvalidGenesisTxException("Genesis tx is invalid; using more than available inputs. " + - "Remaining input value is " + remainingInputValue + " sat; tx info: " + tempTx.toString()); - - remainingInputValue -= value; - txOutput.setTxOutputType(TxOutputType.GENESIS_OUTPUT); - } - if (remainingInputValue > 0) { - throw new InvalidGenesisTxException("Genesis tx is invalid; not using all available inputs. " + - "Remaining input value is " + remainingInputValue + " sat, tx info: " + tempTx.toString()); - } - return Optional.of(tempTx); - } -} diff --git a/src/main/java/bisq/core/dao/node/parser/TxParser.java b/src/main/java/bisq/core/dao/node/parser/TxParser.java index c490c149..d2ae4135 100644 --- a/src/main/java/bisq/core/dao/node/parser/TxParser.java +++ b/src/main/java/bisq/core/dao/node/parser/TxParser.java @@ -17,6 +17,7 @@ package bisq.core.dao.node.parser; +import bisq.core.dao.node.parser.exceptions.InvalidGenesisTxException; import bisq.core.dao.state.blockchain.OpReturnType; import bisq.core.dao.state.blockchain.RawTx; import bisq.core.dao.state.blockchain.TempTx; @@ -65,7 +66,7 @@ public TxParser(TxInputParser txInputParser, // for instance to calculate the total burned BSQ. public Optional findTx(RawTx rawTx, String genesisTxId, int genesisBlockHeight, Coin genesisTotalSupply) { // Let's see if we have a genesis tx - Optional optionalGenesisTx = GenesisTxParser.findGenesisTx( + Optional optionalGenesisTx = TxParser.findGenesisTx( genesisTxId, genesisBlockHeight, genesisTotalSupply, @@ -234,4 +235,31 @@ static private Optional getOptionalOpReturnType(TempTx tx, Parsing } return Optional.empty(); } + + public static Optional findGenesisTx(String genesisTxId, int genesisBlockHeight, Coin genesisTotalSupply, RawTx rawTx) { + boolean isGenesis = rawTx.getBlockHeight() == genesisBlockHeight && + rawTx.getId().equals(genesisTxId); + if (!isGenesis) + return Optional.empty(); + + TempTx tempTx = TempTx.fromRawTx(rawTx); + tempTx.setTxType(TxType.GENESIS); + long remainingInputValue = genesisTotalSupply.getValue(); + for (int i = 0; i < tempTx.getTempTxOutputs().size(); ++i) { + TempTxOutput txOutput = tempTx.getTempTxOutputs().get(i); + long value = txOutput.getValue(); + boolean isValid = value <= remainingInputValue; + if (!isValid) + throw new InvalidGenesisTxException("Genesis tx is invalid; using more than available inputs. " + + "Remaining input value is " + remainingInputValue + " sat; tx info: " + tempTx.toString()); + + remainingInputValue -= value; + txOutput.setTxOutputType(TxOutputType.GENESIS_OUTPUT); + } + if (remainingInputValue > 0) { + throw new InvalidGenesisTxException("Genesis tx is invalid; not using all available inputs. " + + "Remaining input value is " + remainingInputValue + " sat, tx info: " + tempTx.toString()); + } + return Optional.of(tempTx); + } } diff --git a/src/test/java/bisq/core/dao/node/full/BlockParserTest.java b/src/test/java/bisq/core/dao/node/full/BlockParserTest.java index 23120cff..6c2b9f8c 100644 --- a/src/test/java/bisq/core/dao/node/full/BlockParserTest.java +++ b/src/test/java/bisq/core/dao/node/full/BlockParserTest.java @@ -18,7 +18,6 @@ package bisq.core.dao.node.full; import bisq.core.dao.node.parser.BlockParser; -import bisq.core.dao.node.parser.GenesisTxParser; import bisq.core.dao.node.parser.TxParser; import bisq.core.dao.node.parser.exceptions.BlockNotConnectingException; import bisq.core.dao.state.BsqStateService; @@ -93,8 +92,6 @@ public class BlockParserTest { @Tested(fullyInitialized = true, availableDuringSetup = true) BsqStateService writeModel; @Tested(fullyInitialized = true, availableDuringSetup = true) - GenesisTxParser genesisTxParser; - @Tested(fullyInitialized = true, availableDuringSetup = true) TxParser txParser; //FIXME diff --git a/src/test/java/bisq/core/dao/node/parser/GenesisTxParserTest.java b/src/test/java/bisq/core/dao/node/parser/TxParserTest.java similarity index 91% rename from src/test/java/bisq/core/dao/node/parser/GenesisTxParserTest.java rename to src/test/java/bisq/core/dao/node/parser/TxParserTest.java index 3c450dc6..f2db9f7e 100644 --- a/src/test/java/bisq/core/dao/node/parser/GenesisTxParserTest.java +++ b/src/test/java/bisq/core/dao/node/parser/TxParserTest.java @@ -37,7 +37,7 @@ import org.junit.Assert; import org.junit.Test; -public class GenesisTxParserTest { +public class TxParserTest { @Test public void testGetGenesisTx() { @@ -71,7 +71,7 @@ public void testGetGenesisTx() { int genesisBlockHeight = 150; // With mismatch in block height and tx id, we should not get genesis tx back. - Optional result = GenesisTxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); + Optional result = TxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); Optional want = Optional.empty(); Assert.assertEquals(want, result); @@ -85,7 +85,7 @@ public void testGetGenesisTx() { ImmutableList.copyOf(inputs), ImmutableList.copyOf(Arrays.asList(output)) ); - result = GenesisTxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); + result = TxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); want = Optional.empty(); Assert.assertEquals(want, result); @@ -98,7 +98,7 @@ public void testGetGenesisTx() { ImmutableList.copyOf(inputs), ImmutableList.copyOf(Arrays.asList(output)) ); - result = GenesisTxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); + result = TxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); TempTx tempTx = TempTx.fromRawTx(rawTx); tempTx.setTxType(TxType.GENESIS); @@ -129,7 +129,7 @@ public void testGetGenesisTx() { ImmutableList.copyOf(Arrays.asList(output)) ); try { - result = GenesisTxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); + result = TxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); Assert.fail("Expected an InvalidGenesisTxException to be thrown when outputs are too low"); } catch (InvalidGenesisTxException igtxe) { String wantMessage = "Genesis tx is invalid; not using all available inputs. Remaining input value is 1 sat"; @@ -166,7 +166,7 @@ public void testGetGenesisTx() { ImmutableList.copyOf(Arrays.asList(output1, output2)) ); try { - result = GenesisTxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); + result = TxParser.findGenesisTx(genesisTxId, genesisBlockHeight, genesisTotalSupply, rawTx); Assert.fail("Expected an InvalidGenesisTxException to be thrown when outputs are too high"); } catch (InvalidGenesisTxException igtxe) { String wantMessage = "Genesis tx is invalid; using more than available inputs. Remaining input value is 2 sat";