node接收交易的條件 === # 不收同時指向衝突交易的交易 由[確認的一節](https://hackmd.io/s/HyYil3DYz#%E5%A4%A7%E9%87%8F-tip-%E6%8C%87%E5%90%91%E5%85%A9%E7%AD%86%E8%A1%9D%E7%AA%81%E4%BA%A4%E6%98%93)可以知道要避免收這樣的交易 所以來看IRI的實作 相關的code: 在[UDPReceiver.java的spawnReceiverThread](https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/network/UDPReceiver.java#L57) ```=java byte[] bytes = Arrays.copyOf(receivingPacket.getData(), receivingPacket.getLength()); SocketAddress address = receivingPacket.getSocketAddress(); processor.submit(() -> node.preProcessReceivedData(bytes, address, "udp")); processed++; Thread.yield(); ``` 有node.preProcessReceivedData這個函數 在[Node.java](https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/network/Node.java#L223)可以找到preProcessReceivedData的實做 中間的一段 ```java= //if valid - add to receive queue (receivedTransactionViewModel, neighbor) addReceivedDataToReceiveQueue(receivedTransactionViewModel, neighbor); ``` addReceivedDataToReceiveQueue會把收到的交易放進receiveQueue ```java= public void addReceivedDataToReceiveQueue(TransactionViewModel receivedTransactionViewModel, Neighbor neighbor) { receiveQueue.add(new ImmutablePair<>(receivedTransactionViewModel, neighbor)); if (receiveQueue.size() > RECV_QUEUE_SIZE) { receiveQueue.pollLast(); } ``` receiveQueue在processReceivedDataFromQueue調用pollFirst 而 Node.java會開另一個thread:[spawnProcessReceivedThread](https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/network/Node.java#L558) 這個thread會調用processReceivedDataFromQueue ```java= while (!shuttingDown.get()) { try { processReceivedDataFromQueue(); Thread.sleep(1); } catch (final Exception e) { log.error("Process Received Data Thread Exception:", e); } } ``` [processReceivedDataFromQueue](https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/network/Node.java#L364)會調用processReceivedData ```java= final Pair<TransactionViewModel, Neighbor> receivedData = receiveQueue.pollFirst(); if (receivedData != null) { processReceivedData(receivedData.getLeft(), receivedData.getRight()); } ``` [processReceivedData](https://github.com/iotaledger/iri/blob/dev/src/main/java/com/iota/iri/network/Node.java#L378) 這個函數會把收到的交易寫到 $tangle$ ```java= //store new transaction try { stored = receivedTransactionViewModel.store(tangle); } catch (Exception e) { log.error("Error accessing persistence store.", e); neighbor.incInvalidTransactions(); } ``` 所以node藉由UDP的鄰居收交易 開兩個thread , 一個收socket的data放進receiveQueue , 另一個從receiveQueue放進 $tangle$ 從這段過程來看 , 並沒有檢查交易是否同時指向衝突交易 ###### tags: `IOTA`