From cf3588d6e3966f1337a195b163cc02c1aa213e73 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Mon, 11 Nov 2019 15:41:14 -0500 Subject: [PATCH 01/20] rename removeObserver to removeBlockAddedObserver Signed-off-by: Ratan Rai Sur --- .../blockcreation/IbftMiningCoordinator.java | 2 +- .../besu/ethereum/chain/Blockchain.java | 2 +- .../ethereum/chain/DefaultBlockchain.java | 2 +- .../besu/ethereum/worldstate/Pruner.java | 2 +- .../ethereum/chain/DefaultBlockchainTest.java | 10 ++-- .../besu/ethereum/vm/TestBlockchain.java | 2 +- .../node/PeerPermissionsAdapter.java | 2 +- .../besu/plugin/data/LogWithMetadata.java | 58 +++++++++++++++++++ .../besu/plugin/services/BesuEvents.java | 27 +++++++++ 9 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java index acd713a78a2..66ae5c3f331 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java @@ -87,7 +87,7 @@ public void start() { @Override public void stop() { if (state.compareAndSet(State.RUNNING, State.STOPPED)) { - blockchain.removeObserver(blockAddedObserverId); + blockchain.removeBlockAddedObserver(blockAddedObserverId); ibftProcessor.stop(); // Make sure the processor has stopped before shutting down the executors try { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java index ff4ea8b9516..de022fb77bb 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java @@ -190,5 +190,5 @@ default boolean contains(final Hash blockHash) { * @param observerId the ID of the observer to remove * @return {@code true} if the observer was removed; otherwise {@code false} */ - boolean removeObserver(long observerId); + boolean removeBlockAddedObserver(long observerId); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java index 713d7184350..6ee1323afd0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java @@ -546,7 +546,7 @@ public long observeBlockAdded(final BlockAddedObserver observer) { } @Override - public boolean removeObserver(final long observerId) { + public boolean removeBlockAddedObserver(final long observerId) { return blockAddedObservers.unsubscribe(observerId); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java index 0de65e217e2..6ed33a020d4 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java @@ -98,7 +98,7 @@ public void stop() { if (state.compareAndSet(State.RUNNING, State.STOPPED)) { LOG.info("Stopping Pruner."); pruningStrategy.cleanup(); - blockchain.removeObserver(blockAddedObserverId); + blockchain.removeBlockAddedObserver(blockAddedObserverId); executorService.shutdownNow(); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java index 7ec4c028fb2..9785ee07b4b 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java @@ -750,7 +750,7 @@ public void blockAddedObserver_removeNonexistentObserver() { final Block genesisBlock = gen.genesisBlock(); final DefaultBlockchain blockchain = createMutableBlockchain(kvStore, genesisBlock); - assertThat(blockchain.removeObserver(7)).isFalse(); + assertThat(blockchain.removeBlockAddedObserver(7)).isFalse(); } @Test @@ -764,7 +764,7 @@ public void blockAddedObserver_addRemoveSingle() { final long observerId = blockchain.observeBlockAdded((block, chain) -> {}); assertThat(blockchain.observerCount()).isEqualTo(1); - assertThat(blockchain.removeObserver(observerId)).isTrue(); + assertThat(blockchain.removeBlockAddedObserver(observerId)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(0); } @@ -796,13 +796,13 @@ public void blockAddedObserver_addRemoveMultiple() { final long observerId3 = blockchain.observeBlockAdded((block, chain) -> {}); assertThat(blockchain.observerCount()).isEqualTo(3); - assertThat(blockchain.removeObserver(observerId1)).isTrue(); + assertThat(blockchain.removeBlockAddedObserver(observerId1)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(2); - assertThat(blockchain.removeObserver(observerId2)).isTrue(); + assertThat(blockchain.removeBlockAddedObserver(observerId2)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(1); - assertThat(blockchain.removeObserver(observerId3)).isTrue(); + assertThat(blockchain.removeBlockAddedObserver(observerId3)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(0); } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java index aff14d2e6db..83140fe118d 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java @@ -144,7 +144,7 @@ public long observeBlockAdded(final BlockAddedObserver observer) { } @Override - public boolean removeObserver(final long observerId) { + public boolean removeBlockAddedObserver(final long observerId) { throw new NonDeterministicOperationException("Listening for new blocks is not deterministic"); } diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java index 0bdda1b198a..136644f4630 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java @@ -125,7 +125,7 @@ private boolean inboundIsPermitted(final Peer localNode, final Peer remotePeer) @Override public void close() { - blockchain.removeObserver(blockchainListenId); + blockchain.removeBlockAddedObserver(blockchainListenId); nodePermissioningController.unsubscribeFromUpdates(nodePermissioningListenId); } } diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java new file mode 100644 index 00000000000..4964b76c984 --- /dev/null +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java @@ -0,0 +1,58 @@ +/* + * Copyright ConsenSys AG. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ +package org.hyperledger.besu.plugin.data; + +import com.google.protobuf.BytesValue; +import org.hyperledger.besu.plugin.Unstable; + +import java.util.List; + +/** A Log entry from a transaction execution. */ +@Unstable +public interface LogWithMetadata { + + /** + * The address of the contract writing this log message. + * + * @return The loggers address. + */ + Address getLogger(); + + /** + * The list of 32 byte log topics, possibly empty. + * + * @return The list, possibly zero length, of log topics. + */ + List getTopics(); + + /** + * The data, of possibly unlimited length, for this log entry. + * + * @return The log data. + */ + UnformattedData getData(); + + int getLogIndex(); + + long getBlockNumber(); + + Hash getBlockHash(); + + Hash getTransactionHash(); + + int getTransactionIndex(); + + boolean isRemoved(); +} diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java index 62ef32ae3f5..41b0465cefe 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java @@ -15,10 +15,14 @@ package org.hyperledger.besu.plugin.services; import org.hyperledger.besu.plugin.Unstable; +import org.hyperledger.besu.plugin.data.Address; +import org.hyperledger.besu.plugin.data.LogWithMetadata; import org.hyperledger.besu.plugin.data.PropagatedBlockContext; import org.hyperledger.besu.plugin.data.SyncStatus; import org.hyperledger.besu.plugin.data.Transaction; +import org.hyperledger.besu.plugin.data.UnformattedData; +import java.util.List; import java.util.Optional; /** @@ -101,6 +105,22 @@ public interface BesuEvents { */ void removeSyncStatusListener(long listenerIdentifier); + /** + * REPLACE ME + * + * @param syncStatusListener REPLACEME + * @return REPLACEME + */ + long addLogListener( + List
addresses, List> topics, LogListener syncStatusListener); + + /** + * REPLACE ME + * + * @param listenerIdentifier REPLACEME + */ + void removeLogListener(long listenerIdentifier); + /** The listener interface for receiving new block propagated events. */ interface BlockPropagatedListener { @@ -148,4 +168,11 @@ interface SyncStatusListener { */ void onSyncStatusChanged(Optional syncStatus); } + + /** replaceme */ + interface LogListener { + + /** @param propagatedBlockContext replaceme */ + void onLogEmitted(LogWithMetadata logWithMetadata); + } } From 387ea43a8b76b7b4d895a3f0f10034fe233d2622 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 10:22:57 -0500 Subject: [PATCH 02/20] use superclass fields in LogWithMetadata Signed-off-by: Ratan Rai Sur --- .../besu/ethereum/core/LogWithMetadata.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java index 79a616f22a3..a4a1140ddd7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java @@ -23,16 +23,14 @@ import com.google.common.base.MoreObjects; -public class LogWithMetadata extends Log { +public class LogWithMetadata extends Log + implements org.hyperledger.besu.plugin.data.LogWithMetadata { private final int logIndex; private final long blockNumber; private final Hash blockHash; private final Hash transactionHash; private final int transactionIndex; - private final Address address; - private final BytesValue data; - private final List topics; private final boolean removed; public LogWithMetadata( @@ -51,9 +49,6 @@ public LogWithMetadata( this.blockHash = blockHash; this.transactionHash = transactionHash; this.transactionIndex = transactionIndex; - this.address = address; - this.data = data; - this.topics = topics; this.removed = removed; } @@ -123,17 +118,17 @@ public int getTransactionIndex() { @Override public Address getLogger() { - return address; + return super.getLogger(); } @Override public BytesValue getData() { - return data; + return super.getData(); } @Override public List getTopics() { - return topics; + return super.getTopics(); } public boolean isRemoved() { @@ -148,9 +143,9 @@ public String toString() { .add("blockHash", blockHash) .add("transactionHash", transactionHash) .add("transactionIndex", transactionIndex) - .add("address", address) - .add("data", data) - .add("topics", topics) + .add("address", getLogger()) + .add("data", getData()) + .add("topics", getTopics()) .add("removed", removed) .toString(); } From 2c0dea238a93244d3b0d7e399e5191811522f286 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 10:24:26 -0500 Subject: [PATCH 03/20] add blockchain dependency to besu events impl Signed-off-by: Ratan Rai Sur --- .../acceptance/dsl/node/ThreadBesuNodeRunner.java | 2 +- .../java/org/hyperledger/besu/cli/BesuCommand.java | 1 + .../hyperledger/besu/services/BesuEventsImpl.java | 14 ++++++++++++++ .../besu/services/BesuEventsImplTest.java | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java index ab4918f2364..498318d52a0 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java @@ -167,7 +167,7 @@ public void startNode(final BesuNode node) { besuPluginContext.addService( BesuEvents.class, new BesuEventsImpl( - besuController.getProtocolManager().getBlockBroadcaster(), + besuController.getProtocolContext().getBlockchain(), besuController.getProtocolManager().getBlockBroadcaster(), besuController.getTransactionPool(), besuController.getSyncState())); besuPluginContext.startPlugins(); diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index e6de377a15b..ed429efeab4 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -937,6 +937,7 @@ private BesuCommand startPlugins() { besuPluginContext.addService( BesuEvents.class, new BesuEventsImpl( + besuController.getProtocolContext().getBlockchain(), besuController.getProtocolManager().getBlockBroadcaster(), besuController.getTransactionPool(), besuController.getSyncState())); diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index aa6570d20cd..2d146068c41 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -14,25 +14,39 @@ */ package org.hyperledger.besu.services; +import org.hyperledger.besu.ethereum.api.query.LogsQuery; +import org.hyperledger.besu.ethereum.chain.Blockchain; +import org.hyperledger.besu.ethereum.chain.MutableBlockchain; +import org.hyperledger.besu.ethereum.core.LogTopic; +import org.hyperledger.besu.ethereum.core.LogWithMetadata; import org.hyperledger.besu.ethereum.eth.sync.BlockBroadcaster; import org.hyperledger.besu.ethereum.eth.sync.state.SyncState; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; +import org.hyperledger.besu.plugin.data.Address; import org.hyperledger.besu.plugin.data.BlockHeader; import org.hyperledger.besu.plugin.data.PropagatedBlockContext; import org.hyperledger.besu.plugin.data.Quantity; +import org.hyperledger.besu.plugin.data.UnformattedData; import org.hyperledger.besu.plugin.services.BesuEvents; +import org.hyperledger.besu.util.bytes.BytesValue; +import java.util.List; import java.util.function.Supplier; +import static java.util.stream.Collectors.toUnmodifiableList; + public class BesuEventsImpl implements BesuEvents { + private Blockchain blockchain; private final BlockBroadcaster blockBroadcaster; private final TransactionPool transactionPool; private final SyncState syncState; public BesuEventsImpl( + final Blockchain blockchain, final BlockBroadcaster blockBroadcaster, final TransactionPool transactionPool, final SyncState syncState) { + this.blockchain = blockchain; this.blockBroadcaster = blockBroadcaster; this.transactionPool = transactionPool; this.syncState = syncState; diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index 9eba7c60959..0cb24bcb3c3 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -119,7 +119,7 @@ public void setUp() { TransactionPoolConfiguration.builder().txPoolMaxSize(1).build()); syncState = new SyncState(mockBlockchain, mockEthPeers); - serviceImpl = new BesuEventsImpl(blockBroadcaster, transactionPool, syncState); + serviceImpl = new BesuEventsImpl(besuController.getProtocolContext().getBlockchain(), blockBroadcaster, transactionPool, syncState); } @Test From 70453ef7bd73e801a605900094969bbf615c7b13 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 10:25:01 -0500 Subject: [PATCH 04/20] add log stuff to blockchain and BesuEventsImpl Signed-off-by: Ratan Rai Sur --- .../besu/services/BesuEventsImpl.java | 32 +++++++++++++++++++ .../besu/ethereum/chain/Blockchain.java | 5 +++ .../besu/plugin/services/BesuEvents.java | 6 ++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index 2d146068c41..bc976095c61 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -97,6 +97,38 @@ public void removeSyncStatusListener(final long listenerIdentifier) { syncState.unsubscribeSyncStatus(listenerIdentifier); } + @Override + public long addLogListener( + List
addresses, List> topics, LogListener logListener) { + final List besuAddresses = + addresses.stream() + .map( + address -> + org.hyperledger.besu.ethereum.core.Address.wrap( + BytesValue.wrap(address.getByteArray()))) + .collect(toUnmodifiableList()); + final List> besuTopics = + topics.stream() + .map( + subList -> + subList.stream() + .map(bytes -> LogTopic.create(BytesValue.wrap(bytes.getByteArray()))) + .collect(toUnmodifiableList())) + .collect(toUnmodifiableList()); + + final LogsQuery logsQuery = new LogsQuery(besuAddresses, besuTopics); + + return blockchain.addLogListener( + logWithMetadata -> { + if (logsQuery.matches(logWithMetadata)) { + logListener.onLogEmitted(logWithMetadata); + } + }); + } + + @Override + public void removeLogListener(long listenerIdentifier) {} + private static PropagatedBlockContext blockPropagatedContext( final Supplier blockHeaderSupplier, final Supplier totalDifficultySupplier) { diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java index de022fb77bb..0dfb304196a 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java @@ -20,6 +20,7 @@ import org.hyperledger.besu.ethereum.core.Hash; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; +import org.hyperledger.besu.plugin.services.BesuEvents; import org.hyperledger.besu.util.uint.UInt256; import java.util.List; @@ -191,4 +192,8 @@ default boolean contains(final Hash blockHash) { * @return {@code true} if the observer was removed; otherwise {@code false} */ boolean removeBlockAddedObserver(long observerId); + + long addLogListener(BesuEvents.LogListener logListener); + + boolean removeLogListener(long id); } diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java index 41b0465cefe..d7b9220b664 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java @@ -108,11 +108,11 @@ public interface BesuEvents { /** * REPLACE ME * - * @param syncStatusListener REPLACEME + * @param logListener REPLACEME * @return REPLACEME */ long addLogListener( - List
addresses, List> topics, LogListener syncStatusListener); + List
addresses, List> topics, LogListener logListener); /** * REPLACE ME @@ -172,7 +172,7 @@ interface SyncStatusListener { /** replaceme */ interface LogListener { - /** @param propagatedBlockContext replaceme */ + /** @param logWithMetadata replaceme */ void onLogEmitted(LogWithMetadata logWithMetadata); } } From 9d5f1a3670f0d414c85e9f0cf1c9c4786fa5020b Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 10:55:45 -0500 Subject: [PATCH 05/20] add fromPlugin constructors Signed-off-by: Ratan Rai Sur --- .../besu/services/BesuEventsImpl.java | 7 ++----- .../hyperledger/besu/ethereum/core/Address.java | 4 ++++ .../org/hyperledger/besu/ethereum/core/Hash.java | 4 ++++ .../hyperledger/besu/ethereum/core/LogTopic.java | 5 +++++ .../besu/ethereum/core/LogWithMetadata.java | 16 ++++++++++++++++ .../org/hyperledger/besu/util/bytes/Bytes32.java | 5 +++++ .../hyperledger/besu/util/bytes/BytesValue.java | 4 ++++ 7 files changed, 40 insertions(+), 5 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index bc976095c61..67de0e8b42b 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -102,10 +102,7 @@ public long addLogListener( List
addresses, List> topics, LogListener logListener) { final List besuAddresses = addresses.stream() - .map( - address -> - org.hyperledger.besu.ethereum.core.Address.wrap( - BytesValue.wrap(address.getByteArray()))) + .map(org.hyperledger.besu.ethereum.core.Address::fromPlugin) .collect(toUnmodifiableList()); final List> besuTopics = topics.stream() @@ -120,7 +117,7 @@ public long addLogListener( return blockchain.addLogListener( logWithMetadata -> { - if (logsQuery.matches(logWithMetadata)) { + if (logsQuery.matches(LogWithMetadata.fromPlugin(logWithMetadata))) { logListener.onLogEmitted(logWithMetadata); } }); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java index 8ce41fe3ed9..af5bda6108f 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java @@ -176,6 +176,10 @@ public static Address privateContractAddress( }))); } + public static Address fromPlugin(org.hyperledger.besu.plugin.data.Address logger) { + return wrap(BytesValue.fromPlugin(logger)); + } + @Override public Address copy() { final BytesValue copiedStorage = wrapped.copy(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java index 70f663057e2..930ad71163f 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java @@ -68,6 +68,10 @@ public static Hash fromHexStringLenient(final String str) { return new Hash(Bytes32.fromHexStringLenient(str)); } + public static Hash fromPlugin(org.hyperledger.besu.plugin.data.Hash blockHash) { + return wrap(Bytes32.fromPlugin(blockHash)); + } + @Override public byte[] getByteArray() { return super.getByteArray(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java index 0eb1579f353..6be247d67de 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java @@ -18,6 +18,7 @@ import org.hyperledger.besu.ethereum.rlp.RLPInput; import org.hyperledger.besu.ethereum.rlp.RLPOutput; +import org.hyperledger.besu.plugin.data.UnformattedData; import org.hyperledger.besu.util.bytes.BytesValue; import org.hyperledger.besu.util.bytes.DelegatingBytesValue; @@ -57,6 +58,10 @@ public static LogTopic readFrom(final RLPInput in) { return new LogTopic(in.readBytesValue()); } + public static LogTopic fromPlugin(UnformattedData data) { + return wrap(BytesValue.fromPlugin(data)); + } + /** * Writes the log topic to the provided RLP output. * diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java index a4a1140ddd7..d46fd543266 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java @@ -23,6 +23,8 @@ import com.google.common.base.MoreObjects; +import static java.util.stream.Collectors.toUnmodifiableList; + public class LogWithMetadata extends Log implements org.hyperledger.besu.plugin.data.LogWithMetadata { @@ -149,4 +151,18 @@ public String toString() { .add("removed", removed) .toString(); } + + public static LogWithMetadata fromPlugin( + org.hyperledger.besu.plugin.data.LogWithMetadata pluginObject) { + return new LogWithMetadata( + pluginObject.getLogIndex(), + pluginObject.getBlockNumber(), + Hash.fromPlugin(pluginObject.getBlockHash()), + Hash.fromPlugin(pluginObject.getTransactionHash()), + pluginObject.getTransactionIndex(), + Address.fromPlugin(pluginObject.getLogger()), + BytesValue.fromPlugin(pluginObject.getData()), + pluginObject.getTopics().stream().map(LogTopic::fromPlugin).collect(toUnmodifiableList()), + pluginObject.isRemoved()); + } } diff --git a/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java b/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java index f6c85371b8c..d787f7f4f1c 100644 --- a/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java +++ b/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java @@ -16,6 +16,7 @@ import static com.google.common.base.Preconditions.checkArgument; +import org.hyperledger.besu.plugin.data.UnformattedData; import org.hyperledger.besu.util.uint.Int256; import org.hyperledger.besu.util.uint.UInt256; import org.hyperledger.besu.util.uint.UInt256Bytes; @@ -168,6 +169,10 @@ static Bytes32 fromHexStringStrict(final String str) { return wrap(BytesValues.fromRawHexString(str, -1, false)); } + static Bytes32 fromPlugin(final UnformattedData data) { + return wrap(data.getByteArray()); + } + @Override default int size() { return SIZE; diff --git a/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java b/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java index 6f1d8f29202..937897b8ce6 100644 --- a/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java +++ b/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java @@ -126,6 +126,10 @@ public BytesValue slice(final int i, final int length) { }; } + static BytesValue fromPlugin(UnformattedData data) { + return wrap(data.getByteArray()); + } + default BytesValue concat(final BytesValue value) { return wrap(this, value); } From 2eb20cd04a2c83d6886daed7382bb11c1b2a3c01 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 11:03:52 -0500 Subject: [PATCH 06/20] create and use log listener on blockchain Signed-off-by: Ratan Rai Sur --- .../logs/LogsSubscriptionService.java | 26 +++++++------------ .../besu/ethereum/chain/Blockchain.java | 4 ++- .../ethereum/chain/DefaultBlockchain.java | 13 ++++++++++ 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java index b4f49d323f7..93608ea90e7 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java @@ -17,13 +17,12 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.internal.results.LogResult; import org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.SubscriptionManager; import org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.request.SubscriptionType; -import org.hyperledger.besu.ethereum.chain.BlockAddedEvent; -import org.hyperledger.besu.ethereum.chain.BlockAddedObserver; -import org.hyperledger.besu.ethereum.chain.Blockchain; +import org.hyperledger.besu.ethereum.core.LogWithMetadata; import java.util.List; +import java.util.function.Consumer; -public class LogsSubscriptionService implements BlockAddedObserver { +public class LogsSubscriptionService implements Consumer { private final SubscriptionManager subscriptionManager; @@ -32,22 +31,15 @@ public LogsSubscriptionService(final SubscriptionManager subscriptionManager) { } @Override - public void onBlockAdded(final BlockAddedEvent event, final Blockchain __) { + public void accept(LogWithMetadata logWithMetadata) { final List logsSubscriptions = subscriptionManager.subscriptionsOfType(SubscriptionType.LOGS, LogsSubscription.class); - event - .getLogsWithMetadata() + logsSubscriptions.stream() + .filter(logsSubscription -> logsSubscription.getLogsQuery().matches(logWithMetadata)) .forEach( - logWithMetadata -> - logsSubscriptions.stream() - .filter( - logsSubscription -> - logsSubscription.getLogsQuery().matches(logWithMetadata)) - .forEach( - logsSubscription -> - subscriptionManager.sendMessage( - logsSubscription.getSubscriptionId(), - new LogResult(logWithMetadata)))); + logsSubscription -> + subscriptionManager.sendMessage( + logsSubscription.getSubscriptionId(), new LogResult(logWithMetadata))); } } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java index 0dfb304196a..e56b28c1ac6 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java @@ -18,6 +18,7 @@ import org.hyperledger.besu.ethereum.core.BlockBody; import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.Hash; +import org.hyperledger.besu.ethereum.core.LogWithMetadata; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.plugin.services.BesuEvents; @@ -25,6 +26,7 @@ import java.util.List; import java.util.Optional; +import java.util.function.Consumer; /** An interface for reading data from the blockchain. */ public interface Blockchain { @@ -193,7 +195,7 @@ default boolean contains(final Hash blockHash) { */ boolean removeBlockAddedObserver(long observerId); - long addLogListener(BesuEvents.LogListener logListener); + long addLogListener(Consumer logListener); boolean removeLogListener(long id); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java index 6ee1323afd0..6e877476c36 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java @@ -28,6 +28,7 @@ import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.metrics.BesuMetricCategory; +import org.hyperledger.besu.plugin.services.BesuEvents; import org.hyperledger.besu.plugin.services.MetricsSystem; import org.hyperledger.besu.util.InvalidConfigurationException; import org.hyperledger.besu.util.Subscribers; @@ -43,6 +44,7 @@ import java.util.NoSuchElementException; import java.util.Optional; import java.util.Set; +import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -550,6 +552,17 @@ public boolean removeBlockAddedObserver(final long observerId) { return blockAddedObservers.unsubscribe(observerId); } + @Override + public long addLogListener(Consumer logListener) { + return observeBlockAdded( + ((event, __) -> event.getLogsWithMetadata().forEach(logListener::accept))); + } + + @Override + public boolean removeLogListener(long id) { + return blockAddedObservers.unsubscribe(id); + } + @VisibleForTesting int observerCount() { return blockAddedObservers.getSubscriberCount(); From 8603139a6b27e789de5d7f5c30d5e4fc91e96a71 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 11:04:32 -0500 Subject: [PATCH 07/20] use another fromPlugin Signed-off-by: Ratan Rai Sur --- .../java/org/hyperledger/besu/services/BesuEventsImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index 67de0e8b42b..9f23fb152ea 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -107,10 +107,7 @@ public long addLogListener( final List> besuTopics = topics.stream() .map( - subList -> - subList.stream() - .map(bytes -> LogTopic.create(BytesValue.wrap(bytes.getByteArray()))) - .collect(toUnmodifiableList())) + subList -> subList.stream().map(LogTopic::fromPlugin).collect(toUnmodifiableList())) .collect(toUnmodifiableList()); final LogsQuery logsQuery = new LogsQuery(besuAddresses, besuTopics); From f5c7323674f98c06dad7ec120f844fd30ce35dcc Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 11:08:12 -0500 Subject: [PATCH 08/20] spotless Signed-off-by: Ratan Rai Sur --- .../tests/acceptance/dsl/node/ThreadBesuNodeRunner.java | 3 ++- .../main/java/org/hyperledger/besu/cli/BesuCommand.java | 2 +- .../java/org/hyperledger/besu/services/BesuEventsImpl.java | 6 ++---- .../org/hyperledger/besu/services/BesuEventsImplTest.java | 7 ++++++- .../org/hyperledger/besu/ethereum/chain/Blockchain.java | 1 - .../hyperledger/besu/ethereum/chain/DefaultBlockchain.java | 1 - .../hyperledger/besu/ethereum/core/LogWithMetadata.java | 4 ++-- .../org/hyperledger/besu/plugin/data/LogWithMetadata.java | 1 - 8 files changed, 13 insertions(+), 12 deletions(-) diff --git a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java index 498318d52a0..b46edbf73dd 100644 --- a/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java +++ b/acceptance-tests/dsl/src/main/java/org/hyperledger/besu/tests/acceptance/dsl/node/ThreadBesuNodeRunner.java @@ -167,7 +167,8 @@ public void startNode(final BesuNode node) { besuPluginContext.addService( BesuEvents.class, new BesuEventsImpl( - besuController.getProtocolContext().getBlockchain(), besuController.getProtocolManager().getBlockBroadcaster(), + besuController.getProtocolContext().getBlockchain(), + besuController.getProtocolManager().getBlockBroadcaster(), besuController.getTransactionPool(), besuController.getSyncState())); besuPluginContext.startPlugins(); diff --git a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java index ed429efeab4..7c269ea5b7b 100644 --- a/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java +++ b/besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java @@ -937,7 +937,7 @@ private BesuCommand startPlugins() { besuPluginContext.addService( BesuEvents.class, new BesuEventsImpl( - besuController.getProtocolContext().getBlockchain(), + besuController.getProtocolContext().getBlockchain(), besuController.getProtocolManager().getBlockBroadcaster(), besuController.getTransactionPool(), besuController.getSyncState())); diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index 9f23fb152ea..232920ee830 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -14,9 +14,10 @@ */ package org.hyperledger.besu.services; +import static java.util.stream.Collectors.toUnmodifiableList; + import org.hyperledger.besu.ethereum.api.query.LogsQuery; import org.hyperledger.besu.ethereum.chain.Blockchain; -import org.hyperledger.besu.ethereum.chain.MutableBlockchain; import org.hyperledger.besu.ethereum.core.LogTopic; import org.hyperledger.besu.ethereum.core.LogWithMetadata; import org.hyperledger.besu.ethereum.eth.sync.BlockBroadcaster; @@ -28,13 +29,10 @@ import org.hyperledger.besu.plugin.data.Quantity; import org.hyperledger.besu.plugin.data.UnformattedData; import org.hyperledger.besu.plugin.services.BesuEvents; -import org.hyperledger.besu.util.bytes.BytesValue; import java.util.List; import java.util.function.Supplier; -import static java.util.stream.Collectors.toUnmodifiableList; - public class BesuEventsImpl implements BesuEvents { private Blockchain blockchain; private final BlockBroadcaster blockBroadcaster; diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index 0cb24bcb3c3..1e9b97eb93c 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -119,7 +119,12 @@ public void setUp() { TransactionPoolConfiguration.builder().txPoolMaxSize(1).build()); syncState = new SyncState(mockBlockchain, mockEthPeers); - serviceImpl = new BesuEventsImpl(besuController.getProtocolContext().getBlockchain(), blockBroadcaster, transactionPool, syncState); + serviceImpl = + new BesuEventsImpl( + besuController.getProtocolContext().getBlockchain(), + blockBroadcaster, + transactionPool, + syncState); } @Test diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java index e56b28c1ac6..bbd8ea2b5aa 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java @@ -21,7 +21,6 @@ import org.hyperledger.besu.ethereum.core.LogWithMetadata; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; -import org.hyperledger.besu.plugin.services.BesuEvents; import org.hyperledger.besu.util.uint.UInt256; import java.util.List; diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java index 6e877476c36..d693add055e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java @@ -28,7 +28,6 @@ import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.metrics.BesuMetricCategory; -import org.hyperledger.besu.plugin.services.BesuEvents; import org.hyperledger.besu.plugin.services.MetricsSystem; import org.hyperledger.besu.util.InvalidConfigurationException; import org.hyperledger.besu.util.Subscribers; diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java index d46fd543266..43cdbbe5d56 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java @@ -16,6 +16,8 @@ */ package org.hyperledger.besu.ethereum.core; +import static java.util.stream.Collectors.toUnmodifiableList; + import org.hyperledger.besu.util.bytes.BytesValue; import java.util.ArrayList; @@ -23,8 +25,6 @@ import com.google.common.base.MoreObjects; -import static java.util.stream.Collectors.toUnmodifiableList; - public class LogWithMetadata extends Log implements org.hyperledger.besu.plugin.data.LogWithMetadata { diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java index 4964b76c984..44a76f1a8c6 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/data/LogWithMetadata.java @@ -14,7 +14,6 @@ */ package org.hyperledger.besu.plugin.data; -import com.google.protobuf.BytesValue; import org.hyperledger.besu.plugin.Unstable; import java.util.List; From 7dc90e7e58a8817304b0c4a0f6c2476d432a9315 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Tue, 12 Nov 2019 11:19:49 -0500 Subject: [PATCH 09/20] work through compilation and error-prone errors Signed-off-by: Ratan Rai Sur --- .../java/org/hyperledger/besu/RunnerBuilder.java | 2 +- .../hyperledger/besu/services/BesuEventsImpl.java | 6 ++++-- .../besu/services/BesuEventsImplTest.java | 7 +------ .../subscription/logs/LogsSubscriptionService.java | 8 ++------ .../logs/LogsSubscriptionServiceTest.java | 2 +- .../besu/ethereum/chain/DefaultBlockchain.java | 4 ++-- .../org/hyperledger/besu/ethereum/core/Address.java | 2 +- .../org/hyperledger/besu/ethereum/core/Hash.java | 2 +- .../hyperledger/besu/ethereum/core/LogTopic.java | 2 +- .../besu/ethereum/core/LogWithMetadata.java | 8 +++++++- .../besu/ethereum/vm/TestBlockchain.java | 13 +++++++++++++ .../org/hyperledger/besu/util/bytes/BytesValue.java | 2 +- 12 files changed, 35 insertions(+), 23 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java index 609330e6da7..44c2f0071c2 100644 --- a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java @@ -646,7 +646,7 @@ private void createLogsSubscriptionService( final LogsSubscriptionService logsSubscriptionService = new LogsSubscriptionService(subscriptionManager); - blockchain.observeBlockAdded(logsSubscriptionService); + blockchain.addLogListener(logsSubscriptionService); } private void createSyncingSubscriptionService( diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index 232920ee830..1ab81280dd6 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -97,7 +97,9 @@ public void removeSyncStatusListener(final long listenerIdentifier) { @Override public long addLogListener( - List
addresses, List> topics, LogListener logListener) { + final List
addresses, + final List> topics, + final LogListener logListener) { final List besuAddresses = addresses.stream() .map(org.hyperledger.besu.ethereum.core.Address::fromPlugin) @@ -119,7 +121,7 @@ public long addLogListener( } @Override - public void removeLogListener(long listenerIdentifier) {} + public void removeLogListener(final long listenerIdentifier) {} private static PropagatedBlockContext blockPropagatedContext( final Supplier blockHeaderSupplier, diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index 1e9b97eb93c..e769cc27de6 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -119,12 +119,7 @@ public void setUp() { TransactionPoolConfiguration.builder().txPoolMaxSize(1).build()); syncState = new SyncState(mockBlockchain, mockEthPeers); - serviceImpl = - new BesuEventsImpl( - besuController.getProtocolContext().getBlockchain(), - blockBroadcaster, - transactionPool, - syncState); + serviceImpl = new BesuEventsImpl(mockBlockchain, blockBroadcaster, transactionPool, syncState); } @Test diff --git a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java index 93608ea90e7..92f954a9ce4 100644 --- a/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java +++ b/ethereum/api/src/main/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionService.java @@ -19,7 +19,6 @@ import org.hyperledger.besu.ethereum.api.jsonrpc.websocket.subscription.request.SubscriptionType; import org.hyperledger.besu.ethereum.core.LogWithMetadata; -import java.util.List; import java.util.function.Consumer; public class LogsSubscriptionService implements Consumer { @@ -31,11 +30,8 @@ public LogsSubscriptionService(final SubscriptionManager subscriptionManager) { } @Override - public void accept(LogWithMetadata logWithMetadata) { - final List logsSubscriptions = - subscriptionManager.subscriptionsOfType(SubscriptionType.LOGS, LogsSubscription.class); - - logsSubscriptions.stream() + public void accept(final LogWithMetadata logWithMetadata) { + subscriptionManager.subscriptionsOfType(SubscriptionType.LOGS, LogsSubscription.class).stream() .filter(logsSubscription -> logsSubscription.getLogsQuery().matches(logWithMetadata)) .forEach( logsSubscription -> diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java index 25503ba2dde..0c2f903d61b 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java @@ -70,7 +70,7 @@ public class LogsSubscriptionServiceTest { @Before public void before() { logsSubscriptionService = new LogsSubscriptionService(subscriptionManager); - blockchain.observeBlockAdded(logsSubscriptionService); + blockchain.addLogListener(logsSubscriptionService); } @Test diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java index d693add055e..22be847cb5c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java @@ -552,13 +552,13 @@ public boolean removeBlockAddedObserver(final long observerId) { } @Override - public long addLogListener(Consumer logListener) { + public long addLogListener(final Consumer logListener) { return observeBlockAdded( ((event, __) -> event.getLogsWithMetadata().forEach(logListener::accept))); } @Override - public boolean removeLogListener(long id) { + public boolean removeLogListener(final long id) { return blockAddedObservers.unsubscribe(id); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java index af5bda6108f..1a17cb6ecfd 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java @@ -176,7 +176,7 @@ public static Address privateContractAddress( }))); } - public static Address fromPlugin(org.hyperledger.besu.plugin.data.Address logger) { + public static Address fromPlugin(final org.hyperledger.besu.plugin.data.Address logger) { return wrap(BytesValue.fromPlugin(logger)); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java index 930ad71163f..c8f64b19a6b 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java @@ -68,7 +68,7 @@ public static Hash fromHexStringLenient(final String str) { return new Hash(Bytes32.fromHexStringLenient(str)); } - public static Hash fromPlugin(org.hyperledger.besu.plugin.data.Hash blockHash) { + public static Hash fromPlugin(final org.hyperledger.besu.plugin.data.Hash blockHash) { return wrap(Bytes32.fromPlugin(blockHash)); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java index 6be247d67de..431c12ef2e3 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java @@ -58,7 +58,7 @@ public static LogTopic readFrom(final RLPInput in) { return new LogTopic(in.readBytesValue()); } - public static LogTopic fromPlugin(UnformattedData data) { + public static LogTopic fromPlugin(final UnformattedData data) { return wrap(BytesValue.fromPlugin(data)); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java index 43cdbbe5d56..866ac8f2e52 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java @@ -98,22 +98,27 @@ public static List generate( // The index of this log within the entire ordered list of logs associated with the block this log // belongs to. + @Override public int getLogIndex() { return logIndex; } + @Override public long getBlockNumber() { return blockNumber; } + @Override public Hash getBlockHash() { return blockHash; } + @Override public Hash getTransactionHash() { return transactionHash; } + @Override public int getTransactionIndex() { return transactionIndex; } @@ -133,6 +138,7 @@ public List getTopics() { return super.getTopics(); } + @Override public boolean isRemoved() { return removed; } @@ -153,7 +159,7 @@ public String toString() { } public static LogWithMetadata fromPlugin( - org.hyperledger.besu.plugin.data.LogWithMetadata pluginObject) { + final org.hyperledger.besu.plugin.data.LogWithMetadata pluginObject) { return new LogWithMetadata( pluginObject.getLogIndex(), pluginObject.getBlockNumber(), diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java index 83140fe118d..3b3bcc24308 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java @@ -24,6 +24,7 @@ import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import org.hyperledger.besu.ethereum.core.Hash; +import org.hyperledger.besu.ethereum.core.LogWithMetadata; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.util.bytes.BytesValue; @@ -33,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Consumer; /** * A blockchain mock for the Ethereum reference tests. @@ -148,6 +150,17 @@ public boolean removeBlockAddedObserver(final long observerId) { throw new NonDeterministicOperationException("Listening for new blocks is not deterministic"); } + @Override + public long addLogListener(final Consumer logListener) { + return observeBlockAdded( + ((event, __) -> event.getLogsWithMetadata().forEach(logListener::accept))); + } + + @Override + public boolean removeLogListener(final long id) { + return removeBlockAddedObserver(id); + } + public static class NonDeterministicOperationException extends RuntimeException { public NonDeterministicOperationException(final String message) { super(message); diff --git a/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java b/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java index 937897b8ce6..e14178719e0 100644 --- a/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java +++ b/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java @@ -126,7 +126,7 @@ public BytesValue slice(final int i, final int length) { }; } - static BytesValue fromPlugin(UnformattedData data) { + static BytesValue fromPlugin(final UnformattedData data) { return wrap(data.getByteArray()); } From a0e064c25959f22ed104fe9dd3a81c35801d3adb Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 12:10:48 -0500 Subject: [PATCH 10/20] testing Signed-off-by: Ratan Rai Sur --- .../besu/services/BesuEventsImpl.java | 4 +- .../besu/services/BesuEventsImplTest.java | 72 ++++++++++++++++--- 2 files changed, 65 insertions(+), 11 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index 1ab81280dd6..93677a90f94 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -121,7 +121,9 @@ public long addLogListener( } @Override - public void removeLogListener(final long listenerIdentifier) {} + public void removeLogListener(final long listenerIdentifier) { + blockchain.removeLogListener(listenerIdentifier); + } private static PropagatedBlockContext blockPropagatedContext( final Supplier blockHeaderSupplier, diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index e769cc27de6..ada7f715326 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -18,13 +18,16 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import org.hyperledger.besu.crypto.SECP256K1.KeyPair; import org.hyperledger.besu.ethereum.ProtocolContext; +import org.hyperledger.besu.ethereum.chain.DefaultBlockchain; import org.hyperledger.besu.ethereum.chain.MutableBlockchain; import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.BlockBody; +import org.hyperledger.besu.ethereum.core.BlockDataGenerator; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import org.hyperledger.besu.ethereum.core.TransactionTestFixture; import org.hyperledger.besu.ethereum.core.Wei; @@ -39,19 +42,25 @@ import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration; import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolFactory; +import org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec; import org.hyperledger.besu.ethereum.mainnet.TransactionValidator; import org.hyperledger.besu.ethereum.mainnet.ValidationResult; +import org.hyperledger.besu.ethereum.storage.keyvalue.KeyValueStoragePrefixedKeyBlockchainStorage; import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; +import org.hyperledger.besu.plugin.data.LogWithMetadata; import org.hyperledger.besu.plugin.data.PropagatedBlockContext; import org.hyperledger.besu.plugin.data.SyncStatus; import org.hyperledger.besu.plugin.data.Transaction; +import org.hyperledger.besu.services.kvstore.InMemoryKeyValueStorage; import org.hyperledger.besu.testutil.TestClock; import org.hyperledger.besu.util.uint.UInt256; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Optional; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; @@ -76,7 +85,6 @@ public class BesuEventsImplTest { @Mock private EthContext mockEthContext; @Mock private EthMessages mockEthMessages; @Mock private EthScheduler mockEthScheduler; - @Mock private MutableBlockchain mockBlockchain; @Mock private TransactionValidator mockTransactionValidator; @Mock private ProtocolSpec mockProtocolSpec; @Mock private WorldStateArchive mockWorldStateArchive; @@ -85,19 +93,23 @@ public class BesuEventsImplTest { private TransactionPool transactionPool; private BlockBroadcaster blockBroadcaster; private BesuEventsImpl serviceImpl; + private MutableBlockchain blockchain; + private final BlockDataGenerator gen = new BlockDataGenerator(); @Before public void setUp() { - fakeBlockHeader = - new org.hyperledger.besu.ethereum.core.BlockHeader( - null, null, null, null, null, null, null, null, 1, 1, 1, 1, null, null, 1, null); - - when(mockBlockchain.getBlockHeader(any())).thenReturn(Optional.of(fakeBlockHeader)); + blockchain = + spy( + DefaultBlockchain.createMutable( + gen.genesisBlock(), + new KeyValueStoragePrefixedKeyBlockchainStorage( + new InMemoryKeyValueStorage(), new MainnetBlockHeaderFunctions()), + new NoOpMetricsSystem())); when(mockEthContext.getEthMessages()).thenReturn(mockEthMessages); when(mockEthContext.getEthPeers()).thenReturn(mockEthPeers); when(mockEthContext.getScheduler()).thenReturn(mockEthScheduler); when(mockEthPeers.streamAvailablePeers()).thenReturn(Stream.empty()).thenReturn(Stream.empty()); - when(mockProtocolContext.getBlockchain()).thenReturn(mockBlockchain); + when(mockProtocolContext.getBlockchain()).thenReturn(blockchain); when(mockProtocolContext.getWorldStateArchive()).thenReturn(mockWorldStateArchive); when(mockProtocolSchedule.getByBlockNumber(anyLong())).thenReturn(mockProtocolSpec); when(mockProtocolSpec.getTransactionValidator()).thenReturn(mockTransactionValidator); @@ -107,6 +119,7 @@ public void setUp() { when(mockWorldStateArchive.get(any())).thenReturn(Optional.of(mockWorldState)); blockBroadcaster = new BlockBroadcaster(mockEthContext); + syncState = new SyncState(blockchain, mockEthPeers); transactionPool = TransactionPoolFactory.createTransactionPool( mockProtocolSchedule, @@ -117,9 +130,8 @@ public void setUp() { syncState, Wei.ZERO, TransactionPoolConfiguration.builder().txPoolMaxSize(1).build()); - syncState = new SyncState(mockBlockchain, mockEthPeers); - serviceImpl = new BesuEventsImpl(mockBlockchain, blockBroadcaster, transactionPool, syncState); + serviceImpl = new BesuEventsImpl(blockchain, blockBroadcaster, transactionPool, syncState); } @Test @@ -157,7 +169,10 @@ public void syncStatusEventDoesNotFireAfterUnsubscribe() { } private void setSyncTarget() { - syncState.setSyncTarget(mock(EthPeer.class), fakeBlockHeader); + syncState.setSyncTarget( + mock(EthPeer.class), + new org.hyperledger.besu.ethereum.core.BlockHeader( + null, null, null, null, null, null, null, null, 1, 1, 1, 1, null, null, 1, null)); } private void clearSyncTarget() { @@ -270,6 +285,43 @@ public void transactionDroppedEventDoesNotFireAfterUnsubscribe() { assertThat(result.get()).isNull(); } + @Test + public void logEventFiresAfterSubscribe() { + final List result = new ArrayList<>(); + blockchain.addLogListener(result::add); + + assertThat(result).isEmpty(); + final var block = + gen.block( + new BlockDataGenerator.BlockOptions() + .setParentHash(blockchain.getGenesisBlock().getHash())); + blockchain.appendBlock(block, gen.receipts(block)); + assertThat(result).hasSize(4); + } + + @Test + public void logEventDoesNotFireAfterUnsubscribe() { + final List result = new ArrayList<>(); + final long id = blockchain.addLogListener(result::add); + + assertThat(result).isEmpty(); + final var block = + gen.block( + new BlockDataGenerator.BlockOptions() + .setParentHash(blockchain.getGenesisBlock().getHash())); + blockchain.appendBlock(block, gen.receipts(block)); + assertThat(result).hasSize(4); + + result.clear(); + + serviceImpl.removeLogListener(id); + final var block2 = + gen.block(new BlockDataGenerator.BlockOptions().setParentHash(block.getHash())); + blockchain.appendBlock(block2, gen.receipts(block2)); + + assertThat(result).isEmpty(); + } + private Block generateBlock() { final BlockBody body = new BlockBody(Collections.emptyList(), Collections.emptyList()); return new Block(new BlockHeaderTestFixture().buildHeader(), body); From cb758464744a72a28e20b20ac97e37740784a438 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 12:15:28 -0500 Subject: [PATCH 11/20] plugin hash Signed-off-by: Ratan Rai Sur --- plugin-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index 6560ecc17ff..6f99885bb4e 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -56,7 +56,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'Uz20ItZSHoOEJdONKKwUtoyZxkCVF+bbw20IMmZfSZg=' + knownHash = 'Ujs2X79HwizXvWFdwY9H9O1QCfHHCPLw/bZxcCH2yE4=' } check.dependsOn('checkAPIChanges') From c9010b5cb00533ffe0cdfd8c20b0dbe69c41d8c0 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 12:18:33 -0500 Subject: [PATCH 12/20] remove unnecessary spy Signed-off-by: Ratan Rai Sur --- .../besu/services/BesuEventsImplTest.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index ada7f715326..1de73430ba1 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -18,7 +18,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import org.hyperledger.besu.crypto.SECP256K1.KeyPair; @@ -99,12 +98,11 @@ public class BesuEventsImplTest { @Before public void setUp() { blockchain = - spy( - DefaultBlockchain.createMutable( - gen.genesisBlock(), - new KeyValueStoragePrefixedKeyBlockchainStorage( - new InMemoryKeyValueStorage(), new MainnetBlockHeaderFunctions()), - new NoOpMetricsSystem())); + DefaultBlockchain.createMutable( + gen.genesisBlock(), + new KeyValueStoragePrefixedKeyBlockchainStorage( + new InMemoryKeyValueStorage(), new MainnetBlockHeaderFunctions()), + new NoOpMetricsSystem()); when(mockEthContext.getEthMessages()).thenReturn(mockEthMessages); when(mockEthContext.getEthPeers()).thenReturn(mockEthPeers); when(mockEthContext.getScheduler()).thenReturn(mockEthScheduler); From 9173cb916cbd7b82d6be70459384aa9750293c5f Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 12:19:10 -0500 Subject: [PATCH 13/20] error prone Signed-off-by: Ratan Rai Sur --- .../java/org/hyperledger/besu/services/BesuEventsImplTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index 1de73430ba1..2e7ffb945a9 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -88,7 +88,6 @@ public class BesuEventsImplTest { @Mock private ProtocolSpec mockProtocolSpec; @Mock private WorldStateArchive mockWorldStateArchive; @Mock private WorldState mockWorldState; - private org.hyperledger.besu.ethereum.core.BlockHeader fakeBlockHeader; private TransactionPool transactionPool; private BlockBroadcaster blockBroadcaster; private BesuEventsImpl serviceImpl; From 2647f993bdbf10444ec83e32a8dfe352c72b9ed2 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 12:29:23 -0500 Subject: [PATCH 14/20] renames and moving some stuff to default implementation in the interface Signed-off-by: Ratan Rai Sur --- .../org/hyperledger/besu/RunnerBuilder.java | 2 +- .../besu/services/BesuEventsImpl.java | 4 ++-- .../besu/services/BesuEventsImplTest.java | 4 ++-- .../blockcreation/IbftMiningCoordinator.java | 2 +- .../logs/LogsSubscriptionServiceTest.java | 2 +- .../besu/ethereum/chain/Blockchain.java | 19 ++++++++++++++----- .../ethereum/chain/DefaultBlockchain.java | 14 +------------- .../besu/ethereum/worldstate/Pruner.java | 2 +- .../ethereum/chain/DefaultBlockchainTest.java | 10 +++++----- .../besu/ethereum/vm/TestBlockchain.java | 15 +-------------- .../node/PeerPermissionsAdapter.java | 2 +- 11 files changed, 30 insertions(+), 46 deletions(-) diff --git a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java index 44c2f0071c2..5fe15eb54a3 100644 --- a/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java +++ b/besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java @@ -646,7 +646,7 @@ private void createLogsSubscriptionService( final LogsSubscriptionService logsSubscriptionService = new LogsSubscriptionService(subscriptionManager); - blockchain.addLogListener(logsSubscriptionService); + blockchain.observeLogs(logsSubscriptionService); } private void createSyncingSubscriptionService( diff --git a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java index 93677a90f94..04db4b46a13 100644 --- a/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java +++ b/besu/src/main/java/org/hyperledger/besu/services/BesuEventsImpl.java @@ -112,7 +112,7 @@ public long addLogListener( final LogsQuery logsQuery = new LogsQuery(besuAddresses, besuTopics); - return blockchain.addLogListener( + return blockchain.observeLogs( logWithMetadata -> { if (logsQuery.matches(LogWithMetadata.fromPlugin(logWithMetadata))) { logListener.onLogEmitted(logWithMetadata); @@ -122,7 +122,7 @@ public long addLogListener( @Override public void removeLogListener(final long listenerIdentifier) { - blockchain.removeLogListener(listenerIdentifier); + blockchain.removeObserver(listenerIdentifier); } private static PropagatedBlockContext blockPropagatedContext( diff --git a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java index 2e7ffb945a9..29934ad45fb 100644 --- a/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java +++ b/besu/src/test/java/org/hyperledger/besu/services/BesuEventsImplTest.java @@ -285,7 +285,7 @@ public void transactionDroppedEventDoesNotFireAfterUnsubscribe() { @Test public void logEventFiresAfterSubscribe() { final List result = new ArrayList<>(); - blockchain.addLogListener(result::add); + blockchain.observeLogs(result::add); assertThat(result).isEmpty(); final var block = @@ -299,7 +299,7 @@ public void logEventFiresAfterSubscribe() { @Test public void logEventDoesNotFireAfterUnsubscribe() { final List result = new ArrayList<>(); - final long id = blockchain.addLogListener(result::add); + final long id = blockchain.observeLogs(result::add); assertThat(result).isEmpty(); final var block = diff --git a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java index 66ae5c3f331..acd713a78a2 100644 --- a/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java +++ b/consensus/ibft/src/main/java/org/hyperledger/besu/consensus/ibft/blockcreation/IbftMiningCoordinator.java @@ -87,7 +87,7 @@ public void start() { @Override public void stop() { if (state.compareAndSet(State.RUNNING, State.STOPPED)) { - blockchain.removeBlockAddedObserver(blockAddedObserverId); + blockchain.removeObserver(blockAddedObserverId); ibftProcessor.stop(); // Make sure the processor has stopped before shutting down the executors try { diff --git a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java index 0c2f903d61b..96833dee975 100644 --- a/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java +++ b/ethereum/api/src/test/java/org/hyperledger/besu/ethereum/api/jsonrpc/websocket/subscription/logs/LogsSubscriptionServiceTest.java @@ -70,7 +70,7 @@ public class LogsSubscriptionServiceTest { @Before public void before() { logsSubscriptionService = new LogsSubscriptionService(subscriptionManager); - blockchain.addLogListener(logsSubscriptionService); + blockchain.observeLogs(logsSubscriptionService); } @Test diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java index bbd8ea2b5aa..f4db89b20e5 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/Blockchain.java @@ -186,15 +186,24 @@ default boolean contains(final Hash blockHash) { */ long observeBlockAdded(BlockAddedObserver observer); + /** + * Adds an observer that will get called on for every added and removed log when a new block is + * added. + * + *

No guarantees are made about the order in which the observers are invoked. + * + * @param logObserver the observer to call + * @return the observer ID that can be used to remove it later. + */ + default long observeLogs(final Consumer logObserver) { + return observeBlockAdded(((event, __) -> event.getLogsWithMetadata().forEach(logObserver))); + } + /** * Removes an previously added observer of any type. * * @param observerId the ID of the observer to remove * @return {@code true} if the observer was removed; otherwise {@code false} */ - boolean removeBlockAddedObserver(long observerId); - - long addLogListener(Consumer logListener); - - boolean removeLogListener(long id); + boolean removeObserver(long observerId); } diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java index 22be847cb5c..713d7184350 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchain.java @@ -43,7 +43,6 @@ import java.util.NoSuchElementException; import java.util.Optional; import java.util.Set; -import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -547,21 +546,10 @@ public long observeBlockAdded(final BlockAddedObserver observer) { } @Override - public boolean removeBlockAddedObserver(final long observerId) { + public boolean removeObserver(final long observerId) { return blockAddedObservers.unsubscribe(observerId); } - @Override - public long addLogListener(final Consumer logListener) { - return observeBlockAdded( - ((event, __) -> event.getLogsWithMetadata().forEach(logListener::accept))); - } - - @Override - public boolean removeLogListener(final long id) { - return blockAddedObservers.unsubscribe(id); - } - @VisibleForTesting int observerCount() { return blockAddedObservers.getSubscriberCount(); diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java index 6ed33a020d4..0de65e217e2 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/Pruner.java @@ -98,7 +98,7 @@ public void stop() { if (state.compareAndSet(State.RUNNING, State.STOPPED)) { LOG.info("Stopping Pruner."); pruningStrategy.cleanup(); - blockchain.removeBlockAddedObserver(blockAddedObserverId); + blockchain.removeObserver(blockAddedObserverId); executorService.shutdownNow(); } } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java index 9785ee07b4b..7ec4c028fb2 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/chain/DefaultBlockchainTest.java @@ -750,7 +750,7 @@ public void blockAddedObserver_removeNonexistentObserver() { final Block genesisBlock = gen.genesisBlock(); final DefaultBlockchain blockchain = createMutableBlockchain(kvStore, genesisBlock); - assertThat(blockchain.removeBlockAddedObserver(7)).isFalse(); + assertThat(blockchain.removeObserver(7)).isFalse(); } @Test @@ -764,7 +764,7 @@ public void blockAddedObserver_addRemoveSingle() { final long observerId = blockchain.observeBlockAdded((block, chain) -> {}); assertThat(blockchain.observerCount()).isEqualTo(1); - assertThat(blockchain.removeBlockAddedObserver(observerId)).isTrue(); + assertThat(blockchain.removeObserver(observerId)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(0); } @@ -796,13 +796,13 @@ public void blockAddedObserver_addRemoveMultiple() { final long observerId3 = blockchain.observeBlockAdded((block, chain) -> {}); assertThat(blockchain.observerCount()).isEqualTo(3); - assertThat(blockchain.removeBlockAddedObserver(observerId1)).isTrue(); + assertThat(blockchain.removeObserver(observerId1)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(2); - assertThat(blockchain.removeBlockAddedObserver(observerId2)).isTrue(); + assertThat(blockchain.removeObserver(observerId2)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(1); - assertThat(blockchain.removeBlockAddedObserver(observerId3)).isTrue(); + assertThat(blockchain.removeObserver(observerId3)).isTrue(); assertThat(blockchain.observerCount()).isEqualTo(0); } diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java index 3b3bcc24308..aff14d2e6db 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/vm/TestBlockchain.java @@ -24,7 +24,6 @@ import org.hyperledger.besu.ethereum.core.BlockHeader; import org.hyperledger.besu.ethereum.core.BlockHeaderTestFixture; import org.hyperledger.besu.ethereum.core.Hash; -import org.hyperledger.besu.ethereum.core.LogWithMetadata; import org.hyperledger.besu.ethereum.core.Transaction; import org.hyperledger.besu.ethereum.core.TransactionReceipt; import org.hyperledger.besu.util.bytes.BytesValue; @@ -34,7 +33,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.function.Consumer; /** * A blockchain mock for the Ethereum reference tests. @@ -146,21 +144,10 @@ public long observeBlockAdded(final BlockAddedObserver observer) { } @Override - public boolean removeBlockAddedObserver(final long observerId) { + public boolean removeObserver(final long observerId) { throw new NonDeterministicOperationException("Listening for new blocks is not deterministic"); } - @Override - public long addLogListener(final Consumer logListener) { - return observeBlockAdded( - ((event, __) -> event.getLogsWithMetadata().forEach(logListener::accept))); - } - - @Override - public boolean removeLogListener(final long id) { - return removeBlockAddedObserver(id); - } - public static class NonDeterministicOperationException extends RuntimeException { public NonDeterministicOperationException(final String message) { super(message); diff --git a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java index 136644f4630..0bdda1b198a 100644 --- a/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java +++ b/ethereum/permissioning/src/main/java/org/hyperledger/besu/ethereum/permissioning/node/PeerPermissionsAdapter.java @@ -125,7 +125,7 @@ private boolean inboundIsPermitted(final Peer localNode, final Peer remotePeer) @Override public void close() { - blockchain.removeBlockAddedObserver(blockchainListenId); + blockchain.removeObserver(blockchainListenId); nodePermissioningController.unsubscribeFromUpdates(nodePermissioningListenId); } } From 12d7be307f5202f702892cfc779c7c2c31228b82 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 12:36:55 -0500 Subject: [PATCH 15/20] doc Signed-off-by: Ratan Rai Sur --- .../besu/plugin/services/BesuEvents.java | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java index d7b9220b664..d63af8c4306 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java @@ -47,14 +47,14 @@ public interface BesuEvents { * Add a listener watching new blocks propagated. * * @param blockPropagatedListener The listener that will accept a BlockHeader as the event. - * @return an object to be used as an identifier when de-registering the event. + * @return an id to be used as an identifier when de-registering the event. */ long addBlockPropagatedListener(BlockPropagatedListener blockPropagatedListener); /** * Remove the blockAdded listener from besu notifications. * - * @param listenerIdentifier The instance that was returned from addBlockAddedListener; + * @param listenerIdentifier The id that was returned from addBlockAddedListener; */ void removeBlockPropagatedListener(long listenerIdentifier); @@ -63,14 +63,14 @@ public interface BesuEvents { * * @param transactionAddedListener The listener that will accept the Transaction object as the * event. - * @return an object to be used as an identifier when de-registering the event. + * @return an id to be used as an identifier when de-registering the event. */ long addTransactionAddedListener(TransactionAddedListener transactionAddedListener); /** * Remove the blockAdded listener from besu notifications. * - * @param listenerIdentifier The instance that was returned from addTransactionAddedListener; + * @param listenerIdentifier The id that was returned from addTransactionAddedListener; */ void removeTransactionAddedListener(long listenerIdentifier); @@ -79,14 +79,14 @@ public interface BesuEvents { * * @param transactionDroppedListener The listener that will accept the Transaction object as the * event. - * @return an object to be used as an identifier when de-registering the event. + * @return an id to be used as an identifier when de-registering the event. */ long addTransactionDroppedListener(TransactionDroppedListener transactionDroppedListener); /** * Remove the transactionDropped listener from besu notifications. * - * @param listenerIdentifier The instance that was returned from addTransactionDroppedListener; + * @param listenerIdentifier The id that was returned from addTransactionDroppedListener; */ void removeTransactionDroppedListener(long listenerIdentifier); @@ -94,30 +94,32 @@ public interface BesuEvents { * Add a listener watching the synchronizer status. * * @param syncStatusListener The listener that will accept the SyncStatus object as the event. - * @return an object to be used as an identifier when de-registering the event. + * @return The id to be used as an identifier when de-registering the event. */ long addSyncStatusListener(SyncStatusListener syncStatusListener); /** - * Remove the logs listener from besu notifications. + * Remove the sync status listener from besu notifications. * - * @param listenerIdentifier The instance that was returned from addTransactionDroppedListener; + * @param listenerIdentifier The id that was returned from addTransactionDroppedListener; */ void removeSyncStatusListener(long listenerIdentifier); /** - * REPLACE ME + * Add a listener that consumes every log (both added and removed) that matches the filter + * parameters when a new block is added to the blockchain. * - * @param logListener REPLACEME - * @return REPLACEME + * @param logListener The listener that will accept the log. + * @return The id of the listener to be referred to used to remove the listener. */ long addLogListener( List

addresses, List> topics, LogListener logListener); /** - * REPLACE ME + * Remove the log listener with the associated id. * - * @param listenerIdentifier REPLACEME + * @param listenerIdentifier The id of the listener that was returned when the listener was + * created. */ void removeLogListener(long listenerIdentifier); @@ -169,10 +171,15 @@ interface SyncStatusListener { void onSyncStatusChanged(Optional syncStatus); } - /** replaceme */ + /** The listener interface for receiving log events. */ interface LogListener { - /** @param logWithMetadata replaceme */ + /** + * Invoked for each log (both added and removed) when a new block is added to the blockchain. + * + * @param logWithMetadata the log with associated metadata. see + * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getfilterchanges + */ void onLogEmitted(LogWithMetadata logWithMetadata); } } From 45ebbf78ee6057cb9317e9f5023e9b463ab8a88c Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 12:38:12 -0500 Subject: [PATCH 16/20] plugin hash Signed-off-by: Ratan Rai Sur --- plugin-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index 6f99885bb4e..ce6578d4a01 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -56,7 +56,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = 'Ujs2X79HwizXvWFdwY9H9O1QCfHHCPLw/bZxcCH2yE4=' + knownHash = '+WtHTG1OnOpVmk9mZQa6P8AlNCeN/SwmcHp6UBk04oo=' } check.dependsOn('checkAPIChanges') From d0969aa94100a349ef1e6a2aaf827729fe115615 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 13:03:28 -0500 Subject: [PATCH 17/20] remove getters Signed-off-by: Ratan Rai Sur --- .../besu/ethereum/core/LogWithMetadata.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java index 866ac8f2e52..3aecfac29c7 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogWithMetadata.java @@ -123,21 +123,6 @@ public int getTransactionIndex() { return transactionIndex; } - @Override - public Address getLogger() { - return super.getLogger(); - } - - @Override - public BytesValue getData() { - return super.getData(); - } - - @Override - public List getTopics() { - return super.getTopics(); - } - @Override public boolean isRemoved() { return removed; From 4386b7e58e0812d586f85e0ed8694987e4afe20e Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 13:16:04 -0500 Subject: [PATCH 18/20] check for castability instead of always unwrapping and wrapping Signed-off-by: Ratan Rai Sur --- .../main/java/org/hyperledger/besu/ethereum/core/Address.java | 2 +- .../src/main/java/org/hyperledger/besu/ethereum/core/Hash.java | 2 +- .../main/java/org/hyperledger/besu/ethereum/core/LogTopic.java | 2 +- util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java | 2 +- .../main/java/org/hyperledger/besu/util/bytes/BytesValue.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java index 1a17cb6ecfd..bbc14af4ed0 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Address.java @@ -177,7 +177,7 @@ public static Address privateContractAddress( } public static Address fromPlugin(final org.hyperledger.besu.plugin.data.Address logger) { - return wrap(BytesValue.fromPlugin(logger)); + return logger instanceof Address ? (Address) logger : wrap(BytesValue.fromPlugin(logger)); } @Override diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java index c8f64b19a6b..45e72d78057 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/Hash.java @@ -69,7 +69,7 @@ public static Hash fromHexStringLenient(final String str) { } public static Hash fromPlugin(final org.hyperledger.besu.plugin.data.Hash blockHash) { - return wrap(Bytes32.fromPlugin(blockHash)); + return blockHash instanceof Hash ? (Hash) blockHash : wrap(Bytes32.fromPlugin(blockHash)); } @Override diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java index 431c12ef2e3..2f3a0039905 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/LogTopic.java @@ -59,7 +59,7 @@ public static LogTopic readFrom(final RLPInput in) { } public static LogTopic fromPlugin(final UnformattedData data) { - return wrap(BytesValue.fromPlugin(data)); + return data instanceof LogTopic ? (LogTopic) data : wrap(BytesValue.fromPlugin(data)); } /** diff --git a/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java b/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java index d787f7f4f1c..1a2bf34b839 100644 --- a/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java +++ b/util/src/main/java/org/hyperledger/besu/util/bytes/Bytes32.java @@ -170,7 +170,7 @@ static Bytes32 fromHexStringStrict(final String str) { } static Bytes32 fromPlugin(final UnformattedData data) { - return wrap(data.getByteArray()); + return data instanceof Bytes32 ? (Bytes32) data : wrap(data.getByteArray()); } @Override diff --git a/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java b/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java index e14178719e0..2a7d00ec55d 100644 --- a/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java +++ b/util/src/main/java/org/hyperledger/besu/util/bytes/BytesValue.java @@ -127,7 +127,7 @@ public BytesValue slice(final int i, final int length) { } static BytesValue fromPlugin(final UnformattedData data) { - return wrap(data.getByteArray()); + return data instanceof BytesValue ? (BytesValue) data : wrap(data.getByteArray()); } default BytesValue concat(final BytesValue value) { From 01999b422483e8e9e67ff50050fa18af126d46d9 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 13:25:41 -0500 Subject: [PATCH 19/20] doc Signed-off-by: Ratan Rai Sur --- .../java/org/hyperledger/besu/plugin/services/BesuEvents.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java index d63af8c4306..5ae591ab2ab 100644 --- a/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java +++ b/plugin-api/src/main/java/org/hyperledger/besu/plugin/services/BesuEvents.java @@ -109,6 +109,8 @@ public interface BesuEvents { * Add a listener that consumes every log (both added and removed) that matches the filter * parameters when a new block is added to the blockchain. * + * @param addresses The addresses from which the log filter will be created + * @param topics The topics from which the log filter will be created * @param logListener The listener that will accept the log. * @return The id of the listener to be referred to used to remove the listener. */ From 159a3d7d959070d86dfb451daf5d3fb6eae37218 Mon Sep 17 00:00:00 2001 From: Ratan Rai Sur Date: Wed, 13 Nov 2019 13:27:00 -0500 Subject: [PATCH 20/20] plugin hash Signed-off-by: Ratan Rai Sur --- plugin-api/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin-api/build.gradle b/plugin-api/build.gradle index ce6578d4a01..e8680d80837 100644 --- a/plugin-api/build.gradle +++ b/plugin-api/build.gradle @@ -56,7 +56,7 @@ Calculated : ${currentHash} tasks.register('checkAPIChanges', FileStateChecker) { description = "Checks that the API for the Plugin-API project does not change without deliberate thought" files = sourceSets.main.allJava.files - knownHash = '+WtHTG1OnOpVmk9mZQa6P8AlNCeN/SwmcHp6UBk04oo=' + knownHash = 'P9SmXjXCQeQOsnXM9pfXKUkJkrsX48MafIDEx+tHmFs=' } check.dependsOn('checkAPIChanges')