Search in sources :

Example 6 with BlockIdentifier

use of org.ethereum.core.BlockIdentifier in project rskj by rsksmart.

the class NodeMessageHandler method relayBlock.

private void relayBlock(@Nonnull MessageChannel sender, Block block) {
    final BlockNodeInformation nodeInformation = this.blockProcessor.getNodeInformation();
    final Set<NodeID> nodesWithBlock = nodeInformation.getNodesByBlock(block.getHash().getBytes());
    final Set<NodeID> newNodes = this.syncProcessor.getKnownPeersNodeIDs().stream().filter(p -> !nodesWithBlock.contains(p)).collect(Collectors.toSet());
    List<BlockIdentifier> identifiers = new ArrayList<>();
    identifiers.add(new BlockIdentifier(block.getHash().getBytes(), block.getNumber()));
    channelManager.broadcastBlockHash(identifiers, newNodes);
    Metrics.processBlockMessage("blockRelayed", block, sender.getPeerNodeID());
}
Also used : BlockDifficulty(co.rsk.core.BlockDifficulty) java.util(java.util) Hex(org.spongycastle.util.encoders.Hex) BlockValidationRule(co.rsk.validators.BlockValidationRule) LoggerFactory(org.slf4j.LoggerFactory) Autowired(org.springframework.beans.factory.annotation.Autowired) Keccak256(co.rsk.crypto.Keccak256) Block(org.ethereum.core.Block) PeerScoringManager(co.rsk.scoring.PeerScoringManager) BlockChainStatus(co.rsk.core.bc.BlockChainStatus) EventType(co.rsk.scoring.EventType) Duration(java.time.Duration) ChannelManager(org.ethereum.net.server.ChannelManager) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) BlockIdentifier(org.ethereum.core.BlockIdentifier) Logger(org.slf4j.Logger) co.rsk.net.messages(co.rsk.net.messages) HashUtil(org.ethereum.crypto.HashUtil) LinkedBlockingQueue(java.util.concurrent.LinkedBlockingQueue) Collectors(java.util.stream.Collectors) TransactionPool(org.ethereum.core.TransactionPool) TimeUnit(java.util.concurrent.TimeUnit) Component(org.springframework.stereotype.Component) TxHandler(co.rsk.net.handler.TxHandler) VisibleForTesting(com.google.common.annotations.VisibleForTesting) RskSystemProperties(co.rsk.config.RskSystemProperties) Transaction(org.ethereum.core.Transaction) BlockIdentifier(org.ethereum.core.BlockIdentifier)

Example 7 with BlockIdentifier

use of org.ethereum.core.BlockIdentifier in project rskj by rsksmart.

the class NewBlockHashesMessage method parse.

private void parse() {
    RLPList paramsList = (RLPList) RLP.decode2(encoded).get(0);
    blockIdentifiers = new ArrayList<>();
    for (int i = 0; i < paramsList.size(); ++i) {
        RLPList rlpData = ((RLPList) paramsList.get(i));
        blockIdentifiers.add(new BlockIdentifier(rlpData));
    }
    parsed = true;
}
Also used : BlockIdentifier(org.ethereum.core.BlockIdentifier) RLPList(org.ethereum.util.RLPList)

Example 8 with BlockIdentifier

use of org.ethereum.core.BlockIdentifier in project rskj by rsksmart.

the class NewBlockHashesMessage method encode.

private void encode() {
    List<byte[]> encodedElements = new ArrayList<>();
    for (BlockIdentifier identifier : blockIdentifiers) {
        encodedElements.add(identifier.getEncoded());
    }
    byte[][] encodedElementArray = encodedElements.toArray(new byte[encodedElements.size()][]);
    this.encoded = RLP.encodeList(encodedElementArray);
}
Also used : BlockIdentifier(org.ethereum.core.BlockIdentifier) ArrayList(java.util.ArrayList)

Example 9 with BlockIdentifier

use of org.ethereum.core.BlockIdentifier in project rskj by rsksmart.

the class ChannelManagerImpl method broadcastBlock.

/**
 * broadcastBlock Propagates a block message across active peers with exclusion of
 * the peers with an id belonging to the skip set.
 *
 * @param block new Block to be sent
 * @param skip  the set of peers to avoid sending the message.
 * @return a set containing the ids of the peers that received the block.
 */
@Nonnull
public Set<NodeID> broadcastBlock(@Nonnull final Block block, @Nullable final Set<NodeID> skip) {
    Metrics.broadcastBlock(block);
    final Set<NodeID> res = new HashSet<>();
    final BlockIdentifier bi = new BlockIdentifier(block.getHash().getBytes(), block.getNumber());
    final EthMessage newBlock = new RskMessage(config, new BlockMessage(block));
    final EthMessage newBlockHashes = new RskMessage(config, new NewBlockHashesMessage(Arrays.asList(bi)));
    synchronized (activePeers) {
        // Get a randomized list with all the peers that don't have the block yet.
        activePeers.values().forEach(c -> logger.trace("RSK activePeers: {}", c));
        final Vector<Channel> peers = activePeers.values().stream().filter(p -> skip == null || !skip.contains(p.getNodeId())).collect(Collectors.toCollection(Vector::new));
        Collections.shuffle(peers);
        int sqrt = (int) Math.floor(Math.sqrt(peers.size()));
        for (int i = 0; i < sqrt; i++) {
            Channel peer = peers.get(i);
            res.add(peer.getNodeId());
            logger.trace("RSK propagate: {}", peer);
            peer.sendMessage(newBlock);
        }
        for (int i = sqrt; i < peers.size(); i++) {
            Channel peer = peers.get(i);
            logger.trace("RSK announce: {}", peer);
            peer.sendMessage(newBlockHashes);
        }
    }
    return res;
}
Also used : BlockIdentifier(org.ethereum.core.BlockIdentifier) NodeFilter(org.ethereum.config.NodeFilter) java.util(java.util) LoggerFactory(org.slf4j.LoggerFactory) LRUMap(org.apache.commons.collections4.map.LRUMap) Autowired(org.springframework.beans.factory.annotation.Autowired) CollectionUtils(org.apache.commons.collections4.CollectionUtils) Block(org.ethereum.core.Block) InetAddress(java.net.InetAddress) EthMessage(org.ethereum.net.eth.message.EthMessage) Status(co.rsk.net.Status) SyncPool(org.ethereum.sync.SyncPool) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Metrics(co.rsk.net.Metrics) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) BlockIdentifier(org.ethereum.core.BlockIdentifier) RskMessage(co.rsk.net.eth.RskMessage) Logger(org.slf4j.Logger) co.rsk.net.messages(co.rsk.net.messages) ReasonCode(org.ethereum.net.message.ReasonCode) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) TimeUnit(java.util.concurrent.TimeUnit) Component(org.springframework.stereotype.Component) NodeID(co.rsk.net.NodeID) VisibleForTesting(com.google.common.annotations.VisibleForTesting) RskSystemProperties(co.rsk.config.RskSystemProperties) Transaction(org.ethereum.core.Transaction) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) EthMessage(org.ethereum.net.eth.message.EthMessage) NodeID(co.rsk.net.NodeID) RskMessage(co.rsk.net.eth.RskMessage) Nonnull(javax.annotation.Nonnull)

Example 10 with BlockIdentifier

use of org.ethereum.core.BlockIdentifier in project rskj by rsksmart.

the class ChannelManagerImpl method broadcastBlockHash.

@Nonnull
public Set<NodeID> broadcastBlockHash(@Nonnull final List<BlockIdentifier> identifiers, @Nullable final Set<NodeID> targets) {
    final Set<NodeID> res = new HashSet<>();
    final EthMessage newBlockHash = new RskMessage(config, new NewBlockHashesMessage(identifiers));
    synchronized (activePeers) {
        activePeers.values().forEach(c -> logger.trace("RSK activePeers: {}", c));
        activePeers.values().stream().filter(p -> targets == null || targets.contains(p.getNodeId())).forEach(peer -> {
            logger.trace("RSK announce hash: {}", peer);
            peer.sendMessage(newBlockHash);
        });
    }
    return res;
}
Also used : NodeFilter(org.ethereum.config.NodeFilter) java.util(java.util) LoggerFactory(org.slf4j.LoggerFactory) LRUMap(org.apache.commons.collections4.map.LRUMap) Autowired(org.springframework.beans.factory.annotation.Autowired) CollectionUtils(org.apache.commons.collections4.CollectionUtils) Block(org.ethereum.core.Block) InetAddress(java.net.InetAddress) EthMessage(org.ethereum.net.eth.message.EthMessage) Status(co.rsk.net.Status) SyncPool(org.ethereum.sync.SyncPool) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Metrics(co.rsk.net.Metrics) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) BlockIdentifier(org.ethereum.core.BlockIdentifier) RskMessage(co.rsk.net.eth.RskMessage) Logger(org.slf4j.Logger) co.rsk.net.messages(co.rsk.net.messages) ReasonCode(org.ethereum.net.message.ReasonCode) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) TimeUnit(java.util.concurrent.TimeUnit) Component(org.springframework.stereotype.Component) NodeID(co.rsk.net.NodeID) VisibleForTesting(com.google.common.annotations.VisibleForTesting) RskSystemProperties(co.rsk.config.RskSystemProperties) Transaction(org.ethereum.core.Transaction) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) EthMessage(org.ethereum.net.eth.message.EthMessage) NodeID(co.rsk.net.NodeID) RskMessage(co.rsk.net.eth.RskMessage) Nonnull(javax.annotation.Nonnull)

Aggregations

BlockIdentifier (org.ethereum.core.BlockIdentifier)15 Block (org.ethereum.core.Block)9 Test (org.junit.Test)7 RskSystemProperties (co.rsk.config.RskSystemProperties)6 co.rsk.net.messages (co.rsk.net.messages)3 SimpleMessageChannel (co.rsk.net.simples.SimpleMessageChannel)3 SyncConfiguration (co.rsk.net.sync.SyncConfiguration)3 VisibleForTesting (com.google.common.annotations.VisibleForTesting)3 java.util (java.util)3 TimeUnit (java.util.concurrent.TimeUnit)3 Collectors (java.util.stream.Collectors)3 Nonnull (javax.annotation.Nonnull)3 Nullable (javax.annotation.Nullable)3 Blockchain (org.ethereum.core.Blockchain)3 Transaction (org.ethereum.core.Transaction)3 Logger (org.slf4j.Logger)3 LoggerFactory (org.slf4j.LoggerFactory)3 Autowired (org.springframework.beans.factory.annotation.Autowired)3 Component (org.springframework.stereotype.Component)3 BlockGenerator (co.rsk.blockchain.utils.BlockGenerator)2