Update 2023. 3. 30.
public void notify(final TransactionHashesNotification notification, final BlockNotificationContext context) { if (NotificationTrigger.Execute == context.getTrigger()) { this.transactionHashCache.putAll(notification.getPairs()); } ...
TransactionsHashesNotification
이 생성될 때 외부 트랜잭션과 내부 트랜잭션 모두로 확장되는 streamDefault
가 사용된다는 점입니다:protected void notifyTransactionHashes() { final List<HashMetaDataPair> pairs = BlockExtensions.streamDefault(this.block) .map(t -> new HashMetaDataPair(HashUtils.calculateHash(t), new HashMetaData(this.block.getHeight(), t.getTimeStamp()))))) .collect(Collectors.toList()); this.observer.notify(새로운 트랜잭션해시알림(쌍)); }
BatchUniqueHashTransactionValidator
는 H(MT')가 해시트랜잭션캐시에 없는지 확인하여 UnconfirmedTransactionsCache에 추가합니다 ✅.public ValidationResult validate(final List<TransactionsContextPair> groupedTransactions) { ... final List<Hash> hashes = groupedTransactions.stream().flatMap(pair -> pair.getTransactions().stream()) .map(HashUtils::calculateHash).collect(Collectors.toList()); return this.validate(hashes); }
pair.getTransactions()
가 외부 트랜잭션만 포함하는 Collection<Transaction>
을 반환한다는 점입니다. 결과적으로 H(MT') != H(MT)는 확인되지만 H(X)는 확인되지 않습니다.는
BatchUniqueHashTransactionValidator`와 동일한 로직을 가지고 있기 때문에 외부의 MT'의 해시만 확인합니다. 결과적으로 해당 트랜잭션은 수집된 블록에 ✅public ValidationResult validate(final Block ... final List<Hash> hashes = block.getTransactions().stream().map(HashUtils::calculateHash).collect(Collectors.toList()); return this.transactionHashCache.anyHashExists(hashes) ? ValidationResult.NEUTRAL : ValidationResult.SUCCESS; }
TransactionHashesObserver
는 상태를 변경하는 블록 처리의 일부에서 HashTransactionsCache
에 H(MT'와 H(X)를 모두 추가하려고 시도합니다. H(X)가 이미 UnconfirmedTransactionsCache
에 존재하기 때문에 실패하고, 수집된 블록은 거부됩니다 🛑.UnconfirmedTransactionsCache
에서 H(MT')가 만료될 때까지 기다립니다.TransactionExtensions.streamDefault()
를 사용하여 간단히 수행할 수 있습니다.TransactionExtensions.streamDefault
를 추가하면 MT'(또는 이와 유사한)가 UnconfirmedTransactionsCache
에 추가되는 것을 방지할 수 있습니다.public ValidationResult validate(final List<TransactionsContextPair> groupedTransactions) { if (groupedTransactions.isEmpty()) { ValidationResult.SUCCESS를 반환합니다; } final List<Hash> hashes = groupedTransactions.stream().flatMap(pair -> pair.getTransactions().stream()) .flatMap(트랜잭션 -> 트랜잭션익스텐션.streamDefault(트랜잭션)).map(해시유틸스::계산해시) .collect(Collectors.toList()); return this.validate(hashes); }
public ValidationResult validate(final Block 블록) { if (block.getTransactions().isEmpty()) { ValidationResult.SUCCESS를 반환합니다; } final List<Hash> hashes = block.getTransactions().stream().flatMap(transaction -> TransactionExtensions.streamDefault(transaction)) .map(HashUtils::calculateHash).collect(Collect Translated with www.DeepL.com/Translator (free version)