블록체인 Block-Chain - 비트코인 Transaction 생성후 브로드캐스트

dev_swan·2022년 6월 25일
0

블록체인

목록 보기
12/36
post-thumbnail

다른 노드들과 같은 Transaction Pool을 사용하도록 Transaction이 발동하면 브로드캐스트를 해주어야합니다.

블록체인 HTTP 서버에서 브로드캐스트 추가

/* 블록체인 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 변수에 TypereceivedTxpayload에는 transaction을 담아 브로드캐스트를 해줍니다.

블록체인 네트워크에 case 추가하기

/* 블록체인 네트워크 */

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를 받고 messagetype에 따라 각각 처리를 해주는데 MessageTypereceivedTx일때에는 Transaction이 새로 발생된것이니 payload로 받은 Transaction이 나의 Transaction Pool에 있는지 확인한후 없다면 내 Transaction Pool에 추가해주고 나와 연결된 다른 노드들에게도 방금 추가한 TransactionPayload로 보내 다른 노드들도 새로운 Transaction을 추가할 수 있도록 처리하였습니다.

0개의 댓글