Skip to content
This repository was archived by the owner on Aug 23, 2020. It is now read-only.

Feat: Making IRI use the initialSnapshot and the solidEntryPoints #1135

17 changes: 9 additions & 8 deletions src/main/java/com/iota/iri/BundleValidator.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package com.iota.iri;

import com.iota.iri.controllers.TransactionViewModel;
import com.iota.iri.hash.*;
import com.iota.iri.crypto.*;
import com.iota.iri.model.Hash;
import com.iota.iri.service.snapshot.Snapshot;
import com.iota.iri.storage.Tangle;
import com.iota.iri.utils.Converter;

import java.util.*;

public class BundleValidator {

public static List<List<TransactionViewModel>> validate(Tangle tangle, Hash tailHash) throws Exception {
public static List<List<TransactionViewModel>> validate(Tangle tangle, Snapshot initialSnapshot, Hash tailHash) throws Exception {
TransactionViewModel tail = TransactionViewModel.fromHash(tangle, tailHash);
if (tail.getCurrentIndex() != 0 || tail.getValidity() == -1) {
return Collections.EMPTY_LIST;
Expand Down Expand Up @@ -48,12 +49,12 @@ public static List<List<TransactionViewModel>> validate(Tangle tangle, Hash tail
|| ((bundleValue = Math.addExact(bundleValue, transactionViewModel.value())) < -TransactionViewModel.SUPPLY
|| bundleValue > TransactionViewModel.SUPPLY)
) {
instanceTransactionViewModels.get(0).setValidity(tangle, -1);
instanceTransactionViewModels.get(0).setValidity(tangle, initialSnapshot, -1);
break;
}

if (transactionViewModel.value() != 0 && transactionViewModel.getAddressHash().trits()[Curl.HASH_LENGTH - 1] != 0) {
instanceTransactionViewModels.get(0).setValidity(tangle, -1);
instanceTransactionViewModels.get(0).setValidity(tangle, initialSnapshot, -1);
break;
}

Expand Down Expand Up @@ -94,24 +95,24 @@ public static List<List<TransactionViewModel>> validate(Tangle tangle, Hash tail
addressInstance.squeeze(addressTrits, 0, addressTrits.length);
//if (!Arrays.equals(Converter.bytes(addressTrits, 0, TransactionViewModel.ADDRESS_TRINARY_SIZE), transactionViewModel.getAddress().getHash().bytes())) {
if (! Arrays.equals(transactionViewModel.getAddressHash().trits(), addressTrits)) {
instanceTransactionViewModels.get(0).setValidity(tangle, -1);
instanceTransactionViewModels.get(0).setValidity(tangle, initialSnapshot, -1);
break MAIN_LOOP;
}
} else {
j++;
}
}

instanceTransactionViewModels.get(0).setValidity(tangle, 1);
instanceTransactionViewModels.get(0).setValidity(tangle, initialSnapshot, 1);
transactions.add(instanceTransactionViewModels);
} else {
instanceTransactionViewModels.get(0).setValidity(tangle, -1);
instanceTransactionViewModels.get(0).setValidity(tangle, initialSnapshot, -1);
}
} else {
transactions.add(instanceTransactionViewModels);
}
} else {
instanceTransactionViewModels.get(0).setValidity(tangle, -1);
instanceTransactionViewModels.get(0).setValidity(tangle, initialSnapshot, -1);
}
break;

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/iota/iri/IRI.java
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,4 @@ else if (IotaConfig.CONFIG_FILE.exists()) {
return null;
}
}
}
}
27 changes: 16 additions & 11 deletions src/main/java/com/iota/iri/Iota.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
import com.iota.iri.conf.TipSelConfig;
import com.iota.iri.controllers.TipsViewModel;
import com.iota.iri.controllers.TransactionViewModel;
import com.iota.iri.hash.SpongeFactory;
import com.iota.iri.crypto.SpongeFactory;
import com.iota.iri.network.Node;
import com.iota.iri.network.TransactionRequester;
import com.iota.iri.network.UDPReceiver;
import com.iota.iri.network.replicator.Replicator;
import com.iota.iri.service.TipsSolidifier;
import com.iota.iri.service.snapshot.SnapshotException;
import com.iota.iri.service.snapshot.SnapshotProvider;
import com.iota.iri.service.snapshot.impl.SnapshotProviderImpl;
import com.iota.iri.service.tipselection.EntryPointSelector;
import com.iota.iri.service.tipselection.RatingCalculator;
import com.iota.iri.service.tipselection.TailFinder;
Expand Down Expand Up @@ -44,6 +47,7 @@ public class Iota {
public final LedgerValidator ledgerValidator;
public final MilestoneTracker milestoneTracker;
public final Tangle tangle;
public final SnapshotProvider snapshotProvider;
public final TransactionValidator transactionValidator;
public final TipsSolidifier tipsSolidifier;
public final TransactionRequester transactionRequester;
Expand All @@ -55,21 +59,22 @@ public class Iota {
public final MessageQ messageQ;
public final TipSelector tipsSelector;

public Iota(IotaConfig configuration) throws IOException {
public Iota(IotaConfig configuration) throws SnapshotException, IOException {
this.configuration = configuration;
Snapshot initialSnapshot = Snapshot.init(configuration).clone();
tangle = new Tangle();
messageQ = MessageQ.createWith(configuration);
tipsViewModel = new TipsViewModel();
transactionRequester = new TransactionRequester(tangle, messageQ);
transactionValidator = new TransactionValidator(tangle, tipsViewModel, transactionRequester,
configuration);
milestoneTracker = new MilestoneTracker(tangle, transactionValidator, messageQ, initialSnapshot, configuration);
node = new Node(tangle, transactionValidator, transactionRequester, tipsViewModel, milestoneTracker, messageQ,
snapshotProvider = new SnapshotProviderImpl(configuration);
transactionRequester = new TransactionRequester(tangle, snapshotProvider.getInitialSnapshot(), messageQ);
transactionValidator = new TransactionValidator(tangle, snapshotProvider.getInitialSnapshot(), tipsViewModel,
transactionRequester);
milestoneTracker = new MilestoneTracker(tangle, snapshotProvider, transactionValidator, messageQ, initialSnapshot, configuration);
node = new Node(tangle, snapshotProvider.getInitialSnapshot(), transactionValidator, transactionRequester, tipsViewModel, milestoneTracker, messageQ,
configuration);
replicator = new Replicator(node, configuration);
udpReceiver = new UDPReceiver(node, configuration);
ledgerValidator = new LedgerValidator(tangle, milestoneTracker, transactionRequester, messageQ);
ledgerValidator = new LedgerValidator(tangle, snapshotProvider, milestoneTracker, transactionRequester, messageQ);
tipsSolidifier = new TipsSolidifier(tangle, transactionValidator, tipsViewModel);
tipsSelector = createTipSelector(configuration);
}
Expand Down Expand Up @@ -151,11 +156,11 @@ private void initializeTangle() {
}

private TipSelector createTipSelector(TipSelConfig config) {
EntryPointSelector entryPointSelector = new EntryPointSelectorImpl(tangle, milestoneTracker);
RatingCalculator ratingCalculator = new CumulativeWeightCalculator(tangle);
EntryPointSelector entryPointSelector = new EntryPointSelectorImpl(tangle, snapshotProvider, milestoneTracker);
RatingCalculator ratingCalculator = new CumulativeWeightCalculator(tangle, snapshotProvider.getInitialSnapshot());
TailFinder tailFinder = new TailFinderImpl(tangle);
Walker walker = new WalkerAlpha(tailFinder, tangle, messageQ, new SecureRandom(), config);
return new TipSelectorImpl(tangle, ledgerValidator, entryPointSelector, ratingCalculator,
return new TipSelectorImpl(tangle, snapshotProvider, ledgerValidator, entryPointSelector, ratingCalculator,
walker, milestoneTracker, config);
}
}
9 changes: 6 additions & 3 deletions src/main/java/com/iota/iri/LedgerValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.iota.iri.controllers.*;
import com.iota.iri.model.Hash;
import com.iota.iri.network.TransactionRequester;
import com.iota.iri.service.snapshot.SnapshotProvider;
import com.iota.iri.zmq.MessageQ;
import com.iota.iri.storage.Tangle;
import org.slf4j.Logger;
Expand All @@ -14,13 +15,15 @@ public class LedgerValidator {

private final Logger log = LoggerFactory.getLogger(LedgerValidator.class);
private final Tangle tangle;
private final SnapshotProvider snapshotProvider;
private final MilestoneTracker milestoneTracker;
private final TransactionRequester transactionRequester;
private final MessageQ messageQ;
private volatile int numberOfConfirmedTransactions;

public LedgerValidator(Tangle tangle, MilestoneTracker milestoneTracker, TransactionRequester transactionRequester, MessageQ messageQ) {
public LedgerValidator(Tangle tangle, SnapshotProvider snapshotProvider, MilestoneTracker milestoneTracker, TransactionRequester transactionRequester, MessageQ messageQ) {
this.tangle = tangle;
this.snapshotProvider = snapshotProvider;
this.milestoneTracker = milestoneTracker;
this.transactionRequester = transactionRequester;
this.messageQ = messageQ;
Expand Down Expand Up @@ -72,7 +75,7 @@ public Map<Hash,Long> getLatestDiff(final Set<Hash> visitedNonMilestoneSubtangle

boolean validBundle = false;

final List<List<TransactionViewModel>> bundleTransactions = BundleValidator.validate(tangle, transactionViewModel.getHash());
final List<List<TransactionViewModel>> bundleTransactions = BundleValidator.validate(tangle, snapshotProvider.getInitialSnapshot(), transactionViewModel.getHash());
/*
for(List<TransactionViewModel> transactions: bundleTransactions) {
if (transactions.size() > 0) {
Expand Down Expand Up @@ -142,7 +145,7 @@ private void updateSnapshotMilestone(Hash hash, int index) throws Exception {
if (visitedHashes.add(hashPointer)) {
final TransactionViewModel transactionViewModel2 = TransactionViewModel.fromHash(tangle, hashPointer);
if(transactionViewModel2.snapshotIndex() == 0) {
transactionViewModel2.setSnapshot(tangle, index);
transactionViewModel2.setSnapshot(tangle, snapshotProvider.getInitialSnapshot(), index);
messageQ.publish("%s %s %d sn", transactionViewModel2.getAddressHash(), transactionViewModel2.getHash(), index);
messageQ.publish("sn %d %s %s %s %s %s", index, transactionViewModel2.getHash(),
transactionViewModel2.getAddressHash(),
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/com/iota/iri/MilestoneTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@
import com.iota.iri.controllers.AddressViewModel;
import com.iota.iri.controllers.MilestoneViewModel;
import com.iota.iri.controllers.TransactionViewModel;
import com.iota.iri.hash.Curl;
import com.iota.iri.hash.ISS;
import com.iota.iri.hash.ISSInPlace;
import com.iota.iri.hash.SpongeFactory;
import com.iota.iri.crypto.Curl;
import com.iota.iri.crypto.ISS;
import com.iota.iri.crypto.ISSInPlace;
import com.iota.iri.crypto.SpongeFactory;
import com.iota.iri.model.Hash;
import com.iota.iri.model.HashFactory;
import com.iota.iri.service.snapshot.SnapshotProvider;
import com.iota.iri.storage.Tangle;
import com.iota.iri.utils.Converter;
import com.iota.iri.zmq.MessageQ;
Expand Down Expand Up @@ -51,6 +52,7 @@ enum Validity {

private final Logger log = LoggerFactory.getLogger(MilestoneTracker.class);
private final Tangle tangle;
private final SnapshotProvider snapshotProvider;
private final Hash coordinator;
private final TransactionValidator transactionValidator;
private final boolean testnet;
Expand All @@ -75,11 +77,13 @@ enum Validity {
private Status status = Status.INITIALIZING;

public MilestoneTracker(Tangle tangle,
SnapshotProvider snapshotProvider,
TransactionValidator transactionValidator,
MessageQ messageQ,
Snapshot initialSnapshot, ConsensusConfig config
) {
this.tangle = tangle;
this.snapshotProvider = snapshotProvider;
this.transactionValidator = transactionValidator;
this.messageQ = messageQ;
this.latestSnapshot = initialSnapshot;
Expand Down Expand Up @@ -219,7 +223,7 @@ Validity validateMilestone(SpongeFactory.Mode mode, int securityLevel, Transacti
// Already validated.
return VALID;
}
final List<List<TransactionViewModel>> bundleTransactions = BundleValidator.validate(tangle, transactionViewModel.getHash());
final List<List<TransactionViewModel>> bundleTransactions = BundleValidator.validate(tangle, snapshotProvider.getInitialSnapshot(), transactionViewModel.getHash());
if (bundleTransactions.size() == 0) {
return INCOMPLETE;
}
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/com/iota/iri/SignedFiles.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.iota.iri;

import com.iota.iri.hash.Curl;
import com.iota.iri.hash.ISS;
import com.iota.iri.hash.Sponge;
import com.iota.iri.hash.SpongeFactory;
import com.iota.iri.crypto.Curl;
import com.iota.iri.crypto.ISS;
import com.iota.iri.crypto.Sponge;
import com.iota.iri.crypto.SpongeFactory;
import com.iota.iri.utils.Converter;
import org.apache.commons.lang3.ArrayUtils;

Expand Down
Loading