다른 노드들과 같은 Transaction Pool을 사용하도록 Transaction이 발동하면 브로드캐스트를 해주어야합니다.
/* 블록체인 HTTP 서버 */
enum MessageType {
latest_block = 0,
all_block = 1,
receivedChain = 2,
receivedTx = 3,
}
interface Message {
type: MessageType;
payload: any;
}
-- 중략 --
app.post('/sendTransaction', (req, res) => {
try {
const receivedTx: ReceviedTx = req.body;
// 새로운 Transaction을 생성합니다.
const transaction = Wallet.sendTransaction(receivedTx, ws.getUnspentTxOuts());
// TransactionPool에 Transaction 내용 추가
ws.appendTransactionPoll(transaction);
// UTXO 내용 수정 / UTXO 내용을 최신화하는 함수를 생성합니다. 인자값 Transaction
ws.updateUTXO(transaction);
// 트랜잭션이 발동할때마다 브로드 캐스트해주어야 합니다.
const mesasge: Message = {
type: MessageType.receivedTx,
payload: transaction,
};
// 다른 노드에게 브로드 캐스트로 트랜잭션 내용을 전달해줍니다.
ws.broadcast(mesasge);
} catch (e: any) {
if (e instanceof Error) console.error(e.message);
}
res.json([]);
});
Transaction이 성공적으로 생성되었을때message변수에Type은receivedTx로payload에는transaction을 담아 브로드캐스트를 해줍니다.
/* 블록체인 네트워크 */
enum MessageType {
latest_block = 0,
all_block = 1,
receivedChain = 2,
receivedTx = 3,
}
interface Message {
type: MessageType;
payload: any;
}
-- 중략 --
messageHandler(_socket: WebSocket) {
const callback = (data: string) => {
const result: Message = P2PServer.dataParse<Message>(data);
const send = this.send(_socket);
switch (result.type) {
-- 중략 --
case MessageType.receivedTx: {
// 받은 트랜잭션 내용
const receivedTransaction: ITransaction = result.payload;
if (receivedTransaction === null) break;
// 받은 트랙잭션이 내가 갖고 있는지 확인
const withTransaction = this.getTransactionPool().find((_tx: ITransaction) => {
return _tx.hash === receivedTransaction.hash;
});
// 받은 트랜잭션이 내 트랜잭션 풀에 없다면 추가해줍니다.
if (!withTransaction) {
this.appendTransactionPoll(receivedTransaction);
const mesasge: Message = {
type: MessageType.receivedTx,
payload: receivedTransaction,
};
// 다른 노드에게 브로드 캐스트로 트랜잭션 내용을 전달해줍니다.
this.broadcast(mesasge);
}
break;
}
}
};
_socket.on('message', callback);
}
브로드캐스트가 발동되면 다른 연결된 노드들이
message를 받고message의type에 따라 각각 처리를 해주는데MessageType이receivedTx일때에는Transaction이 새로 발생된것이니payload로 받은Transaction이 나의Transaction Pool에 있는지 확인한후 없다면 내Transaction Pool에 추가해주고 나와 연결된 다른 노드들에게도 방금 추가한Transaction을Payload로 보내 다른 노드들도 새로운Transaction을 추가할 수 있도록 처리하였습니다.