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`