当一个节点第一次连接到另一个节点时,他会请求这个节点的交易池
·
因此我们需要构建两个新的消息:QUERY_TRANSACTION_POOL和 RESPONSE_TRANSACTION_POOL。它们一个负责查询,一个负责回复,具体的代码如下。
enum MessageType { QUERY_LATEST = 0, QUERY_ALL = 1, RESPONSE_BLOCKCHAIN = 2, QUERY_TRANSACTION_POOL = 3, RESPONSE_TRANSACTION_POOL = 4}
交易池信息的消息构建如下:
const responseTransactionPoolMsg = (): Message => ({ 'type': MessageType.RESPONSE_TRANSACTION_POOL, 'data': JSON.stringify(getTransactionPool())});const queryTransactionPoolMsg = (): Message => ({ 'type': MessageType.QUERY_TRANSACTION_POOL, 'data': null});
为了实现整个广播的逻辑,我们需要添加处理MessageType.RESPONSE_TRANSACTION_POOL消息的业务逻辑。每当我们收到了未确认的交易,我们首先把它加入到自己的消息池中。然后我们会把我们的整个交易池广播给所有我身边的节点。
case MessageType.RESPONSE_TRANSACTION_POOL: const receivedTransactions: Transaction[] = JSONToObject<Transaction[]>(message.data); receivedTransactions.forEach((transaction: Transaction) => { try { handleReceivedTransaction(transaction); //if no error is thrown, transaction was indeed added to the pool //let's broadcast transaction pool broadCastTransactionPool(); } catch (e) { //unconfirmed transaction not valid (we probably already have it in our pool) } });