Skip to content

Commit

Permalink
Limit btc block header size to 80 bytes
Browse files Browse the repository at this point in the history
  • Loading branch information
josedahlquist committed May 30, 2019
1 parent 6f0228a commit 7db5a68
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 5 deletions.
2 changes: 1 addition & 1 deletion rskj-core/src/main/java/co/rsk/peg/Bridge.java
Expand Up @@ -407,7 +407,7 @@ public void receiveHeaders(Object[] args)
// Before going and actually deserializing and calling the underlying function,
// check that all block headers passed in are actually block headers doing
// a simple size check. If this check fails, just fail.
if (Arrays.stream(btcBlockSerializedArray).anyMatch(bytes -> !BtcTransactionFormatUtils.isBlockHeaderSize(((byte[])bytes).length))) {
if (Arrays.stream(btcBlockSerializedArray).anyMatch(bytes -> !BtcTransactionFormatUtils.isBlockHeaderSize(((byte[])bytes).length, activations))) {
// This exception type bypasses bridge teardown, signalling no work done
// and preventing the overhead of saving bridge storage
logger.warn("Unexpected BTC header(s) received (size mismatch). Aborting processing.");
Expand Down
Expand Up @@ -20,6 +20,8 @@

import co.rsk.bitcoinj.core.Sha256Hash;
import co.rsk.bitcoinj.core.VarInt;
import org.ethereum.config.blockchain.upgrades.ActivationConfig;
import org.ethereum.config.blockchain.upgrades.ConsensusRule;

public class BtcTransactionFormatUtils {
private static int MIN_BLOCK_HEADER_SIZE = 80;
Expand All @@ -34,7 +36,8 @@ public static long getInputsCount(byte[] btcTxSerialized) {
return inputsCounter.value;
}

public static boolean isBlockHeaderSize(int size) {
return size >= MIN_BLOCK_HEADER_SIZE && size <= MAX_BLOCK_HEADER_SIZE;
public static boolean isBlockHeaderSize(int size, ActivationConfig.ForBlock activations) {
return (activations.isActive(ConsensusRule.RSKIP124) && size == MIN_BLOCK_HEADER_SIZE) ||
(!activations.isActive(ConsensusRule.RSKIP124) && size >= MIN_BLOCK_HEADER_SIZE && size <= MAX_BLOCK_HEADER_SIZE);
}
}
5 changes: 3 additions & 2 deletions rskj-core/src/test/java/co/rsk/peg/BridgeTest.java
Expand Up @@ -282,7 +282,8 @@ public void sendOrphanBlockHeader() {
Bridge bridge = new Bridge(PrecompiledContracts.BRIDGE_ADDR, constants, activationConfig);
bridge.init(rskTx, getGenesisBlock(), track, null, null, null);

co.rsk.bitcoinj.core.BtcBlock block = new co.rsk.bitcoinj.core.BtcBlock(networkParameters, 1, PegTestUtils.createHash(), PegTestUtils.createHash(), 1, Utils.encodeCompactBits(networkParameters.getMaxTarget()), 1, new ArrayList<>());
co.rsk.bitcoinj.core.BtcBlock block = new co.rsk.bitcoinj.core.BtcBlock(networkParameters, 1, PegTestUtils.createHash(), PegTestUtils.createHash(), 1, Utils.encodeCompactBits(networkParameters.getMaxTarget()), 1, new ArrayList<>())
.cloneAsHeader();
co.rsk.bitcoinj.core.BtcBlock[] headers = new co.rsk.bitcoinj.core.BtcBlock[1];
headers[0] = block;

Expand Down Expand Up @@ -407,7 +408,7 @@ public void receiveHeadersWithCorrectSizeHeaders() throws Exception {
co.rsk.bitcoinj.core.BtcBlock[] headers = new co.rsk.bitcoinj.core.BtcBlock[numBlocks];

for (int i = 0; i < numBlocks; i++) {
co.rsk.bitcoinj.core.BtcBlock block = new co.rsk.bitcoinj.core.BtcBlock(networkParameters, 1, PegTestUtils.createHash(), PegTestUtils.createHash(), 1, Utils.encodeCompactBits(networkParameters.getMaxTarget()), 1, new ArrayList<>());
co.rsk.bitcoinj.core.BtcBlock block = new co.rsk.bitcoinj.core.BtcBlock(networkParameters, 1, PegTestUtils.createHash(), PegTestUtils.createHash(), 1, Utils.encodeCompactBits(networkParameters.getMaxTarget()), 1, new ArrayList<>()).cloneAsHeader();
headers[i] = block;
}

Expand Down

0 comments on commit 7db5a68

Please sign in to comment.