tx pool에 대해 알아보기 전에 우선 새로운 블록이 체인에 추가되었을 경우,
다른 네트워크 참여자들에게 utxo에 대한 정보를 최신화 시켜주는 방식에 대해 알아보자.
예전에 P2PServer class 객체를 만들어 줄 때처럼 몇 가지 경우로 나눠 생각해보면 좀 더 머리에 잘 들어온다.
i) 내가 체인에 블럭을 추가했을 때 (채굴자 시점)
이미 우리는 addBlock 함수에서 newBlock을 만들어 chain에 넣었다.
이 newBlock의 tx들을 참조해 utxo를 업데이트 해주면 된다.
/* src/core/blockchain/chain.ts */
// ...중략
public addBlock ( data : ITransaction[]) : Failable < Block, string > {
// ...중략
this.blockchain.push(newBlock)
newBlock.data.forEach((_tx:ITransaction) => {
this.updateUTXO(_tx)
})
// #14 참조
return { isError : false, value : newBlock }
}
ii) 다른 사람이 블록을 추가했을 때 ( 1개의 블록만을 업데이트 할 때 )
다른 노드와 통신 시, 상대방이 나보다 하나의 블록을 더 가지고 있고, 그 하나의 블록에 대한 정보를 받아
업데이트 할 때를 생각해보자.
이 때 사용했던 함수 addToChain 함수의 매개변수 (_receivedBlock) 의 tx 데이터를 받아 이를 참조해
내가 가진 utxo 정보를 업데이트 할 수 있다.
/* src/core/blockchain/chain.ts */
// ...중략
public addToChain ( _receivedChain : Block ) : Failable < undefined, string > {
// ...중략
this.blockchain.push(_receivedBlock)
_receivedBlock.data.forEach((tx) => {
this.updateUTXO(tx)
})
// ...중략
}
iii) 체인을 통째로 교체할 때
블록 갯수의 차이가 2 이상이라 내 체인을 남의 체인으로 통쨰로 교체하는 경우에도 동일한 방식으로 utxo를 업데이트
해주면 된다. 이 경우 사용된 replaceChain 함수에서 updateUTXO 함수를 호출한다.
/* src/core/blockchain/chain.ts */
// ...중략
public replaceChain ( _receivedChain : Block [] ) : Failable < undefined, string > {
// ...중략
this.blockchain = _receivedChain
this.blockchain.forEach((_block : IBlock) => {
_block.data.forEach((_tx) => {
this.updateUTXO(_tx)
// 블록체인의 첫 블록부터 utxo를 계산해 업데이트한다
})
})
}
이렇게 하면 체인을 업데이트 할 때 관련 함수 내부에서 utxo를 업데이트하는 함수를 호출함으로써
utxo도 같이 업데이트해줄 수 있다.
'Blockchain' 카테고리의 다른 글
#17 ethereum (0) | 2022.06.29 |
---|---|
#16 transaction ch.6 - tx pool (0) | 2022.06.27 |
#14 transaction ch4. - transaction (0) | 2022.06.24 |
#13 tx ch3. 채굴자 보상 (0) | 2022.06.23 |
#12 Transaction ch2.코인 전송 (0) | 2022.06.22 |