Search in sources :

Example 1 with BridgeConstants

use of co.rsk.config.BridgeConstants in project rskj by rsksmart.

the class BridgeSupportTest method callUpdateCollectionsWithTransactionsWaitingForConfirmationWithEnoughConfirmations.

@Test
public void callUpdateCollectionsWithTransactionsWaitingForConfirmationWithEnoughConfirmations() throws IOException, BlockStoreException {
    // Bridge constants and btc context
    BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants();
    Context context = new Context(bridgeConstants.getBtcParams());
    // Fake wallet returned every time
    PowerMockito.mockStatic(BridgeUtils.class);
    PowerMockito.when(BridgeUtils.getFederationSpendWallet(any(Context.class), any(Federation.class), any(List.class))).thenReturn(new SimpleWallet(context));
    Repository repository = new RepositoryImpl(config);
    Repository track = repository.startTracking();
    BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants());
    BtcTransaction txs = new BtcTransaction(btcParams);
    txs.addOutput(Coin.FIFTY_COINS, new BtcECKey());
    BtcTransaction tx1 = new BtcTransaction(btcParams);
    tx1.addInput(txs.getOutput(0));
    tx1.getInput(0).disconnect();
    tx1.addOutput(Coin.COIN, new BtcECKey());
    BtcTransaction tx2 = new BtcTransaction(btcParams);
    tx2.addInput(txs.getOutput(0));
    tx2.getInput(0).disconnect();
    tx2.addOutput(Coin.COIN, new BtcECKey());
    BtcTransaction tx3 = new BtcTransaction(btcParams);
    tx3.addInput(txs.getOutput(0));
    tx3.getInput(0).disconnect();
    tx3.addOutput(Coin.COIN, new BtcECKey());
    provider0.getReleaseTransactionSet().add(tx1, 1L);
    provider0.getReleaseTransactionSet().add(tx2, 1L);
    provider0.getReleaseTransactionSet().add(tx3, 1L);
    provider0.save();
    track.commit();
    track = repository.startTracking();
    BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants());
    BlockGenerator blockGenerator = new BlockGenerator();
    List<Block> blocks = blockGenerator.getSimpleBlockChain(blockGenerator.getGenesisBlock(), 10);
    BlockChainBuilder builder = new BlockChainBuilder();
    Blockchain blockchain = builder.setTesting(true).build();
    for (Block block : blocks) blockchain.getBlockStore().saveBlock(block, TEST_DIFFICULTY, true);
    org.ethereum.core.Block rskCurrentBlock = blocks.get(9);
    Transaction rskTx = Transaction.create(config, TO_ADDRESS, DUST_AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA);
    rskTx.sign(new ECKey().getPrivKeyBytes());
    BridgeSupport bridgeSupport = new BridgeSupport(config, track, mock(BridgeEventLogger.class), provider, rskCurrentBlock);
    bridgeSupport.updateCollections(rskTx);
    bridgeSupport.save();
    track.commit();
    BridgeStorageProvider provider2 = new BridgeStorageProvider(repository, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants());
    Assert.assertEquals(0, provider2.getReleaseRequestQueue().getEntries().size());
    Assert.assertEquals(2, provider2.getReleaseTransactionSet().getEntries().size());
    Assert.assertEquals(1, provider2.getRskTxsWaitingForSignatures().size());
}
Also used : SimpleWallet(co.rsk.peg.simples.SimpleWallet) ECKey(org.ethereum.crypto.ECKey) BlockGenerator(co.rsk.blockchain.utils.BlockGenerator) BlockChainBuilder(co.rsk.test.builders.BlockChainBuilder) co.rsk.bitcoinj.core(co.rsk.bitcoinj.core) org.ethereum.core(org.ethereum.core) SimpleRskTransaction(co.rsk.peg.simples.SimpleRskTransaction) RepositoryImpl(co.rsk.db.RepositoryImpl) RLPList(org.ethereum.util.RLPList) BridgeConstants(co.rsk.config.BridgeConstants) BridgeEventLogger(co.rsk.peg.utils.BridgeEventLogger) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 2 with BridgeConstants

use of co.rsk.config.BridgeConstants in project rskj by rsksmart.

the class BridgeSupportTest method addBlockHeaderToBlockchain.

@Test
public void addBlockHeaderToBlockchain() throws IOException, BlockStoreException {
    Repository repository = new RepositoryImpl(config);
    Repository track = repository.startTracking();
    BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants();
    Context btcContext = new Context(bridgeConstants.getBtcParams());
    BtcBlockStore btcBlockStore = new RepositoryBlockStore(config, track, PrecompiledContracts.BRIDGE_ADDR);
    BtcBlockChain btcBlockChain = new SimpleBlockChain(btcContext, btcBlockStore);
    BridgeStorageProvider provider = new BridgeStorageProvider(track, contractAddress, config.getBlockchainConfig().getCommonConstants().getBridgeConstants());
    BridgeSupport bridgeSupport = new BridgeSupport(config, track, null, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), provider, btcBlockStore, btcBlockChain);
    co.rsk.bitcoinj.core.BtcBlock block = new co.rsk.bitcoinj.core.BtcBlock(btcParams, 1, PegTestUtils.createHash(), PegTestUtils.createHash(), 1, 1, 1, new ArrayList<BtcTransaction>());
    co.rsk.bitcoinj.core.BtcBlock[] headers = new co.rsk.bitcoinj.core.BtcBlock[1];
    headers[0] = block;
    bridgeSupport.receiveHeaders(headers);
    bridgeSupport.save();
    track.commit();
    Assert.assertNotNull(btcBlockStore.get(block.getHash()));
}
Also used : BtcBlockStore(co.rsk.bitcoinj.store.BtcBlockStore) SimpleBlockChain(co.rsk.peg.simples.SimpleBlockChain) co.rsk.bitcoinj.core(co.rsk.bitcoinj.core) org.ethereum.core(org.ethereum.core) RepositoryImpl(co.rsk.db.RepositoryImpl) BridgeConstants(co.rsk.config.BridgeConstants) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 3 with BridgeConstants

use of co.rsk.config.BridgeConstants in project rskj by rsksmart.

the class BridgeSupportTest method registerBtcTransactionLockTxWhitelisted.

@Test
public void registerBtcTransactionLockTxWhitelisted() throws BlockStoreException, AddressFormatException, IOException {
    BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants();
    NetworkParameters parameters = bridgeConstants.getBtcParams();
    List<BtcECKey> federation1Keys = Arrays.asList(new BtcECKey[] { BtcECKey.fromPrivate(Hex.decode("fa01")), BtcECKey.fromPrivate(Hex.decode("fa02")) });
    federation1Keys.sort(BtcECKey.PUBKEY_COMPARATOR);
    Federation federation1 = new Federation(federation1Keys, Instant.ofEpochMilli(1000L), 0L, parameters);
    List<BtcECKey> federation2Keys = Arrays.asList(new BtcECKey[] { BtcECKey.fromPrivate(Hex.decode("fb01")), BtcECKey.fromPrivate(Hex.decode("fb02")), BtcECKey.fromPrivate(Hex.decode("fb03")) });
    federation2Keys.sort(BtcECKey.PUBKEY_COMPARATOR);
    Federation federation2 = new Federation(federation2Keys, Instant.ofEpochMilli(2000L), 0L, parameters);
    Repository repository = new RepositoryImpl(config);
    repository.addBalance(PrecompiledContracts.BRIDGE_ADDR, LIMIT_MONETARY_BASE);
    Block executionBlock = Mockito.mock(Block.class);
    Mockito.when(executionBlock.getNumber()).thenReturn(10L);
    Repository track = repository.startTracking();
    // First transaction goes only to the first federation
    BtcTransaction tx1 = new BtcTransaction(this.btcParams);
    tx1.addOutput(Coin.COIN.multiply(5), federation1.getAddress());
    BtcECKey srcKey1 = new BtcECKey();
    tx1.addInput(PegTestUtils.createHash(), 0, ScriptBuilder.createInputScript(null, srcKey1));
    // Second transaction goes only to the second federation
    BtcTransaction tx2 = new BtcTransaction(this.btcParams);
    tx2.addOutput(Coin.COIN.multiply(10), federation2.getAddress());
    BtcECKey srcKey2 = new BtcECKey();
    tx2.addInput(PegTestUtils.createHash(), 0, ScriptBuilder.createInputScript(null, srcKey2));
    // Third transaction has one output to each federation
    // Lock is expected to be done accordingly and utxos assigned accordingly as well
    BtcTransaction tx3 = new BtcTransaction(this.btcParams);
    tx3.addOutput(Coin.COIN.multiply(2), federation1.getAddress());
    tx3.addOutput(Coin.COIN.multiply(3), federation2.getAddress());
    BtcECKey srcKey3 = new BtcECKey();
    tx3.addInput(PegTestUtils.createHash(), 0, ScriptBuilder.createInputScript(null, srcKey3));
    Context btcContext = new Context(bridgeConstants.getBtcParams());
    BtcBlockStore btcBlockStore = new RepositoryBlockStore(config, track, PrecompiledContracts.BRIDGE_ADDR);
    BtcBlockChain btcBlockChain = new SimpleBlockChain(btcContext, btcBlockStore);
    BridgeStorageProvider provider = new BridgeStorageProvider(track, contractAddress, config.getBlockchainConfig().getCommonConstants().getBridgeConstants());
    provider.setNewFederation(federation1);
    provider.setOldFederation(federation2);
    // Whitelist the addresses
    LockWhitelist whitelist = provider.getLockWhitelist();
    Address address1 = srcKey1.toAddress(parameters);
    Address address2 = srcKey2.toAddress(parameters);
    Address address3 = srcKey3.toAddress(parameters);
    whitelist.put(address1, Coin.COIN.multiply(5));
    whitelist.put(address2, Coin.COIN.multiply(10));
    whitelist.put(address3, Coin.COIN.multiply(2).add(Coin.COIN.multiply(3)));
    BridgeSupport bridgeSupport = new BridgeSupport(config, track, null, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), provider, btcBlockStore, btcBlockChain);
    Whitebox.setInternalState(bridgeSupport, "rskExecutionBlock", executionBlock);
    byte[] bits = new byte[1];
    bits[0] = 0x3f;
    List<Sha256Hash> hashes = new ArrayList<>();
    hashes.add(tx1.getHash());
    hashes.add(tx2.getHash());
    hashes.add(tx3.getHash());
    PartialMerkleTree pmt = new PartialMerkleTree(btcParams, bits, hashes, 3);
    List<Sha256Hash> hashlist = new ArrayList<>();
    Sha256Hash merkleRoot = pmt.getTxnHashAndMerkleRoot(hashlist);
    co.rsk.bitcoinj.core.BtcBlock block = new co.rsk.bitcoinj.core.BtcBlock(btcParams, 1, PegTestUtils.createHash(), merkleRoot, 1, 1, 1, new ArrayList<BtcTransaction>());
    btcBlockChain.add(block);
    ((SimpleBlockChain) btcBlockChain).useHighBlock();
    bridgeSupport.registerBtcTransaction(mock(Transaction.class), tx1, 1, pmt);
    bridgeSupport.registerBtcTransaction(mock(Transaction.class), tx2, 1, pmt);
    bridgeSupport.registerBtcTransaction(mock(Transaction.class), tx3, 1, pmt);
    bridgeSupport.save();
    ((SimpleBlockChain) btcBlockChain).useBlock();
    track.commit();
    Assert.assertThat(whitelist.isWhitelisted(address1), is(false));
    Assert.assertThat(whitelist.isWhitelisted(address2), is(false));
    Assert.assertThat(whitelist.isWhitelisted(address3), is(false));
    co.rsk.core.Coin amountToHaveBeenCreditedToSrc1 = co.rsk.core.Coin.fromBitcoin(Coin.valueOf(5, 0));
    co.rsk.core.Coin amountToHaveBeenCreditedToSrc2 = co.rsk.core.Coin.fromBitcoin(Coin.valueOf(10, 0));
    co.rsk.core.Coin amountToHaveBeenCreditedToSrc3 = co.rsk.core.Coin.fromBitcoin(Coin.valueOf(5, 0));
    co.rsk.core.Coin totalAmountExpectedToHaveBeenLocked = amountToHaveBeenCreditedToSrc1.add(amountToHaveBeenCreditedToSrc2).add(amountToHaveBeenCreditedToSrc3);
    RskAddress srcKey1RskAddress = new RskAddress(org.ethereum.crypto.ECKey.fromPrivate(srcKey1.getPrivKey()).getAddress());
    RskAddress srcKey2RskAddress = new RskAddress(org.ethereum.crypto.ECKey.fromPrivate(srcKey2.getPrivKey()).getAddress());
    RskAddress srcKey3RskAddress = new RskAddress(org.ethereum.crypto.ECKey.fromPrivate(srcKey3.getPrivKey()).getAddress());
    Assert.assertEquals(amountToHaveBeenCreditedToSrc1, repository.getBalance(srcKey1RskAddress));
    Assert.assertEquals(amountToHaveBeenCreditedToSrc2, repository.getBalance(srcKey2RskAddress));
    Assert.assertEquals(amountToHaveBeenCreditedToSrc3, repository.getBalance(srcKey3RskAddress));
    Assert.assertEquals(LIMIT_MONETARY_BASE.subtract(totalAmountExpectedToHaveBeenLocked), repository.getBalance(PrecompiledContracts.BRIDGE_ADDR));
    BridgeStorageProvider provider2 = new BridgeStorageProvider(repository, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants());
    Assert.assertEquals(2, provider2.getNewFederationBtcUTXOs().size());
    Assert.assertEquals(2, provider2.getOldFederationBtcUTXOs().size());
    Assert.assertEquals(Coin.COIN.multiply(5), provider2.getNewFederationBtcUTXOs().get(0).getValue());
    Assert.assertEquals(Coin.COIN.multiply(2), provider2.getNewFederationBtcUTXOs().get(1).getValue());
    Assert.assertEquals(Coin.COIN.multiply(10), provider2.getOldFederationBtcUTXOs().get(0).getValue());
    Assert.assertEquals(Coin.COIN.multiply(3), provider2.getOldFederationBtcUTXOs().get(1).getValue());
    Assert.assertEquals(0, provider2.getReleaseRequestQueue().getEntries().size());
    Assert.assertEquals(0, provider2.getReleaseTransactionSet().getEntries().size());
    Assert.assertTrue(provider2.getRskTxsWaitingForSignatures().isEmpty());
    Assert.assertEquals(3, provider2.getBtcTxHashesAlreadyProcessed().size());
}
Also used : RskAddress(co.rsk.core.RskAddress) SimpleBlockChain(co.rsk.peg.simples.SimpleBlockChain) RskAddress(co.rsk.core.RskAddress) BridgeConstants(co.rsk.config.BridgeConstants) BtcBlockStore(co.rsk.bitcoinj.store.BtcBlockStore) co.rsk.bitcoinj.core(co.rsk.bitcoinj.core) org.ethereum.core(org.ethereum.core) SimpleRskTransaction(co.rsk.peg.simples.SimpleRskTransaction) RepositoryImpl(co.rsk.db.RepositoryImpl) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 4 with BridgeConstants

use of co.rsk.config.BridgeConstants in project rskj by rsksmart.

the class BridgeSupportTest method getBridgeSupportWithMocksForFederationTests.

private BridgeSupport getBridgeSupportWithMocksForFederationTests(boolean genesis, Federation mockedNewFederation, Federation mockedGenesisFederation, Federation mockedOldFederation, PendingFederation mockedPendingFederation, ABICallElection mockedFederationElection, Block executionBlock, BridgeEventLogger eventLogger) throws IOException {
    BridgeConstants constantsMock = mock(BridgeConstants.class);
    when(constantsMock.getGenesisFederation()).thenReturn(mockedGenesisFederation);
    when(constantsMock.getBtcParams()).thenReturn(NetworkParameters.fromID(NetworkParameters.ID_REGTEST));
    when(constantsMock.getFederationChangeAuthorizer()).thenReturn(BridgeRegTestConstants.getInstance().getFederationChangeAuthorizer());
    when(constantsMock.getFederationActivationAge()).thenReturn(BridgeRegTestConstants.getInstance().getFederationActivationAge());
    class FederationHolder {

        private PendingFederation pendingFederation;

        private Federation activeFederation;

        private Federation retiringFederation;

        private ABICallElection federationElection;

        public List<UTXO> retiringUTXOs = new ArrayList<>();

        public List<UTXO> activeUTXOs = new ArrayList<>();

        PendingFederation getPendingFederation() {
            return pendingFederation;
        }

        void setPendingFederation(PendingFederation pendingFederation) {
            this.pendingFederation = pendingFederation;
        }

        Federation getActiveFederation() {
            return activeFederation;
        }

        void setActiveFederation(Federation activeFederation) {
            this.activeFederation = activeFederation;
        }

        Federation getRetiringFederation() {
            return retiringFederation;
        }

        void setRetiringFederation(Federation retiringFederation) {
            this.retiringFederation = retiringFederation;
        }

        public ABICallElection getFederationElection() {
            return federationElection;
        }

        public void setFederationElection(ABICallElection federationElection) {
            this.federationElection = federationElection;
        }
    }
    final FederationHolder holder = new FederationHolder();
    holder.setPendingFederation(mockedPendingFederation);
    BridgeStorageProvider providerMock = mock(BridgeStorageProvider.class);
    when(providerMock.getOldFederationBtcUTXOs()).then((InvocationOnMock m) -> holder.retiringUTXOs);
    when(providerMock.getNewFederationBtcUTXOs()).then((InvocationOnMock m) -> holder.activeUTXOs);
    holder.setActiveFederation(genesis ? null : mockedNewFederation);
    holder.setRetiringFederation(mockedOldFederation);
    when(providerMock.getNewFederation()).then((InvocationOnMock m) -> holder.getActiveFederation());
    when(providerMock.getOldFederation()).then((InvocationOnMock m) -> holder.getRetiringFederation());
    when(providerMock.getPendingFederation()).then((InvocationOnMock m) -> holder.getPendingFederation());
    when(providerMock.getFederationElection(any())).then((InvocationOnMock m) -> {
        if (mockedFederationElection != null) {
            holder.setFederationElection(mockedFederationElection);
        }
        if (holder.getFederationElection() == null) {
            AddressBasedAuthorizer auth = m.getArgumentAt(0, AddressBasedAuthorizer.class);
            holder.setFederationElection(new ABICallElection(auth));
        }
        return holder.getFederationElection();
    });
    Mockito.doAnswer((InvocationOnMock m) -> {
        holder.setActiveFederation(m.getArgumentAt(0, Federation.class));
        return null;
    }).when(providerMock).setNewFederation(any());
    Mockito.doAnswer((InvocationOnMock m) -> {
        holder.setRetiringFederation(m.getArgumentAt(0, Federation.class));
        return null;
    }).when(providerMock).setOldFederation(any());
    Mockito.doAnswer((InvocationOnMock m) -> {
        holder.setPendingFederation(m.getArgumentAt(0, PendingFederation.class));
        return null;
    }).when(providerMock).setPendingFederation(any());
    BridgeSupport result = new BridgeSupport(config, null, eventLogger, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), providerMock, null, null);
    Whitebox.setInternalState(result, "bridgeConstants", constantsMock);
    Whitebox.setInternalState(result, "rskExecutionBlock", executionBlock);
    return result;
}
Also used : InvocationOnMock(org.mockito.invocation.InvocationOnMock) RLPList(org.ethereum.util.RLPList) BridgeConstants(co.rsk.config.BridgeConstants)

Example 5 with BridgeConstants

use of co.rsk.config.BridgeConstants in project rskj by rsksmart.

the class BridgeSupportTest method sendOrphanBlockHeader.

@Test
public void sendOrphanBlockHeader() throws IOException, BlockStoreException {
    Repository repository = new RepositoryImpl(config);
    Repository track = repository.startTracking();
    BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants();
    Context btcContext = new Context(bridgeConstants.getBtcParams());
    BtcBlockStore btcBlockStore = new RepositoryBlockStore(config, track, PrecompiledContracts.BRIDGE_ADDR);
    BtcBlockChain btcBlockChain = new BtcBlockChain(btcContext, btcBlockStore);
    BridgeStorageProvider provider = new BridgeStorageProvider(track, contractAddress, config.getBlockchainConfig().getCommonConstants().getBridgeConstants());
    BridgeSupport bridgeSupport = new BridgeSupport(config, track, null, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), provider, btcBlockStore, btcBlockChain);
    co.rsk.bitcoinj.core.BtcBlock block = new co.rsk.bitcoinj.core.BtcBlock(btcParams, 1, PegTestUtils.createHash(), PegTestUtils.createHash(), 1, 1, 1, new ArrayList<BtcTransaction>());
    co.rsk.bitcoinj.core.BtcBlock[] headers = new co.rsk.bitcoinj.core.BtcBlock[1];
    headers[0] = block;
    bridgeSupport.receiveHeaders(headers);
    bridgeSupport.save();
    track.commit();
    Assert.assertNull(btcBlockStore.get(block.getHash()));
}
Also used : BtcBlockStore(co.rsk.bitcoinj.store.BtcBlockStore) co.rsk.bitcoinj.core(co.rsk.bitcoinj.core) org.ethereum.core(org.ethereum.core) RepositoryImpl(co.rsk.db.RepositoryImpl) BridgeConstants(co.rsk.config.BridgeConstants) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Aggregations

BridgeConstants (co.rsk.config.BridgeConstants)19 Test (org.junit.Test)15 PrepareForTest (org.powermock.core.classloader.annotations.PrepareForTest)13 RskAddress (co.rsk.core.RskAddress)10 RepositoryImpl (co.rsk.db.RepositoryImpl)10 SimpleRskTransaction (co.rsk.peg.simples.SimpleRskTransaction)10 co.rsk.bitcoinj.core (co.rsk.bitcoinj.core)9 org.ethereum.core (org.ethereum.core)8 BtcBlockStore (co.rsk.bitcoinj.store.BtcBlockStore)7 SimpleBlockChain (co.rsk.peg.simples.SimpleBlockChain)5 BridgeEventLogger (co.rsk.peg.utils.BridgeEventLogger)3 Repository (org.ethereum.core.Repository)3 TransactionSignature (co.rsk.bitcoinj.crypto.TransactionSignature)2 Script (co.rsk.bitcoinj.script.Script)2 BlockGenerator (co.rsk.blockchain.utils.BlockGenerator)2 RskSystemProperties (co.rsk.config.RskSystemProperties)2 Block (org.ethereum.core.Block)2 RLPList (org.ethereum.util.RLPList)2 ScriptBuilder (co.rsk.bitcoinj.script.ScriptBuilder)1 ScriptChunk (co.rsk.bitcoinj.script.ScriptChunk)1