From 0d0713bad5e289b0cde57ae69707d41c3fadd834 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 8 Mar 2019 13:47:35 -0500 Subject: [PATCH 01/31] Remove optional setting of pubKeyScript We want to have a deterministic dao state. The PubKeyScript in the TxOutput was the only optional field which was only set in the dumpBlockchainData program argument was set as it was only required for the json dump for the explorer. It has 50 bytes of data which is about 20% of the txOutput data size. We prefer atm to avoid additional complexity which would be created if we would handle that optional field (e.g. exclude from hash creation). The property might be useful as well for other use cases in future. --- .../src/main/java/bisq/core/dao/node/full/RpcService.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/node/full/RpcService.java b/core/src/main/java/bisq/core/dao/node/full/RpcService.java index 89d52c1b36c..76f44813ca6 100644 --- a/core/src/main/java/bisq/core/dao/node/full/RpcService.java +++ b/core/src/main/java/bisq/core/dao/node/full/RpcService.java @@ -74,7 +74,6 @@ public class RpcService { private final String rpcPassword; private final String rpcPort; private final String rpcBlockPort; - private final boolean dumpBlockchainData; private BtcdClient client; private BtcdDaemon daemon; @@ -92,8 +91,7 @@ public class RpcService { @Inject public RpcService(Preferences preferences, @Named(DaoOptionKeys.RPC_PORT) String rpcPort, - @Named(DaoOptionKeys.RPC_BLOCK_NOTIFICATION_PORT) String rpcBlockPort, - @Named(DaoOptionKeys.DUMP_BLOCKCHAIN_DATA) boolean dumpBlockchainData) { + @Named(DaoOptionKeys.RPC_BLOCK_NOTIFICATION_PORT) String rpcBlockPort) { this.rpcUser = preferences.getRpcUser(); this.rpcPassword = preferences.getRpcPw(); @@ -109,8 +107,6 @@ public RpcService(Preferences preferences, "18443"; // regtest this.rpcBlockPort = rpcBlockPort != null && !rpcBlockPort.isEmpty() ? rpcBlockPort : "5125"; - this.dumpBlockchainData = dumpBlockchainData; - log.info("Version of btcd-cli4j library: {}", BtcdCli4jVersion.VERSION); } @@ -305,7 +301,7 @@ private RawTx getTxFromRawTransaction(RawTransaction rawBtcTx, com.neemre.btcdcl // We don't support raw MS which are the only case where scriptPubKey.getAddresses()>1 String address = scriptPubKey.getAddresses() != null && scriptPubKey.getAddresses().size() == 1 ? scriptPubKey.getAddresses().get(0) : null; - PubKeyScript pubKeyScript = dumpBlockchainData ? new PubKeyScript(scriptPubKey) : null; + PubKeyScript pubKeyScript = new PubKeyScript(scriptPubKey); return new RawTxOutput(rawBtcTxOutput.getN(), rawBtcTxOutput.getValue().movePointRight(8).longValue(), rawBtcTx.getTxId(), From 22c03884d5cee7a50c38fac632b6ec39f6501162 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 8 Mar 2019 13:51:49 -0500 Subject: [PATCH 02/31] Add comment --- .../bisq/core/dao/state/model/blockchain/BaseTxOutput.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/state/model/blockchain/BaseTxOutput.java b/core/src/main/java/bisq/core/dao/state/model/blockchain/BaseTxOutput.java index e8b5015ccf9..62f5b20c706 100644 --- a/core/src/main/java/bisq/core/dao/state/model/blockchain/BaseTxOutput.java +++ b/core/src/main/java/bisq/core/dao/state/model/blockchain/BaseTxOutput.java @@ -45,9 +45,10 @@ public abstract class BaseTxOutput implements ImmutableDaoStateModel { protected final long value; protected final String txId; - // Only set if dumpBlockchainData is true + // Before v0.9.6 it was only set if dumpBlockchainData was set to true but we changed that with 0.9.6 + // so that is is always set. We still need to support it because of backward compatibility. @Nullable - protected final PubKeyScript pubKeyScript; + protected final PubKeyScript pubKeyScript; // Has about 50 bytes, total size of TxOutput is about 300 bytes. @Nullable protected final String address; @Nullable @@ -69,7 +70,6 @@ public BaseTxOutput(int index, this.address = address; this.opReturnData = opReturnData; this.blockHeight = blockHeight; - } From 40b6505fd9d062096cf6d0d04fb762348187026b Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 8 Mar 2019 20:23:44 -0500 Subject: [PATCH 03/31] Add monitoring for hash of DaoState --- .../main/java/bisq/common/app/Capability.java | 3 +- common/src/main/proto/pb.proto | 12 + .../main/java/bisq/core/dao/DaoModule.java | 2 + .../src/main/java/bisq/core/dao/DaoSetup.java | 6 +- .../dao/governance/period/CycleService.java | 4 +- .../voteresult/VoteResultService.java | 1 + .../bisq/core/dao/state/DaoStateListener.java | 3 + .../bisq/core/dao/state/DaoStateService.java | 45 ++++ .../dao/state/monitoring/DaoStateHash.java | 71 ++++++ .../monitoring/DaoStateMonitorListener.java | 22 ++ .../monitoring/DaoStateMonitoringService.java | 216 ++++++++++++++++++ .../monitoring/DaoStateNetworkConsensus.java | 33 +++ .../messages/NewDaoStateHashMessage.java | 71 ++++++ .../network/CoreNetworkProtoResolver.java | 3 + .../core/setup/CoreNetworkCapabilities.java | 1 + 15 files changed, 489 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/DaoStateNetworkConsensus.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java diff --git a/common/src/main/java/bisq/common/app/Capability.java b/common/src/main/java/bisq/common/app/Capability.java index 8c5b2c62316..83e4d0f1136 100644 --- a/common/src/main/java/bisq/common/app/Capability.java +++ b/common/src/main/java/bisq/common/app/Capability.java @@ -31,5 +31,6 @@ public enum Capability { PROPOSAL, BLIND_VOTE, ACK_MSG, - BSQ_BLOCK + BSQ_BLOCK, + DAO_STATE } diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index 6f6adf5c0d8..fe26d1a118e 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -57,6 +57,7 @@ message NetworkEnvelope { AddPersistableNetworkPayloadMessage add_persistable_network_payload_message = 31; AckMessage ack_message = 32; RepublishGovernanceDataRequest republish_governance_data_request = 33; + NewDaoStateHashMessage new_dao_state_hash_message = 34; } } @@ -324,6 +325,7 @@ message NewBlockBroadcastMessage { message RepublishGovernanceDataRequest { } + /////////////////////////////////////////////////////////////////////////////////////////// // Payload /////////////////////////////////////////////////////////////////////////////////////////// @@ -1715,6 +1717,16 @@ message DaoStateStore { BsqState bsq_state = 1; } +message DaoStateHash { + int32 blockHeight = 1; + bytes hash = 2; + bytes prev_hash = 3; +} + +message NewDaoStateHashMessage { + DaoStateHash dao_state_hash = 1; +} + /////////////////////////////////////////////////////////////////////////////////////////// // Misc /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/dao/DaoModule.java b/core/src/main/java/bisq/core/dao/DaoModule.java index 4d394bb2e43..505ef9eb4d2 100644 --- a/core/src/main/java/bisq/core/dao/DaoModule.java +++ b/core/src/main/java/bisq/core/dao/DaoModule.java @@ -78,6 +78,7 @@ import bisq.core.dao.state.DaoStateStorageService; import bisq.core.dao.state.GenesisTxInfo; import bisq.core.dao.state.model.DaoState; +import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import bisq.core.dao.state.unconfirmed.UnconfirmedBsqChangeOutputListService; import bisq.common.app.AppModule; @@ -116,6 +117,7 @@ protected void configure() { bind(DaoStateService.class).in(Singleton.class); bind(DaoStateSnapshotService.class).in(Singleton.class); bind(DaoStateStorageService.class).in(Singleton.class); + bind(DaoStateMonitoringService.class).in(Singleton.class); bind(UnconfirmedBsqChangeOutputListService.class).in(Singleton.class); bind(ExportJsonFilesService.class).in(Singleton.class); diff --git a/core/src/main/java/bisq/core/dao/DaoSetup.java b/core/src/main/java/bisq/core/dao/DaoSetup.java index 591f65af26f..f4aa6f44330 100644 --- a/core/src/main/java/bisq/core/dao/DaoSetup.java +++ b/core/src/main/java/bisq/core/dao/DaoSetup.java @@ -35,6 +35,7 @@ import bisq.core.dao.node.BsqNodeProvider; import bisq.core.dao.node.explorer.ExportJsonFilesService; import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import com.google.inject.Inject; @@ -69,7 +70,8 @@ public DaoSetup(BsqNodeProvider bsqNodeProvider, ProofOfBurnService proofOfBurnService, DaoFacade daoFacade, ExportJsonFilesService exportJsonFilesService, - DaoKillSwitch daoKillSwitch) { + DaoKillSwitch daoKillSwitch, + DaoStateMonitoringService daoStateMonitoringService) { bsqNode = bsqNodeProvider.getBsqNode(); @@ -92,6 +94,8 @@ public DaoSetup(BsqNodeProvider bsqNodeProvider, daoSetupServices.add(daoFacade); daoSetupServices.add(exportJsonFilesService); daoSetupServices.add(daoKillSwitch); + daoSetupServices.add(daoStateMonitoringService); + daoSetupServices.add(bsqNodeProvider.getBsqNode()); } diff --git a/core/src/main/java/bisq/core/dao/governance/period/CycleService.java b/core/src/main/java/bisq/core/dao/governance/period/CycleService.java index e869c006c39..65d8540caae 100644 --- a/core/src/main/java/bisq/core/dao/governance/period/CycleService.java +++ b/core/src/main/java/bisq/core/dao/governance/period/CycleService.java @@ -79,7 +79,7 @@ public void start() { public void onNewBlockHeight(int blockHeight) { if (blockHeight != genesisBlockHeight) maybeCreateNewCycle(blockHeight, daoStateService.getCycles()) - .ifPresent(daoStateService.getCycles()::add); + .ifPresent(daoStateService::addCycle); } @@ -88,7 +88,7 @@ public void onNewBlockHeight(int blockHeight) { /////////////////////////////////////////////////////////////////////////////////////////// public void addFirstCycle() { - daoStateService.getCycles().add(getFirstCycle()); + daoStateService.addCycle(getFirstCycle()); } public int getCycleIndex(Cycle cycle) { diff --git a/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java b/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java index 11524b39632..c1fa7b4ea17 100644 --- a/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java +++ b/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java @@ -235,6 +235,7 @@ private void maybeCalculateVoteResult(int chainHeight) { } // Those which did not get accepted will be added to the nonBsq map + // FIXME add check for cycle as now we call addNonBsqTxOutput for past rejected comp requests as well daoStateService.getIssuanceCandidateTxOutputs().stream() .filter(txOutput -> !daoStateService.isIssuanceTx(txOutput.getTxId())) .forEach(daoStateService::addNonBsqTxOutput); diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateListener.java b/core/src/main/java/bisq/core/dao/state/DaoStateListener.java index 5918b917098..54d574b364f 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateListener.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateListener.java @@ -32,4 +32,7 @@ default void onParseBlockComplete(Block block) { default void onParseBlockCompleteAfterBatchProcessing(Block block) { } + + default void onDaoStateChanged(Block block) { + } } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index fdc18986ab6..ee36df6b315 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -71,6 +71,7 @@ public class DaoStateService implements DaoSetupService { private final List daoStateListeners = new CopyOnWriteArrayList<>(); @Getter private boolean parseBlockChainComplete; + private boolean allowDaoStateChange; /////////////////////////////////////////////////////////////////////////////////////////// @@ -95,6 +96,8 @@ public void addListeners() { @Override public void start() { + allowDaoStateChange = true; + assertDaoStateChange(); daoState.setChainHeight(genesisTxInfo.getGenesisBlockHeight()); } @@ -104,6 +107,9 @@ public void start() { /////////////////////////////////////////////////////////////////////////////////////////// public void applySnapshot(DaoState snapshot) { + //TODO + assertDaoStateChange(); + log.info("Apply snapshot with chain height {}", snapshot.getChainHeight()); daoState.setChainHeight(snapshot.getChainHeight()); @@ -144,6 +150,11 @@ DaoState getClone(DaoState snapshotCandidate) { return DaoState.getClone(snapshotCandidate); } + public byte[] getDaoStateHash() { + return daoState.toProtoMessage().toByteArray(); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // ChainHeight @@ -162,6 +173,11 @@ public LinkedList getCycles() { return daoState.getCycles(); } + public void addCycle(Cycle firstCycle) { + assertDaoStateChange(); + getCycles().add(firstCycle); + } + @Nullable public Cycle getCurrentCycle() { return !getCycles().isEmpty() ? getCycles().getLast() : null; @@ -190,12 +206,14 @@ public Optional getStartHeightOfNextCycle(int blockHeight) { // First we get the blockHeight set public void onNewBlockHeight(int blockHeight) { + allowDaoStateChange = true; daoState.setChainHeight(blockHeight); daoStateListeners.forEach(listener -> listener.onNewBlockHeight(blockHeight)); } // Second we get the block added with empty txs public void onNewBlockWithEmptyTxs(Block block) { + assertDaoStateChange(); if (daoState.getBlocks().isEmpty() && block.getHeight() != getGenesisBlockHeight()) { log.warn("We don't have any blocks yet and we received a block which is not the genesis block. " + "We ignore that block as the first block need to be the genesis block. " + @@ -221,8 +239,14 @@ public void onParseBlockComplete(Block block) { // We use 2 different handlers as we don't want to update domain listeners during batch processing of all // blocks as that cause performance issues. In earlier versions when we updated at each block it took // 50 sec. for 4000 blocks, after that change it was about 4 sec. + // Clients if (parseBlockChainComplete) daoStateListeners.forEach(l -> l.onParseBlockCompleteAfterBatchProcessing(block)); + + // Here listeners must not trigger any state change in the DAO as we trigger the validation service to + // generate a hash of the state. + allowDaoStateChange = false; + daoStateListeners.forEach(l -> l.onDaoStateChanged(block)); } // Called after parsing of all pending blocks is completed @@ -410,10 +434,12 @@ public Map getUnspentTxOutputMap() { } public void addUnspentTxOutput(TxOutput txOutput) { + assertDaoStateChange(); getUnspentTxOutputMap().put(txOutput.getKey(), txOutput); } public void removeUnspentTxOutput(TxOutput txOutput) { + assertDaoStateChange(); getUnspentTxOutputMap().remove(txOutput.getKey()); } @@ -547,6 +573,7 @@ public Set getIssuanceCandidateTxOutputs() { /////////////////////////////////////////////////////////////////////////////////////////// public void addIssuance(Issuance issuance) { + assertDaoStateChange(); daoState.getIssuanceMap().put(issuance.getTxId(), issuance); } @@ -595,7 +622,10 @@ public long getTotalIssuedAmount(IssuanceType issuanceType) { // Non-BSQ /////////////////////////////////////////////////////////////////////////////////////////// + //TODO we never remove NonBsqTxOutput! + //FIXME called at result phase even if there is not a new one (passed txo from prev. cycle which was already added) public void addNonBsqTxOutput(TxOutput txOutput) { + assertDaoStateChange(); checkArgument(txOutput.getTxOutputType() == TxOutputType.ISSUANCE_CANDIDATE_OUTPUT, "txOutput must be type ISSUANCE_CANDIDATE_OUTPUT"); log.info("addNonBsqTxOutput: txOutput={}", txOutput); @@ -827,6 +857,7 @@ public void confiscateBond(String lockupTxId) { } private void doConfiscateBond(String lockupTxId) { + assertDaoStateChange(); log.warn("TxId {} added to confiscatedLockupTxIdList.", lockupTxId); daoState.getConfiscatedLockupTxList().add(lockupTxId); } @@ -855,6 +886,7 @@ public boolean isConfiscatedUnlockTxOutput(String unlockTxId) { /////////////////////////////////////////////////////////////////////////////////////////// public void setNewParam(int blockHeight, Param param, String paramValue) { + assertDaoStateChange(); List paramChangeList = daoState.getParamChangeList(); getStartHeightOfNextCycle(blockHeight) .ifPresent(heightOfNewCycle -> { @@ -903,6 +935,7 @@ public String getParamValue(Param param, int blockHeight) { /////////////////////////////////////////////////////////////////////////////////////////// public void setSpentInfo(TxOutputKey txOutputKey, SpentInfo spentInfo) { + assertDaoStateChange(); daoState.getSpentInfoMap().put(txOutputKey, spentInfo); } @@ -920,6 +953,7 @@ public List getEvaluatedProposalList() { } public void addEvaluatedProposalSet(Set evaluatedProposals) { + assertDaoStateChange(); evaluatedProposals.stream() .filter(e -> !daoState.getEvaluatedProposalList().contains(e)) .forEach(daoState.getEvaluatedProposalList()::add); @@ -930,6 +964,7 @@ public List getDecryptedBallotsWithMeritsList() { } public void addDecryptedBallotsWithMeritsSet(Set decryptedBallotsWithMeritsSet) { + assertDaoStateChange(); decryptedBallotsWithMeritsSet.stream() .filter(e -> !daoState.getDecryptedBallotsWithMeritsList().contains(e)) .forEach(daoState.getDecryptedBallotsWithMeritsList()::add); @@ -964,5 +999,15 @@ public void addDaoStateListener(DaoStateListener listener) { public void removeDaoStateListener(DaoStateListener listener) { daoStateListeners.remove(listener); } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void assertDaoStateChange() { + if (!allowDaoStateChange) + throw new RuntimeException("We got a call which would change the daoState outside of the allowed event phase"); + } } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java new file mode 100644 index 00000000000..2697003685e --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java @@ -0,0 +1,71 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring; + +import bisq.common.proto.network.NetworkPayload; +import bisq.common.proto.persistable.PersistablePayload; +import bisq.common.util.Utilities; + +import io.bisq.generated.protobuffer.PB; + +import com.google.protobuf.ByteString; + +import lombok.Value; + +@Value +public class DaoStateHash implements PersistablePayload, NetworkPayload { + private final int blockHeight; + private final byte[] hash; + // For first block the prevHash is an empty byte array + private final byte[] prevHash; + + DaoStateHash(int blockHeight, byte[] hash, byte[] prevHash) { + this.blockHeight = blockHeight; + this.hash = hash; + this.prevHash = prevHash; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public PB.DaoStateHash toProtoMessage() { + final PB.DaoStateHash.Builder builder = PB.DaoStateHash.newBuilder() + .setBlockHeight(blockHeight) + .setHash(ByteString.copyFrom(hash)) + .setPrevHash(ByteString.copyFrom(prevHash)); + return builder.build(); + } + + public static DaoStateHash fromProto(PB.DaoStateHash proto) { + return new DaoStateHash(proto.getBlockHeight(), + proto.getHash().toByteArray(), + proto.getPrevHash().toByteArray()); + } + + @Override + public String toString() { + return "DaoStateHash{" + + "\n blockHeight=" + blockHeight + + ",\n hash=" + Utilities.bytesAsHexString(hash) + + ",\n prevHash=" + Utilities.bytesAsHexString(prevHash) + + "\n}"; + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java new file mode 100644 index 00000000000..50c426712b5 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java @@ -0,0 +1,22 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring; + +public interface DaoStateMonitorListener { + void onDaoStateNetworkConsensusChanged(); +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java new file mode 100644 index 00000000000..2c64e3123b3 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java @@ -0,0 +1,216 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring; + +import bisq.core.dao.DaoSetupService; +import bisq.core.dao.state.DaoStateListener; +import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.model.blockchain.Block; +import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; + +import bisq.network.p2p.network.Connection; +import bisq.network.p2p.network.MessageListener; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.BroadcastHandler; +import bisq.network.p2p.peers.Broadcaster; +import bisq.network.p2p.storage.messages.BroadcastMessage; + +import bisq.common.crypto.Hash; +import bisq.common.proto.network.NetworkEnvelope; + +import javax.inject.Inject; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +/** + * Validates the DaoState with using a hash fo the complete daoState and make it accessible to the network for + * monitoring purpose so we can detect quickly if any consensus issue arise. The data does not contain any private user + * data so sharing it on demand has no privacy concerns. + * + * //todo broadcast msg with blockHeight, daoStateHashChainHash and daoStateHashList + * listen to such msg and compare state, if not matching report to listeners + * // maybe request full state? + * + * add p2p network data for monitoring + */ +@Slf4j +public class DaoStateMonitoringService implements DaoStateListener, DaoSetupService, MessageListener { + private final DaoStateService daoStateService; + private final NetworkNode networkNode; + private final Broadcaster broadcaster; + private final LinkedList daoStateHashChain = new LinkedList<>(); + private final Map> daoStateHashesFromNetwork = new HashMap<>(); + + // key is blockHeight, value is ratio of matching + @Getter + private final Map daoStateNetworkConsensusMap = new HashMap<>(); + private final List daoStateMonitorListeners = new CopyOnWriteArrayList<>(); + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + public DaoStateMonitoringService(DaoStateService daoStateService, + NetworkNode networkNode, + Broadcaster broadcaster) { + this.daoStateService = daoStateService; + this.networkNode = networkNode; + this.broadcaster = broadcaster; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoSetupService + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void addListeners() { + this.daoStateService.addDaoStateListener(this); + networkNode.addMessageListener(this); + } + + @Override + public void start() { + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoStateListener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onDaoStateChanged(Block block) { + //TODO handle reorgs + + // We don't want to broadcast when batch processing + if (daoStateService.isParseBlockChainComplete()) { + + byte[] prevHash = !daoStateHashChain.isEmpty() ? daoStateHashChain.getLast().getHash() : new byte[0]; + DaoStateHash daoStateHash = new DaoStateHash(block.getHeight(), + Hash.getSha256Ripemd160hash(daoStateService.getDaoStateHash()), + prevHash); + daoStateHashChain.add(daoStateHash); + + broadcaster.broadcast(new NewDaoStateHashMessage(daoStateHash), + networkNode.getNodeAddress(), + new BroadcastHandler.Listener() { + @Override + public void onBroadcasted(BroadcastMessage message, int numOfCompletedBroadcasts) { + } + + @Override + public void onBroadcastedToFirstPeer(BroadcastMessage message) { + } + + @Override + public void onBroadcastCompleted(BroadcastMessage message, int numOfCompletedBroadcasts, int numOfFailedBroadcasts) { + daoStateNetworkConsensusChanged(); + } + + @Override + public void onBroadcastFailed(String errorMessage) { + } + }, + true); + } + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // MessageListener implementation + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { + if (networkEnvelope instanceof NewDaoStateHashMessage) { + log.info("We received a NewDaoStateHashMessage from peer {}", connection.getPeersNodeAddressOptional()); + + NewDaoStateHashMessage newDaoStateHashMessage = (NewDaoStateHashMessage) networkEnvelope; + int blockHeight = newDaoStateHashMessage.getDaoStateHash().getBlockHeight(); + daoStateHashesFromNetwork.putIfAbsent(blockHeight, new ArrayList<>()); + // TODO can we receive multiple msg from same peer? I think not. + daoStateHashesFromNetwork.get(blockHeight).add(newDaoStateHashMessage.getDaoStateHash()); + + daoStateNetworkConsensusChanged(); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public String getDaoStateNetworkConsensusInfo() { + StringBuilder sb = new StringBuilder(); + daoStateNetworkConsensusMap.forEach((key, value) -> { + sb.append("Block height: ").append(key) + .append(" / Received dao states from peers: ").append(value.getNumNetworkMessages()) + .append(" / Peers with different dao state: ").append(value.getMisMatch().size()) + .append("\n"); + }); + return sb.toString(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Listeners + /////////////////////////////////////////////////////////////////////////////////////////// + + public void addDaoStateListener(DaoStateMonitorListener listener) { + daoStateMonitorListeners.add(listener); + } + + public void removeDaoStateListener(DaoStateMonitorListener listener) { + daoStateMonitorListeners.remove(listener); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void daoStateNetworkConsensusChanged() { + daoStateHashesFromNetwork.forEach((key, list) -> { + int height = key; + getMyDaoStateHashByHeight(height).ifPresent(myDaoStateHash -> { + List misMatch = list.stream() + .filter(e -> !Arrays.equals(e.getHash(), myDaoStateHash.getHash())) + .collect(Collectors.toList()); + daoStateNetworkConsensusMap.put(height, new DaoStateNetworkConsensus(misMatch, list.size())); + }); + }); + + daoStateMonitorListeners.forEach(DaoStateMonitorListener::onDaoStateNetworkConsensusChanged); + } + + private Optional getMyDaoStateHashByHeight(int height) { + return daoStateHashChain.stream().filter(e -> e.getBlockHeight() == height).findAny(); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateNetworkConsensus.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateNetworkConsensus.java new file mode 100644 index 00000000000..e19c81be612 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateNetworkConsensus.java @@ -0,0 +1,33 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring; + +import java.util.List; + +import lombok.Value; + +@Value +public class DaoStateNetworkConsensus { + private final List misMatch; + private final int numNetworkMessages; + + public DaoStateNetworkConsensus(List misMatch, int numNetworkMessages) { + this.misMatch = misMatch; + this.numNetworkMessages = numNetworkMessages; + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java b/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java new file mode 100644 index 00000000000..eef6b1b9d62 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java @@ -0,0 +1,71 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring.messages; + +import bisq.core.dao.state.monitoring.DaoStateHash; + +import bisq.network.p2p.storage.messages.BroadcastMessage; +import bisq.network.p2p.storage.payload.CapabilityRequiringPayload; + +import bisq.common.app.Capabilities; +import bisq.common.app.Capability; +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class NewDaoStateHashMessage extends BroadcastMessage implements CapabilityRequiringPayload { + private final DaoStateHash daoStateHash; + + public NewDaoStateHashMessage(DaoStateHash daoStateHash) { + this(daoStateHash, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private NewDaoStateHashMessage(DaoStateHash daoStateHash, int messageVersion) { + super(messageVersion); + this.daoStateHash = daoStateHash; + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setNewDaoStateHashMessage(PB.NewDaoStateHashMessage.newBuilder() + .setDaoStateHash(daoStateHash.toProtoMessage())) + .build(); + } + + public static NetworkEnvelope fromProto(PB.NewDaoStateHashMessage proto, int messageVersion) { + return new NewDaoStateHashMessage(DaoStateHash.fromProto(proto.getDaoStateHash()), + messageVersion); + } + + @Override + public Capabilities getRequiredCapabilities() { + return new Capabilities(Capability.DAO_STATE); + } +} diff --git a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java index 9a119c57c14..4110484d5f2 100644 --- a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java @@ -31,6 +31,7 @@ import bisq.core.dao.node.messages.GetBlocksRequest; import bisq.core.dao.node.messages.GetBlocksResponse; import bisq.core.dao.node.messages.NewBlockBroadcastMessage; +import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; import bisq.core.filter.Filter; import bisq.core.offer.OfferPayload; import bisq.core.offer.messages.OfferAvailabilityRequest; @@ -153,6 +154,8 @@ public NetworkEnvelope fromProto(PB.NetworkEnvelope proto) throws ProtobufferExc return GetBlocksResponse.fromProto(proto.getGetBlocksResponse(), messageVersion); case NEW_BLOCK_BROADCAST_MESSAGE: return NewBlockBroadcastMessage.fromProto(proto.getNewBlockBroadcastMessage(), messageVersion); + case NEW_DAO_STATE_HASH_MESSAGE: + return NewDaoStateHashMessage.fromProto(proto.getNewDaoStateHashMessage(), messageVersion); case ADD_PERSISTABLE_NETWORK_PAYLOAD_MESSAGE: return AddPersistableNetworkPayloadMessage.fromProto(proto.getAddPersistableNetworkPayloadMessage(), this, messageVersion); diff --git a/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java b/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java index 1bf5ce2c90f..a36b129f3c8 100644 --- a/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java +++ b/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java @@ -39,6 +39,7 @@ public static void setSupportedCapabilities(BisqEnvironment bisqEnvironment) { supportedCapabilities.add(Capability.PROPOSAL); supportedCapabilities.add(Capability.BLIND_VOTE); supportedCapabilities.add(Capability.BSQ_BLOCK); + supportedCapabilities.add(Capability.DAO_STATE); String isFullDaoNode = bisqEnvironment.getProperty(DaoOptionKeys.FULL_DAO_NODE, String.class, ""); if (isFullDaoNode != null && !isFullDaoNode.isEmpty()) From 51ec876edc62270c1e8aa62900d663362cb5afdf Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 9 Mar 2019 09:11:51 -0500 Subject: [PATCH 04/31] Add removeLinebreaks parameter to toTruncatedString --- .../main/java/bisq/common/util/Utilities.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/bisq/common/util/Utilities.java b/common/src/main/java/bisq/common/util/Utilities.java index 000a48c899a..11c72ac8a84 100644 --- a/common/src/main/java/bisq/common/util/Utilities.java +++ b/common/src/main/java/bisq/common/util/Utilities.java @@ -161,7 +161,7 @@ public static ScheduledThreadPoolExecutor getScheduledThreadPoolExecutor(String public static boolean isMacMenuBarDarkMode() { try { // check for exit status only. Once there are more modes than "dark" and "default", we might need to analyze string contents.. - final Process process = Runtime.getRuntime().exec(new String[] {"defaults", "read", "-g", "AppleInterfaceStyle"}); + Process process = Runtime.getRuntime().exec(new String[]{"defaults", "read", "-g", "AppleInterfaceStyle"}); process.waitFor(100, TimeUnit.MILLISECONDS); return process.exitValue() == 0; } catch (IOException | InterruptedException | IllegalThreadStateException ex) { @@ -512,15 +512,29 @@ public static void checkCryptoPolicySetup() throws NoSuchAlgorithmException, Lim throw new LimitedKeyStrengthException(); } + public static String toTruncatedString(Object message) { + return toTruncatedString(message, 200, true); + } + public static String toTruncatedString(Object message, int maxLength) { - if (message != null) { - return StringUtils.abbreviate(message.toString(), maxLength).replace("\n", ""); - } - return "null"; + return toTruncatedString(message, maxLength, true); } - public static String toTruncatedString(Object message) { - return toTruncatedString(message, 200); + public static String toTruncatedString(Object message, boolean removeLinebreaks) { + return toTruncatedString(message, 200, removeLinebreaks); + } + + public static String toTruncatedString(Object message, int maxLength, boolean removeLinebreaks) { + if (message == null) + return "null"; + + + String result = StringUtils.abbreviate(message.toString(), maxLength); + if (removeLinebreaks) + return result.replace("\n", ""); + + return result; + } public static String getRandomPrefix(int minLength, int maxLength) { From fcd7997582f29ee3badf63d2a1dabe575e74c19d Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 10 Mar 2019 22:10:12 -0500 Subject: [PATCH 05/31] Create chain of dao state hashes for monitoring consensus issues We create a chain of hashes of the dao state starting from the genesis block height and using the previous hash in the hash. This ensures that the history need to be correct if a particular hash at a block height is correct. We request from seed nodes the last 10 hashes and broadcast to our peers our hash at each new block. We build our list in memory and listen on the new onSnapShotApplied event to start building our chain from the genesis height up to the last snapshot block and after that from each parsed block. If we detect a mismatch we store it in a collection and the UI can show a warning to the user. We added also the onDaoStateChanged handler to the DaoStateListener. This event is called after all parsing is completed and listeners have completed their work. We must not use time based delays in the listener code otherwise we would get changed our dao state after that event. To detect such we added a assert method to throw an exception if the dao state gets changed after the allowDaoStateChange is set to false. --- common/src/main/proto/pb.proto | 10 + .../bisq/core/dao/state/DaoStateListener.java | 5 + .../bisq/core/dao/state/DaoStateService.java | 2 + .../dao/state/monitoring/DaoStateHash.java | 8 + .../monitoring/DaoStateMonitorListener.java | 22 -- .../monitoring/DaoStateMonitoringService.java | 312 +++++++++++++----- .../dao/state/monitoring/NetworkDaoState.java | 52 +++ ...kConsensus.java => PeersDaoStateHash.java} | 17 +- .../messages/GetDaoStateHashRequest.java | 75 +++++ .../messages/GetDaoStateHashResponse.java | 88 +++++ .../messages/NewDaoStateHashMessage.java | 10 +- .../network/RequestDaoStateHashHandler.java | 212 ++++++++++++ .../network/CoreNetworkProtoResolver.java | 6 + 13 files changed, 713 insertions(+), 106 deletions(-) delete mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java rename core/src/main/java/bisq/core/dao/state/monitoring/{DaoStateNetworkConsensus.java => PeersDaoStateHash.java} (65%) create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashResponse.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index fe26d1a118e..dafaee4db66 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -58,6 +58,8 @@ message NetworkEnvelope { AckMessage ack_message = 32; RepublishGovernanceDataRequest republish_governance_data_request = 33; NewDaoStateHashMessage new_dao_state_hash_message = 34; + GetDaoStateHashRequest get_dao_state_hash_request = 35; + GetDaoStateHashResponse get_dao_state_hash_response = 36; } } @@ -325,6 +327,14 @@ message NewBlockBroadcastMessage { message RepublishGovernanceDataRequest { } +message GetDaoStateHashRequest { + int32 nonce = 1; +} + +message GetDaoStateHashResponse { + repeated DaoStateHash dao_state_hashes = 1; + int32 request_nonce = 2; +} /////////////////////////////////////////////////////////////////////////////////////////// // Payload diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateListener.java b/core/src/main/java/bisq/core/dao/state/DaoStateListener.java index 54d574b364f..68a9ff259b4 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateListener.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateListener.java @@ -33,6 +33,11 @@ default void onParseBlockComplete(Block block) { default void onParseBlockCompleteAfterBatchProcessing(Block block) { } + // Called after the parsing of a block is complete and we do not allow any change in the daoState until the next + // block arrives. default void onDaoStateChanged(Block block) { } + + default void onSnapshotApplied() { + } } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index ee36df6b315..947f4a85200 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -140,6 +140,8 @@ public void applySnapshot(DaoState snapshot) { daoState.getDecryptedBallotsWithMeritsList().clear(); daoState.getDecryptedBallotsWithMeritsList().addAll(snapshot.getDecryptedBallotsWithMeritsList()); + + daoStateListeners.forEach(l -> l.onSnapshotApplied()); } public DaoState getClone() { diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java index 2697003685e..ed6b764bcbd 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java @@ -27,9 +27,17 @@ import lombok.Value; +/** + * Contains the blockHeight, the hash and the previous hash of the dao state. + * As the hash is created from the dao state at the particular height includes the previous hash we get the history of + * the full chain included and we know if the hash matches at a particular height that all the past blocks need to match + * as well. + */ @Value public class DaoStateHash implements PersistablePayload, NetworkPayload { private final int blockHeight; + // Hash includes prev hash as well as dao state hash. With adding prev hash we can ensure the all the history is + // matching if our hash matches. private final byte[] hash; // For first block the prevHash is an empty byte array private final byte[] prevHash; diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java deleted file mode 100644 index 50c426712b5..00000000000 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitorListener.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.dao.state.monitoring; - -public interface DaoStateMonitorListener { - void onDaoStateNetworkConsensusChanged(); -} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java index 2c64e3123b3..f287b5216ee 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java @@ -20,57 +20,90 @@ import bisq.core.dao.DaoSetupService; import bisq.core.dao.state.DaoStateListener; import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.GenesisTxInfo; import bisq.core.dao.state.model.blockchain.Block; +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; +import bisq.core.dao.state.monitoring.network.RequestDaoStateHashHandler; +import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.MessageListener; import bisq.network.p2p.network.NetworkNode; -import bisq.network.p2p.peers.BroadcastHandler; import bisq.network.p2p.peers.Broadcaster; -import bisq.network.p2p.storage.messages.BroadcastMessage; +import bisq.network.p2p.peers.PeerManager; +import bisq.common.UserThread; import bisq.common.crypto.Hash; import bisq.common.proto.network.NetworkEnvelope; import javax.inject.Inject; +import org.apache.commons.lang3.ArrayUtils; + import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Random; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import javax.annotation.Nullable; + +import static com.google.common.base.Preconditions.checkArgument; + /** - * Validates the DaoState with using a hash fo the complete daoState and make it accessible to the network for - * monitoring purpose so we can detect quickly if any consensus issue arise. The data does not contain any private user + * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for + * so we can detect quickly if any consensus issue arise. The data does not contain any private user * data so sharing it on demand has no privacy concerns. * - * //todo broadcast msg with blockHeight, daoStateHashChainHash and daoStateHashList - * listen to such msg and compare state, if not matching report to listeners - * // maybe request full state? + * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start + * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao + * state from the peers is already covering the next block we have not received yet. So we only take data in account + * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our + * state to the peers to not get ignored it in case they have not received the block yet. * - * add p2p network data for monitoring + * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height + * of the latest block in the snapshot. + * + * TODO maybe request full state? + * TODO add p2p network data for monitoring + * TODO auto recovery */ @Slf4j public class DaoStateMonitoringService implements DaoStateListener, DaoSetupService, MessageListener { + public interface DaoStateMonitorListener { + void onChange(); + } + private final DaoStateService daoStateService; private final NetworkNode networkNode; + private final PeerManager peerManager; private final Broadcaster broadcaster; + private final GenesisTxInfo genesisTxInfo; + + // Our chain of dao state changes private final LinkedList daoStateHashChain = new LinkedList<>(); - private final Map> daoStateHashesFromNetwork = new HashMap<>(); - // key is blockHeight, value is ratio of matching + // Lookup map for list of peersDaoStateHashes by block height + private final Map> peersDaoStateHashMap = new HashMap<>(); + + // List of network data state objects. Sorted by blockHeight descending @Getter - private final Map daoStateNetworkConsensusMap = new HashMap<>(); + private final List networkDaoStateList = new ArrayList<>(); + + private final Map requestDaoStateHashHandlerMap = new HashMap<>(); private final List daoStateMonitorListeners = new CopyOnWriteArrayList<>(); + private boolean parseBlockChainComplete; /////////////////////////////////////////////////////////////////////////////////////////// @@ -80,10 +113,14 @@ public class DaoStateMonitoringService implements DaoStateListener, DaoSetupServ @Inject public DaoStateMonitoringService(DaoStateService daoStateService, NetworkNode networkNode, - Broadcaster broadcaster) { + PeerManager peerManager, + Broadcaster broadcaster, + GenesisTxInfo genesisTxInfo) { this.daoStateService = daoStateService; this.networkNode = networkNode; + this.peerManager = peerManager; this.broadcaster = broadcaster; + this.genesisTxInfo = genesisTxInfo; } @@ -94,7 +131,6 @@ public DaoStateMonitoringService(DaoStateService daoStateService, @Override public void addListeners() { this.daoStateService.addDaoStateListener(this); - networkNode.addMessageListener(this); } @Override @@ -107,58 +143,59 @@ public void start() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onDaoStateChanged(Block block) { - //TODO handle reorgs - - // We don't want to broadcast when batch processing - if (daoStateService.isParseBlockChainComplete()) { - - byte[] prevHash = !daoStateHashChain.isEmpty() ? daoStateHashChain.getLast().getHash() : new byte[0]; - DaoStateHash daoStateHash = new DaoStateHash(block.getHeight(), - Hash.getSha256Ripemd160hash(daoStateService.getDaoStateHash()), - prevHash); - daoStateHashChain.add(daoStateHash); - - broadcaster.broadcast(new NewDaoStateHashMessage(daoStateHash), - networkNode.getNodeAddress(), - new BroadcastHandler.Listener() { - @Override - public void onBroadcasted(BroadcastMessage message, int numOfCompletedBroadcasts) { - } + public void onParseBlockChainComplete() { + parseBlockChainComplete = true; - @Override - public void onBroadcastedToFirstPeer(BroadcastMessage message) { - } + // We wait for processing messages until we have completed batch processing + networkNode.addMessageListener(this); + requestHashesFromAllConnectedSeedNodes(); + } - @Override - public void onBroadcastCompleted(BroadcastMessage message, int numOfCompletedBroadcasts, int numOfFailedBroadcasts) { - daoStateNetworkConsensusChanged(); - } + @Override + public void onDaoStateChanged(Block block) { + handleDaoStateChanged(block); - @Override - public void onBroadcastFailed(String errorMessage) { - } - }, - true); + if (daoStateHashChain.isEmpty()) { + daoStateService.getBlocks().stream().filter(b -> b.getHeight() != block.getHeight()).forEach(this::handleDaoStateChanged); } } + @Override + public void onSnapshotApplied() { + // We could got a reset from a reorg, so we clear all and start over from the genesis block. + daoStateHashChain.clear(); + peersDaoStateHashMap.clear(); + networkDaoStateList.clear(); + requestDaoStateHashHandlerMap.clear(); + + daoStateService.getBlocks().forEach(this::handleDaoStateChanged); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // MessageListener implementation /////////////////////////////////////////////////////////////////////////////////////////// @Override public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { - if (networkEnvelope instanceof NewDaoStateHashMessage) { - log.info("We received a NewDaoStateHashMessage from peer {}", connection.getPeersNodeAddressOptional()); - + if (parseBlockChainComplete && networkEnvelope instanceof NewDaoStateHashMessage) { NewDaoStateHashMessage newDaoStateHashMessage = (NewDaoStateHashMessage) networkEnvelope; - int blockHeight = newDaoStateHashMessage.getDaoStateHash().getBlockHeight(); - daoStateHashesFromNetwork.putIfAbsent(blockHeight, new ArrayList<>()); - // TODO can we receive multiple msg from same peer? I think not. - daoStateHashesFromNetwork.get(blockHeight).add(newDaoStateHashMessage.getDaoStateHash()); - - daoStateNetworkConsensusChanged(); + log.info("We received a NewDaoStateHashMessage {} from peer {}", + newDaoStateHashMessage, connection.getPeersNodeAddressOptional()); + + // We ignore dao state data in case we receive them before we have received the block. + if (newDaoStateHashMessage.getDaoStateHash().getBlockHeight() <= daoStateService.getChainHeight()) { + addToDaoStateHashesFromNetwork(newDaoStateHashMessage.getDaoStateHash(), connection.getPeersNodeAddressOptional()); + } + } else if (networkEnvelope instanceof GetDaoStateHashRequest) { + GetDaoStateHashRequest getDaoStateHashRequest = (GetDaoStateHashRequest) networkEnvelope; + List daoStateHashes = new ArrayList<>(daoStateHashChain); + daoStateHashes.sort(Comparator.comparingInt(DaoStateHash::getBlockHeight)); + + // We send only last 10 items + List subList = daoStateHashes.subList(daoStateHashes.size() - 10, daoStateHashes.size()); + GetDaoStateHashResponse response = new GetDaoStateHashResponse(subList, getDaoStateHashRequest.getNonce()); + connection.sendMessage(response); } } @@ -167,15 +204,45 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { // API /////////////////////////////////////////////////////////////////////////////////////////// - public String getDaoStateNetworkConsensusInfo() { - StringBuilder sb = new StringBuilder(); - daoStateNetworkConsensusMap.forEach((key, value) -> { - sb.append("Block height: ").append(key) - .append(" / Received dao states from peers: ").append(value.getNumNetworkMessages()) - .append(" / Peers with different dao state: ").append(value.getMisMatch().size()) - .append("\n"); - }); - return sb.toString(); + public boolean isDaoStateOutOfSyncWithNetworkAndCritical() { + if (networkDaoStateList.stream().allMatch(e -> e.getMisMatchList().isEmpty())) { + return false; + } + + List outOfSyncWithNetworkItems = getOutOfSyncWithNetworkItems(); + // should be covered by isDaoStateOutOfSyncWithNetwork anyway + if (outOfSyncWithNetworkItems.isEmpty()) { + return false; + } + + ArrayList list = new ArrayList<>(outOfSyncWithNetworkItems); + Comparator comparator = Comparator.comparing(e -> e.getMisMatchList().size()); + comparator.reversed(); + list.sort(comparator); + NetworkDaoState itemWithHighestNumMismatch = list.get(0); + Optional item = networkDaoStateList.stream() + .filter(e -> e.getHeight() == itemWithHighestNumMismatch.getHeight()) + .findAny(); + if (item.isPresent()) { + // If the number of reported diff. state is more then 10% of the total received states we consider it as + // critical. We want to avoid warnings to users in case there are some single nodes out of sync. + // If we have less then 4 messages we don't check for the mismatch ratio. + int messages = item.get().getNumNetworkMessages(); + double mismatchRation = (double) itemWithHighestNumMismatch.getMisMatchList().size() / (double) messages; + boolean result = messages > 4 && mismatchRation > 0.1; + if (result) + return true; + } + + // We consider it a critical condition if the block out of sync is older than 4 blocks. Typical reorgs in Bitcoin + // are usually shallow. + NetworkDaoState lastItem = outOfSyncWithNetworkItems.get(outOfSyncWithNetworkItems.size() - 1); + int depth = daoStateService.getChainHeight() - lastItem.getHeight(); + return depth >= 4; + } + + public List getOutOfSyncWithNetworkItems() { + return networkDaoStateList.stream().filter(e -> !e.getMisMatchList().isEmpty()).collect(Collectors.toList()); } @@ -196,21 +263,118 @@ public void removeDaoStateListener(DaoStateMonitorListener listener) { // Private /////////////////////////////////////////////////////////////////////////////////////////// - private void daoStateNetworkConsensusChanged() { - daoStateHashesFromNetwork.forEach((key, list) -> { - int height = key; - getMyDaoStateHashByHeight(height).ifPresent(myDaoStateHash -> { - List misMatch = list.stream() - .filter(e -> !Arrays.equals(e.getHash(), myDaoStateHash.getHash())) - .collect(Collectors.toList()); - daoStateNetworkConsensusMap.put(height, new DaoStateNetworkConsensus(misMatch, list.size())); - }); - }); + private void handleDaoStateChanged(Block block) { + //TODO handle reorgs TODO need to start from gen + + byte[] prevHash; + int height = block.getHeight(); + if (daoStateHashChain.isEmpty()) { + // Only at genesis we allow an empty prevHash + checkArgument(height == genesisTxInfo.getGenesisBlockHeight()); + prevHash = new byte[0]; + } else { + prevHash = daoStateHashChain.getLast().getHash(); + if (daoStateHashChain.getLast().getBlockHeight() == height) { + // In case of a reorg we might receive the same block again. + //TODO handle + return; + } + } + byte[] stateHash = daoStateService.getDaoStateHash(); + // We include the prev. hash in our new hash so we can be sure that if one hash is matching all the past would + // match as well. + byte[] combined = ArrayUtils.addAll(prevHash, stateHash); + byte[] hash = Hash.getRipemd160hash(combined); + DaoStateHash daoStateHash = new DaoStateHash(height, hash, prevHash); + daoStateHashChain.add(daoStateHash); + + log.info("Add daoStateHash after block parsing:\n{}", daoStateHash); + + // We don't broadcast when batch processing + if (parseBlockChainComplete) { + // We delay broadcast to give peers enough time to have received the block. + // Otherwise they would ignore our message. + int delayInSec = 1 + new Random().nextInt(5); + UserThread.runAfter(() -> { + broadcaster.broadcast(new NewDaoStateHashMessage(daoStateHash), + networkNode.getNodeAddress(), + null, + true); + }, delayInSec); + } + } + + private void requestHashesFromAllConnectedSeedNodes() { + networkNode.getConfirmedConnections().stream() + .filter(peerManager::isSeedNode) + .forEach(connection -> connection.getPeersNodeAddressOptional() + .ifPresent(this::requestHashFromSeedNode)); + } - daoStateMonitorListeners.forEach(DaoStateMonitorListener::onDaoStateNetworkConsensusChanged); + private void requestHashFromSeedNode(NodeAddress nodeAddress) { + RequestDaoStateHashHandler requestDaoStateHashHandler = new RequestDaoStateHashHandler(networkNode, + peerManager, + nodeAddress, + new RequestDaoStateHashHandler.Listener() { + @Override + public void onComplete(GetDaoStateHashResponse getDaoStateHashResponse, Optional peersNodeAddress) { + log.debug("requestDaoStateHashHandler of outbound connection complete. nodeAddress={}", nodeAddress); + requestDaoStateHashHandlerMap.remove(nodeAddress); + getDaoStateHashResponse.getDaoStateHashes() + .forEach(daoStateHash -> addToDaoStateHashesFromNetwork(daoStateHash, peersNodeAddress)); + } + + @Override + public void onFault(String errorMessage, @Nullable Connection connection) { + log.warn("requestDaoStateHashHandler with outbound connection failed.\n\tnodeAddress={}\n\t" + + "ErrorMessage={}", nodeAddress, errorMessage); + requestDaoStateHashHandlerMap.remove(nodeAddress); + } + }); + requestDaoStateHashHandlerMap.put(nodeAddress, requestDaoStateHashHandler); + requestDaoStateHashHandler.requestDaoStateHash(); } - private Optional getMyDaoStateHashByHeight(int height) { - return daoStateHashChain.stream().filter(e -> e.getBlockHeight() == height).findAny(); + private void addToDaoStateHashesFromNetwork(DaoStateHash daoStateHash, Optional peersNodeAddress) { + int height = daoStateHash.getBlockHeight(); + String peersNodeAddressAsString = peersNodeAddress.map(NodeAddress::getFullAddress) + .orElseGet(() -> "unknown_peer_" + new Random().nextInt(10000)); + peersDaoStateHashMap.putIfAbsent(height, new ArrayList<>()); + PeersDaoStateHash peersDaoStateHash = new PeersDaoStateHash(daoStateHash, peersNodeAddressAsString); + List peersDaoStateHashes = peersDaoStateHashMap.get(height); + + // Added already so we return + if (peersDaoStateHashes.stream().anyMatch(e -> e.getPeersNodeAddress().equals(peersNodeAddressAsString))) { + return; + } + + peersDaoStateHashes.add(peersDaoStateHash); + + daoStateHashChain.stream().filter(e -> e.getBlockHeight() == height).findAny() + .ifPresent(myDaoStateHash -> { + NetworkDaoState newNetworkDaoState; + List misMatchList = new ArrayList<>(); + Optional optionalNetworkDaoState = networkDaoStateList.stream().filter(e -> e.getHeight() == height).findAny(); + if (optionalNetworkDaoState.isPresent()) { + NetworkDaoState networkDaoState = optionalNetworkDaoState.get(); + misMatchList = networkDaoState.getMisMatchList(); + if (!Arrays.equals(peersDaoStateHash.getDaoStateHash().getHash(), myDaoStateHash.getHash())) { + log.warn("We got DaoStateHash from a peer which does not match our own one. It is " + + "recommended to rebuild the DAO state and if it is not recovered afterwards " + + "to contact the developers.\n" + + "myDaoStateHash={}\npeersDaoStateHash={}", myDaoStateHash, peersDaoStateHash); + + //TODO add autom. requests for p2p network data and trigger a resync in case its a seed node + misMatchList.add(peersDaoStateHash); + } + // We remove old one (and add later new one) + networkDaoStateList.remove(networkDaoState); + } + + newNetworkDaoState = new NetworkDaoState(height, misMatchList, peersDaoStateHashes.size(), myDaoStateHash.getHash()); + networkDaoStateList.add(newNetworkDaoState); + networkDaoStateList.sort(Comparator.comparing(NetworkDaoState::getHeight).reversed()); + daoStateMonitorListeners.forEach(DaoStateMonitorListener::onChange); + }); } } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java b/core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java new file mode 100644 index 00000000000..413c5edd095 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java @@ -0,0 +1,52 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring; + +import bisq.common.util.Utilities; + +import java.util.List; + +import lombok.Value; + +/** + * Contains the dao state of at a particular block height we have received from our peers. + */ +@Value +public class NetworkDaoState { + private final int height; + private final List misMatchList; + private final int numNetworkMessages; + private final byte[] myHash; + + NetworkDaoState(int height, List misMatchList, int numNetworkMessages, byte[] myHash) { + this.height = height; + this.misMatchList = misMatchList; + this.numNetworkMessages = numNetworkMessages; + this.myHash = myHash; + } + + @Override + public String toString() { + return "NetworkDaoState{" + + "\n height=" + height + + ",\n misMatchList=" + misMatchList + + ",\n numNetworkMessages=" + numNetworkMessages + + ",\n myHash=" + Utilities.bytesAsHexString(myHash) + + "\n}"; + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateNetworkConsensus.java b/core/src/main/java/bisq/core/dao/state/monitoring/PeersDaoStateHash.java similarity index 65% rename from core/src/main/java/bisq/core/dao/state/monitoring/DaoStateNetworkConsensus.java rename to core/src/main/java/bisq/core/dao/state/monitoring/PeersDaoStateHash.java index e19c81be612..e4fb2c40be8 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateNetworkConsensus.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/PeersDaoStateHash.java @@ -17,17 +17,18 @@ package bisq.core.dao.state.monitoring; -import java.util.List; - import lombok.Value; +/** + * Wrapper for DaoStateHash objects of peers. If peer address is unknown we use a random string as peers ID. + */ @Value -public class DaoStateNetworkConsensus { - private final List misMatch; - private final int numNetworkMessages; +class PeersDaoStateHash { + private final DaoStateHash daoStateHash; + private final String peersNodeAddress; - public DaoStateNetworkConsensus(List misMatch, int numNetworkMessages) { - this.misMatch = misMatch; - this.numNetworkMessages = numNetworkMessages; + PeersDaoStateHash(DaoStateHash daoStateHash, String peersNodeAddress) { + this.daoStateHash = daoStateHash; + this.peersNodeAddress = peersNodeAddress; } } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java b/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java new file mode 100644 index 00000000000..442021c6878 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java @@ -0,0 +1,75 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring.messages; + +import bisq.network.p2p.DirectMessage; +import bisq.network.p2p.storage.payload.CapabilityRequiringPayload; + +import bisq.common.app.Capabilities; +import bisq.common.app.Capability; +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class GetDaoStateHashRequest extends NetworkEnvelope implements DirectMessage, CapabilityRequiringPayload { + private final int nonce; + + public GetDaoStateHashRequest(int nonce) { + this(nonce, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private GetDaoStateHashRequest(int nonce, int messageVersion) { + super(messageVersion); + this.nonce = nonce; + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setGetDaoStateHashRequest(PB.GetDaoStateHashRequest.newBuilder() + .setNonce(nonce)) + .build(); + } + + public static NetworkEnvelope fromProto(PB.GetDaoStateHashRequest proto, int messageVersion) { + return new GetDaoStateHashRequest(proto.getNonce(), messageVersion); + } + + @Override + public Capabilities getRequiredCapabilities() { + return new Capabilities(Capability.DAO_STATE); + } + + @Override + public String toString() { + return "GetDaoStateHashRequest{" + + ",\n nonce=" + nonce + + "\n} " + super.toString(); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashResponse.java b/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashResponse.java new file mode 100644 index 00000000000..23f44629b30 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashResponse.java @@ -0,0 +1,88 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring.messages; + +import bisq.core.dao.state.monitoring.DaoStateHash; + +import bisq.network.p2p.DirectMessage; +import bisq.network.p2p.ExtendedDataSizePermission; + +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class GetDaoStateHashResponse extends NetworkEnvelope implements DirectMessage, ExtendedDataSizePermission { + private final List daoStateHashes; + private final int requestNonce; + + public GetDaoStateHashResponse(List daoStateHashes, int requestNonce) { + this(daoStateHashes, requestNonce, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private GetDaoStateHashResponse(List daoStateHashes, + int requestNonce, + int messageVersion) { + super(messageVersion); + this.daoStateHashes = daoStateHashes; + this.requestNonce = requestNonce; + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setGetDaoStateHashResponse(PB.GetDaoStateHashResponse.newBuilder() + .addAllDaoStateHashes(daoStateHashes.stream() + .map(DaoStateHash::toProtoMessage) + .collect(Collectors.toList())) + .setRequestNonce(requestNonce)) + .build(); + } + + public static NetworkEnvelope fromProto(PB.GetDaoStateHashResponse proto, int messageVersion) { + return new GetDaoStateHashResponse(proto.getDaoStateHashesList().isEmpty() ? + new ArrayList<>() : + proto.getDaoStateHashesList().stream() + .map(DaoStateHash::fromProto) + .collect(Collectors.toList()), + proto.getRequestNonce(), + messageVersion); + } + + @Override + public String toString() { + return "GetDaoStateHashResponse{" + + "\n daoStateHashes=" + daoStateHashes + + ",\n requestNonce=" + requestNonce + + "\n} " + super.toString(); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java b/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java index eef6b1b9d62..bc871820960 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java @@ -60,12 +60,18 @@ public PB.NetworkEnvelope toProtoNetworkEnvelope() { } public static NetworkEnvelope fromProto(PB.NewDaoStateHashMessage proto, int messageVersion) { - return new NewDaoStateHashMessage(DaoStateHash.fromProto(proto.getDaoStateHash()), - messageVersion); + return new NewDaoStateHashMessage(DaoStateHash.fromProto(proto.getDaoStateHash()), messageVersion); } @Override public Capabilities getRequiredCapabilities() { return new Capabilities(Capability.DAO_STATE); } + + @Override + public String toString() { + return "NewDaoStateHashMessage{" + + "\n daoStateHash=" + daoStateHash + + "\n} " + super.toString(); + } } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java b/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java new file mode 100644 index 00000000000..f7006edbe49 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java @@ -0,0 +1,212 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring.network; + +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.CloseConnectionReason; +import bisq.network.p2p.network.Connection; +import bisq.network.p2p.network.MessageListener; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.Timer; +import bisq.common.UserThread; +import bisq.common.proto.network.NetworkEnvelope; + +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.SettableFuture; + +import java.util.Optional; +import java.util.Random; + +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Sends a GetDaoStateHashRequest to a seed node and listens on corresponding GetDaoStateHashResponse. + */ +@Slf4j +public class RequestDaoStateHashHandler implements MessageListener { + private static final long TIMEOUT = 120; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Listener + /////////////////////////////////////////////////////////////////////////////////////////// + + public interface Listener { + void onComplete(GetDaoStateHashResponse getDaoStateHashResponse, Optional peersNodeAddress); + + @SuppressWarnings("UnusedParameters") + void onFault(String errorMessage, @SuppressWarnings("SameParameterValue") @Nullable Connection connection); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Class fields + /////////////////////////////////////////////////////////////////////////////////////////// + + private final NetworkNode networkNode; + private final PeerManager peerManager; + private final NodeAddress nodeAddress; + private final Listener listener; + private Timer timeoutTimer; + private final int nonce = new Random().nextInt(); + private boolean stopped; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + public RequestDaoStateHashHandler(NetworkNode networkNode, + PeerManager peerManager, + NodeAddress nodeAddress, + Listener listener) { + this.networkNode = networkNode; + this.peerManager = peerManager; + this.nodeAddress = nodeAddress; + this.listener = listener; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public void requestDaoStateHash() { + if (!stopped) { + GetDaoStateHashRequest getDaoStateHashRequest = new GetDaoStateHashRequest(nonce); + if (timeoutTimer == null) { + timeoutTimer = UserThread.runAfter(() -> { // setup before sending to avoid race conditions + if (!stopped) { + String errorMessage = "A timeout occurred at sending getDaoStateHashRequest:" + getDaoStateHashRequest + + " on peersNodeAddress:" + nodeAddress; + log.debug(errorMessage + " / RequestDaoStateHashHandler=" + RequestDaoStateHashHandler.this); + handleFault(errorMessage, nodeAddress, CloseConnectionReason.SEND_MSG_TIMEOUT); + } else { + log.trace("We have stopped already. We ignore that timeoutTimer.run call. " + + "Might be caused by an previous networkNode.sendMessage.onFailure."); + } + }, + TIMEOUT); + } + + log.info("We send to peer {} a {}.", nodeAddress, getDaoStateHashRequest); + networkNode.addMessageListener(this); + SettableFuture future = networkNode.sendMessage(nodeAddress, getDaoStateHashRequest); + Futures.addCallback(future, new FutureCallback<>() { + @Override + public void onSuccess(Connection connection) { + if (!stopped) { + log.info("Sending of GetDaoStateHashRequest message to peer {} succeeded.", nodeAddress.getHostName()); + } else { + log.trace("We have stopped already. We ignore that networkNode.sendMessage.onSuccess call." + + "Might be caused by an previous timeout."); + } + } + + @Override + public void onFailure(@NotNull Throwable throwable) { + if (!stopped) { + String errorMessage = "Sending getDaoStateHashRequest to " + nodeAddress + + " failed. That is expected if the peer is offline.\n\t" + + "getDaoStateHashRequest=" + getDaoStateHashRequest + "." + + "\n\tException=" + throwable.getMessage(); + log.error(errorMessage); + handleFault(errorMessage, nodeAddress, CloseConnectionReason.SEND_MSG_FAILURE); + } else { + log.trace("We have stopped already. We ignore that networkNode.sendMessage.onFailure call. " + + "Might be caused by an previous timeout."); + } + } + }); + } else { + log.warn("We have stopped already. We ignore that requestDaoStateHash call."); + } + } + + public void cancel() { + cleanup(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // MessageListener implementation + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { + if (networkEnvelope instanceof GetDaoStateHashResponse) { + if (!stopped) { + GetDaoStateHashResponse getDaoStateHashResponse = (GetDaoStateHashResponse) networkEnvelope; + if (getDaoStateHashResponse.getRequestNonce() == nonce) { + stopTimeoutTimer(); + cleanup(); + log.info("We received from peer {} a DaoStateHashResponse with {} daoStateHashes", + nodeAddress.getFullAddress(), getDaoStateHashResponse.getDaoStateHashes().size()); + listener.onComplete(getDaoStateHashResponse, connection.getPeersNodeAddressOptional()); + } else { + log.warn("Nonce not matching. That can happen rarely if we get a response after a canceled " + + "handshake (timeout causes connection close but peer might have sent a msg before " + + "connection was closed).\n\t" + + "We drop that message. nonce={} / requestNonce={}", + nonce, getDaoStateHashResponse.getRequestNonce()); + } + } else { + log.warn("We have stopped already."); + } + } + } + + public void stop() { + cleanup(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + + @SuppressWarnings("UnusedParameters") + private void handleFault(String errorMessage, NodeAddress nodeAddress, CloseConnectionReason closeConnectionReason) { + cleanup(); + peerManager.handleConnectionFault(nodeAddress); + listener.onFault(errorMessage, null); + } + + private void cleanup() { + stopped = true; + networkNode.removeMessageListener(this); + stopTimeoutTimer(); + } + + private void stopTimeoutTimer() { + if (timeoutTimer != null) { + timeoutTimer.stop(); + timeoutTimer = null; + } + } +} diff --git a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java index 4110484d5f2..18c0068a332 100644 --- a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java @@ -31,6 +31,8 @@ import bisq.core.dao.node.messages.GetBlocksRequest; import bisq.core.dao.node.messages.GetBlocksResponse; import bisq.core.dao.node.messages.NewBlockBroadcastMessage; +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; import bisq.core.filter.Filter; import bisq.core.offer.OfferPayload; @@ -163,6 +165,10 @@ public NetworkEnvelope fromProto(PB.NetworkEnvelope proto) throws ProtobufferExc return AckMessage.fromProto(proto.getAckMessage(), messageVersion); case REPUBLISH_GOVERNANCE_DATA_REQUEST: return RepublishGovernanceDataRequest.fromProto(proto.getRepublishGovernanceDataRequest(), messageVersion); + case GET_DAO_STATE_HASH_REQUEST: + return GetDaoStateHashRequest.fromProto(proto.getGetDaoStateHashRequest(), messageVersion); + case GET_DAO_STATE_HASH_RESPONSE: + return GetDaoStateHashResponse.fromProto(proto.getGetDaoStateHashResponse(), messageVersion); default: throw new ProtobufferException("Unknown proto message case (PB.NetworkEnvelope). messageCase=" + From d09e7707519984dccedd20f0259f57e79408fba1 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 10 Mar 2019 22:11:32 -0500 Subject: [PATCH 06/31] Add parseBlockchainComplete check Add parseBlockchainComplete check for onParseBlockChainComplete before calling onParseBlockChainComplete to avoid duplicated calls of onParseBlockChainComplete. Happened if there was only one seed node. --- core/src/main/java/bisq/core/dao/node/full/FullNode.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/bisq/core/dao/node/full/FullNode.java b/core/src/main/java/bisq/core/dao/node/full/FullNode.java index 4d84494b758..82db3d23acc 100644 --- a/core/src/main/java/bisq/core/dao/node/full/FullNode.java +++ b/core/src/main/java/bisq/core/dao/node/full/FullNode.java @@ -185,7 +185,9 @@ private void parseBlocksIfNewBlockAvailable(int chainHeight) { } else { log.info("parseBlocksIfNewBlockAvailable did not result in a new block, so we complete."); log.info("parse {} blocks took {} seconds", blocksToParseInBatch, (System.currentTimeMillis() - parseInBatchStartTime) / 1000d); - onParseBlockChainComplete(); + if (!parseBlockchainComplete) { + onParseBlockChainComplete(); + } } }, this::handleError); From e7bfba0b3c64cac76d08cb7ac7bf368adf1b6cb2 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 10 Mar 2019 22:11:40 -0500 Subject: [PATCH 07/31] Add comment --- .../bisq/core/dao/governance/voteresult/VoteResultService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java b/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java index c1fa7b4ea17..b82c666e23f 100644 --- a/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java +++ b/core/src/main/java/bisq/core/dao/governance/voteresult/VoteResultService.java @@ -305,6 +305,8 @@ private Function txOutputToDecryptedBallot return getDecryptedBallotsWithMerits(voteRevealTxId, currentCycle, voteRevealOpReturnData, blindVoteTxId, hashOfBlindVoteList, blindVoteStake, optionalBlindVote.get()); } + + // We are missing P2P network data return getEmptyDecryptedBallotsWithMerits(voteRevealTxId, blindVoteTxId, hashOfBlindVoteList, blindVoteStake); } catch (Throwable e) { From bbec682d988e0f755443dc62d9ddcf0359fe18e7 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 11 Mar 2019 18:32:48 -0500 Subject: [PATCH 08/31] Add UI for Dao state monitor Refactor dao state monitor domain. Add support for requesting all hashed from genesis from a peer which is in conflict (can help to find at which block the issue started). --- common/src/main/proto/pb.proto | 3 +- .../main/java/bisq/core/dao/DaoModule.java | 2 + .../dao/state/monitoring/DaoStateBlock.java | 60 ++ .../dao/state/monitoring/DaoStateHash.java | 8 +- .../monitoring/DaoStateMonitoringService.java | 279 +++------ .../dao/state/monitoring/NetworkDaoState.java | 52 -- .../state/monitoring/PeersDaoStateHash.java | 34 -- .../messages/GetDaoStateHashRequest.java | 12 +- .../network/DaoStateNetworkService.java | 195 ++++++ .../network/RequestDaoStateHashHandler.java | 4 +- .../resources/i18n/displayStrings.properties | 19 +- desktop/src/main/java/bisq/desktop/bisq.css | 8 + .../main/dao/governance/GovernanceView.java | 11 +- .../governance/consensus/ConsensusView.fxml | 32 + .../governance/consensus/ConsensusView.java | 563 ++++++++++++++++++ .../consensus/DaoStateBlockListItem.java | 50 ++ .../consensus/DaoStateInConflictListItem.java | 44 ++ .../governance/proposals/ProposalsView.java | 2 - 18 files changed, 1079 insertions(+), 299 deletions(-) create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/DaoStateBlock.java delete mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java delete mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/PeersDaoStateHash.java create mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.fxml create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index dafaee4db66..cbd1a2760f3 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -328,7 +328,8 @@ message RepublishGovernanceDataRequest { } message GetDaoStateHashRequest { - int32 nonce = 1; + int32 from_block_height = 1; + int32 nonce = 2; } message GetDaoStateHashResponse { diff --git a/core/src/main/java/bisq/core/dao/DaoModule.java b/core/src/main/java/bisq/core/dao/DaoModule.java index 505ef9eb4d2..37ef0401874 100644 --- a/core/src/main/java/bisq/core/dao/DaoModule.java +++ b/core/src/main/java/bisq/core/dao/DaoModule.java @@ -79,6 +79,7 @@ import bisq.core.dao.state.GenesisTxInfo; import bisq.core.dao.state.model.DaoState; import bisq.core.dao.state.monitoring.DaoStateMonitoringService; +import bisq.core.dao.state.monitoring.network.DaoStateNetworkService; import bisq.core.dao.state.unconfirmed.UnconfirmedBsqChangeOutputListService; import bisq.common.app.AppModule; @@ -118,6 +119,7 @@ protected void configure() { bind(DaoStateSnapshotService.class).in(Singleton.class); bind(DaoStateStorageService.class).in(Singleton.class); bind(DaoStateMonitoringService.class).in(Singleton.class); + bind(DaoStateNetworkService.class).in(Singleton.class); bind(UnconfirmedBsqChangeOutputListService.class).in(Singleton.class); bind(ExportJsonFilesService.class).in(Singleton.class); diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateBlock.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateBlock.java new file mode 100644 index 00000000000..abd694288c8 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateBlock.java @@ -0,0 +1,60 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring; + +import java.util.HashMap; +import java.util.Map; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.experimental.Delegate; + +/** + * Contains my DaoStateHash at a particular block height and the received daoStateHashes from our peers. + * The maps get updated over time, this is not an immutable class. + */ +@Getter +@EqualsAndHashCode +public class DaoStateBlock { + @Delegate + private final DaoStateHash myDaoStateHash; + + private final Map peersMap = new HashMap<>(); + private final Map inConflictMap = new HashMap<>(); + + DaoStateBlock(DaoStateHash myDaoStateHash) { + this.myDaoStateHash = myDaoStateHash; + } + + public void putInPeersMap(String peersNodeAddressAsString, DaoStateHash daoStateHash) { + peersMap.putIfAbsent(peersNodeAddressAsString, daoStateHash); + } + + public void putInConflictMap(String peersNodeAddressAsString, DaoStateHash daoStateHash) { + inConflictMap.putIfAbsent(peersNodeAddressAsString, daoStateHash); + } + + @Override + public String toString() { + return "DaoStateBlock{" + + "\n myDaoStateHash=" + myDaoStateHash + + ",\n peersMap=" + peersMap + + ",\n inConflictMap=" + inConflictMap + + "\n}"; + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java index ed6b764bcbd..10519447497 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java @@ -25,11 +25,13 @@ import com.google.protobuf.ByteString; +import java.util.Arrays; + import lombok.Value; /** * Contains the blockHeight, the hash and the previous hash of the dao state. - * As the hash is created from the dao state at the particular height includes the previous hash we get the history of + * As the hash is created from the dao state at the particular height including the previous hash we get the history of * the full chain included and we know if the hash matches at a particular height that all the past blocks need to match * as well. */ @@ -48,6 +50,10 @@ public class DaoStateHash implements PersistablePayload, NetworkPayload { this.prevHash = prevHash; } + public boolean hasEqualHash(DaoStateHash other) { + return Arrays.equals(hash, other.getHash()); + } + /////////////////////////////////////////////////////////////////////////////////////////// // PROTO BUFFER diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java index f287b5216ee..3fc14ec1857 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java @@ -23,42 +23,30 @@ import bisq.core.dao.state.GenesisTxInfo; import bisq.core.dao.state.model.blockchain.Block; import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; -import bisq.core.dao.state.monitoring.network.RequestDaoStateHashHandler; +import bisq.core.dao.state.monitoring.network.DaoStateNetworkService; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.Connection; -import bisq.network.p2p.network.MessageListener; -import bisq.network.p2p.network.NetworkNode; -import bisq.network.p2p.peers.Broadcaster; -import bisq.network.p2p.peers.PeerManager; import bisq.common.UserThread; import bisq.common.crypto.Hash; -import bisq.common.proto.network.NetworkEnvelope; import javax.inject.Inject; import org.apache.commons.lang3.ArrayUtils; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Random; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import javax.annotation.Nullable; - import static com.google.common.base.Preconditions.checkArgument; /** @@ -80,30 +68,21 @@ * TODO auto recovery */ @Slf4j -public class DaoStateMonitoringService implements DaoStateListener, DaoSetupService, MessageListener { - public interface DaoStateMonitorListener { - void onChange(); +public class DaoStateMonitoringService implements DaoSetupService, DaoStateListener, DaoStateNetworkService.Listener { + public interface Listener { + void onDaoStateBlockchainChanged(); } private final DaoStateService daoStateService; - private final NetworkNode networkNode; - private final PeerManager peerManager; - private final Broadcaster broadcaster; + private final DaoStateNetworkService daoStateNetworkService; private final GenesisTxInfo genesisTxInfo; - // Our chain of dao state changes - private final LinkedList daoStateHashChain = new LinkedList<>(); - - // Lookup map for list of peersDaoStateHashes by block height - private final Map> peersDaoStateHashMap = new HashMap<>(); - - // List of network data state objects. Sorted by blockHeight descending @Getter - private final List networkDaoStateList = new ArrayList<>(); - - private final Map requestDaoStateHashHandlerMap = new HashMap<>(); - private final List daoStateMonitorListeners = new CopyOnWriteArrayList<>(); + private final LinkedList daoStateBlockchain = new LinkedList<>(); + private final List listeners = new CopyOnWriteArrayList<>(); private boolean parseBlockChainComplete; + @Getter + private boolean isInConflict; /////////////////////////////////////////////////////////////////////////////////////////// @@ -112,14 +91,10 @@ public interface DaoStateMonitorListener { @Inject public DaoStateMonitoringService(DaoStateService daoStateService, - NetworkNode networkNode, - PeerManager peerManager, - Broadcaster broadcaster, + DaoStateNetworkService daoStateNetworkService, GenesisTxInfo genesisTxInfo) { this.daoStateService = daoStateService; - this.networkNode = networkNode; - this.peerManager = peerManager; - this.broadcaster = broadcaster; + this.daoStateNetworkService = daoStateNetworkService; this.genesisTxInfo = genesisTxInfo; } @@ -131,6 +106,7 @@ public DaoStateMonitoringService(DaoStateService daoStateService, @Override public void addListeners() { this.daoStateService.addDaoStateListener(this); + daoStateNetworkService.addListener(this); } @Override @@ -145,104 +121,61 @@ public void start() { @Override public void onParseBlockChainComplete() { parseBlockChainComplete = true; + daoStateNetworkService.addListeners(); // We wait for processing messages until we have completed batch processing - networkNode.addMessageListener(this); - requestHashesFromAllConnectedSeedNodes(); + int fromBlockHeight = daoStateService.getChainHeight() - 10; + daoStateNetworkService.requestHashesFromAllConnectedSeedNodes(fromBlockHeight); } @Override public void onDaoStateChanged(Block block) { - handleDaoStateChanged(block); - - if (daoStateHashChain.isEmpty()) { - daoStateService.getBlocks().stream().filter(b -> b.getHeight() != block.getHeight()).forEach(this::handleDaoStateChanged); - } + processNewBlock(block); } @Override public void onSnapshotApplied() { // We could got a reset from a reorg, so we clear all and start over from the genesis block. - daoStateHashChain.clear(); - peersDaoStateHashMap.clear(); - networkDaoStateList.clear(); - requestDaoStateHashHandlerMap.clear(); + daoStateBlockchain.clear(); + daoStateNetworkService.reset(); - daoStateService.getBlocks().forEach(this::handleDaoStateChanged); + daoStateService.getBlocks().forEach(this::processNewBlock); } /////////////////////////////////////////////////////////////////////////////////////////// - // MessageListener implementation + // DaoStateNetworkService.Listener /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { - if (parseBlockChainComplete && networkEnvelope instanceof NewDaoStateHashMessage) { - NewDaoStateHashMessage newDaoStateHashMessage = (NewDaoStateHashMessage) networkEnvelope; - log.info("We received a NewDaoStateHashMessage {} from peer {}", - newDaoStateHashMessage, connection.getPeersNodeAddressOptional()); - - // We ignore dao state data in case we receive them before we have received the block. - if (newDaoStateHashMessage.getDaoStateHash().getBlockHeight() <= daoStateService.getChainHeight()) { - addToDaoStateHashesFromNetwork(newDaoStateHashMessage.getDaoStateHash(), connection.getPeersNodeAddressOptional()); - } - } else if (networkEnvelope instanceof GetDaoStateHashRequest) { - GetDaoStateHashRequest getDaoStateHashRequest = (GetDaoStateHashRequest) networkEnvelope; - List daoStateHashes = new ArrayList<>(daoStateHashChain); - daoStateHashes.sort(Comparator.comparingInt(DaoStateHash::getBlockHeight)); - - // We send only last 10 items - List subList = daoStateHashes.subList(daoStateHashes.size() - 10, daoStateHashes.size()); - GetDaoStateHashResponse response = new GetDaoStateHashResponse(subList, getDaoStateHashRequest.getNonce()); - connection.sendMessage(response); + public void onNewDaoStateHashMessage(NewDaoStateHashMessage newDaoStateHashMessage, Connection connection) { + if (newDaoStateHashMessage.getDaoStateHash().getBlockHeight() <= daoStateService.getChainHeight()) { + processPeersDaoStateHash(newDaoStateHashMessage.getDaoStateHash(), connection.getPeersNodeAddressOptional()); } } + @Override + public void onGetDaoStateHashRequest(Connection connection, GetDaoStateHashRequest getDaoStateHashRequest) { + int fromBlockHeight = getDaoStateHashRequest.getFromBlockHeight(); + List daoStateHashes = daoStateBlockchain.stream() + .filter(e -> e.getBlockHeight() >= fromBlockHeight) + .map(DaoStateBlock::getMyDaoStateHash) + .collect(Collectors.toList()); + daoStateNetworkService.sendGetDaoStateHashResponse(connection, getDaoStateHashRequest.getNonce(), daoStateHashes); + } + + @Override + public void onPeersDaoStateHash(DaoStateHash daoStateHash, Optional peersNodeAddress) { + processPeersDaoStateHash(daoStateHash, peersNodeAddress); + } + /////////////////////////////////////////////////////////////////////////////////////////// // API /////////////////////////////////////////////////////////////////////////////////////////// - public boolean isDaoStateOutOfSyncWithNetworkAndCritical() { - if (networkDaoStateList.stream().allMatch(e -> e.getMisMatchList().isEmpty())) { - return false; - } - - List outOfSyncWithNetworkItems = getOutOfSyncWithNetworkItems(); - // should be covered by isDaoStateOutOfSyncWithNetwork anyway - if (outOfSyncWithNetworkItems.isEmpty()) { - return false; - } - - ArrayList list = new ArrayList<>(outOfSyncWithNetworkItems); - Comparator comparator = Comparator.comparing(e -> e.getMisMatchList().size()); - comparator.reversed(); - list.sort(comparator); - NetworkDaoState itemWithHighestNumMismatch = list.get(0); - Optional item = networkDaoStateList.stream() - .filter(e -> e.getHeight() == itemWithHighestNumMismatch.getHeight()) - .findAny(); - if (item.isPresent()) { - // If the number of reported diff. state is more then 10% of the total received states we consider it as - // critical. We want to avoid warnings to users in case there are some single nodes out of sync. - // If we have less then 4 messages we don't check for the mismatch ratio. - int messages = item.get().getNumNetworkMessages(); - double mismatchRation = (double) itemWithHighestNumMismatch.getMisMatchList().size() / (double) messages; - boolean result = messages > 4 && mismatchRation > 0.1; - if (result) - return true; - } - - // We consider it a critical condition if the block out of sync is older than 4 blocks. Typical reorgs in Bitcoin - // are usually shallow. - NetworkDaoState lastItem = outOfSyncWithNetworkItems.get(outOfSyncWithNetworkItems.size() - 1); - int depth = daoStateService.getChainHeight() - lastItem.getHeight(); - return depth >= 4; - } - - public List getOutOfSyncWithNetworkItems() { - return networkDaoStateList.stream().filter(e -> !e.getMisMatchList().isEmpty()).collect(Collectors.toList()); + public void requestHashesFromGenesisBlockHeight(String peersAddress) { + daoStateNetworkService.requestHashes(genesisTxInfo.getGenesisBlockHeight(), peersAddress); } @@ -250,12 +183,12 @@ public List getOutOfSyncWithNetworkItems() { // Listeners /////////////////////////////////////////////////////////////////////////////////////////// - public void addDaoStateListener(DaoStateMonitorListener listener) { - daoStateMonitorListeners.add(listener); + public void addListener(Listener listener) { + listeners.add(listener); } - public void removeDaoStateListener(DaoStateMonitorListener listener) { - daoStateMonitorListeners.remove(listener); + public void removeListener(Listener listener) { + listeners.remove(listener); } @@ -263,118 +196,64 @@ public void removeDaoStateListener(DaoStateMonitorListener listener) { // Private /////////////////////////////////////////////////////////////////////////////////////////// - private void handleDaoStateChanged(Block block) { + private void processNewBlock(Block block) { //TODO handle reorgs TODO need to start from gen byte[] prevHash; int height = block.getHeight(); - if (daoStateHashChain.isEmpty()) { + if (daoStateBlockchain.isEmpty()) { // Only at genesis we allow an empty prevHash - checkArgument(height == genesisTxInfo.getGenesisBlockHeight()); + checkArgument(height == genesisTxInfo.getGenesisBlockHeight(), + "If daoStateBlockchain is empty we need to have received the genesis block."); prevHash = new byte[0]; } else { - prevHash = daoStateHashChain.getLast().getHash(); - if (daoStateHashChain.getLast().getBlockHeight() == height) { - // In case of a reorg we might receive the same block again. - //TODO handle - return; - } + // TODO check if in reorg cases it might be a valid case + checkArgument(height > daoStateBlockchain.getLast().getBlockHeight(), + "We got a block the same blockHeight as our previous block in the daoStateBlockchain."); + prevHash = daoStateBlockchain.getLast().getHash(); } byte[] stateHash = daoStateService.getDaoStateHash(); // We include the prev. hash in our new hash so we can be sure that if one hash is matching all the past would // match as well. byte[] combined = ArrayUtils.addAll(prevHash, stateHash); byte[] hash = Hash.getRipemd160hash(combined); - DaoStateHash daoStateHash = new DaoStateHash(height, hash, prevHash); - daoStateHashChain.add(daoStateHash); - log.info("Add daoStateHash after block parsing:\n{}", daoStateHash); + DaoStateHash myDaoStateHash = new DaoStateHash(height, hash, prevHash); + DaoStateBlock daoStateBlock = new DaoStateBlock(myDaoStateHash); + daoStateBlockchain.add(daoStateBlock); + listeners.forEach(Listener::onDaoStateBlockchainChanged); + + log.info("Add daoStateBlock at processNewBlock:\n{}", daoStateBlock); - // We don't broadcast when batch processing + // We only broadcast after parsing of blockchain is complete if (parseBlockChainComplete) { // We delay broadcast to give peers enough time to have received the block. - // Otherwise they would ignore our message. + // Otherwise they would ignore our data if received block is in future to their local blockchain. int delayInSec = 1 + new Random().nextInt(5); - UserThread.runAfter(() -> { - broadcaster.broadcast(new NewDaoStateHashMessage(daoStateHash), - networkNode.getNodeAddress(), - null, - true); - }, delayInSec); + UserThread.runAfter(() -> daoStateNetworkService.broadcastMyDaoStateHash(myDaoStateHash), delayInSec); } } - private void requestHashesFromAllConnectedSeedNodes() { - networkNode.getConfirmedConnections().stream() - .filter(peerManager::isSeedNode) - .forEach(connection -> connection.getPeersNodeAddressOptional() - .ifPresent(this::requestHashFromSeedNode)); - } - - private void requestHashFromSeedNode(NodeAddress nodeAddress) { - RequestDaoStateHashHandler requestDaoStateHashHandler = new RequestDaoStateHashHandler(networkNode, - peerManager, - nodeAddress, - new RequestDaoStateHashHandler.Listener() { - @Override - public void onComplete(GetDaoStateHashResponse getDaoStateHashResponse, Optional peersNodeAddress) { - log.debug("requestDaoStateHashHandler of outbound connection complete. nodeAddress={}", nodeAddress); - requestDaoStateHashHandlerMap.remove(nodeAddress); - getDaoStateHashResponse.getDaoStateHashes() - .forEach(daoStateHash -> addToDaoStateHashesFromNetwork(daoStateHash, peersNodeAddress)); - } - - @Override - public void onFault(String errorMessage, @Nullable Connection connection) { - log.warn("requestDaoStateHashHandler with outbound connection failed.\n\tnodeAddress={}\n\t" + - "ErrorMessage={}", nodeAddress, errorMessage); - requestDaoStateHashHandlerMap.remove(nodeAddress); + private void processPeersDaoStateHash(DaoStateHash daoStateHash, Optional peersNodeAddress) { + AtomicBoolean changed = new AtomicBoolean(false); + AtomicBoolean isInConflict = new AtomicBoolean(this.isInConflict); + daoStateBlockchain.stream() + .filter(e -> e.getBlockHeight() == daoStateHash.getBlockHeight()).findAny() + .ifPresent(daoStateBlock -> { + String peersNodeAddressAsString = peersNodeAddress.map(NodeAddress::getFullAddress) + .orElseGet(() -> "Unknown peer " + new Random().nextInt(10000)); + daoStateBlock.putInPeersMap(peersNodeAddressAsString, daoStateHash); + if (!daoStateBlock.getMyDaoStateHash().hasEqualHash(daoStateHash)) { + daoStateBlock.putInConflictMap(peersNodeAddressAsString, daoStateHash); + isInConflict.set(true); } + changed.set(true); }); - requestDaoStateHashHandlerMap.put(nodeAddress, requestDaoStateHashHandler); - requestDaoStateHashHandler.requestDaoStateHash(); - } - - private void addToDaoStateHashesFromNetwork(DaoStateHash daoStateHash, Optional peersNodeAddress) { - int height = daoStateHash.getBlockHeight(); - String peersNodeAddressAsString = peersNodeAddress.map(NodeAddress::getFullAddress) - .orElseGet(() -> "unknown_peer_" + new Random().nextInt(10000)); - peersDaoStateHashMap.putIfAbsent(height, new ArrayList<>()); - PeersDaoStateHash peersDaoStateHash = new PeersDaoStateHash(daoStateHash, peersNodeAddressAsString); - List peersDaoStateHashes = peersDaoStateHashMap.get(height); - - // Added already so we return - if (peersDaoStateHashes.stream().anyMatch(e -> e.getPeersNodeAddress().equals(peersNodeAddressAsString))) { - return; - } - peersDaoStateHashes.add(peersDaoStateHash); - - daoStateHashChain.stream().filter(e -> e.getBlockHeight() == height).findAny() - .ifPresent(myDaoStateHash -> { - NetworkDaoState newNetworkDaoState; - List misMatchList = new ArrayList<>(); - Optional optionalNetworkDaoState = networkDaoStateList.stream().filter(e -> e.getHeight() == height).findAny(); - if (optionalNetworkDaoState.isPresent()) { - NetworkDaoState networkDaoState = optionalNetworkDaoState.get(); - misMatchList = networkDaoState.getMisMatchList(); - if (!Arrays.equals(peersDaoStateHash.getDaoStateHash().getHash(), myDaoStateHash.getHash())) { - log.warn("We got DaoStateHash from a peer which does not match our own one. It is " + - "recommended to rebuild the DAO state and if it is not recovered afterwards " + - "to contact the developers.\n" + - "myDaoStateHash={}\npeersDaoStateHash={}", myDaoStateHash, peersDaoStateHash); - - //TODO add autom. requests for p2p network data and trigger a resync in case its a seed node - misMatchList.add(peersDaoStateHash); - } - // We remove old one (and add later new one) - networkDaoStateList.remove(networkDaoState); - } + this.isInConflict = isInConflict.get(); - newNetworkDaoState = new NetworkDaoState(height, misMatchList, peersDaoStateHashes.size(), myDaoStateHash.getHash()); - networkDaoStateList.add(newNetworkDaoState); - networkDaoStateList.sort(Comparator.comparing(NetworkDaoState::getHeight).reversed()); - daoStateMonitorListeners.forEach(DaoStateMonitorListener::onChange); - }); + if (changed.get()) { + listeners.forEach(Listener::onDaoStateBlockchainChanged); + } } } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java b/core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java deleted file mode 100644 index 413c5edd095..00000000000 --- a/core/src/main/java/bisq/core/dao/state/monitoring/NetworkDaoState.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.dao.state.monitoring; - -import bisq.common.util.Utilities; - -import java.util.List; - -import lombok.Value; - -/** - * Contains the dao state of at a particular block height we have received from our peers. - */ -@Value -public class NetworkDaoState { - private final int height; - private final List misMatchList; - private final int numNetworkMessages; - private final byte[] myHash; - - NetworkDaoState(int height, List misMatchList, int numNetworkMessages, byte[] myHash) { - this.height = height; - this.misMatchList = misMatchList; - this.numNetworkMessages = numNetworkMessages; - this.myHash = myHash; - } - - @Override - public String toString() { - return "NetworkDaoState{" + - "\n height=" + height + - ",\n misMatchList=" + misMatchList + - ",\n numNetworkMessages=" + numNetworkMessages + - ",\n myHash=" + Utilities.bytesAsHexString(myHash) + - "\n}"; - } -} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/PeersDaoStateHash.java b/core/src/main/java/bisq/core/dao/state/monitoring/PeersDaoStateHash.java deleted file mode 100644 index e4fb2c40be8..00000000000 --- a/core/src/main/java/bisq/core/dao/state/monitoring/PeersDaoStateHash.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ - -package bisq.core.dao.state.monitoring; - -import lombok.Value; - -/** - * Wrapper for DaoStateHash objects of peers. If peer address is unknown we use a random string as peers ID. - */ -@Value -class PeersDaoStateHash { - private final DaoStateHash daoStateHash; - private final String peersNodeAddress; - - PeersDaoStateHash(DaoStateHash daoStateHash, String peersNodeAddress) { - this.daoStateHash = daoStateHash; - this.peersNodeAddress = peersNodeAddress; - } -} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java b/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java index 442021c6878..31bceba9e33 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java @@ -33,10 +33,11 @@ @EqualsAndHashCode(callSuper = true) @Getter public final class GetDaoStateHashRequest extends NetworkEnvelope implements DirectMessage, CapabilityRequiringPayload { + private final int fromBlockHeight; private final int nonce; - public GetDaoStateHashRequest(int nonce) { - this(nonce, Version.getP2PMessageVersion()); + public GetDaoStateHashRequest(int fromBlockHeight, int nonce) { + this(fromBlockHeight, nonce, Version.getP2PMessageVersion()); } @@ -44,8 +45,9 @@ public GetDaoStateHashRequest(int nonce) { // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// - private GetDaoStateHashRequest(int nonce, int messageVersion) { + private GetDaoStateHashRequest(int fromBlockHeight, int nonce, int messageVersion) { super(messageVersion); + this.fromBlockHeight = fromBlockHeight; this.nonce = nonce; } @@ -53,12 +55,13 @@ private GetDaoStateHashRequest(int nonce, int messageVersion) { public PB.NetworkEnvelope toProtoNetworkEnvelope() { return getNetworkEnvelopeBuilder() .setGetDaoStateHashRequest(PB.GetDaoStateHashRequest.newBuilder() + .setFromBlockHeight(fromBlockHeight) .setNonce(nonce)) .build(); } public static NetworkEnvelope fromProto(PB.GetDaoStateHashRequest proto, int messageVersion) { - return new GetDaoStateHashRequest(proto.getNonce(), messageVersion); + return new GetDaoStateHashRequest(proto.getFromBlockHeight(), proto.getNonce(), messageVersion); } @Override @@ -69,6 +72,7 @@ public Capabilities getRequiredCapabilities() { @Override public String toString() { return "GetDaoStateHashRequest{" + + ",\n fromBlockHeight=" + fromBlockHeight + ",\n nonce=" + nonce + "\n} " + super.toString(); } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java b/core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java new file mode 100644 index 00000000000..aa763ece95e --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java @@ -0,0 +1,195 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.core.dao.state.monitoring.network; + +import bisq.core.dao.state.DaoStateListener; +import bisq.core.dao.state.monitoring.DaoStateHash; +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; +import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; +import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.Connection; +import bisq.network.p2p.network.MessageListener; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.Broadcaster; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import javax.inject.Inject; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CopyOnWriteArrayList; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Nullable; + +/** + * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for + * so we can detect quickly if any consensus issue arise. The data does not contain any private user + * data so sharing it on demand has no privacy concerns. + * + * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start + * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao + * state from the peers is already covering the next block we have not received yet. So we only take data in account + * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our + * state to the peers to not get ignored it in case they have not received the block yet. + * + * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height + * of the latest block in the snapshot. + * + * TODO maybe request full state? + * TODO add p2p network data for monitoring + * TODO auto recovery + */ +@Slf4j +public class DaoStateNetworkService implements DaoStateListener, MessageListener { + + public interface Listener { + void onNewDaoStateHashMessage(NewDaoStateHashMessage newDaoStateHashMessage, Connection connection); + + void onGetDaoStateHashRequest(Connection connection, GetDaoStateHashRequest getDaoStateHashRequest); + + void onPeersDaoStateHash(DaoStateHash daoStateHash, Optional peersNodeAddress); + } + + //TODO testing + public final NetworkNode networkNode; + private final PeerManager peerManager; + private final Broadcaster broadcaster; + + @Getter + private final Map requestDaoStateHashHandlerMap = new HashMap<>(); + private final List listeners = new CopyOnWriteArrayList<>(); + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + public DaoStateNetworkService(NetworkNode networkNode, + PeerManager peerManager, + Broadcaster broadcaster) { + this.networkNode = networkNode; + this.peerManager = peerManager; + this.broadcaster = broadcaster; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // MessageListener implementation + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { + if (networkEnvelope instanceof NewDaoStateHashMessage) { + NewDaoStateHashMessage newDaoStateHashMessage = (NewDaoStateHashMessage) networkEnvelope; + log.info("We received a NewDaoStateHashMessage {} from peer {}", + newDaoStateHashMessage, connection.getPeersNodeAddressOptional()); + + listeners.forEach(e -> e.onNewDaoStateHashMessage(newDaoStateHashMessage, connection)); + } else if (networkEnvelope instanceof GetDaoStateHashRequest) { + GetDaoStateHashRequest getDaoStateHashRequest = (GetDaoStateHashRequest) networkEnvelope; + listeners.forEach(e -> e.onGetDaoStateHashRequest(connection, getDaoStateHashRequest)); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public void addListeners() { + networkNode.addMessageListener(this); + } + + public void sendGetDaoStateHashResponse(Connection connection, int nonce, List daoStateHashes) { + connection.sendMessage(new GetDaoStateHashResponse(daoStateHashes, nonce)); + } + + public void requestHashesFromAllConnectedSeedNodes(int fromBlockHeight) { + networkNode.getConfirmedConnections().stream() + .filter(peerManager::isSeedNode) + .forEach(connection -> connection.getPeersNodeAddressOptional() + .ifPresent(e -> requestHashFromSeedNode(fromBlockHeight, e))); + } + + public void broadcastMyDaoStateHash(DaoStateHash myDaoStateHash) { + broadcaster.broadcast(new NewDaoStateHashMessage(myDaoStateHash), + networkNode.getNodeAddress(), + null, + true); + } + + public void requestHashes(int fromBlockHeight, String peersAddress) { + requestHashFromSeedNode(fromBlockHeight, new NodeAddress(peersAddress)); + } + + public void reset() { + requestDaoStateHashHandlerMap.clear(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Listeners + /////////////////////////////////////////////////////////////////////////////////////////// + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void requestHashFromSeedNode(int fromBlockHeight, NodeAddress nodeAddress) { + RequestDaoStateHashHandler requestDaoStateHashHandler = new RequestDaoStateHashHandler(networkNode, + peerManager, + nodeAddress, + new RequestDaoStateHashHandler.Listener() { + @Override + public void onComplete(GetDaoStateHashResponse getDaoStateHashResponse, Optional peersNodeAddress) { + log.debug("requestDaoStateHashHandler of outbound connection complete. nodeAddress={}", nodeAddress); + requestDaoStateHashHandlerMap.remove(nodeAddress); + getDaoStateHashResponse.getDaoStateHashes() + .forEach(daoStateHash -> listeners.forEach(e -> e.onPeersDaoStateHash(daoStateHash, peersNodeAddress))); + } + + @Override + public void onFault(String errorMessage, @Nullable Connection connection) { + log.warn("requestDaoStateHashHandler with outbound connection failed.\n\tnodeAddress={}\n\t" + + "ErrorMessage={}", nodeAddress, errorMessage); + requestDaoStateHashHandlerMap.remove(nodeAddress); + } + }); + requestDaoStateHashHandlerMap.put(nodeAddress, requestDaoStateHashHandler); + requestDaoStateHashHandler.requestDaoStateHash(fromBlockHeight); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java b/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java index f7006edbe49..c1e0651218a 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java @@ -95,9 +95,9 @@ public RequestDaoStateHashHandler(NetworkNode networkNode, // API /////////////////////////////////////////////////////////////////////////////////////////// - public void requestDaoStateHash() { + public void requestDaoStateHash(int fromBlockHeight) { if (!stopped) { - GetDaoStateHashRequest getDaoStateHashRequest = new GetDaoStateHashRequest(nonce); + GetDaoStateHashRequest getDaoStateHashRequest = new GetDaoStateHashRequest(fromBlockHeight, nonce); if (timeoutTimer == null) { timeoutTimer = UserThread.runAfter(() -> { // setup before sending to avoid race conditions if (!stopped) { diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 36bb8f3d77a..00f3a2c36a3 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -1264,6 +1264,7 @@ dao.proposal.menuItem.make=Make proposal dao.proposal.menuItem.browse=Browse open proposals dao.proposal.menuItem.vote=Vote on proposals dao.proposal.menuItem.result=Vote results +dao.proposal.menuItem.consensus=Network consensus dao.cycle.headline=Voting cycle dao.cycle.overview.headline=Voting cycle overview dao.cycle.currentPhase=Current phase @@ -1729,7 +1730,6 @@ dao.wallet.dashboard.burntTx=No. of all fee payments transactions dao.wallet.dashboard.price=Latest BSQ/BTC trade price (in Bisq) dao.wallet.dashboard.marketCap=Market capitalisation (based on trade price) - dao.wallet.receive.fundYourWallet=Your BSQ receive address dao.wallet.receive.bsqAddress=BSQ wallet address (Fresh unused address) @@ -1844,6 +1844,23 @@ dao.news.DAOOnTestnet.fourthSection.title=4. Explore a BSQ Block Explorer dao.news.DAOOnTestnet.fourthSection.content=Since BSQ is just bitcoin, you can see BSQ transactions on our bitcoin block explorer. dao.news.DAOOnTestnet.readMoreLink=Read the full documentation +dao.governance.consensus.headline=DAO network consensus +dao.governance.consensus.state=Status +dao.governance.consensus.daoStateInSync=Your local DAO state is in sync with the network +dao.governance.consensus.daoStateNotInSync=Your local DAO state is not in sync with the network. Please resync your \ + DAO state and if the conflict remains contact the Bisq developers. +dao.governance.consensus.resync=Resync DAO state +dao.governance.consensus.table.headline=Chain of DAO state hashes +dao.governance.consensus.table.blockHeight=Block height +dao.governance.consensus.table.hash=Hash of DAO state +dao.governance.consensus.table.prev=Previous hash of DAO state +dao.governance.consensus.table.numPeer=Peers +dao.governance.consensus.table.numMisMatches=Conflicts +dao.governance.consensus.conflictTable.headline=DAO states from peers in conflict +dao.governance.consensus.conflictTable.peer=Peer's address +dao.governance.consensus.conflictTable.request=Request all hashes + + #################################################################### # Windows #################################################################### diff --git a/desktop/src/main/java/bisq/desktop/bisq.css b/desktop/src/main/java/bisq/desktop/bisq.css index b2ff670a49d..8a2d2bd26d4 100644 --- a/desktop/src/main/java/bisq/desktop/bisq.css +++ b/desktop/src/main/java/bisq/desktop/bisq.css @@ -2049,6 +2049,14 @@ textfield */ -fx-fill: -fx-accent; } +.dao-inSync { + -fx-text-fill: -bs-rd-green; +} + +.dao-inConflict { + -fx-text-fill: -bs-rd-error-red; +} + /******************************************************************************************************************** * * * Notifications * diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java index dd275f1ddc4..99866949f0d 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java @@ -27,6 +27,7 @@ import bisq.desktop.components.MenuItem; import bisq.desktop.main.MainView; import bisq.desktop.main.dao.DaoView; +import bisq.desktop.main.dao.governance.consensus.ConsensusView; import bisq.desktop.main.dao.governance.dashboard.GovernanceDashboardView; import bisq.desktop.main.dao.governance.make.MakeProposalView; import bisq.desktop.main.dao.governance.proposals.ProposalsView; @@ -56,7 +57,7 @@ public class GovernanceView extends ActivatableViewAndModel { private final Navigation navigation; private final DaoFacade daoFacade; - private MenuItem dashboard, make, open, result; + private MenuItem dashboard, make, open, result, consensus; private Navigation.Listener navigationListener; @FXML @@ -102,7 +103,10 @@ public void initialize() { ProposalsView.class, baseNavPath); result = new MenuItem(navigation, toggleGroup, Res.get("dao.proposal.menuItem.result"), VoteResultView.class, baseNavPath); - leftVBox.getChildren().addAll(dashboard, make, open, result); + consensus = new MenuItem(navigation, toggleGroup, Res.get("dao.proposal.menuItem.consensus"), + ConsensusView.class, baseNavPath); + + leftVBox.getChildren().addAll(dashboard, make, open, result, consensus); } @Override @@ -113,6 +117,7 @@ protected void activate() { make.activate(); open.activate(); result.activate(); + consensus.activate(); navigation.addListener(navigationListener); ViewPath viewPath = navigation.getCurrentPath(); @@ -140,6 +145,7 @@ protected void deactivate() { make.deactivate(); open.deactivate(); result.deactivate(); + consensus.deactivate(); } private void loadView(Class viewClass) { @@ -150,6 +156,7 @@ private void loadView(Class viewClass) { else if (view instanceof MakeProposalView) toggleGroup.selectToggle(make); else if (view instanceof ProposalsView) toggleGroup.selectToggle(open); else if (view instanceof VoteResultView) toggleGroup.selectToggle(result); + else if (view instanceof ConsensusView) toggleGroup.selectToggle(consensus); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.fxml b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.fxml new file mode 100644 index 00000000000..67f8c870dca --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.fxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java new file mode 100644 index 00000000000..d3cfb950faf --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java @@ -0,0 +1,563 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.governance.consensus; + +import bisq.desktop.common.view.ActivatableView; +import bisq.desktop.common.view.FxmlView; +import bisq.desktop.components.AutoTooltipButton; +import bisq.desktop.components.AutoTooltipLabel; +import bisq.desktop.components.AutoTooltipTableColumn; +import bisq.desktop.components.TableGroupHeadline; +import bisq.desktop.main.overlays.popups.Popup; +import bisq.desktop.util.FormBuilder; +import bisq.desktop.util.GUIUtil; +import bisq.desktop.util.Layout; + +import bisq.core.dao.DaoFacade; +import bisq.core.dao.state.DaoStateListener; +import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.monitoring.DaoStateMonitoringService; +import bisq.core.locale.Res; + +import javax.inject.Inject; + +import de.jensd.fx.fontawesome.AwesomeIcon; + +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Priority; + +import javafx.geometry.Insets; + +import org.fxmisc.easybind.EasyBind; +import org.fxmisc.easybind.Subscription; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.beans.property.SimpleBooleanProperty; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.transformation.SortedList; + +import javafx.util.Callback; + +import java.util.Comparator; +import java.util.stream.Collectors; + +import static bisq.desktop.util.FormBuilder.addTitledGroupBg; + +@FxmlView +public class ConsensusView extends ActivatableView implements DaoStateListener, DaoStateMonitoringService.Listener { + private final DaoStateService daoStateService; + private final DaoFacade daoFacade; + private final DaoStateMonitoringService daoStateMonitoringService; + + private TextField statusTextField; + private Button resyncButton; + private TableView tableView; + private TableView conflictTableView; + + private final ObservableList listItems = FXCollections.observableArrayList(); + private final SortedList sortedList = new SortedList<>(listItems); + private final ObservableList daoStateInConflictListItems = FXCollections.observableArrayList(); + private final SortedList sortedConflictList = new SortedList<>(daoStateInConflictListItems); + + private int gridRow = 0; + private Subscription selectedItemSubscription; + private BooleanProperty isInConflict = new SimpleBooleanProperty(); + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor, lifecycle + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + private ConsensusView(DaoStateService daoStateService, + DaoFacade daoFacade, + DaoStateMonitoringService daoStateMonitoringService) { + this.daoStateService = daoStateService; + this.daoFacade = daoFacade; + this.daoStateMonitoringService = daoStateMonitoringService; + } + + @Override + public void initialize() { + super.initialize(); + + addTitledGroupBg(root, gridRow, 3, Res.get("dao.governance.consensus.headline")); + + statusTextField = FormBuilder.addTopLabelTextField(root, ++gridRow, + Res.get("dao.governance.consensus.state")).second; + resyncButton = FormBuilder.addButton(root, ++gridRow, Res.get("dao.governance.consensus.resync"), 10); + + createTableView(); + createDetailsView(); + } + + @Override + protected void activate() { + selectedItemSubscription = EasyBind.subscribe(tableView.getSelectionModel().selectedItemProperty(), this::onSelectItem); + + sortedList.comparatorProperty().bind(tableView.comparatorProperty()); + sortedConflictList.comparatorProperty().bind(conflictTableView.comparatorProperty()); + + daoStateService.addDaoStateListener(this); + daoStateMonitoringService.addListener(this); + + resyncButton.visibleProperty().bind(isInConflict); + resyncButton.managedProperty().bind(isInConflict); + + resyncButton.setOnAction(e -> daoFacade.resyncDao(() -> + new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup")) + .useShutDownButton() + .hideCloseButton() + .show()) + ); + + onDataUpdate(); + } + + @Override + protected void deactivate() { + selectedItemSubscription.unsubscribe(); + + sortedList.comparatorProperty().unbind(); + sortedConflictList.comparatorProperty().unbind(); + + daoStateService.removeDaoStateListener(this); + daoStateMonitoringService.removeListener(this); + + resyncButton.visibleProperty().unbind(); + resyncButton.managedProperty().unbind(); + + resyncButton.setOnAction(null); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoStateListener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onParseBlockChainComplete() { + onDataUpdate(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoStateMonitoringService.Listener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onDaoStateBlockchainChanged() { + if (daoStateService.isParseBlockChainComplete()) { + onDataUpdate(); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Create table views + /////////////////////////////////////////////////////////////////////////////////////////// + + private void createTableView() { + TableGroupHeadline headline = new TableGroupHeadline(Res.get("dao.governance.consensus.table.headline")); + GridPane.setRowIndex(headline, ++gridRow); + GridPane.setMargin(headline, new Insets(Layout.GROUP_DISTANCE, -10, -10, -10)); + root.getChildren().add(headline); + + tableView = new TableView<>(); + tableView.setPlaceholder(new AutoTooltipLabel(Res.get("table.placeholder.noData"))); + tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); + tableView.setPrefHeight(100); + + createColumns(); + GridPane.setRowIndex(tableView, gridRow); + GridPane.setHgrow(tableView, Priority.ALWAYS); + GridPane.setMargin(tableView, new Insets(Layout.FIRST_ROW_AND_GROUP_DISTANCE, -10, -25, -10)); + root.getChildren().add(tableView); + + tableView.setItems(sortedList); + } + + private void createDetailsView() { + TableGroupHeadline conflictTableHeadline = new TableGroupHeadline(Res.get("dao.governance.consensus.conflictTable.headline")); + GridPane.setRowIndex(conflictTableHeadline, ++gridRow); + GridPane.setMargin(conflictTableHeadline, new Insets(Layout.GROUP_DISTANCE, -10, -10, -10)); + root.getChildren().add(conflictTableHeadline); + + conflictTableView = new TableView<>(); + conflictTableView.setPlaceholder(new AutoTooltipLabel(Res.get("table.placeholder.noData"))); + conflictTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); + conflictTableView.setPrefHeight(100); + + createConflictColumns(); + GridPane.setRowIndex(conflictTableView, gridRow); + GridPane.setHgrow(conflictTableView, Priority.ALWAYS); + GridPane.setMargin(conflictTableView, new Insets(Layout.FIRST_ROW_AND_GROUP_DISTANCE, -10, -25, -10)); + root.getChildren().add(conflictTableView); + + conflictTableView.setItems(sortedConflictList); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Handler + /////////////////////////////////////////////////////////////////////////////////////////// + + private void onSelectItem(DaoStateBlockListItem item) { + if (item != null) { + daoStateInConflictListItems.setAll(item.getDaoStateBlock().getInConflictMap().entrySet().stream() + .map(e -> new DaoStateInConflictListItem(e.getKey(), e.getValue())).collect(Collectors.toList())); + GUIUtil.setFitToRowsForTableView(conflictTableView, 25, 28, 2, 4); + conflictTableView.layout(); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void onDataUpdate() { + isInConflict.set(daoStateMonitoringService.isInConflict()); + if (isInConflict.get()) { + statusTextField.setText(Res.get("dao.governance.consensus.daoStateNotInSync")); + statusTextField.getStyleClass().add("dao-inConflict"); + } else { + statusTextField.setText(Res.get("dao.governance.consensus.daoStateInSync")); + statusTextField.getStyleClass().remove("dao-inConflict"); + } + + listItems.setAll(daoStateMonitoringService.getDaoStateBlockchain().stream() + .map(DaoStateBlockListItem::new) + .collect(Collectors.toList())); + GUIUtil.setFitToRowsForTableView(tableView, 25, 28, 2, 5); + tableView.layout(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // TableColumns + /////////////////////////////////////////////////////////////////////////////////////////// + + private void createColumns() { + TableColumn column; + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.blockHeight")); + column.setMinWidth(110); + column.setMaxWidth(column.getMinWidth()); + column.getStyleClass().add("first-column"); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getHeight()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateBlockListItem::getHeight)); + column.setSortType(TableColumn.SortType.DESCENDING); + tableView.getColumns().add(column); + tableView.getSortOrder().add(column); + + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.hash")); + column.setMinWidth(120); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getHash()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateBlockListItem::getHash)); + tableView.getColumns().add(column); + + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.prev")); + column.setMinWidth(120); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + + @Override + public TableCell call(TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getPrevHash()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateBlockListItem::getPrevHash)); + tableView.getColumns().add(column); + + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.numPeer")); + column.setMinWidth(80); + column.setMaxWidth(column.getMinWidth()); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getNumNetworkMessages()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateBlockListItem::getNumNetworkMessages)); + tableView.getColumns().add(column); + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.numMisMatches")); + column.setMinWidth(80); + column.setMaxWidth(column.getMinWidth()); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getNumMisMatches()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateBlockListItem::getNumMisMatches)); + tableView.getColumns().add(column); + + column = new AutoTooltipTableColumn<>(""); + column.setMinWidth(40); + column.setMaxWidth(column.getMinWidth()); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null && !empty) { + Label icon; + if (item.isInSync()) { + icon = FormBuilder.getIcon(AwesomeIcon.OK_CIRCLE); + icon.getStyleClass().addAll("icon", "dao-inSync"); + } else { + icon = FormBuilder.getIcon(AwesomeIcon.REMOVE_CIRCLE); + icon.getStyleClass().addAll("icon", "dao-inConflict"); + } + setGraphic(icon); + } else { + setGraphic(null); + } + } + }; + } + }); + column.setSortable(false); + tableView.getColumns().add(column); + } + + private void createConflictColumns() { + TableColumn column; + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.blockHeight")); + column.setMinWidth(80); + column.getStyleClass().add("first-column"); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getBlockHeight()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getBlockHeight)); + column.setSortType(TableColumn.SortType.DESCENDING); + conflictTableView.getColumns().add(column); + conflictTableView.getSortOrder().add(column); + + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.conflictTable.peer")); + column.setMinWidth(80); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getPeerAddress()); + else + setText(""); + } + }; + } + }); + // column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getPeerAddress)); + conflictTableView.getColumns().add(column); + + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.hash")); + column.setMinWidth(150); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getHash()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getHash)); + conflictTableView.getColumns().add(column); + + + column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.prev")); + column.setMinWidth(150); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getPrevHash()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getPrevHash)); + conflictTableView.getColumns().add(column); + + + column = new AutoTooltipTableColumn<>(""); + column.setMinWidth(100); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + Button button; + + @Override + public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null && !empty) { + if (button == null) { + button = new AutoTooltipButton(Res.get("dao.governance.consensus.conflictTable.request")); + setGraphic(button); + } + button.setOnAction(e -> daoStateMonitoringService.requestHashesFromGenesisBlockHeight(item.getPeerAddress())); + } else { + setGraphic(null); + if (button != null) { + button.setOnAction(null); + button = null; + } + } + } + }; + } + }); + column.setSortable(false); + conflictTableView.getColumns().add(column); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java new file mode 100644 index 00000000000..0ebee88574f --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java @@ -0,0 +1,50 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.governance.consensus; + +import bisq.core.dao.state.monitoring.DaoStateBlock; +import bisq.core.locale.Res; + +import bisq.common.util.Utilities; + +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +class DaoStateBlockListItem { + private final DaoStateBlock daoStateBlock; + private final String height; + private final String hash; + private final String prevHash; + private final String numNetworkMessages; + private final String numMisMatches; + private final boolean isInSync; + + DaoStateBlockListItem(DaoStateBlock daoStateBlock) { + this.daoStateBlock = daoStateBlock; + + height = String.valueOf(daoStateBlock.getBlockHeight()); + hash = Utilities.bytesAsHexString(daoStateBlock.getHash()); + prevHash = daoStateBlock.getPrevHash().length > 0 ? Utilities.bytesAsHexString(daoStateBlock.getPrevHash()) : Res.get("shared.na"); + numNetworkMessages = String.valueOf(daoStateBlock.getPeersMap().size()); + int size = daoStateBlock.getInConflictMap().size(); + numMisMatches = String.valueOf(size); + isInSync = size == 0; + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java new file mode 100644 index 00000000000..9fb0a54887a --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java @@ -0,0 +1,44 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.governance.consensus; + +import bisq.core.dao.state.monitoring.DaoStateHash; +import bisq.core.locale.Res; + +import bisq.common.util.Utilities; + +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +class DaoStateInConflictListItem { + private final String peerAddress; + private final String blockHeight; + private final String hash; + private final String prevHash; + + DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash) { + this.peerAddress = peerAddress; + blockHeight = String.valueOf(daoStateHash.getBlockHeight()); + hash = Utilities.bytesAsHexString(daoStateHash.getHash()); + prevHash = daoStateHash.getPrevHash().length > 0 ? + Utilities.bytesAsHexString(daoStateHash.getPrevHash()) : + Res.get("shared.na"); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java index 916efe7dc5f..57335f85a40 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java @@ -178,8 +178,6 @@ private ProposalsView(DaoFacade daoFacade, public void initialize() { super.initialize(); - root.getStyleClass().add("vote-root"); - gridRow = phasesView.addGroup(root, gridRow); proposalDisplayGridPane = new GridPane(); From f56041383f1be86550330a8f49870cc1490218c6 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 11 Mar 2019 20:32:39 -0500 Subject: [PATCH 09/31] Update UI, remove checkArgument call --- .../state/monitoring/DaoStateMonitoringService.java | 10 +++++++--- .../main/dao/governance/consensus/ConsensusView.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java index 3fc14ec1857..f13b3b3e9a3 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java @@ -203,9 +203,13 @@ private void processNewBlock(Block block) { int height = block.getHeight(); if (daoStateBlockchain.isEmpty()) { // Only at genesis we allow an empty prevHash - checkArgument(height == genesisTxInfo.getGenesisBlockHeight(), - "If daoStateBlockchain is empty we need to have received the genesis block."); - prevHash = new byte[0]; + if (height == genesisTxInfo.getGenesisBlockHeight()) { + prevHash = new byte[0]; + } else { + log.warn("DaoStateBlockchain is empty but we received the block which was not the genesis block. " + + "We stop execution here."); + return; + } } else { // TODO check if in reorg cases it might be a valid case checkArgument(height > daoStateBlockchain.getLast().getBlockHeight(), diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java index d3cfb950faf..92e3d37c01c 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java @@ -230,7 +230,7 @@ private void onSelectItem(DaoStateBlockListItem item) { if (item != null) { daoStateInConflictListItems.setAll(item.getDaoStateBlock().getInConflictMap().entrySet().stream() .map(e -> new DaoStateInConflictListItem(e.getKey(), e.getValue())).collect(Collectors.toList())); - GUIUtil.setFitToRowsForTableView(conflictTableView, 25, 28, 2, 4); + GUIUtil.setFitToRowsForTableView(conflictTableView, 38, 28, 2, 4); conflictTableView.layout(); } } From dbb0ba32e13edc14db604f81f2f8a89f2e6c343f Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 11 Mar 2019 22:15:33 -0500 Subject: [PATCH 10/31] Add check for address --- .../network/RequestDaoStateHashHandler.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java b/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java index c1e0651218a..037e2aa5a11 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java @@ -159,24 +159,28 @@ public void cancel() { @Override public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { if (networkEnvelope instanceof GetDaoStateHashResponse) { - if (!stopped) { - GetDaoStateHashResponse getDaoStateHashResponse = (GetDaoStateHashResponse) networkEnvelope; - if (getDaoStateHashResponse.getRequestNonce() == nonce) { - stopTimeoutTimer(); - cleanup(); - log.info("We received from peer {} a DaoStateHashResponse with {} daoStateHashes", - nodeAddress.getFullAddress(), getDaoStateHashResponse.getDaoStateHashes().size()); - listener.onComplete(getDaoStateHashResponse, connection.getPeersNodeAddressOptional()); + if (connection.getPeersNodeAddressOptional().isPresent() && connection.getPeersNodeAddressOptional().get().equals(nodeAddress)) { + if (!stopped) { + GetDaoStateHashResponse getDaoStateHashResponse = (GetDaoStateHashResponse) networkEnvelope; + if (getDaoStateHashResponse.getRequestNonce() == nonce) { + stopTimeoutTimer(); + cleanup(); + log.info("We received from peer {} a DaoStateHashResponse with {} daoStateHashes", + nodeAddress.getFullAddress(), getDaoStateHashResponse.getDaoStateHashes().size()); + listener.onComplete(getDaoStateHashResponse, connection.getPeersNodeAddressOptional()); + } else { + log.warn("Nonce not matching. That can happen rarely if we get a response after a canceled " + + "handshake (timeout causes connection close but peer might have sent a msg before " + + "connection was closed).\n\t" + + "We drop that message. nonce={} / requestNonce={}", + nonce, getDaoStateHashResponse.getRequestNonce()); + } } else { - log.warn("Nonce not matching. That can happen rarely if we get a response after a canceled " + - "handshake (timeout causes connection close but peer might have sent a msg before " + - "connection was closed).\n\t" + - "We drop that message. nonce={} / requestNonce={}", - nonce, getDaoStateHashResponse.getRequestNonce()); + log.warn("We have stopped already."); } - } else { - log.warn("We have stopped already."); } + } else { + log.warn("We got a message from another connection and ignore it. That should never happen."); } } From c280f30fa72ad8061afc5ab0b87e707e91bdae2d Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 13 Mar 2019 10:56:24 -0500 Subject: [PATCH 11/31] Use domain data or sorting --- .../main/dao/governance/consensus/ConsensusView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java index 92e3d37c01c..019c4ecb8fa 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java @@ -287,7 +287,7 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateBlockListItem::getHeight)); + column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getBlockHeight())); column.setSortType(TableColumn.SortType.DESCENDING); tableView.getColumns().add(column); tableView.getSortOrder().add(column); @@ -363,7 +363,7 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateBlockListItem::getNumNetworkMessages)); + column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getPeersMap().size())); tableView.getColumns().add(column); column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.numMisMatches")); @@ -387,7 +387,7 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateBlockListItem::getNumMisMatches)); + column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getInConflictMap().size())); tableView.getColumns().add(column); column = new AutoTooltipTableColumn<>(""); @@ -448,7 +448,7 @@ public void updateItem(final DaoStateInConflictListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getBlockHeight)); + column.setComparator(Comparator.comparing(e -> e.getDaoStateHash().getBlockHeight())); column.setSortType(TableColumn.SortType.DESCENDING); conflictTableView.getColumns().add(column); conflictTableView.getSortOrder().add(column); From 47024d18b6fbf08d8b2e85058e69124c5dbb5f18 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 13 Mar 2019 11:08:23 -0500 Subject: [PATCH 12/31] Show dash instead of N/A for prev hash at genesis height --- .../dao/governance/consensus/DaoStateBlockListItem.java | 3 +-- .../governance/consensus/DaoStateInConflictListItem.java | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java index 0ebee88574f..bf6c3fc7ffb 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java @@ -18,7 +18,6 @@ package bisq.desktop.main.dao.governance.consensus; import bisq.core.dao.state.monitoring.DaoStateBlock; -import bisq.core.locale.Res; import bisq.common.util.Utilities; @@ -41,7 +40,7 @@ class DaoStateBlockListItem { height = String.valueOf(daoStateBlock.getBlockHeight()); hash = Utilities.bytesAsHexString(daoStateBlock.getHash()); - prevHash = daoStateBlock.getPrevHash().length > 0 ? Utilities.bytesAsHexString(daoStateBlock.getPrevHash()) : Res.get("shared.na"); + prevHash = daoStateBlock.getPrevHash().length > 0 ? Utilities.bytesAsHexString(daoStateBlock.getPrevHash()) : "-"; numNetworkMessages = String.valueOf(daoStateBlock.getPeersMap().size()); int size = daoStateBlock.getInConflictMap().size(); numMisMatches = String.valueOf(size); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java index 9fb0a54887a..ff728fc68f5 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java @@ -18,7 +18,6 @@ package bisq.desktop.main.dao.governance.consensus; import bisq.core.dao.state.monitoring.DaoStateHash; -import bisq.core.locale.Res; import bisq.common.util.Utilities; @@ -32,13 +31,14 @@ class DaoStateInConflictListItem { private final String blockHeight; private final String hash; private final String prevHash; + private final DaoStateHash daoStateHash; DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash) { + this.daoStateHash = daoStateHash; this.peerAddress = peerAddress; blockHeight = String.valueOf(daoStateHash.getBlockHeight()); hash = Utilities.bytesAsHexString(daoStateHash.getHash()); prevHash = daoStateHash.getPrevHash().length > 0 ? - Utilities.bytesAsHexString(daoStateHash.getPrevHash()) : - Res.get("shared.na"); + Utilities.bytesAsHexString(daoStateHash.getPrevHash()) : "-"; } } From d235e9c08e2169a0ce2c36c09f46c3c1cb8974ec Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 13 Mar 2019 12:50:05 -0500 Subject: [PATCH 13/31] Avoid logging at startup --- .../blindvote/BlindVoteListService.java | 10 ++++---- .../governance/proposal/ProposalService.java | 24 +++++++++++-------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java b/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java index 6e1219cf01e..8face7cda61 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java @@ -105,7 +105,7 @@ public void onParseBlockChainComplete() { @Override public void onAdded(PersistableNetworkPayload payload) { - onAppendOnlyDataAdded(payload); + onAppendOnlyDataAdded(payload, true); } @@ -126,10 +126,10 @@ public List getBlindVotesInPhaseAndCycle() { /////////////////////////////////////////////////////////////////////////////////////////// private void fillListFromAppendOnlyDataStore() { - p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().forEach(this::onAppendOnlyDataAdded); + p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().forEach(e -> onAppendOnlyDataAdded(e, false)); } - private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkPayload) { + private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkPayload, boolean doLog) { if (persistableNetworkPayload instanceof BlindVotePayload) { BlindVotePayload blindVotePayload = (BlindVotePayload) persistableNetworkPayload; if (!blindVotePayloads.contains(blindVotePayload)) { @@ -140,7 +140,9 @@ private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkP if (blindVoteValidator.areDataFieldsValid(blindVote)) { // We don't validate as we might receive blindVotes from other cycles or phases at startup. blindVotePayloads.add(blindVotePayload); - log.info("We received a blindVotePayload. blindVoteTxId={}", txId); + if (doLog) { + log.info("We received a blindVotePayload. blindVoteTxId={}", txId); + } } else { log.warn("We received an invalid blindVotePayload. blindVoteTxId={}", txId); } diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/ProposalService.java b/core/src/main/java/bisq/core/dao/governance/proposal/ProposalService.java index c38ea0dd476..741d8a958be 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/ProposalService.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/ProposalService.java @@ -131,7 +131,7 @@ public void start() { @Override public void onAdded(ProtectedStorageEntry entry) { - onProtectedDataAdded(entry); + onProtectedDataAdded(entry, true); } @Override @@ -146,7 +146,7 @@ public void onRemoved(ProtectedStorageEntry entry) { @Override public void onAdded(PersistableNetworkPayload payload) { - onAppendOnlyDataAdded(payload); + onAppendOnlyDataAdded(payload, true); } @@ -190,11 +190,11 @@ public List getValidatedProposals() { /////////////////////////////////////////////////////////////////////////////////////////// private void fillListFromProtectedStore() { - p2PService.getDataMap().values().forEach(this::onProtectedDataAdded); + p2PService.getDataMap().values().forEach(e -> onProtectedDataAdded(e, false)); } private void fillListFromAppendOnlyDataStore() { - p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().forEach(this::onAppendOnlyDataAdded); + p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().forEach(e -> onAppendOnlyDataAdded(e, false)); } private void publishToAppendOnlyDataStore() { @@ -211,7 +211,7 @@ private void publishToAppendOnlyDataStore() { }); } - private void onProtectedDataAdded(ProtectedStorageEntry entry) { + private void onProtectedDataAdded(ProtectedStorageEntry entry, boolean doLog) { ProtectedStoragePayload protectedStoragePayload = entry.getProtectedStoragePayload(); if (protectedStoragePayload instanceof TempProposalPayload) { Proposal proposal = ((TempProposalPayload) protectedStoragePayload).getProposal(); @@ -219,8 +219,10 @@ private void onProtectedDataAdded(ProtectedStorageEntry entry) { // available/confirmed. But we check if we are in the proposal phase. if (!tempProposals.contains(proposal)) { if (proposalValidator.isValidOrUnconfirmed(proposal)) { - log.info("We received a TempProposalPayload and store it to our protectedStoreList. proposalTxId={}", - proposal.getTxId()); + if (doLog) { + log.info("We received a TempProposalPayload and store it to our protectedStoreList. proposalTxId={}", + proposal.getTxId()); + } tempProposals.add(proposal); } else { log.debug("We received an invalid proposal from the P2P network. Proposal.txId={}, blockHeight={}", @@ -256,14 +258,16 @@ private void onProtectedDataRemoved(ProtectedStorageEntry entry) { } } - private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkPayload) { + private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkPayload, boolean doLog) { if (persistableNetworkPayload instanceof ProposalPayload) { ProposalPayload proposalPayload = (ProposalPayload) persistableNetworkPayload; if (!proposalPayloads.contains(proposalPayload)) { Proposal proposal = proposalPayload.getProposal(); if (proposalValidator.areDataFieldsValid(proposal)) { - log.info("We received a ProposalPayload and store it to our appendOnlyStoreList. proposalTxId={}", - proposal.getTxId()); + if (doLog) { + log.info("We received a ProposalPayload and store it to our appendOnlyStoreList. proposalTxId={}", + proposal.getTxId()); + } proposalPayloads.add(proposalPayload); } else { log.warn("We received a invalid append-only proposal from the P2P network. " + From eb3d65d187f55c77ed15dc02f733397f68d1f47e Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 13 Mar 2019 22:03:14 -0500 Subject: [PATCH 14/31] Add snapshot support for hashChain - Add hashChain to snapshot - Use TreeMap instead of Map to have deterministic order - Use eventCoordinator to make correct order of execution transparent - Fix missing applying of nonBsqTxOutputMap at applySnapshot --- common/src/main/proto/pb.proto | 1 + .../java/bisq/core/btc/BitcoinModule.java | 9 ++- .../main/java/bisq/core/dao/DaoModule.java | 2 + .../src/main/java/bisq/core/dao/DaoSetup.java | 9 ++- .../core/dao/state/DaoEventCoordinator.java | 67 +++++++++++++++++ .../bisq/core/dao/state/DaoStateListener.java | 3 - .../bisq/core/dao/state/DaoStateService.java | 40 +++++++--- .../dao/state/DaoStateSnapshotService.java | 75 +++++++++++-------- .../dao/state/DaoStateStorageService.java | 23 ++++-- .../bisq/core/dao/state/DaoStateStore.java | 27 +++++-- .../bisq/core/dao/state/model/DaoState.java | 62 +++++++++------ .../state/model/blockchain/TxOutputKey.java | 9 ++- .../monitoring/DaoStateMonitoringService.java | 63 ++++++++++------ 13 files changed, 281 insertions(+), 109 deletions(-) create mode 100644 core/src/main/java/bisq/core/dao/state/DaoEventCoordinator.java diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index cbd1a2760f3..599499cc244 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -1726,6 +1726,7 @@ message DecryptedBallotsWithMerits { message DaoStateStore { BsqState bsq_state = 1; + repeated DaoStateHash dao_state_hash = 2; } message DaoStateHash { diff --git a/core/src/main/java/bisq/core/btc/BitcoinModule.java b/core/src/main/java/bisq/core/btc/BitcoinModule.java index bb4af9fafb1..60c55d31c65 100644 --- a/core/src/main/java/bisq/core/btc/BitcoinModule.java +++ b/core/src/main/java/bisq/core/btc/BitcoinModule.java @@ -56,9 +56,12 @@ public BitcoinModule(Environment environment) { protected void configure() { // We we have selected BTC_DAO_TESTNET we use our master regtest node, otherwise the specified host or default // (localhost) - String regTestHost = BisqEnvironment.getBaseCurrencyNetwork().isDaoTestNet() ? - "104.248.31.39" : - environment.getProperty(BtcOptionKeys.REG_TEST_HOST, String.class, RegTestHost.DEFAULT_HOST); + String regTestHost = environment.getProperty(BtcOptionKeys.REG_TEST_HOST, String.class, ""); + if (regTestHost.isEmpty()) { + regTestHost = BisqEnvironment.getBaseCurrencyNetwork().isDaoTestNet() ? + "104.248.31.39" : + RegTestHost.DEFAULT_HOST; + } RegTestHost.HOST = regTestHost; if (Arrays.asList("localhost", "127.0.0.1").contains(regTestHost)) { diff --git a/core/src/main/java/bisq/core/dao/DaoModule.java b/core/src/main/java/bisq/core/dao/DaoModule.java index 37ef0401874..2a7c9e431c4 100644 --- a/core/src/main/java/bisq/core/dao/DaoModule.java +++ b/core/src/main/java/bisq/core/dao/DaoModule.java @@ -73,6 +73,7 @@ import bisq.core.dao.node.lite.network.LiteNodeNetworkService; import bisq.core.dao.node.parser.BlockParser; import bisq.core.dao.node.parser.TxParser; +import bisq.core.dao.state.DaoEventCoordinator; import bisq.core.dao.state.DaoStateService; import bisq.core.dao.state.DaoStateSnapshotService; import bisq.core.dao.state.DaoStateStorageService; @@ -101,6 +102,7 @@ public DaoModule(Environment environment) { protected void configure() { bind(DaoSetup.class).in(Singleton.class); bind(DaoFacade.class).in(Singleton.class); + bind(DaoEventCoordinator.class).in(Singleton.class); bind(DaoKillSwitch.class).in(Singleton.class); // Node, parser diff --git a/core/src/main/java/bisq/core/dao/DaoSetup.java b/core/src/main/java/bisq/core/dao/DaoSetup.java index f4aa6f44330..3bdfaca2f4d 100644 --- a/core/src/main/java/bisq/core/dao/DaoSetup.java +++ b/core/src/main/java/bisq/core/dao/DaoSetup.java @@ -34,6 +34,7 @@ import bisq.core.dao.node.BsqNode; import bisq.core.dao.node.BsqNodeProvider; import bisq.core.dao.node.explorer.ExportJsonFilesService; +import bisq.core.dao.state.DaoEventCoordinator; import bisq.core.dao.state.DaoStateService; import bisq.core.dao.state.monitoring.DaoStateMonitoringService; @@ -71,11 +72,17 @@ public DaoSetup(BsqNodeProvider bsqNodeProvider, DaoFacade daoFacade, ExportJsonFilesService exportJsonFilesService, DaoKillSwitch daoKillSwitch, - DaoStateMonitoringService daoStateMonitoringService) { + DaoStateMonitoringService daoStateMonitoringService, + DaoEventCoordinator daoEventCoordinator) { bsqNode = bsqNodeProvider.getBsqNode(); // We need to take care of order of execution. + + // For order critical event flow we use the daoEventCoordinator to delegate the calls from anonymous listeners + // to concrete clients. + daoSetupServices.add(daoEventCoordinator); + daoSetupServices.add(daoStateService); daoSetupServices.add(cycleService); daoSetupServices.add(ballotListService); diff --git a/core/src/main/java/bisq/core/dao/state/DaoEventCoordinator.java b/core/src/main/java/bisq/core/dao/state/DaoEventCoordinator.java new file mode 100644 index 00000000000..e8822a16dc1 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/state/DaoEventCoordinator.java @@ -0,0 +1,67 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.state; + +import bisq.core.dao.DaoSetupService; +import bisq.core.dao.state.model.blockchain.Block; +import bisq.core.dao.state.monitoring.DaoStateMonitoringService; + +import javax.inject.Inject; + +public class DaoEventCoordinator implements DaoSetupService, DaoStateListener { + private final DaoStateService daoStateService; + private final DaoStateSnapshotService daoStateSnapshotService; + private final DaoStateMonitoringService daoStateMonitoringService; + + @Inject + public DaoEventCoordinator(DaoStateService daoStateService, + DaoStateSnapshotService daoStateSnapshotService, + DaoStateMonitoringService daoStateMonitoringService) { + this.daoStateService = daoStateService; + this.daoStateSnapshotService = daoStateSnapshotService; + this.daoStateMonitoringService = daoStateMonitoringService; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoSetupService + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void addListeners() { + this.daoStateService.addDaoStateListener(this); + } + + @Override + public void start() { + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoStateListener + /////////////////////////////////////////////////////////////////////////////////////////// + + // We listen onDaoStateChanged to ensure the dao state has been processed from listener clients after parsing. + // We need to listen during batch processing as well to write snapshots during that process. + @Override + public void onDaoStateChanged(Block block) { + // We need to execute first the daoStateMonitoringService + daoStateMonitoringService.createHashFromBlock(block); + daoStateSnapshotService.maybeCreateSnapshot(block); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateListener.java b/core/src/main/java/bisq/core/dao/state/DaoStateListener.java index 68a9ff259b4..02b19da71ac 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateListener.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateListener.java @@ -37,7 +37,4 @@ default void onParseBlockCompleteAfterBatchProcessing(Block block) { // block arrives. default void onDaoStateChanged(Block block) { } - - default void onSnapshotApplied() { - } } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index 947f4a85200..64f37251d55 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -46,9 +46,9 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.TreeMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -123,15 +123,18 @@ public void applySnapshot(DaoState snapshot) { daoState.getUnspentTxOutputMap().clear(); daoState.getUnspentTxOutputMap().putAll(snapshot.getUnspentTxOutputMap()); + daoState.getNonBsqTxOutputMap().clear(); + daoState.getNonBsqTxOutputMap().putAll(snapshot.getNonBsqTxOutputMap()); + + daoState.getSpentInfoMap().clear(); + daoState.getSpentInfoMap().putAll(snapshot.getSpentInfoMap()); + daoState.getConfiscatedLockupTxList().clear(); daoState.getConfiscatedLockupTxList().addAll(snapshot.getConfiscatedLockupTxList()); daoState.getIssuanceMap().clear(); daoState.getIssuanceMap().putAll(snapshot.getIssuanceMap()); - daoState.getSpentInfoMap().clear(); - daoState.getSpentInfoMap().putAll(snapshot.getSpentInfoMap()); - daoState.getParamChangeList().clear(); daoState.getParamChangeList().addAll(snapshot.getParamChangeList()); @@ -140,8 +143,6 @@ public void applySnapshot(DaoState snapshot) { daoState.getDecryptedBallotsWithMeritsList().clear(); daoState.getDecryptedBallotsWithMeritsList().addAll(snapshot.getDecryptedBallotsWithMeritsList()); - - daoStateListeners.forEach(l -> l.onSnapshotApplied()); } public DaoState getClone() { @@ -235,7 +236,6 @@ public void onParseBlockComplete(Block block) { // VoteResult and other listeners like balances usually listen on onParseTxsCompleteAfterBatchProcessing // so we need to make sure that vote result calculation is completed before (e.g. for comp. request to // update balance). - // TODO the dependency on ordering is nto good here.... Listeners should not depend on order of execution. daoStateListeners.forEach(l -> l.onParseBlockComplete(block)); // We use 2 different handlers as we don't want to update domain listeners during batch processing of all @@ -347,8 +347,8 @@ public Stream getTxStream() { .flatMap(block -> block.getTxs().stream()); } - public Map getTxMap() { - return getTxStream().collect(Collectors.toMap(Tx::getId, tx -> tx)); + public TreeMap getTxMap() { + return new TreeMap<>(getTxStream().collect(Collectors.toMap(Tx::getId, tx -> tx))); } public Set getTxs() { @@ -431,7 +431,7 @@ public Optional getTxOutput(TxOutputKey txOutputKey) { // UnspentTxOutput /////////////////////////////////////////////////////////////////////////////////////////// - public Map getUnspentTxOutputMap() { + public TreeMap getUnspentTxOutputMap() { return daoState.getUnspentTxOutputMap(); } @@ -630,13 +630,12 @@ public void addNonBsqTxOutput(TxOutput txOutput) { assertDaoStateChange(); checkArgument(txOutput.getTxOutputType() == TxOutputType.ISSUANCE_CANDIDATE_OUTPUT, "txOutput must be type ISSUANCE_CANDIDATE_OUTPUT"); - log.info("addNonBsqTxOutput: txOutput={}", txOutput); daoState.getNonBsqTxOutputMap().put(txOutput.getKey(), txOutput); } public Optional getBtcTxOutput(TxOutputKey key) { // Issuance candidates which did not got accepted in voting are covered here - Map nonBsqTxOutputMap = daoState.getNonBsqTxOutputMap(); + TreeMap nonBsqTxOutputMap = daoState.getNonBsqTxOutputMap(); if (nonBsqTxOutputMap.containsKey(key)) return Optional.of(nonBsqTxOutputMap.get(key)); @@ -956,9 +955,13 @@ public List getEvaluatedProposalList() { public void addEvaluatedProposalSet(Set evaluatedProposals) { assertDaoStateChange(); + evaluatedProposals.stream() .filter(e -> !daoState.getEvaluatedProposalList().contains(e)) .forEach(daoState.getEvaluatedProposalList()::add); + + // We need deterministic order for the hash chain + daoState.getEvaluatedProposalList().sort(Comparator.comparing(EvaluatedProposal::getProposalTxId)); } public List getDecryptedBallotsWithMeritsList() { @@ -967,9 +970,13 @@ public List getDecryptedBallotsWithMeritsList() { public void addDecryptedBallotsWithMeritsSet(Set decryptedBallotsWithMeritsSet) { assertDaoStateChange(); + decryptedBallotsWithMeritsSet.stream() .filter(e -> !daoState.getDecryptedBallotsWithMeritsList().contains(e)) .forEach(daoState.getDecryptedBallotsWithMeritsList()::add); + + // We need deterministic order for the hash chain + daoState.getDecryptedBallotsWithMeritsList().sort(Comparator.comparing(DecryptedBallotsWithMerits::getBlindVoteTxId)); } @@ -1003,6 +1010,15 @@ public void removeDaoStateListener(DaoStateListener listener) { } + /////////////////////////////////////////////////////////////////////////////////////////// + // Utils + /////////////////////////////////////////////////////////////////////////////////////////// + + public String daoStateToString() { + return daoState.toString(); + } + + /////////////////////////////////////////////////////////////////////////////////////////// // Private /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java b/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java index 1302ef28bbe..01c0f2fc754 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java @@ -20,6 +20,8 @@ import bisq.core.dao.governance.period.CycleService; import bisq.core.dao.state.model.DaoState; import bisq.core.dao.state.model.blockchain.Block; +import bisq.core.dao.state.monitoring.DaoStateHash; +import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import javax.inject.Inject; @@ -37,17 +39,20 @@ * SNAPSHOT_GRID old not less than 2 times the SNAPSHOT_GRID old. */ @Slf4j -public class DaoStateSnapshotService implements DaoStateListener { +public class DaoStateSnapshotService { private static final int SNAPSHOT_GRID = 20; private final DaoStateService daoStateService; private final GenesisTxInfo genesisTxInfo; private final CycleService cycleService; private final DaoStateStorageService daoStateStorageService; + private final DaoStateMonitoringService daoStateMonitoringService; - private DaoState snapshotCandidate; + private DaoState daoStateSnapshotCandidate; + private LinkedList daoStateHashChainSnapshotCandidate = new LinkedList<>(); private int chainHeightOfLastApplySnapshot; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @@ -56,79 +61,80 @@ public class DaoStateSnapshotService implements DaoStateListener { public DaoStateSnapshotService(DaoStateService daoStateService, GenesisTxInfo genesisTxInfo, CycleService cycleService, - DaoStateStorageService daoStateStorageService) { + DaoStateStorageService daoStateStorageService, + DaoStateMonitoringService daoStateMonitoringService) { this.daoStateService = daoStateService; this.genesisTxInfo = genesisTxInfo; this.cycleService = cycleService; this.daoStateStorageService = daoStateStorageService; - - this.daoStateService.addDaoStateListener(this); + this.daoStateMonitoringService = daoStateMonitoringService; } /////////////////////////////////////////////////////////////////////////////////////////// - // DaoStateListener + // API /////////////////////////////////////////////////////////////////////////////////////////// - // We listen to each ParseTxsComplete event even if the batch processing of all blocks at startup is not completed - // as we need to write snapshots during that batch processing. - @Override - public void onParseBlockComplete(Block block) { + // We do not use DaoStateListener.onDaoStateChanged but let the DaoEventCoordinator call maybeCreateSnapshot to ensure the + // correct order of execution. + // We need to process during batch processing as well to write snapshots during that process. + public void maybeCreateSnapshot(Block block) { int chainHeight = block.getHeight(); // Either we don't have a snapshot candidate yet, or if we have one the height at that snapshot candidate must be // different to our current height. - boolean noSnapshotCandidateOrDifferentHeight = snapshotCandidate == null || snapshotCandidate.getChainHeight() != chainHeight; + boolean noSnapshotCandidateOrDifferentHeight = daoStateSnapshotCandidate == null || + daoStateSnapshotCandidate.getChainHeight() != chainHeight; if (isSnapshotHeight(chainHeight) && !daoStateService.getBlocks().isEmpty() && isValidHeight(daoStateService.getBlocks().getLast().getHeight()) && noSnapshotCandidateOrDifferentHeight) { // At trigger event we store the latest snapshotCandidate to disc - if (snapshotCandidate != null) { + if (daoStateSnapshotCandidate != null) { // We clone because storage is in a threaded context and we set the snapshotCandidate to our current // state in the next step - DaoState cloned = daoStateService.getClone(snapshotCandidate); - daoStateStorageService.persist(cloned); + DaoState clonedDaoState = daoStateService.getClone(daoStateSnapshotCandidate); + LinkedList clonedDaoStateHashChain = new LinkedList<>(daoStateHashChainSnapshotCandidate); + daoStateStorageService.persist(clonedDaoState, clonedDaoStateHashChain); + log.info("Saved snapshotCandidate with height {} to Disc at height {} ", - snapshotCandidate.getChainHeight(), chainHeight); + daoStateSnapshotCandidate.getChainHeight(), chainHeight); } // Now we clone and keep it in memory for the next trigger event - snapshotCandidate = daoStateService.getClone(); + daoStateSnapshotCandidate = daoStateService.getClone(); + daoStateHashChainSnapshotCandidate = new LinkedList<>(daoStateMonitoringService.getDaoStateHashChain()); + log.info("Cloned new snapshotCandidate at height " + chainHeight); } } - - /////////////////////////////////////////////////////////////////////////////////////////// - // API - /////////////////////////////////////////////////////////////////////////////////////////// - public void applySnapshot(boolean fromReorg) { - DaoState persisted = daoStateStorageService.getPersistedBsqState(); - if (persisted != null) { - LinkedList blocks = persisted.getBlocks(); - int chainHeightOfPersisted = persisted.getChainHeight(); + DaoState persistedBsqState = daoStateStorageService.getPersistedBsqState(); + LinkedList persistedDaoStateHashChain = daoStateStorageService.getPersistedDaoStateHashChain(); + if (persistedBsqState != null) { + LinkedList blocks = persistedBsqState.getBlocks(); + int chainHeightOfPersisted = persistedBsqState.getChainHeight(); if (!blocks.isEmpty()) { int heightOfLastBlock = blocks.getLast().getHeight(); - log.info("applySnapshot from persisted daoState with height of last block {}", heightOfLastBlock); + log.info("applySnapshot from persistedBsqState daoState with height of last block {}", heightOfLastBlock); if (isValidHeight(heightOfLastBlock)) { if (chainHeightOfLastApplySnapshot != chainHeightOfPersisted) { chainHeightOfLastApplySnapshot = chainHeightOfPersisted; - daoStateService.applySnapshot(persisted); + daoStateService.applySnapshot(persistedBsqState); + daoStateMonitoringService.applySnapshot(persistedDaoStateHashChain); } else { // The reorg might have been caused by the previous parsing which might contains a range of // blocks. log.warn("We applied already a snapshot with chainHeight {}. We will reset the daoState and " + "start over from the genesis transaction again.", chainHeightOfLastApplySnapshot); - persisted = new DaoState(); - applyEmptySnapshot(persisted); + applyEmptySnapshot(); } } } else if (fromReorg) { log.info("We got a reorg and we want to apply the snapshot but it is empty. That is expected in the first blocks until the " + "first snapshot has been created. We use our applySnapshot method and restart from the genesis tx"); - applyEmptySnapshot(persisted); + applyEmptySnapshot(); } } else { log.info("Try to apply snapshot but no stored snapshot available. That is expected at first blocks."); @@ -144,13 +150,16 @@ private boolean isValidHeight(int heightOfLastBlock) { return heightOfLastBlock >= genesisTxInfo.getGenesisBlockHeight(); } - private void applyEmptySnapshot(DaoState persisted) { + private void applyEmptySnapshot() { + DaoState emptyDaoState = new DaoState(); int genesisBlockHeight = genesisTxInfo.getGenesisBlockHeight(); - persisted.setChainHeight(genesisBlockHeight); + emptyDaoState.setChainHeight(genesisBlockHeight); chainHeightOfLastApplySnapshot = genesisBlockHeight; - daoStateService.applySnapshot(persisted); + daoStateService.applySnapshot(emptyDaoState); // In case we apply an empty snapshot we need to trigger the cycleService.addFirstCycle method cycleService.addFirstCycle(); + + daoStateMonitoringService.applySnapshot(new LinkedList<>()); } @VisibleForTesting diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java b/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java index 97b334f7612..8cda072ed54 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java @@ -18,6 +18,8 @@ package bisq.core.dao.state; import bisq.core.dao.state.model.DaoState; +import bisq.core.dao.state.monitoring.DaoStateHash; +import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import bisq.network.p2p.storage.persistence.ResourceDataStoreService; import bisq.network.p2p.storage.persistence.StoreService; @@ -30,6 +32,7 @@ import java.io.File; +import java.util.LinkedList; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; @@ -41,7 +44,8 @@ public class DaoStateStorageService extends StoreService { private static final String FILE_NAME = "DaoStateStore"; - private DaoState daoState; + private final DaoState daoState; + private final DaoStateMonitoringService daoStateMonitoringService; /////////////////////////////////////////////////////////////////////////////////////////// @@ -51,10 +55,12 @@ public class DaoStateStorageService extends StoreService { @Inject public DaoStateStorageService(ResourceDataStoreService resourceDataStoreService, DaoState daoState, + DaoStateMonitoringService daoStateMonitoringService, @Named(Storage.STORAGE_DIR) File storageDir, Storage daoSnapshotStorage) { super(storageDir, daoSnapshotStorage); this.daoState = daoState; + this.daoStateMonitoringService = daoStateMonitoringService; resourceDataStoreService.addService(this); } @@ -69,12 +75,13 @@ public String getFileName() { return FILE_NAME; } - public void persist(DaoState daoState) { - persist(daoState, 200); + public void persist(DaoState daoState, LinkedList daoStateHashChain) { + persist(daoState, daoStateHashChain, 200); } - public void persist(DaoState daoState, long delayInMilli) { + private void persist(DaoState daoState, LinkedList daoStateHashChain, long delayInMilli) { store.setDaoState(daoState); + store.setDaoStateHashChain(daoStateHashChain); storage.queueUpForSave(store, delayInMilli); } @@ -82,8 +89,12 @@ public DaoState getPersistedBsqState() { return store.getDaoState(); } + public LinkedList getPersistedDaoStateHashChain() { + return store.getDaoStateHashChain(); + } + public void resetDaoState(Runnable resultHandler) { - persist(new DaoState(), 1); + persist(new DaoState(), new LinkedList<>(), 1); UserThread.runAfter(resultHandler, 300, TimeUnit.MILLISECONDS); } @@ -94,6 +105,6 @@ public void resetDaoState(Runnable resultHandler) { @Override protected DaoStateStore createStore() { - return new DaoStateStore(DaoState.getClone(daoState)); + return new DaoStateStore(DaoState.getClone(daoState), new LinkedList<>(daoStateMonitoringService.getDaoStateHashChain())); } } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateStore.java b/core/src/main/java/bisq/core/dao/state/DaoStateStore.java index b6080a28a3b..272eb2da33a 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateStore.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateStore.java @@ -18,6 +18,7 @@ package bisq.core.dao.state; import bisq.core.dao.state.model.DaoState; +import bisq.core.dao.state.monitoring.DaoStateHash; import bisq.common.proto.persistable.PersistableEnvelope; @@ -25,12 +26,13 @@ import com.google.protobuf.Message; +import java.util.LinkedList; +import java.util.stream.Collectors; + import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import javax.annotation.Nullable; - import static com.google.common.base.Preconditions.checkNotNull; @@ -38,13 +40,16 @@ public class DaoStateStore implements PersistableEnvelope { // DaoState is always a clone and must not be used for read access beside initial read from disc when we apply // the snapshot! - @Nullable @Getter @Setter - DaoState daoState; + private DaoState daoState; + @Getter + @Setter + private LinkedList daoStateHashChain; - DaoStateStore(DaoState daoState) { + DaoStateStore(DaoState daoState, LinkedList daoStateHashChain) { this.daoState = daoState; + this.daoStateHashChain = daoStateHashChain; } @@ -55,13 +60,21 @@ public class DaoStateStore implements PersistableEnvelope { public Message toProtoMessage() { checkNotNull(daoState, "daoState must not be null when toProtoMessage is invoked"); PB.DaoStateStore.Builder builder = PB.DaoStateStore.newBuilder() - .setBsqState(daoState.getBsqStateBuilder()); + .setBsqState(daoState.getBsqStateBuilder()) + .addAllDaoStateHash(daoStateHashChain.stream() + .map(DaoStateHash::toProtoMessage) + .collect(Collectors.toList())); return PB.PersistableEnvelope.newBuilder() .setDaoStateStore(builder) .build(); } public static PersistableEnvelope fromProto(PB.DaoStateStore proto) { - return new DaoStateStore(DaoState.fromProto(proto.getBsqState())); + LinkedList daoStateHashList = proto.getDaoStateHashList().isEmpty() ? + new LinkedList<>() : + new LinkedList<>(proto.getDaoStateHashList().stream() + .map(DaoStateHash::fromProto) + .collect(Collectors.toList())); + return new DaoStateStore(DaoState.fromProto(proto.getBsqState()), daoStateHashList); } } diff --git a/core/src/main/java/bisq/core/dao/state/model/DaoState.java b/core/src/main/java/bisq/core/dao/state/model/DaoState.java index 9e2e406d983..bbe330034ea 100644 --- a/core/src/main/java/bisq/core/dao/state/model/DaoState.java +++ b/core/src/main/java/bisq/core/dao/state/model/DaoState.java @@ -36,10 +36,10 @@ import javax.inject.Inject; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.TreeMap; import java.util.stream.Collectors; import lombok.Getter; @@ -51,6 +51,9 @@ * Holds both blockchain data as well as data derived from the governance process (voting). *

* One BSQ block with empty txs adds 152 bytes which results in about 8 MB/year + * + * For supporting the hashChain we need to ensure deterministic sorting behaviour of all collections so we use a + * TreeMap which is sorted by the key. */ @Slf4j public class DaoState implements PersistablePayload { @@ -77,17 +80,17 @@ public static DaoState getClone(DaoState daoState) { // These maps represent mutual data which can get changed at parsing a transaction @Getter - private final Map unspentTxOutputMap; + private final TreeMap unspentTxOutputMap; @Getter - private final Map nonBsqTxOutputMap; + private final TreeMap nonBsqTxOutputMap; @Getter - private final Map spentInfoMap; + private final TreeMap spentInfoMap; // These maps are related to state change triggered by voting @Getter private final List confiscatedLockupTxList; @Getter - private final Map issuanceMap; // key is txId + private final TreeMap issuanceMap; // key is txId @Getter private final List paramChangeList; @@ -109,11 +112,11 @@ public DaoState() { this(0, new LinkedList<>(), new LinkedList<>(), - new HashMap<>(), - new HashMap<>(), - new HashMap<>(), + new TreeMap<>(), + new TreeMap<>(), + new TreeMap<>(), new ArrayList<>(), - new HashMap<>(), + new TreeMap<>(), new ArrayList<>(), new ArrayList<>(), new ArrayList<>() @@ -128,11 +131,11 @@ public DaoState() { private DaoState(int chainHeight, LinkedList blocks, LinkedList cycles, - Map unspentTxOutputMap, - Map nonBsqTxOutputMap, - Map spentInfoMap, + TreeMap unspentTxOutputMap, + TreeMap nonBsqTxOutputMap, + TreeMap spentInfoMap, List confiscatedLockupTxList, - Map issuanceMap, + TreeMap issuanceMap, List paramChangeList, List evaluatedProposalList, List decryptedBallotsWithMeritsList) { @@ -182,15 +185,15 @@ public static DaoState fromProto(PB.BsqState proto) { .collect(Collectors.toCollection(LinkedList::new)); LinkedList cycles = proto.getCyclesList().stream() .map(Cycle::fromProto).collect(Collectors.toCollection(LinkedList::new)); - Map unspentTxOutputMap = proto.getUnspentTxOutputMapMap().entrySet().stream() - .collect(Collectors.toMap(e -> TxOutputKey.getKeyFromString(e.getKey()), e -> TxOutput.fromProto(e.getValue()))); - Map nonBsqTxOutputMap = proto.getNonBsqTxOutputMapMap().entrySet().stream() - .collect(Collectors.toMap(e -> TxOutputKey.getKeyFromString(e.getKey()), e -> TxOutput.fromProto(e.getValue()))); - Map spentInfoMap = proto.getSpentInfoMapMap().entrySet().stream() - .collect(Collectors.toMap(e -> TxOutputKey.getKeyFromString(e.getKey()), e -> SpentInfo.fromProto(e.getValue()))); + TreeMap unspentTxOutputMap = new TreeMap<>(proto.getUnspentTxOutputMapMap().entrySet().stream() + .collect(Collectors.toMap(e -> TxOutputKey.getKeyFromString(e.getKey()), e -> TxOutput.fromProto(e.getValue())))); + TreeMap nonBsqTxOutputMap = new TreeMap<>(proto.getNonBsqTxOutputMapMap().entrySet().stream() + .collect(Collectors.toMap(e -> TxOutputKey.getKeyFromString(e.getKey()), e -> TxOutput.fromProto(e.getValue())))); + TreeMap spentInfoMap = new TreeMap<>(proto.getSpentInfoMapMap().entrySet().stream() + .collect(Collectors.toMap(e -> TxOutputKey.getKeyFromString(e.getKey()), e -> SpentInfo.fromProto(e.getValue())))); List confiscatedLockupTxList = new ArrayList<>(proto.getConfiscatedLockupTxListList()); - Map issuanceMap = proto.getIssuanceMapMap().entrySet().stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> Issuance.fromProto(e.getValue()))); + TreeMap issuanceMap = new TreeMap<>(proto.getIssuanceMapMap().entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, e -> Issuance.fromProto(e.getValue())))); List paramChangeList = proto.getParamChangeListList().stream() .map(ParamChange::fromProto).collect(Collectors.toCollection(ArrayList::new)); List evaluatedProposalList = proto.getEvaluatedProposalListList().stream() @@ -218,4 +221,21 @@ public static DaoState fromProto(PB.BsqState proto) { public void setChainHeight(int chainHeight) { this.chainHeight = chainHeight; } + + @Override + public String toString() { + return "DaoState{" + + "\n chainHeight=" + chainHeight + + ",\n blocks=" + blocks + + ",\n cycles=" + cycles + + ",\n unspentTxOutputMap=" + unspentTxOutputMap + + ",\n nonBsqTxOutputMap=" + nonBsqTxOutputMap + + ",\n spentInfoMap=" + spentInfoMap + + ",\n confiscatedLockupTxList=" + confiscatedLockupTxList + + ",\n issuanceMap=" + issuanceMap + + ",\n paramChangeList=" + paramChangeList + + ",\n evaluatedProposalList=" + evaluatedProposalList + + ",\n decryptedBallotsWithMeritsList=" + decryptedBallotsWithMeritsList + + "\n}"; + } } diff --git a/core/src/main/java/bisq/core/dao/state/model/blockchain/TxOutputKey.java b/core/src/main/java/bisq/core/dao/state/model/blockchain/TxOutputKey.java index 11ebec2a896..282d69d2783 100644 --- a/core/src/main/java/bisq/core/dao/state/model/blockchain/TxOutputKey.java +++ b/core/src/main/java/bisq/core/dao/state/model/blockchain/TxOutputKey.java @@ -21,6 +21,8 @@ import lombok.Value; +import org.jetbrains.annotations.NotNull; + import javax.annotation.concurrent.Immutable; /** @@ -29,7 +31,7 @@ */ @Immutable @Value -public final class TxOutputKey implements ImmutableDaoStateModel { +public final class TxOutputKey implements ImmutableDaoStateModel, Comparable { private final String txId; private final int index; @@ -47,4 +49,9 @@ public static TxOutputKey getKeyFromString(String keyAsString) { final String[] tokens = keyAsString.split(":"); return new TxOutputKey(tokens[0], Integer.valueOf(tokens[1])); } + + @Override + public int compareTo(@NotNull Object o) { + return toString().compareTo(o.toString()); + } } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java index f13b3b3e9a3..1fb8c1b5309 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java @@ -79,6 +79,8 @@ public interface Listener { @Getter private final LinkedList daoStateBlockchain = new LinkedList<>(); + @Getter + private final LinkedList daoStateHashChain = new LinkedList<>(); private final List listeners = new CopyOnWriteArrayList<>(); private boolean parseBlockChainComplete; @Getter @@ -118,31 +120,19 @@ public void start() { // DaoStateListener /////////////////////////////////////////////////////////////////////////////////////////// + // We do not use onDaoStateChanged but let the DaoEventCoordinator call createHashFromBlock to ensure the + // correct order of execution. + @Override public void onParseBlockChainComplete() { parseBlockChainComplete = true; daoStateNetworkService.addListeners(); // We wait for processing messages until we have completed batch processing - int fromBlockHeight = daoStateService.getChainHeight() - 10; + int fromBlockHeight = daoStateService.getChainHeight() - 100; daoStateNetworkService.requestHashesFromAllConnectedSeedNodes(fromBlockHeight); } - @Override - public void onDaoStateChanged(Block block) { - processNewBlock(block); - } - - @Override - public void onSnapshotApplied() { - // We could got a reset from a reorg, so we clear all and start over from the genesis block. - daoStateBlockchain.clear(); - daoStateNetworkService.reset(); - - daoStateService.getBlocks().forEach(this::processNewBlock); - } - - /////////////////////////////////////////////////////////////////////////////////////////// // DaoStateNetworkService.Listener /////////////////////////////////////////////////////////////////////////////////////////// @@ -174,10 +164,25 @@ public void onPeersDaoStateHash(DaoStateHash daoStateHash, Optional // API /////////////////////////////////////////////////////////////////////////////////////////// + public void createHashFromBlock(Block block) { + updateHashChain(block); + } + public void requestHashesFromGenesisBlockHeight(String peersAddress) { daoStateNetworkService.requestHashes(genesisTxInfo.getGenesisBlockHeight(), peersAddress); } + public void applySnapshot(LinkedList persistedDaoStateHashChain) { + // We could got a reset from a reorg, so we clear all and start over from the genesis block. + daoStateHashChain.clear(); + daoStateBlockchain.clear(); + daoStateNetworkService.reset(); + + log.info("Apply snapshot: Last daoStateHash={}", persistedDaoStateHashChain.getLast()); + daoStateHashChain.addAll(persistedDaoStateHashChain); + daoStateHashChain.forEach(e -> daoStateBlockchain.add(new DaoStateBlock(e))); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Listeners @@ -196,9 +201,8 @@ public void removeListener(Listener listener) { // Private /////////////////////////////////////////////////////////////////////////////////////////// - private void processNewBlock(Block block) { + private void updateHashChain(Block block) { //TODO handle reorgs TODO need to start from gen - byte[] prevHash; int height = block.getHeight(); if (daoStateBlockchain.isEmpty()) { @@ -220,17 +224,19 @@ private void processNewBlock(Block block) { // We include the prev. hash in our new hash so we can be sure that if one hash is matching all the past would // match as well. byte[] combined = ArrayUtils.addAll(prevHash, stateHash); - byte[] hash = Hash.getRipemd160hash(combined); + byte[] hash = Hash.getSha256Ripemd160hash(combined); DaoStateHash myDaoStateHash = new DaoStateHash(height, hash, prevHash); DaoStateBlock daoStateBlock = new DaoStateBlock(myDaoStateHash); daoStateBlockchain.add(daoStateBlock); - listeners.forEach(Listener::onDaoStateBlockchainChanged); - - log.info("Add daoStateBlock at processNewBlock:\n{}", daoStateBlock); + daoStateHashChain.add(myDaoStateHash); + log.debug("Add daoStateBlock at updateHashChain:\n{}", daoStateBlock); // We only broadcast after parsing of blockchain is complete if (parseBlockChainComplete) { + // We notify listeners only after batch processing to avoid performance issues at UI code + listeners.forEach(Listener::onDaoStateBlockchainChanged); + // We delay broadcast to give peers enough time to have received the block. // Otherwise they would ignore our data if received block is in future to their local blockchain. int delayInSec = 1 + new Random().nextInt(5); @@ -241,6 +247,7 @@ private void processNewBlock(Block block) { private void processPeersDaoStateHash(DaoStateHash daoStateHash, Optional peersNodeAddress) { AtomicBoolean changed = new AtomicBoolean(false); AtomicBoolean isInConflict = new AtomicBoolean(this.isInConflict); + StringBuilder sb = new StringBuilder(); daoStateBlockchain.stream() .filter(e -> e.getBlockHeight() == daoStateHash.getBlockHeight()).findAny() .ifPresent(daoStateBlock -> { @@ -250,12 +257,24 @@ private void processPeersDaoStateHash(DaoStateHash daoStateHash, Optional e.onNewDaoStateHashMessage(newDaoStateHashMessage, connection)); } else if (networkEnvelope instanceof GetDaoStateHashRequest) { @@ -178,8 +178,7 @@ private void requestHashFromSeedNode(int fromBlockHeight, NodeAddress nodeAddres public void onComplete(GetDaoStateHashResponse getDaoStateHashResponse, Optional peersNodeAddress) { log.debug("requestDaoStateHashHandler of outbound connection complete. nodeAddress={}", nodeAddress); requestDaoStateHashHandlerMap.remove(nodeAddress); - getDaoStateHashResponse.getDaoStateHashes() - .forEach(daoStateHash -> listeners.forEach(e -> e.onPeersDaoStateHash(daoStateHash, peersNodeAddress))); + listeners.forEach(e -> e.onPeersDaoStateHashes(getDaoStateHashResponse.getDaoStateHashes(), peersNodeAddress)); } @Override diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java index 019c4ecb8fa..c641035cd11 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java @@ -135,7 +135,9 @@ protected void activate() { .show()) ); - onDataUpdate(); + if (daoStateService.isParseBlockChainComplete()) { + onDataUpdate(); + } } @Override From 2009c30d819744e903beca7ea630d4d79b391457 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 14 Mar 2019 19:03:11 -0500 Subject: [PATCH 16/31] Refactor dao state monitor - Move dao state monitor classes to other package structure - Add support for proposal payload monitor (WIP) - Use generics and sub classes for common functionality --- common/src/main/proto/pb.proto | 42 ++- .../dao/{state => }/DaoEventCoordinator.java | 8 +- .../main/java/bisq/core/dao/DaoModule.java | 9 +- .../src/main/java/bisq/core/dao/DaoSetup.java | 6 +- .../dao/governance/period/PeriodService.java | 2 +- .../governance/proposal/MyProposalList.java | 4 +- .../monitoring/DaoStateMonitoringService.java | 83 ++--- .../ProposalStateMonitoringService.java | 317 ++++++++++++++++++ .../dao/monitoring/model/DaoStateBlock.java | 29 ++ .../dao/monitoring/model/DaoStateHash.java | 51 +++ .../monitoring/model/ProposalStateBlock.java | 29 ++ .../monitoring/model/ProposalStateHash.java | 53 +++ .../model/StateBlock.java} | 43 ++- .../model/StateHash.java} | 60 ++-- .../network/DaoStateNetworkService.java | 104 ++++++ .../network/ProposalStateNetworkService.java | 86 +++++ .../network/RequestDaoStateHashesHandler.java | 54 +++ .../RequestProposalStateHashesHandler.java | 54 +++ .../network/RequestStateHashesHandler.java} | 73 ++-- .../network/StateNetworkService.java | 219 ++++++++++++ .../messages/GetDaoStateHashesRequest.java | 56 ++++ .../messages/GetDaoStateHashesResponse.java} | 44 +-- .../GetProposalStateHashesRequest.java | 56 ++++ .../GetProposalStateHashesResponse.java | 72 ++++ .../messages/GetStateHashesRequest.java | 54 +++ .../messages/GetStateHashesResponse.java | 53 +++ .../messages/NewDaoStateHashMessage.java | 27 +- .../NewProposalStateHashMessage.java} | 37 +- .../network/messages/NewStateHashMessage.java | 52 +++ .../bisq/core/dao/state/DaoStateService.java | 3 +- .../dao/state/DaoStateSnapshotService.java | 4 +- .../dao/state/DaoStateStorageService.java | 4 +- .../bisq/core/dao/state/DaoStateStore.java | 2 +- .../network/DaoStateNetworkService.java | 194 ----------- .../network/CoreNetworkProtoResolver.java | 30 +- .../governance/consensus/ConsensusView.java | 12 +- .../consensus/DaoStateBlockListItem.java | 4 +- .../consensus/DaoStateInConflictListItem.java | 6 +- 38 files changed, 1593 insertions(+), 443 deletions(-) rename core/src/main/java/bisq/core/dao/{state => }/DaoEventCoordinator.java (91%) rename core/src/main/java/bisq/core/dao/{state => }/monitoring/DaoStateMonitoringService.java (78%) create mode 100644 core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/model/DaoStateBlock.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java rename core/src/main/java/bisq/core/dao/{state/monitoring/DaoStateBlock.java => monitoring/model/StateBlock.java} (51%) rename core/src/main/java/bisq/core/dao/{state/monitoring/DaoStateHash.java => monitoring/model/StateHash.java} (53%) create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/ProposalStateNetworkService.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/RequestDaoStateHashesHandler.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/RequestProposalStateHashesHandler.java rename core/src/main/java/bisq/core/dao/{state/monitoring/network/RequestDaoStateHashHandler.java => monitoring/network/RequestStateHashesHandler.java} (74%) create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/GetDaoStateHashesRequest.java rename core/src/main/java/bisq/core/dao/{state/monitoring/messages/GetDaoStateHashResponse.java => monitoring/network/messages/GetDaoStateHashesResponse.java} (53%) create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesRequest.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesResponse.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesRequest.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesResponse.java rename core/src/main/java/bisq/core/dao/{state/monitoring => monitoring/network}/messages/NewDaoStateHashMessage.java (69%) rename core/src/main/java/bisq/core/dao/{state/monitoring/messages/GetDaoStateHashRequest.java => monitoring/network/messages/NewProposalStateHashMessage.java} (53%) create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/NewStateHashMessage.java delete mode 100644 core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index 599499cc244..a8b496c1aae 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -58,8 +58,11 @@ message NetworkEnvelope { AckMessage ack_message = 32; RepublishGovernanceDataRequest republish_governance_data_request = 33; NewDaoStateHashMessage new_dao_state_hash_message = 34; - GetDaoStateHashRequest get_dao_state_hash_request = 35; - GetDaoStateHashResponse get_dao_state_hash_response = 36; + GetDaoStateHashesRequest get_dao_state_hashes_request = 35; + GetDaoStateHashesResponse get_dao_state_hashes_response = 36; + NewProposalStateHashMessage new_proposal_state_hash_message = 37; + GetProposalStateHashesRequest get_proposal_state_hashes_request = 38; + GetProposalStateHashesResponse get_proposal_state_hashes_response = 39; } } @@ -327,13 +330,31 @@ message NewBlockBroadcastMessage { message RepublishGovernanceDataRequest { } -message GetDaoStateHashRequest { - int32 from_block_height = 1; +message NewDaoStateHashMessage { + DaoStateHash state_hash = 1; +} + +message NewProposalStateHashMessage { + ProposalStateHash state_hash = 1; +} + +message GetDaoStateHashesRequest { + int32 height = 1; + int32 nonce = 2; +} + +message GetProposalStateHashesRequest { + int32 height = 1; int32 nonce = 2; } -message GetDaoStateHashResponse { - repeated DaoStateHash dao_state_hashes = 1; +message GetDaoStateHashesResponse { + repeated DaoStateHash state_hashes = 1; + int32 request_nonce = 2; +} + +message GetProposalStateHashesResponse { + repeated ProposalStateHash state_hashes = 1; int32 request_nonce = 2; } @@ -928,7 +949,6 @@ message AdvancedCashAccountPayload { string account_nr = 1; } - /////////////////////////////////////////////////////////////////////////////////////////// // PersistableEnvelope /////////////////////////////////////////////////////////////////////////////////////////// @@ -1730,13 +1750,15 @@ message DaoStateStore { } message DaoStateHash { - int32 blockHeight = 1; + int32 height = 1; bytes hash = 2; bytes prev_hash = 3; } -message NewDaoStateHashMessage { - DaoStateHash dao_state_hash = 1; +message ProposalStateHash { + int32 height = 1; + bytes hash = 2; + bytes prev_hash = 3; } /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/dao/state/DaoEventCoordinator.java b/core/src/main/java/bisq/core/dao/DaoEventCoordinator.java similarity index 91% rename from core/src/main/java/bisq/core/dao/state/DaoEventCoordinator.java rename to core/src/main/java/bisq/core/dao/DaoEventCoordinator.java index e8822a16dc1..4c8cc0f4098 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoEventCoordinator.java +++ b/core/src/main/java/bisq/core/dao/DaoEventCoordinator.java @@ -15,11 +15,13 @@ * along with Bisq. If not, see . */ -package bisq.core.dao.state; +package bisq.core.dao; -import bisq.core.dao.DaoSetupService; +import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.state.DaoStateListener; +import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.DaoStateSnapshotService; import bisq.core.dao.state.model.blockchain.Block; -import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import javax.inject.Inject; diff --git a/core/src/main/java/bisq/core/dao/DaoModule.java b/core/src/main/java/bisq/core/dao/DaoModule.java index 2a7c9e431c4..a26f4eece85 100644 --- a/core/src/main/java/bisq/core/dao/DaoModule.java +++ b/core/src/main/java/bisq/core/dao/DaoModule.java @@ -64,6 +64,10 @@ import bisq.core.dao.governance.voteresult.VoteResultService; import bisq.core.dao.governance.voteresult.issuance.IssuanceService; import bisq.core.dao.governance.votereveal.VoteRevealService; +import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.monitoring.ProposalStateMonitoringService; +import bisq.core.dao.monitoring.network.DaoStateNetworkService; +import bisq.core.dao.monitoring.network.ProposalStateNetworkService; import bisq.core.dao.node.BsqNodeProvider; import bisq.core.dao.node.explorer.ExportJsonFilesService; import bisq.core.dao.node.full.FullNode; @@ -73,14 +77,11 @@ import bisq.core.dao.node.lite.network.LiteNodeNetworkService; import bisq.core.dao.node.parser.BlockParser; import bisq.core.dao.node.parser.TxParser; -import bisq.core.dao.state.DaoEventCoordinator; import bisq.core.dao.state.DaoStateService; import bisq.core.dao.state.DaoStateSnapshotService; import bisq.core.dao.state.DaoStateStorageService; import bisq.core.dao.state.GenesisTxInfo; import bisq.core.dao.state.model.DaoState; -import bisq.core.dao.state.monitoring.DaoStateMonitoringService; -import bisq.core.dao.state.monitoring.network.DaoStateNetworkService; import bisq.core.dao.state.unconfirmed.UnconfirmedBsqChangeOutputListService; import bisq.common.app.AppModule; @@ -122,6 +123,8 @@ protected void configure() { bind(DaoStateStorageService.class).in(Singleton.class); bind(DaoStateMonitoringService.class).in(Singleton.class); bind(DaoStateNetworkService.class).in(Singleton.class); + bind(ProposalStateMonitoringService.class).in(Singleton.class); + bind(ProposalStateNetworkService.class).in(Singleton.class); bind(UnconfirmedBsqChangeOutputListService.class).in(Singleton.class); bind(ExportJsonFilesService.class).in(Singleton.class); diff --git a/core/src/main/java/bisq/core/dao/DaoSetup.java b/core/src/main/java/bisq/core/dao/DaoSetup.java index 3bdfaca2f4d..7e8e586463b 100644 --- a/core/src/main/java/bisq/core/dao/DaoSetup.java +++ b/core/src/main/java/bisq/core/dao/DaoSetup.java @@ -31,12 +31,12 @@ import bisq.core.dao.governance.voteresult.MissingDataRequestService; import bisq.core.dao.governance.voteresult.VoteResultService; import bisq.core.dao.governance.votereveal.VoteRevealService; +import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.monitoring.ProposalStateMonitoringService; import bisq.core.dao.node.BsqNode; import bisq.core.dao.node.BsqNodeProvider; import bisq.core.dao.node.explorer.ExportJsonFilesService; -import bisq.core.dao.state.DaoEventCoordinator; import bisq.core.dao.state.DaoStateService; -import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import com.google.inject.Inject; @@ -73,6 +73,7 @@ public DaoSetup(BsqNodeProvider bsqNodeProvider, ExportJsonFilesService exportJsonFilesService, DaoKillSwitch daoKillSwitch, DaoStateMonitoringService daoStateMonitoringService, + ProposalStateMonitoringService proposalStateMonitoringService, DaoEventCoordinator daoEventCoordinator) { bsqNode = bsqNodeProvider.getBsqNode(); @@ -102,6 +103,7 @@ public DaoSetup(BsqNodeProvider bsqNodeProvider, daoSetupServices.add(exportJsonFilesService); daoSetupServices.add(daoKillSwitch); daoSetupServices.add(daoStateMonitoringService); + daoSetupServices.add(proposalStateMonitoringService); daoSetupServices.add(bsqNodeProvider.getBsqNode()); } diff --git a/core/src/main/java/bisq/core/dao/governance/period/PeriodService.java b/core/src/main/java/bisq/core/dao/governance/period/PeriodService.java index f175183b27f..18ea9b61912 100644 --- a/core/src/main/java/bisq/core/dao/governance/period/PeriodService.java +++ b/core/src/main/java/bisq/core/dao/governance/period/PeriodService.java @@ -85,7 +85,7 @@ public boolean isLastBlockInCycle(int height) { .isPresent(); } - private Optional getCycle(int height) { + public Optional getCycle(int height) { return daoStateService.getCycle(height); } diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalList.java b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalList.java index 5f1931a269d..948d18f14d0 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalList.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalList.java @@ -31,12 +31,12 @@ import lombok.EqualsAndHashCode; /** - * PersistableEnvelope wrapper for list of ballots. Used in vote consensus, so changes can break consensus! + * PersistableEnvelope wrapper for list of proposals. Used in vote consensus, so changes can break consensus! */ @EqualsAndHashCode(callSuper = true) public class MyProposalList extends PersistableList implements ConsensusCritical { - private MyProposalList(List list) { + public MyProposalList(List list) { super(list); } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java similarity index 78% rename from core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java rename to core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java index 866457e7534..98a71b6f3e2 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java @@ -15,16 +15,18 @@ * along with bisq. If not, see . */ -package bisq.core.dao.state.monitoring; +package bisq.core.dao.monitoring; import bisq.core.dao.DaoSetupService; +import bisq.core.dao.monitoring.model.DaoStateBlock; +import bisq.core.dao.monitoring.model.DaoStateHash; +import bisq.core.dao.monitoring.network.DaoStateNetworkService; +import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.NewDaoStateHashMessage; import bisq.core.dao.state.DaoStateListener; import bisq.core.dao.state.DaoStateService; import bisq.core.dao.state.GenesisTxInfo; import bisq.core.dao.state.model.blockchain.Block; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; -import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; -import bisq.core.dao.state.monitoring.network.DaoStateNetworkService; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.Connection; @@ -68,9 +70,11 @@ * TODO auto recovery */ @Slf4j -public class DaoStateMonitoringService implements DaoSetupService, DaoStateListener, DaoStateNetworkService.Listener { +public class DaoStateMonitoringService implements DaoSetupService, DaoStateListener, + DaoStateNetworkService.Listener { + public interface Listener { - void onDaoStateBlockchainChanged(); + void onDaoStateBlockChainChanged(); } private final DaoStateService daoStateService; @@ -78,7 +82,7 @@ public interface Listener { private final GenesisTxInfo genesisTxInfo; @Getter - private final LinkedList daoStateBlockchain = new LinkedList<>(); + private final LinkedList daoStateBlockChain = new LinkedList<>(); @Getter private final LinkedList daoStateHashChain = new LinkedList<>(); private final List listeners = new CopyOnWriteArrayList<>(); @@ -107,7 +111,7 @@ public DaoStateMonitoringService(DaoStateService daoStateService, @Override public void addListeners() { - this.daoStateService.addDaoStateListener(this); + daoStateService.addDaoStateListener(this); daoStateNetworkService.addListener(this); } @@ -129,37 +133,36 @@ public void onParseBlockChainComplete() { daoStateNetworkService.addListeners(); // We wait for processing messages until we have completed batch processing - int fromBlockHeight = daoStateService.getChainHeight() - 10; - daoStateNetworkService.requestHashesFromAllConnectedSeedNodes(fromBlockHeight); + int fromHeight = daoStateService.getChainHeight() - 10; + daoStateNetworkService.requestHashesFromAllConnectedSeedNodes(fromHeight); } /////////////////////////////////////////////////////////////////////////////////////////// - // DaoStateNetworkService.Listener + // StateNetworkService.Listener /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onNewDaoStateHashMessage(NewDaoStateHashMessage newDaoStateHashMessage, Connection connection) { - if (newDaoStateHashMessage.getDaoStateHash().getBlockHeight() <= daoStateService.getChainHeight()) { - processPeersDaoStateHash(newDaoStateHashMessage.getDaoStateHash(), connection.getPeersNodeAddressOptional(), true); + public void onNewStateHashMessage(NewDaoStateHashMessage newStateHashMessage, Connection connection) { + if (newStateHashMessage.getStateHash().getHeight() <= daoStateService.getChainHeight()) { + processPeersDaoStateHash(newStateHashMessage.getStateHash(), connection.getPeersNodeAddressOptional(), true); } } @Override - public void onGetDaoStateHashRequest(Connection connection, GetDaoStateHashRequest getDaoStateHashRequest) { - int fromBlockHeight = getDaoStateHashRequest.getFromBlockHeight(); - List daoStateHashes = daoStateBlockchain.stream() - .filter(e -> e.getBlockHeight() >= fromBlockHeight) - .map(DaoStateBlock::getMyDaoStateHash) + public void onGetStateHashRequest(Connection connection, GetDaoStateHashesRequest getStateHashRequest) { + int fromHeight = getStateHashRequest.getHeight(); + List daoStateHashes = daoStateBlockChain.stream() + .filter(e -> e.getHeight() >= fromHeight) + .map(DaoStateBlock::getMyStateHash) .collect(Collectors.toList()); - daoStateNetworkService.sendGetDaoStateHashResponse(connection, getDaoStateHashRequest.getNonce(), daoStateHashes); + daoStateNetworkService.sendGetStateHashesResponse(connection, getStateHashRequest.getNonce(), daoStateHashes); } - @Override - public void onPeersDaoStateHashes(List daoStateHashes, Optional peersNodeAddress) { + public void onPeersStateHashes(List stateHashes, Optional peersNodeAddress) { AtomicBoolean hasChanged = new AtomicBoolean(false); - daoStateHashes.forEach(daoStateHash -> { + stateHashes.forEach(daoStateHash -> { boolean changed = processPeersDaoStateHash(daoStateHash, peersNodeAddress, false); if (changed) { hasChanged.set(true); @@ -167,7 +170,7 @@ public void onPeersDaoStateHashes(List daoStateHashes, Optional persistedDaoStateHashChain) { // We could got a reset from a reorg, so we clear all and start over from the genesis block. daoStateHashChain.clear(); - daoStateBlockchain.clear(); + daoStateBlockChain.clear(); daoStateNetworkService.reset(); - log.info("Apply snapshot: Last daoStateHash={}", persistedDaoStateHashChain.getLast()); + if (!persistedDaoStateHashChain.isEmpty()) { + log.info("Apply snapshot: Last daoStateHash={}", persistedDaoStateHashChain.getLast()); + } daoStateHashChain.addAll(persistedDaoStateHashChain); - daoStateHashChain.forEach(e -> daoStateBlockchain.add(new DaoStateBlock(e))); + daoStateHashChain.forEach(e -> daoStateBlockChain.add(new DaoStateBlock(e))); } @@ -217,7 +222,7 @@ private void updateHashChain(Block block) { //TODO handle reorgs TODO need to start from gen byte[] prevHash; int height = block.getHeight(); - if (daoStateBlockchain.isEmpty()) { + if (daoStateBlockChain.isEmpty()) { // Only at genesis we allow an empty prevHash if (height == genesisTxInfo.getGenesisBlockHeight()) { prevHash = new byte[0]; @@ -228,11 +233,11 @@ private void updateHashChain(Block block) { } } else { // TODO check if in reorg cases it might be a valid case - checkArgument(height > daoStateBlockchain.getLast().getBlockHeight(), + checkArgument(height > daoStateBlockChain.getLast().getHeight(), "We got a block the same blockHeight as our previous block in the daoStateBlockchain."); - prevHash = daoStateBlockchain.getLast().getHash(); + prevHash = daoStateBlockChain.getLast().getHash(); } - byte[] stateHash = daoStateService.getDaoStateHash(); + byte[] stateHash = daoStateService.getSerializedDaoState(); // We include the prev. hash in our new hash so we can be sure that if one hash is matching all the past would // match as well. byte[] combined = ArrayUtils.addAll(prevHash, stateHash); @@ -240,19 +245,19 @@ private void updateHashChain(Block block) { DaoStateHash myDaoStateHash = new DaoStateHash(height, hash, prevHash); DaoStateBlock daoStateBlock = new DaoStateBlock(myDaoStateHash); - daoStateBlockchain.add(daoStateBlock); + daoStateBlockChain.add(daoStateBlock); daoStateHashChain.add(myDaoStateHash); log.debug("Add daoStateBlock at updateHashChain:\n{}", daoStateBlock); // We only broadcast after parsing of blockchain is complete if (parseBlockChainComplete) { // We notify listeners only after batch processing to avoid performance issues at UI code - listeners.forEach(Listener::onDaoStateBlockchainChanged); + listeners.forEach(Listener::onDaoStateBlockChainChanged); // We delay broadcast to give peers enough time to have received the block. // Otherwise they would ignore our data if received block is in future to their local blockchain. int delayInSec = 1 + new Random().nextInt(5); - UserThread.runAfter(() -> daoStateNetworkService.broadcastMyDaoStateHash(myDaoStateHash), delayInSec); + UserThread.runAfter(() -> daoStateNetworkService.broadcastMyStateHash(myDaoStateHash), delayInSec); } } @@ -260,20 +265,20 @@ private boolean processPeersDaoStateHash(DaoStateHash daoStateHash, Optional e.getBlockHeight() == daoStateHash.getBlockHeight()).findAny() + daoStateBlockChain.stream() + .filter(e -> e.getHeight() == daoStateHash.getHeight()).findAny() .ifPresent(daoStateBlock -> { String peersNodeAddressAsString = peersNodeAddress.map(NodeAddress::getFullAddress) .orElseGet(() -> "Unknown peer " + new Random().nextInt(10000)); daoStateBlock.putInPeersMap(peersNodeAddressAsString, daoStateHash); - if (!daoStateBlock.getMyDaoStateHash().hasEqualHash(daoStateHash)) { + if (!daoStateBlock.getMyStateHash().hasEqualHash(daoStateHash)) { daoStateBlock.putInConflictMap(peersNodeAddressAsString, daoStateHash); isInConflict.set(true); sb.append("We received a block hash from peer ") .append(peersNodeAddressAsString) .append(" which conflicts with our block hash.\n") .append("my daoStateHash=") - .append(daoStateBlock.getMyDaoStateHash()) + .append(daoStateBlock.getMyStateHash()) .append("\npeers daoStateHash=") .append(daoStateHash); } @@ -288,7 +293,7 @@ private boolean processPeersDaoStateHash(DaoStateHash daoStateHash, Optional. + */ + +package bisq.core.dao.monitoring; + +import bisq.core.dao.DaoSetupService; +import bisq.core.dao.governance.period.PeriodService; +import bisq.core.dao.governance.proposal.MyProposalList; +import bisq.core.dao.governance.proposal.ProposalService; +import bisq.core.dao.governance.proposal.ProposalValidator; +import bisq.core.dao.monitoring.model.ProposalStateBlock; +import bisq.core.dao.monitoring.model.ProposalStateHash; +import bisq.core.dao.monitoring.network.ProposalStateNetworkService; +import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.NewProposalStateHashMessage; +import bisq.core.dao.state.DaoStateListener; +import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.GenesisTxInfo; +import bisq.core.dao.state.model.governance.DaoPhase; +import bisq.core.dao.state.model.governance.Proposal; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.Connection; + +import bisq.common.UserThread; +import bisq.common.crypto.Hash; + +import javax.inject.Inject; + +import org.apache.commons.lang3.ArrayUtils; + +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +/** + * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for + * so we can detect quickly if any consensus issue arise. The data does not contain any private user + * data so sharing it on demand has no privacy concerns. + * + * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start + * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao + * state from the peers is already covering the next block we have not received yet. So we only take data in account + * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our + * state to the peers to not get ignored it in case they have not received the block yet. + * + * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height + * of the latest block in the snapshot. + * + * TODO maybe request full state? + * TODO add p2p network data for monitoring + * TODO auto recovery + */ +@Slf4j +public class ProposalStateMonitoringService implements DaoSetupService, DaoStateListener, ProposalStateNetworkService.Listener { + + + interface Listener { + void onProposalStateBlockChainChanged(); + } + + private final DaoStateService daoStateService; + private final ProposalStateNetworkService proposalStateNetworkService; + private final GenesisTxInfo genesisTxInfo; + private final PeriodService periodService; + private final ProposalService proposalService; + private final ProposalValidator proposalValidator; + + @Getter + private final LinkedList proposalStateBlockChain = new LinkedList<>(); + @Getter + private final LinkedList proposalStateHashChain = new LinkedList<>(); + private final List listeners = new CopyOnWriteArrayList<>(); + @Getter + private boolean isInConflict; + private boolean parseBlockChainComplete; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + public ProposalStateMonitoringService(DaoStateService daoStateService, + ProposalStateNetworkService proposalStateNetworkService, + GenesisTxInfo genesisTxInfo, + PeriodService periodService, + ProposalService proposalService, + ProposalValidator proposalValidator) { + this.daoStateService = daoStateService; + this.proposalStateNetworkService = proposalStateNetworkService; + this.genesisTxInfo = genesisTxInfo; + this.periodService = periodService; + this.proposalService = proposalService; + this.proposalValidator = proposalValidator; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoSetupService + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void addListeners() { + daoStateService.addDaoStateListener(this); + proposalStateNetworkService.addListener(this); + } + + @Override + public void start() { + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoStateListener + /////////////////////////////////////////////////////////////////////////////////////////// + + // We don't care here about block parsing so we execute once a new block arrives (before parsing has started) + @Override + public void onNewBlockHeight(int blockHeight) { + int genesisBlockHeight = genesisTxInfo.getGenesisBlockHeight(); + if (proposalStateBlockChain.isEmpty() && blockHeight > genesisBlockHeight) { + // Takes about 150 ms for dao testnet data + long ts = System.currentTimeMillis(); + for (int i = genesisBlockHeight; i < blockHeight; i++) { + updateHashChain(i); + } + log.info("updateHashChain for {} items took {} ms", + blockHeight - genesisBlockHeight, + System.currentTimeMillis() - ts); + } + + updateHashChain(blockHeight); + } + + @Override + public void onParseBlockChainComplete() { + parseBlockChainComplete = true; + proposalStateNetworkService.addListeners(); + + // We wait for processing messages until we have completed batch processing + int fromHeight = daoStateService.getChainHeight() - 10; + proposalStateNetworkService.requestHashesFromAllConnectedSeedNodes(fromHeight); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // StateNetworkService.Listener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onNewStateHashMessage(NewProposalStateHashMessage newStateHashMessage, Connection connection) { + if (newStateHashMessage.getStateHash().getHeight() <= daoStateService.getChainHeight()) { + log.debug("onNewStateHashMessage newStateHashMessage ={}", newStateHashMessage); + processPeersProposalStateHash(newStateHashMessage.getStateHash(), connection.getPeersNodeAddressOptional(), true); + } + } + + @Override + public void onGetStateHashRequest(Connection connection, GetProposalStateHashesRequest getStateHashRequest) { + int fromHeight = getStateHashRequest.getHeight(); + List proposalStateHashes = proposalStateBlockChain.stream() + .filter(e -> e.getHeight() >= fromHeight) + .map(ProposalStateBlock::getMyStateHash) + .collect(Collectors.toList()); + log.debug("sendGetStateHashesResponse proposalStateHashes ={}", proposalStateHashes); + proposalStateNetworkService.sendGetStateHashesResponse(connection, getStateHashRequest.getNonce(), proposalStateHashes); + } + + @Override + public void onPeersStateHashes(List stateHashes, Optional peersNodeAddress) { + AtomicBoolean hasChanged = new AtomicBoolean(false); + log.debug("onPeersStateHashes stateHashes ={}", stateHashes); + stateHashes.forEach(daoStateHash -> { + boolean changed = processPeersProposalStateHash(daoStateHash, peersNodeAddress, false); + if (changed) { + hasChanged.set(true); + } + }); + + if (hasChanged.get()) { + listeners.forEach(Listener::onProposalStateBlockChainChanged); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public void requestHashesFromGenesisBlockHeight(String peersAddress) { + proposalStateNetworkService.requestHashes(genesisTxInfo.getGenesisBlockHeight(), peersAddress); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Listeners + /////////////////////////////////////////////////////////////////////////////////////////// + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void updateHashChain(int blockHeight) { + // We use first block in blind vote phase to create the hash of our proposals. We prefer to wait as long as + // possible to increase the chance that we have received all proposals. + int blindVoteBlockHeight = periodService.getFirstBlockOfPhase(blockHeight, DaoPhase.Phase.BLIND_VOTE); + if (blockHeight != blindVoteBlockHeight) { + return; + } + + periodService.getCycle(blockHeight).ifPresent(cycle -> { + List proposals = proposalService.getValidatedProposals().stream() + .filter(proposalValidator::isValidAndConfirmed) + .filter(e -> periodService.isTxInPhaseAndCycle(e.getTxId(), DaoPhase.Phase.PROPOSAL, blockHeight)) + .sorted(Comparator.comparing(Proposal::getTxId)).collect(Collectors.toList()); + + // We use MyProposalList to get the serialized bytes from the proposals list + byte[] serializedProposals = new MyProposalList(proposals).toProtoMessage().toByteArray(); + + byte[] prevHash; + if (proposalStateBlockChain.isEmpty()) { + prevHash = new byte[0]; + } else { + prevHash = proposalStateBlockChain.getLast().getHash(); + } + byte[] combined = ArrayUtils.addAll(prevHash, serializedProposals); + byte[] hash = Hash.getSha256Ripemd160hash(combined); + int cycleStartBlockHeight = cycle.getHeightOfFirstBlock(); + ProposalStateHash myProposalStateHash = new ProposalStateHash(cycleStartBlockHeight, hash, prevHash); + ProposalStateBlock proposalStateBlock = new ProposalStateBlock(myProposalStateHash); + proposalStateBlockChain.add(proposalStateBlock); + proposalStateHashChain.add(myProposalStateHash); + log.debug("Add proposalStateBlock at updateHashChain:\n{}", proposalStateBlock); + + // We only broadcast after parsing of blockchain is complete + if (parseBlockChainComplete) { + // We notify listeners only after batch processing to avoid performance issues at UI code + listeners.forEach(Listener::onProposalStateBlockChainChanged); + + // We delay broadcast to give peers enough time to have received the block. + // Otherwise they would ignore our data if received block is in future to their local blockchain. + int delayInSec = 1 + new Random().nextInt(5); + UserThread.runAfter(() -> proposalStateNetworkService.broadcastMyStateHash(myProposalStateHash), delayInSec); + } + }); + } + + private boolean processPeersProposalStateHash(ProposalStateHash proposalStateHash, Optional peersNodeAddress, boolean notifyListeners) { + AtomicBoolean changed = new AtomicBoolean(false); + AtomicBoolean isInConflict = new AtomicBoolean(this.isInConflict); + StringBuilder sb = new StringBuilder(); + proposalStateBlockChain.stream() + .filter(e -> e.getHeight() == proposalStateHash.getHeight()).findAny() + .ifPresent(daoStateBlock -> { + String peersNodeAddressAsString = peersNodeAddress.map(NodeAddress::getFullAddress) + .orElseGet(() -> "Unknown peer " + new Random().nextInt(10000)); + daoStateBlock.putInPeersMap(peersNodeAddressAsString, proposalStateHash); + if (!daoStateBlock.getMyStateHash().hasEqualHash(proposalStateHash)) { + daoStateBlock.putInConflictMap(peersNodeAddressAsString, proposalStateHash); + isInConflict.set(true); + sb.append("We received a block hash from peer ") + .append(peersNodeAddressAsString) + .append(" which conflicts with our block hash.\n") + .append("my proposalStateHash=") + .append(daoStateBlock.getMyStateHash()) + .append("\npeers proposalStateHash=") + .append(proposalStateHash); + } + changed.set(true); + }); + + this.isInConflict = isInConflict.get(); + + String conflictMsg = sb.toString(); + if (this.isInConflict && !conflictMsg.isEmpty()) { + log.warn(conflictMsg); + } + + if (notifyListeners && changed.get()) { + listeners.forEach(Listener::onProposalStateBlockChainChanged); + } + + return changed.get(); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateBlock.java b/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateBlock.java new file mode 100644 index 00000000000..8bd91e67fa6 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateBlock.java @@ -0,0 +1,29 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.model; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode(callSuper = true) +public class DaoStateBlock extends StateBlock { + public DaoStateBlock(DaoStateHash myDaoStateHash) { + super(myDaoStateHash); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java b/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java new file mode 100644 index 00000000000..d2afbf3d83f --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java @@ -0,0 +1,51 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.model; + +import io.bisq.generated.protobuffer.PB; + +import com.google.protobuf.ByteString; + +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +public final class DaoStateHash extends StateHash { + public DaoStateHash(int height, byte[] hash, byte[] prevHash) { + super(height, hash, prevHash); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public PB.DaoStateHash toProtoMessage() { + final PB.DaoStateHash.Builder builder = PB.DaoStateHash.newBuilder() + .setHeight(height) + .setHash(ByteString.copyFrom(hash)) + .setPrevHash(ByteString.copyFrom(prevHash)); + return builder.build(); + } + + public static DaoStateHash fromProto(PB.DaoStateHash proto) { + return new DaoStateHash(proto.getHeight(), + proto.getHash().toByteArray(), + proto.getPrevHash().toByteArray()); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java new file mode 100644 index 00000000000..1cb7f5e9e91 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java @@ -0,0 +1,29 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.model; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode(callSuper = true) +public class ProposalStateBlock extends StateBlock { + public ProposalStateBlock(ProposalStateHash myProposalStateHash) { + super(myProposalStateHash); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java new file mode 100644 index 00000000000..853eecb15ce --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java @@ -0,0 +1,53 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.model; + + +import io.bisq.generated.protobuffer.PB; + +import com.google.protobuf.ByteString; + +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +public final class ProposalStateHash extends StateHash { + + public ProposalStateHash(int cycleStartBlockHeight, byte[] hash, byte[] prevHash) { + super(cycleStartBlockHeight, hash, prevHash); + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public PB.ProposalStateHash toProtoMessage() { + final PB.ProposalStateHash.Builder builder = PB.ProposalStateHash.newBuilder() + .setHeight(height) + .setHash(ByteString.copyFrom(hash)) + .setPrevHash(ByteString.copyFrom(prevHash)); + return builder.build(); + } + + + public static ProposalStateHash fromProto(PB.ProposalStateHash proto) { + return new ProposalStateHash(proto.getHeight(), + proto.getHash().toByteArray(), + proto.getPrevHash().toByteArray()); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateBlock.java b/core/src/main/java/bisq/core/dao/monitoring/model/StateBlock.java similarity index 51% rename from core/src/main/java/bisq/core/dao/state/monitoring/DaoStateBlock.java rename to core/src/main/java/bisq/core/dao/monitoring/model/StateBlock.java index abd694288c8..6b050947324 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateBlock.java +++ b/core/src/main/java/bisq/core/dao/monitoring/model/StateBlock.java @@ -15,44 +15,55 @@ * along with Bisq. If not, see . */ -package bisq.core.dao.state.monitoring; +package bisq.core.dao.monitoring.model; import java.util.HashMap; import java.util.Map; import lombok.EqualsAndHashCode; import lombok.Getter; -import lombok.experimental.Delegate; /** - * Contains my DaoStateHash at a particular block height and the received daoStateHashes from our peers. + * Contains my StateHash at a particular block height and the received stateHash from our peers. * The maps get updated over time, this is not an immutable class. */ @Getter @EqualsAndHashCode -public class DaoStateBlock { - @Delegate - private final DaoStateHash myDaoStateHash; +public abstract class StateBlock { + private final T myStateHash; - private final Map peersMap = new HashMap<>(); - private final Map inConflictMap = new HashMap<>(); + private final Map peersMap = new HashMap<>(); + private final Map inConflictMap = new HashMap<>(); - DaoStateBlock(DaoStateHash myDaoStateHash) { - this.myDaoStateHash = myDaoStateHash; + StateBlock(T myStateHash) { + this.myStateHash = myStateHash; } - public void putInPeersMap(String peersNodeAddressAsString, DaoStateHash daoStateHash) { - peersMap.putIfAbsent(peersNodeAddressAsString, daoStateHash); + public void putInPeersMap(String peersNodeAddress, T stateHash) { + peersMap.putIfAbsent(peersNodeAddress, stateHash); } - public void putInConflictMap(String peersNodeAddressAsString, DaoStateHash daoStateHash) { - inConflictMap.putIfAbsent(peersNodeAddressAsString, daoStateHash); + public void putInConflictMap(String peersNodeAddress, T stateHash) { + inConflictMap.putIfAbsent(peersNodeAddress, stateHash); + } + + // Delegates + public int getHeight() { + return myStateHash.getHeight(); + } + + public byte[] getHash() { + return myStateHash.getHash(); + } + + public byte[] getPrevHash() { + return myStateHash.getPrevHash(); } @Override public String toString() { - return "DaoStateBlock{" + - "\n myDaoStateHash=" + myDaoStateHash + + return "StateBlock{" + + "\n myStateHash=" + myStateHash + ",\n peersMap=" + peersMap + ",\n inConflictMap=" + inConflictMap + "\n}"; diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java b/core/src/main/java/bisq/core/dao/monitoring/model/StateHash.java similarity index 53% rename from core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java rename to core/src/main/java/bisq/core/dao/monitoring/model/StateHash.java index 10519447497..12cb299a11c 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/DaoStateHash.java +++ b/core/src/main/java/bisq/core/dao/monitoring/model/StateHash.java @@ -15,69 +15,57 @@ * along with Bisq. If not, see . */ -package bisq.core.dao.state.monitoring; +package bisq.core.dao.monitoring.model; + import bisq.common.proto.network.NetworkPayload; import bisq.common.proto.persistable.PersistablePayload; import bisq.common.util.Utilities; -import io.bisq.generated.protobuffer.PB; - -import com.google.protobuf.ByteString; - import java.util.Arrays; -import lombok.Value; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; /** - * Contains the blockHeight, the hash and the previous hash of the dao state. - * As the hash is created from the dao state at the particular height including the previous hash we get the history of + * Contains the blockHeight, the hash and the previous hash of the state. + * As the hash is created from the state at the particular height including the previous hash we get the history of * the full chain included and we know if the hash matches at a particular height that all the past blocks need to match * as well. */ -@Value -public class DaoStateHash implements PersistablePayload, NetworkPayload { - private final int blockHeight; - // Hash includes prev hash as well as dao state hash. With adding prev hash we can ensure the all the history is - // matching if our hash matches. - private final byte[] hash; +@EqualsAndHashCode +@Getter +@Slf4j +public abstract class StateHash implements PersistablePayload, NetworkPayload { + protected final int height; + protected final byte[] hash; // For first block the prevHash is an empty byte array - private final byte[] prevHash; + protected final byte[] prevHash; - DaoStateHash(int blockHeight, byte[] hash, byte[] prevHash) { - this.blockHeight = blockHeight; + StateHash(int height, byte[] hash, byte[] prevHash) { + this.height = height; this.hash = hash; this.prevHash = prevHash; } - public boolean hasEqualHash(DaoStateHash other) { - return Arrays.equals(hash, other.getHash()); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // PROTO BUFFER + // API /////////////////////////////////////////////////////////////////////////////////////////// - @Override - public PB.DaoStateHash toProtoMessage() { - final PB.DaoStateHash.Builder builder = PB.DaoStateHash.newBuilder() - .setBlockHeight(blockHeight) - .setHash(ByteString.copyFrom(hash)) - .setPrevHash(ByteString.copyFrom(prevHash)); - return builder.build(); + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public boolean hasEqualHash(StateHash other) { + return Arrays.equals(hash, other.getHash()); } - public static DaoStateHash fromProto(PB.DaoStateHash proto) { - return new DaoStateHash(proto.getBlockHeight(), - proto.getHash().toByteArray(), - proto.getPrevHash().toByteArray()); + public byte[] getHash() { + return hash; } @Override public String toString() { - return "DaoStateHash{" + - "\n blockHeight=" + blockHeight + + return "StateHash{" + + "\n height=" + height + ",\n hash=" + Utilities.bytesAsHexString(hash) + ",\n prevHash=" + Utilities.bytesAsHexString(prevHash) + "\n}"; diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java new file mode 100644 index 00000000000..a0029b9bdab --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java @@ -0,0 +1,104 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network; + +import bisq.core.dao.monitoring.model.DaoStateHash; +import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesResponse; +import bisq.core.dao.monitoring.network.messages.NewDaoStateHashMessage; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.Broadcaster; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import javax.inject.Inject; + +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +/** + * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for + * so we can detect quickly if any consensus issue arise. The data does not contain any private user + * data so sharing it on demand has no privacy concerns. + * + * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start + * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao + * state from the peers is already covering the next block we have not received yet. So we only take data in account + * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our + * state to the peers to not get ignored it in case they have not received the block yet. + * + * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height + * of the latest block in the snapshot. + * + * TODO maybe request full state? + * TODO add p2p network data for monitoring + * TODO auto recovery + */ +@Slf4j +public class DaoStateNetworkService extends StateNetworkService { + @Inject + public DaoStateNetworkService(NetworkNode networkNode, + PeerManager peerManager, + Broadcaster broadcaster) { + super(networkNode, peerManager, broadcaster); + } + + @Override + protected GetDaoStateHashesRequest castToGetStateHashRequest(NetworkEnvelope networkEnvelope) { + return (GetDaoStateHashesRequest) networkEnvelope; + } + + @Override + protected boolean isGetStateHashesRequest(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof GetDaoStateHashesRequest; + } + + @Override + protected NewDaoStateHashMessage castToNewStateHashMessage(NetworkEnvelope networkEnvelope) { + return (NewDaoStateHashMessage) networkEnvelope; + } + + @Override + protected boolean isNewStateHashMessage(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof NewDaoStateHashMessage; + } + + @Override + protected GetDaoStateHashesResponse getGetStateHashesResponse(int nonce, List stateHashes) { + return new GetDaoStateHashesResponse(stateHashes, nonce); + } + + @Override + protected NewDaoStateHashMessage getNewStateHashMessage(DaoStateHash myStateHash) { + return new NewDaoStateHashMessage(myStateHash); + } + + @Override + protected RequestDaoStateHashesHandler getRequestStateHashesHandler(NodeAddress nodeAddress, RequestStateHashesHandler.Listener listener) { + return new RequestDaoStateHashesHandler(networkNode, peerManager, nodeAddress, listener); + } + +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/ProposalStateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/ProposalStateNetworkService.java new file mode 100644 index 00000000000..76e6f33bd18 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/ProposalStateNetworkService.java @@ -0,0 +1,86 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network; + +import bisq.core.dao.monitoring.model.ProposalStateHash; +import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesResponse; +import bisq.core.dao.monitoring.network.messages.NewProposalStateHashMessage; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.Broadcaster; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import javax.inject.Inject; + +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ProposalStateNetworkService extends StateNetworkService { + @Inject + public ProposalStateNetworkService(NetworkNode networkNode, + PeerManager peerManager, + Broadcaster broadcaster) { + super(networkNode, peerManager, broadcaster); + } + + @Override + protected GetProposalStateHashesRequest castToGetStateHashRequest(NetworkEnvelope networkEnvelope) { + return (GetProposalStateHashesRequest) networkEnvelope; + } + + @Override + protected boolean isGetStateHashesRequest(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof GetProposalStateHashesRequest; + } + + @Override + protected NewProposalStateHashMessage castToNewStateHashMessage(NetworkEnvelope networkEnvelope) { + return (NewProposalStateHashMessage) networkEnvelope; + } + + @Override + protected boolean isNewStateHashMessage(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof NewProposalStateHashMessage; + } + + @Override + protected GetProposalStateHashesResponse getGetStateHashesResponse(int nonce, List stateHashes) { + return new GetProposalStateHashesResponse(stateHashes, nonce); + } + + @Override + protected NewProposalStateHashMessage getNewStateHashMessage(ProposalStateHash myStateHash) { + return new NewProposalStateHashMessage(myStateHash); + } + + @Override + protected RequestProposalStateHashesHandler getRequestStateHashesHandler(NodeAddress nodeAddress, RequestStateHashesHandler.Listener listener) { + return new RequestProposalStateHashesHandler(networkNode, peerManager, nodeAddress, listener); + } + +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/RequestDaoStateHashesHandler.java b/core/src/main/java/bisq/core/dao/monitoring/network/RequestDaoStateHashesHandler.java new file mode 100644 index 00000000000..6a7b7bdcc7f --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/RequestDaoStateHashesHandler.java @@ -0,0 +1,54 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network; + +import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesResponse; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RequestDaoStateHashesHandler extends RequestStateHashesHandler { + RequestDaoStateHashesHandler(NetworkNode networkNode, + PeerManager peerManager, + NodeAddress nodeAddress, + Listener listener) { + super(networkNode, peerManager, nodeAddress, listener); + } + + @Override + protected GetDaoStateHashesRequest getGetStateHashesRequest(int fromHeight) { + return new GetDaoStateHashesRequest(fromHeight, nonce); + } + + @Override + protected GetDaoStateHashesResponse castToGetStateHashesResponse(NetworkEnvelope networkEnvelope) { + return (GetDaoStateHashesResponse) networkEnvelope; + } + + @Override + protected boolean isGetStateHashesResponse(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof GetDaoStateHashesResponse; + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/RequestProposalStateHashesHandler.java b/core/src/main/java/bisq/core/dao/monitoring/network/RequestProposalStateHashesHandler.java new file mode 100644 index 00000000000..0e4a20502e0 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/RequestProposalStateHashesHandler.java @@ -0,0 +1,54 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network; + +import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesResponse; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RequestProposalStateHashesHandler extends RequestStateHashesHandler { + RequestProposalStateHashesHandler(NetworkNode networkNode, + PeerManager peerManager, + NodeAddress nodeAddress, + Listener listener) { + super(networkNode, peerManager, nodeAddress, listener); + } + + @Override + protected GetProposalStateHashesRequest getGetStateHashesRequest(int fromHeight) { + return new GetProposalStateHashesRequest(fromHeight, nonce); + } + + @Override + protected GetProposalStateHashesResponse castToGetStateHashesResponse(NetworkEnvelope networkEnvelope) { + return (GetProposalStateHashesResponse) networkEnvelope; + } + + @Override + protected boolean isGetStateHashesResponse(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof GetProposalStateHashesResponse; + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java similarity index 74% rename from core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java rename to core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java index 037e2aa5a11..f7eea4c9456 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/network/RequestDaoStateHashHandler.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java @@ -15,10 +15,10 @@ * along with Bisq. If not, see . */ -package bisq.core.dao.state.monitoring.network; +package bisq.core.dao.monitoring.network; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; +import bisq.core.dao.monitoring.network.messages.GetStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetStateHashesResponse; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.network.CloseConnectionReason; @@ -43,11 +43,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -/** - * Sends a GetDaoStateHashRequest to a seed node and listens on corresponding GetDaoStateHashResponse. - */ @Slf4j -public class RequestDaoStateHashHandler implements MessageListener { +abstract class RequestStateHashesHandler implements MessageListener { private static final long TIMEOUT = 120; @@ -55,8 +52,8 @@ public class RequestDaoStateHashHandler implements MessageListener { // Listener /////////////////////////////////////////////////////////////////////////////////////////// - public interface Listener { - void onComplete(GetDaoStateHashResponse getDaoStateHashResponse, Optional peersNodeAddress); + public interface Listener { + void onComplete(Res getStateHashesResponse, Optional peersNodeAddress); @SuppressWarnings("UnusedParameters") void onFault(String errorMessage, @SuppressWarnings("SameParameterValue") @Nullable Connection connection); @@ -70,9 +67,9 @@ public interface Listener { private final NetworkNode networkNode; private final PeerManager peerManager; private final NodeAddress nodeAddress; - private final Listener listener; + private final Listener listener; private Timer timeoutTimer; - private final int nonce = new Random().nextInt(); + final int nonce = new Random().nextInt(); private boolean stopped; @@ -80,10 +77,10 @@ public interface Listener { // Constructor /////////////////////////////////////////////////////////////////////////////////////////// - public RequestDaoStateHashHandler(NetworkNode networkNode, - PeerManager peerManager, - NodeAddress nodeAddress, - Listener listener) { + RequestStateHashesHandler(NetworkNode networkNode, + PeerManager peerManager, + NodeAddress nodeAddress, + Listener listener) { this.networkNode = networkNode; this.peerManager = peerManager; this.nodeAddress = nodeAddress; @@ -91,19 +88,30 @@ public RequestDaoStateHashHandler(NetworkNode networkNode, } + /////////////////////////////////////////////////////////////////////////////////////////// + // Abstract + /////////////////////////////////////////////////////////////////////////////////////////// + + protected abstract Req getGetStateHashesRequest(int fromHeight); + + protected abstract Res castToGetStateHashesResponse(NetworkEnvelope networkEnvelope); + + protected abstract boolean isGetStateHashesResponse(NetworkEnvelope networkEnvelope); + + /////////////////////////////////////////////////////////////////////////////////////////// // API /////////////////////////////////////////////////////////////////////////////////////////// - public void requestDaoStateHash(int fromBlockHeight) { + public void requestStateHashes(int fromHeight) { if (!stopped) { - GetDaoStateHashRequest getDaoStateHashRequest = new GetDaoStateHashRequest(fromBlockHeight, nonce); + Req getStateHashesRequest = getGetStateHashesRequest(fromHeight); if (timeoutTimer == null) { timeoutTimer = UserThread.runAfter(() -> { // setup before sending to avoid race conditions if (!stopped) { - String errorMessage = "A timeout occurred at sending getDaoStateHashRequest:" + getDaoStateHashRequest + + String errorMessage = "A timeout occurred at sending getStateHashesRequest:" + getStateHashesRequest + " on peersNodeAddress:" + nodeAddress; - log.debug(errorMessage + " / RequestDaoStateHashHandler=" + RequestDaoStateHashHandler.this); + log.debug(errorMessage + " / RequestStateHashesHandler=" + RequestStateHashesHandler.this); handleFault(errorMessage, nodeAddress, CloseConnectionReason.SEND_MSG_TIMEOUT); } else { log.trace("We have stopped already. We ignore that timeoutTimer.run call. " + @@ -113,14 +121,14 @@ public void requestDaoStateHash(int fromBlockHeight) { TIMEOUT); } - log.info("We send to peer {} a {}.", nodeAddress, getDaoStateHashRequest); + log.info("We send to peer {} a {}.", nodeAddress, getStateHashesRequest); networkNode.addMessageListener(this); - SettableFuture future = networkNode.sendMessage(nodeAddress, getDaoStateHashRequest); + SettableFuture future = networkNode.sendMessage(nodeAddress, getStateHashesRequest); Futures.addCallback(future, new FutureCallback<>() { @Override public void onSuccess(Connection connection) { if (!stopped) { - log.info("Sending of GetDaoStateHashRequest message to peer {} succeeded.", nodeAddress.getHostName()); + log.info("Sending of GetProposalStateHashesRequest message to peer {} succeeded.", nodeAddress.getHostName()); } else { log.trace("We have stopped already. We ignore that networkNode.sendMessage.onSuccess call." + "Might be caused by an previous timeout."); @@ -130,9 +138,9 @@ public void onSuccess(Connection connection) { @Override public void onFailure(@NotNull Throwable throwable) { if (!stopped) { - String errorMessage = "Sending getDaoStateHashRequest to " + nodeAddress + + String errorMessage = "Sending getStateHashesRequest to " + nodeAddress + " failed. That is expected if the peer is offline.\n\t" + - "getDaoStateHashRequest=" + getDaoStateHashRequest + "." + + "getStateHashesRequest=" + getStateHashesRequest + "." + "\n\tException=" + throwable.getMessage(); log.error(errorMessage); handleFault(errorMessage, nodeAddress, CloseConnectionReason.SEND_MSG_FAILURE); @@ -143,7 +151,7 @@ public void onFailure(@NotNull Throwable throwable) { } }); } else { - log.warn("We have stopped already. We ignore that requestDaoStateHash call."); + log.warn("We have stopped already. We ignore that requestProposalsHash call."); } } @@ -158,22 +166,22 @@ public void cancel() { @Override public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { - if (networkEnvelope instanceof GetDaoStateHashResponse) { + if (isGetStateHashesResponse(networkEnvelope)) { if (connection.getPeersNodeAddressOptional().isPresent() && connection.getPeersNodeAddressOptional().get().equals(nodeAddress)) { if (!stopped) { - GetDaoStateHashResponse getDaoStateHashResponse = (GetDaoStateHashResponse) networkEnvelope; - if (getDaoStateHashResponse.getRequestNonce() == nonce) { + Res getStateHashesResponse = castToGetStateHashesResponse(networkEnvelope); + if (getStateHashesResponse.getRequestNonce() == nonce) { stopTimeoutTimer(); cleanup(); - log.info("We received from peer {} a DaoStateHashResponse with {} daoStateHashes", - nodeAddress.getFullAddress(), getDaoStateHashResponse.getDaoStateHashes().size()); - listener.onComplete(getDaoStateHashResponse, connection.getPeersNodeAddressOptional()); + log.info("We received from peer {} a GetStateHashesResponse with {} stateHashes", + nodeAddress.getFullAddress(), getStateHashesResponse.getStateHashes().size()); + listener.onComplete(getStateHashesResponse, connection.getPeersNodeAddressOptional()); } else { log.warn("Nonce not matching. That can happen rarely if we get a response after a canceled " + "handshake (timeout causes connection close but peer might have sent a msg before " + "connection was closed).\n\t" + "We drop that message. nonce={} / requestNonce={}", - nonce, getDaoStateHashResponse.getRequestNonce()); + nonce, getStateHashesResponse.getRequestNonce()); } } else { log.warn("We have stopped already."); @@ -193,7 +201,6 @@ public void stop() { // Private /////////////////////////////////////////////////////////////////////////////////////////// - @SuppressWarnings("UnusedParameters") private void handleFault(String errorMessage, NodeAddress nodeAddress, CloseConnectionReason closeConnectionReason) { cleanup(); diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java new file mode 100644 index 00000000000..11b06f6c3d7 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java @@ -0,0 +1,219 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network; + +import bisq.core.dao.monitoring.model.StateHash; +import bisq.core.dao.monitoring.network.messages.GetStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetStateHashesResponse; +import bisq.core.dao.monitoring.network.messages.NewStateHashMessage; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.Connection; +import bisq.network.p2p.network.MessageListener; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.Broadcaster; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import javax.inject.Inject; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.CopyOnWriteArrayList; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Nullable; + +/** + * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for + * so we can detect quickly if any consensus issue arise. The data does not contain any private user + * data so sharing it on demand has no privacy concerns. + * + * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start + * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao + * state from the peers is already covering the next block we have not received yet. So we only take data in account + * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our + * state to the peers to not get ignored it in case they have not received the block yet. + * + * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height + * of the latest block in the snapshot. + * + * TODO maybe request full state? + * TODO add p2p network data for monitoring + * TODO auto recovery + */ +@Slf4j +public abstract class StateNetworkService, + Han extends RequestStateHashesHandler, + StH extends StateHash> implements MessageListener { + + public interface Listener { + void onNewStateHashMessage(Msg newStateHashMessage, Connection connection); + + void onGetStateHashRequest(Connection connection, Req getStateHashRequest); + + void onPeersStateHashes(List stateHashes, Optional peersNodeAddress); + } + + //TODO testing + final NetworkNode networkNode; + final PeerManager peerManager; + private final Broadcaster broadcaster; + + @Getter + private final Map requestStateHashHandlerMap = new HashMap<>(); + private final List> listeners = new CopyOnWriteArrayList<>(); + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + public StateNetworkService(NetworkNode networkNode, + PeerManager peerManager, + Broadcaster broadcaster) { + this.networkNode = networkNode; + this.peerManager = peerManager; + this.broadcaster = broadcaster; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Abstract + /////////////////////////////////////////////////////////////////////////////////////////// + + protected abstract Req castToGetStateHashRequest(NetworkEnvelope networkEnvelope); + + + protected abstract boolean isGetStateHashesRequest(NetworkEnvelope networkEnvelope); + + + protected abstract Msg castToNewStateHashMessage(NetworkEnvelope networkEnvelope); + + + protected abstract boolean isNewStateHashMessage(NetworkEnvelope networkEnvelope); + + protected abstract Res getGetStateHashesResponse(int nonce, List stateHashes); + + protected abstract Msg getNewStateHashMessage(StH myStateHash); + + protected abstract Han getRequestStateHashesHandler(NodeAddress nodeAddress, RequestStateHashesHandler.Listener listener); + + + /////////////////////////////////////////////////////////////////////////////////////////// + // MessageListener implementation + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { + if (isNewStateHashMessage(networkEnvelope)) { + Msg newStateHashMessage = castToNewStateHashMessage(networkEnvelope); + log.info("We received a newStateHashMessage from peer {}. NewStateHashMessage={} ", + connection.getPeersNodeAddressOptional(), newStateHashMessage); + + listeners.forEach(e -> e.onNewStateHashMessage(newStateHashMessage, connection)); + } else if (isGetStateHashesRequest(networkEnvelope)) { + Req getStateHashRequest = castToGetStateHashRequest(networkEnvelope); + listeners.forEach(e -> e.onGetStateHashRequest(connection, getStateHashRequest)); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public void addListeners() { + networkNode.addMessageListener(this); + } + + public void sendGetStateHashesResponse(Connection connection, int nonce, List stateHashes) { + Res getStateHashesResponse = getGetStateHashesResponse(nonce, stateHashes); + connection.sendMessage(getStateHashesResponse); + } + + public void requestHashesFromAllConnectedSeedNodes(int fromHeight) { + networkNode.getConfirmedConnections().stream() + .filter(peerManager::isSeedNode) + .forEach(connection -> connection.getPeersNodeAddressOptional() + .ifPresent(e -> requestHashesFromSeedNode(fromHeight, e))); + } + + public void broadcastMyStateHash(StH myStateHash) { + NewStateHashMessage newStateHashMessage = getNewStateHashMessage(myStateHash); + broadcaster.broadcast(newStateHashMessage, networkNode.getNodeAddress(), null, true); + } + + public void requestHashes(int fromHeight, String peersAddress) { + requestHashesFromSeedNode(fromHeight, new NodeAddress(peersAddress)); + } + + public void reset() { + requestStateHashHandlerMap.clear(); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Listeners + /////////////////////////////////////////////////////////////////////////////////////////// + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void requestHashesFromSeedNode(int fromHeight, NodeAddress nodeAddress) { + RequestStateHashesHandler.Listener listener = new RequestStateHashesHandler.Listener<>() { + @Override + public void onComplete(Res getStateHashesResponse, Optional peersNodeAddress) { + log.debug("requestHashesFromSeedNode of outbound connection complete. nodeAddress={}", nodeAddress); + requestStateHashHandlerMap.remove(nodeAddress); + listeners.forEach(e -> { + List stateHashes = getStateHashesResponse.getStateHashes(); + e.onPeersStateHashes(stateHashes, peersNodeAddress); + }); + } + + @Override + public void onFault(String errorMessage, @Nullable Connection connection) { + log.warn("requestDaoStateHashesHandler with outbound connection failed.\n\tnodeAddress={}\n\t" + + "ErrorMessage={}", nodeAddress, errorMessage); + requestStateHashHandlerMap.remove(nodeAddress); + } + }; + Han requestStateHashesHandler = getRequestStateHashesHandler(nodeAddress, listener); + requestStateHashHandlerMap.put(nodeAddress, requestStateHashesHandler); + requestStateHashesHandler.requestStateHashes(fromHeight); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetDaoStateHashesRequest.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetDaoStateHashesRequest.java new file mode 100644 index 00000000000..d86ae1ee2f5 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetDaoStateHashesRequest.java @@ -0,0 +1,56 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class GetDaoStateHashesRequest extends GetStateHashesRequest { + public GetDaoStateHashesRequest(int height, int nonce) { + super(height, nonce, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private GetDaoStateHashesRequest(int height, int nonce, int messageVersion) { + super(height, nonce, messageVersion); + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setGetDaoStateHashesRequest(PB.GetDaoStateHashesRequest.newBuilder() + .setHeight(height) + .setNonce(nonce)) + .build(); + } + + public static NetworkEnvelope fromProto(PB.GetDaoStateHashesRequest proto, int messageVersion) { + return new GetDaoStateHashesRequest(proto.getHeight(), proto.getNonce(), messageVersion); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashResponse.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetDaoStateHashesResponse.java similarity index 53% rename from core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashResponse.java rename to core/src/main/java/bisq/core/dao/monitoring/network/messages/GetDaoStateHashesResponse.java index 23f44629b30..83998072927 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashResponse.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetDaoStateHashesResponse.java @@ -15,12 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.dao.state.monitoring.messages; +package bisq.core.dao.monitoring.network.messages; -import bisq.core.dao.state.monitoring.DaoStateHash; - -import bisq.network.p2p.DirectMessage; -import bisq.network.p2p.ExtendedDataSizePermission; +import bisq.core.dao.monitoring.model.DaoStateHash; import bisq.common.app.Version; import bisq.common.proto.network.NetworkEnvelope; @@ -36,12 +33,9 @@ @EqualsAndHashCode(callSuper = true) @Getter -public final class GetDaoStateHashResponse extends NetworkEnvelope implements DirectMessage, ExtendedDataSizePermission { - private final List daoStateHashes; - private final int requestNonce; - - public GetDaoStateHashResponse(List daoStateHashes, int requestNonce) { - this(daoStateHashes, requestNonce, Version.getP2PMessageVersion()); +public final class GetDaoStateHashesResponse extends GetStateHashesResponse { + public GetDaoStateHashesResponse(List daoStateHashes, int requestNonce) { + super(daoStateHashes, requestNonce, Version.getP2PMessageVersion()); } @@ -49,40 +43,30 @@ public GetDaoStateHashResponse(List daoStateHashes, int requestNon // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// - private GetDaoStateHashResponse(List daoStateHashes, - int requestNonce, - int messageVersion) { - super(messageVersion); - this.daoStateHashes = daoStateHashes; - this.requestNonce = requestNonce; + private GetDaoStateHashesResponse(List daoStateHashes, + int requestNonce, + int messageVersion) { + super(daoStateHashes, requestNonce, messageVersion); } @Override public PB.NetworkEnvelope toProtoNetworkEnvelope() { return getNetworkEnvelopeBuilder() - .setGetDaoStateHashResponse(PB.GetDaoStateHashResponse.newBuilder() - .addAllDaoStateHashes(daoStateHashes.stream() + .setGetDaoStateHashesResponse(PB.GetDaoStateHashesResponse.newBuilder() + .addAllStateHashes(stateHashes.stream() .map(DaoStateHash::toProtoMessage) .collect(Collectors.toList())) .setRequestNonce(requestNonce)) .build(); } - public static NetworkEnvelope fromProto(PB.GetDaoStateHashResponse proto, int messageVersion) { - return new GetDaoStateHashResponse(proto.getDaoStateHashesList().isEmpty() ? + public static NetworkEnvelope fromProto(PB.GetDaoStateHashesResponse proto, int messageVersion) { + return new GetDaoStateHashesResponse(proto.getStateHashesList().isEmpty() ? new ArrayList<>() : - proto.getDaoStateHashesList().stream() + proto.getStateHashesList().stream() .map(DaoStateHash::fromProto) .collect(Collectors.toList()), proto.getRequestNonce(), messageVersion); } - - @Override - public String toString() { - return "GetDaoStateHashResponse{" + - "\n daoStateHashes=" + daoStateHashes + - ",\n requestNonce=" + requestNonce + - "\n} " + super.toString(); - } } diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesRequest.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesRequest.java new file mode 100644 index 00000000000..e32895b7c1d --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesRequest.java @@ -0,0 +1,56 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class GetProposalStateHashesRequest extends GetStateHashesRequest { + public GetProposalStateHashesRequest(int fromCycleStartHeight, int nonce) { + super(fromCycleStartHeight, nonce, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private GetProposalStateHashesRequest(int height, int nonce, int messageVersion) { + super(height, nonce, messageVersion); + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setGetProposalStateHashesRequest(PB.GetProposalStateHashesRequest.newBuilder() + .setHeight(height) + .setNonce(nonce)) + .build(); + } + + public static NetworkEnvelope fromProto(PB.GetProposalStateHashesRequest proto, int messageVersion) { + return new GetProposalStateHashesRequest(proto.getHeight(), proto.getNonce(), messageVersion); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesResponse.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesResponse.java new file mode 100644 index 00000000000..485ee25d4ec --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetProposalStateHashesResponse.java @@ -0,0 +1,72 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.core.dao.monitoring.model.ProposalStateHash; + +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class GetProposalStateHashesResponse extends GetStateHashesResponse { + public GetProposalStateHashesResponse(List proposalStateHashes, int requestNonce) { + super(proposalStateHashes, requestNonce, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private GetProposalStateHashesResponse(List proposalStateHashes, + int requestNonce, + int messageVersion) { + super(proposalStateHashes, requestNonce, messageVersion); + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setGetProposalStateHashesResponse(PB.GetProposalStateHashesResponse.newBuilder() + .addAllStateHashes(stateHashes.stream() + .map(ProposalStateHash::toProtoMessage) + .collect(Collectors.toList())) + .setRequestNonce(requestNonce)) + .build(); + } + + public static NetworkEnvelope fromProto(PB.GetProposalStateHashesResponse proto, int messageVersion) { + return new GetProposalStateHashesResponse(proto.getStateHashesList().isEmpty() ? + new ArrayList<>() : + proto.getStateHashesList().stream() + .map(ProposalStateHash::fromProto) + .collect(Collectors.toList()), + proto.getRequestNonce(), + messageVersion); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesRequest.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesRequest.java new file mode 100644 index 00000000000..9db856ad662 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesRequest.java @@ -0,0 +1,54 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.network.p2p.DirectMessage; +import bisq.network.p2p.storage.payload.CapabilityRequiringPayload; + +import bisq.common.app.Capabilities; +import bisq.common.app.Capability; +import bisq.common.proto.network.NetworkEnvelope; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public abstract class GetStateHashesRequest extends NetworkEnvelope implements DirectMessage, CapabilityRequiringPayload { + protected final int height; + protected final int nonce; + + protected GetStateHashesRequest(int height, int nonce, int messageVersion) { + super(messageVersion); + this.height = height; + this.nonce = nonce; + } + + @Override + public Capabilities getRequiredCapabilities() { + return new Capabilities(Capability.DAO_STATE); + } + + @Override + public String toString() { + return "GetStateHashesRequest{" + + ",\n height=" + height + + ",\n nonce=" + nonce + + "\n} " + super.toString(); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesResponse.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesResponse.java new file mode 100644 index 00000000000..4dc3e9e66a2 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetStateHashesResponse.java @@ -0,0 +1,53 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.core.dao.monitoring.model.StateHash; + +import bisq.network.p2p.DirectMessage; +import bisq.network.p2p.ExtendedDataSizePermission; + +import bisq.common.proto.network.NetworkEnvelope; + +import java.util.List; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public abstract class GetStateHashesResponse extends NetworkEnvelope implements DirectMessage, ExtendedDataSizePermission { + protected final List stateHashes; + protected final int requestNonce; + + protected GetStateHashesResponse(List stateHashes, + int requestNonce, + int messageVersion) { + super(messageVersion); + this.stateHashes = stateHashes; + this.requestNonce = requestNonce; + } + + @Override + public String toString() { + return "GetStateHashesResponse{" + + "\n stateHashes=" + stateHashes + + ",\n requestNonce=" + requestNonce + + "\n} " + super.toString(); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewDaoStateHashMessage.java similarity index 69% rename from core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java rename to core/src/main/java/bisq/core/dao/monitoring/network/messages/NewDaoStateHashMessage.java index bc871820960..5300031865b 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/messages/NewDaoStateHashMessage.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewDaoStateHashMessage.java @@ -15,12 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.dao.state.monitoring.messages; +package bisq.core.dao.monitoring.network.messages; -import bisq.core.dao.state.monitoring.DaoStateHash; - -import bisq.network.p2p.storage.messages.BroadcastMessage; -import bisq.network.p2p.storage.payload.CapabilityRequiringPayload; +import bisq.core.dao.monitoring.model.DaoStateHash; import bisq.common.app.Capabilities; import bisq.common.app.Capability; @@ -34,11 +31,9 @@ @EqualsAndHashCode(callSuper = true) @Getter -public final class NewDaoStateHashMessage extends BroadcastMessage implements CapabilityRequiringPayload { - private final DaoStateHash daoStateHash; - +public final class NewDaoStateHashMessage extends NewStateHashMessage { public NewDaoStateHashMessage(DaoStateHash daoStateHash) { - this(daoStateHash, Version.getP2PMessageVersion()); + super(daoStateHash, Version.getP2PMessageVersion()); } @@ -47,31 +42,23 @@ public NewDaoStateHashMessage(DaoStateHash daoStateHash) { /////////////////////////////////////////////////////////////////////////////////////////// private NewDaoStateHashMessage(DaoStateHash daoStateHash, int messageVersion) { - super(messageVersion); - this.daoStateHash = daoStateHash; + super(daoStateHash, messageVersion); } @Override public PB.NetworkEnvelope toProtoNetworkEnvelope() { return getNetworkEnvelopeBuilder() .setNewDaoStateHashMessage(PB.NewDaoStateHashMessage.newBuilder() - .setDaoStateHash(daoStateHash.toProtoMessage())) + .setStateHash(stateHash.toProtoMessage())) .build(); } public static NetworkEnvelope fromProto(PB.NewDaoStateHashMessage proto, int messageVersion) { - return new NewDaoStateHashMessage(DaoStateHash.fromProto(proto.getDaoStateHash()), messageVersion); + return new NewDaoStateHashMessage(DaoStateHash.fromProto(proto.getStateHash()), messageVersion); } @Override public Capabilities getRequiredCapabilities() { return new Capabilities(Capability.DAO_STATE); } - - @Override - public String toString() { - return "NewDaoStateHashMessage{" + - "\n daoStateHash=" + daoStateHash + - "\n} " + super.toString(); - } } diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewProposalStateHashMessage.java similarity index 53% rename from core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java rename to core/src/main/java/bisq/core/dao/monitoring/network/messages/NewProposalStateHashMessage.java index 31bceba9e33..4e9485fdffd 100644 --- a/core/src/main/java/bisq/core/dao/state/monitoring/messages/GetDaoStateHashRequest.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewProposalStateHashMessage.java @@ -15,10 +15,9 @@ * along with Bisq. If not, see . */ -package bisq.core.dao.state.monitoring.messages; +package bisq.core.dao.monitoring.network.messages; -import bisq.network.p2p.DirectMessage; -import bisq.network.p2p.storage.payload.CapabilityRequiringPayload; +import bisq.core.dao.monitoring.model.ProposalStateHash; import bisq.common.app.Capabilities; import bisq.common.app.Capability; @@ -32,12 +31,9 @@ @EqualsAndHashCode(callSuper = true) @Getter -public final class GetDaoStateHashRequest extends NetworkEnvelope implements DirectMessage, CapabilityRequiringPayload { - private final int fromBlockHeight; - private final int nonce; - - public GetDaoStateHashRequest(int fromBlockHeight, int nonce) { - this(fromBlockHeight, nonce, Version.getP2PMessageVersion()); +public final class NewProposalStateHashMessage extends NewStateHashMessage { + public NewProposalStateHashMessage(ProposalStateHash proposalStateHash) { + super(proposalStateHash, Version.getP2PMessageVersion()); } @@ -45,35 +41,24 @@ public GetDaoStateHashRequest(int fromBlockHeight, int nonce) { // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// - private GetDaoStateHashRequest(int fromBlockHeight, int nonce, int messageVersion) { - super(messageVersion); - this.fromBlockHeight = fromBlockHeight; - this.nonce = nonce; + private NewProposalStateHashMessage(ProposalStateHash proposalStateHash, int messageVersion) { + super(proposalStateHash, messageVersion); } @Override public PB.NetworkEnvelope toProtoNetworkEnvelope() { return getNetworkEnvelopeBuilder() - .setGetDaoStateHashRequest(PB.GetDaoStateHashRequest.newBuilder() - .setFromBlockHeight(fromBlockHeight) - .setNonce(nonce)) + .setNewProposalStateHashMessage(PB.NewProposalStateHashMessage.newBuilder() + .setStateHash(stateHash.toProtoMessage())) .build(); } - public static NetworkEnvelope fromProto(PB.GetDaoStateHashRequest proto, int messageVersion) { - return new GetDaoStateHashRequest(proto.getFromBlockHeight(), proto.getNonce(), messageVersion); + public static NetworkEnvelope fromProto(PB.NewProposalStateHashMessage proto, int messageVersion) { + return new NewProposalStateHashMessage(ProposalStateHash.fromProto(proto.getStateHash()), messageVersion); } @Override public Capabilities getRequiredCapabilities() { return new Capabilities(Capability.DAO_STATE); } - - @Override - public String toString() { - return "GetDaoStateHashRequest{" + - ",\n fromBlockHeight=" + fromBlockHeight + - ",\n nonce=" + nonce + - "\n} " + super.toString(); - } } diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewStateHashMessage.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewStateHashMessage.java new file mode 100644 index 00000000000..4d2f05d2357 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewStateHashMessage.java @@ -0,0 +1,52 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.core.dao.monitoring.model.StateHash; + +import bisq.network.p2p.storage.messages.BroadcastMessage; +import bisq.network.p2p.storage.payload.CapabilityRequiringPayload; + +import bisq.common.app.Capabilities; +import bisq.common.app.Capability; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public abstract class NewStateHashMessage extends BroadcastMessage implements CapabilityRequiringPayload { + protected final T stateHash; + + protected NewStateHashMessage(T stateHash, int messageVersion) { + super(messageVersion); + this.stateHash = stateHash; + } + + @Override + public Capabilities getRequiredCapabilities() { + return new Capabilities(Capability.DAO_STATE); + } + + @Override + public String toString() { + return "NewStateHashMessage{" + + "\n stateHash=" + stateHash + + "\n} " + super.toString(); + } +} diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index 64f37251d55..65c1760e57f 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -153,12 +153,11 @@ DaoState getClone(DaoState snapshotCandidate) { return DaoState.getClone(snapshotCandidate); } - public byte[] getDaoStateHash() { + public byte[] getSerializedDaoState() { return daoState.toProtoMessage().toByteArray(); } - /////////////////////////////////////////////////////////////////////////////////////////// // ChainHeight /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java b/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java index 01c0f2fc754..791605d6553 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java @@ -18,10 +18,10 @@ package bisq.core.dao.state; import bisq.core.dao.governance.period.CycleService; +import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.monitoring.model.DaoStateHash; import bisq.core.dao.state.model.DaoState; import bisq.core.dao.state.model.blockchain.Block; -import bisq.core.dao.state.monitoring.DaoStateHash; -import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import javax.inject.Inject; diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java b/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java index 8cda072ed54..2fd4c9e6890 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java @@ -17,9 +17,9 @@ package bisq.core.dao.state; +import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.monitoring.model.DaoStateHash; import bisq.core.dao.state.model.DaoState; -import bisq.core.dao.state.monitoring.DaoStateHash; -import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import bisq.network.p2p.storage.persistence.ResourceDataStoreService; import bisq.network.p2p.storage.persistence.StoreService; diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateStore.java b/core/src/main/java/bisq/core/dao/state/DaoStateStore.java index 272eb2da33a..300be7f1b81 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateStore.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateStore.java @@ -17,8 +17,8 @@ package bisq.core.dao.state; +import bisq.core.dao.monitoring.model.DaoStateHash; import bisq.core.dao.state.model.DaoState; -import bisq.core.dao.state.monitoring.DaoStateHash; import bisq.common.proto.persistable.PersistableEnvelope; diff --git a/core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java b/core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java deleted file mode 100644 index 429bf39f3ec..00000000000 --- a/core/src/main/java/bisq/core/dao/state/monitoring/network/DaoStateNetworkService.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * This file is part of Bisq. - * - * bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with bisq. If not, see . - */ - -package bisq.core.dao.state.monitoring.network; - -import bisq.core.dao.state.DaoStateListener; -import bisq.core.dao.state.monitoring.DaoStateHash; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; -import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; - -import bisq.network.p2p.NodeAddress; -import bisq.network.p2p.network.Connection; -import bisq.network.p2p.network.MessageListener; -import bisq.network.p2p.network.NetworkNode; -import bisq.network.p2p.peers.Broadcaster; -import bisq.network.p2p.peers.PeerManager; - -import bisq.common.proto.network.NetworkEnvelope; - -import javax.inject.Inject; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CopyOnWriteArrayList; - -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; - -import javax.annotation.Nullable; - -/** - * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for - * so we can detect quickly if any consensus issue arise. The data does not contain any private user - * data so sharing it on demand has no privacy concerns. - * - * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start - * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao - * state from the peers is already covering the next block we have not received yet. So we only take data in account - * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our - * state to the peers to not get ignored it in case they have not received the block yet. - * - * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height - * of the latest block in the snapshot. - * - * TODO maybe request full state? - * TODO add p2p network data for monitoring - * TODO auto recovery - */ -@Slf4j -public class DaoStateNetworkService implements DaoStateListener, MessageListener { - - public interface Listener { - void onNewDaoStateHashMessage(NewDaoStateHashMessage newDaoStateHashMessage, Connection connection); - - void onGetDaoStateHashRequest(Connection connection, GetDaoStateHashRequest getDaoStateHashRequest); - - void onPeersDaoStateHashes(List daoStateHash, Optional peersNodeAddress); - } - - //TODO testing - public final NetworkNode networkNode; - private final PeerManager peerManager; - private final Broadcaster broadcaster; - - @Getter - private final Map requestDaoStateHashHandlerMap = new HashMap<>(); - private final List listeners = new CopyOnWriteArrayList<>(); - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Constructor - /////////////////////////////////////////////////////////////////////////////////////////// - - @Inject - public DaoStateNetworkService(NetworkNode networkNode, - PeerManager peerManager, - Broadcaster broadcaster) { - this.networkNode = networkNode; - this.peerManager = peerManager; - this.broadcaster = broadcaster; - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // MessageListener implementation - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { - if (networkEnvelope instanceof NewDaoStateHashMessage) { - NewDaoStateHashMessage newDaoStateHashMessage = (NewDaoStateHashMessage) networkEnvelope; - log.info("We received a newDaoStateHashMessage from peer {}. NewDaoStateHashMessage={} ", - connection.getPeersNodeAddressOptional(), newDaoStateHashMessage); - - listeners.forEach(e -> e.onNewDaoStateHashMessage(newDaoStateHashMessage, connection)); - } else if (networkEnvelope instanceof GetDaoStateHashRequest) { - GetDaoStateHashRequest getDaoStateHashRequest = (GetDaoStateHashRequest) networkEnvelope; - listeners.forEach(e -> e.onGetDaoStateHashRequest(connection, getDaoStateHashRequest)); - } - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // API - /////////////////////////////////////////////////////////////////////////////////////////// - - public void addListeners() { - networkNode.addMessageListener(this); - } - - public void sendGetDaoStateHashResponse(Connection connection, int nonce, List daoStateHashes) { - connection.sendMessage(new GetDaoStateHashResponse(daoStateHashes, nonce)); - } - - public void requestHashesFromAllConnectedSeedNodes(int fromBlockHeight) { - networkNode.getConfirmedConnections().stream() - .filter(peerManager::isSeedNode) - .forEach(connection -> connection.getPeersNodeAddressOptional() - .ifPresent(e -> requestHashFromSeedNode(fromBlockHeight, e))); - } - - public void broadcastMyDaoStateHash(DaoStateHash myDaoStateHash) { - broadcaster.broadcast(new NewDaoStateHashMessage(myDaoStateHash), - networkNode.getNodeAddress(), - null, - true); - } - - public void requestHashes(int fromBlockHeight, String peersAddress) { - requestHashFromSeedNode(fromBlockHeight, new NodeAddress(peersAddress)); - } - - public void reset() { - requestDaoStateHashHandlerMap.clear(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Listeners - /////////////////////////////////////////////////////////////////////////////////////////// - - public void addListener(Listener listener) { - listeners.add(listener); - } - - public void removeListener(Listener listener) { - listeners.remove(listener); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Private - /////////////////////////////////////////////////////////////////////////////////////////// - - private void requestHashFromSeedNode(int fromBlockHeight, NodeAddress nodeAddress) { - RequestDaoStateHashHandler requestDaoStateHashHandler = new RequestDaoStateHashHandler(networkNode, - peerManager, - nodeAddress, - new RequestDaoStateHashHandler.Listener() { - @Override - public void onComplete(GetDaoStateHashResponse getDaoStateHashResponse, Optional peersNodeAddress) { - log.debug("requestDaoStateHashHandler of outbound connection complete. nodeAddress={}", nodeAddress); - requestDaoStateHashHandlerMap.remove(nodeAddress); - listeners.forEach(e -> e.onPeersDaoStateHashes(getDaoStateHashResponse.getDaoStateHashes(), peersNodeAddress)); - } - - @Override - public void onFault(String errorMessage, @Nullable Connection connection) { - log.warn("requestDaoStateHashHandler with outbound connection failed.\n\tnodeAddress={}\n\t" + - "ErrorMessage={}", nodeAddress, errorMessage); - requestDaoStateHashHandlerMap.remove(nodeAddress); - } - }); - requestDaoStateHashHandlerMap.put(nodeAddress, requestDaoStateHashHandler); - requestDaoStateHashHandler.requestDaoStateHash(fromBlockHeight); - } -} diff --git a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java index 18c0068a332..69921c2ef47 100644 --- a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java @@ -28,12 +28,15 @@ import bisq.core.arbitration.messages.PeerPublishedDisputePayoutTxMessage; import bisq.core.dao.governance.blindvote.network.messages.RepublishGovernanceDataRequest; import bisq.core.dao.governance.proposal.storage.temp.TempProposalPayload; +import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesResponse; +import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesResponse; +import bisq.core.dao.monitoring.network.messages.NewDaoStateHashMessage; +import bisq.core.dao.monitoring.network.messages.NewProposalStateHashMessage; import bisq.core.dao.node.messages.GetBlocksRequest; import bisq.core.dao.node.messages.GetBlocksResponse; import bisq.core.dao.node.messages.NewBlockBroadcastMessage; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashRequest; -import bisq.core.dao.state.monitoring.messages.GetDaoStateHashResponse; -import bisq.core.dao.state.monitoring.messages.NewDaoStateHashMessage; import bisq.core.filter.Filter; import bisq.core.offer.OfferPayload; import bisq.core.offer.messages.OfferAvailabilityRequest; @@ -156,19 +159,26 @@ public NetworkEnvelope fromProto(PB.NetworkEnvelope proto) throws ProtobufferExc return GetBlocksResponse.fromProto(proto.getGetBlocksResponse(), messageVersion); case NEW_BLOCK_BROADCAST_MESSAGE: return NewBlockBroadcastMessage.fromProto(proto.getNewBlockBroadcastMessage(), messageVersion); - case NEW_DAO_STATE_HASH_MESSAGE: - return NewDaoStateHashMessage.fromProto(proto.getNewDaoStateHashMessage(), messageVersion); - case ADD_PERSISTABLE_NETWORK_PAYLOAD_MESSAGE: return AddPersistableNetworkPayloadMessage.fromProto(proto.getAddPersistableNetworkPayloadMessage(), this, messageVersion); case ACK_MESSAGE: return AckMessage.fromProto(proto.getAckMessage(), messageVersion); case REPUBLISH_GOVERNANCE_DATA_REQUEST: return RepublishGovernanceDataRequest.fromProto(proto.getRepublishGovernanceDataRequest(), messageVersion); - case GET_DAO_STATE_HASH_REQUEST: - return GetDaoStateHashRequest.fromProto(proto.getGetDaoStateHashRequest(), messageVersion); - case GET_DAO_STATE_HASH_RESPONSE: - return GetDaoStateHashResponse.fromProto(proto.getGetDaoStateHashResponse(), messageVersion); + + case NEW_DAO_STATE_HASH_MESSAGE: + return NewDaoStateHashMessage.fromProto(proto.getNewDaoStateHashMessage(), messageVersion); + case GET_DAO_STATE_HASHES_REQUEST: + return GetDaoStateHashesRequest.fromProto(proto.getGetDaoStateHashesRequest(), messageVersion); + case GET_DAO_STATE_HASHES_RESPONSE: + return GetDaoStateHashesResponse.fromProto(proto.getGetDaoStateHashesResponse(), messageVersion); + + case NEW_PROPOSAL_STATE_HASH_MESSAGE: + return NewProposalStateHashMessage.fromProto(proto.getNewProposalStateHashMessage(), messageVersion); + case GET_PROPOSAL_STATE_HASHES_REQUEST: + return GetProposalStateHashesRequest.fromProto(proto.getGetProposalStateHashesRequest(), messageVersion); + case GET_PROPOSAL_STATE_HASHES_RESPONSE: + return GetProposalStateHashesResponse.fromProto(proto.getGetProposalStateHashesResponse(), messageVersion); default: throw new ProtobufferException("Unknown proto message case (PB.NetworkEnvelope). messageCase=" + diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java index c641035cd11..332780f0865 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java @@ -29,9 +29,9 @@ import bisq.desktop.util.Layout; import bisq.core.dao.DaoFacade; +import bisq.core.dao.monitoring.DaoStateMonitoringService; import bisq.core.dao.state.DaoStateListener; import bisq.core.dao.state.DaoStateService; -import bisq.core.dao.state.monitoring.DaoStateMonitoringService; import bisq.core.locale.Res; import javax.inject.Inject; @@ -172,7 +172,7 @@ public void onParseBlockChainComplete() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onDaoStateBlockchainChanged() { + public void onDaoStateBlockChainChanged() { if (daoStateService.isParseBlockChainComplete()) { onDataUpdate(); } @@ -252,7 +252,7 @@ private void onDataUpdate() { statusTextField.getStyleClass().remove("dao-inConflict"); } - listItems.setAll(daoStateMonitoringService.getDaoStateBlockchain().stream() + listItems.setAll(daoStateMonitoringService.getDaoStateBlockChain().stream() .map(DaoStateBlockListItem::new) .collect(Collectors.toList())); GUIUtil.setFitToRowsForTableView(tableView, 25, 28, 2, 5); @@ -289,7 +289,7 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getBlockHeight())); + column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getHeight())); column.setSortType(TableColumn.SortType.DESCENDING); tableView.getColumns().add(column); tableView.getSortOrder().add(column); @@ -443,14 +443,14 @@ public TableCell call( public void updateItem(final DaoStateInConflictListItem item, boolean empty) { super.updateItem(item, empty); if (item != null) - setText(item.getBlockHeight()); + setText(item.getHeight()); else setText(""); } }; } }); - column.setComparator(Comparator.comparing(e -> e.getDaoStateHash().getBlockHeight())); + column.setComparator(Comparator.comparing(e -> e.getDaoStateHash().getHeight())); column.setSortType(TableColumn.SortType.DESCENDING); conflictTableView.getColumns().add(column); conflictTableView.getSortOrder().add(column); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java index bf6c3fc7ffb..35a9015a97a 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java @@ -17,7 +17,7 @@ package bisq.desktop.main.dao.governance.consensus; -import bisq.core.dao.state.monitoring.DaoStateBlock; +import bisq.core.dao.monitoring.model.DaoStateBlock; import bisq.common.util.Utilities; @@ -38,7 +38,7 @@ class DaoStateBlockListItem { DaoStateBlockListItem(DaoStateBlock daoStateBlock) { this.daoStateBlock = daoStateBlock; - height = String.valueOf(daoStateBlock.getBlockHeight()); + height = String.valueOf(daoStateBlock.getHeight()); hash = Utilities.bytesAsHexString(daoStateBlock.getHash()); prevHash = daoStateBlock.getPrevHash().length > 0 ? Utilities.bytesAsHexString(daoStateBlock.getPrevHash()) : "-"; numNetworkMessages = String.valueOf(daoStateBlock.getPeersMap().size()); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java index ff728fc68f5..95baeb84f71 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java @@ -17,7 +17,7 @@ package bisq.desktop.main.dao.governance.consensus; -import bisq.core.dao.state.monitoring.DaoStateHash; +import bisq.core.dao.monitoring.model.DaoStateHash; import bisq.common.util.Utilities; @@ -28,7 +28,7 @@ @Value class DaoStateInConflictListItem { private final String peerAddress; - private final String blockHeight; + private final String height; private final String hash; private final String prevHash; private final DaoStateHash daoStateHash; @@ -36,7 +36,7 @@ class DaoStateInConflictListItem { DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash) { this.daoStateHash = daoStateHash; this.peerAddress = peerAddress; - blockHeight = String.valueOf(daoStateHash.getBlockHeight()); + height = String.valueOf(daoStateHash.getHeight()); hash = Utilities.bytesAsHexString(daoStateHash.getHash()); prevHash = daoStateHash.getPrevHash().length > 0 ? Utilities.bytesAsHexString(daoStateHash.getPrevHash()) : "-"; From 36852701cd93c2cd8225640fe88aab38cc93d718 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 14 Mar 2019 20:31:27 -0500 Subject: [PATCH 17/31] Move monitor view to new tab --- .../resources/i18n/displayStrings.properties | 35 +-- .../java/bisq/desktop/main/dao/DaoView.java | 16 +- .../main/dao/governance/GovernanceView.java | 11 +- .../desktop/main/dao/monitor/MonitorView.fxml | 36 +++ .../desktop/main/dao/monitor/MonitorView.java | 131 ++++++++++ .../StateBlockListItem.java} | 29 ++- .../StateInConflictListItem.java} | 26 +- .../StateMonitorView.java} | 226 +++++++++--------- .../blindvotes/BlindVoteStateMonitorView.fxml | 32 +++ .../blindvotes/BlindVoteStateMonitorView.java | 51 ++++ .../daostate/DaoStateBlockListItem.java | 37 +++ .../daostate/DaoStateInConflictListItem.java | 35 +++ .../daostate/DaoStateMonitorView.fxml} | 2 +- .../monitor/daostate/DaoStateMonitorView.java | 168 +++++++++++++ .../proposals/ProposalStateMonitorView.fxml | 32 +++ .../proposals/ProposalStateMonitorView.java | 45 ++++ 16 files changed, 745 insertions(+), 167 deletions(-) create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.fxml create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.java rename desktop/src/main/java/bisq/desktop/main/dao/{governance/consensus/DaoStateBlockListItem.java => monitor/StateBlockListItem.java} (56%) rename desktop/src/main/java/bisq/desktop/main/dao/{governance/consensus/DaoStateInConflictListItem.java => monitor/StateInConflictListItem.java} (60%) rename desktop/src/main/java/bisq/desktop/main/dao/{governance/consensus/ConsensusView.java => monitor/StateMonitorView.java} (66%) create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.fxml create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java rename desktop/src/main/java/bisq/desktop/main/dao/{governance/consensus/ConsensusView.fxml => monitor/daostate/DaoStateMonitorView.fxml} (92%) create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.fxml create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 00f3a2c36a3..760df3597ef 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -1247,6 +1247,7 @@ dao.tab.bsqWallet=BSQ wallet dao.tab.proposals=Governance dao.tab.bonding=Bonding dao.tab.proofOfBurn=Asset listing fee/Proof of burn +dao.tab.monitor=Network monitor dao.tab.news=News dao.paidWithBsq=paid with BSQ @@ -1264,7 +1265,6 @@ dao.proposal.menuItem.make=Make proposal dao.proposal.menuItem.browse=Browse open proposals dao.proposal.menuItem.vote=Vote on proposals dao.proposal.menuItem.result=Vote results -dao.proposal.menuItem.consensus=Network consensus dao.cycle.headline=Voting cycle dao.cycle.overview.headline=Voting cycle overview dao.cycle.currentPhase=Current phase @@ -1299,6 +1299,7 @@ dao.results.proposals.table.header.result=Vote result dao.results.proposals.voting.detail.header=Vote results for selected proposal dao.results.exceptions=Vote result exception(s) + # suppress inspection "UnusedProperty" dao.param.UNDEFINED=Undefined @@ -1844,21 +1845,25 @@ dao.news.DAOOnTestnet.fourthSection.title=4. Explore a BSQ Block Explorer dao.news.DAOOnTestnet.fourthSection.content=Since BSQ is just bitcoin, you can see BSQ transactions on our bitcoin block explorer. dao.news.DAOOnTestnet.readMoreLink=Read the full documentation -dao.governance.consensus.headline=DAO network consensus -dao.governance.consensus.state=Status -dao.governance.consensus.daoStateInSync=Your local DAO state is in sync with the network -dao.governance.consensus.daoStateNotInSync=Your local DAO state is not in sync with the network. Please resync your \ +dao.monitor.daoState=DAO state +dao.monitor.proposals=Proposal state +dao.monitor.blindVotes=Blind votes state + +dao.monitor.daoState.headline=DAO state +dao.monitor.daoState.state=Status +dao.monitor.daoState.daoStateInSync=Your local DAO state is in sync with the network +dao.monitor.daoState.daoStateNotInSync=Your local DAO state is not in sync with the network. Please resync your \ DAO state and if the conflict remains contact the Bisq developers. -dao.governance.consensus.resync=Resync DAO state -dao.governance.consensus.table.headline=Chain of DAO state hashes -dao.governance.consensus.table.blockHeight=Block height -dao.governance.consensus.table.hash=Hash of DAO state -dao.governance.consensus.table.prev=Previous hash of DAO state -dao.governance.consensus.table.numPeer=Peers -dao.governance.consensus.table.numMisMatches=Conflicts -dao.governance.consensus.conflictTable.headline=DAO states from peers in conflict -dao.governance.consensus.conflictTable.peer=Peer's address -dao.governance.consensus.conflictTable.request=Request all hashes +dao.monitor.daoState.resync=Resync DAO state +dao.monitor.daoState.table.headline=Chain of DAO state hashes +dao.monitor.daoState.table.blockHeight=Block height +dao.monitor.daoState.table.hash=Hash of DAO state +dao.monitor.daoState.table.prev=Previous hash of DAO state +dao.monitor.daoState.table.numPeer=Peers +dao.monitor.daoState.table.numMisMatches=Conflicts +dao.monitor.daoState.conflictTable.headline=DAO states from peers in conflict +dao.monitor.daoState.conflictTable.peer=Peer's address +dao.monitor.daoState.conflictTable.request=Request all hashes #################################################################### diff --git a/desktop/src/main/java/bisq/desktop/main/dao/DaoView.java b/desktop/src/main/java/bisq/desktop/main/dao/DaoView.java index 412645fb567..98239372f88 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/DaoView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/DaoView.java @@ -28,6 +28,7 @@ import bisq.desktop.main.dao.bonding.BondingView; import bisq.desktop.main.dao.burnbsq.BurnBsqView; import bisq.desktop.main.dao.governance.GovernanceView; +import bisq.desktop.main.dao.monitor.MonitorView; import bisq.desktop.main.dao.news.NewsView; import bisq.desktop.main.dao.wallet.BsqWalletView; import bisq.desktop.main.dao.wallet.dashboard.BsqDashboardView; @@ -52,7 +53,7 @@ public class DaoView extends ActivatableViewAndModel { @FXML - private Tab bsqWalletTab, proposalsTab, bondingTab, burnBsqTab, daoNewsTab; + private Tab bsqWalletTab, proposalsTab, bondingTab, burnBsqTab, daoNewsTab, monitor; private Navigation.Listener navigationListener; private ChangeListener tabChangeListener; @@ -80,23 +81,26 @@ public void initialize() { proposalsTab = new Tab(Res.get("dao.tab.proposals").toUpperCase()); bondingTab = new Tab(Res.get("dao.tab.bonding").toUpperCase()); burnBsqTab = new Tab(Res.get("dao.tab.proofOfBurn").toUpperCase()); + monitor = new Tab(Res.get("dao.tab.monitor").toUpperCase()); bsqWalletTab.setClosable(false); proposalsTab.setClosable(false); bondingTab.setClosable(false); burnBsqTab.setClosable(false); + monitor.setClosable(false); if (!DevEnv.isDaoActivated()) { + bsqWalletTab.setDisable(true); proposalsTab.setDisable(true); bondingTab.setDisable(true); burnBsqTab.setDisable(true); - bsqWalletTab.setDisable(true); + monitor.setDisable(true); daoNewsTab = new Tab(Res.get("dao.tab.news").toUpperCase()); root.getTabs().add(daoNewsTab); } else { - root.getTabs().addAll(bsqWalletTab, proposalsTab, bondingTab, burnBsqTab); + root.getTabs().addAll(bsqWalletTab, proposalsTab, bondingTab, burnBsqTab, monitor); } navigationListener = viewPath -> { @@ -121,6 +125,8 @@ public void initialize() { navigation.navigateTo(MainView.class, DaoView.class, BondingView.class); } else if (newValue == burnBsqTab) { navigation.navigateTo(MainView.class, DaoView.class, BurnBsqView.class); + } else if (newValue == monitor) { + navigation.navigateTo(MainView.class, DaoView.class, MonitorView.class); } }; } @@ -141,6 +147,8 @@ else if (selectedItem == bondingTab) navigation.navigateTo(MainView.class, DaoView.class, BondingView.class); else if (selectedItem == burnBsqTab) navigation.navigateTo(MainView.class, DaoView.class, BurnBsqView.class); + else if (selectedItem == monitor) + navigation.navigateTo(MainView.class, DaoView.class, MonitorView.class); } } else { loadView(NewsView.class); @@ -173,6 +181,8 @@ private void loadView(Class viewClass) { selectedTab = bondingTab; } else if (view instanceof BurnBsqView) { selectedTab = burnBsqTab; + } else if (view instanceof MonitorView) { + selectedTab = monitor; } else if (view instanceof NewsView) { selectedTab = daoNewsTab; } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java index 99866949f0d..3c3c4510c47 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/GovernanceView.java @@ -27,7 +27,6 @@ import bisq.desktop.components.MenuItem; import bisq.desktop.main.MainView; import bisq.desktop.main.dao.DaoView; -import bisq.desktop.main.dao.governance.consensus.ConsensusView; import bisq.desktop.main.dao.governance.dashboard.GovernanceDashboardView; import bisq.desktop.main.dao.governance.make.MakeProposalView; import bisq.desktop.main.dao.governance.proposals.ProposalsView; @@ -52,12 +51,11 @@ @FxmlView public class GovernanceView extends ActivatableViewAndModel { - private final ViewLoader viewLoader; private final Navigation navigation; private final DaoFacade daoFacade; - private MenuItem dashboard, make, open, result, consensus; + private MenuItem dashboard, make, open, result; private Navigation.Listener navigationListener; @FXML @@ -103,10 +101,8 @@ public void initialize() { ProposalsView.class, baseNavPath); result = new MenuItem(navigation, toggleGroup, Res.get("dao.proposal.menuItem.result"), VoteResultView.class, baseNavPath); - consensus = new MenuItem(navigation, toggleGroup, Res.get("dao.proposal.menuItem.consensus"), - ConsensusView.class, baseNavPath); - leftVBox.getChildren().addAll(dashboard, make, open, result, consensus); + leftVBox.getChildren().addAll(dashboard, make, open, result); } @Override @@ -117,7 +113,6 @@ protected void activate() { make.activate(); open.activate(); result.activate(); - consensus.activate(); navigation.addListener(navigationListener); ViewPath viewPath = navigation.getCurrentPath(); @@ -145,7 +140,6 @@ protected void deactivate() { make.deactivate(); open.deactivate(); result.deactivate(); - consensus.deactivate(); } private void loadView(Class viewClass) { @@ -156,7 +150,6 @@ private void loadView(Class viewClass) { else if (view instanceof MakeProposalView) toggleGroup.selectToggle(make); else if (view instanceof ProposalsView) toggleGroup.selectToggle(open); else if (view instanceof VoteResultView) toggleGroup.selectToggle(result); - else if (view instanceof ConsensusView) toggleGroup.selectToggle(consensus); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.fxml b/desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.fxml new file mode 100644 index 00000000000..c0377d39c31 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.fxml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.java new file mode 100644 index 00000000000..93de1642514 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/MonitorView.java @@ -0,0 +1,131 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor; + +import bisq.desktop.Navigation; +import bisq.desktop.common.view.ActivatableViewAndModel; +import bisq.desktop.common.view.CachingViewLoader; +import bisq.desktop.common.view.FxmlView; +import bisq.desktop.common.view.View; +import bisq.desktop.common.view.ViewLoader; +import bisq.desktop.common.view.ViewPath; +import bisq.desktop.components.MenuItem; +import bisq.desktop.main.MainView; +import bisq.desktop.main.dao.DaoView; +import bisq.desktop.main.dao.monitor.blindvotes.BlindVoteStateMonitorView; +import bisq.desktop.main.dao.monitor.daostate.DaoStateMonitorView; +import bisq.desktop.main.dao.monitor.proposals.ProposalStateMonitorView; + +import bisq.core.locale.Res; + +import javax.inject.Inject; + +import javafx.fxml.FXML; + +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; + +import java.util.Arrays; +import java.util.List; + +@FxmlView +public class MonitorView extends ActivatableViewAndModel { + private final ViewLoader viewLoader; + private final Navigation navigation; + + private MenuItem daoState, proposals, blindVotes; + private Navigation.Listener navigationListener; + + @FXML + private VBox leftVBox; + @FXML + private AnchorPane content; + private Class selectedViewClass; + private ToggleGroup toggleGroup; + + @Inject + private MonitorView(CachingViewLoader viewLoader, Navigation navigation) { + this.viewLoader = viewLoader; + this.navigation = navigation; + } + + @Override + public void initialize() { + navigationListener = viewPath -> { + if (viewPath.size() != 4 || viewPath.indexOf(MonitorView.class) != 2) + return; + + selectedViewClass = viewPath.tip(); + loadView(selectedViewClass); + }; + + toggleGroup = new ToggleGroup(); + List> baseNavPath = Arrays.asList(MainView.class, DaoView.class, MonitorView.class); + daoState = new MenuItem(navigation, toggleGroup, Res.get("dao.monitor.daoState"), + DaoStateMonitorView.class, baseNavPath); + proposals = new MenuItem(navigation, toggleGroup, Res.get("dao.monitor.proposals"), + ProposalStateMonitorView.class, baseNavPath); + blindVotes = new MenuItem(navigation, toggleGroup, Res.get("dao.monitor.blindVotes"), + BlindVoteStateMonitorView.class, baseNavPath); + + leftVBox.getChildren().addAll(daoState, proposals, blindVotes); + } + + @Override + protected void activate() { + proposals.activate(); + blindVotes.activate(); + daoState.activate(); + + navigation.addListener(navigationListener); + ViewPath viewPath = navigation.getCurrentPath(); + if (viewPath.size() == 3 && viewPath.indexOf(MonitorView.class) == 2 || + viewPath.size() == 2 && viewPath.indexOf(DaoView.class) == 1) { + if (selectedViewClass == null) + selectedViewClass = DaoStateMonitorView.class; + + loadView(selectedViewClass); + + } else if (viewPath.size() == 4 && viewPath.indexOf(MonitorView.class) == 2) { + selectedViewClass = viewPath.get(3); + loadView(selectedViewClass); + } + } + + @SuppressWarnings("Duplicates") + @Override + protected void deactivate() { + navigation.removeListener(navigationListener); + + proposals.deactivate(); + blindVotes.deactivate(); + daoState.deactivate(); + } + + private void loadView(Class viewClass) { + View view = viewLoader.load(viewClass); + content.getChildren().setAll(view.getRoot()); + + if (view instanceof DaoStateMonitorView) toggleGroup.selectToggle(daoState); + else if (view instanceof ProposalStateMonitorView) toggleGroup.selectToggle(proposals); + else if (view instanceof BlindVoteStateMonitorView) toggleGroup.selectToggle(blindVotes); + } +} + + diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateBlockListItem.java similarity index 56% rename from desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java rename to desktop/src/main/java/bisq/desktop/main/dao/monitor/StateBlockListItem.java index 35a9015a97a..7969fd3323d 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateBlockListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateBlockListItem.java @@ -15,19 +15,22 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.dao.governance.consensus; +package bisq.desktop.main.dao.monitor; -import bisq.core.dao.monitoring.model.DaoStateBlock; +import bisq.core.dao.monitoring.model.StateBlock; +import bisq.core.dao.monitoring.model.StateHash; import bisq.common.util.Utilities; -import lombok.Value; +import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; @Slf4j -@Value -class DaoStateBlockListItem { - private final DaoStateBlock daoStateBlock; +@Getter +@EqualsAndHashCode +public abstract class StateBlockListItem> { + private final StateBlock stateBlock; private final String height; private final String hash; private final String prevHash; @@ -35,14 +38,14 @@ class DaoStateBlockListItem { private final String numMisMatches; private final boolean isInSync; - DaoStateBlockListItem(DaoStateBlock daoStateBlock) { - this.daoStateBlock = daoStateBlock; + protected StateBlockListItem(StB stateBlock) { + this.stateBlock = stateBlock; - height = String.valueOf(daoStateBlock.getHeight()); - hash = Utilities.bytesAsHexString(daoStateBlock.getHash()); - prevHash = daoStateBlock.getPrevHash().length > 0 ? Utilities.bytesAsHexString(daoStateBlock.getPrevHash()) : "-"; - numNetworkMessages = String.valueOf(daoStateBlock.getPeersMap().size()); - int size = daoStateBlock.getInConflictMap().size(); + height = String.valueOf(stateBlock.getHeight()); + hash = Utilities.bytesAsHexString(stateBlock.getHash()); + prevHash = stateBlock.getPrevHash().length > 0 ? Utilities.bytesAsHexString(stateBlock.getPrevHash()) : "-"; + numNetworkMessages = String.valueOf(stateBlock.getPeersMap().size()); + int size = stateBlock.getInConflictMap().size(); numMisMatches = String.valueOf(size); isInSync = size == 0; } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateInConflictListItem.java similarity index 60% rename from desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java rename to desktop/src/main/java/bisq/desktop/main/dao/monitor/StateInConflictListItem.java index 95baeb84f71..6bcf2eec4f5 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/DaoStateInConflictListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateInConflictListItem.java @@ -15,30 +15,32 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.dao.governance.consensus; +package bisq.desktop.main.dao.monitor; -import bisq.core.dao.monitoring.model.DaoStateHash; +import bisq.core.dao.monitoring.model.StateHash; import bisq.common.util.Utilities; -import lombok.Value; +import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; @Slf4j -@Value -class DaoStateInConflictListItem { +@Getter +@EqualsAndHashCode +public abstract class StateInConflictListItem { private final String peerAddress; private final String height; private final String hash; private final String prevHash; - private final DaoStateHash daoStateHash; + private final T stateHash; - DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash) { - this.daoStateHash = daoStateHash; + protected StateInConflictListItem(String peerAddress, T stateHash) { + this.stateHash = stateHash; this.peerAddress = peerAddress; - height = String.valueOf(daoStateHash.getHeight()); - hash = Utilities.bytesAsHexString(daoStateHash.getHash()); - prevHash = daoStateHash.getPrevHash().length > 0 ? - Utilities.bytesAsHexString(daoStateHash.getPrevHash()) : "-"; + height = String.valueOf(stateHash.getHeight()); + hash = Utilities.bytesAsHexString(stateHash.getHash()); + prevHash = stateHash.getPrevHash().length > 0 ? + Utilities.bytesAsHexString(stateHash.getPrevHash()) : "-"; } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java similarity index 66% rename from desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java rename to desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java index 332780f0865..ac422d9e1af 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.desktop.main.dao.governance.consensus; +package bisq.desktop.main.dao.monitor; import bisq.desktop.common.view.ActivatableView; import bisq.desktop.common.view.FxmlView; @@ -23,13 +23,14 @@ import bisq.desktop.components.AutoTooltipLabel; import bisq.desktop.components.AutoTooltipTableColumn; import bisq.desktop.components.TableGroupHeadline; -import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.util.FormBuilder; import bisq.desktop.util.GUIUtil; import bisq.desktop.util.Layout; import bisq.core.dao.DaoFacade; import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.monitoring.model.StateBlock; +import bisq.core.dao.monitoring.model.StateHash; import bisq.core.dao.state.DaoStateListener; import bisq.core.dao.state.DaoStateService; import bisq.core.locale.Res; @@ -63,29 +64,31 @@ import javafx.util.Callback; import java.util.Comparator; +import java.util.Map; import java.util.stream.Collectors; -import static bisq.desktop.util.FormBuilder.addTitledGroupBg; - @FxmlView -public class ConsensusView extends ActivatableView implements DaoStateListener, DaoStateMonitoringService.Listener { +public abstract class StateMonitorView, + BLI extends StateBlockListItem, + CLI extends StateInConflictListItem> + extends ActivatableView implements DaoStateListener, DaoStateMonitoringService.Listener { private final DaoStateService daoStateService; - private final DaoFacade daoFacade; - private final DaoStateMonitoringService daoStateMonitoringService; + protected final DaoFacade daoFacade; - private TextField statusTextField; - private Button resyncButton; - private TableView tableView; - private TableView conflictTableView; + protected TextField statusTextField; + protected Button resyncButton; + private TableView tableView; + private TableView conflictTableView; - private final ObservableList listItems = FXCollections.observableArrayList(); - private final SortedList sortedList = new SortedList<>(listItems); - private final ObservableList daoStateInConflictListItems = FXCollections.observableArrayList(); - private final SortedList sortedConflictList = new SortedList<>(daoStateInConflictListItems); + protected final ObservableList listItems = FXCollections.observableArrayList(); + private final SortedList sortedList = new SortedList<>(listItems); + private final ObservableList conflictListItems = FXCollections.observableArrayList(); + private final SortedList sortedConflictList = new SortedList<>(conflictListItems); - private int gridRow = 0; + protected int gridRow = 0; private Subscription selectedItemSubscription; - private BooleanProperty isInConflict = new SimpleBooleanProperty(); + protected final BooleanProperty isInConflict = new SimpleBooleanProperty(); /////////////////////////////////////////////////////////////////////////////////////////// @@ -93,24 +96,14 @@ public class ConsensusView extends ActivatableView implements Da /////////////////////////////////////////////////////////////////////////////////////////// @Inject - private ConsensusView(DaoStateService daoStateService, - DaoFacade daoFacade, - DaoStateMonitoringService daoStateMonitoringService) { + public StateMonitorView(DaoStateService daoStateService, + DaoFacade daoFacade) { this.daoStateService = daoStateService; this.daoFacade = daoFacade; - this.daoStateMonitoringService = daoStateMonitoringService; } @Override public void initialize() { - super.initialize(); - - addTitledGroupBg(root, gridRow, 3, Res.get("dao.governance.consensus.headline")); - - statusTextField = FormBuilder.addTopLabelTextField(root, ++gridRow, - Res.get("dao.governance.consensus.state")).second; - resyncButton = FormBuilder.addButton(root, ++gridRow, Res.get("dao.governance.consensus.resync"), 10); - createTableView(); createDetailsView(); } @@ -123,18 +116,10 @@ protected void activate() { sortedConflictList.comparatorProperty().bind(conflictTableView.comparatorProperty()); daoStateService.addDaoStateListener(this); - daoStateMonitoringService.addListener(this); resyncButton.visibleProperty().bind(isInConflict); resyncButton.managedProperty().bind(isInConflict); - resyncButton.setOnAction(e -> daoFacade.resyncDao(() -> - new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup")) - .useShutDownButton() - .hideCloseButton() - .show()) - ); - if (daoStateService.isParseBlockChainComplete()) { onDataUpdate(); } @@ -148,7 +133,6 @@ protected void deactivate() { sortedConflictList.comparatorProperty().unbind(); daoStateService.removeDaoStateListener(this); - daoStateMonitoringService.removeListener(this); resyncButton.visibleProperty().unbind(); resyncButton.managedProperty().unbind(); @@ -157,6 +141,33 @@ protected void deactivate() { } + /////////////////////////////////////////////////////////////////////////////////////////// + // Abstract + /////////////////////////////////////////////////////////////////////////////////////////// + + protected abstract BLI getStateBlockListItem(StB e); + + protected abstract CLI getStateInConflictListItem(Map.Entry mapEntry); + + protected abstract void requestHashesFromGenesisBlockHeight(String peerAddress); + + protected abstract String getConflictsTableHeader(); + + protected abstract String getPeersTableHeader(); + + protected abstract String getPrevHashTableHeader(); + + protected abstract String getHashTableHeader(); + + protected abstract String getBlockHeightTableHeader(); + + protected abstract String getRequestHashes(); + + protected abstract String getTableHeadLine(); + + protected abstract String getConflictTableHeadLine(); + + /////////////////////////////////////////////////////////////////////////////////////////// // DaoStateListener /////////////////////////////////////////////////////////////////////////////////////////// @@ -184,7 +195,7 @@ public void onDaoStateBlockChainChanged() { /////////////////////////////////////////////////////////////////////////////////////////// private void createTableView() { - TableGroupHeadline headline = new TableGroupHeadline(Res.get("dao.governance.consensus.table.headline")); + TableGroupHeadline headline = new TableGroupHeadline(getTableHeadLine()); GridPane.setRowIndex(headline, ++gridRow); GridPane.setMargin(headline, new Insets(Layout.GROUP_DISTANCE, -10, -10, -10)); root.getChildren().add(headline); @@ -204,7 +215,7 @@ private void createTableView() { } private void createDetailsView() { - TableGroupHeadline conflictTableHeadline = new TableGroupHeadline(Res.get("dao.governance.consensus.conflictTable.headline")); + TableGroupHeadline conflictTableHeadline = new TableGroupHeadline(getConflictTableHeadLine()); GridPane.setRowIndex(conflictTableHeadline, ++gridRow); GridPane.setMargin(conflictTableHeadline, new Insets(Layout.GROUP_DISTANCE, -10, -10, -10)); root.getChildren().add(conflictTableHeadline); @@ -228,10 +239,10 @@ private void createDetailsView() { // Handler /////////////////////////////////////////////////////////////////////////////////////////// - private void onSelectItem(DaoStateBlockListItem item) { + private void onSelectItem(BLI item) { if (item != null) { - daoStateInConflictListItems.setAll(item.getDaoStateBlock().getInConflictMap().entrySet().stream() - .map(e -> new DaoStateInConflictListItem(e.getKey(), e.getValue())).collect(Collectors.toList())); + conflictListItems.setAll(item.getStateBlock().getInConflictMap().entrySet().stream() + .map(this::getStateInConflictListItem).collect(Collectors.toList())); GUIUtil.setFitToRowsForTableView(conflictTableView, 38, 28, 2, 4); conflictTableView.layout(); } @@ -242,19 +253,7 @@ private void onSelectItem(DaoStateBlockListItem item) { // Private /////////////////////////////////////////////////////////////////////////////////////////// - private void onDataUpdate() { - isInConflict.set(daoStateMonitoringService.isInConflict()); - if (isInConflict.get()) { - statusTextField.setText(Res.get("dao.governance.consensus.daoStateNotInSync")); - statusTextField.getStyleClass().add("dao-inConflict"); - } else { - statusTextField.setText(Res.get("dao.governance.consensus.daoStateInSync")); - statusTextField.getStyleClass().remove("dao-inConflict"); - } - - listItems.setAll(daoStateMonitoringService.getDaoStateBlockChain().stream() - .map(DaoStateBlockListItem::new) - .collect(Collectors.toList())); + protected void onDataUpdate() { GUIUtil.setFitToRowsForTableView(tableView, 25, 28, 2, 5); tableView.layout(); } @@ -265,21 +264,19 @@ private void onDataUpdate() { /////////////////////////////////////////////////////////////////////////////////////////// private void createColumns() { - TableColumn column; + TableColumn column; - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.blockHeight")); + column = new AutoTooltipTableColumn<>(getBlockHeightTableHeader()); column.setMinWidth(110); - column.setMaxWidth(column.getMinWidth()); - column.getStyleClass().add("first-column"); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateBlockListItem item, boolean empty) { + public void updateItem(final BLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getHeight()); @@ -289,23 +286,23 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getHeight())); + column.setComparator(Comparator.comparing(e -> e.getStateBlock().getHeight())); column.setSortType(TableColumn.SortType.DESCENDING); - tableView.getColumns().add(column); tableView.getSortOrder().add(column); + tableView.getColumns().add(column); - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.hash")); + column = new AutoTooltipTableColumn<>(getHashTableHeader()); column.setMinWidth(120); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateBlockListItem item, boolean empty) { + public void updateItem(final BLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getHash()); @@ -315,22 +312,22 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateBlockListItem::getHash)); + column.setComparator(Comparator.comparing(BLI::getHash)); tableView.getColumns().add(column); - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.prev")); + column = new AutoTooltipTableColumn<>(getPrevHashTableHeader()); column.setMinWidth(120); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call(TableColumn column) { + public TableCell call(TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateBlockListItem item, boolean empty) { + public void updateItem(final BLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getPrevHash()); @@ -340,22 +337,22 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateBlockListItem::getPrevHash)); + column.setComparator(Comparator.comparing(BLI::getPrevHash)); tableView.getColumns().add(column); - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.numPeer")); + column = new AutoTooltipTableColumn<>(getPeersTableHeader()); column.setMinWidth(80); column.setMaxWidth(column.getMinWidth()); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateBlockListItem item, boolean empty) { + public void updateItem(final BLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getNumNetworkMessages()); @@ -365,21 +362,21 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getPeersMap().size())); + column.setComparator(Comparator.comparing(e -> e.getStateBlock().getPeersMap().size())); tableView.getColumns().add(column); - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.numMisMatches")); + column = new AutoTooltipTableColumn<>(getConflictsTableHeader()); column.setMinWidth(80); column.setMaxWidth(column.getMinWidth()); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateBlockListItem item, boolean empty) { + public void updateItem(final BLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getNumMisMatches()); @@ -389,7 +386,7 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(e -> e.getDaoStateBlock().getInConflictMap().size())); + column.setComparator(Comparator.comparing(e -> e.getStateBlock().getInConflictMap().size())); tableView.getColumns().add(column); column = new AutoTooltipTableColumn<>(""); @@ -399,11 +396,11 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateBlockListItem item, boolean empty) { + public void updateItem(final BLI item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { Label icon; @@ -426,21 +423,22 @@ public void updateItem(final DaoStateBlockListItem item, boolean empty) { tableView.getColumns().add(column); } + private void createConflictColumns() { - TableColumn column; + TableColumn column; - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.blockHeight")); + column = new AutoTooltipTableColumn<>(getBlockHeightTableHeader()); column.setMinWidth(80); column.getStyleClass().add("first-column"); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + public void updateItem(final CLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getHeight()); @@ -450,23 +448,23 @@ public void updateItem(final DaoStateInConflictListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(e -> e.getDaoStateHash().getHeight())); + column.setComparator(Comparator.comparing(e -> e.getStateHash().getHeight())); column.setSortType(TableColumn.SortType.DESCENDING); conflictTableView.getColumns().add(column); conflictTableView.getSortOrder().add(column); - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.conflictTable.peer")); + column = new AutoTooltipTableColumn<>(getPeersTableHeader()); column.setMinWidth(80); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + public void updateItem(final CLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getPeerAddress()); @@ -476,21 +474,21 @@ public void updateItem(final DaoStateInConflictListItem item, boolean empty) { }; } }); - // column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getPeerAddress)); + column.setComparator(Comparator.comparing(CLI::getPeerAddress)); conflictTableView.getColumns().add(column); - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.hash")); + column = new AutoTooltipTableColumn<>(getHashTableHeader()); column.setMinWidth(150); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + public void updateItem(final CLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getHash()); @@ -500,21 +498,21 @@ public void updateItem(final DaoStateInConflictListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getHash)); + column.setComparator(Comparator.comparing(CLI::getHash)); conflictTableView.getColumns().add(column); - column = new AutoTooltipTableColumn<>(Res.get("dao.governance.consensus.table.prev")); + column = new AutoTooltipTableColumn<>(getPrevHashTableHeader()); column.setMinWidth(150); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { @Override - public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + public void updateItem(final CLI item, boolean empty) { super.updateItem(item, empty); if (item != null) setText(item.getPrevHash()); @@ -524,7 +522,7 @@ public void updateItem(final DaoStateInConflictListItem item, boolean empty) { }; } }); - column.setComparator(Comparator.comparing(DaoStateInConflictListItem::getPrevHash)); + column.setComparator(Comparator.comparing(CLI::getPrevHash)); conflictTableView.getColumns().add(column); @@ -534,20 +532,20 @@ public void updateItem(final DaoStateInConflictListItem item, boolean empty) { column.setCellFactory( new Callback<>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call( + TableColumn column) { return new TableCell<>() { Button button; @Override - public void updateItem(final DaoStateInConflictListItem item, boolean empty) { + public void updateItem(final CLI item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { if (button == null) { - button = new AutoTooltipButton(Res.get("dao.governance.consensus.conflictTable.request")); + button = new AutoTooltipButton(getRequestHashes()); setGraphic(button); } - button.setOnAction(e -> daoStateMonitoringService.requestHashesFromGenesisBlockHeight(item.getPeerAddress())); + button.setOnAction(e -> requestHashesFromGenesisBlockHeight(item.getPeerAddress())); } else { setGraphic(null); if (button != null) { diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.fxml b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.fxml new file mode 100644 index 00000000000..64a9a02ff9a --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.fxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java new file mode 100644 index 00000000000..40616bac67d --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java @@ -0,0 +1,51 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.blindvotes; + +import bisq.desktop.common.view.ActivatableView; +import bisq.desktop.common.view.FxmlView; + +import javax.inject.Inject; + +import javafx.scene.layout.GridPane; + +@FxmlView +public class BlindVoteStateMonitorView extends ActivatableView { + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor, lifecycle + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + private BlindVoteStateMonitorView() { + } + + @Override + public void initialize() { + super.initialize(); + } + + @Override + protected void activate() { + } + + @Override + protected void deactivate() { + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java new file mode 100644 index 00000000000..0b89a80e26d --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java @@ -0,0 +1,37 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.daostate; + +import bisq.desktop.main.dao.monitor.StateBlockListItem; + +import bisq.core.dao.monitoring.model.DaoStateBlock; +import bisq.core.dao.monitoring.model.DaoStateHash; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +@EqualsAndHashCode(callSuper = true) +public class DaoStateBlockListItem extends StateBlockListItem { + public DaoStateBlockListItem(DaoStateBlock daoStateBlock) { + super(daoStateBlock); + } +} + diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java new file mode 100644 index 00000000000..52c41f565fe --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java @@ -0,0 +1,35 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.daostate; + +import bisq.desktop.main.dao.monitor.StateInConflictListItem; + +import bisq.core.dao.monitoring.model.DaoStateHash; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +@EqualsAndHashCode(callSuper = true) +class DaoStateInConflictListItem extends StateInConflictListItem { + DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash) { + super(peerAddress, daoStateHash); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.fxml b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.fxml similarity index 92% rename from desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.fxml rename to desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.fxml index 67f8c870dca..c68fbf5c5bf 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/consensus/ConsensusView.fxml +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.fxml @@ -21,7 +21,7 @@ -. + */ + +package bisq.desktop.main.dao.monitor.daostate; + +import bisq.desktop.common.view.FxmlView; +import bisq.desktop.main.dao.monitor.StateMonitorView; +import bisq.desktop.main.overlays.popups.Popup; +import bisq.desktop.util.FormBuilder; + +import bisq.core.dao.DaoFacade; +import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.monitoring.model.DaoStateBlock; +import bisq.core.dao.monitoring.model.DaoStateHash; +import bisq.core.dao.state.DaoStateService; +import bisq.core.locale.Res; + +import javax.inject.Inject; + +import java.util.Map; +import java.util.stream.Collectors; + +@FxmlView +public class DaoStateMonitorView extends StateMonitorView { + private final DaoStateMonitoringService daoStateMonitoringService; + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor, lifecycle + /////////////////////////////////////////////////////////////////////////////////////////// + + + @Inject + private DaoStateMonitorView(DaoStateService daoStateService, + DaoFacade daoFacade, + DaoStateMonitoringService daoStateMonitoringService) { + super(daoStateService, daoFacade); + + this.daoStateMonitoringService = daoStateMonitoringService; + } + + @Override + public void initialize() { + FormBuilder.addTitledGroupBg(root, gridRow, 3, Res.get("dao.monitor.daoState.headline")); + + statusTextField = FormBuilder.addTopLabelTextField(root, ++gridRow, + Res.get("dao.monitor.daoState.state")).second; + resyncButton = FormBuilder.addButton(root, ++gridRow, Res.get("dao.monitor.daoState.resync"), 10); + + super.initialize(); + } + + @Override + protected void activate() { + super.activate(); + daoStateMonitoringService.addListener(this); + + resyncButton.setOnAction(e -> daoFacade.resyncDao(() -> + new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup")) + .useShutDownButton() + .hideCloseButton() + .show()) + ); + } + + @Override + protected void deactivate() { + super.deactivate(); + daoStateMonitoringService.removeListener(this); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Implementation abstract methods + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected DaoStateBlockListItem getStateBlockListItem(DaoStateBlock daoStateBlock) { + return new DaoStateBlockListItem(daoStateBlock); + } + + @Override + protected DaoStateInConflictListItem getStateInConflictListItem(Map.Entry mapEntry) { + return new DaoStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue()); + } + + @Override + protected String getTableHeadLine() { + return Res.get("dao.monitor.daoState.table.headline"); + } + + @Override + protected String getConflictTableHeadLine() { + return Res.get("dao.monitor.daoState.conflictTable.headline"); + } + + @Override + protected String getConflictsTableHeader() { + return Res.get("dao.monitor.daoState.table.numMisMatches"); + } + + @Override + protected String getPeersTableHeader() { + return Res.get("dao.monitor.daoState.table.numPeer"); + } + + @Override + protected String getPrevHashTableHeader() { + return Res.get("dao.monitor.daoState.table.prev"); + } + + @Override + protected String getHashTableHeader() { + return Res.get("dao.monitor.daoState.table.hash"); + } + + @Override + protected String getBlockHeightTableHeader() { + return Res.get("dao.monitor.daoState.table.blockHeight"); + } + + @Override + protected String getRequestHashes() { + return Res.get("dao.monitor.daoState.conflictTable.request"); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Override + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected void onDataUpdate() { + isInConflict.set(daoStateMonitoringService.isInConflict()); + + if (isInConflict.get()) { + statusTextField.setText(Res.get("dao.monitor.daoState.daoStateNotInSync")); + statusTextField.getStyleClass().add("dao-inConflict"); + } else { + statusTextField.setText(Res.get("dao.monitor.daoState.daoStateInSync")); + statusTextField.getStyleClass().remove("dao-inConflict"); + } + + listItems.setAll(daoStateMonitoringService.getDaoStateBlockChain().stream() + .map(this::getStateBlockListItem) + .collect(Collectors.toList())); + + super.onDataUpdate(); + } + + @Override + protected void requestHashesFromGenesisBlockHeight(String peerAddress) { + daoStateMonitoringService.requestHashesFromGenesisBlockHeight(peerAddress); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.fxml b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.fxml new file mode 100644 index 00000000000..37124f77f82 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.fxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java new file mode 100644 index 00000000000..35cb2619593 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java @@ -0,0 +1,45 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.proposals; + +import bisq.desktop.common.view.ActivatableView; +import bisq.desktop.common.view.FxmlView; + +import javax.inject.Inject; + +import javafx.scene.layout.GridPane; + +@FxmlView +public class ProposalStateMonitorView extends ActivatableView { + @Inject + private ProposalStateMonitorView() { + } + + @Override + public void initialize() { + super.initialize(); + } + + @Override + protected void activate() { + } + + @Override + protected void deactivate() { + } +} From 59bed76c0c7b9192c7403ef3018c93e1aa7e03c1 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 14 Mar 2019 21:11:38 -0500 Subject: [PATCH 18/31] Add proposal monitor view --- .../ProposalStateMonitoringService.java | 4 +- .../resources/i18n/displayStrings.properties | 22 ++- .../main/dao/monitor/StateBlockListItem.java | 20 +-- .../dao/monitor/StateInConflictListItem.java | 5 +- .../main/dao/monitor/StateMonitorView.java | 28 ++-- .../daostate/DaoStateBlockListItem.java | 6 +- .../daostate/DaoStateInConflictListItem.java | 4 +- .../monitor/daostate/DaoStateMonitorView.java | 40 +++-- .../proposals/ProposalStateBlockListItem.java | 36 +++++ .../ProposalStateInConflictListItem.java | 35 ++++ .../proposals/ProposalStateMonitorView.java | 151 +++++++++++++++++- 11 files changed, 295 insertions(+), 56 deletions(-) create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java diff --git a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java index 7f6837c4e14..242a8126537 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java @@ -75,9 +75,7 @@ */ @Slf4j public class ProposalStateMonitoringService implements DaoSetupService, DaoStateListener, ProposalStateNetworkService.Listener { - - - interface Listener { + public interface Listener { void onProposalStateBlockChainChanged(); } diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 760df3597ef..fad324345b1 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -1849,21 +1849,33 @@ dao.monitor.daoState=DAO state dao.monitor.proposals=Proposal state dao.monitor.blindVotes=Blind votes state +dao.monitor.table.peers=Peers +dao.monitor.table.conflicts=Conflicts +dao.monitor.state=Status +dao.monitor.requestAlHashes=Request all hashes +dao.monitor.resync=Resync DAO state +dao.monitor.table.cycleBlockHeight=Cycle {0} / Block {1} + dao.monitor.daoState.headline=DAO state -dao.monitor.daoState.state=Status dao.monitor.daoState.daoStateInSync=Your local DAO state is in sync with the network dao.monitor.daoState.daoStateNotInSync=Your local DAO state is not in sync with the network. Please resync your \ DAO state and if the conflict remains contact the Bisq developers. -dao.monitor.daoState.resync=Resync DAO state dao.monitor.daoState.table.headline=Chain of DAO state hashes dao.monitor.daoState.table.blockHeight=Block height dao.monitor.daoState.table.hash=Hash of DAO state dao.monitor.daoState.table.prev=Previous hash of DAO state -dao.monitor.daoState.table.numPeer=Peers -dao.monitor.daoState.table.numMisMatches=Conflicts dao.monitor.daoState.conflictTable.headline=DAO states from peers in conflict dao.monitor.daoState.conflictTable.peer=Peer's address -dao.monitor.daoState.conflictTable.request=Request all hashes + +dao.monitor.proposal.headline=Proposals state +dao.monitor.proposal.daoStateInSync=Your local Proposals state is in sync with the network +dao.monitor.proposal.daoStateNotInSync=Your local Proposals state is not in sync with the network. Please resync your \ + Proposals state and if the conflict remains contact the Bisq developers. +dao.monitor.proposal.table.headline=Chain of Proposal state hashes +dao.monitor.proposal.conflictTable.headline=Proposal states from peers in conflict +dao.monitor.proposal.table.cycleBlockHeight=Cycle / Block height +dao.monitor.proposal.table.hash=Hash of Proposal state +dao.monitor.proposal.table.prev=Previous hash of Proposal state #################################################################### diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateBlockListItem.java index 7969fd3323d..7062fa726e7 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateBlockListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateBlockListItem.java @@ -19,6 +19,7 @@ import bisq.core.dao.monitoring.model.StateBlock; import bisq.core.dao.monitoring.model.StateHash; +import bisq.core.locale.Res; import bisq.common.util.Utilities; @@ -30,18 +31,17 @@ @Getter @EqualsAndHashCode public abstract class StateBlockListItem> { - private final StateBlock stateBlock; - private final String height; - private final String hash; - private final String prevHash; - private final String numNetworkMessages; - private final String numMisMatches; - private final boolean isInSync; + protected final StateBlock stateBlock; + protected final String height; + protected final String hash; + protected final String prevHash; + protected final String numNetworkMessages; + protected final String numMisMatches; + protected final boolean isInSync; - protected StateBlockListItem(StB stateBlock) { + protected StateBlockListItem(StB stateBlock, int cycleIndex) { this.stateBlock = stateBlock; - - height = String.valueOf(stateBlock.getHeight()); + height = Res.get("dao.monitor.table.cycleBlockHeight", cycleIndex + 1, String.valueOf(stateBlock.getHeight())); hash = Utilities.bytesAsHexString(stateBlock.getHash()); prevHash = stateBlock.getPrevHash().length > 0 ? Utilities.bytesAsHexString(stateBlock.getPrevHash()) : "-"; numNetworkMessages = String.valueOf(stateBlock.getPeersMap().size()); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateInConflictListItem.java index 6bcf2eec4f5..0610f3c8cb9 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateInConflictListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateInConflictListItem.java @@ -18,6 +18,7 @@ package bisq.desktop.main.dao.monitor; import bisq.core.dao.monitoring.model.StateHash; +import bisq.core.locale.Res; import bisq.common.util.Utilities; @@ -35,10 +36,10 @@ public abstract class StateInConflictListItem { private final String prevHash; private final T stateHash; - protected StateInConflictListItem(String peerAddress, T stateHash) { + protected StateInConflictListItem(String peerAddress, T stateHash, int cycleIndex) { this.stateHash = stateHash; this.peerAddress = peerAddress; - height = String.valueOf(stateHash.getHeight()); + height = Res.get("dao.monitor.table.cycleBlockHeight", cycleIndex + 1, String.valueOf(stateHash.getHeight())); hash = Utilities.bytesAsHexString(stateHash.getHash()); prevHash = stateHash.getPrevHash().length > 0 ? Utilities.bytesAsHexString(stateHash.getPrevHash()) : "-"; diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java index ac422d9e1af..d1ef52f2f8c 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java @@ -28,7 +28,8 @@ import bisq.desktop.util.Layout; import bisq.core.dao.DaoFacade; -import bisq.core.dao.monitoring.DaoStateMonitoringService; +import bisq.core.dao.governance.period.CycleService; +import bisq.core.dao.governance.period.PeriodService; import bisq.core.dao.monitoring.model.StateBlock; import bisq.core.dao.monitoring.model.StateHash; import bisq.core.dao.state.DaoStateListener; @@ -72,9 +73,11 @@ public abstract class StateMonitorView, BLI extends StateBlockListItem, CLI extends StateInConflictListItem> - extends ActivatableView implements DaoStateListener, DaoStateMonitoringService.Listener { - private final DaoStateService daoStateService; + extends ActivatableView implements DaoStateListener { + protected final DaoStateService daoStateService; protected final DaoFacade daoFacade; + protected final CycleService cycleService; + protected final PeriodService periodService; protected TextField statusTextField; protected Button resyncButton; @@ -97,9 +100,13 @@ public abstract class StateMonitorView { - public DaoStateBlockListItem(DaoStateBlock daoStateBlock) { - super(daoStateBlock); +class DaoStateBlockListItem extends StateBlockListItem { + DaoStateBlockListItem(DaoStateBlock daoStateBlock, int cycleIndex) { + super(daoStateBlock, cycleIndex); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java index 52c41f565fe..028c4e37106 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java @@ -29,7 +29,7 @@ @Value @EqualsAndHashCode(callSuper = true) class DaoStateInConflictListItem extends StateInConflictListItem { - DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash) { - super(peerAddress, daoStateHash); + DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash, int cycleIndex) { + super(peerAddress, daoStateHash, cycleIndex); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java index 9b40ca32bbb..d7a7e58b5e7 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java @@ -23,6 +23,8 @@ import bisq.desktop.util.FormBuilder; import bisq.core.dao.DaoFacade; +import bisq.core.dao.governance.period.CycleService; +import bisq.core.dao.governance.period.PeriodService; import bisq.core.dao.monitoring.DaoStateMonitoringService; import bisq.core.dao.monitoring.model.DaoStateBlock; import bisq.core.dao.monitoring.model.DaoStateHash; @@ -35,7 +37,8 @@ import java.util.stream.Collectors; @FxmlView -public class DaoStateMonitorView extends StateMonitorView { +public class DaoStateMonitorView extends StateMonitorView + implements DaoStateMonitoringService.Listener { private final DaoStateMonitoringService daoStateMonitoringService; /////////////////////////////////////////////////////////////////////////////////////////// @@ -46,8 +49,10 @@ public class DaoStateMonitorView extends StateMonitorView mapEntry) { - return new DaoStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue()); + DaoStateHash daoStateHash = mapEntry.getValue(); + int cycleIndex = periodService.getCycle(daoStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0); + return new DaoStateInConflictListItem(mapEntry.getKey(), daoStateHash, cycleIndex); } @Override @@ -109,12 +129,12 @@ protected String getConflictTableHeadLine() { @Override protected String getConflictsTableHeader() { - return Res.get("dao.monitor.daoState.table.numMisMatches"); + return Res.get("dao.monitor.table.conflicts"); } @Override protected String getPeersTableHeader() { - return Res.get("dao.monitor.daoState.table.numPeer"); + return Res.get("dao.monitor.table.peers"); } @Override @@ -134,7 +154,7 @@ protected String getBlockHeightTableHeader() { @Override protected String getRequestHashes() { - return Res.get("dao.monitor.daoState.conflictTable.request"); + return Res.get("dao.monitor.requestAlHashes"); } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java new file mode 100644 index 00000000000..2c508c8bb90 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java @@ -0,0 +1,36 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.proposals; + +import bisq.desktop.main.dao.monitor.StateBlockListItem; + +import bisq.core.dao.monitoring.model.ProposalStateBlock; +import bisq.core.dao.monitoring.model.ProposalStateHash; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +@EqualsAndHashCode(callSuper = true) +class ProposalStateBlockListItem extends StateBlockListItem { + ProposalStateBlockListItem(ProposalStateBlock daoStateBlock, int cycleIndex) { + super(daoStateBlock, cycleIndex); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java new file mode 100644 index 00000000000..05645f27ea5 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java @@ -0,0 +1,35 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.proposals; + +import bisq.desktop.main.dao.monitor.StateInConflictListItem; + +import bisq.core.dao.monitoring.model.ProposalStateHash; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +@EqualsAndHashCode(callSuper = true) +class ProposalStateInConflictListItem extends StateInConflictListItem { + ProposalStateInConflictListItem(String peerAddress, ProposalStateHash daoStateHash, int cycleIndex) { + super(peerAddress, daoStateHash, cycleIndex); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java index 35cb2619593..ad16ec0c972 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java @@ -17,29 +17,172 @@ package bisq.desktop.main.dao.monitor.proposals; -import bisq.desktop.common.view.ActivatableView; import bisq.desktop.common.view.FxmlView; +import bisq.desktop.main.dao.monitor.StateMonitorView; +import bisq.desktop.main.overlays.popups.Popup; +import bisq.desktop.util.FormBuilder; + +import bisq.core.dao.DaoFacade; +import bisq.core.dao.governance.period.CycleService; +import bisq.core.dao.governance.period.PeriodService; +import bisq.core.dao.monitoring.ProposalStateMonitoringService; +import bisq.core.dao.monitoring.model.ProposalStateBlock; +import bisq.core.dao.monitoring.model.ProposalStateHash; +import bisq.core.dao.state.DaoStateService; +import bisq.core.locale.Res; import javax.inject.Inject; -import javafx.scene.layout.GridPane; +import java.util.Map; +import java.util.stream.Collectors; @FxmlView -public class ProposalStateMonitorView extends ActivatableView { +public class ProposalStateMonitorView extends StateMonitorView + implements ProposalStateMonitoringService.Listener { + private final ProposalStateMonitoringService proposalStateMonitoringService; + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor, lifecycle + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject - private ProposalStateMonitorView() { + private ProposalStateMonitorView(DaoStateService daoStateService, + DaoFacade daoFacade, + ProposalStateMonitoringService proposalStateMonitoringService, + CycleService cycleService, + PeriodService periodService) { + super(daoStateService, daoFacade, cycleService, periodService); + + this.proposalStateMonitoringService = proposalStateMonitoringService; } @Override public void initialize() { + FormBuilder.addTitledGroupBg(root, gridRow, 3, Res.get("dao.monitor.proposal.headline")); + + statusTextField = FormBuilder.addTopLabelTextField(root, ++gridRow, + Res.get("dao.monitor.state")).second; + resyncButton = FormBuilder.addButton(root, ++gridRow, Res.get("dao.monitor.resync"), 10); + super.initialize(); } @Override protected void activate() { + super.activate(); + proposalStateMonitoringService.addListener(this); + + resyncButton.setOnAction(e -> daoFacade.resyncDao(() -> + new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup")) + .useShutDownButton() + .hideCloseButton() + .show()) + ); } @Override protected void deactivate() { + super.deactivate(); + proposalStateMonitoringService.removeListener(this); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // ProposalStateMonitoringService.Listener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onProposalStateBlockChainChanged() { + if (daoStateService.isParseBlockChainComplete()) { + onDataUpdate(); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Implementation abstract methods + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected ProposalStateBlockListItem getStateBlockListItem(ProposalStateBlock daoStateBlock) { + int cycleIndex = periodService.getCycle(daoStateBlock.getHeight()).map(cycleService::getCycleIndex).orElse(0); + return new ProposalStateBlockListItem(daoStateBlock, cycleIndex); + } + + @Override + protected ProposalStateInConflictListItem getStateInConflictListItem(Map.Entry mapEntry) { + ProposalStateHash proposalStateHash = mapEntry.getValue(); + int cycleIndex = periodService.getCycle(proposalStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0); + return new ProposalStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue(), cycleIndex); + } + + @Override + protected String getTableHeadLine() { + return Res.get("dao.monitor.proposal.table.headline"); + } + + @Override + protected String getConflictTableHeadLine() { + return Res.get("dao.monitor.proposal.conflictTable.headline"); + } + + @Override + protected String getConflictsTableHeader() { + return Res.get("dao.monitor.table.conflicts"); + } + + @Override + protected String getPeersTableHeader() { + return Res.get("dao.monitor.table.peers"); + } + + @Override + protected String getPrevHashTableHeader() { + return Res.get("dao.monitor.proposal.table.prev"); + } + + @Override + protected String getHashTableHeader() { + return Res.get("dao.monitor.proposal.table.hash"); + } + + @Override + protected String getBlockHeightTableHeader() { + return Res.get("dao.monitor.proposal.table.cycleBlockHeight"); + } + + @Override + protected String getRequestHashes() { + return Res.get("dao.monitor.requestAlHashes"); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Override + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected void onDataUpdate() { + isInConflict.set(proposalStateMonitoringService.isInConflict()); + + if (isInConflict.get()) { + statusTextField.setText(Res.get("dao.monitor.proposal.daoStateNotInSync")); + statusTextField.getStyleClass().add("dao-inConflict"); + } else { + statusTextField.setText(Res.get("dao.monitor.proposal.daoStateInSync")); + statusTextField.getStyleClass().remove("dao-inConflict"); + } + + listItems.setAll(proposalStateMonitoringService.getProposalStateBlockChain().stream() + .map(this::getStateBlockListItem) + .collect(Collectors.toList())); + + super.onDataUpdate(); + } + + @Override + protected void requestHashesFromGenesisBlockHeight(String peerAddress) { + proposalStateMonitoringService.requestHashesFromGenesisBlockHeight(peerAddress); } } From 3411cde8b7c754e933860dd7eaa4378df0ed5dbd Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 14 Mar 2019 22:01:38 -0500 Subject: [PATCH 19/31] Reflect code review comments --- .../core/dao/monitoring/DaoStateMonitoringService.java | 7 +++++-- .../core/dao/monitoring/network/StateNetworkService.java | 6 +++++- .../src/main/java/bisq/core/dao/state/DaoStateService.java | 4 ++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java index 98a71b6f3e2..7d36ad6a4a0 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java @@ -233,8 +233,10 @@ private void updateHashChain(Block block) { } } else { // TODO check if in reorg cases it might be a valid case - checkArgument(height > daoStateBlockChain.getLast().getHeight(), - "We got a block the same blockHeight as our previous block in the daoStateBlockchain."); + checkArgument(height == daoStateBlockChain.getLast().getHeight() + 1, + "New block must be 1 block above previous block. height={}, " + + "daoStateBlockChain.getLast().getHeight()={}", + height, daoStateBlockChain.getLast().getHeight()); prevHash = daoStateBlockChain.getLast().getHash(); } byte[] stateHash = daoStateService.getSerializedDaoState(); @@ -256,6 +258,7 @@ private void updateHashChain(Block block) { // We delay broadcast to give peers enough time to have received the block. // Otherwise they would ignore our data if received block is in future to their local blockchain. + //TODO increase to 5-10 sec int delayInSec = 1 + new Random().nextInt(5); UserThread.runAfter(() -> daoStateNetworkService.broadcastMyStateHash(myDaoStateHash), delayInSec); } diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java index 11b06f6c3d7..82825564128 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java @@ -85,6 +85,7 @@ public interface Listener requestStateHashHandlerMap = new HashMap<>(); private final List> listeners = new CopyOnWriteArrayList<>(); + private boolean messageListenerAdded; /////////////////////////////////////////////////////////////////////////////////////////// @@ -147,7 +148,10 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { /////////////////////////////////////////////////////////////////////////////////////////// public void addListeners() { - networkNode.addMessageListener(this); + if (!messageListenerAdded) { + networkNode.addMessageListener(this); + messageListenerAdded = true; + } } public void sendGetStateHashesResponse(Connection connection, int nonce, List stateHashes) { diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index 65c1760e57f..0bc2164af61 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -175,9 +175,9 @@ public LinkedList getCycles() { return daoState.getCycles(); } - public void addCycle(Cycle firstCycle) { + public void addCycle(Cycle cycle) { assertDaoStateChange(); - getCycles().add(firstCycle); + getCycles().add(cycle); } @Nullable From 52e1455d922c5c9cc5ec5b2146c84e4dd988d8d9 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Thu, 14 Mar 2019 22:02:43 -0500 Subject: [PATCH 20/31] Refactor updateHashChain --- .../ProposalStateMonitoringService.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java index 242a8126537..712639c984c 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java @@ -139,18 +139,18 @@ public void start() { @Override public void onNewBlockHeight(int blockHeight) { int genesisBlockHeight = genesisTxInfo.getGenesisBlockHeight(); + if (proposalStateBlockChain.isEmpty() && blockHeight > genesisBlockHeight) { // Takes about 150 ms for dao testnet data long ts = System.currentTimeMillis(); for (int i = genesisBlockHeight; i < blockHeight; i++) { - updateHashChain(i); + maybeUpdateHashChain(i); } log.info("updateHashChain for {} items took {} ms", blockHeight - genesisBlockHeight, System.currentTimeMillis() - ts); } - - updateHashChain(blockHeight); + maybeUpdateHashChain(blockHeight); } @Override @@ -230,11 +230,10 @@ public void removeListener(Listener listener) { // Private /////////////////////////////////////////////////////////////////////////////////////////// - private void updateHashChain(int blockHeight) { + private void maybeUpdateHashChain(int blockHeight) { // We use first block in blind vote phase to create the hash of our proposals. We prefer to wait as long as // possible to increase the chance that we have received all proposals. - int blindVoteBlockHeight = periodService.getFirstBlockOfPhase(blockHeight, DaoPhase.Phase.BLIND_VOTE); - if (blockHeight != blindVoteBlockHeight) { + if (!isFirstBlockOfBlindVotePhase(blockHeight)) { return; } @@ -255,12 +254,11 @@ private void updateHashChain(int blockHeight) { } byte[] combined = ArrayUtils.addAll(prevHash, serializedProposals); byte[] hash = Hash.getSha256Ripemd160hash(combined); - int cycleStartBlockHeight = cycle.getHeightOfFirstBlock(); - ProposalStateHash myProposalStateHash = new ProposalStateHash(cycleStartBlockHeight, hash, prevHash); + ProposalStateHash myProposalStateHash = new ProposalStateHash(blockHeight, hash, prevHash); ProposalStateBlock proposalStateBlock = new ProposalStateBlock(myProposalStateHash); proposalStateBlockChain.add(proposalStateBlock); proposalStateHashChain.add(myProposalStateHash); - log.debug("Add proposalStateBlock at updateHashChain:\n{}", proposalStateBlock); + log.info("Add proposalStateBlock at updateHashChain:\n{}", proposalStateBlock); // We only broadcast after parsing of blockchain is complete if (parseBlockChainComplete) { @@ -269,6 +267,7 @@ private void updateHashChain(int blockHeight) { // We delay broadcast to give peers enough time to have received the block. // Otherwise they would ignore our data if received block is in future to their local blockchain. + //TODO increase to 5-10 sec int delayInSec = 1 + new Random().nextInt(5); UserThread.runAfter(() -> proposalStateNetworkService.broadcastMyStateHash(myProposalStateHash), delayInSec); } @@ -312,4 +311,8 @@ private boolean processPeersProposalStateHash(ProposalStateHash proposalStateHas return changed.get(); } + + private boolean isFirstBlockOfBlindVotePhase(int blockHeight) { + return blockHeight == periodService.getFirstBlockOfPhase(blockHeight, DaoPhase.Phase.BLIND_VOTE); + } } From 2109c66e51dfdd327d8f46e701fe6cdce7ee5ea2 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 15 Mar 2019 10:18:31 -0500 Subject: [PATCH 21/31] Add num proposals - Cleanups - Improve logs --- common/src/main/proto/pb.proto | 1 + .../monitoring/DaoStateMonitoringService.java | 1 - .../ProposalStateMonitoringService.java | 18 +++-- .../dao/monitoring/model/DaoStateHash.java | 5 +- .../monitoring/model/ProposalStateBlock.java | 4 ++ .../monitoring/model/ProposalStateHash.java | 25 +++++-- .../core/dao/monitoring/model/StateBlock.java | 2 +- .../network/RequestStateHashesHandler.java | 7 +- .../network/StateNetworkService.java | 20 +++--- .../lite/network/RequestBlocksHandler.java | 2 +- .../resources/i18n/displayStrings.properties | 1 + .../main/dao/monitor/StateMonitorView.java | 12 ++-- .../daostate/DaoStateBlockListItem.java | 4 +- .../daostate/DaoStateInConflictListItem.java | 4 +- .../proposals/ProposalStateBlockListItem.java | 8 ++- .../ProposalStateInConflictListItem.java | 8 ++- .../proposals/ProposalStateMonitorView.java | 69 +++++++++++++++++++ 17 files changed, 147 insertions(+), 44 deletions(-) diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index a8b496c1aae..59d480a2358 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -1759,6 +1759,7 @@ message ProposalStateHash { int32 height = 1; bytes hash = 2; bytes prev_hash = 3; + int32 num_proposals = 4; } /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java index 7d36ad6a4a0..87bff5d5bc8 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java @@ -249,7 +249,6 @@ private void updateHashChain(Block block) { DaoStateBlock daoStateBlock = new DaoStateBlock(myDaoStateHash); daoStateBlockChain.add(daoStateBlock); daoStateHashChain.add(myDaoStateHash); - log.debug("Add daoStateBlock at updateHashChain:\n{}", daoStateBlock); // We only broadcast after parsing of blockchain is complete if (parseBlockChainComplete) { diff --git a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java index 712639c984c..094d2515378 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java @@ -30,6 +30,7 @@ import bisq.core.dao.state.DaoStateListener; import bisq.core.dao.state.DaoStateService; import bisq.core.dao.state.GenesisTxInfo; +import bisq.core.dao.state.model.governance.Cycle; import bisq.core.dao.state.model.governance.DaoPhase; import bisq.core.dao.state.model.governance.Proposal; @@ -55,6 +56,8 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import static com.google.common.base.Preconditions.checkNotNull; + /** * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for * so we can detect quickly if any consensus issue arise. The data does not contain any private user @@ -159,7 +162,13 @@ public void onParseBlockChainComplete() { proposalStateNetworkService.addListeners(); // We wait for processing messages until we have completed batch processing - int fromHeight = daoStateService.getChainHeight() - 10; + + // We request data from last 5 cycles. We ignore possible duration changes done by voting as that request + // period is arbitrary anyway... + Cycle currentCycle = periodService.getCurrentCycle(); + checkNotNull(currentCycle, "currentCycle must not be null"); + int fromHeight = Math.max(genesisTxInfo.getGenesisBlockHeight(), daoStateService.getChainHeight() - currentCycle.getDuration() * 5); + proposalStateNetworkService.requestHashesFromAllConnectedSeedNodes(fromHeight); } @@ -171,7 +180,6 @@ public void onParseBlockChainComplete() { @Override public void onNewStateHashMessage(NewProposalStateHashMessage newStateHashMessage, Connection connection) { if (newStateHashMessage.getStateHash().getHeight() <= daoStateService.getChainHeight()) { - log.debug("onNewStateHashMessage newStateHashMessage ={}", newStateHashMessage); processPeersProposalStateHash(newStateHashMessage.getStateHash(), connection.getPeersNodeAddressOptional(), true); } } @@ -183,14 +191,12 @@ public void onGetStateHashRequest(Connection connection, GetProposalStateHashesR .filter(e -> e.getHeight() >= fromHeight) .map(ProposalStateBlock::getMyStateHash) .collect(Collectors.toList()); - log.debug("sendGetStateHashesResponse proposalStateHashes ={}", proposalStateHashes); proposalStateNetworkService.sendGetStateHashesResponse(connection, getStateHashRequest.getNonce(), proposalStateHashes); } @Override public void onPeersStateHashes(List stateHashes, Optional peersNodeAddress) { AtomicBoolean hasChanged = new AtomicBoolean(false); - log.debug("onPeersStateHashes stateHashes ={}", stateHashes); stateHashes.forEach(daoStateHash -> { boolean changed = processPeersProposalStateHash(daoStateHash, peersNodeAddress, false); if (changed) { @@ -239,7 +245,6 @@ private void maybeUpdateHashChain(int blockHeight) { periodService.getCycle(blockHeight).ifPresent(cycle -> { List proposals = proposalService.getValidatedProposals().stream() - .filter(proposalValidator::isValidAndConfirmed) .filter(e -> periodService.isTxInPhaseAndCycle(e.getTxId(), DaoPhase.Phase.PROPOSAL, blockHeight)) .sorted(Comparator.comparing(Proposal::getTxId)).collect(Collectors.toList()); @@ -254,11 +259,10 @@ private void maybeUpdateHashChain(int blockHeight) { } byte[] combined = ArrayUtils.addAll(prevHash, serializedProposals); byte[] hash = Hash.getSha256Ripemd160hash(combined); - ProposalStateHash myProposalStateHash = new ProposalStateHash(blockHeight, hash, prevHash); + ProposalStateHash myProposalStateHash = new ProposalStateHash(blockHeight, hash, prevHash, proposals.size()); ProposalStateBlock proposalStateBlock = new ProposalStateBlock(myProposalStateHash); proposalStateBlockChain.add(proposalStateBlock); proposalStateHashChain.add(myProposalStateHash); - log.info("Add proposalStateBlock at updateHashChain:\n{}", proposalStateBlock); // We only broadcast after parsing of blockchain is complete if (parseBlockChainComplete) { diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java b/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java index d2afbf3d83f..db5e0c1bc69 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java +++ b/core/src/main/java/bisq/core/dao/monitoring/model/DaoStateHash.java @@ -36,11 +36,10 @@ public DaoStateHash(int height, byte[] hash, byte[] prevHash) { @Override public PB.DaoStateHash toProtoMessage() { - final PB.DaoStateHash.Builder builder = PB.DaoStateHash.newBuilder() + return PB.DaoStateHash.newBuilder() .setHeight(height) .setHash(ByteString.copyFrom(hash)) - .setPrevHash(ByteString.copyFrom(prevHash)); - return builder.build(); + .setPrevHash(ByteString.copyFrom(prevHash)).build(); } public static DaoStateHash fromProto(PB.DaoStateHash proto) { diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java index 1cb7f5e9e91..ddfc83dbb67 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java +++ b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateBlock.java @@ -26,4 +26,8 @@ public class ProposalStateBlock extends StateBlock { public ProposalStateBlock(ProposalStateHash myProposalStateHash) { super(myProposalStateHash); } + + public int getNumProposals() { + return myStateHash.getNumProposals(); + } } diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java index 853eecb15ce..147170096d9 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java +++ b/core/src/main/java/bisq/core/dao/monitoring/model/ProposalStateHash.java @@ -23,12 +23,17 @@ import com.google.protobuf.ByteString; import lombok.EqualsAndHashCode; +import lombok.Getter; @EqualsAndHashCode(callSuper = true) + public final class ProposalStateHash extends StateHash { + @Getter + private final int numProposals; - public ProposalStateHash(int cycleStartBlockHeight, byte[] hash, byte[] prevHash) { + public ProposalStateHash(int cycleStartBlockHeight, byte[] hash, byte[] prevHash, int numProposals) { super(cycleStartBlockHeight, hash, prevHash); + this.numProposals = numProposals; } /////////////////////////////////////////////////////////////////////////////////////////// @@ -37,17 +42,25 @@ public ProposalStateHash(int cycleStartBlockHeight, byte[] hash, byte[] prevHash @Override public PB.ProposalStateHash toProtoMessage() { - final PB.ProposalStateHash.Builder builder = PB.ProposalStateHash.newBuilder() + return PB.ProposalStateHash.newBuilder() .setHeight(height) .setHash(ByteString.copyFrom(hash)) - .setPrevHash(ByteString.copyFrom(prevHash)); - return builder.build(); + .setPrevHash(ByteString.copyFrom(prevHash)) + .setNumProposals(numProposals).build(); } - public static ProposalStateHash fromProto(PB.ProposalStateHash proto) { return new ProposalStateHash(proto.getHeight(), proto.getHash().toByteArray(), - proto.getPrevHash().toByteArray()); + proto.getPrevHash().toByteArray(), + proto.getNumProposals()); + } + + + @Override + public String toString() { + return "ProposalStateHash{" + + "\n numProposals=" + numProposals + + "\n} " + super.toString(); } } diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/StateBlock.java b/core/src/main/java/bisq/core/dao/monitoring/model/StateBlock.java index 6b050947324..b41ddc2296f 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/model/StateBlock.java +++ b/core/src/main/java/bisq/core/dao/monitoring/model/StateBlock.java @@ -30,7 +30,7 @@ @Getter @EqualsAndHashCode public abstract class StateBlock { - private final T myStateHash; + protected final T myStateHash; private final Map peersMap = new HashMap<>(); private final Map inConflictMap = new HashMap<>(); diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java index f7eea4c9456..5fdcec81be9 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java @@ -128,7 +128,7 @@ public void requestStateHashes(int fromHeight) { @Override public void onSuccess(Connection connection) { if (!stopped) { - log.info("Sending of GetProposalStateHashesRequest message to peer {} succeeded.", nodeAddress.getHostName()); + log.info("Sending of {} message to peer {} succeeded.", getStateHashesRequest.getClass().getSimpleName(), nodeAddress.getHostName()); } else { log.trace("We have stopped already. We ignore that networkNode.sendMessage.onSuccess call." + "Might be caused by an previous timeout."); @@ -173,8 +173,9 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { if (getStateHashesResponse.getRequestNonce() == nonce) { stopTimeoutTimer(); cleanup(); - log.info("We received from peer {} a GetStateHashesResponse with {} stateHashes", - nodeAddress.getFullAddress(), getStateHashesResponse.getStateHashes().size()); + log.info("We received from peer {} a {} with {} stateHashes", + nodeAddress.getFullAddress(), getStateHashesResponse.getClass().getSimpleName(), + getStateHashesResponse.getStateHashes().size()); listener.onComplete(getStateHashesResponse, connection.getPeersNodeAddressOptional()); } else { log.warn("Nonce not matching. That can happen rarely if we get a response after a canceled " + diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java index 82825564128..450ea6fac93 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java @@ -132,12 +132,17 @@ public StateNetworkService(NetworkNode networkNode, public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { if (isNewStateHashMessage(networkEnvelope)) { Msg newStateHashMessage = castToNewStateHashMessage(networkEnvelope); - log.info("We received a newStateHashMessage from peer {}. NewStateHashMessage={} ", - connection.getPeersNodeAddressOptional(), newStateHashMessage); - + log.info("We received a {} from peer {} with stateHash={} ", + newStateHashMessage.getClass().getSimpleName(), + connection.getPeersNodeAddressOptional(), + newStateHashMessage.getStateHash()); listeners.forEach(e -> e.onNewStateHashMessage(newStateHashMessage, connection)); } else if (isGetStateHashesRequest(networkEnvelope)) { Req getStateHashRequest = castToGetStateHashRequest(networkEnvelope); + log.info("We received a {} from peer {} for height={} ", + getStateHashRequest.getClass().getSimpleName(), + connection.getPeersNodeAddressOptional(), + getStateHashRequest.getHeight()); listeners.forEach(e -> e.onGetStateHashRequest(connection, getStateHashRequest)); } } @@ -156,6 +161,8 @@ public void addListeners() { public void sendGetStateHashesResponse(Connection connection, int nonce, List stateHashes) { Res getStateHashesResponse = getGetStateHashesResponse(nonce, stateHashes); + log.info("Send {} with {} stateHashes to peer {}", getStateHashesResponse.getClass().getSimpleName(), + stateHashes.size(), connection.getPeersNodeAddressOptional()); connection.sendMessage(getStateHashesResponse); } @@ -201,12 +208,9 @@ private void requestHashesFromSeedNode(int fromHeight, NodeAddress nodeAddress) RequestStateHashesHandler.Listener listener = new RequestStateHashesHandler.Listener<>() { @Override public void onComplete(Res getStateHashesResponse, Optional peersNodeAddress) { - log.debug("requestHashesFromSeedNode of outbound connection complete. nodeAddress={}", nodeAddress); requestStateHashHandlerMap.remove(nodeAddress); - listeners.forEach(e -> { - List stateHashes = getStateHashesResponse.getStateHashes(); - e.onPeersStateHashes(stateHashes, peersNodeAddress); - }); + List stateHashes = getStateHashesResponse.getStateHashes(); + listeners.forEach(e -> e.onPeersStateHashes(stateHashes, peersNodeAddress)); } @Override diff --git a/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java b/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java index 638f34e78ec..18832ad7e00 100644 --- a/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java +++ b/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java @@ -125,7 +125,7 @@ public void requestBlocks() { TIMEOUT); } - log.info("We send to peer {} a {}.", nodeAddress, getBlocksRequest); + log.info("We request blocks from peer {} from block height {}.", nodeAddress, getBlocksRequest.getFromBlockHeight()); networkNode.addMessageListener(this); SettableFuture future = networkNode.sendMessage(nodeAddress, getBlocksRequest); Futures.addCallback(future, new FutureCallback() { diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index fad324345b1..7d9af82cdb6 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -1855,6 +1855,7 @@ dao.monitor.state=Status dao.monitor.requestAlHashes=Request all hashes dao.monitor.resync=Resync DAO state dao.monitor.table.cycleBlockHeight=Cycle {0} / Block {1} +dao.monitor.table.numProposals=No. proposals dao.monitor.daoState.headline=DAO state dao.monitor.daoState.daoStateInSync=Your local DAO state is in sync with the network diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java index d1ef52f2f8c..98fd6e23b07 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java @@ -81,8 +81,8 @@ public abstract class StateMonitorView tableView; - private TableView conflictTableView; + protected TableView tableView; + protected TableView conflictTableView; protected final ObservableList listItems = FXCollections.observableArrayList(); private final SortedList sortedList = new SortedList<>(listItems); @@ -257,11 +257,11 @@ protected void onDataUpdate() { // TableColumns /////////////////////////////////////////////////////////////////////////////////////////// - private void createColumns() { + protected void createColumns() { TableColumn column; column = new AutoTooltipTableColumn<>(getBlockHeightTableHeader()); - column.setMinWidth(110); + column.setMinWidth(120); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { @@ -418,11 +418,11 @@ public void updateItem(final BLI item, boolean empty) { } - private void createConflictColumns() { + protected void createConflictColumns() { TableColumn column; column = new AutoTooltipTableColumn<>(getBlockHeightTableHeader()); - column.setMinWidth(80); + column.setMinWidth(120); column.getStyleClass().add("first-column"); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java index b8609b55634..d4ec7fdd369 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateBlockListItem.java @@ -30,8 +30,8 @@ @Value @EqualsAndHashCode(callSuper = true) class DaoStateBlockListItem extends StateBlockListItem { - DaoStateBlockListItem(DaoStateBlock daoStateBlock, int cycleIndex) { - super(daoStateBlock, cycleIndex); + DaoStateBlockListItem(DaoStateBlock stateBlock, int cycleIndex) { + super(stateBlock, cycleIndex); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java index 028c4e37106..1496d97d6b5 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateInConflictListItem.java @@ -29,7 +29,7 @@ @Value @EqualsAndHashCode(callSuper = true) class DaoStateInConflictListItem extends StateInConflictListItem { - DaoStateInConflictListItem(String peerAddress, DaoStateHash daoStateHash, int cycleIndex) { - super(peerAddress, daoStateHash, cycleIndex); + DaoStateInConflictListItem(String peerAddress, DaoStateHash stateHash, int cycleIndex) { + super(peerAddress, stateHash, cycleIndex); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java index 2c508c8bb90..abb47480da9 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateBlockListItem.java @@ -30,7 +30,11 @@ @Value @EqualsAndHashCode(callSuper = true) class ProposalStateBlockListItem extends StateBlockListItem { - ProposalStateBlockListItem(ProposalStateBlock daoStateBlock, int cycleIndex) { - super(daoStateBlock, cycleIndex); + private final String numProposals; + + ProposalStateBlockListItem(ProposalStateBlock stateBlock, int cycleIndex) { + super(stateBlock, cycleIndex); + + numProposals = String.valueOf(stateBlock.getNumProposals()); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java index 05645f27ea5..af006fa6aab 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateInConflictListItem.java @@ -29,7 +29,11 @@ @Value @EqualsAndHashCode(callSuper = true) class ProposalStateInConflictListItem extends StateInConflictListItem { - ProposalStateInConflictListItem(String peerAddress, ProposalStateHash daoStateHash, int cycleIndex) { - super(peerAddress, daoStateHash, cycleIndex); + private final String numProposals; + + ProposalStateInConflictListItem(String peerAddress, ProposalStateHash stateHash, int cycleIndex) { + super(peerAddress, stateHash, cycleIndex); + + numProposals = String.valueOf(stateHash.getNumProposals()); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java index ad16ec0c972..9647a56cf2d 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java @@ -18,6 +18,7 @@ package bisq.desktop.main.dao.monitor.proposals; import bisq.desktop.common.view.FxmlView; +import bisq.desktop.components.AutoTooltipTableColumn; import bisq.desktop.main.dao.monitor.StateMonitorView; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.util.FormBuilder; @@ -33,6 +34,14 @@ import javax.inject.Inject; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; + +import javafx.beans.property.ReadOnlyObjectWrapper; + +import javafx.util.Callback; + +import java.util.Comparator; import java.util.Map; import java.util.stream.Collectors; @@ -185,4 +194,64 @@ protected void onDataUpdate() { protected void requestHashesFromGenesisBlockHeight(String peerAddress) { proposalStateMonitoringService.requestHashesFromGenesisBlockHeight(peerAddress); } + + @Override + protected void createColumns() { + super.createColumns(); + + TableColumn column; + + column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.table.numProposals")); + column.setMinWidth(110); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(ProposalStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getNumProposals()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(e -> e.getStateBlock().getMyStateHash().getNumProposals())); + tableView.getColumns().add(1, column); + } + + + protected void createConflictColumns() { + super.createConflictColumns(); + + TableColumn column; + + column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.table.numProposals")); + column.setMinWidth(110); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(ProposalStateInConflictListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getNumProposals()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(e -> e.getStateHash().getNumProposals())); + conflictTableView.getColumns().add(1, column); + } } From 4af74950cb959af30db50cefbecdbbc4dff37fc5 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 15 Mar 2019 19:38:30 -0500 Subject: [PATCH 22/31] Add blind vote monitoring --- common/src/main/proto/pb.proto | 24 ++ .../main/java/bisq/core/dao/DaoModule.java | 4 + .../src/main/java/bisq/core/dao/DaoSetup.java | 3 + .../blindvote/BlindVoteListService.java | 7 + .../governance/blindvote/MyBlindVoteList.java | 2 +- .../blindvote/MyBlindVoteListService.java | 1 + .../proposal/MyProposalListService.java | 4 +- .../BlindVoteStateMonitoringService.java | 304 ++++++++++++++++++ .../ProposalStateMonitoringService.java | 6 +- .../monitoring/model/BlindVoteStateBlock.java | 33 ++ .../monitoring/model/BlindVoteStateHash.java | 65 ++++ .../network/BlindVoteStateNetworkService.java | 85 +++++ .../RequestBlindVoteStateHashesHandler.java | 54 ++++ .../network/RequestStateHashesHandler.java | 4 +- .../GetBlindVoteStateHashesRequest.java | 56 ++++ .../GetBlindVoteStateHashesResponse.java | 72 +++++ .../NewBlindVoteStateHashMessage.java | 64 ++++ .../lite/network/RequestBlocksHandler.java | 2 +- .../network/CoreNetworkProtoResolver.java | 10 + .../resources/i18n/displayStrings.properties | 37 ++- .../main/dao/monitor/StateMonitorView.java | 1 + .../BlindVoteStateBlockListItem.java | 40 +++ .../BlindVoteStateInConflictListItem.java | 39 +++ .../blindvotes/BlindVoteStateMonitorView.java | 216 ++++++++++++- .../proposals/ProposalStateMonitorView.java | 6 +- 25 files changed, 1108 insertions(+), 31 deletions(-) create mode 100644 core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateBlock.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateHash.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/BlindVoteStateNetworkService.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/RequestBlindVoteStateHashesHandler.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesRequest.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesResponse.java create mode 100644 core/src/main/java/bisq/core/dao/monitoring/network/messages/NewBlindVoteStateHashMessage.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateBlockListItem.java create mode 100644 desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateInConflictListItem.java diff --git a/common/src/main/proto/pb.proto b/common/src/main/proto/pb.proto index 59d480a2358..e7d5a95ca8e 100644 --- a/common/src/main/proto/pb.proto +++ b/common/src/main/proto/pb.proto @@ -63,6 +63,9 @@ message NetworkEnvelope { NewProposalStateHashMessage new_proposal_state_hash_message = 37; GetProposalStateHashesRequest get_proposal_state_hashes_request = 38; GetProposalStateHashesResponse get_proposal_state_hashes_response = 39; + NewBlindVoteStateHashMessage new_blind_vote_state_hash_message = 40; + GetBlindVoteStateHashesRequest get_blind_vote_state_hashes_request = 41; + GetBlindVoteStateHashesResponse get_blind_vote_state_hashes_response = 42; } } @@ -338,6 +341,10 @@ message NewProposalStateHashMessage { ProposalStateHash state_hash = 1; } +message NewBlindVoteStateHashMessage { + BlindVoteStateHash state_hash = 1; +} + message GetDaoStateHashesRequest { int32 height = 1; int32 nonce = 2; @@ -348,6 +355,11 @@ message GetProposalStateHashesRequest { int32 nonce = 2; } +message GetBlindVoteStateHashesRequest { + int32 height = 1; + int32 nonce = 2; +} + message GetDaoStateHashesResponse { repeated DaoStateHash state_hashes = 1; int32 request_nonce = 2; @@ -358,6 +370,11 @@ message GetProposalStateHashesResponse { int32 request_nonce = 2; } +message GetBlindVoteStateHashesResponse { + repeated BlindVoteStateHash state_hashes = 1; + int32 request_nonce = 2; +} + /////////////////////////////////////////////////////////////////////////////////////////// // Payload /////////////////////////////////////////////////////////////////////////////////////////// @@ -1762,6 +1779,13 @@ message ProposalStateHash { int32 num_proposals = 4; } +message BlindVoteStateHash { + int32 height = 1; + bytes hash = 2; + bytes prev_hash = 3; + int32 num_blind_votes = 4; +} + /////////////////////////////////////////////////////////////////////////////////////////// // Misc /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/dao/DaoModule.java b/core/src/main/java/bisq/core/dao/DaoModule.java index a26f4eece85..1641b754968 100644 --- a/core/src/main/java/bisq/core/dao/DaoModule.java +++ b/core/src/main/java/bisq/core/dao/DaoModule.java @@ -64,8 +64,10 @@ import bisq.core.dao.governance.voteresult.VoteResultService; import bisq.core.dao.governance.voteresult.issuance.IssuanceService; import bisq.core.dao.governance.votereveal.VoteRevealService; +import bisq.core.dao.monitoring.BlindVoteStateMonitoringService; import bisq.core.dao.monitoring.DaoStateMonitoringService; import bisq.core.dao.monitoring.ProposalStateMonitoringService; +import bisq.core.dao.monitoring.network.BlindVoteStateNetworkService; import bisq.core.dao.monitoring.network.DaoStateNetworkService; import bisq.core.dao.monitoring.network.ProposalStateNetworkService; import bisq.core.dao.node.BsqNodeProvider; @@ -125,6 +127,8 @@ protected void configure() { bind(DaoStateNetworkService.class).in(Singleton.class); bind(ProposalStateMonitoringService.class).in(Singleton.class); bind(ProposalStateNetworkService.class).in(Singleton.class); + bind(BlindVoteStateMonitoringService.class).in(Singleton.class); + bind(BlindVoteStateNetworkService.class).in(Singleton.class); bind(UnconfirmedBsqChangeOutputListService.class).in(Singleton.class); bind(ExportJsonFilesService.class).in(Singleton.class); diff --git a/core/src/main/java/bisq/core/dao/DaoSetup.java b/core/src/main/java/bisq/core/dao/DaoSetup.java index 7e8e586463b..550b64d867f 100644 --- a/core/src/main/java/bisq/core/dao/DaoSetup.java +++ b/core/src/main/java/bisq/core/dao/DaoSetup.java @@ -31,6 +31,7 @@ import bisq.core.dao.governance.voteresult.MissingDataRequestService; import bisq.core.dao.governance.voteresult.VoteResultService; import bisq.core.dao.governance.votereveal.VoteRevealService; +import bisq.core.dao.monitoring.BlindVoteStateMonitoringService; import bisq.core.dao.monitoring.DaoStateMonitoringService; import bisq.core.dao.monitoring.ProposalStateMonitoringService; import bisq.core.dao.node.BsqNode; @@ -74,6 +75,7 @@ public DaoSetup(BsqNodeProvider bsqNodeProvider, DaoKillSwitch daoKillSwitch, DaoStateMonitoringService daoStateMonitoringService, ProposalStateMonitoringService proposalStateMonitoringService, + BlindVoteStateMonitoringService blindVoteStateMonitoringService, DaoEventCoordinator daoEventCoordinator) { bsqNode = bsqNodeProvider.getBsqNode(); @@ -104,6 +106,7 @@ public DaoSetup(BsqNodeProvider bsqNodeProvider, daoSetupServices.add(daoKillSwitch); daoSetupServices.add(daoStateMonitoringService); daoSetupServices.add(proposalStateMonitoringService); + daoSetupServices.add(blindVoteStateMonitoringService); daoSetupServices.add(bsqNodeProvider.getBsqNode()); } diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java b/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java index 8face7cda61..eb920dcbc61 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java @@ -120,6 +120,13 @@ public List getBlindVotesInPhaseAndCycle() { .collect(Collectors.toList()); } + public List getConfirmedBlindVotes() { + return blindVotePayloads.stream() + .filter(blindVotePayload -> blindVoteValidator.areDataFieldsValidAndTxConfirmed(blindVotePayload.getBlindVote())) + .map(BlindVotePayload::getBlindVote) + .collect(Collectors.toList()); + } + /////////////////////////////////////////////////////////////////////////////////////////// // Private diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteList.java b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteList.java index cbd544e550e..a66f610ced3 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteList.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteList.java @@ -47,7 +47,7 @@ public class MyBlindVoteList extends PersistableList implements Conse // PROTO BUFFER /////////////////////////////////////////////////////////////////////////////////////////// - private MyBlindVoteList(List list) { + public MyBlindVoteList(List list) { super(list); } diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java index fe11def2a70..d7af25ebbe7 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java @@ -145,6 +145,7 @@ public MyBlindVoteListService(P2PService p2PService, @Override public void addListeners() { daoStateService.addDaoStateListener(this); + p2PService.getNumConnectedPeers().addListener(numConnectedPeersListener); } @Override diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java index 486235555ea..b7f36d52a5a 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java @@ -96,6 +96,7 @@ public MyProposalListService(P2PService p2PService, numConnectedPeersListener = (observable, oldValue, newValue) -> rePublishOnceWellConnected(); daoStateService.addDaoStateListener(this); + p2PService.getNumConnectedPeers().addListener(numConnectedPeersListener); } @@ -130,9 +131,6 @@ public void onParseBlockChainComplete() { // API /////////////////////////////////////////////////////////////////////////////////////////// - public void start() { - } - // Broadcast tx and publish proposal to P2P network public void publishTxAndPayload(Proposal proposal, Transaction transaction, ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { diff --git a/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java new file mode 100644 index 00000000000..d5ce1cb6beb --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java @@ -0,0 +1,304 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.core.dao.monitoring; + +import bisq.core.dao.DaoSetupService; +import bisq.core.dao.governance.blindvote.BlindVote; +import bisq.core.dao.governance.blindvote.BlindVoteListService; +import bisq.core.dao.governance.blindvote.MyBlindVoteList; +import bisq.core.dao.governance.period.PeriodService; +import bisq.core.dao.monitoring.model.BlindVoteStateBlock; +import bisq.core.dao.monitoring.model.BlindVoteStateHash; +import bisq.core.dao.monitoring.network.BlindVoteStateNetworkService; +import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.NewBlindVoteStateHashMessage; +import bisq.core.dao.state.DaoStateListener; +import bisq.core.dao.state.DaoStateService; +import bisq.core.dao.state.GenesisTxInfo; +import bisq.core.dao.state.model.blockchain.Block; +import bisq.core.dao.state.model.governance.Cycle; +import bisq.core.dao.state.model.governance.DaoPhase; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.Connection; + +import bisq.common.UserThread; +import bisq.common.crypto.Hash; + +import javax.inject.Inject; + +import org.apache.commons.lang3.ArrayUtils; + +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import static com.google.common.base.Preconditions.checkNotNull; + +@Slf4j +public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStateListener, BlindVoteStateNetworkService.Listener { + public interface Listener { + void onBlindVoteStateBlockChainChanged(); + } + + private final DaoStateService daoStateService; + private final BlindVoteStateNetworkService blindVoteStateNetworkService; + private final GenesisTxInfo genesisTxInfo; + private final PeriodService periodService; + private final BlindVoteListService blindVoteListService; + + @Getter + private final LinkedList blindVoteStateBlockChain = new LinkedList<>(); + @Getter + private final LinkedList blindVoteStateHashChain = new LinkedList<>(); + private final List listeners = new CopyOnWriteArrayList<>(); + @Getter + private boolean isInConflict; + private boolean parseBlockChainComplete; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + public BlindVoteStateMonitoringService(DaoStateService daoStateService, + BlindVoteStateNetworkService blindVoteStateNetworkService, + GenesisTxInfo genesisTxInfo, + PeriodService periodService, + BlindVoteListService blindVoteListService) { + this.daoStateService = daoStateService; + this.blindVoteStateNetworkService = blindVoteStateNetworkService; + this.genesisTxInfo = genesisTxInfo; + this.periodService = periodService; + this.blindVoteListService = blindVoteListService; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoSetupService + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void addListeners() { + daoStateService.addDaoStateListener(this); + blindVoteStateNetworkService.addListener(this); + } + + @Override + public void start() { + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // DaoStateListener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onDaoStateChanged(Block block) { + int blockHeight = block.getHeight(); + + int genesisBlockHeight = genesisTxInfo.getGenesisBlockHeight(); + + if (blindVoteStateBlockChain.isEmpty() && blockHeight > genesisBlockHeight) { + // Takes about 150 ms for dao testnet data + long ts = System.currentTimeMillis(); + for (int i = genesisBlockHeight; i < blockHeight; i++) { + maybeUpdateHashChain(i); + } + log.info("updateHashChain for {} items took {} ms", + blockHeight - genesisBlockHeight, + System.currentTimeMillis() - ts); + } + maybeUpdateHashChain(blockHeight); + } + + @Override + public void onParseBlockChainComplete() { + parseBlockChainComplete = true; + blindVoteStateNetworkService.addListeners(); + + // We wait for processing messages until we have completed batch processing + + // We request data from last 5 cycles. We ignore possible duration changes done by voting as that request + // period is arbitrary anyway... + Cycle currentCycle = periodService.getCurrentCycle(); + checkNotNull(currentCycle, "currentCycle must not be null"); + int fromHeight = Math.max(genesisTxInfo.getGenesisBlockHeight(), daoStateService.getChainHeight() - currentCycle.getDuration() * 5); + + blindVoteStateNetworkService.requestHashesFromAllConnectedSeedNodes(fromHeight); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // StateNetworkService.Listener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onNewStateHashMessage(NewBlindVoteStateHashMessage newStateHashMessage, Connection connection) { + if (newStateHashMessage.getStateHash().getHeight() <= daoStateService.getChainHeight()) { + processPeersBlindVoteStateHash(newStateHashMessage.getStateHash(), connection.getPeersNodeAddressOptional(), true); + } + } + + @Override + public void onGetStateHashRequest(Connection connection, GetBlindVoteStateHashesRequest getStateHashRequest) { + int fromHeight = getStateHashRequest.getHeight(); + List blindVoteStateHashes = blindVoteStateBlockChain.stream() + .filter(e -> e.getHeight() >= fromHeight) + .map(BlindVoteStateBlock::getMyStateHash) + .collect(Collectors.toList()); + blindVoteStateNetworkService.sendGetStateHashesResponse(connection, getStateHashRequest.getNonce(), blindVoteStateHashes); + } + + @Override + public void onPeersStateHashes(List stateHashes, Optional peersNodeAddress) { + AtomicBoolean hasChanged = new AtomicBoolean(false); + stateHashes.forEach(daoStateHash -> { + boolean changed = processPeersBlindVoteStateHash(daoStateHash, peersNodeAddress, false); + if (changed) { + hasChanged.set(true); + } + }); + + if (hasChanged.get()) { + listeners.forEach(Listener::onBlindVoteStateBlockChainChanged); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + public void requestHashesFromGenesisBlockHeight(String peersAddress) { + blindVoteStateNetworkService.requestHashes(genesisTxInfo.getGenesisBlockHeight(), peersAddress); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Listeners + /////////////////////////////////////////////////////////////////////////////////////////// + + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Private + /////////////////////////////////////////////////////////////////////////////////////////// + + private void maybeUpdateHashChain(int blockHeight) { + // We use first block in blind vote phase to create the hash of our blindVotes. We prefer to wait as long as + // possible to increase the chance that we have received all blindVotes. + if (!isFirstBlockOfBlindVotePhase(blockHeight)) { + return; + } + + periodService.getCycle(blockHeight).ifPresent(cycle -> { + List blindVotes = blindVoteListService.getConfirmedBlindVotes().stream() + .filter(e -> periodService.isTxInCorrectCycle(e.getTxId(), blockHeight)) + .sorted(Comparator.comparing(BlindVote::getTxId)).collect(Collectors.toList()); + + // We use MyBlindVoteList to get the serialized bytes from the blindVotes list + byte[] serializedBlindVotes = new MyBlindVoteList(blindVotes).toProtoMessage().toByteArray(); + + byte[] prevHash; + if (blindVoteStateBlockChain.isEmpty()) { + prevHash = new byte[0]; + } else { + prevHash = blindVoteStateBlockChain.getLast().getHash(); + } + byte[] combined = ArrayUtils.addAll(prevHash, serializedBlindVotes); + byte[] hash = Hash.getSha256Ripemd160hash(combined); + + + BlindVoteStateHash myBlindVoteStateHash = new BlindVoteStateHash(blockHeight, hash, prevHash, blindVotes.size()); + BlindVoteStateBlock blindVoteStateBlock = new BlindVoteStateBlock(myBlindVoteStateHash); + blindVoteStateBlockChain.add(blindVoteStateBlock); + blindVoteStateHashChain.add(myBlindVoteStateHash); + + // We only broadcast after parsing of blockchain is complete + if (parseBlockChainComplete) { + // We notify listeners only after batch processing to avoid performance issues at UI code + listeners.forEach(Listener::onBlindVoteStateBlockChainChanged); + + // We delay broadcast to give peers enough time to have received the block. + // Otherwise they would ignore our data if received block is in future to their local blockchain. + //TODO increase to 5-10 sec + int delayInSec = 1 + new Random().nextInt(5); + UserThread.runAfter(() -> blindVoteStateNetworkService.broadcastMyStateHash(myBlindVoteStateHash), delayInSec); + } + }); + } + + private boolean processPeersBlindVoteStateHash(BlindVoteStateHash blindVoteStateHash, Optional peersNodeAddress, boolean notifyListeners) { + AtomicBoolean changed = new AtomicBoolean(false); + AtomicBoolean isInConflict = new AtomicBoolean(this.isInConflict); + StringBuilder sb = new StringBuilder(); + blindVoteStateBlockChain.stream() + .filter(e -> e.getHeight() == blindVoteStateHash.getHeight()).findAny() + .ifPresent(daoStateBlock -> { + String peersNodeAddressAsString = peersNodeAddress.map(NodeAddress::getFullAddress) + .orElseGet(() -> "Unknown peer " + new Random().nextInt(10000)); + daoStateBlock.putInPeersMap(peersNodeAddressAsString, blindVoteStateHash); + if (!daoStateBlock.getMyStateHash().hasEqualHash(blindVoteStateHash)) { + daoStateBlock.putInConflictMap(peersNodeAddressAsString, blindVoteStateHash); + isInConflict.set(true); + sb.append("We received a block hash from peer ") + .append(peersNodeAddressAsString) + .append(" which conflicts with our block hash.\n") + .append("my blindVoteStateHash=") + .append(daoStateBlock.getMyStateHash()) + .append("\npeers blindVoteStateHash=") + .append(blindVoteStateHash); + } + changed.set(true); + }); + + this.isInConflict = isInConflict.get(); + + String conflictMsg = sb.toString(); + if (this.isInConflict && !conflictMsg.isEmpty()) { + log.warn(conflictMsg); + } + + if (notifyListeners && changed.get()) { + listeners.forEach(Listener::onBlindVoteStateBlockChainChanged); + } + + return changed.get(); + } + + private boolean isFirstBlockOfBlindVotePhase(int blockHeight) { + return blockHeight == periodService.getFirstBlockOfPhase(blockHeight, DaoPhase.Phase.VOTE_REVEAL); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java index 094d2515378..54808f9c7cc 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java @@ -30,6 +30,7 @@ import bisq.core.dao.state.DaoStateListener; import bisq.core.dao.state.DaoStateService; import bisq.core.dao.state.GenesisTxInfo; +import bisq.core.dao.state.model.blockchain.Block; import bisq.core.dao.state.model.governance.Cycle; import bisq.core.dao.state.model.governance.DaoPhase; import bisq.core.dao.state.model.governance.Proposal; @@ -138,9 +139,8 @@ public void start() { // DaoStateListener /////////////////////////////////////////////////////////////////////////////////////////// - // We don't care here about block parsing so we execute once a new block arrives (before parsing has started) - @Override - public void onNewBlockHeight(int blockHeight) { + public void onDaoStateChanged(Block block) { + int blockHeight = block.getHeight(); int genesisBlockHeight = genesisTxInfo.getGenesisBlockHeight(); if (proposalStateBlockChain.isEmpty() && blockHeight > genesisBlockHeight) { diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateBlock.java b/core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateBlock.java new file mode 100644 index 00000000000..bc527eeb6e1 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateBlock.java @@ -0,0 +1,33 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.model; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Getter +@EqualsAndHashCode(callSuper = true) +public class BlindVoteStateBlock extends StateBlock { + public BlindVoteStateBlock(BlindVoteStateHash myBlindVoteStateHash) { + super(myBlindVoteStateHash); + } + + public int getNumBlindVotes() { + return myStateHash.getNumBlindVotes(); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateHash.java b/core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateHash.java new file mode 100644 index 00000000000..4ac39908b14 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/model/BlindVoteStateHash.java @@ -0,0 +1,65 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.model; + + +import io.bisq.generated.protobuffer.PB; + +import com.google.protobuf.ByteString; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) + +public final class BlindVoteStateHash extends StateHash { + @Getter + private final int numBlindVotes; + + public BlindVoteStateHash(int cycleStartBlockHeight, byte[] hash, byte[] prevHash, int numBlindVotes) { + super(cycleStartBlockHeight, hash, prevHash); + this.numBlindVotes = numBlindVotes; + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public PB.BlindVoteStateHash toProtoMessage() { + return PB.BlindVoteStateHash.newBuilder() + .setHeight(height) + .setHash(ByteString.copyFrom(hash)) + .setPrevHash(ByteString.copyFrom(prevHash)) + .setNumBlindVotes(numBlindVotes).build(); + } + + public static BlindVoteStateHash fromProto(PB.BlindVoteStateHash proto) { + return new BlindVoteStateHash(proto.getHeight(), + proto.getHash().toByteArray(), + proto.getPrevHash().toByteArray(), + proto.getNumBlindVotes()); + } + + @Override + public String toString() { + return "BlindVoteStateHash{" + + "\n numBlindVotes=" + numBlindVotes + + "\n} " + super.toString(); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/BlindVoteStateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/BlindVoteStateNetworkService.java new file mode 100644 index 00000000000..81bd46f8ee1 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/BlindVoteStateNetworkService.java @@ -0,0 +1,85 @@ +/* + * This file is part of Bisq. + * + * bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network; + +import bisq.core.dao.monitoring.model.BlindVoteStateHash; +import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesResponse; +import bisq.core.dao.monitoring.network.messages.NewBlindVoteStateHashMessage; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.Broadcaster; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import javax.inject.Inject; + +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class BlindVoteStateNetworkService extends StateNetworkService { + @Inject + public BlindVoteStateNetworkService(NetworkNode networkNode, + PeerManager peerManager, + Broadcaster broadcaster) { + super(networkNode, peerManager, broadcaster); + } + + @Override + protected GetBlindVoteStateHashesRequest castToGetStateHashRequest(NetworkEnvelope networkEnvelope) { + return (GetBlindVoteStateHashesRequest) networkEnvelope; + } + + @Override + protected boolean isGetStateHashesRequest(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof GetBlindVoteStateHashesRequest; + } + + @Override + protected NewBlindVoteStateHashMessage castToNewStateHashMessage(NetworkEnvelope networkEnvelope) { + return (NewBlindVoteStateHashMessage) networkEnvelope; + } + + @Override + protected boolean isNewStateHashMessage(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof NewBlindVoteStateHashMessage; + } + + @Override + protected GetBlindVoteStateHashesResponse getGetStateHashesResponse(int nonce, List stateHashes) { + return new GetBlindVoteStateHashesResponse(stateHashes, nonce); + } + + @Override + protected NewBlindVoteStateHashMessage getNewStateHashMessage(BlindVoteStateHash myStateHash) { + return new NewBlindVoteStateHashMessage(myStateHash); + } + + @Override + protected RequestBlindVoteStateHashesHandler getRequestStateHashesHandler(NodeAddress nodeAddress, RequestStateHashesHandler.Listener listener) { + return new RequestBlindVoteStateHashesHandler(networkNode, peerManager, nodeAddress, listener); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/RequestBlindVoteStateHashesHandler.java b/core/src/main/java/bisq/core/dao/monitoring/network/RequestBlindVoteStateHashesHandler.java new file mode 100644 index 00000000000..5f33b05a487 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/RequestBlindVoteStateHashesHandler.java @@ -0,0 +1,54 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network; + +import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesResponse; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.network.NetworkNode; +import bisq.network.p2p.peers.PeerManager; + +import bisq.common.proto.network.NetworkEnvelope; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class RequestBlindVoteStateHashesHandler extends RequestStateHashesHandler { + RequestBlindVoteStateHashesHandler(NetworkNode networkNode, + PeerManager peerManager, + NodeAddress nodeAddress, + Listener listener) { + super(networkNode, peerManager, nodeAddress, listener); + } + + @Override + protected GetBlindVoteStateHashesRequest getGetStateHashesRequest(int fromHeight) { + return new GetBlindVoteStateHashesRequest(fromHeight, nonce); + } + + @Override + protected GetBlindVoteStateHashesResponse castToGetStateHashesResponse(NetworkEnvelope networkEnvelope) { + return (GetBlindVoteStateHashesResponse) networkEnvelope; + } + + @Override + protected boolean isGetStateHashesResponse(NetworkEnvelope networkEnvelope) { + return networkEnvelope instanceof GetBlindVoteStateHashesResponse; + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java index 5fdcec81be9..fe93abd1686 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java @@ -187,9 +187,9 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { } else { log.warn("We have stopped already."); } + } else { + log.warn("We got a message from ourselves. That should never happen."); } - } else { - log.warn("We got a message from another connection and ignore it. That should never happen."); } } diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesRequest.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesRequest.java new file mode 100644 index 00000000000..aeb6c417849 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesRequest.java @@ -0,0 +1,56 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class GetBlindVoteStateHashesRequest extends GetStateHashesRequest { + public GetBlindVoteStateHashesRequest(int fromCycleStartHeight, int nonce) { + super(fromCycleStartHeight, nonce, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private GetBlindVoteStateHashesRequest(int height, int nonce, int messageVersion) { + super(height, nonce, messageVersion); + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setGetBlindVoteStateHashesRequest(PB.GetBlindVoteStateHashesRequest.newBuilder() + .setHeight(height) + .setNonce(nonce)) + .build(); + } + + public static NetworkEnvelope fromProto(PB.GetBlindVoteStateHashesRequest proto, int messageVersion) { + return new GetBlindVoteStateHashesRequest(proto.getHeight(), proto.getNonce(), messageVersion); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesResponse.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesResponse.java new file mode 100644 index 00000000000..a3e849d2877 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/GetBlindVoteStateHashesResponse.java @@ -0,0 +1,72 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.core.dao.monitoring.model.BlindVoteStateHash; + +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class GetBlindVoteStateHashesResponse extends GetStateHashesResponse { + public GetBlindVoteStateHashesResponse(List stateHashes, int requestNonce) { + super(stateHashes, requestNonce, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private GetBlindVoteStateHashesResponse(List stateHashes, + int requestNonce, + int messageVersion) { + super(stateHashes, requestNonce, messageVersion); + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setGetBlindVoteStateHashesResponse(PB.GetBlindVoteStateHashesResponse.newBuilder() + .addAllStateHashes(stateHashes.stream() + .map(BlindVoteStateHash::toProtoMessage) + .collect(Collectors.toList())) + .setRequestNonce(requestNonce)) + .build(); + } + + public static NetworkEnvelope fromProto(PB.GetBlindVoteStateHashesResponse proto, int messageVersion) { + return new GetBlindVoteStateHashesResponse(proto.getStateHashesList().isEmpty() ? + new ArrayList<>() : + proto.getStateHashesList().stream() + .map(BlindVoteStateHash::fromProto) + .collect(Collectors.toList()), + proto.getRequestNonce(), + messageVersion); + } +} diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewBlindVoteStateHashMessage.java b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewBlindVoteStateHashMessage.java new file mode 100644 index 00000000000..8e4449b6c60 --- /dev/null +++ b/core/src/main/java/bisq/core/dao/monitoring/network/messages/NewBlindVoteStateHashMessage.java @@ -0,0 +1,64 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.dao.monitoring.network.messages; + +import bisq.core.dao.monitoring.model.BlindVoteStateHash; + +import bisq.common.app.Capabilities; +import bisq.common.app.Capability; +import bisq.common.app.Version; +import bisq.common.proto.network.NetworkEnvelope; + +import io.bisq.generated.protobuffer.PB; + +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@EqualsAndHashCode(callSuper = true) +@Getter +public final class NewBlindVoteStateHashMessage extends NewStateHashMessage { + public NewBlindVoteStateHashMessage(BlindVoteStateHash stateHash) { + super(stateHash, Version.getP2PMessageVersion()); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private NewBlindVoteStateHashMessage(BlindVoteStateHash stateHash, int messageVersion) { + super(stateHash, messageVersion); + } + + @Override + public PB.NetworkEnvelope toProtoNetworkEnvelope() { + return getNetworkEnvelopeBuilder() + .setNewBlindVoteStateHashMessage(PB.NewBlindVoteStateHashMessage.newBuilder() + .setStateHash(stateHash.toProtoMessage())) + .build(); + } + + public static NetworkEnvelope fromProto(PB.NewBlindVoteStateHashMessage proto, int messageVersion) { + return new NewBlindVoteStateHashMessage(BlindVoteStateHash.fromProto(proto.getStateHash()), messageVersion); + } + + @Override + public Capabilities getRequiredCapabilities() { + return new Capabilities(Capability.DAO_STATE); + } +} diff --git a/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java b/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java index 18832ad7e00..13dcdb467f8 100644 --- a/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java +++ b/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java @@ -190,7 +190,7 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { log.warn("We have stopped already. We ignore that onDataRequest call."); } } else { - log.warn("We got a message from another connection and ignore it. That should never happen."); + log.warn("We got a message from ourselves. That should never happen."); } } } diff --git a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java index 69921c2ef47..85a02942bc3 100644 --- a/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java +++ b/core/src/main/java/bisq/core/proto/network/CoreNetworkProtoResolver.java @@ -28,10 +28,13 @@ import bisq.core.arbitration.messages.PeerPublishedDisputePayoutTxMessage; import bisq.core.dao.governance.blindvote.network.messages.RepublishGovernanceDataRequest; import bisq.core.dao.governance.proposal.storage.temp.TempProposalPayload; +import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesRequest; +import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesResponse; import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesRequest; import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesResponse; import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesRequest; import bisq.core.dao.monitoring.network.messages.GetProposalStateHashesResponse; +import bisq.core.dao.monitoring.network.messages.NewBlindVoteStateHashMessage; import bisq.core.dao.monitoring.network.messages.NewDaoStateHashMessage; import bisq.core.dao.monitoring.network.messages.NewProposalStateHashMessage; import bisq.core.dao.node.messages.GetBlocksRequest; @@ -180,6 +183,13 @@ public NetworkEnvelope fromProto(PB.NetworkEnvelope proto) throws ProtobufferExc case GET_PROPOSAL_STATE_HASHES_RESPONSE: return GetProposalStateHashesResponse.fromProto(proto.getGetProposalStateHashesResponse(), messageVersion); + case NEW_BLIND_VOTE_STATE_HASH_MESSAGE: + return NewBlindVoteStateHashMessage.fromProto(proto.getNewBlindVoteStateHashMessage(), messageVersion); + case GET_BLIND_VOTE_STATE_HASHES_REQUEST: + return GetBlindVoteStateHashesRequest.fromProto(proto.getGetBlindVoteStateHashesRequest(), messageVersion); + case GET_BLIND_VOTE_STATE_HASHES_RESPONSE: + return GetBlindVoteStateHashesResponse.fromProto(proto.getGetBlindVoteStateHashesResponse(), messageVersion); + default: throw new ProtobufferException("Unknown proto message case (PB.NetworkEnvelope). messageCase=" + proto.getMessageCase() + "; proto raw data=" + proto.toString()); diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 7d9af82cdb6..901d9973d84 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -1846,7 +1846,7 @@ dao.news.DAOOnTestnet.fourthSection.content=Since BSQ is just bitcoin, you can s dao.news.DAOOnTestnet.readMoreLink=Read the full documentation dao.monitor.daoState=DAO state -dao.monitor.proposals=Proposal state +dao.monitor.proposals=Proposals state dao.monitor.blindVotes=Blind votes state dao.monitor.table.peers=Peers @@ -1854,8 +1854,8 @@ dao.monitor.table.conflicts=Conflicts dao.monitor.state=Status dao.monitor.requestAlHashes=Request all hashes dao.monitor.resync=Resync DAO state -dao.monitor.table.cycleBlockHeight=Cycle {0} / Block {1} -dao.monitor.table.numProposals=No. proposals +dao.monitor.table.header.cycleBlockHeight=Cycle / block height +dao.monitor.table.cycleBlockHeight=Cycle {0} / block {1} dao.monitor.daoState.headline=DAO state dao.monitor.daoState.daoStateInSync=Your local DAO state is in sync with the network @@ -1865,18 +1865,29 @@ dao.monitor.daoState.table.headline=Chain of DAO state hashes dao.monitor.daoState.table.blockHeight=Block height dao.monitor.daoState.table.hash=Hash of DAO state dao.monitor.daoState.table.prev=Previous hash of DAO state -dao.monitor.daoState.conflictTable.headline=DAO states from peers in conflict -dao.monitor.daoState.conflictTable.peer=Peer's address +dao.monitor.daoState.conflictTable.headline=DAO state hashes from peers in conflict dao.monitor.proposal.headline=Proposals state -dao.monitor.proposal.daoStateInSync=Your local Proposals state is in sync with the network -dao.monitor.proposal.daoStateNotInSync=Your local Proposals state is not in sync with the network. Please resync your \ - Proposals state and if the conflict remains contact the Bisq developers. -dao.monitor.proposal.table.headline=Chain of Proposal state hashes -dao.monitor.proposal.conflictTable.headline=Proposal states from peers in conflict -dao.monitor.proposal.table.cycleBlockHeight=Cycle / Block height -dao.monitor.proposal.table.hash=Hash of Proposal state -dao.monitor.proposal.table.prev=Previous hash of Proposal state +dao.monitor.proposal.daoStateInSync=Your local proposals state is in sync with the network +dao.monitor.proposal.daoStateNotInSync=Your local proposals state is not in sync with the network. Please resync your \ + proposals state and if the conflict remains contact the Bisq developers. +dao.monitor.proposal.table.headline=Chain of proposal state hashes +dao.monitor.proposal.conflictTable.headline=Proposal state hashes from peers in conflict + +dao.monitor.proposal.table.hash=Hash of proposal state +dao.monitor.proposal.table.prev=Previous hash of proposal state +dao.monitor.proposal.table.numProposals=No. proposals + + +dao.monitor.blindVote.headline=Blind votes state +dao.monitor.blindVote.daoStateInSync=Your local blind votes state is in sync with the network +dao.monitor.blindVote.daoStateNotInSync=Your local blind votes state is not in sync with the network. Please resync your \ + blind votes state and if the conflict remains contact the Bisq developers. +dao.monitor.blindVote.table.headline=Chain of blind vote state hashes +dao.monitor.blindVote.conflictTable.headline=Blind vote state hashes from peers in conflict +dao.monitor.blindVote.table.hash=Hash of blind vote state +dao.monitor.blindVote.table.prev=Previous hash of blind vote state +dao.monitor.blindVote.table.numBlindVotes=No. blind votes #################################################################### diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java index 98fd6e23b07..409c77f8d86 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java @@ -262,6 +262,7 @@ protected void createColumns() { column = new AutoTooltipTableColumn<>(getBlockHeightTableHeader()); column.setMinWidth(120); + column.getStyleClass().add("first-column"); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( new Callback<>() { diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateBlockListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateBlockListItem.java new file mode 100644 index 00000000000..870ab9407c6 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateBlockListItem.java @@ -0,0 +1,40 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.blindvotes; + +import bisq.desktop.main.dao.monitor.StateBlockListItem; + +import bisq.core.dao.monitoring.model.BlindVoteStateBlock; +import bisq.core.dao.monitoring.model.BlindVoteStateHash; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +@EqualsAndHashCode(callSuper = true) +class BlindVoteStateBlockListItem extends StateBlockListItem { + private final String numBlindVotes; + + BlindVoteStateBlockListItem(BlindVoteStateBlock stateBlock, int cycleIndex) { + super(stateBlock, cycleIndex); + + numBlindVotes = String.valueOf(stateBlock.getNumBlindVotes()); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateInConflictListItem.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateInConflictListItem.java new file mode 100644 index 00000000000..a620675e8f3 --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateInConflictListItem.java @@ -0,0 +1,39 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.main.dao.monitor.blindvotes; + +import bisq.desktop.main.dao.monitor.StateInConflictListItem; + +import bisq.core.dao.monitoring.model.BlindVoteStateHash; + +import lombok.EqualsAndHashCode; +import lombok.Value; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Value +@EqualsAndHashCode(callSuper = true) +class BlindVoteStateInConflictListItem extends StateInConflictListItem { + private final String numBlindVotes; + + BlindVoteStateInConflictListItem(String peerAddress, BlindVoteStateHash stateHash, int cycleIndex) { + super(peerAddress, stateHash, cycleIndex); + + numBlindVotes = String.valueOf(stateHash.getNumBlindVotes()); + } +} diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java index 40616bac67d..48b37d4b114 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/blindvotes/BlindVoteStateMonitorView.java @@ -17,35 +17,241 @@ package bisq.desktop.main.dao.monitor.blindvotes; -import bisq.desktop.common.view.ActivatableView; import bisq.desktop.common.view.FxmlView; +import bisq.desktop.components.AutoTooltipTableColumn; +import bisq.desktop.main.dao.monitor.StateMonitorView; +import bisq.desktop.main.overlays.popups.Popup; +import bisq.desktop.util.FormBuilder; + +import bisq.core.dao.DaoFacade; +import bisq.core.dao.governance.period.CycleService; +import bisq.core.dao.governance.period.PeriodService; +import bisq.core.dao.monitoring.BlindVoteStateMonitoringService; +import bisq.core.dao.monitoring.model.BlindVoteStateBlock; +import bisq.core.dao.monitoring.model.BlindVoteStateHash; +import bisq.core.dao.state.DaoStateService; +import bisq.core.locale.Res; import javax.inject.Inject; -import javafx.scene.layout.GridPane; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableColumn; -@FxmlView -public class BlindVoteStateMonitorView extends ActivatableView { +import javafx.beans.property.ReadOnlyObjectWrapper; + +import javafx.util.Callback; +import java.util.Comparator; +import java.util.Map; +import java.util.stream.Collectors; + +@FxmlView +public class BlindVoteStateMonitorView extends StateMonitorView + implements BlindVoteStateMonitoringService.Listener { + private final BlindVoteStateMonitoringService blindVoteStateMonitoringService; /////////////////////////////////////////////////////////////////////////////////////////// // Constructor, lifecycle /////////////////////////////////////////////////////////////////////////////////////////// + @Inject - private BlindVoteStateMonitorView() { + private BlindVoteStateMonitorView(DaoStateService daoStateService, + DaoFacade daoFacade, + BlindVoteStateMonitoringService blindVoteStateMonitoringService, + CycleService cycleService, + PeriodService periodService) { + super(daoStateService, daoFacade, cycleService, periodService); + + this.blindVoteStateMonitoringService = blindVoteStateMonitoringService; } @Override public void initialize() { + FormBuilder.addTitledGroupBg(root, gridRow, 3, Res.get("dao.monitor.blindVote.headline")); + + statusTextField = FormBuilder.addTopLabelTextField(root, ++gridRow, + Res.get("dao.monitor.state")).second; + resyncButton = FormBuilder.addButton(root, ++gridRow, Res.get("dao.monitor.resync"), 10); + super.initialize(); } @Override protected void activate() { + super.activate(); + blindVoteStateMonitoringService.addListener(this); + + resyncButton.setOnAction(e -> daoFacade.resyncDao(() -> + new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup")) + .useShutDownButton() + .hideCloseButton() + .show()) + ); } @Override protected void deactivate() { + super.deactivate(); + blindVoteStateMonitoringService.removeListener(this); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // BlindVoteStateMonitoringService.Listener + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void onBlindVoteStateBlockChainChanged() { + if (daoStateService.isParseBlockChainComplete()) { + onDataUpdate(); + } + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Implementation abstract methods + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected BlindVoteStateBlockListItem getStateBlockListItem(BlindVoteStateBlock daoStateBlock) { + int cycleIndex = periodService.getCycle(daoStateBlock.getHeight()).map(cycleService::getCycleIndex).orElse(0); + return new BlindVoteStateBlockListItem(daoStateBlock, cycleIndex); + } + + @Override + protected BlindVoteStateInConflictListItem getStateInConflictListItem(Map.Entry mapEntry) { + BlindVoteStateHash blindVoteStateHash = mapEntry.getValue(); + int cycleIndex = periodService.getCycle(blindVoteStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0); + return new BlindVoteStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue(), cycleIndex); + } + + @Override + protected String getTableHeadLine() { + return Res.get("dao.monitor.blindVote.table.headline"); + } + + @Override + protected String getConflictTableHeadLine() { + return Res.get("dao.monitor.blindVote.conflictTable.headline"); + } + + @Override + protected String getConflictsTableHeader() { + return Res.get("dao.monitor.table.conflicts"); + } + + @Override + protected String getPeersTableHeader() { + return Res.get("dao.monitor.table.peers"); + } + + @Override + protected String getPrevHashTableHeader() { + return Res.get("dao.monitor.blindVote.table.prev"); + } + + @Override + protected String getHashTableHeader() { + return Res.get("dao.monitor.blindVote.table.hash"); + } + + @Override + protected String getBlockHeightTableHeader() { + return Res.get("dao.monitor.table.header.cycleBlockHeight"); + } + + @Override + protected String getRequestHashes() { + return Res.get("dao.monitor.requestAlHashes"); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Override + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + protected void onDataUpdate() { + isInConflict.set(blindVoteStateMonitoringService.isInConflict()); + + if (isInConflict.get()) { + statusTextField.setText(Res.get("dao.monitor.blindVote.daoStateNotInSync")); + statusTextField.getStyleClass().add("dao-inConflict"); + } else { + statusTextField.setText(Res.get("dao.monitor.blindVote.daoStateInSync")); + statusTextField.getStyleClass().remove("dao-inConflict"); + } + + listItems.setAll(blindVoteStateMonitoringService.getBlindVoteStateBlockChain().stream() + .map(this::getStateBlockListItem) + .collect(Collectors.toList())); + + super.onDataUpdate(); + } + + @Override + protected void requestHashesFromGenesisBlockHeight(String peerAddress) { + blindVoteStateMonitoringService.requestHashesFromGenesisBlockHeight(peerAddress); + } + + @Override + protected void createColumns() { + super.createColumns(); + + TableColumn column; + + column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes")); + column.setMinWidth(110); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(BlindVoteStateBlockListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getNumBlindVotes()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(e -> e.getStateBlock().getMyStateHash().getNumBlindVotes())); + tableView.getColumns().add(1, column); + } + + + protected void createConflictColumns() { + super.createConflictColumns(); + + TableColumn column; + + column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes")); + column.setMinWidth(110); + column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); + column.setCellFactory( + new Callback<>() { + @Override + public TableCell call( + TableColumn column) { + return new TableCell<>() { + @Override + public void updateItem(BlindVoteStateInConflictListItem item, boolean empty) { + super.updateItem(item, empty); + if (item != null) + setText(item.getNumBlindVotes()); + else + setText(""); + } + }; + } + }); + column.setComparator(Comparator.comparing(e -> e.getStateHash().getNumBlindVotes())); + conflictTableView.getColumns().add(1, column); } } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java index 9647a56cf2d..2f0156fe2d8 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/proposals/ProposalStateMonitorView.java @@ -158,7 +158,7 @@ protected String getHashTableHeader() { @Override protected String getBlockHeightTableHeader() { - return Res.get("dao.monitor.proposal.table.cycleBlockHeight"); + return Res.get("dao.monitor.table.header.cycleBlockHeight"); } @Override @@ -201,7 +201,7 @@ protected void createColumns() { TableColumn column; - column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.table.numProposals")); + column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.proposal.table.numProposals")); column.setMinWidth(110); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( @@ -231,7 +231,7 @@ protected void createConflictColumns() { TableColumn column; - column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.table.numProposals")); + column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.proposal.table.numProposals")); column.setMinWidth(110); column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); column.setCellFactory( From 933fa46780fcb1c2bc1e1244a5a51dacde2388a0 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 15 Mar 2019 21:45:25 -0500 Subject: [PATCH 23/31] Fix table layout issue The setFitToRowsForTableView call at activate fixes the issue that the views sometimes do not render when changing views. --- .../bisq/desktop/main/dao/bonding/bonds/BondsView.java | 1 + .../main/dao/bonding/reputation/MyReputationView.java | 1 + .../bisq/desktop/main/dao/bonding/roles/RolesView.java | 1 + .../main/dao/burnbsq/assetfee/AssetFeeView.java | 1 + .../main/dao/burnbsq/proofofburn/ProofOfBurnView.java | 2 ++ .../main/dao/governance/proposals/ProposalsView.java | 3 +-- .../main/dao/governance/result/VoteResultView.java | 10 +++++++++- .../desktop/main/dao/monitor/StateMonitorView.java | 5 +++-- 8 files changed, 19 insertions(+), 5 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/bonding/bonds/BondsView.java b/desktop/src/main/java/bisq/desktop/main/dao/bonding/bonds/BondsView.java index e263a6a2b34..14a42e934a0 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/bonding/bonds/BondsView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/bonding/bonds/BondsView.java @@ -107,6 +107,7 @@ protected void activate() { bondedReputationRepository.getBonds().addListener(bondedReputationListener); bondedRolesRepository.getBonds().addListener(bondedRolesListener); updateList(); + GUIUtil.setFitToRowsForTableView(tableView, 37, 28, 2, 30); } @Override diff --git a/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java b/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java index e189b069e00..0f9225e9327 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/bonding/reputation/MyReputationView.java @@ -189,6 +189,7 @@ protected void activate() { setNewRandomSalt(); updateList(); + GUIUtil.setFitToRowsForTableView(tableView, 41, 28, 2, 30); } @Override diff --git a/desktop/src/main/java/bisq/desktop/main/dao/bonding/roles/RolesView.java b/desktop/src/main/java/bisq/desktop/main/dao/bonding/roles/RolesView.java index 264979523b7..2340ea7f936 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/bonding/roles/RolesView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/bonding/roles/RolesView.java @@ -103,6 +103,7 @@ protected void activate() { sortedList.comparatorProperty().bind(tableView.comparatorProperty()); daoFacade.getBondedRoles().addListener(bondedRoleListChangeListener); updateList(); + GUIUtil.setFitToRowsForTableView(tableView, 41, 28, 2, 30); } @Override diff --git a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java index 1760b32f4b5..d6fad9d71a4 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/assetfee/AssetFeeView.java @@ -191,6 +191,7 @@ protected void activate() { }); updateList(); + GUIUtil.setFitToRowsForTableView(tableView, 41, 28, 2, 10); updateButtonState(); feeAmountInputTextField.resetValidation(); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java index af5b9ab7adb..b4a51fa1681 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/burnbsq/proofofburn/ProofOfBurnView.java @@ -187,6 +187,8 @@ protected void activate() { preImageTextField.setValidator(new InputValidator()); updateList(); + GUIUtil.setFitToRowsForTableView(myItemsTableView, 41, 28, 2, 4); + GUIUtil.setFitToRowsForTableView(allTxsTableView, 41, 28, 2, 10); updateButtonState(); } diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java index 57335f85a40..56876a3852b 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/proposals/ProposalsView.java @@ -218,6 +218,7 @@ protected void activate() { bsqWalletService.getUnlockingBondsBalance()); updateListItems(); + GUIUtil.setFitToRowsForTableView(tableView, 38, 28, 2, 6); updateViews(); } @@ -326,8 +327,6 @@ private void updateListItems() { } GUIUtil.setFitToRowsForTableView(tableView, 38, 28, 2, 6); - tableView.layout(); - root.layout(); } private void createAllFieldsOnProposalDisplay(Proposal proposal, @Nullable Ballot ballot, diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/result/VoteResultView.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/result/VoteResultView.java index d45be826cf9..58596e3b631 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/result/VoteResultView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/result/VoteResultView.java @@ -138,6 +138,7 @@ public class VoteResultView extends ActivatableView implements D private ChangeListener selectedVoteResultListItemListener; private ResultsOfCycle resultsOfCycle; private ProposalListItem selectedProposalListItem; + private TableView votesTableView; /////////////////////////////////////////////////////////////////////////////////////////// @@ -196,6 +197,13 @@ protected void activate() { JsonElement cyclesJsonArray = getVotingHistoryJson(); GUIUtil.exportJSON("voteResultsHistory.json", cyclesJsonArray, (Stage) root.getScene().getWindow()); }); + if (proposalsTableView != null) { + GUIUtil.setFitToRowsForTableView(proposalsTableView, 25, 28, 2, 4); + } + if (votesTableView != null) { + GUIUtil.setFitToRowsForTableView(votesTableView, 25, 28, 2, 4); + } + GUIUtil.setFitToRowsForTableView(cyclesTableView, 25, 28, 2, 4); } @Override @@ -481,7 +489,7 @@ private void createVotesTable() { GridPane.setColumnSpan(votesTableHeader, 2); root.getChildren().add(votesTableHeader); - TableView votesTableView = new TableView<>(); + votesTableView = new TableView<>(); votesTableView.setPlaceholder(new AutoTooltipLabel(Res.get("table.placeholder.noData"))); votesTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java index 409c77f8d86..7b560fe93b2 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java @@ -130,6 +130,9 @@ protected void activate() { if (daoStateService.isParseBlockChainComplete()) { onDataUpdate(); } + + GUIUtil.setFitToRowsForTableView(tableView, 25, 28, 2, 5); + GUIUtil.setFitToRowsForTableView(conflictTableView, 38, 28, 2, 4); } @Override @@ -238,7 +241,6 @@ private void onSelectItem(BLI item) { conflictListItems.setAll(item.getStateBlock().getInConflictMap().entrySet().stream() .map(this::getStateInConflictListItem).collect(Collectors.toList())); GUIUtil.setFitToRowsForTableView(conflictTableView, 38, 28, 2, 4); - conflictTableView.layout(); } } @@ -249,7 +251,6 @@ private void onSelectItem(BLI item) { protected void onDataUpdate() { GUIUtil.setFitToRowsForTableView(tableView, 25, 28, 2, 5); - tableView.layout(); } From ccbb5780ab7016d999ae62846d2759927098b780 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 15 Mar 2019 22:58:04 -0500 Subject: [PATCH 24/31] Add peer to log --- p2p/src/main/java/bisq/network/p2p/network/Connection.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/p2p/src/main/java/bisq/network/p2p/network/Connection.java b/p2p/src/main/java/bisq/network/p2p/network/Connection.java index 6ea6467512d..ddb327875f7 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/Connection.java +++ b/p2p/src/main/java/bisq/network/p2p/network/Connection.java @@ -297,7 +297,9 @@ public boolean noCapabilityRequiredOrCapabilityIsSupported(Proto msg) { } if (!result) - log.info("We did not send the message because the peer does not support our required capabilities. message={}, peers supportedCapabilities={}", msg, capabilities); + log.info("We did not send the message because the peer does not support our required capabilities. " + + "message={}, peer={}, peers supportedCapabilities={}", + msg, peersNodeAddressOptional, capabilities); return result; } From 00e350e25670293c17e59c5135a3a9a32ede5165 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 15 Mar 2019 22:58:34 -0500 Subject: [PATCH 25/31] Small fixes --- .../network/RequestStateHashesHandler.java | 9 ++++--- .../bisq/core/dao/state/DaoStateService.java | 2 +- .../resources/i18n/displayStrings.properties | 24 +++++++++---------- .../main/dao/monitor/StateMonitorView.java | 16 ++++++++----- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java index fe93abd1686..0b806b47403 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/RequestStateHashesHandler.java @@ -128,7 +128,9 @@ public void requestStateHashes(int fromHeight) { @Override public void onSuccess(Connection connection) { if (!stopped) { - log.info("Sending of {} message to peer {} succeeded.", getStateHashesRequest.getClass().getSimpleName(), nodeAddress.getHostName()); + log.info("Sending of {} message to peer {} succeeded.", + getStateHashesRequest.getClass().getSimpleName(), + nodeAddress.getFullAddress()); } else { log.trace("We have stopped already. We ignore that networkNode.sendMessage.onSuccess call." + "Might be caused by an previous timeout."); @@ -187,8 +189,9 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) { } else { log.warn("We have stopped already."); } - } else { - log.warn("We got a message from ourselves. That should never happen."); + } else if (connection.getPeersNodeAddressOptional().isPresent()) { + log.debug("{}: We got a message from another node. We ignore that.", + this.getClass().getSimpleName()); } } } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateService.java b/core/src/main/java/bisq/core/dao/state/DaoStateService.java index 0bc2164af61..4be77315198 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateService.java @@ -107,7 +107,7 @@ public void start() { /////////////////////////////////////////////////////////////////////////////////////////// public void applySnapshot(DaoState snapshot) { - //TODO + allowDaoStateChange = true; assertDaoStateChange(); log.info("Apply snapshot with chain height {}", snapshot.getChainHeight()); diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 901d9973d84..63c46c4e3ca 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -1858,35 +1858,35 @@ dao.monitor.table.header.cycleBlockHeight=Cycle / block height dao.monitor.table.cycleBlockHeight=Cycle {0} / block {1} dao.monitor.daoState.headline=DAO state -dao.monitor.daoState.daoStateInSync=Your local DAO state is in sync with the network -dao.monitor.daoState.daoStateNotInSync=Your local DAO state is not in sync with the network. Please resync your \ - DAO state and if the conflict remains contact the Bisq developers. +dao.monitor.daoState.daoStateInSync=Your local DAO state is in consensus with the network +dao.monitor.daoState.daoStateNotInSync=Your local DAO state is not in consensus with the network. Please resync your \ + DAO state. dao.monitor.daoState.table.headline=Chain of DAO state hashes dao.monitor.daoState.table.blockHeight=Block height dao.monitor.daoState.table.hash=Hash of DAO state -dao.monitor.daoState.table.prev=Previous hash of DAO state +dao.monitor.daoState.table.prev=Previous hash dao.monitor.daoState.conflictTable.headline=DAO state hashes from peers in conflict dao.monitor.proposal.headline=Proposals state -dao.monitor.proposal.daoStateInSync=Your local proposals state is in sync with the network -dao.monitor.proposal.daoStateNotInSync=Your local proposals state is not in sync with the network. Please resync your \ - proposals state and if the conflict remains contact the Bisq developers. +dao.monitor.proposal.daoStateInSync=Your local proposals state is in consensus with the network +dao.monitor.proposal.daoStateNotInSync=Your local proposals state is not in consensus with the network. Please restart your \ + application. dao.monitor.proposal.table.headline=Chain of proposal state hashes dao.monitor.proposal.conflictTable.headline=Proposal state hashes from peers in conflict dao.monitor.proposal.table.hash=Hash of proposal state -dao.monitor.proposal.table.prev=Previous hash of proposal state +dao.monitor.proposal.table.prev=Previous hash dao.monitor.proposal.table.numProposals=No. proposals dao.monitor.blindVote.headline=Blind votes state -dao.monitor.blindVote.daoStateInSync=Your local blind votes state is in sync with the network -dao.monitor.blindVote.daoStateNotInSync=Your local blind votes state is not in sync with the network. Please resync your \ - blind votes state and if the conflict remains contact the Bisq developers. +dao.monitor.blindVote.daoStateInSync=Your local blind votes state is in consensus with the network +dao.monitor.blindVote.daoStateNotInSync=Your local blind votes state is not in consensus with the network. Please restart your \ + application. dao.monitor.blindVote.table.headline=Chain of blind vote state hashes dao.monitor.blindVote.conflictTable.headline=Blind vote state hashes from peers in conflict dao.monitor.blindVote.table.hash=Hash of blind vote state -dao.monitor.blindVote.table.prev=Previous hash of blind vote state +dao.monitor.blindVote.table.prev=Previous hash dao.monitor.blindVote.table.numBlindVotes=No. blind votes diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java index 7b560fe93b2..a00059bf9c1 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/StateMonitorView.java @@ -400,14 +400,18 @@ public void updateItem(final BLI item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { Label icon; - if (item.isInSync()) { - icon = FormBuilder.getIcon(AwesomeIcon.OK_CIRCLE); - icon.getStyleClass().addAll("icon", "dao-inSync"); + if (!item.getStateBlock().getPeersMap().isEmpty()) { + if (item.isInSync()) { + icon = FormBuilder.getIcon(AwesomeIcon.OK_CIRCLE); + icon.getStyleClass().addAll("icon", "dao-inSync"); + } else { + icon = FormBuilder.getIcon(AwesomeIcon.REMOVE_CIRCLE); + icon.getStyleClass().addAll("icon", "dao-inConflict"); + } + setGraphic(icon); } else { - icon = FormBuilder.getIcon(AwesomeIcon.REMOVE_CIRCLE); - icon.getStyleClass().addAll("icon", "dao-inConflict"); + setGraphic(null); } - setGraphic(icon); } else { setGraphic(null); } From e3dace8f3f9f2c6e3a0a28a520e7005c54183b6f Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 15 Mar 2019 23:20:09 -0500 Subject: [PATCH 26/31] Fix tests --- .../test/java/bisq/core/dao/state/DaoStateServiceTest.java | 4 ++++ .../bisq/core/dao/state/DaoStateSnapshotServiceTest.java | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/bisq/core/dao/state/DaoStateServiceTest.java b/core/src/test/java/bisq/core/dao/state/DaoStateServiceTest.java index 0d9eff411b8..3809770dc95 100644 --- a/core/src/test/java/bisq/core/dao/state/DaoStateServiceTest.java +++ b/core/src/test/java/bisq/core/dao/state/DaoStateServiceTest.java @@ -38,6 +38,7 @@ public void testIsBlockHashKnown() { ); Block block = new Block(0, 1534800000, "fakeblockhash0", null); + stateService.onNewBlockHeight(0); stateService.onNewBlockWithEmptyTxs(block); Assert.assertEquals( "Block has to be genesis block to get added.", @@ -52,10 +53,13 @@ public void testIsBlockHashKnown() { ); block = new Block(1, 1534800001, "fakeblockhash1", null); + stateService.onNewBlockHeight(1); stateService.onNewBlockWithEmptyTxs(block); block = new Block(2, 1534800002, "fakeblockhash2", null); + stateService.onNewBlockHeight(2); stateService.onNewBlockWithEmptyTxs(block); block = new Block(3, 1534800003, "fakeblockhash3", null); + stateService.onNewBlockHeight(3); stateService.onNewBlockWithEmptyTxs(block); Assert.assertEquals( "Block that was never added should still not exist after adding more blocks.", diff --git a/core/src/test/java/bisq/core/dao/state/DaoStateSnapshotServiceTest.java b/core/src/test/java/bisq/core/dao/state/DaoStateSnapshotServiceTest.java index 7941e7bb5a2..d2730b7c303 100644 --- a/core/src/test/java/bisq/core/dao/state/DaoStateSnapshotServiceTest.java +++ b/core/src/test/java/bisq/core/dao/state/DaoStateSnapshotServiceTest.java @@ -18,6 +18,7 @@ package bisq.core.dao.state; import bisq.core.dao.governance.period.CycleService; +import bisq.core.dao.monitoring.DaoStateMonitoringService; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; @@ -33,7 +34,7 @@ import static org.powermock.api.mockito.PowerMockito.mock; @RunWith(PowerMockRunner.class) -@PrepareForTest({DaoStateService.class, GenesisTxInfo.class, CycleService.class, DaoStateStorageService.class}) +@PrepareForTest({DaoStateService.class, GenesisTxInfo.class, CycleService.class, DaoStateStorageService.class, DaoStateMonitoringService.class}) @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*"}) public class DaoStateSnapshotServiceTest { @@ -44,7 +45,8 @@ public void setup() { daoStateSnapshotService = new DaoStateSnapshotService(mock(DaoStateService.class), mock(GenesisTxInfo.class), mock(CycleService.class), - mock(DaoStateStorageService.class)); + mock(DaoStateStorageService.class), + mock(DaoStateMonitoringService.class)); } @Test From e93358428df4cc747e5486fbca3a20e7990e0879 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 16 Mar 2019 12:09:03 -0500 Subject: [PATCH 27/31] Remove db store file --- .../resources/DaoStateStore_BTC_DAO_TESTNET | Bin 956853 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 p2p/src/main/resources/DaoStateStore_BTC_DAO_TESTNET diff --git a/p2p/src/main/resources/DaoStateStore_BTC_DAO_TESTNET b/p2p/src/main/resources/DaoStateStore_BTC_DAO_TESTNET deleted file mode 100644 index 7a1bc0eaee2b59c7faec70730ff6182e2bae71df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 956853 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 &6TeDtOsU%|L%Fb$+dPujS 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 From 0b152466f41e61424e5d6c70b13d65d55eb94855 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 16 Mar 2019 12:43:12 -0500 Subject: [PATCH 28/31] Add updated db files --- .../resources/BlindVoteStore_BTC_DAO_TESTNET | Bin 57057 -> 77110 bytes .../resources/DaoStateStore2_BTC_DAO_TESTNET | Bin 0 -> 1872157 bytes .../resources/ProposalStore_BTC_DAO_TESTNET | Bin 13961 -> 19388 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 p2p/src/main/resources/DaoStateStore2_BTC_DAO_TESTNET diff --git a/p2p/src/main/resources/BlindVoteStore_BTC_DAO_TESTNET b/p2p/src/main/resources/BlindVoteStore_BTC_DAO_TESTNET index 9f04c091681e6e36b10648b68e8c9e20022ef710..e8136c630544d85c7333cc8bd440e44919e2c311 100644 GIT binary patch delta 20261 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 delta 56 zcmV-80LTBf+63Xf0|?%|1CjyRy#uqi2y7R#!ZI!ivyesZ5wn|L4hgfTa2j^AkM4d6 Owafut3AgDI0Zkgz_!v3> diff --git a/p2p/src/main/resources/DaoStateStore2_BTC_DAO_TESTNET b/p2p/src/main/resources/DaoStateStore2_BTC_DAO_TESTNET new file mode 100644 index 0000000000000000000000000000000000000000..909f2dbc7e88c0f892c1ced37389c4083ce067d8 GIT binary patch literal 1872157 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

wbLN|xqiUp$2$!pXnjADDf!swUlU~g)eKeWG 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

FZG_tdZ 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

q>#TIS}MW9lYP2{#5#YZ@k<# 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 z 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%0D|q8qEbj7wo4y) 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%0A;_=yfoE93W+;c#ceBjuy1%@}#R1X0W^) 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

NK{R?5fe>g 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

S=|B4Lni7+R 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�?Qq? zmsKM88NM)&)8nzg^xXY5;~Nz-jt|dZ^K; z$J{cl#2OsaTr*yMeFusH^s=O$t`oL;)`oM6q6qN_Da|A(vepclc-(MoTC}$ zD%D58e*xy`^=745)I-cN`rSiXX=b_*sd>>#Jw=w1C2SEUH6E&S+sZ57ymIOCia^v0 zv>P*Qp3o@YHN)LAB1b|>mTY4zd#YrQ#3@B)He34mL&D4QgH^5x>8Qzu{^NcIcl! zIl0!lorUYHyGCd2IkUD~*fVpJ;a%6=X^ZW)*{*+N_S`A)AtMl3*ae406qOsA0-(zw z-ATJQwW~HJ(&RL7HSMNp{itR5&~nWkx+b{VcfQulTe;wBhwXDdkZ8sEZKv70b!M%# z;r4@Dt-o;nO?Fk_In#B5L!P8I#8 z9y1$Y8}-1@bow0A{ZY&Owp??o-+l{MI~Ox(1-R^-87MBBeU0KmHqo0st$!rdN&Epk zsvPr$8r+cKqC@I~j1T|)T#Vs?o)!2LJOBAFXZ*V<{&CobC$IP9O)J0o`Tu?4p8xRw z^gUAj_2*xE&$_<--JAY=rE6U{FFsqMJ1{9ygNk%Qoo1_$n6P!JLc$V#?^am2Wk^Is z6ERClDIp6AxY;TQse0y{8l!3F;_s|{L8X044DvfuwSZD|*vqnV^)Q9Ojv3Sp#X=5| z5Y1bVjx{HroIr0u#*CG|%C(|<>xovau30fbHEhcj6W?2-LhWN4%CtvP|I1_KM5&e~ zJeG(8K+r!^Qz%9?w((7E5Cdn)Woa9eG#i1Aj1Dg&ewIFV>(lxwzHhnijth2JZ^N0} zE?%d9+p%3Y+IaEencL2txlaGQtv8)JIJ#*2sp6DbVf2QGDC^)M3&R{KEKqbXSY;wU zt86S2=o_9!e4p-*S{A34YwpmsQ}<0Ce(LHOhUFUH^8c^zELYq1hPo8PqGZ8yoZO})7qKtw7KgEkmo z$N=zWi6RxxP@hQq_V-OJYd8G?e@Ewg|6#_=v;O*m+m0Fhi(S`V`G0=yi31&>3c74E? zdWR{pNOE8p*pk?oJ$gH>7l+D;N!Pnu_dchXblyJ$Lwz0TEMvMiP64Fpi zpZZtygkiY+vBXR_TQOuz&rl5dOEx379*RkL8#nUODeqU4NEr=K$v49x@dTRifhr`O zT~GnNF5E)8Ck9{awXi=`H42O~cLw303Q-1i+Ya?L-Uix+F&9EgkP%b27zFyKlV+CP zCi(=KJke`4OsStD5wSX5^%JR2Nr=>?caM#m2b{J|_ zMZ=v#J?8L>wK)vj0M>on3TR(=<pT zV2B5}+{3nRkw9wr#^ks=Bg=RjAMNpvE`-Ks^>6p+LVWQZW^cRk_+~>3*Y4kD$)=nf1ttTh8yXx8dUUA@V#afqk;cZ9d`(XB^qw&xbF zU-7>VK6cwV|M2X_=f3b4@6_W>$=kTe74hED@8%+PH`>ap$A*eV7Q`4ip+fLhzhXf@ zEd$X}1knpcRLGr?5mci2G6S>9(Q;^wfA!Y7xx4F{+pj7n8L!cEMcaagf$^{}(GQGz zpmC^OL_4iw+a6q^X6d4nndxB6I{H(>NuQA1dZ=pBE!|zaANyP}$&jeGR3>j9r>;l@ z16`?b$FY7}m%+DDO*D0{yw-@1LLR<={(uxk_Bg~#t%s^6-O5X^?)zRI9CkF#G%DQI zlwg1BLyGYfUW|!YE`-*COa_FsaK&hj)!O<=!~=+9(N#505=GUEmuhoXA+&3NO@|00lDPStG?(&NMf>bEWq=^Jz;ZIf;^9;%vjJ1^~b zPccb{!DKHO%O*t{62Z@rCJe8DULzBj-cpYSCjp7zDP*1@YL!!nw&x>d^?2Bub%elIl+ysdr2_&5}{n7c?^< znm`$~xz1g-!< znl|5Hm=Pl`E!(z3Rg>=Fr5DesCIJ!2G)PE|srmIq@&d6%50FR_tpeFSBCqt1j)|e_ ziEhch56PhFlItm? zln#cw)Fdqt3zpQ43-qEoqK+WYc&KX91H5#~)y1SpI%BZGACUVgln|Rj(g4$I@F9X{ z?i(60BrFc&)@Nxny)^_N%u1SgBjErw9;%x3ATPc5Tro+^hWlvG>U$cvO6wT0&q{iQ z8IlkA67V`DEEgIIW6~yyH(2RDwjQXpFRt}a)ue}b>H4J~l^_rx0Y!2g4M8r11sFQZ zP>*FR7U)uz(pabOB-f;iVTelBnL0nI08(SOFRt}a)ue}c>CkhFNo3TyL8x|(;YnJ$ zh~3_Y%ORgb<;;SLewYoiNfaFXQUA`8gC07eIC$Z?HXf>)^aw9KdrvVbI~IZSYBcGY zqFTvA;RT^IFF;2~bs#xygm$O^=>-wD8O)T*pq4LpTg_zzH({pqb(0ihbJ0f|}6b_aRSR~g+ zJf9O$i2eDCWc2RgG?O`}V#6MK;))W?pJMR5j_v?yi^LJ-3*I*pBKC(@y9^kis9M=8Ss_-ty`7 zNRF_i^&2!svISk+8P5wL7?Bj1kuR?CP}QWDc*~$hw zif5Ws(`hClPj^=@nbF;JuQE%}QYy8iQdC;2D%1UpuC|iYl1i%5R_Vp;J2n^yAz&Mf z*#gE3wu?X#vjzwdg4rRBLjoAg;y@bAKA-oTYpbZbH9E}EU-OWsmtb7Ce!t&2=l#9! z_x*mqFD;pP-quO<$2Oz&Gsi5~VA9$d~%rAxZk zDZS`>$&w%>s)4X>qpiV|RLkM561aie!1exq(VbvPM?whDT8d%II`&Ly8JPyDlxcOY zO{Givs#E&nAO1Lbmyp<$v|Kk?IV-l!3BdH#eOL6VG0hM{m^Nxfo)G3>aoI8yRnUZS zwp<`Clzf{?m-IEKbjw}ol6+Y%TjdFjjUeR0MN3PBHJYrT0YaQG46ss!c!DX-9Nj^U z6g{`;cCWW*n`=|)lJ0X#PySM}BpR(C|9X{Xw5l*_$vT`3dpW_I8>dzc%DtCM1}U#H zGZ*l(1oz7IWWB>ea#m3%c!*YRM!-M@ut7 zmp3g$U`m)uM%u?m2;4xm1PtcgRJx>ZIHl`vN|vN*)lc%QeA5cbC~U>?7(W+wcZw2& zA(5$=^U3m5xaL7)Jqq@9T1q4VJcRCYEv~8c+Sy^i=se?+3MKER(k0#RlwR>B?J>JA=cdvn{k>EAZ+9h2DyrV3 zkLaq&3}~bvbZ+@LoI4UnU!ML7`XU+=Q;zU>WX<7j*4&`^2#fB#n@X4TZKw3+FC|OD zIcDXgTr63E2#wAQu2ib{;K|j)gxdTdh_Wv|ATAw&c7-UWH%C4%z95iuQ|Xev?>d9!4cS^{rh>Jd%yysfabMA7Lh&73N?GxA&P%#Nvu8WaJ}|!m$;K-=0o01rAzt; zr}Uwlk|ps|cAFV(>bon1Hx|mFau%(e4>y6o!|~tYB;xv+(!-ERGC*$TWkRT~M5xTU zsdP#I-6_4|?qo?w4^fw37zjFEqhzqEhvP}XP`Q1O2VuYyo0{cCR|Paw3J`KY4vqJ7 z$K~Brx}@(qrTe~@F3A9ekRPbKi+IdNWP5($VruLmex&PH6ONG?4!+7jSmc37u#2Ot0GZc z;+|uxY{H3rN=Q}bMh_9#5?#xjn@X4T1E=(c=R74I91=2s#4wu3KB89`#5_izlwS5gvZPkldog1!eD~cC z@yg)0!H?-E9UHqTrojLMsU+5}>0;5sr;F1!x6WidPR>oGOZtgZ`pPSw8t;<#gu_Hg zq+*sC=udkt+?{2+acOXp4O`4on~V+Kgxf&0qv&K8(`LlLlu(&>Q|Xd^>Xhz$XR;)- zo5-WJ0!8FxA~mp?CO)LVF zdHpA!^Ry%rK-`DoU~~K1U0pHhjZ=;W3Nly>s5TQP24Z;OY474z^G#MP+Qb7dVAOFr zH3X;m{d<^B&{~%#R5SS(0A_*X+G{65Kig>km5y8Dqm3? zIHjDMN|*H1Ld(@ZzB@f7NRiTrAx8|WHx!d|6Ciumdj+QiJe%rG^`%fjSkOa3f$`GK z$SRAfnYiQfZYo{U(+Vvg{m=u+lC;@sP$NmdMl)k$EKz6<(^*)uN=c(Tw9Ib5qyVN7 z#(|G{!}Q(&{He$)b8aeK($k&ND_;5ZBnXrYo-wE==#k-L68#d-MFEGn2X;cl4W!WJ z0tI7~tA4|HYG>JBb;DFe@4TBzm-Gy$bl*FZB^i+gqQG7VS+q<_=Z zD&|m3LP96B$GlZpZ}fS?l2s7Mxv6wX&vZ&}|8lw{zD_1O(c`Lg-ERs3oDxK3H7xjD zY&5S^FDF_W+Dx*zFkN8W!A)?6m0<*de49#_^em_Joaa6x2?9(C&3eE@Py--Q89f(W zOM|dX6ldV3dJ1NjoRjJmeCYeHsSo&wu>SJWTT;$VrAvCYQ~K;%k|o8QPE;~fdNv_k zaZP=Jwgp(Ds-=GPa+&z(JOV(aNb?zzenV9?IXJ0#aFFm^n@X4T9H;b#k0(nq7FXqg zgRJugl#hsscmgmA6gMIekEv+uO6P(h2ZRI4$tT^38e;Y6?dIH6x}@hirSCtGEJ>Xt zNHPK`**V?~$1@cPbdpU7+eS?vl-?LiI)=rTY7i77f0*vl9mRYePYvIg1pIU1FRqmLy8UZQ&uIS5GBM(no{4poB%uQ^YaT1Gvl8G%8gF)W=49O=B+UOPc~a<2Bc+ z=RXy9T+U6UOS;-AJ>%wdNvvChX&z58NDSW&0gY{oS0#Gg7~>jm7+*26GvHnqN_4+X ztfinv6G%La@@*z9=Ypaan{AP3ebe zKRF?dR9rZoY6ORhtn$j1E&- z!K1^l?vYhS6VV($r3#QTw7ZNAqCSpxbIwhrOL~b@dhu7%B~4={u}_tP2!Y}35W~Ar zZxD!tMeqniSzb5PC$I^(f6S#++~y zpdl5&ooJjekk=Hz&oRn0auoqH#JG5&pg}!d4iuJ@b5rS(e%~qGc5|{MZ?E2p5!<)gb@TkoAmDmP!TSg~{&W4m&O9yZd?QLL{`8Jg<>E%x8 zRo6Z@-X%u6?YcOoy@|#CPOei#QFORQo(A=-$|FRVK)xNsE>&I3l%ZfkBGjc0+Hl@Y zrAzulr}X#lN|qEfWv{lth@dD!X;FGB(BYWxK;TLL3OvKBTDf7lC}v7!beOD9s~r9- zF6G=*x};Y)rMte8EQwDoyJR9EU7Ij*F*L|GCn3VclaxfOnXrq-OQfu+Kg|`xiSZiA zLG@fj@4TBzm-I@fboKL|7Y~k$y>_noln#mfM!S+Fq|-oL@~4|f-;}X7>8gu6^u(& zfcB;kKwUCEOG@RCq%|JhuWk$sw8Lo zR>LfT>Xh3#AA=2%^a7XHxx+U}<#fDw~ z9SfTq)k9;Q8(T~D!ccct?aWs9!ccv4VDae5p`prTvvZr#*~9!}lBD6F6%d3)v^(9S zfOW;15Tr3q&v0&8f2yIV+;zF>xiwJ+=036}%0MinqRhr_xu9y1A|`_Q5hnRa5$55t zx~%|_JC4p-|3oMQ|LWV{{>sbleEO4Ka`)q&eoJfZw?FjTe>RzJ??PoDrS^3$iMM#&P40r~oFbl-eQ03z1`6 zl$r+Xgx4A80`NfOORPK@-DqBFDI)S~REwk`Q-kl&Q-_6i5|8sPB#p;0m(uZIGC4HK zfzJ@-g!D__ErtZn28ba|$AB>tHOAe<&B6Fz)eh2}YQ*DvKJ+i8g*l(qPCQ;cR_z5) zoSq#!KGEAfHQUuOH!wF*8||B(SeZCDdZ^YcuC!@A8EF_;1&j*78e&x$DsEpO>4Y>< zz_%7M#FeZ+)riNtF1L1F^LYH$_rHqlc<;__bD(f|;N8IYNv- z(N9ye^9fWRQbNq~lr&VmthC7+|I#|*Rj!DST>Jc}BZ|;y7XkPH1Ho%w4mt|(u)mD z1;~rGN(hO)9`~A_M%dPb(VZ$;Q6q~622DDpyqijwbVH%#fq(c)vLxS(JV#jx@xq&T zLJDB{E!0)#z{LP)B!_^YX)A(%Ra&xo>J2?)lz$g#-c4DOyZtpz={?VTK~ezH7~mDF zr(83LA-b9zG+}3~-r%kj5}_N1*MU3|dQGtntfu*(08?%#0P}9@+`HWv0jh#ls94Og zPKH1Nw!L=6{jYJix8>Z?f%IsSyWMC889O0( z43pF)42n3?hbN`&LFJ1i?p4A)!ui#SQ5@qrxcTuwfamR%xZ9PocnQ9apxr18;2%bu zY1z1Yf(;awcd`eMILcO>7mdnNDCa>YFoATEqf*m*iii?;uiPgnyx!elVoVvJfz^)# z#a<;SL_jDh0dg2ETe#@MVW-ncjtEJ5W++D>Sp9U##;j5gsxJQk8Y3$O$=ir4Jd&6r z7c;xHQe;?i0YexXcl-TkpWu$l`K%tg+f8!p*j!xfJ+ie{7~Gm4*Yq1-nCP44Hf9f&8RZsE&3@-uRc^ zTCa6Q{Ou>wC5d5rg27?}sHy~U-$QK$8A3>lepFltauO*3u7E5liX9kHlz%xl zl`iRZPU+SkBunDj;qwn*AU^pv6h`?CdL!l~y9G!yx|N!xsygx*(XC9P4Qm@6#u(1x zl#D^lwW)MTuXjpMx$dgCNX-<`V^$_3=7BM^bLeBS2ii1v)TEltluuy{#S@OMJ_Pm} z3nr8ye#7Djck*s3UD6wz(qFwhU6LFlI2)XCV%&mxFyR5A%fnzHjFF*~yzfGT73R<3 z1%rkrpz^FkGzcHMyqijw^hT%js(X_qaV=rp;q7KpGb>87^uUSZG+?@s(G)0F;R#{U zQ3C64D1tGE7!L-iS9i{ma&9VJ(jPgc`=57pJUH;K_l71A?j#6!pD;k{kB<0tSGp`sw@uryDa zC|v3>twRsv=JUTn#t>+|;s9LX0tY1e^Z7QFF6qrq>8ejAOQL|$ke9MddR%&_@>5By zuTTJxPx!U~(i}dR>_~9cB$Jw8z)_rJJsMVe&39d6K31 z)OloChlwy6(7N#?Fad|56NV9t$Y~ymg&J1t?T!%y+(i)OA};0IlqJ1n|Gt}@(of!< zEXkhPq$GroNYmGZB1oa@vYwIv3F6(6$gl;rqY$9ih3RB*Hb0qjV zcXS{34W=2xP0i)Ojmd3+UP)`zjkDPXrcE|&zYt5+KK7zu6n&$ zqUvo34-g%HY?c}vC&1Uy$IlE54-V%4h3A z?b)#{Ef)K0!}ZD2Gvo8M(V^|5T^rk#Q@vA@%SV>`*E*JF`kNh_hCz&v#!!Z*X=nP=lJGl{1e5;{qiM!SADtkCm;Bg-{~v-&7CiQ*5%K+@Av*| zU%I`fzWKK(RX%)gqg26>r8q;HiXmTkdLD{`PS#4^tH)oPWi%)ccUut5u}8tiro#pi z*CBs;=00MvPz1DjT6%v3CT+50=1*o?k~hiY z!>dj7r&0|ny~5k`1uH@h;nDkVbwqi0bRa#NlxGm`uT?{Jb^bYyLvcV6>IW1Dmt>Vf zO;^@7DQVhh)nW5$4Csx6V)!x;k3bTW+0SP60T`z> zHbT+i+eILwm~dx=%UN=>a#JGCMWo~&pcA3Zp`w71&?iVCI7@z&6fH zPB;!d(bGtI1}M(xA>{K0E+O=WCxh{6xMiVi3)BUB%7jz{mSeVTh{jMkweYwY@wsq! zMb+fOdPXRD^1ug%USzce{8SsAQ$ zueS}2j*gvN8XlaluWomAOr8J$RR?N|O`|Sig91CWrkrKaZtN1(PA-d5>U8)o17};a z3_nAT&Gb`^sJrWOYqvJ9njZL4MfSgE$2Qk>VrqN5y`#QzYJOmJX=(lN+_9;yk-@&1 zQ%6>2wq{qG9UITEgyI17bVcDggjWtL2&7yMKRQpNI|x&<aLfM&ksxt7gxKRR-3dGF&UD97S>*C zr1gAZ%2vYcDipK6@juFFl&?Psf|EADypzS~@ZU%w@}Z^DEOS(o;L zS`9c8eh^`rY)Xm-D+V$F>6GeE+KU z#c1@PLK5sTKtYZ7dwABe7PTO;2syiurHY|TW|uk*7mi_OL9p}G!Z;BL59%73mtr3& zHyUi=TS`tAGsU#-$pu|Dm?7Tab}nqR0_;U94~F>b-=*`N_et%9`1QiUQhmAHRVXjd zj}6Y3=G%s5*SEKh9z3=P0v#S3Z5FF^E2&}Co03UzqBn*WBucuWEl^(Ve)AiRKFadV zW&NqfH@E9@YqvEI@h^Mt@9yQXtxok6tNoSZgR{#$qodOu{Y#6h!^b)dmBsm)(XG{?BS!|RClAdm4Hiac3rD+~otxA)+AI2+Oxi=AilQVh zCt(YJAC_e1$)mew!C|xhRO8%sU2b}A=Y@Dwxwk4Q-toyK#J2*(_+jhA`ZkyVM)MQV zMePtB>>}JO%=^us7oyta)*Lz|c+?K$-CmaPdd_)CsB+%&@Alp9)_Lv^(<+Av7cG(= zzIHJ=ARd*R*P0k6Bn{+n-%$ZkPkKkSWe|?gr_Ipzxl+AgT;<$U@!HEuWPb6V?LDr zGPjhW>>i{BOq=c-c~i7{kq5#`LxHVX=*hRM>qv+ijH`RUxBd7h<$YE=_s(2L@8QYf z>ekFe|LH@0{l&JPx$@f5;K8kx!RhYxx!EJl0s#;lB7p7|S2~-$Ft3#?vuC3sGC`&g zR+kiR83Jh5pK1hxU6)(C{epW(0KKH;rjNfE5Vm*cwls2Pa=ug@-#FU0bo5AZb!D_z z9WeF;E8ki|+bl=*IuB!|tO8Y9cOW&Nqfx$U~# z^xV!3paF#K#gUy4gt0ipJfwDvd=<=3tL_?3#9{;mQQr$V=xACjJB+KWeM4(}ZuN|WqEMKk|@eL2qV-XtV&@r2W zF(0`uesaJnc{A=t>?1xjC8r*m&9Z@6nnK*%U_?kGxV$D~nVl_ctGwdI31H6+tzHb8 zhVDuu_I>)U$hmVqtDV@lFuO55-!nZpeWo&ba{KsN-(*+saz|~ctE+eH^mY%UlriJL zyT^tij`eno^r||34f)oghn2rRn)f370ziKbIgF9fWO11=JhIFj&iYf0Z+O?`UM%)K z>vM1X)xA8occ4i6Iso$MYvT03=mqTJszP;6g0-8FZxY0~YDCa(^^3aJZ{ z2Vb!Yeh2WBS_^g0{4@?RZIujnM%JHdoZGI;y=d&q{i-#IeS{-!O4L%78wwR)HRBG< zVlA?W#o-QQHOSVro!FQ4PekndyW2Yc=@rYTu0QjNO3%Og%bVVF)o(oa)4RmJR%K!| zAV~5BfhsrWojF9%+&d-g2W1Y9{a+=n@n!*_j&5<-lN=woQ zE>o>&To(!v`)<3m<$)L9;x^9vuy%sq)^NSNv|2s3(RN~JaJ7A7uzvE;=KAU0+G)(o zQ*&oVngu^zTbd4X)j$=Toz`(ZDi$v+3K`2qoXOCuX84G+{#4^5-gUW6f?v`&e(`%- z_VC!2OP$A8yN;|*l@D!hjct@R+j^(gR=1bOx@Qlb9vWJ&tv5Ti7%|NNh^>T69HWE{ z2kW4Cx(3y;45AWIvXrwhakBnYdThHd_oA^c_nX!v_5t0FG;u9;4%lG<J@h_=AOdRV-&69tjz4rVY* zD?~r2DM(-fpwS!PK}Nff5S|R6QDJhD<4_X)^1c9R<_EkrqX`=sauhx9h;V_fBcIb( zI8bD3IKr%X+Q>;r0!VAX1`0PRm8z)oqmR7&)=OLNzxy9Q{z-YC)=u!7t4_{s9hOB8 zmrrlZt@KXLjINH1Zx2c1Ahd+qN$yjc1Ae_4O@d(OW3 z`TtkP#e&}hY4DSCbB|SSu|`vhE6>Ppk&}7J5aSASfzwi-63E&QI+>s^`rU}|Vv4P(C!m*x1m80VWTT_cGgY6ruZNuBgPA`@Fn=-JGNL)2#x!x2uka)*6Z<2C> zCPim$*2G4mQ6xB7zTu2N)%b>YUGBv~-ox zK5%Y0iE+0>=>irIh>Foj#V(gE*VO_KCjIR;gqCXwRwjwysl0I}RRh_6--|(Lew6kAa>?=1rH)=lu$?!JzZZi+y76sG@3k$Dk_%KzN7@!PgIJc}n z)i}3ZmwVCJm;152T(H0;XTD@5H{We9vp$8^AR-bb6|NO#xzx+!F-hQ#zcU!6xA#%sCjIK6sI!U>CGrmtBT{K%mzlIb@ z4JKkkjJ7}7Ck`{aLS?CX z6BMgJZ6JQ`Y4s!3ZOES48mCTZ3pg zSj&QRH0@*78KyVndm0WI>^M`Tw5LT4g??a?TGZO53igUo$~rHd&%P`WzniZK#4qpT z+6jMWMrs2mCkIBmCI|aY9Nj#n5~(kCRcZr0TtAO@A8ra==@PlH(IQ-X;WL1B%Lo!W zf+iCN%19DnESrTzn)Rm|pYg8CZ4&+x#P94UUy1yz;6iE^egTyHG0f&d2V%1BvQ$ z*Ig633`V>L-1ztj#^Ivoa>7X2oFY#}n}$cQAjx%zNkdgKCsdTeUV@zzX|cGGpCMEv zcYJetlbKEeMQ4mOX=YQ%A&3j8#K|Apz{t_;hHd!!Rn?IbhX7)Vrvuzwz_YUbcVH~# z-O+*cXi|Er=a5Gz5&#BOg3;cDc(nHXt~BeRp*XD^7ntI@Cv@jg6{r>vXxW7&!>lMS z!kbHBRZ13;R}2xHA7U%`csXlvg>kdcU-_%N-nXhKgl%n z7sqz7r<@+!&s<`T?b4Qye(uO#9@~k{BZtO@rbZY0>N9;kD|6c$hgaGnPu6e8D{WiK&b%W8)sY9c6RLf5v{GUr&F5Cb9OTtzDPORHEz9+fEqzcXRo=G)PM^k|Y2h{%t=4Gg3k$WBqc zqTQtzNjIlx()AQBd7p-XE)rk(mRK`}gC!Xg)TqYX{FtChUbPaSgnJBM8>apC2=puJ zE4a=CULOa*$4}@#ay8<_<9&eHr!K~d3>K5TmC$10%nB;WA07p3qu_}dOQ4g^WjSVE z5#qoVSl6?PK`qilXt>JL@{sHqctbQ2z!=6d151zswW1N3H19FGE?SZDOCn_aIm$Si z#TbXquAsGnMLqEGUnZo^`LrIo$CeA@^VQ5>gn$4 zm>*~sS-goTe!M)w57LMM|4;I91*g<(^nSQDfk#}8gdT!@ONCq6GQTXdN^Tw3j;w{C8H@CDJ$%-UwFS_SEZORq7` zBIZ;uHUz^$sPA&d^x_?lxx9go#r=%l!N82DK~Slg2?P75GUM9XT6ZIu`=<>Sf^ecM zG*+X_t<(Ad!?X4MXGP?^J35daO%jpw+To=5SU_F;RHs0F;nOIvg%zN|WxzK;j;1Id zcYDA@q;h>L7ocUVy4S;Oa5)%FyQ>)yLri@mUB3ie+Po^Mb z{wmN>O;My1%S$Y6j2a}R8Oy{jkht*5at&kixp6sNMqQ&dfnZ@Rphsg>+hV3+Ok+nA z_P0z1KBlrr=6vLRS`S6!rNxbv+M(XH&B3mjbrVdDG+$g?9ByA7SwGUTb?nGwQ&uZy zT`lwqj<~r4x}oqs)rXWz%dX3#1N&AbxiVDp*t-W=!D78*JHQK;Ani}-}{=}i`cqcI1}N>fUhC{LOgg@)EH+IkEp zbAN>cFuisKU>b98!N{u7@Y`fVl3uDgp}Mrwqs`9LhjXW{646SChU(BVeRh*+s8fl{b%1E}l9*c5G&J zesyKwX!mqsm}PD6Y_r+|sWp7vYk2d#Q?=2gGhw&O*p_dItJoONm~55-Bg^_zjmWa= za%*pEev|#_tHbwV@6K)g;KA|Eql4q!%R~M3k<$}Bqs-JhSJ&q&liNe5*0-8siv|#| zfW>zZPogrN?ba7Zx?uJm!Iw#fP?qPDp4&5wHD>8qdfrY9AidEHw-QvA$2 zF8%f2OSgAnZSlUx?)zi4#UI?7MC2H(L}y81t%OiEs2;q>tQ>SOG`#^+CII1O8geXc zjp{D zIjF1+6ac9(_Fz9G2;+}pJrsN#*x&?~!TrozSw!nZ&F0ZfX+2@iBbbFnR*YCd7T`fm zRHW7kM|x#1;!%9HVz;}4@V)>FD0M#XvdiCiY0LG`4-e9uPiiL`FK_jiSLPRvE%)>u z8$DL(Z7Xe_9$6n6#d?~*0JTO5QF{Z|7a(14av1*2lac8S% zv8c%UQ;n#y>vC&% z7K!)n+_u-Zi;FAAJD1zq7lt?1W>!W@TPx$oyAQ?CgRx`tO$n+Pf>XS3T=;AsAgR7j zQ;b869TH7^a9?Ykvs{MDE9*}+Ub9`7o1WXxTweEGvQIgY`^dIh9`VHgouYU6;ON-! z;ICoU7Q_xba16CbD+M%hg1HdiWL*lr-O8(3s0b@2#Dvo9zs5q+rv179T=Ad$<4Z1m z*u9^*a%QCW*xx?l?eBPh$A^FO+dbD`aoKODyZz;J-jbHbT*1HO?MjP#KiMcP%me0c zt9>b$p=+TYVL#z}y2RkV#sEO$ak^+yFh|XVmx!3s>mJtkY&Ym4?^VdZ#FF0OZaw?M zWJyR`rlc?|nc=iI!Qq!)KtB)22#YO?CETo10!i2i z3|y~yH&uM)zRO>}FEx%tuPsw}&W52CtE)->2k6D@SObEmiZK_pGF=x*3`sEM1(OxC zH1&AE_*&BY|0F5E^6ltAdNe6PA?K}@T=zv-ou-WDiJ>bRWxfdP9Px<)oo2o!@@AVBEOyb3Ut`3xBQsEQUO6H}986ZPKJ&e4Ic z!l8}%sbec0XF58YUHIM%<+m0wnVi~{6Gja6P^O!#$z@ttLdAqPXNbgEf2t9QcU^An zPYQi4`>r@AHtoN$Jub0JT3&qrTjCPiv!gqCcx0q^rE{o%qEs5FY%cZrXX~ZrA0;(LHwGxtCbW zV0hXq#lJeH>3pK$D&DhSi?xo zj2!evv`nZbrY$MwrqU(dRcN{XC(nOrgmpP@%z!XH9RHNyQZIuR7DviBI#Z@f&VxIn zstqqnrJ>CiJZ7|AUsZq^;Rl>=Q|Xf4>6AWvYqBI#H7o|99VyXu42>mkL2}>*Prxzj zwliZG-NC3JcQFkcp>9k!LOQO{duv+d-Bh}ycR8h3ekwgBHm@)-VbNb6fTtEp(bdlh zhN}dpMO`&>rl>;9TQQ4@2h~(t7|7_2Pa-~;%#(9d>5|^31>YWTq^Z~esaMZXnql) zPp(a+OZs!C^u`ywEXnP>L7Y+C?^6gPvx~Q6^cE^}ZYo{U2b|IeK9wvfqDxdWEM~mbs4`ZDz{y;`tzFZ9#(YOJ%Bc=y zW^HxsC;tp|gQ#mDkle%TopV!`bl0!!`=C?$gC8YJ!aCrLe{J?INUsH%xRl(x&-FkLTKCX^oySvQS&g;CSc7oQH~@jF|Z$!F0Vk9nhCAR09W)iD!*0&$3Lf!w0H0q047x z3iomyL-iWh-4ecnGLe=V0LLB?Zkr_Kc^8uQM9?RQLZZ!KIG3W&wOD6|!xh*X%Zynm~Tpw&7Su1ai^&UG^ zC>~#4t`^1%y?v)oZI%X`y>9HRa1%pNfsGEtA-FRu1>=Q+FrqdgD&<+Gu{>FSs!_=7 zy4>{K&Mjmbb5e32+4-%ckg}k}&MMJErfdK)lP?jG>z}qsjLycark3VCwbR_s`X{2f z|4SeK;R~+3VeWtWMAv_K)VIHS!^Y4z-hE%Xy$hQA586Y@Mm+_y>17)32X^JSuw0w) zgjp7rHF8V`FzSjfTW6oSP7$kArHl)3K^yCf$&1RnRg*6j-%PeYK_?=-dzkbaapj(NCe@q zIZ`lLZ`-7Y{e6ekNsH|tL| zzTsV$o4(}dcOoun`S=H882O%^+j4QdvQQa0+`d>?oM|8F9^6{nVwyI)RqHue7+X2K zz1A%DIT|fH6Imr<%$z}@dWhlW67U@@E#^VE5oVFuXZ@)MuiD*~+dTFKhc0JWc;fl7 zPa9nwsxjHdShJ0=s$G^L`Vq4!Lt~%@Z+a>#J&Bz*de%P?ZS;S&RsN5ExBUI9AN7ge zyI%d%uRrUyCq2-SZtuc2I+*G&R2BDL{|5;GQ)L&1Rz(0X&8?=Y^dk*0PsVs41*=Xq zXAjuxv@e&a94WUQmSA{>@q-a1^QX*dq4ObC#o6~JOHwKuy%WZa+!I|71PL|qSChds z1i=gAsp7&&I?(P>1XT%J=(S^YZV=Ey&P`d;7azUv!%pd$UrUyx_tMTxgB^};659)k z4zf76SMVZC+T}m#HjA-Lj*z(=PDE5Z?g~XSYfTku&P^5n>hcFC>=t2D?kyD_)SCu_ z^MD&3(!m*xjWk&%K`+3tM!MBe9|J&e26G?f-CeA9C*KKzcNdLMI=yI&Lk& zfF@DTB*;}_LvgZfdI$Xmh~KDSN`7<8XpH1cBq=c+!!$F@rJ}ui6(1~g@+~C2wKUg4 zjG;_(9io$jnMzxmCX>Qe!CQo}(aS{PtL87z&G0TmGr=lXRQgmJ6Lyn9B6*+H&aJg@ zXl=f{akQiDcxkft*um4=vxn!aeT&`0Q3KzhVDbwpK9D%yDqo(;pT--GDu|aj_u4^*OAeKBYme&E)|Y%){mW8>^U^P zR;nHCpE_I|D@`}Ow0Jgv1T|>js*VX37PA^mjFG?6Sjb^yu>@QhjxFm?HI8l9{_S#Hd((LZco?1~Q!6Ovayj@Uq`+x#_u`Tj;brB04r7aqoQU1uu`Q zFkoR29-g%}ye^%-LMsJ;t1&RQuy8__5@L`l)n3^WJzEv3*tXd%x+d5EoEUExW#MG>^|}tc|`bG`DiBTVavDzF@sQBqAhr{ zCGC;Cn@X4TS5E1@KT4JaL8okl<)KAS$;jKl+lEN_M%~7ovM{RDLP#KJ6lN4?V~V2%0)L*k7&} z#Ag2qp;Vd$&*j^%`!uTEH~HWcEtBG@>|$Vn(9Ruml_KJ1iP!8sexyt#d7E9OiHn2%O-95HZ`C^sm0m|wt=J) z9#;5AwN`!KsY1izAsNe%_et$!FdGwH-TfOAW7BIhLuZcmtR37qcxa=4qitqbNjZ6H zX1dvxGD+a8PerFJ+v3}&mh@ROvGVQkeli)Ygq>Z@Lc`AbQ;n;5*X7pkZl1v;Q0*^{ z?P5ix=beoKNIB!eLvP!1ak9H>WO%lJtJqmv92q<`y;$owIeP5mP}hlp zgWa{mea+ssh%n856|-1OMaO<)>G zZSEsGAFY7YVyyVgWD~s7jX;im4wVg-B#2gSEMSPsv(x9;6lMJrfz*EFpTFSki_ibh z&+2^of4brk|L95gb^QB3`((Pk3y|7K(LU~4ee2iKYt?-kgM&*F4&*}vZ^)hyzRaMJ z0%$`SG(xB&O`Dme*32#5aIHS|s#hd8J)6xK(t}}Z@}Nba z)^N_@M2Es6{lNo_xgb+v8>g;ptyL$vc@o#gzl+Z9TFtqsbV;9dN_XFuED8S*TgI#F zQgatoQCIjPh0lbZ7W@SLOrKP`L7M8o!r}?`9b_OY5nE$P`8Jg<=~GVW)t^q5 z$sm}p0yJ$`OIVv+9wbSOQJw9sN=i90Cc+Xoz5gBw7Ezwn3WpzAW6n*bOZv1^`u2~~ zQ_>uFm6#WbQ4oHJGts-p05-eB8^c}-#noM^pU=F>w6;JQrYNYTOd#qum`=`3rAzvZ zQ+nsCUK#HaZV2M2T(Fg!fvJ6}3}i6~x+m!G)?>$lV|f_UDPe{s=s8*q5SnXEffXkIf zHp%6X&DFFAmv>X?l0IK(dDhvhu1$h~bBH7hw5@F9jzbR0)r6lKvNU6LAeHt?o59i1 zwl}#8v9?466w{@2kRzAPxv6wXe_d#K|1;m3EJ^(p+%+?OB=$-T2{r~D_87``5a=+= z<6)?4pI1Mik42v*OzNk>5~4NQ~K1WlO@sT1Z8tN*oO8GA;tF5fRex# zVqPcmk5Ytjx{(&GH72s*D#TKjaSV%y0;YT3O{Givf>V0!kCP=;3}Mus3R_YW*GOuh z;gDQR8uy&uj`=O&c+5$R*Jy<`rkJ5NQE`i1rU)spb8aeK(mhV;yRW(~-ldotYCLqp z---F08jTLaM9y}EKlr!o7wOuB9$r0R^QwB_`O02{wGnnH8>76NN|*FEPU*exOO_Nb zMrfK5!W1w-Z?r3&4AK%xy0Egw&YXrf%<$TWli>}Ad0;rk5ksqfoKntBrAzvvQ+mmL zjZ-qTZ)OtMVAu>+I*up^g2nf=2_zV-t~u?@=xHjk6iRWK1cOrX>y0W!sLZ*kbV+~f zl>Y9j>ysc5kSaS2{(U^pQGP2iximVUH6RVyhSR_ubDb!0C6m%Bg|7EaONI5NYgdhy zYg6fx{>~}A^{vU0!uHo&!=7EisQ#n+Dd_TO^%#AHc8JwKBM1>saCqdLges-A!O~qe zqm=b}>v-haRJx=uIi;t5rm-YWOs!#XUJB!>80QUynbNVw>oyutC#BB(Kw3~@S0Y|w zx^m+c8bo&iA?UUFHkB^v%TDR;A16z)3_q!#jPN z#tQ=sK12Q&EYXOZXmsrK3xF*KXYF-|=wGq=c$ac+DqYgooYD)gesw%JDUa9G)q$L? z+Y3GBv2A^57lFB8NES5(!%4!Ry+D+Gj-cj}lLPCt;@IciRJx@5oYFmSO_s#E0F@qv zF#Ofz9*Wy~sF$X__J*+*3>G!wQo2UxqYVvj)_;SxFxs~MiWYC)O{Givx>LIOGs%() zx|OWFEAY{{BIItywDPCpy1-@!FWOTzw$(?+`jjcSdPExKxq>cTIZi3>rqU&S!zumr z$H|g>TLLq8q%a8&-&Id2G~@uiIyQ`qmgvAE^Pjxak|oZ5kaja*z?Ft-OLTK?DqYey zozh>v`iA5}k-e!<@TN%H*ix|@C$1*rn?O70P5%WidjO6tcqUP?}PqF!Flm z-Bh}yZ#kuF|2$bzO!uAE_K^8c3xJZf$RvSq7Np`NX9|;qm_X)8w5TzbmAYQ?upvuA zr6y^vO{Gh^-zk0bzGO*2K>Rvs36#PG5$TB}TvKqmkSbLE2?o;oad-Pjcka!vFWSpa)1cLBmoc zgyeMMErd0yag*UIGJ%|%N|*Ec{i0V=^vcZn|_ik2?I@h_62#Rm5$Ti9~V6HXFL=f`x^KU z**{DNSWU!?6YrXgl0+6}P>SfCcT?$-{<~B9;j3?qcS&BtiOw;=AZJY&S51nCGc20J zFblpiBCWRzgSuzc{g*z_irqU&S&ndn9>**=6RhXTYW>`_M zy3JQ~CiR4v;jhGl^kBX8MU0Uc!iwR=aG?m!Byq#s@x|rbRJx=G3N82l{nf9H2dAWE z4D2bj@3=`At7mdNjW!_F6k#u=_6lHmgGIAd?XfY2TJJR(4fSkyx1Yw47#aCDg>V1T3!%V zsR4Wo;e2Dl3E7fzZYo{UPo2`WFMNFx1eDsq5MH!~Oh*PH9>Q_JTy2V_Aea-CiJRf= zN4SGLQ#MCeRVnYIsBxj>-Bh}yD~m1nf8+LKNg)q2NLF6N^MbQeWOByGLQ%~x0yg2W z!3d|ri`W5`sYY`OVQKAS8lv6KQR@huJ0B+Uw3YdT1# zyu76_{eUFI(d1f^T~)EH$@Qj#0NP-!?e)&PsdPzCaZ1noX|g0ebXdGlJShjECk0rr zchC`l#sLJw z099XaZi*p74Y)HYZBy6AFg7!W;if{WVy~({CIbgmL<*O4Q|XeP=9K>E{mGK_0-<~^ z^XM{#KO*U^O38DQtGP-l><(NV@Il{Wn5YJWDJ~xfV)VeGJCJWv>5`uAlz#a2WJ%%I zhsUMr){&_Cu-Jhxz(Jhw$z$1I3^SH!Qydhva#VDIGn-DMHkT-sBVWq7sdP!ta7rJ1 z;Tz+@NgbnXf~Rxz#Q!!V+5Bs`9B*EPT=Wd+gjI(WBPL>5o=MQq0P-NYf>4=vQ|XeP z>6Bi6N3x_6u8Mmrcolp-Y@LH*5ck4RjbPD-<^CnjuLzE;ILvJJUt1zMqI4$U)4ZEX zm-H;B^wrNMOM>^spjcj(0cN3;(X>wkCnWw50+uf#ddLmiG;i0ILwhDaw2pf114aH#T@V{$;vSWS$FyOqF_-b zh)a1ll`iQyPU%^%`J*HVz)5G6y6$?+0dz7@gua_rZjqs*ULcZD+YB<7k#1Z^TJ^qU z4DuEzLXi0dft;I4m-Jkx^y&8}OG1%!9KnM|OJog=Wh5R3N~%6+b!9*?rAVG2=2pAm ziU3wro&q6~9(~BSNrQ83DqYg^oYL#Qku0f7WTzfr69>^INs2hL76`R@)Nq^9gn(P( zyok<{eljw6sj#Ix5w66J5Fn0Y>7?KlOdmYBoSRCQbd^(j>F1Iql{u=y{9K_f`iM;o z$U_w-n5!P;-&!WFU`3S}B`)a_z`)A#fD$%AO}>33_X~uA0)IN!J*CPVlE=ycJL&rc7z)NUI{%W3;cCi3RKR&bg^{N!Jux zUiSHKBufe^4(68bJ4&XK4m8SiLxqAoE$^2_svljy{z(|TJ5N0UfVadlH2E49c{i0V z>BYsCPyf-2Zi)w|hMciok{m`rE;nJ^#9r?YI9x*O%GXN4R}jyIL?#Ad=Ay3|XnYNF z;PuYAsdPy%aY{eDBUuvVXHecGx?o$Q-kcJWOANC1WU7F0ty|S)j4PXp3k5y_=t0SJ zsLa-)t&?+8>5^XRls@>mWJ#g21Q-DM^&f&mZkf2B4vXms=?5FEe(bvsK^5Xdl^; zuByC~P6?XoE!Un?Aj2wiZYo{U%be0zUz08=Y#_Y2?h%O`lL)}6Tm&hJcus3B9+m+N zD8#c+UyF?==dEHyX1!BU$K~8qx}-mFN^ko>vLv^9kwHXzFgp0&x>aK)ACODe5Vgun z4GIKKkXCt4@uoB5k@HE6*;*7Ox_A${HkB^v;q*xELSZ_PP?Sm z3SwTaicM_-c*jfgkJ)vA$XR32d;~?^>z#8`>5~4?DSi4yH^;lgeh0ZdDBUEU7NYg# z8#iy7r%bd2bPS0l%&iM&^T6j!nDs9J;tVd5t~jNfn@X4T3a9kCJCh|zHGJSenpT*o zciT`~TFX|jHY)TXQQ#wqnw5S>soZcMvzODM1GjTD>DsyfsUD9<< z>7_R&OVXV&e=hDbc!|yp(j*Oz&IAeykVziNF;ht{I}sKXCy-@_Wr~8?0FKwYlyg&- z^!!KfyWS~%=>y4tZ)kz+7vbe;GJHl6~!Z9 zIHE3+=+Mea+xZ#k6Y^4Uh+-BKylG?a@KS(5JUgpypRhnJ>cZ-4d;Sq;**{=HmC_+> zc^8t-Y|wUvEQNl^N1>!qR=EJDWh=N?@=?a8KymrIm?Eu#M)Ql;bs%D~&w8=p@Nn~! z4HM1#taiBnh4t~FQzl`bJUz2CGE%N?kCm(4>+|bJ7Y?l~u8xfjH{<>z(15E*|Aaoq z6annf=>Q(U4$7net$j<=SsWg+{#1kezw2^q*B6_3O<&UTp6`9?l07`PrOnQT!v_xy zZ*DGhcFa_^O8uk9*0)FIM^8?ykM(cPPb@b(H{hCHGD`z6jjuS+Y(2KAAPPcm3E8+ndNqXx#Lf`7d%0ZI#R@FI1?*UmjqYel5%b; zUD9iu(hZ+amc&g)MH4otn(UFFV%Nimh&U+&v`oVmJe)FIvnVc-Nynx2r8y|nL$y7) zoSRCQbfZ)H&Xu<%scVp+!$=cY=C6iU~MG>j6{Dhdw54^SHqNc%I~%hezvYyKA0>irdH|5z*=Bw2yX7Xn9OK|IV|awBfix1c@gDqYeWoYF1Vyfxk>lY&l7|r|m{^31 z;3C21CYsV}qp_L-!~6HcI?*ZR+*G=xH#(&&&!$UKW#N*ssnqJ@>keh`*TOns5!|v+ zmEsFb#@q5IsfF$ov`*9j#a3hk9`bG~UD6*prH_6-SyGAUU$GIT47MQ`X)|{nOjU6o zkT#*qj4KCK8m|UOBUANaDJF3Oxb&0(qSDx0o3bR6ci!Zbu6y$BN%Tf*Gh$LckF>_! zfx>u7O9r(ZL|WD)nfB_N?dg1`>IDYR+JjJLm=^MuCX!H@b5rL`-T@4&LlJzXpMYVu z+Pp+eCJNmG1xxf#st2AI^~vK4~b3RA4;GkRzy#Cbeg z$f^Y7EWA4!7p@&d>6C(K@000L6ed<3c2zOO0O>_QjWO0>W#mS%iOI{{DWIw`A1H`v z8U!GF&Z?9}m3qVX^Gh%L*Dn5?PirT|FV_c`4)(5f%q|X}81E@huZ{E{tsGn2Sg20V ztsm^@Y$_(l&=HU$8RNL@NQws%{SV zE*|WuZI`<{npH+XXi-_FL19MbCdc*h_|BA+Y&gj5`1R81PG)%Bvi?+~GTL>y>A9U> z8Lr~O6nj2sEJ3%^&SvEVg0g4><6y)TB$|ymH)Tms&s&_*?PrrE zVedu%S4vNip|;lMBOPZD7`Y^mK3!w#4b5WSE3Rb!T=v0Ik#bUX%ljnvrp`e@071 zORdmR+6ve#DorzzkPl)`62+3QkaV$57A&)hxdE_SRZT0pfOl1W*J@NSCxNL3>iO<_ zpCI7od{z&oL`xgn2N%zrTpeFOGI3~l>FC_d+Qf8sWq5h^(EM1bZ+PKQvpXtsMPm*y z6ugZjUpfRqQp3Rl!!XKON`@1i{nCr#Zr`hOTP{yb z&7WM`I?;A;a<;Q;c%k#q#=$d%g{2c`P9NPox_Nq`*}3_O<11Gt680fvYx7{HdA!D= zfvl!9)AiD)>KV>0>rXwHO76DY^xV$B+xOzg&cEBCo@6@u3tI9)7$Pd13X5~!o*R;( zcTn{-etjf6sAtwc5vb?j7jJmvSKrt5nRh+mf4Sk--=F!_OW*c?zc}4qQ`GZTSH#o) zI*G^nlvKkpR6z(-dSM8uYQWIdR#H(xk?aC#jc}AEE5K2*?HFtTj|>GCz$0(`OK+{) zToE6C@||&ORk1y>aB!+A!p-=j4O6v=Oe!fK8~D5IR^igR7 zha!Vt6P_AwNOdOC40$D2Jr#@QHR6?Vhv zVeC{oKlaGWZ@aYR?9*TOj~@S|ybo*VazD9QU7lS(K6-4cW4zeCyfm_Xw0(GWVRL)6 zeQfQ__-Io*Ga!@Rg^b)#O5X~9KuD%9UVkScECb1@U}{-fnpuCUak=lh+}a%%x!k|^ z$^UgP&ux8fer)JSx&6@5wvCbb_O;Qmh4FzCGxe3up5C_J{=@CfE_XOkc)sY8g+-?4 zDhQ!*P<=4#h|7)w%v8!O=a%)S8t1m_a?^8ba=GVz)tX%HN~a*Xh6^_Tq)={15m|wn zp(MLD6_3}Fa=5f}xo7y_qm>eNlLwdUa9tqj0|&%TNY8%o(8{&IC)P!A`S)! zegVcXJ26MCO~ZOpU9-H2@y6{*6wbSl6zf%3$8WMV zMjWuQb%(H-GB%;98;Y%=p0ic+=n)GqVt$kZ0ti7>8k@LTpQ#IE&Pw zkAi-~Iw*^Ych;Y3e8jsh_hP~C6}Lt3+p}|1+0@pK&#n))jV=yVPEB`A%pIRusGn&Y zIn#A)ZfLCMaI@eS(=TXhDU|5A(c1a!BW}t0Xs6*&+7!H?P|7n^Hramap~_~Lb)Epr2kdZjucAAQY`0}HZr zNwE?9UjLK`et93(PVn0}(zm^Ne0X&J;HinB>Z#7ti>u@9rxs2v4Gx_i89F-L6rM1R z2n#}2u2oSKD4^3aXBQkQoHMqOoJY-&iIkP`ry9X;*X3R;_+9y}PY8Z{cW!elBSTAT zC)Z9N?mFFFK7y82A0L<>ULG!tj7+YMOgAO7sT=f*DYP*k*tarfAsW}hokYF~Fwq+~ zqj8f34$JyejdR;|xfcz7xsR+#@Jmb)7Q|Xf4=9F&v>tso& zBAQkhPN-{g#u(F#8-YZ??!z0b=(P$+K_NOg_(^yPAxh*3V(g8%vH=j}+f=%wKXyu2 zKILuk;5eXat!u6Mf2<8#9)HEM!V#a1J(Z)f0-KHWf!bStL z4XGS}hhLX-Q|HW?!ijK=uo}iQk$F=O0}Be;SpIg_1MO_UncRhT9c1ZWrGkX)V7cnQ z0Dueo-x2s=&K(^{k0yn8cx3ppfk9pt!VlD1dIv`!O!?}ani3rg5-(G>@48k%RZW%G zl?#qcEs8DnQ3@>_8ND~nun@Z1fUaPOUid8WEun+gwBe#g=^pl!2y*f9;Jrxyl6)gR z^gJ^f(tIN{&jLf(S&}6%B_PTGiJ7gU!6l5K&?vAy=t5}iYDkx`X@*65tRk>{%uq9A{i(*ax$AOk@3;VHN{BUyA|7pGgG7G!$&KfYr|tJwZ0Q;{U=Uz&UY@Y_Eei48-GJqB6^5GO7)h=%O9#jb6~)m z_K9j7iw=D>!?9)ksm8JGy4)tmmJn;c{E8=IiR|6EEpM(JpX;63IyyTzxp8FR@R`by z6JrynPPfmuovI%m=wE7fZUj2e+Ncj`y>QWxT3H+LuP2?SCc?9Y&C+UTIJc}n)i}3Z zmz$p3x%gbmBOYJacjAiw;fhD>yQJkumtOJkeV4Xe?ms-NlZ|7YHG;OGA{*SG$hf98qbzx47>bXZd? zQ9M*VW*;iyH9!dBaCy-teNn+|#`RYNh4fs>iIy6pT-!A$rrIZetMv+T^-X{F+vbtv z{HcfH>T>yDb?NlM)sBVJ^HUSG_NC6D?d{bw)s92c-JI!WPYpDC(cv!|C&U}IV%aES zm%UtoGyxlw7Xw8A>qZqxmU$#ue=2>^cVBMp&VO~DCMh|4WF!v3l7Sc+#d4rccO^uw zTwDN2v0RmB-*r~II`2kdf>&kIQ+c7wR8Ae!}apgYW3Jg+lisU)%K0S`pH9^>!*8br`d|0nmaSn z?C^Ed2o9KQa^lxdWaFS~r{fz+0ee$y&-@~?q6$Us4JxlA2TL=#oMgi%I|NZAa6164gPwkxj z($pNde5>cw((uIm!f1cb{PfaR_ld5#Lx)eTk8X}O#Xv$P>Qcp66=d``d5?OF%xT6~ zRUtv*G<(fR$Z+;qf9k;(f4AkrpqHzKNQ$Hk0A(v;NeB0e`pU z*52^1o&954e){15T=K*RoV~t0CAS#vTgAqpRF3|D54I8}@I^4RS|(;w20G2}m~_tn z4Q~pNg#X{!-*Rco)q|4CoWJzY(JyVR9Il+0tjx`B9PaI{Z*Lu$KQX>|Y@=LRoIP}; zygJ#mhT$lH4lJ`(u`tsj*Dd8IC^dPc>fqU6)&X-4o6~`grYw zid=A~^0+c*X2y^QimIw94lyqXONR`DksD?#>I#OB+gP;mQS;+rG&|b}IrpE%Ld^S9 z51svTvDUGR<(Ni=eoRPlA1h?sSo*NP5@a^MgAGxbyzj&fyo1^>??gcU5{SL)~i=_3owZ zm5u%rmD;iH`murI?QLh89X_F^ZnBFh5iEfP5p7JM3PPAto^EKC-xh1K3@?7xpK2Wb zuFI{x`CptL?|pFhM1e_! zcKYeS;h?%x6{um5GsqKBMQFtm4MjU=z_#*(r+?3P1|I*Uyg&BPyT3Fyy3so`TpjHi z96MAQSsyt@z zHtSC{g8r_{t$pHvcmG^z(-R}`OC6+1GOA zXWw%fqDM~VI$GBP)C zq^~qs8>$@K99Yu;I&ySswQH)``NRJ7*6J}do_0)!D*Qh1?#Rbu47M(^oQ}39!}(|Z zsRuKj-IiN>+rK?O04Uj1E{Tl?y7I{Kd}aO1*-u!c_{ z<{(*F3|utJ(=Y+;8WgN(-c9k(&<>0dM5OcKqR}QsX{@vG(kDzW+?%fnR4wms?HvA@ zk=nq?$$`_*6d}3bBZgrvkRfa& zp!oqPYovTSFwML__0XHYTpB+)vDtfOdhy8N-s;G>&|U5yn>;pL?(3i5+${GtmEt3q z=m9aV7Idgje9k z9FZJ*R}hsj1Tq|c)}Ly;_q#5)_OV~RA22z&ngw6v`nmHA^@JbPvF7Q_Tzu7cbNCbc20e%y1d?fYJOs&qyNnI z>4WV@yC{m==Sr1V z=j)Tw93J^$oJ-Zl4vcuyKaiKo^-bQ=jh4D)p>|~bsmAH=y4>1Ve&hVpPtas;6D7{0 zMaFJK&0#Gsm#NWEn5j-87gal7svEAv}vEviH-BYt&9diS76SdL4>4}wzgQJIP&CVX-ks`lLlM=SqE>=_!T{!L| z1f?uPoT{}VFgGQ_ zay zZf(xaOrLEZ*Y39`Cp1l2{+e5Fnq0mWcjoNaomu9K&l)U_zm{T7M5!&W3jzRjpD+Ru zK(Om_OzKE8#63Igqk40H@o;PJAGq#weOP;Q|HtmZ|3S0kC*6Y+VS#&&mf=((%-)#E z=^oz2bS>3%$`x8hXBBs>Ba~5`+Y45RyRMW=I2;Y^N4mYa|GM`)!^$!9QIFUCc6a;1 z((>Hw#^~DgOnLS0+{4z^?n3=!zp{9`cC=l(IdI+c9^`8sa`=enrBjj>e%>g(%A*=) z_z!H0_D~@HkdNx0ITsH1^QE3#IAN z8^y_ufzf?X>!R~TMc*L42+_74VB*GA^CY1mkrFnrU>)Mr8TL{AQ|H3r)_(RGC;m%H zDF2V!R&P4kjpeQD1nP}qEil&A>zd_RNrMXrWUnQiGUbfw**ArR9x>lFp>}TelM&5} zZ~a}>+uWx;p8oBPdzHi6)3@8}^Nsr4ak+DR+})@(?yb)qwpv@o?S;cZhdwesIGl|c zjvbk6FfFVhyg=N5h}h7_!TjA}O6S8qs=xRz9B%FRgQoV9>5nj9TY}^)i%vhn#4E61 zEdhYBVcz~!SDOznF}cr8}kzFR)S3uZmq0<&@ON_?eyiVK0y2s6iccqt?=mwfw))60*MCk0u@%+L}`*iE=^q& z9VhuPIYjw`Q-(#2F3y}(ym}WXGxu5NbHBNAwsBZ$ZZ&Jiw`YzjTeY)|?Sqs1~Epjji7_LF2{VI@2aJ#*Mc_2>S=;nsfa31lJR zIzSw~~bl^YtzE{C@ zG9Pw6`|GodmE8yRt&QpG!Scz<-ga$&uROV0pRe9%P1o{R@X%`}h;rZD0!+YNXx>-yyT)mgzfmkuRfV3^@T^ zF9aE37OsY-7T2lm5#%{1mja>%6x}7b%uRZf9@|FZtar; zu>}%jUQ$ZQPD<`!zyytDn$jr2fxw?uiJurraJ1X4Yots{soDr6M9LS+6?=34COF%zjKPNkolt6Nb_DtbqcD+4x0Ox z?%ZLKMm?sp0Dgsd4YfLq!B}I36BEUDwKhx@W!Ojc=l;Us*8cvhKeu*8{!AW#rq1bD zd03NCr+9}Lh4`5RCxxjx8`lJ#fB0Z>P2d24EJf!IZ$@!^bj$wMcT1~sA9ggSobZD30&yGSxEc0Q{mH*@xC2Co z5n$#{*rTQY)1PYo@$7&8#nPMomn{9bXu~i})FnqHz*g$%XaolW0sBFBih2w&We}*z zP-=Q&7kDTzL#?7^YF5H*sb9SM-nTgHb02lS@^_jKC#I_FH&!Z*+0xE~`H7j+-O7!_ zyQdG=PsblL%L93t?9Vv|MyFogzqF>rSfHB>WiTgqho}S>gJ-CVcGyStSN?^=t^LHn z0tyu{YeTiQa5oOe0L{Tb#Xf{q@;nk%n&pG)|EPdfcC>^-_`a&R4K%S@r5|Aa?wb{_ zavya*_uF^JiwpZVHm7e+-?(>N+1YMame-m~d*k=+P0em>&J8Rah8b)C+(BWXI|R*Y zJOvl@TF4>M94k8Aw1#2m4Ew15++R4{+6SMQ``@(gk)%a46%5Q+^dnSD?oxf%`RPLq zz#(>li>pfm#B^4S6HTu4AEl;o`F3O7fA3RIf6IRdQOJDK`P84TF4Z>H?=Q~GEMYb+ z9yB%!-R1G_{OVD8ZDw?BYoHAU@U@|3S*5HIv;V+XpcLb9=aSNLVpQ@{l%X_-i7$tJ zRDbF(9Bv4JUWuP`C6%oB9uvVwLp8IEb{ra2-HXuX@GOP((Vs(~WO12tzed!Jx<*NS zUV@>_S);G>Or_e~N1adk?$&5?^4`wDLjCU9!T5BczEnOcO+G9YSEm~bi*u#H4i=y? zEyS23gSLrhqIbD2*qmvU_D2xvc+J-3BtzV>LZzV|)t~YUhg*B|6XNnXG9NW@12e<%*>R>H%`0V8;2*ejR&ihwaJP` zT#cI#jvw3}DC>_dXbwu*HjyE=v;)7zoB+9{6OBpn*|7xc?O_PW!#=9N>@OT{?dPIa z_!7uIVV9PKY}>_(F8nC&Z=psz<$_A^=JRW;nqGGjKC*COKK8b)r(eyDhNq4E|GS0xX0xp zvO4Y=-ep-CO82@Vs5lxVh4(^>mPVLHbJ8Oqzd!hZnU6Z3`@QP;#_`HR{npKeNxnsM zYpwa?%EQyS*7Dq)J9FjxgAaV>_8>srf0}y5yQnN5#r!gJh>|jdUb5an_wiv4{2?Fp zXysot+}d-mGxsmiJw%lp$HOYIKlPP@R7M94rl^XuJm0iDDYQm45z?AB3R4lWSyfzt zS@&1NV67P#&Ih=Yy%lzu`>6A|-z?s(HfJXmYV#OR<44u?gX8M`m6N^3@p5xw=d4~C zgeIVO^RkBDpr`A~q-0CwBT7bG49PZQ-{{Ry8Rozr_EG)0zi_yS_g@R%9I`R)dPuP+ors7*O5A4F4GqTC%Ov^Nn$J*qeV7Y}y;ppb$cykZSJ%1F{-ab8op;#Fb&Lu&N) z#Tj89#Z;F|I)fT9o0UZK%nyM2ZKT-`c2b~83Y7Jz$8*1Z+*~<$*qGg3x>;UaKdn_Z z?@jI>H}`jVL2ecf*6t59b8$Io&BNA^sEXxJ2X#w)6YcHz;%M_7U6R9Keu#5t*hlr( z{)NM>eflpCx^dBM)Y9O7sc))8DI{zSChnb*h}q(<&74!ny@# zJ-Vadfe?IZ;8Qf|5M|AS8Cx{zAH@1Y%>J;C>d*d#!>zp|taP5ZaXZob90jnRdG3+Gn27Kg6lydQunxvo<5AlYEExghVDfsD}f8WWTEBZ3{^TrBEA^ zN#JliAbV&eG||@%TU> z4Pgt74z126Rf2$lix4aY6?hgR3guf9@|F?&o2FkBH28Tj?EbDVtBUKvqkFVYMrybrdPe2%Om3D29Ul z5lxx|m|8y~2+WSPm5`8LeWOXe(#xhpuOX@F2)JF5CJr`R%ZedNlVJ4Y&4nuOGDT^)^z{ z(T*Itpy#Zko#Pm6r!2taEhtO8gbCRnduvsg%c&R>s{EpACa>;$v`P^?D z?e6c@Iy0^M?Wz6F9tE;<8wfc`Y>vszrYPJc}mS-1zmNY#9Z$shJny~)3L zxU~;GVV;&SHB6R@Hhx`;hD-qSPfkTd$X~lSLOP@T0JeMTX)B9?Y5?xw+nZ-4(C@NEKWYC4kSilsA~#W;VF#It2lw!%licBD_m+~ zwJ`VwObrw24Ew15%D-^9wSV?Rf)y-eR&IP4i_SzPALk>Dj}|->oYAgc-BY^{GKa43 zQ^AKS3!9-OI@QZ;fhMC7X1@Qar$2Jl%Fle#phmN^NC%`t-rW^8CYF z8#lIgw{dklo8^HDXUwxuL{^0Z;bN=7mum~0qY4zg9Y@Mks-dzS;?NoPQT>&F;c#nz z#lnBdfgcsaBK0PLt=4tgrfV*RA0n17snW`Dd6rAi^$-tVH9jJ&)ksquHN?1@v1wWM zITgd)C!NoHw>f@$w7qj@w{~~z?#a%r)6JvZ-P6&B^&9I;vkykA11p9jDzhq^3iv8- z=pxai7AA$EMt{N_MaL8O)^LieAs^MB`3r|z`{gh1R}2$~sjaAfE2drd6TmQuM%W{i z9q~ns1gjpSQB2Gjwx&e^LYLG^6AQNhm!njpeGFn|KI(kR&vw@v)y0MG>;qhcgQ?xQ z^4-c@qcnT8wp867Z9iNX6xPT6sFR zto)O0k*w+y&vPivebo8%pR7zw-aJ`ZZXa}RovltEOr1>4oZLLAbQbGdqm9E(d(iY# z9`Wp6$rh0#YC<}dta87V6BVdt~Ibwder_ukz4t&P3ygTwX3iSlH9r!aM6wRyjA zQ0)v1?X3<+d0Af0(L(mBfZHjuCy;=LJGIkZZUP7y;+7ruQT^G!aJaQ!eZnj)(E%e@ zQtu(&BvyvrnBZuvqlZqkm#XUOrm3pcq$CGNM#slI=IK%qm4<8fquEbPSmdd!hn>%U zcWr!edg;Oascz}uR&{4|d8#vYcWwRPXy)#{#XA#=1JyoU`mv|UI9>o0@19h*%l<~8dwopA=nA8t$G-;w5t$Ft^4*L zz39HpebnQ*-#$5=+B)0Yzk7UpWoB`Eb-i=2(w;0Y?sR81mWwwQHwPNwGXN@(Ey)AP z2Ano+-Qct~r3#KFQ$l?@D-IpQtovaf)nE4)4!8FGFYhRojPUVU!?;kNjgXTI#cC|C zSP=xsI=N3epZfdN&9Y))VQc%Yc8KNu z?#A8mv*n$sovG5TvGoVr1Fu`5Fzu!&hbBpvQ1TddtHJTbwF56WF(c(I4O224_EG(* zzi_y=u8)@vvjAK#DDb5zkCD0~ocJ!G2a&QNke$wt)Jo*Q66>KP{*wp>G zf7>?&MJMx7=X1Y4d$7HKwefr_2>S=;nsd+52nKZ=FTfAa4kOqF+chL{_X#miAd(t&ZqyRFgf%9nZFT$M#?r#d!_GiuE&F@qD5QI(K^hI=S=WV2X-hR$4dXP3m1Q%G ziO8^z>QDcL!>xVx2~Bx&<;`q{?#M@v`r}^R|KZl+Pxk8W^}2$em0Aj!ZSL`Ootop? zs=<-vSy2XFRyENU?L_v)A5i7F9D9X>S{-as=_`Kz)jM7z%*=e${XXFmO%l7d2h#FPBv^&ob{>m0>6r;R9!E9men zm4`@fhkaCU;a@!5+Iyb}Gn2GdNUWBLxx$%CakhdR+Zo~OCgWm}!*Z|d3xKMs)DeDO zjH89In?SoXy=S6mNLrf+I@}7f9`$(cw;$~6&7W?al(u*0Zj6;~-y2`5%(a@k3!}Gh zuWlaSDh>pZ<5C(?6i2sb8DHbg%&m?^hay8rg~@=3J#8hYZZ2FoB=(R-(WHS2C1hP9${JL()--SZd`<*fs3x7s(SrA@@<| zbH3l5xVwM0w0*E}(B7>t-(OlDom}2tFRf7+t?r*a7)XV!U`0dC(0LiE3glUtH+fI1 zms>WVTB0Si`wCJk7$+=#rk%!(cEr^v}jCzL5p$RSqzu#f7`{)NM>{oN-( zPXJ3QH8#T3ZBC_$bQxd*Asj z*I@XWPdlIflj>&UaKCzU^iF4DePUs>e6mwK*q?3BX>)jQy}LiKQm&yWjULw!4155B zPUiAMfGa8;bPd3%l`2)rFhS<9kLpkVg~P4A{Rt#9rXS(Eq)4vP#=xR&!2U-wL%xq^ z&%^?o9Wk?3*N~mepLe6n3M55)rB*~Q>9BuPzRG>n`P?7W_f`%jic@zF@3$JuE6v&c z@uj(m(V3Ht*4pma+1U7?i#8@(g%$-${faXh4|5uR%}z!tuziCq14Xof8)E4X`>6ih zUpU;_KNx*E2mib4Db5kZzg}&uKb$XA zs*9zgll9%%MrUdN&fU{n<=gv(z17*}fqn`j=znTIkQ`if*A+OS(*&Bhp9DB%kp;D( zlJgKtf7nMoI`uCa?f^_DiQd>>GK`1nRORFqM^HePRH_ZubvkNC`;+cyQyHZbfhFhI zXpG5j9*V#aCKzusFuh9m-G&U)DS>~BnLA5E8UtxxaWd3e^SpRH{lR?cqTn`db; z*?lm#c{1qW8Eq%>pZX8apIV&qqu9H}5r7(;ZFDr;;~DM^LlPPGQT^G!aJaQMN9Tu^ zQ1F8#QYX+S2m@(0g=IREkNSVbe^Lm&^i=t2vX%a!IpH?xP7Vr>E>du-4zw)_D0Jm7 zLKSkK^f^;Mb+&f9+`VzDcyQzFXnJmeMq_{PaP{m~dvm^ib~MnM)F=UFU~VkBF!s@c z0Ick)f|5f(N-6Q;c{s$vANEm?rv9Sg*1r8!i6!z>FP~L|YTBSQgw!$4Z;A%R5<$Po z_LFWdQ%}!N5P^P)nh@SgO6n3AfoH$ZNy@3*5Lu5ppK@+{Yn$^kjqUQ(SZASda8|D^ z-rS$QyENaOxwq4Oe@+8ySkANEoG*}rhOwLg5qwkR@NtS2IP?KyddSTh(zEv+8( zA^;?F({}odA|wFD+wfVuWd8jsx@CI<9ILrlFT(kTU*wyU`>4lrzf)Ro&UM$v>i4Hh z)w$W#&gT84=^M9ZCQlEW8_PGRw+7l!hn`s)C@%>+e+hZ5T8OS8+T+;5Dq0#52!e(} za)x|VZ|*N1?f{Wt@G#L2;M!I`9cQ%F;JaQgjwqK`+^h~BQ6w^BL;cp_u7u9BYedKo z;YS|$-+a(R~cm}4DyY>0Dy*hlr3{e{D=J$yNKA7_pup5tgk zOb`}DEPZeTU7TglE-uv1~8Enm20_6;^NJ`aozU zisfNs55qpHKlv99xAxlutF;|cwi>^O4vrL(t8grdsFa$aBXB8nBm4?n-iFMJKp4R^ zI`Qgf(FtGeN0I#>)J680k2;_GgRRx=liB+6dVO_w{^abmT3XyXt!`~?@2!=O9_U{_ z=)A}6ZV(pQuDZt4bB2C^?-kjStQPmqmJN55Va}XkAJw1x3x`|#!9Q!|U;CUso+;9S zYD<_xzGks2jXP0fu`+7j?}(YvcoY-@QRc?v{Gl)mL3u?fj&e^6n%;SzBAwhvozMM# z=XU#GbY*3H>R_Suu)VoktuC&t-kiEyJUzHMKE1v%XznRD8+?$14btEU6x1kitRRjQ z6;$P}QWn*#Ziqu?*hlr}{=(tbe)tLGKJHq?N;tQ}93USdPD5ObI_)*0(R~O#i*<^& zupgs*sH>{znmuA&5oB@h=!?qV^*a^oKJ!tZGxz1yZg+CFurob7R+w6t+1(kPSgN1S z9^KpB+$}feZVjA!@`e(9m@W#IdWYCke_h@`Oh5UFVDr|L^5KEQ%>9s$dNlVJ4Y&4u zRBK-%?~D^a_n>%`(WagQxeq&^{R_A8pxGbxs2F1Qhkeu^?bLaR?jdGB_o#R@`>D}S z?!(S!|LCmUUbwY$)>d*a!!>xT} zaI8~rbfQVE{=!kvWRyh>B#!pXS z-;&aat|GP<8n=`pFp*J`hnV|eAJw1x3y0eyBERI+NtJT-Z^=kB(%`aJ<)Fj1LYai& z5|#~)Y9sz2)&4!8D0PgHAT_F=5;sFvUa0z>HW z2!f%-b;UJ0PyVBtt6~M}8sZ9IzV4t$i!HbkQa_p6ft!u`4W=F#n= zx#N422S``)PYD^%UBGjudLX^m0Goy-}h*N zQ5UU`UewW8m?#KOji_c6>_EY)e^L9DKY|adq_m&F#63 zwduy#Ok-|i;a;nBHqfe3aDxG>g(L=`QVH2FIt$Vf+&lC%I!jh{-mMN3;Sc+${_I~k z+@4A46SH4{mGOOrd1w$%=Ah8l3`IG*MFS6z!Wnnny}*P9bPpeA1RmPZ=y@B=%}2AJ zYACr6JD>g2<%7-k&4c5Kg*(SH&E@6$XZ72ay$4(O=S#P-5xO@9t^EjfI88=tAD%xN zQj-y=nxpG|*IwRW={2eK!-!UkEygqSU~;ISqls)3 zPiP+4mcpk-SeBOA)^Unbi&LFry8s>+Ob9c(WG26g^ScUBLM6@cqg# zl+0lt^=Ro|G~C*YPfUI=q{sTNqf$^8{;&^> zy}-heYZrvsqY=f3X+E;_kSdp!L+#rn<0X1#lMf3(@yo49-L=zeqTXl=eRcW`p| z;CT0JARAeBjc=@dScREzR8eFv+-G1577|PiV2-~~9;SXc?4x?qfAMfX&$-{#Esp_U z9pk2fe#3=;Rh^$e4psitnYM`EtJtqu7ltewW#A^F4pYj=a;xX(ezecdec0pK-+nN8 zYq2zaZ+W^qR;?_o?A^P+x?WpdUTkbNPv$lr)CYl#dX@0G@p$(C@q2GZgR#7aozH$aq}^N?TfVh%XZ_aZ!|Ku9oxQ`+ zg_#?tORc#ZwS$4TZp(=D3W>pKMSvNIPN(e8dsvYaWFlg~scQ`*wjK6SkIwyzhFkkU zU^`FTy2##b*8Nghz2^wBCA6F@96P}fRD+;A?r!_H@aqqu*(QD4|;jV&yUo^)9&Q2*>#>SH&ji(}>8qk)yI(O|_g=0)pLHfJ0K z{VQ|12#XXjl(zEG-K8@OJ#*Mc^=JRW;nv>w^0i<1)Rk+zhlutyiVR0)$bt6Ej2Xk9 zqhQP|Gu1;yX`ompnk@i>?a&59sP5X*BFyXGehCkG`h(9t^W4Y2^ee`hWUCp6ITcj3 ztUnb~hww9uV^6fJ6iY&03{7nWWL8SGq+mj{T4L8_<2Aak`I3pRnZGr)aA$1kjbF2n zUQw8UCCjP+7YU)AnvC61SjSeZI)xz)p(VA)P~li=)v6k>j$iy3@K3yIGreN&L*fILd40y#@ zfjNEI(ktdZY1$sb> zmScmAPE6Mr^onq$kjm=O2Kl3JNBH2<84`h#VuIkz=BtPOw*wPy%npT?Gwk*%SPH`V z-dD_gNPNXleReLsqF9`YSKD^PTW47~%<%##GX#!qoURnCCT|{wqAVTs@3WThJ(OX! zCL#HH*;o7}Cq-`ShU@RVgongll%vHf%I!F`1x1S$QI)BfFxZb;R2i+NY#WNLNL&w% zD&K4wmCYI$GQBWnSEv4(Ke;&d#`*E(#XD2;QwvM!ypg{X3rG7pf?K+C_KgLXF@>wY zA{519X?>Yw`E1sFaVRhEFRlRSCD74A?=xmTB;N7)4?h*}h*{&K5t!hn^DyGmMY+#v zPY=u}Ua_CiP?&R3v7+s+QL8_b6BH!E*mk@#U-lW})(Ca0HVZ9Br6KG6!b_hkH`N)J zb~!Yfp(9O;2?h-!4$k^CMda$zhMG-K>TSl%hdljrSDyiN#4DO#F^)y3DH>mJB_HO(Sm6{#*DJ6^u+f|4 zQF&_Uk(nffmp&|b6eI%y_R>zUR(i$Uhs0+5@W;O_tyJNVv_=y(84ZaR&o#G%O~~`# z(TZgPVCVXX@#z$WOvDb=v@E<_U31L=uc+)wc{j?df!(f~k=~AlA?={<0Lp0cY=JKg zo?1^AP|T~=edYWPCv)8?D!ql8`H=XE$`oGFrmBiJqA53?vNbDE;^x{!v{583*nK4~ zbIoYD$)$n=7uCMz(dbT{f@NB*4S2=emWJsSa~~47hMtJ=iXj)|c&3*zm1eoi@scyA zw_ye15^OqBgPmS->oc0R5l4svxDAlY2qKYU2fSiQTt?T=2dEH~L4*>Am8wNN)-LDu z3HYxls>fduw)E;o(een#-Pi2)BDma##BuXmZ~qhVilIy2nEUQY}8EMymS1eSW&)OY2NTCxjB7dTTAJ7@`I5N313Mj@v z>L~BRL?x$Z@ruO;0x0=n`ii*^Nhj*x`jU9X0;-Y20C}M#z2Z;ipmYT4eKJbjQN>c0 zy0CUZ=)?yw@g&1ej9~p*;3ESgxJ-FRZ!cy(Bo->MNxWk4Gkp_1nW89-SsVQ$MujEn z=h36d=MCdT&IY>Jbg3`JB~l62c&Psh#xMJdarfu4%G2GS`;fF3)7>9LjpWy=IeUe# zdsy9YYH)KQe|7{hArXN@*1-a0_Mw)bm^{2_9YL&#x`Xb1y5*|yjO#9Gswi&+%tR1L zt_l*w!W7ZD9<<{H?=ZijJHf@o>UC#{B%8g>nEQ|v!oB;t&*-XyqSCd;Vs(lJztyQO z0f^&ZG|ad_*g9tb4CsI(cC8@LwPmpwy>h^pea5)^9nKNp>E%p3L)x!>3s!*iUCbnS zU@(u(#u{h@S`t+8ICoIVZAP1c8F5;vxerO3v3K{=+ZhQ_Aygn%Cm@7BnCNPNX!uEF!rnSw7R@-%*J0wGZj zLr|LTSK>OTW|ucsr>Lu7#GJB0ClBC1Qe+wRfLD~@vIR?e5SEYRe(b5BFeuLMqv%V> z9JP$!s?8H9SVGFL4Udw1N}st}r5C~FJ|s3{FV}D}5JX6IZ5koA_|w@EJ)nbN)U_rX zBncLk!<0*?g0?Hoo9TAPw3Qp}%g>uwsJTsR(pSuVNPNYg{^XyIy+{Be02Z)7Y!RBH zDGd4mHj^6-MCxCt{*fR=hg`1X(X)-Drxh(72n7e-{jPecGixgmJmg+O3XR+JHWYfB zJ4caS5tTu(r5nkVL3*feMZYd5Vjs$y^~leqQ250yZ)z4yTcqX3*M(4xUFZ^=dSFiwg-uTrA~CWqx9b z0Ch|P`xJBr5r8v?eP1=bV(vrIS4@j^QgJwCr!GzKE3}p4GLQiHpgpb-dPKA=D{`4DMdB_;Ld^gq=>C8;v|@7M{5l9E;h@F1?rW|;4T%^l;8TCipp_mYao`M@*5x9N_4b;W4j_SE(4 z6Z~>UQ#G1T|L51=po(wpD|09{@vCw$k`ZN8LVYNOPDt*(dUF3`DI?uNz`UH%#Gd+hf9Cod zk{5sz*r^4Yb;BsKx8&xm+|jLkY+&aj2g`0^*2C{|15$EmExGR#r-O0 z7QA{-F;K@*aSlz8|A@f^vFlK;4{0=PdKI|Py*g27h32Z6sl@2drNldmaHo_gD2MQ*2RvaL_SGk_ovC`Lv0CbaoJ$yH^5179u&L(rBEX5E;fT zK-5qM1R)I*0q}@7BnQ{(m`876G(tj|v0Ajri5?Mru>@DWx%t6AYu#iDYcJ&Jbv*e*_kYUbMrE+3_V8YnJZ~_ zgm`{zS`|f2npg(i50FAd>#ub}Q2wYQ>6NCY-;!_WS0@7Z1z?QoFKHcr%ItJ)@>uPX zA70^6-PJM>A0V7Tg>*J3$p;0UC0!{vx5q^R2LMl6T^_O1dTY=LsCM@wXEKS&;?E|rD zTRED}JWO>!f?>u7+2_)(1DR%ZT`_myiX=k4xhcTzl9O;=6`v^amp z*P>eqIyT9?iiIE3nbn+AlR(3h&k5lxh*oOK;Y8T}8SWU1c3bK9#sp0?5-w z*KYg_febPd()+ z9h>6NZdjj1Z5uzNmR61~zzAnT))5JldWA!;8aBKr(Tcj!B%41hV8Y(?t))?_7y5%B z7S( z?r}p`F^|@`QGbTmI*~yN?tacyNcApKXDY$3ARDL`y*bq;eFA?9FBASTdDLMXz~ZQ4;4)LgUUXW4*@l6W+N(3}jnw+oculDs@;>^o%lONYt!Yz$3<(@E!5iNt4h}%U$9XeZktDlsF`@ngkcBu9Ab# zq%i_lDCmcUJ6Tc$b&Zpci!J~t?<1Y-0Ru1m1tC|azBi2~mlc^d)z8~h zHjNY6*6YR;g09h8F@r*gr}VDC!spmsA-C3FPg9m?3Zjs=HDBQ zfCdRuOs&>tk>cT?LySOIL8Z~8EZS>ojc8V|@Nt-=B?zZdJy!tOqJJ1e+;M7kq8ACF zE~$kuuJjp;HP?mcdJ|`b5VZ?)b6h&V(t+~_E=~y~-kqo@8YuazN)Vt( z4xs(^8W6JqABmP%C~vHXft=kAG>Zpr*~S~Gqys0H7nLr~OF3|Q;b<<}k-pWtg`*;C zGr$T4Q0-C|XaFPjUv)Za|k4}B{87{O+1i)CAjNnPl23polvy;7YBCL4fFH7<= z1-kvPLOp_oB4+9+Doi0vl1Q$rycR3*|4x-s$iav#z+&N2F0<%J5&{^F0$L;wQ&<1F zfE3p=E3!?qlUu+^Yv*}q4tMSmfWLL_d-Y2F4RG2&11VYT<;E$toHWX$_P>^zk})9%(8*f(r2-lW8kcMZi6ol#SQ_;1A|BLc2t|;e{Wq&27(`Y1Q~ve%49tye zd-p>$Lqr9Xri&L5p@bmOzzM`z@TtZ14%3)nc|GdDD0>nYsj{U>^+&=jVCw3RjHJXW zs}WA`OJ&x<(rCWNXhd6Lj$k$fHQb48mx0}(H%b*XR5t*R`4{0sp;hzcM zrD8PCo10wcsx%sRW8Nx`b@TV!cwf(C_bU+l5ZIl6eZPmzVog2`ivqnT9UN=N-bVZcPPQAJD zE~A0kNC@p>foQlJDg{)+S2c*YR+!wGs0~mpkymBaZb|&2x;WbEML9p@^n+>2dV1cC zF3CE?T-5<_*bORgQGEif1Zk1|ytWs?awH99VW~`}P}qxda&-%7Zr-nK#`7}j?Os}7 zBWa`YRQ?dSVUSRgcT~BQ3qz+TOA7`d(AJ?5N{9GeJ&-?0ENB>7PF6+Uuo_SfS9Iu6 zh|N0DYf!BcQ&(Ul)`j;{Q%l*Mi*UEm-s$&ofMhOxC4DIjPgx)|ix`6M44Z$6S`?>f zhC#;orlYpzMQ#<^X6Zgn_Tj2Z%@U}1Gh;eqf;YxT3{VMnp8O&ntHRU zim%0|?~7)p(tkjKLW`T&T^u^gsjKfx>n2a`lt$xVMi8hd9|_(B@D3Jdx{-~-g%LE> z5fmZ?2?YhPXoup^vOGX~1rU>-<}sSTFZ!$18TMK0eiJLoeoh?cn}8Fx&-GG7zAi|d3TD`3UJ!oWzgLjxo6B<-j85>Lt-iqRTNcIt?Q zE8<)l&CJzL$f-JoOLA8}sCpvITOXm>b!BLd9DT0Csdeh=i_T;3B%8&$h2{wNoxBl-dZUKI z3qGD0MS9af4~rcRk);i9ki^lahQzCvH{{Bb(`bJ6zj8ZdHZxDVToBm~Vw5yMC+Fa! z3Z&zN5(s* za*=SG@>%Q|R~s2_8qEu$QK673Lrf~2amat7OyU^B{0P)0l;7g)u#k4{qbf#!`XEO+ z|}|iB6;WE?)}2Ex;GybT#&$kWy?KP6a}J%}`Wg9iUQM#Znlcra=x!5QgMp z6g1H7MO?X+f;5_66IJ9o_N3DoB8b5xRnVx(+3hBv5L9e(jztC0_`QL%j0CG8C+Eg( z`MLibcBB}b`{Fdd6pX8P8s}azX?8vtx0NtVA)Q8DhOM$_8A-8VxBQF2f@-PuBlK4w zs{X{NggjCrCS$XEU07)yXOAXgu3z`9g7c0=s9TGI7G(r{gY*dN(!Wr-kdPI?#1-T` zx~s`N5G=)#f(rEN=18w}CR)pja^i0Iq&=P+prpAe;oxCq5F=?Z4`#(VLQ&wq08)sS zd~P3}M%rGuyy(urB5}{wLj>m?tI@#&iUX+tGO^_$@uwaKhXjV^OF-dEEwm2QBor!D zZiPLB7{{Mb#$_ycP~w4N^!9l6Xwuv$op~y4EDWt_^=o;jbq#)$@J_m~l*dU+fJ2hN z;9W*8ndFAxgib*fn7Q1Wn@lJut>VCx3`8|j=~1X1r2_OPOfttF3RA#LN?qVQghiA# z0H3HA=TA%*Qs%fL(r9woU}-c#E0YA?QG_8dQuC%gsvqvlYyKbu7j+bdPqJ$`c1ATbL5uml*tma!xNu7poNz{ai0S+fo z)88qSYrr((QOuwg)<#-49|@92rhjxAO|DH;8qH6bo8ShJ{9BUYiWKM(OOG&$aQtFk zIbI+w5<5VX!d%2|bookq?g_bVxtITjbAYI==9UytAqRu#9RzrYN(3-MNw1ez#qE_lm&{4cFGalDJw?OE&g#gGt6y(9ROYU zzro>zuQYl$gJE!<1OADjR1X>KO0{DO%n+656-dUV$%#yy; zkGeITdkCCrs*KPC)pmsdSwB6+cQ_^JUPFgaAHbJ&Iedw#MAdT>ZOhA8O%1ji@7#i$^U&N`n@Pc>|`9 zEMweoMCdpH)d;Yx(RF}_e5FzDVA6$twUzuP$WBg7$VN+)X4@eoyXwI^y3(rF`jaRl zK`) zag71GWw%9&UDpGNuZSS5IYd{SLh!NO0|7j%(Xy#$lHs>G*QgiK<$7Bj#1!IQWDH^* z8%6+w90B=IvWQ$Bvmt>UPyEIo!|Yb2W=68uph;&tIa6Yr`5`dw;bD)nd<$PmtP6=vbK3ZgtAC|Z6b z!SYw4OV)MPLW?@dA|~+317g?TVLk#bCS1T1*oi8P5c-FQ4olY?uFCJ`H&DN z*T<;$tupVsv~uF&L{34!*Ihj-OQ?5|UeX~Tb*N2PLuDl*)b2QnI(0leY-r|Gehl-7 zLm`bOcWb7(`GC6t{3tUMc+PR!me_k*+&EDL|DiqyE9gTo55%_7XHv_^3{DYq?og51`FZ z$z$QG5EHxVCxm~w=yMv4l*%0nmqt%Q@FMjssf`JmTzT>y5uS;b@!FmI0I<|hdjQY& ztlA90L>kTCcN&LDk5ay>tFkB}Hgbu&K5Rd%-Ix$6Bh%DCx9T(x$;+T94RqJXO)HyD zqX|qUIw$(3ZaboBLI5gcQJE{4zDL-msv!H+2iUC_SuC!J>XZaefY#en-wvk8?G1f7 zUn)-H2-KZ-QI3${@M-|hC{>0BjMGp}1%S(BL=%CKG`Xo{dEPl{0SZ@+X?T0@OTkH_ z_|EzX>rFlt$zNo@w7GmQ%6Xw0vO3y!)S#6hLr$mPp&<}?}syR6^+uDnXg6#WtHC2Sa%s6&da zB4J_>CrkG<0Hyc?r2ghYHkAX<6Ni|1T+Di$8D_^;}!gkGz`FY2XtsIBPf;I zxZxGP#HK+WD)(TD3gMF#rXFqKIa0XIax2x_2Mdev$vX)WqS^hZ$cbZt>@U7ITqlG# z?cNT5^J}c)OdGTGrE;ssX%)W>ghTf$;*175VN)RFBRX~w`_SCk^|B46p_>Dj$a@I{ z)##E31#riuET#xg2myrnkhI8-kpbI1+L*amD9q8*?L+t!hyo1_d)|H%zyYeLcd+B_ z&XF{l_e*|rF~lB)A+xe>6^n2#0T%5Ov7Oe6nS7`v9JnDhg#ea^=EzcU_Nd(J`XE|x zY^fuFuG|wM0=z7eNg!dGo!@a9H-xm-s6)#H3PUyUwZm8^TVm9Sswz^1=s(Q3Moda5 z32CH%6a^xM)%$Xb+|k4ye@EO6Ee8!N@d*@%Kqg~zyIcl*x>C^iUMjXt@TL;V504P$sVAUmh(Pc(!WRn-OI;C; z6NVxbLFCsIR=o%(m#>mW^A>ZH>qwR6CRYZUzSL(Ge!IysUZ4SG#8RdDj%vO1RN1{0 zR4dV*lqS-}phyXwO{O|9^&dghXeW&Z7YglOWXy&S^G9ZYEf(b{X(c=X1f^(2(B%s& zP2&O)(^83w3S_{3A&n;7i%?_b-v9@dOC<$CkfYllr--yZRON{HgfpQ44F!m>1G}31 z51xzu)9tOB>{T4+&2PuOsn8c(PA9EkPKqbPAe{^f9-n&QF$fy+SCg9{Er2cM3RLY1 z@U*7*NWDE3D-ZQIWMr(qFp<=#pc&u{^>U9wi|n8uDAW>KkPqRN(e%kEpbMhQv~GSQ zR&i#ibUCAm=r4qLxiyqDn%qPv&CN&Lnv|!EytI1d2L*b8c*6hSpv{#zQUFgc2I^i zdRap*>#Db>+?ueb$P>J;nZRZVPXYAF@b2JA6Hd!gRPHy*qhzz#_~Gb+=_P+t%4^qB z^p{)dGMbsIKZt}#LIh^S`$f=J{!lTr$5HCy$3Br(KUDgh)A2fyQzg}I5ow!*QHfV-F$;kS^TbP!<6K81qWZm`XfOMA}NVVH6k2Z4hpu zcj8D?BSK@m<{Bem#79=Ba%_PDUi-V#W zTuM+a*0kFb0vnBlaNiN?x>9DyFz_FuRcuJCoZ3<%Nrt2w^`hD;rf+4v;iJG6b?FFa zH-uBL6A~ZI1rm_5fK)Ub&>?AhnILJYW3wZ{8OG75^svawAWZeYRrc(}dHhM$kC6G2 z+ba8q?+AJg=vqV7O6VI{tfZ|^p(YuwSVGbx2$mqiKal6pDAJjuhMUDMPv7bj&K&c{ zFErZU_+DW}#QY|5Rh?X+9_hfdL~VlR(@`7=0of zNQnb-4KEu!YFuf*s;b+-i_ka%t^~xcg#$scx2rxFg>fo*6@`*Y6@s!fT*)_q@CZI! zp80J{!c`)GOd-K!6weozT#Wss6TaQA;brn?(p~jgQHAgz%OtONk2^(uE2I^hS3| zsF^8jN*|nTDv7DQJqkaRPPp;~Q6<`&LN6B&H?W-EO=%VXBYP?rfJt8}do;1bqY?wC zrsz>;M#JQA=|gdgQ#uS$m!@~TOu+Ik2)j|eOn`v_#=XTksmv&#Nu#kPF{}W+q;6G7 z7$B)FaBpe@1=gmC6#6JuqCCO!!d^o3iYF>w2a-37J?n#?g$#tNRMeKBotULAESQs= zj(XpRaF2=~6oWA`h3L?e7#I_oW|WgvgNwbqLFCJAwZfvuS9DB+M#BKhEgGys%U2B* zvq62w2*MXePb204sE(0G64S@r{Es|?XtMl0%-Sg|S)?j;;ptLT@qUQY1DTZd0$QR% zzNDl&CCdY z#ViW9NQD$PE>Kjr-n!vM<ZpM1$9<*J0e6gt&I=`xT0Z^fXDxC)yV)C^`W7b$WA*icL}Mt^@d?uL-Y3QVX}R4%0oWaHSpWxPNbBY&15wWmYSU=wSEB)>lA{d>><^NN1~6ghZO`)0VSfPL zP>YP@QYl|*=7c9A$EQc7OLOzTij27%8s++l5-845pDBILB2;CyYaFPnvs(?sTBE}5VAud`5Dz0DmdkFQz z5?^#1U8`taLkTh3_tMN%4yU>Kp~!tRlj!uNLOu_0A&yg~#?4en*8VPvI2eEIYDCvE zeF{Oyu3IJb2tsM`_0ax+YiTs$iCqT2dICrg03f&#?=a?z21>-KVP=6YM46(R8kRdg zv|HBHtp_E95{-*tzJ&6KZdi zmL6UH=Od!vhk)~<>OT)el)|(ZF^B)n( z1Pi)XE)017*uH8dY2}d1v!RIw%3@?EAz%dZsGedgV9Vl5W1xxslbMk)9%f?AcvN_s zj23$?)M0Is+vfLjMiUXv&lpXvmN|_EeiWVhKvK$?2-MU9Kn#ry(9aP06y8XxqE#$w zISen{G_*Y&7DtY>soASt>TiliQOtt(*Vbu0k))0zA@aa+`CfJ^pdIIP-SF z0P>;gkAe+@4N43*y&~QSJtK)8hIfO!S2KyQnPHRa=tH=`3v^~avc$nzV)kGylSa6o zIc`z@P`D1)Dm=~23*xQZa(|keT;muQvm010x@(W z35Pwp*JbAz3z%}m3_)xY^@Js#Uk3X$qs-Rop|qkpUUpqXQ)V|hJJPMV_tdJxtlLVn z6sd?5P}RIqeGwK#4lUjG0e!)+=O$oKSe?vtzO{X z!Fu5zVfzI)2uD#Aroh0cN*!0$qByFU=ugBhO?7DI6u~vgq|l_%@b^<8A)cc=(r%_E zn<@oiGzioB81QY-EzJo+;il{#Zj+peu`WrjL()p^b!b zGXzjJkMu#MjW^3*B4`@DeMO?;?f{U<8py&z-9?H+W~kDSF^w}G!7gXQ5Zh>#2IdtZ zhQX3>so29KKN2}-rlci}CYS7twnT!hvG+4s@bgM9I;Iksb;mbvb&giAy(>J^`IQ-n< zvCNqxZPPjuqYt+YLs+U0N9aZCk;(;gkyHp09L5-8epgL23e()4RtBk6=pCIK-6Eld zL@2Z$==c?VdIq&WNyC)euOrP(uoA`l5*{|(fDZB|_G(0xY6DQ0aM1vSg)JDk!{ww4 zmE!oC^COhNNM&uuz#zF zEBCe1XmaJu>28Qt61l~K-e@xWqovV&z}C(tRkFnw+lZ2)<3)y6i5J7*0pjRjLPLGD1)SMwX&*vHO_x-PvwHX$r21m$+S`8 z8--*2CrB|wl}fn&!Q{Yy+hbCD2Nm>Cb3U1Tv~Y1jsuHD^0Fzh$ducE5r1W z)Tg5xKxUJJ-nt3LPl^uQb>x|#%aOj?#o9&qPtpndnSWt4sTG<+$V8-}Gi8ed-tP7! zI^Qg5K&f+!s90-;PD2|yHO)WW;cgaJulq*o=GPDzpi~v6qih5jaJUqMJl;#i8G}mE zzwkcBX>PuU@Ga^nIat}{%uR%TKPF7ibwNs_$)1}S&1JxUX*9W9r}U+MIH)+T4Ztur zN^lMJlqX@%K~0JNQ__&DNidq3tCwLk&@VXT zTEnOF@Am?xQ1%Jx2Sf`m75NIom*6#$$=ejosc(g=ku@N)2(4Vi!EXx#t2CNi z@4&QjqTryr0l}ssq8vb(xPfsOHg3ANOL@V5;Zvm0EI|lzmc};P+|YqBA|o`!e@&yw z%{R0wLhFREJ}kZV=4XSOduI%9?DDQTi97q(VVuUyYczy1rOxG`Y=j z)7)G}ABi*?L?7gS)e^Ubsw+SP%aT(x;u`@W4K7ckNRBun5uT})I-LqJZAZ!N_Rf@<1R z(bFQ=%`1&2SCf#wRL}?2btv&Jz`L<8G9N{xVn?8<3vVZ+-P~GjSNw?f}WC>X*R3i2<$K>g4lof1w0#@LK!$H zt2E7W`m30DSBeWvRyGUTE#e8mml5NU35{rb`_ z|9K~%oIOjIpGK4Gg4EmPMw8nf=yFCAU+P=k1SSTP zj&?5`ne5?^tTTF2Hi|%1auYtcBm&X@g6k_M7`9LDtKQ8S^-n@&J*7phIJnXIHG2NA zCH51V5Qul8sYr<2L(dtNP4+e_KGdL?Z;w}T?lqIV;+M(lQOJ-1CKT29Vxh#>icE0ZQ&K&m-vktMgJ`OG%r8rKm3_-9eaLp<1 zc?pTTkWv69qSL6xNgqOeQ&IRzqak{0L!)>AA%Z%O9oEX~PFlJ`t`}5eL7(<^YLEh3 zR%}J*b9_JbeJY_enrLm2Fjhx4-(C+_w&JA{Mn+t+g8{=!B>EJHmUT0ipisCw+=QudM)N)*&fJEyX*9XsifJ@q7!G9!ClV4x-+Pp%5BrGZ zL3<4uFsd-}wQGu3q+v4}wO%ARQ6k6d41Hf3O|FxF8qE*Ky5U1*)scu{$iuXW*SS8* zupnv`ELtL|0Jrp%31kNnf%1t*syJrPiLx$dZeoXj7X8oVoz;~hjV8BHkme?Jgu?lE zb4T~qfCxw$7>+V6!Y%XvBcUHf)Qmo^&`96Ujn52%i$s_iu>nh?$@Te8qqz(t!Zey( zK4Tiq3z3b72^uVq5mzucc=tuLC5FHm2IV9VbcVW^Tn&*;NJMCp`Gf1m#+b0vGcd|^ z4@{#8+B{-7VqR)?%t#HbASA?a2Sg8c9e@C-gJG&QO9HqwM2#tI@9n5sUC-e(H@U5G z(`Y_z73ZqY(`a&`@HCo_z|?bDD`_;n?j=+`(X$V=C2o~qf(WTmT{ueys29HX+UD?n zr0wT;;VbCxSCCfpFs_gklUs=J9SRb($gNA4gGK~nP=L9S|3TX`Y zbl_~O^I@np{U%12GR^R^r1EO^30zQWpl10p&aHQ6QmC7>l6Ey9O$nH0gJstCm1lcajlzG&U(zff;6W z+~A)PGC>$aPZ*f%Sdiu>EU|MPLerOu#<_TO!5Y*%M|DWoYPTIP5RExW#DT2Qh)&h3 zS?Ta_H8Cm%Jd|B_*mvzTHy?BQ<-#v%G;Z6l<@$o#JEyq`WWWun@3ywU_5#Wk={uS@ zTL2Yd<^evC8lUuo+DiJ6df`OyqYz`&;9m41(OhPE8qGJeFH+pmI|QpkFe(gIZDGm4 zPftf57Y zH>8oujA;PoG+T(4sL$P|4{yO8r@N0b^8 zOa19f{XWhBw=dX{t%}pCvcl}%slo#bD-Oxji9uqat)jY}0)vv66c+;PSHcpGM_d|B zuFpjp&EJA3<#xGBqYJJLQv*J+(iWL)i-m4>ol6U!*jiU(%j^-mD6aVD#U1q*hD`t2u+x{LW-h|CwZa2m>n(VoW3?|yP=Jr3loVkg0 z^DelbTR9Ta(39bg7F^85vJ!U?crA0dY&}O-O$Dy`hj<+-Wp;ae@HR zNQtS4rXA%12--stf9$A;n4|xwbx$HeT@}D9o)GI{?J1PiddB77r<#~cFS_yUwJ)2T znjTx8TYA&{*v+ZMH%(7Xy=nZ;?dz``d0lbjnSXKh#;dOVsrj+hH!UrWO-{XO?v3+r zT)O_s((6V(@2{2P*FOC0jjtH^j27beeC4$-AG>pBYRPl&EWL4ICjITV zjAC+Z?fNSV@uc^@dhwrKxq9XLKfH4716QuSa%%hR^m_IF(b3-FSHJ%C>l;V+kDIS+ z?QXxmxpBDv+MUkPgWZFz*ZYaR&dy=uXk&Nh^&5wW$DPC1^Ram5%Cql(@jE~9t*?De zwg*+=tFAu(;ish z>397n&wTjjN1pxSS6_MbcJGY0d)t+3Uw`G=7ablSoHnkHT=cQx%RT-`<2J^g)e{;{W?{i0{y^`n0-CjTQbyyvf6d*797Up%|J-8g7pfBmEJ z?KKZycl2Omdp)hE?M{26@%qW>xtpcw*RC#)joojot-o$_Z{6_T{cFF|TSSDuEvz~E zGg%xbm3l;}6p-pJZGKCPA9*?OE=H*1KNZnzDwJVr5q5Dz`>Lxy{q?Vi$v!EsY=vcuasAAwQo+%E}YyrTU~$pSN`x5|LHT&f7|zane*BHXuQrpxpM7; zW_!C_Sl|5umrzkhnP-3cM}GC!(h^cKW(dipMS~uSW*HLaEiDrS=%8u7=c%=mCYAJc zVLO3L8=ck_`=Z%O*Aja1XX>#vilxKt_14mOySgwsd#kl}=U{#E*8bYwt^NB;%k!P1 z^{0RDhd%x%(-L~+`AdB~Uh1D-x%Pusu3f#;**V(S>3r=M_+Euk@AWG`@GpP6_g*-6 z!Eu)AQY=&8GZofA9&Uj(M{z3qfXc(0vG$N%N$r&Q3G%`2LY}7gdhUI%im$akyI9$M zP~X~^t{yC(tn6*q_V>z@tM&Qnjn;Ji&f3(|zxtNBHP`v)6` zN4tCXuNNOJzt4A;?H%my?H)G1_VCdjDaC&O(VzT>&!uyW;F0r2WRC2Ky80^tt-D<> z!Z4dnn%FWr`A8)7OJE=3cG56MFs^1;z+)T#&pyxb{`7Ny?cHDc%=3Te>#scfRD7H7 zd*PMOe&nkc|4zKb-@J0|t;4UlbTU8aG!Hk9I*;A~yV*;8&)fd`Pp563DK4?iKl8u; z+AE&@;z!&3JD}2qdAwpXx-PU%#~m3*r>iXI>En|@2Gf=qCjYT{bj>`)gSc?t$oFp%)D`Fc6t0w zW0Ui5TzLAY{>^Kj`NzNX*;hRKidR3?J4Bp?KM$2X2zyBj;tZZ{ro zY&X8v+Wdmf?RP)_(cV;LCLYZ%y7mg;#?$}&Ge2?VnV)CDGiVU4k*4d^fc#}o zMd3%MDoIWy&V~;>6KBJAH-Ghy-jlH;vUblO&{`&aQ>u2NSI5>UNZud>i z-e>b7fBoxz`G5Gfc#+Hwz+U7nAG;bavN5rJG+n;6KD~G6;aQ`8wzhp(IlFmp{$YK7 zvio3e^W^Eb|Ip9B;+aqX`fEPljg<3s3PmsV!!P`s?~ju^*I&s?efZ;FmR@Rp<8*#^ zygPpP&hqU2nh2%1GI4*hUb}Iyy>L`H+;x z#7#L8Z}hi*^M}(0$z`3y23eh4eEOY#{kLE7%-a_1k1NkS-`gMG_LRYX<5SoEKlaW9 zzOJ&&|4CaAE?c~S)Q&pWid%=<-m~0u?wQe%q)nP8ZD_N!X`GpQ)+9}HZ<2e{G#Pb@ zvJFrv$ReA9fGifRSY@+X_I;IA1rgcBfwBt%|L=2dZj<)knzo5HDf!GeBM5TtS>E?~ zpXc}c{@&X3eQc_5wzb7{WtLGO_t(jWY%h1c{@&x^op%uZ(YJuJN$Vch9mXdL8O}Lc z*z_0v19=SiTRF3$=)-vpFol35j@2X=1y$KdXXH>$)3hSr#gIfBE<5u6-K>yN0-Kf~|8d35n+>)qM%6nTV4^QAdC z*U7X-rw_IHhP7!&_p)U(=-0`OIs5Hf-j*$ExWR;MS>HJ3%83J&=~}ruN`q62BNG~1 zqmv6)#Z7vv(@>*bN_-ChLYi*~57}A3)PV8^!iVyZ{v(Zz zkfRCWlLR)I50qt6apK$4oZ~ax?ui=iz`3e0MbZnUeJWuw<7M3J zjPR{U$~*D;vsb(tK9AvM3>^~LzijTDnpsO09#LN|XW{4`iX4_p&U^HP;>l0la_vXB z^gTA!Vn32s=KSIa<=BV%Pmbtq@3@PZZTKoG|;q?zQHkxnnwYN_@IA0LS8MgnB z7~a?K7e`L{|4-;UUacEaLO!zQ#qe}KT=pSXyy21u_MH64xkrRcTmJ<=UmShBI6_Zh zdk=xzF3Ep*%gJF$PL3x7ZMuu1ET(G>v`>RI56A?W3&trhR)VKu21B=!Q680W$Q$@Cl@_zsMmdPCx{1e z-EnWeBkRs^S)c0X_F7#dD`$^UzOY_57A~r8t68vcZmzq2QEx|kTX~b(lU&zs z1HEg$nN}Lg{qlv2o4aze7dF+_&8%(ApKn(lRX=z;I86$V<0eGj9JCzm*lr&7e%^WP z+LxpxA1-^Nsw0w)9Ew;-*qvsaLAxH;F?q#>TpMSE4xooYtm~T5!s@w$#fM^Sam?EA z?(LEMVkbxDuvx=7>$&3SW5tm>2f7)V=ttzWrGJ^twENT3t*$?PS!=pY_V(Mp{o?)M z!=&p!9AjG5e@4C>IaIm<2@tVyg0-zUic2GosMv`^D`5UC=?=CZEi_p&Q?_wgTPv~N zdVlSn`L}w)pd;l&@><_s9Jyw*LV4%fwW{=_?z{2guwE9>DJ7*0NQekyLWFTv!UBN- zLEFb~LvIb0n2#tA0W9P<Mbn2EE*ii{!# z9XR7W=5!o*Q9K~7^RaFy1fmjNX-TRu8av8;;0ECPQi?eui}@v|oweuWd!M3#8J3X! z%lVJxjkzE!d&33&kiuPU&vf}YKTG#7?8kCHAG_#}Vb^uItQT45zP-1+3wQ;zg-;p-%aPM9WM$@ z8AZJD-7~}916FV87K^7qN1VcUPtO&28E?B703ey$aG{G=KN=tWzt^kh@Q0Hby#dpj5cDfdzqc{W4RVP7i;g0b@?6Lxo}Dn zYt6$iAPST4(ZNyZWlaN?7C|VS&B z1N>&^V!RLh&Zp15?dI^48fKzOes>~-o)`hoiIcj_!5EcG9074Mjy4?K1W5s)A)@)B zZs;E1mRCD%5M`Ly2{AlNP4^6r)r@Ve! zxO)s&%gBmx-l{!WG15w|bY834>93fXv1Zk@mX#TOJyv~tPg7O8PpxXITTycI887U? zslNY+e6QTy8%JhCOvrb3=lvIieScI482<&pjl=}6kAc@NKvl$_VPzm9nVB-OI;`80 zLz|+b2}KZr86pz{Sf$5LdTqm(WD(4!d$X+-y|&slJJW4;YV$f*EbgnUomb~oFLGKM zb$yG5WjKx9zWwK^drl5_K%^m}=!OR)_G<|~fY&79Hn8TKn|>H%U~!1-`o0Ijj>X<{m% zHC1xuMQ+l|&z`$c_WR)``tgC>dda84 zJwH}Fuh2V}CY-PPRPn)dn}zpHuYI^Zzwx#}a2U3=uIa@E7s->K8~ zdT!NQ#bJrnWMmgqEbyA=+1A|dq~F~gw5F)A=4M^DO>3{omfZWl$L$|BSqIHBpOoMC zU~z;~(NGPrx1N6KX<3AaE4{92iZn(J1tpq7t(J&WINEXAnSPwtD2NluAqcWapnV)ZJgu|4 z)v8Imr8PCm@?cS0Z?L$r)38dbE40#NCa0A=`|gs-e|h1mJ@dV&yr|(~d3a|RM^0vz zl<%#^zMS>lnB7hL@;|q;p6G8tYw}v&`NrD!rJg`ePWlUqaWYlV&Y=(m9BhdwT}$!3 zV{-(Th(Qry4Dw=v)I{A&JOSEDm2^KTj@CT!#>Cj9Lh-yx%7B#~=r; zFNNDHJE zNXDVS`f=L1&}^~HQ>I4?mpWxfE_KTSVD;%gWLWUHObZ64fVUP$*KgNh;^^1UyIhvH z;c6vEWHEo??1sr3PCj7*3*%%a{xtH83QM7v9-zb*eYp zsCa9Ccikj#xlZ2mnZe>wt~}9DNcLnPwqfVFxxtqaD6uY%B`@o5j=4_47Y`r#Kw^O&n;N4wf}lB4_HIXS)@x>9p_d-0q}mQf@!A{@xAp1dw}MK8j5W z8fk+8nk|`Qrm^_4>^QF7eNN5p6(_6ssbyu!Tv_Sf%|)or*5z5^9z zrZULcX7$ph+L~FdUbp#KY95LA;mn)>KCd$&BWMBZ00}8Ry9(zo zSY0HP`q*t#crUONAQ1ABWgq$fW-^l$8Odzk04qF={Qf>-3(%UoFUh}B!_1QBSv+@V z!0VsZQ&p8SyKSpC)6kv`mUh&oD%;vSjZAezWvV{2pr^EC{j;wZPnI4Sr{_t9M{?GL z=t&bI?`=9d>xEC?Z#|NDI4A3WF8Sm0AJ2RyJU$QCUs08dbVUwD^8}E`O2#pfQ@OER zp{3ywhNlI6lhBv zc~#w!Y~)ajBtj4NMjYoDN+V8Kaq<(qIJ`L!U8ItNz>5xC@D4V=4Q=WHWpnBlARC@j zQ_sK3YYXGP!hOj%O*@7x=U-X(gWt-}#t$IOBo!|KU`M=ySiKb;b|>B~OhBCVgvN%c z!p21DNgSQa(GE`n=Rh_CH55hE&Mdk2wf84Xe&D884x!MQRFFk5tVS`kX0u1MGr4UCX#lFws8}}zE;Sd-Y zLX`dO`KhXxoO{m=99K83^{*61pDm6&QXDyWPJ0KwL)ZgK#?6TXQ54)7Z1yrz}_K(W4 zEq0UbR0K2Ajmh4o`j)P?71i_2#*VVZmE|=H{ie>63%_ymq=AOe15(M|S{%8G<45T- zzb)%8-P!s`wz)g5ee+e>=7t*##1DGn;;3v8s=uf<`p4YYxI=tU4KkNGZ&nid}cCK-kkdfxflgsw1xz1fZtZGPo)wWYLnv02kMPw#5kqRaJD`9VlqP8&4L+#YSk2@hNy zUiol?-O2_Pfm<mGhg&In|3AVE=8+Ka>>%}*txa-~ytK!+t)y0w9%oJmks7WSU|i=(#`M>yH;S(9-xUT<_$ z(ayq|?l+C_i?8|4x=;%DYnJ#B}-HNMZ0<$}?zS>%} z|B9w;?TR)ZC{LEU_;VlH^rJ23D0L;Z595_tL9RH^*E2E!39tq56TSOb7b;gSH4`5-+=m0SQmwzt>bx>y!H+x!aE_^ zH|68{)ipm3U$x;nR=MHN{qT;xCg1t=JNt*t#r^@xb+Tlw8zFzesmHysF}&-^z;f^o zfUr#JI_5}-e{}NE9P)L$eDy?#i%6Q&x5ODMAec!4C4rJ!$E94`s=q)iVqvj3dG$MA z$h(L7@Aam)Mq0p|hEa0PZq8(ym*u;1+{;(bJn_e}?+w>)D^<&I!z#mW{kyk4UBc^6 zt=2zo{8hp05%EN%9+OF0^q+?~Hu1}Dcwyu7;f)_=xE}p@Ih4xYr&-nZQY+|d!Lryf zb751i#VO4#o@dYPTE4KWJJaWtTypg{B9l+NhZld30cqrj9czAe*BM93Pr@!lolF|N zXHXg=0LID>olbM`5`(=$a}XM&Nx%X@PPGi(66d5xvXjI_CGGsNhSn;i=9C*pn`XrM zFAU<4m|P?-9249C%B!o4?6Ia_uwU3(zQ$+P6=~gMAdB{|x$=a&yO#AYukSr@`RUS` zC+=Ed_ayJoPC}DnQYF3|GV-A5JDBB>KjVdlJRut*GcoM{M9hQ2AbyK;f-J8`|MZp# z1KyTD7DqV&;EyV(mIfSb+d7PA{bj+Dj_!18wxu0ImAqxgtiNA2dW>CksuAvac!d;_ zzTucUq<_(02l$Tw2{jEnzhM7K-@*niLEm_aFhJmFb2a&XhMTona_YL9CW*)*)Z6rb zK81qvih+)&TKITmgP6YAB&6BTiBKfYVW=y|5Z$vgloajD_@(dM_0~7S=Rl*LXct^k z0d6VUf{fic7^7teVQnCYBJ9OThI~~#IkbLsEeIR}BVhJ`IMfHcdL5O0mfEN;YO5-> zX7QMus<~O}BztDMcjrO=hRe}ocjG2Kf+n7-w9DL63SU?1P&!Hues-h z{M8PRiazL2vaov5>`djXnTuN+8fWU=dgp?^-t0D2a<5+4z% z@w)SG=vrX*Bx;ccO%lMT;O;;mvp^eW)z>2bjlB)DBdvHX4lse$nVEb%l`x$+KqnLC z2P)!(7Tw~icd+xMB)2+mU3JDIC6hzbhv>@+i}g>7qnCyjw-43XxlFcYP*oAGAWTWx zSr~J@BEG!+<;TOl7b3*4a!7c>dA&$`i@7wJtZi1?+7}|ZOLhjW3(NW%(&g!LeST?k zPkT`E#L*{Cocz?I*B&%@ocg$YSBB5I2eY|H-yX0h!Qpv(Jm$tIP?;Ys)k5i;1!afuEjNt}QmJs@r>l?iJ;2a~HREm91#=svGULszrX?79)#-LyQ^SrlsZ!h5c$< z+j7C#JEP1_m)6ahSy$1OX|Jb>V8GAY_`+jZxIN_hgz|n>*bKx4WX- zR9dRr=e91cuuEs#b6abgT)nS-i%Cwu7~;a>=vm>*zsb0eAAE?PqT9<%U*_k;c-ZAn zN5zAtd6_r81D}UKJ;-!T_m}%!GnzBJ{13kSbm+7gZa|V8(4M(-V%`iP%9{SS|9b_+ z#!x%>Pw&5Lt@JY3snI;El1su;X)v4Sw1wG9qOAdku&zMHm7RLcd#Hf%&j%V zw{AwFFV6Hy%C58z>0xK#398^bHXM1=iE^|aE)q*tguM8$XV&~$y`rh1A}BSDnnfK= zEsf2o#)ewE%~?LTwa4lzS-)ZRgvoEb_n5dyHbI9@lZ^&HM&H0pZIcao(55R58tD?S zIK*d_9>Fg-f7LUuNE-yGv}li!N(1U*(Goc&4RF@0q%@(3`vP1@a->fKA1EBEeVCJs zK@f$JdZPQR0T12(baCh!8l;ITG%<$10*8#JOV?f%Hf@F*1;hRBXFN66FR%1#&H9-& z4YQMV-F1r%!^&yt6-gtrpgWyuu(z0AeqV0%>EVgLV4>f!nKK41Zu`w^zjIG`+X-P} zGw~cU63Gq%{SJjgH#lryj5vNRfnbeLK9m@etGmQhCVm3iFuAAB1r8oeVi z+~pVErhE2?9F$#l=}&v+)<2{FzUm8?FZjju|6Tdz=OtZ3a^3<8evLc=Q2P+a*{;Yu zawHwtV}j)}rok*ndJS;}Jo^*_567aOmDBGO@EQi)J4PYIo6&^CR}Qn2pkXNWfDQc= zP!I&@$j*Uz5*z|nmS6@QZ744h%e5O@_vLAqPZICeSh3AVX*LKhiz04}IBvr$W|7+s zg!1xJ)S{-}9UM96lmlOS__^0k{^-OL+WWqG;X~6N{q4gmd83CJ=)@Zhq1$8}%ZL{Z z3x*NYHekJ&^uqE+OoUzz$CU*~g0XE9BRIk;`oyIDku!w^Cnl$oX-}6#PMk0fTq*#U zqD2u_$x(-k3BL?JixJZ&?gD#m_#190j*M-aSokaG?u}_D2ygj!My2H=yu0uNadzE{A{q20;Mo;I>T7 zOikN&<`MJem)F#l*3UVjCR&l0H6fO)et+MupE2{quTH(~iFclxanjfS()*j{f1mbA zyDxq1s`g%ULTurMU-VX<)p62e7tB3!p|AYUk=I;(cWd^DjpzTR^rG8t-1FhW4;?Q2 zuH>@MO@@BQ4H3lhvCfbES6|7o zpE+&6d({))eQ%$Ojo)m%Y0+0YFZ|ArkA5un&4;|E`#!nN0~?($dM*xgMrQLiT7Mv| z`~t|>q|wt~*CxQs&q3crZ;oAvhzV@Rgm{7A)?zX`nRfjrA~){_#O81fLlcP*etSt#o4Lpe z7Mop#3l6WJs%Z?9fd@Z=vB<{^umAnx4=`OayaUXG#!LgJNZL(fsC_eHh3_r^qlGUA z!i_t3E7}*OBf4VVqM=4vqY3yCK8oF^4Jhr*5j)TB0%LplIL;sKw%&n5(%3X-g?ITU zq3>c0Dd@TDr;N)PH)B|b5Av_Y0@EBUCK^DM44P|(qL~5|W_Qs(@lNEYPGdwm6h5$T zjVfIVw~(PY%#fkB?SFs*C0eAuP#nR%jErj7Xo-@a$0kEBla_|0(WL-_1!!6cW&;uC zGMa)Eh(v?IJjOPk76%kCQPL=+)M-DpRHf{O22fcmB9jhyPkN#Ty=dXUG{11%maO`_Y z!^8?nKLcZh3am(z=vQ1YDU5ZnO_1D@|41Mlb_~4!bSQ-Gj*AlC)s$feOvhHfkeGIT zd<6Q-yDCyE{MhJXutF5%!<&@vqdLYZyl|wO=!A#*D0cznp9O;i0(f|%8HOL;!tah^ z>V07+z!tN;d)MEWavxsM_8s6x6EQfvY_v_VwHr~#JG%u#h_JU#|>*?>gnH| zN;2qb#{jn@yjq3=W0ENlUOWx6Q9}<1FNno-_!6m*VYUl!0jyaZ-qB=^QnNePcgyZz zY7gHOA`nCi*qiyRRhWw=P}0#j}H3vL|qzEAlX zSYwX;?6&&s`1G)rp$>$lt0qWOA_`5y0ThyzEX=fE*is3_NZ`=|3ju)1N8;!jDc|rD z3D`?h4p&u}5eW~Vi4UZop+XYkD=c&^EVA;x20CuJ)42KUC<0HitHAxz`S;C3^9Xw?de^Ps*YPx zWNh`@0QAuv91H!nB9Y*ZciRF3YAgU-8=x@Rd8VIIQ-reFaGwK+ZYl5p!1Zh}e8{jc zWSOM4K?_&BK(Py~&ajdjxr6ks=(b7mGTQrX<6SCaWI2W5dwbq!?@|@XRB(hE*}I}g zRj6jhGMNm?>+{707cXo#OCuTsh#|`)alHKhl;`Qf&Np;IZ6yRZp?iwr283GUE=JBu zc0I^+-J~hFbT3K6~p!x1RX%ub#5^r4Pow+czP$ z@1r07-p`-eckY!3F1@p5{xe>3-;O`t@bt7v4|cq==DlCOdtcLU_uQ6?7w(@6Qrsjt z!tnegqFqVy6QZmse?StF?;9z4YL-c425c=q;XAml9Tzt)T+J!O|4A2!(6+!P131tv zVg|5dn`mM!1>vj`1QrNl(kXlo9+M>gfpevSpuw+E95n_SYT8wMM9wIV(DmK|KfDup z4&j>e$eI^Ja57eD$@mOReueF(gmsFgT!9a&klap=mkka|0JM?=>O#5)mzW~lJb)$^ zU~s0ZQB<%OkLl#Z!CU$mw$H2{T_XN`pZmB&xA}FMsNEGKAkmP{wPvNjlc9OHE%C7{ zd~%8%1OX_rfH+Lk^oiUylQ6pJa?`I)no|x3iAJ3U@xYS58t$Z_8NQQDm}t;RqD`3u z!VvYLk#t71txX4=WKC5MU>!Oh89uQMtFA1b_SDqEOS}b>eCI}EA@T026JH2Fu>^fU zfxu}J>`6zE?3ol;YiLxuu*vDQ^U1MZ!0~hGz?%>PV7u{y4PO_K<^b_7U9r4!=4^M7 zR?)6x8`bLGRC9UvJhN?X`OGpsT|T!le2LjS$361k5n%N_weGPugie}BI(Fd0zVk^q z;gfREZVDd0akRcgK!f1hB*%6V4kn6P>3v zg7DGs363?$A-0TBSschQGjD|(O8~|Zf>-S-5C5-sI}g9SMx^PCH5Y$TyF_=;5b8p1!#;%LWNc6I78u*?f0SX;`o*D zfsMZQ%c!C#6g8bYaa)o{RTU7T?>odZyByISB17PHEA&EXoTic~n}Z@5lk|F$DC|r% zNdyxqZV6O*aQ2hXz=_IIf#V~+BQwk;MT-O%k}KialbMCK(Ufo!CVun+RKg)SZ0Ziv zJ&5|g#7#lR+dUq?u{?4e_WFG3`Cbcxs7Jhb0Io9usOLbSmmUb5nHJeT@2Auny*|2(KC`v z!(X7Oa+#W@SGD6$JrwO`0xc*ZW~3FzkrE~eWj6dcLVyjaQ2UMvtGSGl_TIA_Ca5=g603r;+Ly6+?KvpJQ@t0g@(~zG1C?R1#>F-a zH=tVPMI~a6wx}X$5eDDFB^OPawtCvQ{C5}0fAj2s(a7158X2bp;(>8-GKp6K^DyGW z4Trum<2;QXr|Axnd8VjgwU9TEjdM1bkB}3oo3^bISHuQLpa%;d$YfO2Z2zQS5<-&% zibSGzlC6MvHpZ+r+hKSg$2l8P9pFa5alim0Y2pVlEpB8YL2hl>QDM8*@)?j4044dB z@xV#YO()+j&R>#@lVquiay=jqH=2JZrwo~ow3!4}NvK;XDk7c#Sk8tlPvau&SGaTe=-N zXKo&=OHX^05+}yl4V+m?UKCXvv8Ehf9R;aZV4y4}_AlWwr6@Zja=^UO#wGQ&rL)SH z%$+lDPJMJzlJMT}o5(BQ$AXqzHdz#!V^d9D6d85ohH))9V#<_vbI@mYhP%RdfFMZE-dS7NSCL} z_4%dEJ?#OD<~X}ya48rD9&fy8^`p|M^bFf^P(0BlrDv+U2waH=qO%tYKWPhLF;_67 zJGA;-4ReI1dYpObL)nCk(q2U!_3Qn45NX9v&nwp!n^o2AJwf-1^0v8)Tf53uw0YHy zc3agVzb;(nMkTvpTowQKjYH=X%zOOCxGKJ=>2(54w;s_;o;k`+x)cuSORmf!Ctw`SLV$Niapv;L|K;C^6-51{J~&pjn$rCJj=aP?iTOgaau`s3*z+*Ua5|x}JFV4~Iq|HvBvMB&?dKi{#2Dm!d&|ki2 zqEuGF;?rzkK21=C0iAg-x|}Gi&pT^Z$E?vF$xrYCe}e|kdZyPjdHzN;HP#2dKx0=YrbWhP84 zC`pvtsD5pQuBHbQ-%XiFy)+{9_(3G}4 zi3Pd$n28eUswuwa@#h)MQyU_Dz|xeWq!bqvqcYRdk_IO<7+$1qV5`781^Nr#mur~V z3Y9HlLBdE^{h#jn#Xp^}`p-B1Z{Pa2-nml!b^TBGKBn_C_m%wD5l?^k;wS%YLhRE= zWVNMl%~huS-;x{lKJA$|ocBNSk((yp(%I2=_n+Ro`|ViMiIcV^S1{1lU~<$L;ju#M zP{-UrMT_8D4z+ENWVKA$3i2F0j|7P5lFI7hsdrS3bEIOE3L-Z_IAr`z{2%0;ns^L3 zks7|G;IzbVno60dOgMU)E+8~o1A2fANb%4P2SM!K1E#$&VQh@0cavk#%b(lUF^EkY zCl6*k;h)(Yad7nEe)W_T?HfXhle+5onwen4OInQLBn=E%Xj75~f1a}q@H*&p7L6ZF zar7mS1i{ftrd*tRh>SQAxtO%5Z8%EFSLOt+>f$D7)9oLVZoZ<(yC3Mh+Yl!-hSF|FugRY-z$N`* zHivEHfVWwW-{9bF&U@D#_vSltw9*m=X6yt;PomFV9h`tL5L~2;j!V25!cffGbhv~l zA)A2?e1}~_kctL~o5SlVNhFRa&%g^Q}&Y8EVy7T@il5}#cZG+qD01I!=in=f?9wj5m^2TL%GL(`08DiUWU{W^ z)!f~h_WB&Zt9j=>F-k-}u_KRNd*rFoc?l5Wi+U1aK8hS9fSAOEqf32gB@n8ia7!r$ zXb4<|AWKl_2)Zkws8&K}aHUS$>$z2L70UwA+GJ!GR4nkC=h@cW?xf${9kizGrsla> z*KO0X zIum5gLABwb0B0w}?ZyC_Hlmtf_-uniN;0TW1VUaU6a^~z?X?{Y2wOY4mo1xN$HEVg22V#K zu^r$j@HBdiVu;$NI)(t&>Y+j~m~ zI>~R=d2M{fCG8o+9l!=;(>z~ap=WCuF8l=*MS_yRfypbFNHS^Uk2H8)3DwzJ2l_vb zJp6z^pRsrEpWnKp=~MMb&1u@>sLveq^{Pa@xD=H4E2q+FCqDANQy}+VFBS*7UOrqPF(&DTJ|FXXAuqYZZs#~ zz9%rMj+62P#{PkFyy9N6WyPJJl#iN{Q{J<@C~K?~om{c{LUH8T5S4wn3VPH9!~l^r zn6?o*ALrQ z|LDLCCvB)YH~Z*9_mGc$^8A^TnpT2nJ>|fc9)9k%lRrA~g!aC#Uii?oM}Pb9%IM)K zJw*qOBGCi~%=q1hS?UGUi~O-e`jJK{Z>17!A+BTT==4?Hbf^_64=oW*!R0U!y6WH{ z(B=bnMJ7O%NTZ+MrT~MaVr3Rg^A8mo`dAh40d!8zFNBhDgh=SIN7hc5_SjVMJ?((f zD?GRK_)fMp=NBxHie_;Z_`&K^?mdmu3;YQ~OZreZyoAaQ$Jt6}>HwXB3Yny}z(UZ$ zu-QkB#xF^v09$+!{2?XFDP@od zZnGJQ{6XQmAel)c^r`#r`oHkPELxlVBV9ltY{=}ry6VcdEZj_l!bn7T6kI+`4mkq` z{2K@ESrViJac_3jipcWFp$RF+eXf<#<(l#}sTU_?gj^8aW zdkc4(+z`kB#CS%_T61ouH63fWSG2a<%UZL!9lj|BH|63D_vdeloj~;m|JNm}4!|#m zUKAr#?4V!_MRQ?YaEO!o#O6Ptfh@8SCxwdy`-sCkxkqForYp{qBwwy2{Ibr^wIq~* zYx2|6ds^FCJAALzo}TGyo*{oUqmt{+boDOD1WTO!58|3mIr@*^JYC)(`q9X-QK*sQ_59kMV7op`*zuqfsSkG+FRV3#( zS9H{^=(DZ9#qC+6uexd83Txi1pl9yV<>9M#dYCmmsQWvlL3{JZmC(5OvtIf|cte$x zZ`oFom)uF23M&;KsVAUw&T;T{;O!}(S3F1eOpfv{M=FiC3F(nXqk$zrZfN7IyqojH z;>gk5QYYs+nbzp^q2`0(RfX*Y-h7j5I{WQg-j+8Xv8U>o@|F1so}C+Layo}f9vJvj z0&%6d29_X}BtAw;R?kT|$mh|1aEc2AM=o#R1I3YhHg!0L?2yaV#J9Rq{P32O!<9mn z560xUXIRqbVEOi0k6E;A6#TxK;*4!^5R~)~ZktD=Ku_4BAPsojuH#C*%$JL*e;A~L zq7kjt?z{2g@Ga2Lqe0u1L#)EG18fG!0u%;5HXuFZMlyhb-Xon6Rw4-XD0np3O85<6 z2N)Kw@V!qs;Vay;yt=hMH9I-0U2CncZfh)W;O%AT;?1-wmR9R3pI-h@X_jTuUhIgT zwBL1DY)-5rlg)K6vvYnd*J9^l?Y*%szoR=Bn%85k*%)1&T+1>)o86HY3tYIY9@ng2 z`;xp^jG6H-f!?+`@~dn^0QuRenMK>Micr$=A*-@?ryvuhKoH4;g*VI&4XD^sE;0KXG)tRiTMC5}jimqv14tedTZXFe`Y0B^|At}#>g-c0 zYUo&<$f0*`aE7%+mZ8^g3!h<9K?CPI)FuHBFr{PG(mj{f46LRw)6+7H!1VZD92u!e zNMT?Zny`Q9=Qv{E$~)=OO0INXtJ>+Wn3=I=)wGtC8GSugeS1$+Rk}~DYN}fieqI}j zMUr&bz*CH+ec#K*JU^T3%Jd=xFRNP+V-ajSEY`8ix3m72q6Zh&1o_&gr~MpHwQUAJ z;>`_Du9mgbP~e~2XaeLJfB}O7mGoFHg_0F$+*+UJCl!L=xv8F#fohmG3l*Cqzl)py z`MuzGg)gGk+1+Z@q}|e*8fAH~sI50x+}LSYrPUQ$X)=@3co1w*_?4si1uORDtnbF` zZm%`>pWFG4^_%=P*|zU|W9|F$j&VD|Cn04s0uR_Jqs)LsNgfJYgeN_;1Rob0n9skL zexoG1vd%f+OcIFm`xh^AjgK1Gp5lf3wyip1u+~EE=kKn&<sJ-UwxvQ$|% z)c`LPbr+g?X}D3!00m2Ui1_$F1aElKgN5HuH-e85***0dkNUYg10Ho+PgPaU?6$4m zOhbD%SlUsSs%&fTG&0o!;965MS zJ1l^lozBIwIlIko$t?5yu7Rp$Td&3D8^0oJ;e{vNo44vkz5mRIYT&4pe4xrBgp#RzGu#?t;`;nMmuV@c5`KP@HpeEdJeH z%Y<0L4}9-|%TJe8-JxdZHzhczBo)Nk%vJc(6R6k$7O_=<@5c^FfVEsE9moW0q?8{4 zMKxcG(!VC&TO7F!Bx8R#M|8+&&aA&ISklp*Zq2r|GdALaZa8NB{c^`0jFk}c3`h-u zrYNc}rvs0-g;hsEhXxmt1xKT@M_kUJjr1OR{z=wE{sg(s^75xFNY(rjnxrr)i9|x6 zk3!A!`CB0(k`QhBjOj@IWyCYcmZ`bKz{!S_+t0LKg8>1X1aIje6`+Q z7{2>okMu=8RFD-+EnNDbrAS@|xn?GF@mZxuaH;37dgc|m|D>EqR~Z+8Z5s)`M7DjC z929y3Ozn8`Y?@RK7NaSf6m(!!XnXh&JXHVK8+=}fun>kmvFUXfvclhNk1XJjLP7VX zYp)7li@-NH@`rbbvm&|bDGL-OdpH6l&LEWix+^>njbJ1Oh>X89su0>U7KId1&#WF# zygFB^kLLR2m42;RKeMJ`cCxO!Zn0rlIW4^+X=E03r!x(9cn9+Yio$_u$BuE->fF$q z*M8@o@P=~01Rd%*I3qav;`<}4OE+x(fF>0u4)z>Q9w??Pd1V9cx5IwQ7M!FI3B3Fl z2Kw{XeYe>H0{!WlEK>Y!^rARidl7Aj4Sc!l} z5Q2WFpfFJ|e|S((I7X%zM$&3=nba99+!&cn$)IO=8Jehpf^xuz%1UF6A)X$4`@AXB zuGw4qKgV#e3yp+3wFkbm=D~0egik87LV{kX^mW?;HP1ByezI6*Jp+LmSRVNWToDs) z3(EpE6k~2AX#B`R?`M>@q`o(*J20|?JhVHW(B+5W?it%>Bl!`(->pl}T~WadnkEc4 zjH=|a&rK$cN~Q^IsLUHbV|-)(*GiRKF@-ty43C;jEgA8DVueD%>!edFS$`%1QD6(l>5U_`9unhLdo z)1H{7WiJWfU#DaQV$hy3ROvX9?1bH$or|do!-AwuaMTnkO1ipIG9$f!R!L=*pBq4> z=Gaa9&=1gg&|@{pU1Jb|(U1+@0G^>}@&~b%7d|&}+T{m~b+Ym3hMta4+hCU>E5{Lq zJB=tDTO_+Nor{iuWB6yGgjk(+RSfxrmQIs75XdvO*W<(ZHQ+#jEw7-6G{CK*3iis1)6%&;WW&OD; zMUl~eS|3+TgiWK}STQj|^?I0-xGSUua;ASjBprNE#RYN)#^nVwHXEH#)Q-ywMzy?v z)60nYnRkV}phy_#V^CZ$K71b^zK;*z`z63*Yxv&ZE=l{Ss?$3uA5=vLzv0N6P89V3 zt@2b#dh!aBSO%R)`IC(Pku~ZDQJM_BQ9LG5wK4J2FGdS=b9 z)hn7BDuPnes9Ds})Y90TYHX;r+nnWdTYIdoaQ3~jc$dltq)-}>rrEfFV6cE-z%IkQ zMisSzh9(J2xu|Z%7DF>eN9bXjykEEqVf!KYq;F&5Qq~z-F`Yu6WhERLa3Q8(z=g*_ zN9u|jB1JF8q`|{zK7obTBRt+0e+(LR+BwpgK`w~mPC;*n-~o|A5HJzj>VWG8<)u5m zaNU|Uu_^z)zWan1gLAK&{OQ}<|NFA3$FG?G-Lo72G$FRE^S2j#L%aFpPu%$*uTKA1 zPeZ5isgffXl)d|SZtb$FSLQv^^vnGt2YvqSSN`=2&wn)XAD4b}%4peg7Wp zGSJ%*-1s6mGw|f=$S_el(v3n6YM^4#1b)aDhO`A4rkTK`?$dQq# z=jjs9W9Why!{v(FL{WJ4paP&U#&AGOPa{DUe>bbz%AZXZMNhlktF6eWi?zzCbYtCe zhVM)e$ zj{aF74zRrK6nZoSYxrN(0NV){&DA49Vy>&0EYZm5th^`?pf)ZvOh2MQi}M<$;ttx= zIN}vlcn-=M*Nhe}cgl`l?iRM6B4I*}L?Isz{O-K}g7Ae);@iBlqP zgg*mX771>U#J80~MJQ0&6wla1I?1P|z|J**UwnSA*EW1f9$_}!n{BP=wbicKnQpUF zo7cHwabIQaygILXk<-$s=M}djvMYq6l$9r)8$L?B0D>pQX3a7Pwil}(>s<;^0heqe zI+ZRnVto3_D8Uuf&M1h*K7gqN?Wf4fHk`dgl+H@C9@N*jmZo~MH6628*o)fy%H?WH zY3*XOrf;6!)e^ph=M+ay8zhX2ZAF?V2juu5{rw3KTpeDjMROcyM?&Dcwvyz-0I!ND z3ZN?T0x{$SJPS;ZOzbsVLHVTs;=&b#e*o5kQ}*%5!L!OMN*m_ZFPT?b4Z}lN9vA_l zlM>UlyykHv!tZ`|*BM93Y6Oe|@iqE!&p>a@!o-e)RZhdBN3Y)YunAebJ4Py$T!My0 zUC1As)HLQk-{)rAOp*#4U7~0eW z%I4H9;D*epspntidAn5J2D3+gt=q9r&yW@Q^w*yY*SJ6w4e(ZQVWu>MejaZTf>V?2 z0k9&GNtmQ?Y#Jh`Q-zU>r~${PaS1Se+#i)z4YftwOvkBxW)gN6>chHcoQ zj7_qg!7Juw`ar4k8|Ygf+kIFb7*ZJ5hxE-@l5^V$rpbjARsBEsL(j)u;4+z zFd<^#Y*fL-Aos*_4Wu+7--5|jEB*-9!~|=ISb=dViFNa;2M?CLrFC9w@4QS|P`0qH zp|T}~HdR|Rvt^c*s_JU5$r;)9aAnRnr+5C7zw7n)9uKb@VYiVoEkx@euL&F?ThK-5 zE!JSMb`jz(z8|Vztf!bxsSFs8;zz~g2XsEjfAW0o1i)KCT&!zxop6n~#S$7vekJ@5 z76-!{$xmLM;F-k{fRmy>i-FpQ2z#{7dLV}8Bc0dD0L-#!M+sH5ans9vuOH28_|JcTg$~$zy zs0WM6RrVj13Lc=HbKq!Vg}dY0H(!;NJVhIXjt~VWTabtS(;@T|q6j`^zrIjEIB%qC{Z zZ}yr@7gM|<7DOsoHMIY5d^%GW zdaJGUo18l$r`%Tlv2V;iw$%98x`VIy*v0E^IA`Pk{N})(sopPB*H4Je+ULXHiX8OF z{BLdSIp^kkzIf~JCf<0!DR2LW`~9U){?BpO-rm=A%pu#-b%Gd$ObT_&;rU|8OS0s< z2t2tq1+Yfa$L&mu2UnEviDCHn*!RWei-ZERVOOGgMivG(uAJL`EYCljeS-LY zOoBqfjMtJpP&ETK~{}{zDTpU;nf5MC@74$6`U%jpBW zj=~TQ=M}VlnmT}DRRDxIwBej}rKK(Q;^yf~JDTZKT>Pgu9|@&6 z*w=x;`H+p09UQC>`bV7B{r#%&dQs_-(2EcQ zF&M8P5-=c#s0dV;)`X7`C4#~ft&6L;fE_&eNhx%K=uN;nf~9N9Q(U)in)3XW*ZxNS zp?VU{A?!;;5Ud{{nvkT)86F9khG+%F6EI%Ibh#s%1)z)3E)ZUlxY4yh|1?L0(JF_& z(G6zc9P-8{H13exsm(=d35gS(TRqs59D=_N3aJ z8JbPK<<(BzZ}AZg^$lg^{Z>nPI-QZW$V9g%7d@n~P~=)#v#nY1v)NofyzZ8}ZwOae znnjGGNQpr%#7e8!jMIgkNykigAyp9~#J~!Y2~28sFmR6u&@|}>!;VE~)BhgdSsb~k zI5O1Y`PS1fJuUau0A^~Ubpbfc)|iBU27B4@5F){&LZf1`vL}dCLJSM@#nk{y!sarV zaFewT<)x}A(ik}uWMGQG_(U9LuZ^b1@#AQIf;gNNMBFGc(FsJkq$%56&!~5_r%t!a*?jcp;TB1nXP0TI3-VvM-Hx?Z-O;b zC&h>)uT-M&CG6A{Z|!Rs2|?al8`s}2FD}427GBh-fO`^n?&Z4KoivrLC<$YeH;<1R znjUM0hzOBE!b4=AARUadC6O28S%_Mht^{%Tg|I9cAIB}IadEZ~3z{7gHeVlkLEbp( zWv5XuAn;BqjvV6J>3C}#YC|J=^T?fA0RbX)(jd&6tL z3d=_;iA;~4KMH3$_UHy+K*J`75(!WpmV?3x0Y$xMBHFWkR8M?Xh~@z+vv9KYu8(q%?>qTwI4S8l?%yN|QAocs`g?bafhsEi5h!enn&~;+112$^oXc+wPu) zv%siNyFDFUPG?27wZUzgHOs7IdF)Ov;8o2R-ua~R9gSB1*6$zsoxBRJ0$$nxZOc)` z#>d5uV?w7T9@)eFz#=Qz1gxE4S1A|*+h@`TSTo?0QOISnojoIy=Fh3A4o?Cjr-R>B zNTG8>0Op74>|7?>(mGJ<$>C2{n|9E^xn4Q5-v09A&xbb^fiVb5I6AsA7Ho@?!qECfwY;#0lDPh;*EpqtF!0$^=Wvalt9w$ouy@^r+YDH7NZ@w27 zC)QL??xdMEOt5+6;xob)5??$AGw_xP?1&s+`Q#)K73w$@JYTPi(vie4%os$J5>h1R z1(Xedx;Y$UTVWl!aZR;s9lecx71cGR4f9*;n&&TFVdfU5JF-g6?5f^+cWzaxt36tz z4y3;h*J&h55v)dHx|FyQvQTgy(&9y4N4$u^c}Ai)@L`bh1x_3juu6$f*s3IV5qJYx z6yXF-DsM}wXhmYygxJi_-dBBnu-E0EdH?Fe%dS7}q3=El9J-E+XW=kg!w zxy(!d3MR&ZhWfS+@|!n^#<=HFx>^0wzr2xb$G0w1+8A$q_sq~trqfqqb|48~I^{1( zcqW}COxG&$7?OI0p#noDDaw?*HmQWzE>tXlvN*7N72<0~vOP3z1RXbm_9sPc_URhp zE%Cy(hxyI1TEqURwKffpra&fTX zzd*YQXaI{iQ7X)VY@Dz-b@{~Et%)!R$Zc@Zc@mXw({f1?c7i8V8kGJ0is5?J#fbjljHyYXX7f26rsI%~{m@OBH@aFQNuWeL~AdAFk$qn6n$km?d^7})1`n#=Hw}jb7dox17i1BW+Cy-g&+E={mWU<^=oH`0%irEx z4lI2&OYQnTcW!N)-c+@4Zr5yOMcVM^&u=0?w5{5i?a}zi{A0&&MRF%bV|)72;>d-? zk%;FnCm~lJO!S|JSo>MtZ+Ky2*sCHg$8eGyJQQFv1W6NArICd%I zm-eJC5Dl7q8YfO0Gjozq>S=okBZg;|)~srKsTK6K&@=3qxv(kM;*{nV&$H)tEnnEx zo#~TjHjYQ%rFitw-pd?~4Kz0H7eBHsUkM>>tYR)5A2>U#bTn6K^ztvkE>SpvsY=lJ zO;I_~G8Ys$P2m*%4cz}kMx~Imp=U$hB9nK7YDBFXcw9l#ptK_F*^!h_YAs<{FvW*6 zVWN?MOa)YgJQji!VQw@#OB2PwsyA1I;Ebl4-}-mj4&YIQg6TTJXTa zR^8LnQ_w%MJ^$f~heJ#__#O0vBp5M=@gzZ&wkhbD6ajKT+Y$~yJK`mA#-o*m@P$N< z!GHt64#^O#H)SwMseW^kk}_S-lawCYtrNP6M&L}N3Jh*ng~R^CO#7DFWd5Z) zn!&u8)|6_&@a6A;edI~VslA1dJDkqV`2Esqnz{kR!t#Qmef_ojqs>YUPwF- z`y?tSV1og;*Ayc@0uJf3v3c6)3(-9wzJw$T$qmh`g1RLI-pw{>wuwk5NX6D}j7|Gl zbob%8tVd7ycyd6>K92n^R0U1Aw%QeNtF*cvj#lKm{Ov!-bEP zN8vq7Xs|9Ap4uW{pc~1thFR<9_j>LjE9@ue+4g3)zRWXgl*;+;;<~QpS@Sy=cg*i> zsc)F)=kj)vaTJ&Zp%JY(*bwGyI#Mi8Nr@imxfcByjOKa$*v^4?!dmI}+n;+-UIy(Shyp7btH>Cc|KQEoaD0t0=kfr*Y8jGr{XbO0-bK!dQ;#|V+ayAq)J;!DIC z2mCsrkX5FVPbT1Jt$$*(ef{dAUqA11`G>;jqS?!IDB;;GuF|o5z8m6r$e07?WOj~j#%@{ zMV3c9_J656>JGGIm;B-R$At?c-y)ZT2^Mb$dI+{cYZ@q#tS3S@h< zcrBB>G01Ddl{ubP_Q}XcOY7>&>zB-(Q&&HyW_CzOo{yYzR_WsCB()&CMvi#Y&_k!6 z-hbCx`5+L1@=>Y^x?_Ze!p{d0PPQSan4CJVu=1`!) zNC&}#JxoDA0$c~JzFPA0*yIgYO^_m13`yX6xIA4)i;RC&$AV|TbG8l2LLGS=InfBU zs2o*67z1*q#meZKN*D9Y7DeprMEQhI7TxyUUoDfh zci)zIEg!Fly=^@*AvSN{k1apt#G1 z1X?4Cd}eE(`+nX^Jj|y`?Z-ov+E3~3oS9Me-a6l_OXp^0QeE@B@?LjVWwySowkN0yDg|Wjbzaj`R9PQcF+UOG?DK8sP;gMU~Sw5J??_e zVGi4cA_RF28OMyfpvPU%!*D^rUL1KD+el3&USqfW(M5-wYavjRE&i;zO?>vaUD_d*o02g2Jl>ocZwt?gR37fG#*nv~Z~d zw9)Oj)Ga;3Bb)Pb`R%XYCwD=p7Uc3^uS0t5_yIW%_+dDog#&i>L=1Ku?y$1KJV8ZA z%acOTz+FY^iw$~XQ_f4KGRWCx_0p!=npv%0x?_ctvwM`rrJ2rhtGUv1^9_@6_jlgA zHSYe-$FVGrbPTCKd}ZAaek<=P5nP-BsL_y&sL0sfS(M?n3j!aj&rQ7M>BCq+*y3ko> zA-NMIghR*{K3`6rv^g-e;4mZB3MMMvm9SyXYJryt=d^&6V67)WN$_W?>LLpwhtl}) z0IK?NTeZk~A)Ae*Lbu}TPW!)4AB_S#+2iwVr3m7kd4989pGikU+zDRvZP`P%Km&z` z|BG+D@elIc>H7%xnYjzC2f7aQifAhZDz{UfHV!Wo)eu1JB!8Y}07h{d>T(QbJ(r>W z-#+{&rd#>8(ztK^gXLQv7gz35apm_$wNYG_v2m+7l(`xG;2qk!RL>hPS{;HyJi~Sz z)rY|k21GDT$g1dWYIKV+-n!t<16E@dCx(s4T~aqyk9yIgT}&m(7@CO3U+*8buKe`8 za&56$Ro&hbbgw9Ho4dHRt87J^SKVm0RW0)C@-6?-XcY&3hl^;RiZ0(T&6bw=ephsR zV*k#0?aHvM@Zraic7TY0j7bPrW+Dl(%_3M%hB}yMQwdNj^rvJx#LWeKN8v*o7V-hD zPGtzTTq4hw8#$uHweS8Uf8BBvq9Y9@$aenDW^wrpZyft}aefB6=nMDTmM)sO9{k=4 zj&*|(7_Kp9)BGQ-(#$jfRgsM$o+p#TsENrPTBnN^fF~f?g0#h_91awNw*m$h3=PI4 zRH!BnaR(s>N@$8Bi+U3w2dz&5^pRnvdhiek8z8Nho_8X)Vbztz(=OjjTpK$uUJdKE z9^c8f=KR7+K^LBt;s>iwx%V`xH%5el#^CJik%VBuz+|kdIyP5CDThUW`vCXQY}W!6 z>W>ZIM9=fn(|cOmS~~>XIX%6GcLTZr?a)G}&| zBjnZ&qrY|qMO@aj`zJ=82{*xE>zG7lhmc7ol#~vFn}e*XgM5TV3@S+hV+l2skZ4BH zEObo#INxEf(uMx&1KL%65K%x+-K|0}dd=%AuBz+n{7T=yKQisl8$OqP=(Wt{{zE6e zdbP3cH`O0q2LxlyFIQE)STXCB+`P`*s+H%s6^DH7)D=HI{FEuz{r4yKx4u#Mp~D4K z$tV^=6+aa045M?_YCZy*7ou0^SJ7C&&w}X%s3oz*lvNm4$Q)-5E9fSKJd{EqJHNCJc8W?KKR`XLjC3ka{Ma$%LrBMTT0;4Op1YxN|$s+O*5GKQ4jdTheYc?ta7a=7rdnhE^2$;I^U0HS~E6{U|+s!#o{T@mEEW{K;@{x1~#TF&!;C zk;$ct`0wu@el-@(0=thY6lB2Y%HJv4eYAeR+<#kr72$i>_=y`OZ%mB-{C}Kj2ASTZ z$mnP$u*UP>OtddjK?5DGf}bq`Stz#Qf@6xOoweVHEezM+^{bWQ)Ih)jIx69kwMpJt z0IxxFVKKtC2NYoj@TX9F;pMksN|8uO^c9sZHaX&X03)cuR#Wlxe26nm4*ctT8N1)x>ly0gh-S zT#>s&Hp%-TvbcY(+p$m2kV0*DNdI{1v)dBOqgN-NT!TcV5LQb7q><3zcai!gKts?r z^h9h_=BlcCFsjg0687g<8tKpq`=2u9a2tLXyhZ?eCd3zm_%i-d3kx{^y|`0|8DkaH zNp|IbeU}ZH+(-C0(odmFV(OCqas6jRCw~lEQZ^J(Z<3^MYlRf4d_f`)n@b|FURv{D zsGbIUPV6b^>;h)gZA)m8DUxDz3nKvkWNTi6!+_?`|rx%FIr$g(vba9&=@>9 z+FcmaO<mn=AjHB88XjPgCrG7DbsoT{`P&&z0bM!so@sSa~2Us=K&*l@b0AJYI?&nM4G{u`|*!N2aSxJFtEQFAo9=s@4Lp^MDf~h zBYj@HHW=@a$1)pi;K}xX`nIY6?5|mZa3=iM{f_@t_j+Hv#r6N*)fWGn6!>@7y8p>v zn84zyhRE;5|9s8_B^DRgV7)n3D2NN<$!q*|;#E!fpLnS{UeJbv363auP93jV!ERAF z)d}PCgom~8|7v0Mj>qAWxQ+ys}Qho3U4RHri|D=4Yww6vJ$|#Qxd0Q zEa{OHTKp~IHM^qvlDNrWh~JzZUZ-WW_}jt8!1y{W1X>&~>SC)vJnk=Qu(%7Qp}2t% z7Gf>_Dd8iu_!?v!e*V9)MhSaN6wxs8{2#wZP7Ca^nkv=jd4R}oIbgnbd%^z8KYEKN8s*c$3{>e?Ha z*j@bZ{G9!l)x*Mzr|-I7nG1`bGpu*P1p#*N6EnhY(HL+E8)41s;?glJ%QG;oy8zxB^IwKL|Jtna-_e^t(Y856xIR`afdF>;GAA2l+$8G>I4V zshXJmcOJj~b)LjNxcDr2KJVyTJYrx=W?Uj**JCjuBN6QDiUSnh&xifQ#jyScdyeXg zf7@DS10Vt zhIWfvE%Msh>Dt&C8t@wETH=>@#T@^nnfht>#S=MB$a)xMVWJ$XDlu#p#0$)@o?jT_ zOF`^+B!F#wCB!fTfdMbBOmSWm5jHZyb_@8vFl06mk;16blXme$Zgu3Eq>!eNhS@O% z$pg5%pm*%JEk2pLN)}G0r-amX&;E00`v2dHviJ$X%#fIXE;g^0!2ZCvW)l>}EftLA zF#^Fr3@@d}3$`(bAS^0?yC;i#vM+82AY%AmMjSY;{@;JlQfP68E;%#*pARH3XL1V%4n}Hg3SqgBaG~Ru48=$F^7^7|sp; zIKKEPxU7Elh@q;ux{}J7!=h^TYUjknB<+MP97V+}Pup8qp3(j1Q}D0Fef0kt&iyCn zU~mD1@4PBAym9eQ(g=GbV1m~G8%c;8;jQGN7~Er-t}gxuuE=m9hw~;b=p^wswD?Dd z-Ar)o6Iooti<>~WIKq!~iO>=@4n|`(b}yB6xhuy<3od?f?@}xZtYBBUca4pY(S(hi z|KVik(nlrHyM0sd#tiybxTYpVQ~#~6H)Uf#=w0@O>u)fJVZ~9Gsa#QZ*3@hUidaG4 zjE%idEBUqKFlIy#*Wl1XFc?{>t3i(LCj~;|XJG zL&65i6tRM@w`5}%yUAz%dV8tb`3+h(Ux}^wX>F>yo+4K8^;T@`>++fH_r7zVKh1OP zblZmWw)*swnG~^tueWAnH?@fC+%8@p9naLidgM53&{XxK2#Q$2*W0kM@4B9T>)`H0 z)x2wi!n>aHKVA|vvXLTI@b$KA?B$cvr>etG8Cl3w&3$H85?FX%Hcb&L_(Nc=;|atw)4WtTGmsW zyMCGEQ^X3s{umLtvIekN9nLu&*_kCZZ+q{W@pq=*%K{dIgk2NjR(cp%>ute!Px zw6dm7&rboLXHo@Ue}j$v(?e|!*}_>brW1j@^e6k%JFK>Q;`2$U;Om{)*ke@8mQE}` zSpP8mCaamDy?;c%P$xyK;Okx3*!@MLo=rLo?~bCc*yhAMAen#m8UEf$6@2|oHuhgm zAz2(r5s!a&*d&h!7|o`h)|!~tt5Bd+!*wXB4z;G0glbfrbp~#YSg%L#^F(u$LTZj8=g?a z41fnfvdt4Z)n&XpO+sR#r?>hv&)L7aP7yNzw*W3EtnGN~ZnKQh;I^oBG@}6PuLFe? zF#~WLAbl%UKUXd6c`>B$vu|#WV<^p8W{Q{r@B~m?dfuB>viRqdqK5%DvSpI?PWxC< z#0-EJz@A{)=80FHc-S2KmdS4lGN<-r-r@?F>^vmho+CN zYPq+MB4z*r0fw{Bg}#^IYz?%Q+a{9rJoC@nC^d?h0SE%9?|9Pvu7%$9&XC^7^!e)G z1e>2HDPjg77~tHh%B|@q`MjGLH*Oqs?>xx6WPXw&W&rL2e5#~>NaylgGkt_|NKQ44 zj`ZO#r-&JV5CD#ohPHPnwA0d$Q!IAEnsyuaIOCi{$^e7{_;A-2C%re{`^TQ?aoTmk zS8Ex+8B)XyKp4P7{_W-QZQP>oL}ddGN$#{WdTEwH5ihjS!k;^f#FF669wa!zp40AO^tFK>ozZ_6Hl| z*=Jr!Y1heB#&q^m#0Iet+v&tvh&nv#r`%t34Y(CsD)gW2nzU_FI;+%B4z*{0i+7uRzI(0 ze{i~YYQnxJzbT}gkAos+03HL#RdX0G{q+7>9=F+1kq80(tShPbdmv>15&`y>487eP zMDH<@6}!9Ce6oK>D5n=i%m6$AFz}7lj4-m=Qu@a);oX#nj8<+AeoCYaKoY<%_MSUb zCCjH5F}CviqwF6vttg45h#7!nfRWF1KN3gQ4WFYqd8udB54{O}YY&Vh2^oMCfRGsa z^A0T!BeE)IE!d~L&VE1p=M6>70HgwlMpe~5@e3+4KOdW<)Bb+qQc&g+ikJa-3Xr`` z(sblNW%H5>o8}F-)|jQ%ogbly8Gtl^$>Z+ZE&Rtme~8~P^qcOL$!ySde~Op^NC!B_ zbZfX+U*_}9u(R3$qbVf{A1&l5Vg?`sz*%GOE5ico51EIVe7B7@u8okdz)y*k0muZn z>(?DHrSz_H;psc3W40?E33%+KrHC1TEPx43&w?6FF8^|_i5~uxk1FdKhH-u%WdNQ5 zSb6@=q|qJi%B<|p*=R%WbW!`-MO?xVG62~CaZ`>BxsrRG`OErj1ATH`TfJy*Qp60v za{%?p(Mq}`@xJeLrVZJL$y>CJgx_0v1)sM-7dnR+=CF$0hX@NzVB`OvOswQ@hbEH#gZ_%Cy0TSpNy z0QmqlzM*r~*}rxMIEYm4F3|gv!!qAR5iFdNCW{x$V~|Vg{fDAo6+vw^(!Xjy2)Wy$jn?zux+$ zRzndp0HpwrI>MVJr%P!ChudGstQlh3TE7*8L{bLe1%SiIEyZ1PkK|HsTz2`sguO{N zLmERkQU>59K*?nTwk#)0j&;}g_CB4w>SF%q3dXIZ3_uxx_z{lm`E$gQ2Ki(l#-+#BQ+9=d6QfNA%@c1Q00;CK;Jpf(NG|gav zT1Iir^h4UGT=Z*heBh>t8Gr_W`qaC|9ld{M0?r;S%PcU8>+vXTp@F{qLWdPm+NN_8zxoBp6RH9O1#pmBFf$q!Zn@if2?3-K0m%NhVI^ZFP3b_$Xoqpar1AS-x!3 zf_aPhRMGQ^@>r`XlTQIS%n&jFtpG00iAVDtEBwqS>5lnbJ{!lDl7_!HQU;(6;JBFS z>fj5U5(6@>rc1tkZCGP{EIh@~m(S<*=cT6w_kBI(^pzrJ z0D1skX^6gAvdj1Ony=!i5_yH?BW#jp__Pu-0KEWeh7UT-wKN^3v@PYnGMCXxCYM#> zik*-F=mYR(n`*J>>!fdHYK@*%F3{O=SPr8ZQU;(O;GnlrO^3K+u&wgIZkH#yGz;(a zbSYv6U;yBUxD>}p$wym!6^}74v7+ChL^~w0I6wS<%>WDn82T15zj#M`Vb-osREh7r z7ddDr=z-l=8jk)vlKGk*_ikJZy0XW={$y)y5Z{qju zCf4;=4oN+APSeL<93cbn8GvK;w5Vm~vP(B5mL8tX$ZZ@y`2?dGQU+iYKu1}LvDLUg7!F&w=K8GtVUtllFN;x<;pG?$(XHO5D-xxwg$5g921Fb1%G%JY+o zo9V}_tD2X;g!;5^3M(0+h#7#d0K8AEPIcuMo61{gPs#sg9$53#1D_>Q2H+dO+MOE` zYqaCnMh9=MOs$raHus4TZ+;htKJ4MU@OaZjlCtWNae@3G)8E|aimjP?H$}JxJSP2<` zUjWq~-xN6X^4y45N{m-A-;%`S?T_0sqzu4sfYU~E5igc79LU+taIoW;^oklobsWe@ z8GvbkoqP9(e^{Y?En&bcSyy(0_UXb|Tr`m~0Dl0OZygCpapAu8=uoh9!8mWL{pcW$ zt)vXVUx0P@yZ$O|c$N2;ag#^ag6GtabLD3-eM-mx%m92oRUEB2SiW%L4xsrLk2{+rB?czOLCAAw^s18}M$HB4z;Q0OtLpO}%Nkq{6NV8c6># zHRNUfqCpWe0P_G5CS{5tIok0pG!|v5iI<);Nu0w42Pp%v0H9IG7*ue!@CMgDX1j^| z22I1PS~ygaG61ei+1Qh4XSQy+Hk5p{o6*PrMTFZ2Z*N>rlQIBq00B2FSw>7AxX{T& z&OG_J%Pg$5%7h|j0Neput?GFeZY-(QYc_ppb}-g=!O#JhmZS`T2LLNinAzl1w1LbX z7jr+g)jVTUHWd^x18@s~Nk#kW1^z31j^8Gioim~DRM|ZJ1;-^q2H-Y;^Sd1O@6FA{M%bwD;e%S1@k=2IuJ4dUI3YA_P%8= zR(pD``1W=GeUFN2-B)8|Ov(V<0buP=wu^rfowaFegHDiXpSyU1`6-+f2^j!yfWlL} z^rnY5%P8dD_;XCgrFGxyq6_#(6EXlk09AtPC;WHxTaL8MJ(+Upyd}NyR4hfz0Qdqd zkh#Ma%&B0q7aa^R!&sKc=_fl@J=d-7V-^9d0L(G64Pn zA8Tvn%WdNMdkZFBOn6@^KjRcMkMlGk0}udU95N6V{FPV8Z>>dYg%SOuOIC5ixKbo! z00IGO#6EGV7;Rr2wPxtZ&V|30JS@ui#gQ@qK>(U2S2*|lO!<8F=0=`eHl60z4Zp5n znu3r42nKlgbjI?)c*0AD?y1+^#+F`Gh%F|{Ng05<08!UZFjOWyj&HBjGT9YY_xuuF zeh%jD2^oM802j%I4l#zwqtpDQzhs*CJK8d@3Z;k{fKY$~nR)4cp(p)9ex0BW>zCh~ zV_k}QZ&C&z3_##ok0QUhJsom#g>sVt{nR%CI3VeGw*d&hM11SR#4lvX=SoJhSTvvM6&72or zy=?BPokgKE5x1+#Zn@5Pa_GF^ZT0hy?g8z$&+umwVTkX085) zWhrvbd)?Mk#0)?bfMP&Nenn!Ir*2;Q!7V}z^gEBR;c!pN07L^^R-HK{uxy3FP^-si zu1W5^dUWgo%sLP<01p5HX5{tGM`vDL@%q&A*As7;i+9Ok-kX#Ghyf6etsD7xD?x5U z@{yE=Z#~=lUun1E*h7RM;9j{@r>2HR?GSP&Nwvr>e@M$Gv03HF@ ze^Gek^UYwY=i$cjd!nZ`m2cd@n2(eJcnnZ%yy?nVbd@T97xw|qWWRSt`>cW~Vg?`) z;Lmvl-PFBr&-9))J$W(dv3zqz7ar>%WdNQ43^k^h`iJ*&IeRk;c7_<|8CTjYr-&JV zB!J*KQ(1HWjAl{0}!BYBiZRSZ@ z-Pg--AR}b}o&m%)1~NSO^5^T)5%(K)wX%}zc3rrUO3DCa1FW$Wu6s6CDBgFX`P-07 zvPdAa#arA?AY=fZ15~gFY_(=#yxeAFQ~0AWcem1%NeV^G0OSDB>kD@}aC*OXQLG&H zJG_pkCXf%~B~k_;7hqjah2w=wDeJVtoD{EY-goJWMvDPO%mCy8L<-DmuJ?JhcjnPX zr?qp(ZkaQPxMA!~$N=O6D128GHhB`9U?3S3^+j^9R&(zw4Aw~*fC2#CcnQzyYR~2C zzpY`Ms4$w}c0XVbMa%#c0%%#By+3ZHnZoVEIX=E+C@l4-!&Y205i$Tp0MjF%*XG1g z>R-2u@f>zIS-q+C>VArt0VoEbzY+cMWM}+OrK`83*69aZ3C&$hq=*@S5`gmEcPrwi zhTAWS)hu}~XTev!X~_hBtb`0eDL}@~>X&^b8%7$oIcoG4afz+J#G{R)Hz5P?0^l$! zQ+kq;dav4Z{=xh8F@k-Qf8r=&2H+)txOPWQ#(@i6o<+?0<8*dXzCtm$QY2*n$^aIM zPqOamFm2P}`Yprh$7RKs<$_6OQU;(L;GMAIqf&<5<>|{VobJ!GmER`xbcP~k04e}_ z%lA*LOun||tYOCsJn^4IO?xk^vJv(4m~;lx!IDFg5d zK!wJ3uj}NpDg~hot+l#u%>1`5!TmT=2A~RHS?DKQjyPWl_dOi4Cnch?=^X>OC}IYn z8sPn@ozfGpZ~U#Ew(JkNy(7N*-q%qKr3o2;8UV339ZALf-=y6SU(AVFsTH!Z)en~g zqzu4o0L@K|n`PzK{EApbz}EM5u6`L8Gu><%bBL7CDt!C)B4@^tdKorZyr5< z90OfK2H*{V67;;Vg{fdKtJ|VQvDeQcL|;Yh0}(7$7?R{z^pVW1JD3KH-AepUXqWwY$)*j1@qc; zM}g*N6fpzP2v9m;me4Kgc>Ree)cOmcUB9L9X448U7}`JoD~Ih#p4zX6>RXC33Z z>BzbMr?`7e$^f(gEM1)$5KwjD2A6cQLCL1*BTGa@&Qrt;Kr6td&8mLa?k5L5EAqcv zMtymqxg*PnB4z;E09G}H{c20qm~nhmZ>MOR=UcMQMVBIG0NMdgSnRy8Q^X8F2Y~PTp8}s3HmaNmwOpD!o}s}YZGwXUDFe_6@F_`X#78By)O_{n zz~sGKy^d%td4O4ILI$7H40`%e6VL|-&beXWMN#CwhzrIThLSP>?*JZf zcQo!|)}B0EQ77;&_h(1JT#*eP0VZSs-UCRnYaK689$De{$eKg_Uer-m>F>BHPs#v% z0BATN+?{v(TzjtNXq?`8+Sdq48TVK!M15f`?N62>AQa7Wn}{qQ(|fD6fpxZ z3~-xGlIg9%P+hqljq#-^W_7oh#>Kc6C1e0T0T`HWblo14+kBtPUSW01*jB!y*Kre) zlmQq4;7N<1^}jwby>)G%se5_e*Cp5G81eiPAp`IkU4ZYs`m#|Y50;0w!lWmCTj+3amy`kc0`RuBvn|Jonc7X z)c@`qW`777fNuchGoM(#_I#-nyYi|+^`o9z-~4wRj7b@Q?*OywdVcI5_Y*rdZJ2yU zeN9_E5j^b6yk}&mB$-%Ki6!r#eGpy2H+<^4AzUz_z= z5hr#+24D_gJj~Ea!_SN92G0qT9LFg&s`M1bOQa0IJOKSYos}`Yzfw#di?$71$!l-C zsTL9L)k{evV-I$m? zuUNWn*H1rxDmtDbW&myjbOqjg?_4LgLc}IaYLDS+rNa`8c+QxV0l=b4b}hf&LleBd z7fM=mEylDqM^EjR!Nedb1K3EcWMX4c=3eNnT~hzBQ>{h0Zz&Q+*$mV8WKu2 zw0v;CvniuQznSBUx3@SB_oNJfH^BNwE4rf@M-3;;$M@C8&|X_YzaEE5QU<_h@xSo& zR&{{=VV>hVZvQ#oRT}dtB9q;AoyeXWU|8>Z7K3$C2EY%% zGvY1{|BuQG4a#)}@!zi+ZMt)f9k+D|832EP1*|_&+n5uycD$9ZT}(z#=dtQ)41Wk2 zfB=Acv!?5#efEVStV=Dko_3vc+P9ts2LVC`AP}JD1;eJXV}fH058WY1FXRR##B{Bx3)Y!SgW*yXF#`|8R+OtIQRIiYj!0xVo`hXB_N9_~7A zC-SDpF{M;uu6lU%!K(?(oDebqu>f4FX+HK!UCz6ekg>^e^`#VnOc4 z06YP3blUvJ!QqR=lD#RPcS)yeHLtkiLJ>0nNdSrl!+ITSZ{JTjLi^^Y*Zm~ZU5VP5 zn;~QXk^#izSr&S{PLA>9-ie$Lc-QZ7CBqUozX%zC6o3!Y`xaPOzHX;+_h>EDVK}wG zB`}Q%DMAJy6+l#V1@C%2)8{+XOfK_&%blXRH`quKGXPHkCN*PfDC|9H6f=p{5!b>7&kuB<@;05`rJ*8B4z+G0gm*0n4Gs?9?q~X z=wPIszJPNMEe@5W3_unDV~#|kP*peAGgrx`;p{uAolUm5heFB#JOkJ!HpOH4ykTip z*{b^At-j~Bt^A#XCuj*7fNX#tXnWA!AIye-pE9Q4 z$$mlxpco)c@sYj7(1A>sKY}AggC|BATr_ahAY}kb02XeJ4ScX%_H?(kp2AJ0{0Gf* zW4I4Q$^euuf`#~j8tY*L#}g-Icng!s&18D1KXD`uQBks4naZ}6| z#+lF(MjX9K8Gv#Ce%a`zB8I&TXTq8qHh3IPlKI^`e&rEgC}IZS6~M^yQ;&Ldt>su# zPKk2Zqz5H*NwwkrG$8{}1<==6u<+yhhl}H~O0?(lOhc0dADUt&k&pqX1_-{D(8^b* z=AD!&?N(QM`&>@&t~Bf`LC65q0K}9rE3g!gfAQE8Q|oXdKr70!=mc&z6EXm=0o3G- zY3FWb6&S`WPusGpx6>z{1!W4IzW)M4_lVd{=OZW+Cp=iN}Ts8Gr_Wo_7fe(`M!t!*WyNnO<+UvcB)b z#2_gH&E-#-UOX-t79??h6)VJD3 z`=(>~H;^&_EdYCBANI@NV|4D`_q&hp+9Mee0bhJeqzphS!1%Fqhi9q1d1UP#;&6c_Ym8-z&6eA2%sE5;ea^7*{BS3_vG<3dhSEAxgeU zZwURV8Ni>^oqhz{L5$}N2iS6PG%KsP|7O^jdZ z9q$Y&mDxT&#u}D$`|n?;h#7z$fZY5jg^7S`e0WNqI^Yr(whgz;2^oN1fQ{+T zJR)9ro86P;of>ou+I2S|Zz%?egbY9*fL+`9Z9AUnMbquE*Pn^se|fpskxdja1JDn! zh0$5+lI3LI4c=GFYa<_?{l+rail?y&8Gr$R$(Y=jyQkN)nv7A`K1&sMv3yd#hkrC7 z1271{pwz3gnfBQAgC7L7mp^ph7AUk{3`00V24DyvFQec4?bA>B+qvlWp8Rx3bi=Bx z3KTH|@D3oUV5s!IS#|oSot?vdaph?#ylFV0kTL-80S+;#Jbr&$?F-KbzF)DyVx3wz zSKtX+LI&UifW_oG5pKKn1{z=f9=S2>_UxQi8m1me8Gw%ftJP`UcUOxGr0I+*hxd6a z_jKs0;^R%o01N}Ley;N98}aaG=F2^lrrbso+s}s~94Q0v3E*X~RCAZ6wP13SlmQqAFgE92`f%ADnaYdTNXB@o+X1Iq!$N)?N3xuS1HJ48e-ANcr7!~53#RUf`1Mm~zL;jhGKjp59k$0b@Dl7kK zDa}w@OA#{wQvfTDbGPjDEq(RZBeLt78cV2Ly8mum4iGW`zX0M2n1^{8OX$*B-VRt= z%%vUtes~tMKZFdxZ-Cwjo#v|tgg@N(oCwqitll9}YLEL5qzu3`z#4DWrbmUt;S%Y2 zks6un|(=#H7DVamhOKqXFeN7RjfJqsEzW~oAZy)*MJ||Jn z>#brfQ2nP?bzL1r%mB;)B=fwj)Ka@S)L<^Xp8K50%ws!)3Ow3I$N)wP@Vn zJ6(IW$C-h{e%~RJGuZcskO7zjC`?|6VoJXN%-raRwq} z0Nepy`lZvVEPp&c-=8$N&*!#dR3bYa*6k8903HC(mH+S^=7y3sU;m8WNm)A76pDFbjDpg_m>S*OCxF|+m^+QrX~I~MHi z4a6K7Ap_tEFcYfRzQpRs%&E(>v6C_~9nOLc^SE(D$N+c&+>cj2rNtPht)-?KXh^Rz z$&<5QpCV=e?f^up{>pYVEFM?1*zQCCkJRaI8P{7QowlDHGrFVr9p`Hh&MC1e2n0S4`(god84^yGCt z)u;I~D@k%MKMs|o3_t+Dp({s^`>boo+;@y7@mZO+hKrgC48qGDU<&rm~3|3AV>aRBK#tl4D1|SST zY12nr%i#Ff>vg;?KU~7QCdF3c;+2#ExCc;dy3VQmv9^<5fj9R_$C9jLhOhByC1n8a z0~ozJ<@kuF%b+pmY1HUP-BLQ9KfZWCoR9$s2hdT_yF>riTzebm!P0wC+p!bQJJ=f`>1?XmB!IoC$_ahLQv?s%5HbKU0B2J}-WU~cNI$lh z^~&2PQnhvdCvfB=WdI%m*zd|_@85c8<NuY0UZZgeTe-gblxKs*4`*`uZ* zT=sd@^}RMein~q6_l3Q|l5Ro>S=7o%k=1G60DH zoFQ4VK_0@V?umXm$fy6eH!Q~qO94n3fF}TbtUFESwMvdV^w3gL=R!7pG!(jkqXr=Z zkObhmXY~25mN)Z1pJ+O5W;k8al=<`tCZq@%fMkG7H|0{lxh3mQM;{#h5f>hKK6or>CeS`yQB<2DgeFh_w=5D#uuyNP48TbT7#!H zCNO`ve~f`^3&8Gv+v2h)PLES3>9&beG&(!lqv$!Vx5?eup%zD>vgWG((1bTar~Wp#af zJnOjSZL(QuR(JUl+-@dh0G&)(T6{~S3_w1B_YVg8gEw#K8pWmkl)9L>?@;G~v-o%u zG5`etb1iRU0_bfTbFcTC+vKb;{Z8xShpi?E8Gu57H!OjH>?W<#>jP)rcZy^=ciJoL zz&&TR1GQDbGX_WkMR;A15ga$`C`dweu?QbpX48ns=g8D zh`eTd3OjfZG5{q2iRO;yS?cFxKk$C)w;Z79Vm#HRhUYa18GurNWmkgCHHC{+)T0J1 zu5pf*RHohMp@ZdCpo|3qd~|3yaX7W*MNlR}& z{DbD9B_k!L_$_R3c}&OvlmReo$?UlqR`yc6^|Hc~J>NVRN?Bttgd=1C$^m{Jkra^% z?0UvGwK^@YILY|QCMS0sW(XO83V_#xwPmdnE{ugQU;(Bp!W2Q zwL)2=1E8pHJ6I!_c#ZB&!tJK?RlPea7$UK4 z2_XYe2jF8CcI0BkMToR9&i2RNKr+I)cixZTCxPtih*pUk#7 z$l;Vl$^bL~6zN#)%Bw0hx{$D3@5Qlw<&V=0FxgMa05k&Vn?LXxmacmKs?;{Ptj9uK z`H~tA0;CMUTY&yc%6A7^I^J~6q%J#RJSZ*WuJIZxEC?BZCV)ZVdqNSHOT|n&Ud23Y zQc8}TcEWrsDFe_9!1(FoZ27}8lPcRXcRamz^hlZ3);stEB4hws0G1n8oue(@5u-B8=pVV(7@#}Ap_72z_RJPYQ*T6#F=MXg>C24`No)Crzv6vpa9znW5#yiPn47a7+n08)KphCJ&OG7neV`yaio+=vf{wq z0a6BF2tcVIC^W)I&fhS~_}S49u}n@rv?=(O2pNEP0Ot?idt}U@pLAD^6rLRINGFyVpqE^(`mkl4d-EMaTer00?E#jt^Z{enH9CTzMng z=)}4mZa1;opO69g2(T_IXwb1MAoMj;TEW!*mh*MaA2AhA$^Z-l+?6gEyQcSegQmpL zGqaX4|E9<$W!%LlWB@(^EEpQ+rAgCx9SHH*Ec;gSx56D6T+)y-03!e{G2i9(f41vW zj_-Z2eg5^%cy;qFxb08K0DJ~8W%+v2!8LsL%Sj)8_JQupH7%9%*hGPl0T>0KB!7-P z9@K98cEcfD$87zOuzK4w%sLP<0ABzqTcXTfwcn@T#IWX$R$kH4M+_E06fpxZ29UqU zXgs-1?XAS>+JX%V_l|G4S?h(5Hz5P?72vkK&_T6toH`>`e`y`YHl4|2P&|$aDMAL| z8-S9G#IC0z9C{lH9iDKho7k^0ZMleLC4>yXcK{ztjjQX}FY+o>dN{rK_4IRI=`oD? zNEv`}0KU*Og1KGnLR{6)KQWJUORE_B<53<`24Dh!Lw#v>abt1V?Wc@N9$V?eKIv=V zI*yb9m|O(GZNWi%nN|0ky;w};TsXBT=>N*l@j`K~Y}YP@NTYz3+V_IDym9m~Iz(WB{fCy3FZqN9(V&AUGy$Lm1hj^FJeZh4cApmR58l|BJa#1NXS+xR9(UWDX%PC?8U=F~& ztidNeF!7Go6`MCJHoljjUAbu)o>U`b0OkSI!vlM){kAfzT;1>KH<$fDB2^dX2T}%L z0YF(-X6R*NNrf?WdqwU@`u#li`ql~;_l-&48FJ7H(m!1@+yhs@UPXJZbUscS4HZ#TNBjU1_ z`+e}rzZQnsP(lX43t;p81JVZZcKiEG44?M0=(k%dw&J)%$^hH}$Zzmqr0!V=7*y-y8Ja>ZRMf+A)Bya57EtTz_hbXd}~|H$e01wQE?w!g=Zm6QSS0T6tV9#+zKQM+0t z?@QXsBWHrRhj3gXWdM8ucGqkA3(E&pges(5o8>=Mb38+D6CR@{WB~jCc=YIN^ehLR zuP16}kFLIMp1eUEKUPu(z#rhK#|k^{wcCFb7iz0N(3&mt-TerFlmQ3;c-=YW=WccC ztpksgm+#7^&^?jaA8;>=kO2q;2-iKI=*ztFjnFhlV)o92!1mO=xNAwu00aRzH@GnB zTzUA*XG$l|ExKX(dwFhdikJZi1`xYdDVe=RgstZ18$OfBX2sRoe{q#X$^hI2;MSkM zZ5hP))pqp)|7`5=zVRsqTq%+=03iTyEuE!|8*Q3}td-B1hG_w{OO+DMAJy3gCo7-_c5G4O&-)B`cU?Z?XB; zoc6)sgpdJ<2B_ZnSL7~xk@SOUx~L-z4g!q(sypxiARz-=Qloi4&SkI zq46Ut@6zLm5JCnZ24Hjd+3+5UnMd#M%|GMORnOFReh8(A8GwfX^>4?-IfvF2UVLNy z@oLCgKcnt7(KyTyG61mv{WG7Fg)4ZTbWR8yIGAQ{-f*Z97aXJvKpa3#BU8P))O+rw z142%F)_SdZsp%_?kpLkB5D$2UAo|hQQVp$WB?umBt@;+ zy5~*WZ1VxGQToI2{5i$Tz z0Gvidor7k^(nl`4ChX@@Y|vcIw+)ZB5i$Tt0G)-pcT9R+ep}|Ue~=LK6qAyg!W}IEp0Z0L;Srs@mH6Hiw`$3t6icEnM`eyRD zo+f1gQUQ7|FH>dAH&w3OGH0_gxqsa{4rLwu;s_alrvM#ne`*fWa4(h6mOgWGiOVTA z11WJlb3(`fqyZe^I}%uVPdZLpdhZlN^#T72+Lv(_C1n880hkSCEHZx2UmZ}D9FP}e zcN$iEi@6z61|S2VbuL*o3}qc6+xEs-(+&j8kSpQXF7Lu5_+ z$6v3nA9(Y5biBGA@0ucH0I~to`q`0LZMhov``N_+JW=2*7WG2(iflmW;GSP&Y| zy|3Y!d~tI3Mmg^UOP5P^4A_a0kO3$FXneHR`)BjjU3oOZ%bm+aw{FzpYTYo+``q_R4%+P1tAE4LDR1 zG62N@2X{MI55L$i^WI5f-FSwh`hv%ahd7}SG5{q28fi(gQQO8cxt;XhSKVpypXd-7 z!mV0D2A~vRm`VPEN{**svE}3V^t!5kbS*kw0w% zH#dq1*oxa^Ucq%7DFaXm@WG=aap14uoWs=?z8>vg7dX$in&II&LI&U!KtM$>O+OEB zk;daB`d&E&`jacI$MHNLAp=ka;3cwE+R)I)-gOnrbnEHfI&Ysfn86}t0IC5(e|C>E z)kW`l*S?vrlb54UR5)@6-t$Sw0Mr1mxzRm#s|>qy#dmx z3r^S(-pY6|L+9+kC{Mn>wd>9wo~|6sF} z_odsM>lPfBNEv`8fT&bQj=4NH*|=ibhIKJ1mxMlW;cAzZ0cZwbT=3*c&%e#icmMg0 zBTB;Br%&ZqVLMhr2A~CCf@f%pelu;3%!Itg6CUy0iiX~gxc@-N0JH+gsHs$?_H9VZ z4b*VrHcDA}^x^5tc##bu1JDL=2`lMMf4WB2jF`4wmN(wL%h}eMB4z;E0a)r&9JaoA z%KO7i=6_@Bz8|rA8#sw?S?Mwe+n%w`(p1cMz_TrH8K)US2A~rlI-e>b{8`Q( z(J>}JYQf&m2N}$N;OtGv0CWLdztu7x9W1LI$80;O*%d z<`*0NR)1V~Wd5bMrOiy`P&_`~gbY9*K*)q&eTeYYQNbOr6^nhY`cQK9|HSqSLI$88 z;3&;+xf|PF?vMZZWT}4DI)A(CJWeyD48RY7ruTlmRW9;D{Fj)mTW9|qerxxH9dA-0 zWB`5wc=)dGunsbwjto^*<&D-dbAM)Mgo!~y24Dby<`jR;%ax_t@X|L|)OVIe$EH+c zxtWv!7z7Y`G&iCU{s@88>R?-2bwZ-(5RX=26;uoCHW2fDwRDHM~YscbpPyDwL^Zzpde*j|h z&ulqjvt9dL;+p%`i_ZqBU(BO!dpxdT%u3arOp{c1wOsK*VOCqEU zz&yZLXM?8~)*a+$Uh5nYsB_xE$MY4x11STr@E{jHwriG&tB0SNe@ibp%qn{ud2jphL8bp1`y(ZB;2{Ne9v~)`r8aP zI(hL2%y4ccWdK|N6e^dlH71B1O7cIeEeW|@H(%u8_J@=Ka0h5%++CWRb@}r| z$`2Lq=<3l@{b?N2qzr%u09Vzxgvgedv+v7zifc9h&P88Qz@0HE1MmdkLSM>` zc`u*7@NmV~{fBoXKCPq-fF}UY^ij@kmJ@d}o@+)0nn^gtmUNimL`KK}cmde1WXdG# zQLY{PHKTko{YKva{~mlaNEv{q0K6YZWt-hkAABz_eJfqXrO!e3d@7!rB4hx(0hH(x z=l0*F(EB#0?qjvbxpezn6rN5XWdNQ57=C@osZ*uU#kBr)mDJ-w!7rS*aX}$v0DJ)c z-c+KNm==3_;L5smqrpPK$ect>(2_C$z5u~H)#K%92SN{>{~caqH9YX+IyV)*&5Do# z@B@fFz_ge3jeSLNZG9bI<`94KM(6*Y2O?wu`~ixa!f#Ken^Wzft(Eg(SY}&VdR>B( zF(CsG0Py^@T$ldt7YAaGG8T6+b~@>hGt|7EgCeH^v*) zwP9_SlmQ3=7;B8;u+Uq`ecA2jE>YerJ6EWHp(QB;@Ekzl=`@XfaRgm%U|Ig%olmES zX1Fm&M#=yL11#v>uIzc;+P?cmtbdD(eJk^!8r<`dG5{d}y1VvQ)NKsMaDbEncmW{5C%)k_(;Y#LofZ$j zv5J}){LJUWGvI^_Kp21o%h+&$X!riYvRB%2cl7u3`o?X*tpgzg@DgB|#?1Nr{rTIb zqQ~4cc_>(qsmN`@swE)<5Dws`((F|g!?anz@79;N%&lc=T>s78lQIAi04?J2OrkTR z@3fi=U(M!c2@BoK!psRN0}u&N5Oy@RLFvt>gaNQuqLtc?dqL&GujV=uVhQvi5Y-s04q@~ z)yztz{oTV|u7=My8$_&X-o|N$kO6oN5d1o+dx$RX-|G3b2MMMP_j|&cUf|hdLIxlP zKwHG+4pnsQ&OOY(Egcg6#B;enz-fk*0eAxtDpp~>ul#+%H&%bU_%Y>#)9laj-%82= zyalLLEHoSH`W?_7seM*aRix!pvi}o|MF|;zSb&eB%8i5bl=Xt#UDwq-o>0+DHd$fS zl8^z21K80qw*UH^x30|-E`^z@Bk7N6b_ZeMh>!t@2ha{KiJMERSaRnk}0Nw$dFJGwU^?FIQ(@lLboPQU) zs%G{XoX7|nfJA`oD!cPKOx~u+8ZX!r>S(`-Zd6`mCuRVW0E)HqC+zn6b~?rmTuFag z@QTsZ0J~a98GvMfcy+pvDM`-nS8t4!bj9tBFx2qFR6HpIkOHvEV&}cn`s(i%ix}%? zj|8^FJPwp&CuRUr0hV4dOwZr76t=mkGTIdX z@ZYAXtq*^F!*hy+3_vnPDQ_(oJ8YIGp-qvSd()0R{0i2ANEv`^fa#qE z=7omWy%bY!md^*Ms?at6x3!Iw0muOe_SR)_cQE3Mm;5njaL#9wJ2_fD)?><2jPk5vU)YJ$3@HPU2OuX+uiMMRboih3jn8zgB5ImF5j!v|O~?Rz z05~@hOPM*BexBdt6-4_Fn%Cp0Ez+9yW^f*&b!W_dhq41_P>9a z1;cAQu~bXQ0F(f*CHxY&=UG&wAK|j^NPml`kZ6nn9)cod07?N8giQvn>UtfdkJdF0 zxA@6ge&prd|K7g+{~3TXfbG`DA1)>p&pk9a#XohoQ0~i#v}!EX5;6eg0Chp3dsWqP zPt<%9D|&Wk<4&8E|Gtl%lmVy!Sa-;AA(}FO8Qi{bCXMbl-AA=dPTw3{P)HeoYJj1a zH7Vu~qP@QEwWO8GD;GW#?z0`QX&__(J_1PH>5TZBtnBfbZ4=FhO zMK1*o-lD<%5+MW72(WFB!?xevY@JH!*{0XSF4FE@IM#=)3xo{7R{)cHr+!BrK1j(= zLFpp-GCXv^#^^UTlM*rjO#mBp>nP16Y()o$TU;LB{!6(#|IIZ_ND(ps%>c}SH-r4* zA~iF=u50bnfByNmks8Jiqzpg{z}n{b9?rp&Qb(#J_;#K%PUPtG!IB6m1JDXk(y|ov z^Nia;r>TW3ck{Z+I=gc?Rgy9QZ2%ABRHrWSRkjpobFw}RDHBiFBu$UEE)X&R?Eth2 zA_DGD6n(uuHcI(0J#nUu;j6%FKnWRuZvY4KjA@g0Xjx^B9xs@G&DegCn!gRtS`sn< z-vK@)Sp^>~=m-_h*f;;EUsAHm;eb6Zii8Y62SEO}cPyn8%^P{At!{r^Dv#PU|L!3k zf+A!9Iswd;4V$Dxe>h)Vn>J@Z^XjtSD^)BfkTL*W0BqmuwM|b_EIRS~B|lIrsOPT` z8^exrLI$84pfk2j^i7SWsi~bJ(~jSp_-v^8FrFr50D1s+E8p8{n_igv=yLe+f7>2g zyb-_8gV&1@G61~*!DpLe5AL^enH0|16Un;JI(W?*Cjn9hpbtQD#qZLibFDW&Y+0a^ zYY{QmXkAZ@3p*hL&<~(0JT>&=$=mH^H@S2tG>f{1zJFrDMUjvJ_yM3zbL`CmLv!nv z>tVd9{HorQTW{kKC1n790wneD(9#tb*`{z!+~mtHRM6B|hZ`(X24Dc-kJ{L)4Z6}^ z5t$nqWY;7&-kU0O#H1P_1272id^|ycp@7OTUgz54jn1(WMQJb0&5$wxLjWH?CuQU+icz;E;RxS=3Dk-e9Kn2c)dk3P?@$6uP10r&+FKJ9LF zGGOFrjeNqni(^c6bss19VJe=G0r(Bzu{gGzVyb_2O?zRN;3-F0_T`}~Smq>T07d}L zYO?xSU&>jUSr(!aj#kp<99PA>Hz@-!3NTLnDlznaiKa~agLT{JUS$^t4dX;c$^eW3 z=(EiKunO-GSHHYYu2xCKR-%Y^KRYo4Fb=S96UDZGTATfQMy&)lb?np$KYhFz%bbJ^ zzyyHjV!U)XkEnffKo*nr$-M31PB(3_gO-p1m;|u!D&iOzy!WV(;mGKpzTA}K4>YuK zQ6yvlrT~7^H!e5`)x~<9o>JI+y^?hUyD#P{Ng04?0BzLAptqT&&DRvSB>0RTW28vR0L%h>n4n~H5If|=%4Kw% zH@GyQd6*w}0;CMU901Gy{5NKnW5IqxaeIx7|LMPu{rMIjZ$bv(A3*!UgEJMJ561cD zBR4*7QU+iifbH@dngbiJ32u&^3dy)Pu~;p^C629agbcs}K*Vx+L8H>n zotxywe5KVQB;U}xY{9vekO5c(U^hVSiOPHh3EtaxqhzM?6Zz%?Tj`unM5ywDK>9isIc(B{`0o2gj**A5PB2c2zm63p9_}-HSLGFqYa?-YPs#we0GOJn+wET%FxnvhpwdN8>+F2& zZf`7T6EXm<0BVuz2A>@aXSZt|i6Ll_>Baan% zjjw%89@NKsP6!!*Cji&7KfS-C~QGD;272mM;_Soglgu;|Ed(;3>d)@rTJjr$zZ2 zdh+KR11>TMP%UF~1StdH4Zy{Go-(+}>WpmYN)_+!D%HD8-@-8=MaTd=12`xqcva}| z2_f|x#%1G43jReqzhfbllmYMoNRbE~?)!L+GqbE^zID@0As&}xH+(e+Ap_tG@L*!f zeDepsBS%%nBUD~jlxnU9y~YcW2^j!CfR9)3Y?8aKPPguHPFCwe784at08$3PAAnut zW&Z+Oq&7F_$eW>4vzZ(NSKnbKk&poh0I^2o(r(^^R%NV_ zxWOW2073xHEQ?OoRTqEGZrHXsvUozftUqTLhWLaGKqx?x=Nz*}P0KXfrSywjU3DBu zYS#s@F`1A7cma@Ga?8L^ze;9b|HXa7!51DJ5>&-vFew8N2Ecg7{CRNGoA7Y|%dcn5 zY@39SrkO6oFFt^w^d1aR=H~*WRjTGI}8y45UcE>(rLIxlTVBx0G za7|NN+BtFC4MH6bu7_H)F{4Y$07L_f9K9PjBjitWB`%@#^ry~MSnlPbLv)1>rGeZ z)fHn|MeL>^WB^hCuDaSNP%eAMALhzz*eoOcJi%nX00Ry}1|Su{hEL|eiM~x2W{qRI zrzl(*SsCSV`$NhAqyZS{$|Pm(7gv8)lGlF5tnp%l=0~idkTL-20P#6T^(tq*+L?vq z>=v*1u@ofj!Bh(=1CRl*QasoZ@Y(dLa)6uP2{rlKVH5^9dy_H%nE+E06v>Q>V^+r# zKS%W0t7yv~O~+j&DFcuN5L|KpLoB}WcERveK{;%n1-O0NDWDwKqmKuC_NHQsw0{pB(=7A=E<&lbeJLKn}pYEh3v} zDS}^280+wCm)rDleD@U28l((BE)IY=D-bZx4jOpH`p^H$9+<|c%DFcuPU_N)z zo~e{2ZG!o%M2B_pz9)Yq@Zlq606qZduMO}Q%Nst8Wpm4GFbdyRw_|oYCUXcGfP8@U zD_bs599ehYby-^g0C@BL_0KoN=FL2-1Z~f;4Y3@bX<^`y^`efmBPsjii z0<J?E$X+)dMa=Ec(%+mpSAFVqBM#gCK$C;{l9Shu&~``NS{dr9le;J{D*M!QU~ zHrxv08{|PB)tw6{NCmrLcuBf`jmca z(xAaP073?!5@7h=q_H|z`n_Dg;W>(Jx4zq*8N!*5lmVy$@b&w}*jyTSAw;}yqI)ED zdTHx5Yn=HA8Gvd4pXlKW@p7V3+q!NPSjSZ}KU`)I#`6z^48TVKIZm!B`!3s1L5jeO z0~+JEwEld?D2tQy)p1MnH(AEu(Y>fQbx z$nf2$8?$ZN#<>Oe-lPmb9YE~fupe26w`8m?a82yr;F?oQNuPo5bRlE_>H!i8j}OuK z$9!i=u(&e3_V%2Y@GK_PNEv`H02zywGI!a8TJ0Zc#%#S@s{hnt^&J+!2pNC|fcA}k za>tx^rhVmq$Dw%XMY5gH3_h)-3_v5msmHTCkF(^SO+0S%FPlho)w+{`nG;e5;48q% zGc}L3UMf{Dq*kd}tKlsKhjM7~Y#AW~&;-D<()#(>q)c(nkv-;bXX|pmwHuvfCuRVe z0W6Eujxx+`)d_layL?H+<^E}YI{c+c8Gsgm2e!c*gSBp0e#j0j`>vOj-g>!MhMkxJ zXa&et5E}Hpc;?}U&&>H1?&@0%c#=6W$|7U{+5q^r6uz^1H~q#j>f}csAGSfc0H;A2>0r&=>WSg0hX>_UbEPu0+v8%o0#4>|1 z_Ae1K0N(*-#~NLnw0H8-AM~l$Ggr)cYD3 zYM96- zBg*2Di*b19w~cspBOwFO3y`vZAyy-~fstO@V`E2x zzH^t;*j@8&PyDrCSdSxR0Qvz`{Ho$!Ckj0a70NU;=D0&?$ybbXD=7o;13jyqzu3i zz+HR(c-pjuj_ZHUpFdSHtbRcJ;z|KX@Z$buO6d=WVdiCLiw`?$+^B zIc#KG1r>v0N%lGaQK@)ee3l3qfN_A)Yb;*YGDk(V5~T)0 z8Jupad0pqgAC8a#m;iWe`b=csOrh+R2jhF}$Hq1`vuPj2`veFXfJuORr&kp;^`#;b zsp)?5PjOqR^4`Y1Hz@-!1t3;f!tp$6klw3D+y7g0*Q=?j)(^PRC1e1m0c@i;m^v;U)zEFdcpk$tLI&Uuz`OOgnNJw>AL00W{F_pDytB(eS62*a2pNFC0C%oN zFEeR5d}8mC88$WH8*V>x0sAUR8Gso8`FmoN>Wn)j1{rqI?26>9YxCU=K*|8j0_aiI zn$%p*@NAR$W@J}6xU)!W@(`vT2^oMn04W~s#}?-VSYBU!p>#-7udXbx3#*o-48T7C z{z=v+TL*P+i`6+;ZjWhC{H5oHiE>f~U>?BpY)!SH!xpvPb61zHudu%h>$r$Rl#~Hj z0AMn$5IZLz*YYb;<9N?+tCwm=Cql8(M92Uv0>r6mADIbx_|H_~Pq1-NVAHr-5dLta z48Rfq)t(b2%x$jiXZk zG3{we{Ta(TgbaW)fTBwEuA6)(%+_5S(BpVV^@r_WI{t8^41fzjW?#jqo7s&$w;5J7 zmOgo_>aXK&!8|rO)3R5iKGm`6M*oiv?0S=!{%tjDpiz1#A!SQObxN(N5}wp0(4NfbjJzJ zQj4b-DFhkcr_$Ch#R!Fz0q_D)HtXqG|8Co<_T3kEC3rn^yA|&86;DDEG5}8j7LM*Q z9XwROWLR9;dFrjzndh=LSa~I70K5UpvcJBhPs*vyiM+hgiSfsb3GYD+X-FA>X8e(gYWFQU<^WfZNIE$DZ3qb5|@f`wzuljb7kM?8o#eAp_tG z5Or>5CsoqF4eJbSEf-k@+3r^P|Hc=05HbLM0F!&aWSj`HUY1hnu+4v~D$%=#{WLo< z1K%mashc!h)1|S%~o?1>@;{2bv277Do{C4k! z>=&z8z$0Ys_yc5HBC4Y@x4tS0Oh>!sY1^AWHr=%!!VJO*O|E8Az z=HXYA4%k>g$^g6oDC2u*RBNl%n`xpP(qpk_Z|J&fm?$S@0Kx! zaP?8r4n-{L8{mi|WdI@o7+4R#Hi0Q<4)a zo8P>XrEU?KkjTVDIVl713V@M!^R3@Mm;HPd_10`|1r!aME(T!Hg^&S=0^mxGFPjeB z<~VqC!{eKoD*lyY54*AGLdXC_18k`)=s!o9zL=DEy!KXym8Qwoln0n2BV+(x1H84n zbtdiC!s#&1Eb7zu#zyZy(M`fPqY*LyF#!FdDe~NrmOT-(Srd*cYWH}S_htO|g8cu_ z0K5VCu0H#~xntmG)}j6}3TKHug3Q-&sw8Cq-U2)@mJd2vB;n~o)fTchGh(^0rAvpM zm;s0dh>|sm_M)$8HGj6>KPJWf4~NjH%@|J;G5~P^>UBJs-G0`q{Zq<%6CYXizW5w7 z!)b<)0f+}Ur5wr=ernJ2ugyA69t z<*vP$rXXYh-T{1`G7YLa=;%wI_n`0#J%uV?16w;z0)z}eBEYdNw-33qOB&mk^(dPg zw!Hf0GFpk(*Ap@TNdP6$3P;+fzISNivJ2{joE9abH8NbSt}d-_G54?8gfkP5ICIbIW9V3;<^ z%@onOZ%%OfkIFs#;RqRkwEunwr%QK!CW!A(8LW0lqi{UlO!XdT4N?Xm9iXL~j^};a zg~;==cASU5x;9O;I^YUK$^c{lm~X1;>~a3hZ>>g^n5>>s>3c7b^G@F2pM-AYDNMzaG63%Z zaujqEOq`i{9+itR8b;E(C|!sh$80De1CR|s-+U%Uyj^RtIJA2_Qsv*3Q>S`yQ6yym zasa}%eOme(eLs$AYFVy>;*69sC4R z1|Sc>Zqu#ZL*9Gp1ydT`oM&5&%o{cpVUn4U0r&vG`F{C^m(c62?14egMTKQHu~cN< zz)d0{1CS4JGJ;!SoVCV`wm`LJ$A-q++l3Du!QLN22A}|7IlER=y(EX3Mlz*l@PcF8 z1VaP{exwXQA%NDQ?VJjeb!T|*7t}{@8)cc0xiWzV>IfNtB7iq-7vCH=I#il4=g_t= z$0&RuOPo!-!9Z$W%_1`zXlQIA$0F~>x4jg+hD6O-2 zDV$!kCa3OXKo+iXgbY9_z|b@A??-5DPqrE6mFTl}ifn5OTg8?tLI$7=pi1IPDouC8 zv}h$o@L!gjPgkftPGDz0Ap=kjz?g7U@xjDk>EOD>?>Dyh%4mnWVzPE00*cqK`*t1T^ z0Mr7kba-uNVD&O`a=Y^}%d9i+oBVJEM!SRzz$bvwM#ZcZtxk-irriXJIKSbgX zC1n6U1Ni)WV5WQXNs-d&bbE0gTBZtx?Od45A!GpR00c!-BObnLd^43Ip(WsLG0?fy zaTJR#gbYAEKwf!uzxeP6y};U~)qR3;V$ogxcd>>-$N+o+m^n@xRdo0F0q%~;whHef zIolyoP6w2^oN|0Fp-67Tu^6_uhLSdsVFUYtH6^lvjAxl8^yt0$3j}%lwvu z`L1>I6ZR7~vfs_fC9`3JI3WYj3?M33dFp6@T({7p)&0W}N6G-S0q~VD z9}e%oE~OauNHxu$l4@0s1^*;c2B00lk@B0~gw)zfo_5F9oZ)n@`_28B@*-sbz5(#+ z$2eP5%NmN*E!#G4)xO^tm&1p5V-qp}-vKtCQP}QW@AUoL$Fi_MhOxQcoCEWC+MkdC z=m2=cHo92Gex-Kp{Bik*mA7=YJeu+0BV_=H5nJplXU?5EUrOW7Zju;Hb?>>at+X!$(=Ap_70aIA{SpRuaaC8+!Bb0L>rovtgc z_pw2okOAle$Qou`YPj$J*z?kj3f=WS^^dzXn{bmz$N=;ML^hZ@Uv4jndpYUAQvBe? z;!nW~_@zl1fFA&lv~JS93YZq4vGm%=^ypL2%q+YjLDxkeR zuvAb@C-MEkSv>Pf$N&rhER-IK=JsDsJG*neC=f&K(RcPu|Zp%TCMy%mbLNnQAL;y8efn z<(UQD^e^Gyj$zz;lQIAc0N3x&^682*nrgq3=#<%d`x1-JQ#b62Cu9H?0WO|67rs~A zX_oVjY-B?74$Z{DP#3%mkB|Xa0w{|9u~yCfR7Pv&sbd1WdUljlHa<(F48Sr#u$;!^ z)E{H|Hrqp?Wv4XQsQrvF1|nquRsep}7#AEoDmap$rkj`}f9yj^XW$-eJR@WPRsn=q zXJ1T2Xaoelk<+62_cXtBd>0lhNEv`NfX(RxAAQ_Chb}nUo*cWVdS6d1_c>m6M92U* z(PL}du9Ight`*WdTP4((<9MvdzOAp_tFuy)TXe?_|JTInfM$~}R@1@7WU z!|-AhLI%JMz^+W?h^hy7V&mJyWAuMxZ=7=8!Hh`+LI%JcpfmQ2z=n==i=;LC?}uG) zHWjp%H()GE$N+c%YzkSTm16vr)hTiRqq&p!w*cS$%l|#6`2QJzCjd%om&^ZdSmPX> zb^qF5p!6xi#drztt0ZIqJOP4&zptDq`}o<~Q9jzz0Bj zP4w_4uBh(|JAEJ7-JhV)vG5QyRtqX(< zfFHnzPrI+57fFdw3CVrWonb%bK^K{bhtUWb0Dl15ye-99iq#5Q|0=VE?^3zno;!gN zJ1GMY01#{{W&1a{FYH#;LZ-vBC?)F6yKxdAWdH&JqDCTqF>B~P{HGk>m^rhHuWi(y zA147q1|SGv=9momHy8w4O#8SaXd8V{(&_0eBAZfvP`#S>x*YOh&B;`j_JL zMJb}kFlZuV0D=LoY-b92c**aUvh~b|H?{AMZCwrx#V<|B0E7U%UyFKPdtNm|=8S)l zisszqk`QYLe3l3qfKY(h?2Sb_nQ_~>5>i(!AN+l+r*(=GUjjqO0KE9`cNkZBEiZRw zF~*8nFD~qo*0VdGO|iR(kO2q-I3{QpaQxBB@#4C;oyP{l9&UKL6Bl+;2H+)tb+7wO zU$FSK+cIZd&TthrynFHn_e-P=*^dJ2^Y;C>86)&6~(ZO zlmUnVnC0=7`+26cPm@!ia6V6JYksGfI;QOi8GtwcfkV6lR;ouX+j1d5g_c@D0TDM39EazB^^Gk{`~8HhGG*wt%M9f5&+kq^k{vy)m^lW zqjgRBAqv^$e*s7tfMfu9hrYKth4-_mjysL1ALpi98`$lLwJbsgAO#>O?CjN*SDI1u zrgH9YYwQ>zr0j7#kTL+N0EN@Eu{-3cxNlt-3QY~#tub2Qxq^!#Ap?*G!1}fAAwRP| zTc6zQTtK&TZP|v|4fwPYG63lSreA*bav#wQda>b=rEyj72hC=AT(U?RfQ?Qyw1f;m0RV@vlKr1Z_8R|Pe@-$5bZz1}p^ncIDFaXlAk^C@EVz%QHRtu|g9-2C zrFR$J*pJf;Ap=kZa8l~d)x}G6?OEGhmD+bbwUFRDixU|s15gZ5=WV|Ab^bQ@h8FEi zousMjcLX|Aac(7K07?MN>PFml9}W4kb1UOk>1E~jRNR|P@L(e$15gUE{({x1%y#Lk zarZ7C*=$jEDEgaaF$S-M3_uxxiGsc8lac_#hK!Z0NhiHcM|JkjU^bMH0VoF;NiWfe zk9w3no%j5G!RvEu{>Mh0@xB>C2A~4q#5pd{>k}?2Q02KC-{*Ec5gG-k#;d{D|-rjK9qXpZ-2pNEC z0Or8m+RL0T&%C*ux8w3VfjXt;D%=^9G5{X|QYyRn@9Mvl$f4gH!hUwTO=X!KHz%YF zKn*~CX@bN*vt-GSvx)^itY2|FkTL+Z0K*qnH`Jsr@r=7(dD`z2KF9CJf!~3Y z0r&(k%`hSxuUDmfPtI%7revMA=wk_-1V|Zx&j7&!Hm$`wIxByOPAiHF@7elnc0mT? z2SNs*4&aKJ{1>-FlvkddS4pF=KGUP(m39($#)J$&J%Cxn#-EvE1shLGn%ywaQ>^*g za_Tp3LkSsxF91gUs#eW5v8MAIUcUIYtzx{W<|l5}Ng03!fMSP`CzPczArV=3*jOx2 zW?i)X@8*P*0cZp`$b0Frs+B|94=T%gmd16mUUW@g@s2@42H-2eXkh-HuYXH7AAG>= z`F8gcRS0{tUpU$Cr0$N)40l;rO@!=Z6? zPh0_Q^PVdg8Pk&FFoQ+P0JH#jJ)yBa53={u z#cr#0tJZ?vUAuecvGGcp?8FSfHvlzfV_(a(!idogoDA3EA8n4Txz>(-WP}XBcK`}b zo~b00?5%V@ALkoJ41;zaeTgYxQU;&{V1wPs%GBps54{Y;WiZ5l(APd&f@7MH0q6u^ zJDqx%^LN>!$+YtHsH@)j$DfO0_J@=K=mLn?aiiu)X2sW^AMQ{-!$xkUv**Gw93W%> zx&b^|LawuZuH!K@{i8Rz^wcxlz5~|>QU;(0;QMlK;ZMigW8SvLOKsOJqb^T%tQN0q6tBjC*J-p2hBSheE54Swt$2e1?oNk!*mPn?$s8Gs=G$9aZR6YoM_UfS}E zW_qY^j{3bKX0S*ZfMI|GG{5$!v&^tlpx?o4t4gJ7@_RfDwSEf;bPM z_XYx?=QR9kcP7y=ys$om|0O~OU=-j=Psm@f^9D^ti|5_Bc{ByWzXf7wNy-3>0T`|p zepb=Rpmdf@Z+@j{bdH98?kWCT2^oNK01NJd`l-MDrk8zbO7gE?cU#=VgqcKA24Dg} zt0VeSwLok-fR;VA}#O&KiUa zz!X4Z>2G$A!Puj0X*!c<4UjE7zLhP9otRoy7cJK8=PiH z8Gt_krf2Vcu$R2vaCz21|J-cW;TorEIvmr448UK2=2Sgb3&nj84)^Zo0Gk-6oT~>O-X~-L76EE%P93yeGS%4Z_1)T7>#2Er_SOsdOA|5xO8_|)+yrq6bTuCWq|W+$|2LI%JSU?q^B?*KjJ)82cY z`FyKiJg$D;Gl9JhgbaWeKo`eUq0Fmi3@Wv`7fp5 z;LB}zwv3Pgcn)wgG=Q2-Ez99fXYQe!4k^zUnisL+N6G*M14#4o54%WrU#rlPGE7j~ zFn4shyYmgm~=E)|4M&tF){t^;p)&WJNt3jC1n620R#f` zuUOdpy;u2)?(l*=EjIraL|fqrJHCe3&}^ zmq;0aHvp||g4y)+A@`ydB_1EBYFA>VrhbVfb3z8-EkKsEQ21oH+O@-hOhcb&?Tp_A z?l_9adk7hTSO6!M?_?i zXvk%dkccr5Ap;N((CfS5#UGQprJKw=50(E_?tHt{hdn2x3_t>a|KrIPj_!`^_PPrt z-r?^8r#Zzl@zN<{n=o~bS?T0PGqDEKqA0i#X~6lmSQw(0ia7 zURU!z%CY!T277mux?G0WUCfaYG5{F>bJOv3CsuNMQ(L1Fel?`&TsM}(+zcrLkO|PB zv$h<1B>5Q4zFqEj8U}cnYZ8XBmPN<_WC7TB58S$&>z5+^z)*}%zCk$meh{XBNg06m z00YM5jZJcLL!;VyQc9zKw=1XS=Bjah>Ek0ELJ+ep20DJ(bxwo|JCdfTeV*2sm&bL41 zvr_U>aKsTZ0Qmr}ZANcTpR4KI$46gMS^ijdn~yFYhbCnJ3IIey>y6)Sx^r`S>phx4 zouwUjr@vzofs_F#1Za$i>+X$CFcvqw?Fn zE=pu&mR;B9#dw;O0VoD&zhL!KrgK=oPWyU=MBuQTFpmm0^^!6GB>)pTrgMWCV|G<+ zBfL?DIpqbD?wIl-WdKS6a)*^U4prrB|4xZpaDO#%v)8g1(vUI$WdOQTNe750^&vW2u&u0jK~l$^Uroxy_D2 zNrM-%Cm4?BCJ4>p+)By-R06Oo92**Y_u74Dsp?sUhZ9ewe)H_Y3I`zrPzCU$$b1*o ztJoAHhx2T8k4g`#zrL1?cWx3g0M!6TT8|YlGJU;Of2zjV=EDYsxLp;Y@ni`dUeVM7Zg$k;1htvrmh-wFa^t!UV@{*zsMWELjF17S1DN{z%ID-ky>{AI-B zpM(rRJwQp}=>qHi-J$~L1$GLE#Rt+lZI!_3o{$0f0?_54FJqMWlTVvhTmAd|l(5&> zd3=^g8Gr_Wkn;x=Y|2=IsCZ=FrG@*)sQx&78iOW62A~nZ(`LZ=%zXZ!wWIuvT=8%% zNr`%Vyh#~=uK=;Wf;u(j^&UyZg9*wGVv5SH{`fnPG5}2gGG=+~xsyBt95ES(Y(uC!W>fW}TD)Xa~3(;Kuwc*J9Tj1x0~{RcDzJv02P(kTL+@0Awx9s5Rr` z88{v|Qe>3)cW)YWjlo0XgbcuUfLDci%AAQKx>pPDdDZ`Rv~xUbg|h}J1JD6r{XVjJ z@YaFSM;`K(N39ln2OFPMVvU`U0q6vvKT_=MZ!Y1U-aUMzqCR9IJ~K%f`bIO8YLt8=;r~5b)B)FNLI$88pp7!O;^w=!{PkR~=E_%3eWSHL z0YJ(C`~a}!it$qZXlfs@sn&I=fH|h;%QDtbNEv{i0PM|Me(JiaZ4hi>=a^ADpZ{Z9 zk{@P&2pNC@01ZJ6hwB>ew`cr48AQwQ%{k5{76T4a24E1NVdw5^3#t^nH&aH0;*$19 ziQjSM!dt2c8Gs>xGQV#_AC9k{r55Yn7w2kzCb#M6aooZYG62H>v;B@V%8Dso>k7NG z53~N;eMZ|T0Z;oAG625-9I_?t>K`%>iD(F!YO(NSWUBCE08YvP{04Y({Hsymm2BTi zH)TZ;mtmF6YsTs9#0CBxSE` zl9io3vW2pD5@nB&J(5)@Bj4BO=kNIg9?!!2eeb#Fo_p@>mBT^1uylct0r(AIU%Pvp zZ>g<<{Y-KSht^FapAFk_^NW-LmWEJ(Ap`IiAl`42)#cNTJkie0ix;ySlQuqesmCo5 zLIz+7K%;zZ(^Ktmj|~pHmuy_NhQBnI_HsA3oz?OvnJN0x-O#ypgSaXcLvVl;lQ3 zwHpQ;c@j8_5;6e)0OBuX@Q(6Ge-q$v4J)ZPWqlg-1-~Uy24D>!XI*LFol;E}bq&)f9G zvm5(=y|;J!C80(P9S9i!2Y}eCEfnYUC<@hst=A9G9x%R8CMb{nmk1dEM}Vq`A)Q&u zO%k$Z)9-f5PiBapr{uyJh>!tr0&sFQyt{41x8<;`%ul~Zql=FYK9<81+Jp>%Gl0Ym zIZAT)8Js~YjoH4_Dj1QGG5{_B&ELxJOE>QJV>rKb=(=a^k;4bHG4D;v0Js9& z*J3=sZOBydki3d0`=J%?vjP;DrXXbiUI3hIyJO|3RWLDE(6^1@ps}f=%UO&nNf`h< zXvj9wArl~eTYbcC+j{p0EZIy~8Fpf3os+DiF&)srw$ zPRIaw0Bktmi8s40eA^}MvM2sKXC_l*Dt>5E2EY^G`m$$xL4Ui=^5;3bZpq)jG)$B5 z(I902yZ{R4`Q3^)UkG622+=~pA=H(OK~{@W{NyZWf1 zg-JRIhkH^6zz^W@{U0*%d+p^Pu?I|v`IY&G-!I|E){TS=z)OI0%m*uij!hm`_+|97 zZ==c9b(fUlus&3;$(RH5%V zlk*l!%CI_n;g>j}kTL)P0G@r1k6jsm#yWgwE0-o8zqjOkJ8q*F)8U{=-<%b%u{Avom81;7Yk&_T9`0o} zwd4I&zwa)8FRVXnK7+9aDFYA+P{Fm^r(SKX`0g{F=bYXy*2NT$dhoJmLIxlVfXZ}K z%ku8dO-A2C3_>j?WCg03*m24tWB|eeR73L5od|p~Z}!YNeM{U_*?~tbzSz)@kO7DQ zSd|Rk6wv6xklx->AG3qC;%>~f^LT|9Ap;NzP(0^vD^UAUJN>SDQ>RSP$7`ncI=E{| z$N)qE#M@S%Iy?Q=OYGW1o_l{%J&ri^;u}ZG07L`){P2=b^j)(l<$*7LH&V7d?D#>C z!we|{@CM+Ha8p^%Y2ml_)$B6n8H&Ltub!d992p@45Cd@gL6^4%?Y7%5C1+}+0u@eE zEgIvuM9Kif0(8yL8&|u16Zjm_8QAPSVZ7s>un1PQ5HbL907rV(^Iw=5YI2&1t6=ai zs=jr&S_y+hLIxlnK(uvaQ-e^%v(e2JyT|A36p9z3@mV5e01^N?=E5Y4kLA3b6v<}3 zIb~EjGp~k`04W2I2*C89LVf+a3RPXr7?0YG*#}yiBujDUm5>2Q0?_EJH5uDoL`i8R zQ zLIxlkV8iz1fS|3N23M_CI-mcvIj(id1!F!^1|SDuPiFtie`h~XzOA8I;L(!&GqhZE z9p`C61|S!peW__$(34lpho|**&g9(TIqFZ5*yn_h0eA;6ukp%qkK|tK5`jH;iz{n6 zK6f)PVH%r|0muV*Kinvt@pp{7{+6FaA=Ta_m2kVaI2aQ$0Qmq%s$Iil^zRTR00jW@{)uAu-p&-IzJ0v+lNWX8#RIQ#o+f1g-UAGA&Rf%0id|Z< z?{&ETE+_c5dMy49qzu3Z0ELn2>N9ID3gTX_rxM1M1Pd1jFu6&}02Bh4A7yLHP~l+c zZS`>acErUrJ4LYoQ(lA&KoP+HPsObv!Po&PRzu_wt;4lFqZe5*sYb{E6a(Z9WK+sK zv66mHp_D1ta{0^&`rRjRrAWvClmHk+=RCIc+ja5c<2#F63fFHiepF$Ey90y_Kq-Kr ztxdSe;rGuHE*mEpJTxi4IahxU??WME0LlPT7A{`hcR#N1fhsvs`H)boOVB? z!OS`#15gRT^)f^4o2-JvzReQvWsZf}w452h$D5P^r~>#M^Xxd+y9*|_L` z9T2MRtiHZ8MC46K`PnzlF7sNLCfrC?pZLd%Nyn-W&j!i z>}V8&ec8mV)=|W7W3;0PTB9+M#@k8=8GtVU=N<@AakGxo>QUQ0+2!*jb2-3C87mP8 z8Gx?$TbxyL;(6+2)S zj+6mt26%aj(YJSx>kZyRx_jr^{)h*+T_40Ck&pps0pRG~*`Gym_s%UDA@M`6J62wA zZS~?LW&m0NLWI|O4w-LLuC(yF(AYF*QOgt)fAsy6 zsuJImoS4xiWdJ$>wrcJcjSKzFuCkE*k25!TJ|ga*Fy{FP8GtT;n?F0>j7CgVZC>vn zuDFjYQE*QX?pl&E0NntMD#ixk%zOnYHM8>-X+u#Lu1eM6HYXti@C_jL%6DDyO(oR{ zpJX06W;apqo;L_bC!G0Q~^zj0`{ZMYho_Nly8Of4+FJF}wpaiKGm` z0D$qeZ@cyc%dPIN{P;_E?6J?bKS8%}0ZzyO3<4NE-1VI~-zZjTYa8#L;#ZM6WqQ_F z?@h=63;}4XRJo`Z_IU2;P8Ap{8SpVr@=?V;x`YhCFo06cA1c~2GEQf?vsO4bSG&x7 zov==TlmQq4;5{W0q9{G6lAyv*W9pkDapSoCJa$(lWB^71tgYp&rH}uW2|p9!8bf(C z(YrFX0Z%6oG5})$$}UGMuP8OmE53^|iRAeaB2c=9kufO)Fb<&GA(+g{D3qiZHWWl} zm(HE9n2(PJDFZM8aNg$W*!r5kX7+BIM@>)0&UqlS`$)KRUS zjAp$XnQcEWGUJsLgbctWz+yT5?KrEyh4fC$cA}pJt=F#>f5k(Agbct>faC`!KChqb zcoQW~=bjgOHpXA-U>{y6M92V40nqJ_ShHPM$goYF?SO{q>h5obSFvWDlmVCq&Um!vTU>3l{ zV<3BcZBRKYdn`ATvD3drtF;TKT|x$64nSm%N}`U@;Fy)pE8&MMH?B3r%;APMDFg5e z;Nq>`%KNqIfuE@A__zfal}G&dzsI97gbcuM0P`~w+xG6hRaO^8mzd77(J<+x4W?R1 z8Gw0!zlPQ4b-yQ`6~46hOi=aPzbu;;sW5IOWB?Wb_I=oC@=)pF;|$Mj;%0g@0upuI z{n%cNkO5c(*mL`6cU0{?quH&a#?}JLbWd$tH{xCvAp`IS;H>|l69&avj+=jdJaXPu zNA%rkAB@OI8Gye4-p09(Yo?FW9KJIY*3EJm%AUH1zceWWummu~_iFbQnRU*|VoqZ* zX9UNpY6hLL%Pk=Tundr^B$MB4SYB1V`Z~zw7Uyi$)-U+Rkum@)0QJ`{MSruc8L8d7 zeM()<`iZC|*A2WyiI4$U1$ajneL`o~{hFE;#lpVgg@Q2(e;oNp8GwKP{R@5aiusoX zRj(Dum}b#L7G@o~f};j01F!}lyw}KF+? zf8?V#ysuwUywG~t{y^}?c&wl$WdQ5}sK?ArEgH1xx#n9V{MUW+JbZi%7q6rYfCE7M zlId(z@z!5+xc*ez@f;D7<;l?A6ck^#@WiD^W3>F~+ z-~=$vvspw{?(k-XV#e?)*(>>GqW>P?=uOA~I0Nv0HCz;6TVA}JqkMyEEh&uVz65Sf zkum@-0OzRoUrdT%dvnTsp}1$^&CW^Rtys!K$^f|j_cO46eC{`R+Ff5ti296B+0|2P zZW!~CG5{|CHcx04Qd0=jR((rZr*fh5Wno0BJbng32EYyAL$p}rfiHHceYtMU=hpvt z7;wv_1bc20G63!XGLqXvk2^iuaA2%r&R-+_)y>Oc_)C*A03HB>7j4!&4=3d8iBkB= zxG~hOCcy0_)-Mq<0Gnu<+Ykc7~JY>rV4baXyNw$4G#b0SE+0lTR3R$gu29n`j?+7ZjfsSY3#PHlz$d z5WrThF6TU&w4Fn`9MPOAqIu#`n=y?|$^ZldP~39j{Jn8ee_-c$*uddS1#?f-(=oay zWB@_{I*lfj#Pb_y&z-O2iW1RLio08aD|S)_;5EP@pWf7DCO#`wR`rF_iU*os1%hyF zC1n6Y0X~ku+UG}oMD2QtVRd%s4Qk$-JUj8>BV+)=0BAXx7pVH=Je|vbU4H&6S<=?% zff}BwC1e1?0c=9X>cgX%icQ1&tBvO+PxQ3Ez*&@(0f+#2`*4KqeSN8m$f=w{i`9

mjfjk#jDA14$-1|Sw7MB<*GT;}Sj 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 VZR}a%KAjFT-}YP^3wWf={{WF~8qWX# literal 0 HcmV?d00001 diff --git a/p2p/src/main/resources/ProposalStore_BTC_DAO_TESTNET b/p2p/src/main/resources/ProposalStore_BTC_DAO_TESTNET index 67f9fd5759b6b14843a5e1190ff314e19f63cf59..f80d555d880d0751ce28b1c2e4e461d84dd424f5 100644 GIT binary patch delta 4560 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 b4BaB`Tk_jybGz>U{_K~-Q)PJ{zx%%duie4w delta 191 zcmV;w06_n|mjQ`w28V5e0fTLm{{h#No&&D4a|Jm9lTrxLldK1(1eXE|{*(U=L9=KH z6a%wL4S)fYu^38|{|}0@G7-H2v!fG21hcUirU3-O0Sc&-y&x))Km?O+Nf47b8-lZE z98LxVtpN&@lR*k1vsol81O$iy3UHHQAt951DQ2^`DrE+fl``9tel*gvCpNADv#U6? t0<-@+69KdLJ!=A!JqjkX9zx0ivwcK^1q7x63XPM_4l0v>2o;l8OJx~FMxg)z From b222fd28f2b2f7a2a7c24f64e9f1508a3b27a81b Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 16 Mar 2019 12:47:12 -0500 Subject: [PATCH 29/31] Change file name for DaoStateStore db file to DaoStateStore2, Cleanup - Change onDaoStateBlockChainChanged to onChangeAfterBatchProcessing to make it more clear that it is only called after parsing of blockchain is completed. - Change file name for DaoStateStore db file to DaoStateStore2 - Remove TODOs and outdated comments - Increase delay for broadcasting --- .../BlindVoteStateMonitoringService.java | 3 +-- .../monitoring/DaoStateMonitoringService.java | 17 ++++++-------- .../ProposalStateMonitoringService.java | 21 +---------------- .../network/DaoStateNetworkService.java | 1 - .../network/StateNetworkService.java | 23 ++----------------- .../dao/state/DaoStateStorageService.java | 5 +++- .../monitor/daostate/DaoStateMonitorView.java | 2 +- 7 files changed, 16 insertions(+), 56 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java index d5ce1cb6beb..37563634c8e 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java @@ -253,8 +253,7 @@ private void maybeUpdateHashChain(int blockHeight) { // We delay broadcast to give peers enough time to have received the block. // Otherwise they would ignore our data if received block is in future to their local blockchain. - //TODO increase to 5-10 sec - int delayInSec = 1 + new Random().nextInt(5); + int delayInSec = 5 + new Random().nextInt(10); UserThread.runAfter(() -> blindVoteStateNetworkService.broadcastMyStateHash(myBlindVoteStateHash), delayInSec); } }); diff --git a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java index 87bff5d5bc8..e70acab8307 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java @@ -66,7 +66,6 @@ * of the latest block in the snapshot. * * TODO maybe request full state? - * TODO add p2p network data for monitoring * TODO auto recovery */ @Slf4j @@ -74,7 +73,7 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe DaoStateNetworkService.Listener { public interface Listener { - void onDaoStateBlockChainChanged(); + void onChangeAfterBatchProcessing(); } private final DaoStateService daoStateService; @@ -170,7 +169,7 @@ public void onPeersStateHashes(List stateHashes, Optional persistedDaoStateHashChain) { daoStateNetworkService.reset(); if (!persistedDaoStateHashChain.isEmpty()) { - log.info("Apply snapshot: Last daoStateHash={}", persistedDaoStateHashChain.getLast()); + log.info("Apply snapshot with {} daoStateHashes. Last daoStateHash={}", + persistedDaoStateHashChain.size(), persistedDaoStateHashChain.getLast()); } daoStateHashChain.addAll(persistedDaoStateHashChain); daoStateHashChain.forEach(e -> daoStateBlockChain.add(new DaoStateBlock(e))); @@ -219,7 +219,6 @@ public void removeListener(Listener listener) { /////////////////////////////////////////////////////////////////////////////////////////// private void updateHashChain(Block block) { - //TODO handle reorgs TODO need to start from gen byte[] prevHash; int height = block.getHeight(); if (daoStateBlockChain.isEmpty()) { @@ -232,7 +231,6 @@ private void updateHashChain(Block block) { return; } } else { - // TODO check if in reorg cases it might be a valid case checkArgument(height == daoStateBlockChain.getLast().getHeight() + 1, "New block must be 1 block above previous block. height={}, " + "daoStateBlockChain.getLast().getHeight()={}", @@ -253,12 +251,11 @@ private void updateHashChain(Block block) { // We only broadcast after parsing of blockchain is complete if (parseBlockChainComplete) { // We notify listeners only after batch processing to avoid performance issues at UI code - listeners.forEach(Listener::onDaoStateBlockChainChanged); + listeners.forEach(Listener::onChangeAfterBatchProcessing); // We delay broadcast to give peers enough time to have received the block. // Otherwise they would ignore our data if received block is in future to their local blockchain. - //TODO increase to 5-10 sec - int delayInSec = 1 + new Random().nextInt(5); + int delayInSec = 5 + new Random().nextInt(10); UserThread.runAfter(() -> daoStateNetworkService.broadcastMyStateHash(myDaoStateHash), delayInSec); } } @@ -295,7 +292,7 @@ private boolean processPeersDaoStateHash(DaoStateHash daoStateHash, Optional { public interface Listener { @@ -271,8 +253,7 @@ private void maybeUpdateHashChain(int blockHeight) { // We delay broadcast to give peers enough time to have received the block. // Otherwise they would ignore our data if received block is in future to their local blockchain. - //TODO increase to 5-10 sec - int delayInSec = 1 + new Random().nextInt(5); + int delayInSec = 5 + new Random().nextInt(10); UserThread.runAfter(() -> proposalStateNetworkService.broadcastMyStateHash(myProposalStateHash), delayInSec); } }); diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java index a0029b9bdab..591690aaa68 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java @@ -50,7 +50,6 @@ * of the latest block in the snapshot. * * TODO maybe request full state? - * TODO add p2p network data for monitoring * TODO auto recovery */ @Slf4j diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java index 450ea6fac93..c6e9f3c0442 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/StateNetworkService.java @@ -44,24 +44,6 @@ import javax.annotation.Nullable; -/** - * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for - * so we can detect quickly if any consensus issue arise. The data does not contain any private user - * data so sharing it on demand has no privacy concerns. - * - * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start - * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao - * state from the peers is already covering the next block we have not received yet. So we only take data in account - * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our - * state to the peers to not get ignored it in case they have not received the block yet. - * - * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height - * of the latest block in the snapshot. - * - * TODO maybe request full state? - * TODO add p2p network data for monitoring - * TODO auto recovery - */ @Slf4j public abstract class StateNetworkService stateHashes, Optional peersNodeAddress); } - //TODO testing - final NetworkNode networkNode; - final PeerManager peerManager; + protected final NetworkNode networkNode; + protected final PeerManager peerManager; private final Broadcaster broadcaster; @Getter diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java b/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java index 2fd4c9e6890..cbeeb4b08da 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateStorageService.java @@ -42,7 +42,10 @@ */ @Slf4j public class DaoStateStorageService extends StoreService { - private static final String FILE_NAME = "DaoStateStore"; + //TODO We need to rename as we have a new file structure with the hashchain feature and need to enforce the + // new file to be used. + // We can rename to DaoStateStore before mainnet launch again. + private static final String FILE_NAME = "DaoStateStore2"; private final DaoState daoState; private final DaoStateMonitoringService daoStateMonitoringService; diff --git a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java index d7a7e58b5e7..e5b9cb79d1e 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/monitor/daostate/DaoStateMonitorView.java @@ -93,7 +93,7 @@ protected void deactivate() { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public void onDaoStateBlockChainChanged() { + public void onChangeAfterBatchProcessing() { if (daoStateService.isParseBlockChainComplete()) { onDataUpdate(); } From 82e2a4860a0a0c4baa3092d915a79b863bf66eb3 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 16 Mar 2019 12:56:13 -0500 Subject: [PATCH 30/31] Add comments --- .../BlindVoteStateMonitoringService.java | 12 ++++++++++++ .../monitoring/DaoStateMonitoringService.java | 14 ++++++-------- .../ProposalStateMonitoringService.java | 12 ++++++++++++ .../network/DaoStateNetworkService.java | 17 ----------------- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java index 37563634c8e..2b80d4bd1fa 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java @@ -58,6 +58,18 @@ import static com.google.common.base.Preconditions.checkNotNull; +/** + * Monitors the BlindVote P2P network payloads with using a hash of a sorted list of BlindVotes from one cycle and + * make it accessible to the network so we can detect quickly if any consensus issue arise. + * We create that hash at the first block of the VoteReveal phase. There is one hash created per cycle. + * The hash contains the hash of the previous block so we can ensure the validity of the whole history by + * comparing the last block. + * + * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start + * to listen for broadcast messages from our peers about dao state of new blocks. + * + * We do NOT persist that chain of hashes as there is only one per cycle and the performance costs are very low. + */ @Slf4j public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStateListener, BlindVoteStateNetworkService.Listener { public interface Listener { diff --git a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java index e70acab8307..f3fb79544da 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java @@ -52,9 +52,11 @@ import static com.google.common.base.Preconditions.checkArgument; /** - * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for - * so we can detect quickly if any consensus issue arise. The data does not contain any private user - * data so sharing it on demand has no privacy concerns. + * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network + * so we can detect quickly if any consensus issue arise. + * We create that hash after parsing and processing of a block is completed. There is one hash created per block. + * The hash contains the hash of the previous block so we can ensure the validity of the whole history by + * comparing the last block. * * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao @@ -62,11 +64,7 @@ * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our * state to the peers to not get ignored it in case they have not received the block yet. * - * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height - * of the latest block in the snapshot. - * - * TODO maybe request full state? - * TODO auto recovery + * We do persist that chain of hashes with the snapshot. */ @Slf4j public class DaoStateMonitoringService implements DaoSetupService, DaoStateListener, diff --git a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java index d7716533d8b..3ee45e53709 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java @@ -59,6 +59,18 @@ import static com.google.common.base.Preconditions.checkNotNull; +/** + * Monitors the Proposal P2P network payloads with using a hash of a sorted list of Proposals from one cycle and + * make it accessible to the network so we can detect quickly if any consensus issue arise. + * We create that hash at the first block of the BlindVote phase. There is one hash created per cycle. + * The hash contains the hash of the previous block so we can ensure the validity of the whole history by + * comparing the last block. + * + * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start + * to listen for broadcast messages from our peers about dao state of new blocks. + * + * We do NOT persist that chain of hashes as there is only one per cycle and the performance costs are very low. + */ @Slf4j public class ProposalStateMonitoringService implements DaoSetupService, DaoStateListener, ProposalStateNetworkService.Listener { public interface Listener { diff --git a/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java b/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java index 591690aaa68..e394977b31f 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/network/DaoStateNetworkService.java @@ -35,23 +35,6 @@ import lombok.extern.slf4j.Slf4j; -/** - * Monitors the DaoState with using a hash fo the complete daoState and make it accessible to the network for - * so we can detect quickly if any consensus issue arise. The data does not contain any private user - * data so sharing it on demand has no privacy concerns. - * - * We request the state from the connected seed nodes after batch processing of BSQ is complete as well as we start - * to listen for broadcast messages from our peers about dao state of new blocks. It could be that the received dao - * state from the peers is already covering the next block we have not received yet. So we only take data in account - * which are inside the block height we have already. To avoid such race conditions we delay the broadcasting of our - * state to the peers to not get ignored it in case they have not received the block yet. - * - * We do not persist that chain of hashes and we only create it from the blocks we parse, so we start from the height - * of the latest block in the snapshot. - * - * TODO maybe request full state? - * TODO auto recovery - */ @Slf4j public class DaoStateNetworkService extends StateNetworkService Date: Sat, 16 Mar 2019 13:00:42 -0500 Subject: [PATCH 31/31] Cleanup after code inspection --- .../dao/monitoring/BlindVoteStateMonitoringService.java | 2 ++ .../dao/monitoring/ProposalStateMonitoringService.java | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java index 2b80d4bd1fa..738a82f3aa6 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/BlindVoteStateMonitoringService.java @@ -129,6 +129,7 @@ public void start() { // DaoStateListener /////////////////////////////////////////////////////////////////////////////////////////// + @SuppressWarnings("Duplicates") @Override public void onDaoStateChanged(Block block) { int blockHeight = block.getHeight(); @@ -148,6 +149,7 @@ public void onDaoStateChanged(Block block) { maybeUpdateHashChain(blockHeight); } + @SuppressWarnings("Duplicates") @Override public void onParseBlockChainComplete() { parseBlockChainComplete = true; diff --git a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java index 3ee45e53709..84a68f70ed0 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/ProposalStateMonitoringService.java @@ -21,7 +21,6 @@ import bisq.core.dao.governance.period.PeriodService; import bisq.core.dao.governance.proposal.MyProposalList; import bisq.core.dao.governance.proposal.ProposalService; -import bisq.core.dao.governance.proposal.ProposalValidator; import bisq.core.dao.monitoring.model.ProposalStateBlock; import bisq.core.dao.monitoring.model.ProposalStateHash; import bisq.core.dao.monitoring.network.ProposalStateNetworkService; @@ -82,7 +81,6 @@ public interface Listener { private final GenesisTxInfo genesisTxInfo; private final PeriodService periodService; private final ProposalService proposalService; - private final ProposalValidator proposalValidator; @Getter private final LinkedList proposalStateBlockChain = new LinkedList<>(); @@ -103,14 +101,12 @@ public ProposalStateMonitoringService(DaoStateService daoStateService, ProposalStateNetworkService proposalStateNetworkService, GenesisTxInfo genesisTxInfo, PeriodService periodService, - ProposalService proposalService, - ProposalValidator proposalValidator) { + ProposalService proposalService) { this.daoStateService = daoStateService; this.proposalStateNetworkService = proposalStateNetworkService; this.genesisTxInfo = genesisTxInfo; this.periodService = periodService; this.proposalService = proposalService; - this.proposalValidator = proposalValidator; } @@ -133,6 +129,7 @@ public void start() { // DaoStateListener /////////////////////////////////////////////////////////////////////////////////////////// + @SuppressWarnings("Duplicates") public void onDaoStateChanged(Block block) { int blockHeight = block.getHeight(); int genesisBlockHeight = genesisTxInfo.getGenesisBlockHeight(); @@ -150,6 +147,7 @@ public void onDaoStateChanged(Block block) { maybeUpdateHashChain(blockHeight); } + @SuppressWarnings("Duplicates") @Override public void onParseBlockChainComplete() { parseBlockChainComplete = true;