Try   HackMD

node接收交易的條件

不收同時指向衝突交易的交易

確認的一節可以知道要避免收這樣的交易

所以來看IRI的實作

相關的code:

UDPReceiver.java的spawnReceiverThread


 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可以找到preProcessReceivedData的實做

中間的一段

//if valid - add to receive queue (receivedTransactionViewModel, neighbor) addReceivedDataToReceiveQueue(receivedTransactionViewModel, neighbor);

addReceivedDataToReceiveQueue會把收到的交易放進receiveQueue

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

這個thread會調用processReceivedDataFromQueue

while (!shuttingDown.get()) { try { processReceivedDataFromQueue(); Thread.sleep(1); } catch (final Exception e) { log.error("Process Received Data Thread Exception:", e); } }

processReceivedDataFromQueue會調用processReceivedData

final Pair<TransactionViewModel, Neighbor> receivedData = receiveQueue.pollFirst(); if (receivedData != null) { processReceivedData(receivedData.getLeft(), receivedData.getRight()); }

processReceivedData 這個函數會把收到的交易寫到

tangle

//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