다른 노드들과 같은 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
을 추가할 수 있도록 처리하였습니다.