From 573d6f6edf689c461ef400607a550c3bf5a941cf Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Mon, 1 Jun 2015 22:54:54 +0100 Subject: [PATCH] Add AuxPoW chain ID checks. --- .../params/DogecoinMainNetParams.java | 5 +++ .../params/DogecoinTestNet3Params.java | 5 +++ .../java/org/bitcoinj/core/AltcoinBlock.java | 4 ++- .../core/AltcoinNetworkParameters.java | 2 ++ src/main/java/org/bitcoinj/core/AuxPoW.java | 31 ++++++++++++++----- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/altcoinj/params/DogecoinMainNetParams.java b/src/main/java/org/altcoinj/params/DogecoinMainNetParams.java index 28e99fa6..843cfd85 100644 --- a/src/main/java/org/altcoinj/params/DogecoinMainNetParams.java +++ b/src/main/java/org/altcoinj/params/DogecoinMainNetParams.java @@ -93,4 +93,9 @@ public class DogecoinMainNetParams extends AbstractDogecoinParams { // TODO: CHANGE THIS return ID_DOGE_MAINNET; } + + @Override + public boolean isTestNet() { + return false; + } } diff --git a/src/main/java/org/altcoinj/params/DogecoinTestNet3Params.java b/src/main/java/org/altcoinj/params/DogecoinTestNet3Params.java index 6b654a19..c9643fa3 100644 --- a/src/main/java/org/altcoinj/params/DogecoinTestNet3Params.java +++ b/src/main/java/org/altcoinj/params/DogecoinTestNet3Params.java @@ -71,4 +71,9 @@ public class DogecoinTestNet3Params extends AbstractDogecoinParams { // TODO: CHANGE ME return PAYMENT_PROTOCOL_ID_TESTNET; } + + @Override + public boolean isTestNet() { + return true; + } } diff --git a/src/main/java/org/bitcoinj/core/AltcoinBlock.java b/src/main/java/org/bitcoinj/core/AltcoinBlock.java index 262c304a..b981b1cb 100644 --- a/src/main/java/org/bitcoinj/core/AltcoinBlock.java +++ b/src/main/java/org/bitcoinj/core/AltcoinBlock.java @@ -44,7 +44,9 @@ import static org.bitcoinj.core.Utils.reverseBytes; */ public class AltcoinBlock extends org.bitcoinj.core.Block { /** Bit used to indicate that a block contains an AuxPoW section, where the network supports AuxPoW */ - public static final int BLOCK_FLAG_AUXPOW = (1 << 8); + public static final int BLOCK_VERSION_CHAIN_START = (1 << 16); + public static final int BLOCK_VERSION_CHAIN_END = (1 << 30); + public static final int BLOCK_VERSION_AUXPOW = (1 << 8); private boolean auxpowParsed = false; private boolean auxpowBytesValid = false; diff --git a/src/main/java/org/bitcoinj/core/AltcoinNetworkParameters.java b/src/main/java/org/bitcoinj/core/AltcoinNetworkParameters.java index 4a67f933..e0de2631 100644 --- a/src/main/java/org/bitcoinj/core/AltcoinNetworkParameters.java +++ b/src/main/java/org/bitcoinj/core/AltcoinNetworkParameters.java @@ -31,4 +31,6 @@ public interface AltcoinNetworkParameters { * SHA256 twice (Bitcoin standard) for proof of work. */ Sha256Hash getBlockDifficultyHash(Block block); + + public boolean isTestNet(); } diff --git a/src/main/java/org/bitcoinj/core/AuxPoW.java b/src/main/java/org/bitcoinj/core/AuxPoW.java index 6085c920..2f01f2c1 100644 --- a/src/main/java/org/bitcoinj/core/AuxPoW.java +++ b/src/main/java/org/bitcoinj/core/AuxPoW.java @@ -190,9 +190,9 @@ public class AuxPoW extends ChildMessage implements Serializable { AuxPoW input = (AuxPoW) o; if (!transaction.equals(input.transaction)) return false; if (!hashBlock.equals(input.hashBlock)) return false; - if (!coinbaseBranch.equals(input.hashBlock)) return false; - if (!chainMerkleBranch.equals(input.hashBlock)) return false; - if (!parentBlockHeader.equals(input.hashBlock)) return false; + if (!coinbaseBranch.equals(input.coinbaseBranch)) return false; + if (!chainMerkleBranch.equals(input.chainMerkleBranch)) return false; + if (!parentBlockHeader.equals(input.parentBlockHeader)) return false; return getHash().equals(input.getHash()); } @@ -280,6 +280,15 @@ public class AuxPoW extends ChildMessage implements Serializable { */ protected boolean checkProofOfWork(Sha256Hash hashAuxBlock, BigInteger target, boolean throwException) throws VerificationException { + if (!(params instanceof AltcoinNetworkParameters)) { + if (throwException) { + // Should be impossible + throw new VerificationException("Network parameters are not an instance of AltcoinNetworkParameters, AuxPoW support is not available."); + } + return false; + } + final AltcoinNetworkParameters altcoinParams = (AltcoinNetworkParameters) params; + if (0 != this.getCoinbaseBranch().getIndex()) { if (throwException) { // I don't like the message, but it correlates with what's in the reference client. @@ -288,13 +297,13 @@ public class AuxPoW extends ChildMessage implements Serializable { return false; } - /* if (!TestNet() - parentBlockHeader.getChainID() == ((AuxPoWNetworkParameters) params).getChainID()) { + if (!altcoinParams.isTestNet() + && getChainID(parentBlockHeader) == altcoinParams.getChainID()) { if (throwException) { throw new VerificationException("Aux POW parent has our chain ID"); } return false; - } */ + } if (this.getChainMerkleBranch().size() > 30) { if (throwException) { @@ -401,8 +410,7 @@ public class AuxPoW extends ChildMessage implements Serializable { return false; } - BigInteger h = ((AltcoinNetworkParameters) params) - .getBlockDifficultyHash(getParentBlockHeader()) + BigInteger h = altcoinParams.getBlockDifficultyHash(getParentBlockHeader()) .toBigInteger(); if (h.compareTo(target) > 0) { // Proof of work check failed! @@ -436,4 +444,11 @@ public class AuxPoW extends ChildMessage implements Serializable { } return true; } + + /** + * Get the chain ID from a block header. + */ + protected long getChainID(final Block blockHeader) { + return blockHeader.getVersion() / AltcoinBlock.BLOCK_VERSION_CHAIN_START; + } }