Update 2023/3/30
public void notify(final TransactionHashesNotification notification, final BlockNotificationContext context) { 如果 (NotificationTrigger.Execute == context.getTrigger()) { this.transactionHashCache.putAll(notification.getPairs()); } ...
protected void notifyTransactionHashes() { final List<HashMetaDataPair> 對 = BlockExtensions.streamDefault(this.block) .map(t -> new HashMetaDataPair(HashUtils.calculateHash(t), new HashMetaData(this.block.getHeight(), t.getTimeStamp()))) .collect(Collectors.toList()); this.observer.notify(new TransactionHashesNotification(pairs)); }
BatchUniqueHashTransactionValidator
檢查 H(MT') 不在 HashTransactionsCache 中,因此它被添加到 UnconfirmedTransactionsCache ✅public ValidationResult validate(final List<TransactionsContextPair> groupedTransactions) { ... 最終 List<Hash> hashes = groupedTransactions.stream().flatMap(pair -> pair.getTransactions().stream()) .map(HashUtils::calculateHash).collect(Collectors.toList()); 返回 this.validate(hashes); }
pair.getTransactions()
返回僅包含外部交易的 Collection<Transaction>
。 結果,檢查了 H(MT') != H(MT) 但未檢查 H(X)。BlockUniqueHashTransactionValidator
和BatchUniqueHashTransactionValidator
的邏輯是一樣的,所以隻檢查外層 MT 的 hash。 結果,交易被包含在收獲的區塊中 ✅公共 ValidationResult 驗證(最終塊 ... final List<Hash> hashes = block.getTransactions().stream().map(HashUtils::calculateHash).collect(Collectors.toList()); 返回 this.transactionHashCache.anyHashExists(hashes) ? ValidationResult.NEUTRAL : ValidationResult.SUCCESS; }
TransactionHashesObserver
嚐試在進行狀態更改的部分塊處理期間將 H(MT') 和 H(X) 添加到 HashTransactionsCache
。 這失敗了,因為 H(X) 已經存在於 UnconfirmedTransactionsCache
中,所以收獲的塊被拒絕 🛑UnconfirmedTransactionsCache
中過期public ValidationResult validate(final List<TransactionsContextPair> groupedTransactions) { 如果(groupedTransactions.isEmpty()){ 返回 ValidationResult.SUCCESS; } 最終 List<Hash> hashes = groupedTransactions.stream().flatMap(pair -> pair.getTransactions().stream()) .flatMap(事務 -> TransactionExtensions.streamDefault(事務)).map(HashUtils::calculateHash) .collect(Collectors.toList()); 返回 this.validate(hashes); }
公共 ValidationResult 驗證(最終塊塊){ 如果 (block.getTransactions().isEmpty()) { 返回 ValidationResult.SUCCESS; } 最終 List<Hash> hashes = block.getTransactions().stream().flatMap(transaction -> TransactionExtensions.streamDefault(transaction)) .map(HashUtils::calculateHash).collect(收集ors.toList()); 返回 this.transactionHashCache.anyHashExists(hashes) ? ValidationResult.NEUTRAL : ValidationResult.SUCCESS; }