일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 라우터와 미들웨어
- OAuth 카카오
- 세션으로 로그인 구현
- cookie-parser 만들어보기
- FormData()
- useEffect clean up
- 블록 만들기
- 라우터 분리
- nodejs파일업로드
- buffer.from
- JWT 하드코딩
- javascript기초
- 시퀄라이즈 기본설정
- node.js path
- next 매개변수
- Uncaught Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>
- useContext
- express router
- express.static
- 아이디 중복체크기능
- JWT 로그인 기능 구현
- express session
- 비동기파일업로드
- 라우트 매개변수
- JWT 만들어보기
- css기초
- mysql wsl
- express실행
- 라우터미들웨어 분리
- ws 라이브러리
- Today
- Total
즐코
지갑, 트랜잭션 구현 (2) / 트랜잭션 풀 본문
저번 포스팅에 이어서 트랜잭션에 대해 간단히 정리하고자 한다.
1. transaction
1/ Transaction
여러개의 input과 여러개의 output으로 구성되어 있다.
그렇기 때문에 transaction의 interface는 각각의 거래인풋들과 거래아웃풋들을 가지고 있는 배열 형태로 만들어줄것이다!
- transaction 내 hash가 나타내는 값? txins와 txouts를 합쳐서 hash하여 거래 고유 인덱스값을 나타낸다.
// wallet/transaction.ts
interface ITransaction {
hash: string;
txins: ITxIn[];
txouts: ITxOut[];
}
이 트랜잭션 input과 output이 어떻게 생기는지 간단한 예로 풀어써보면 아래와 같다.
- 내가 우리집 고양이 후추한테 0.4코인을 줘야하는데 딱 떨어지는 잔돈이 없어서 1코인을 보낸다면, 당연히 후추한텐 0.4코인이 가고, 나에겐 1코인에서 0.4코인을 뺀 0.6코인이 잔돈처럼 돌아올 것이다.
- 이 때, 인풋이 1코인인거고, 아웃풋이 후추앞으로 간 0.4코인과 내앞으로 다시 온 0.6코인인것이다!
- 여기서 트랜잭션의 아웃풋으로 '후추한테 간 코인'과 '나한테 잔돈으로 온 코인'은 곧 다른 트랜잭션에서 사용될 인풋이 될 것이다!
- 이렇게 아직 사용되지 않았지만 추후 다른 트랜잭션에서 사용될 코인을 UTXO 로 불린다고 한다. Unspent Transaction Output
- 그러면 당연히 이런 UTXO들은 블록 여기저기에 분산되어 있을 것이다. 그렇기 때문에, 각각의 지갑주소에 따른 잔고(balance)는 어떤 거래내역에도 저장되지 않는다. 다만 지갑주소별로 흩어져있는 UTXO들을 모아서 balance를 체크할 수 있는 것이다.
2/ tx Output
위의 예시를 바탕으로 트랜잭션에 들어가는 내용인 아웃풋을 구성해보면 아래와 같다.
- address 는 아래의 amount를 가지고 있는 사람의 지갑주소/계정인 것이다.
- amount는 말그대로 코인의 양이다.
// wallet/transaction.ts
interface ITxOut {
address: string;
amount: number;
}
아래와 같이 transaction의 속성인 txouts 배열에 쌓이는 것이다.
아주 쉽게 말하면, 후추 앞으로 0.4코인짜리 수표가 있는 것이고, 내 앞으로 0.6코인짜리 수표가 있는 것이다.
(실제 지폐인 천원, 오천원, 만원처럼 딱 떨어지는 단위가 있는 것이 아니라고 생각하면 쉽다!)
[
{
address: '후추지갑주소',
amount : 0.4
},
{
address: 'yj지갑주소',
amount : 0.6
}
]
그리고, 위처럼 쉽게 각 txOut들이 transaction의 txouts 배열에 추가되는 것이 아니다!
txOut 안의 계정 주인이 실제로 진짜 맞는지, 이 거래 내역이 위조되지 않았는지 확인하기 위해 txIn 안에 시그니처(서명)이 있어야 한다! 이 서명 검증이 있어야지만, amount 쪼개기가 가능해지고 그에 따라 새로 업데이트된 txOut이 만들어지는 것이다.
3/ tx Input
위의 예시를 바탕으로 트랜잭션에 들어가는 내용인 인풋을 구성해보면 아래와 같다.
- txOutId : utxo들 중에서 현재 input으로 쓰려는 txOut이 생긴 원래 거래의 인덱스값
- txOutIndex : 거래가 발생하면 txouts에는 총 2개의 txout 객체가 생긴다. (보내는 사람의 잔돈, 받는 사람의 돈)
이 txouts 배열 내에서의 인덱스값이 이 속성에 들어간다.
- signature : 위에서 설명한대로 검증을 위해서 tx hash값을 보내는 사람의 개인키로 다시 hash한 서명이 들어간다.
- publicKey : 사실상 거래 검증 시에 필요한 공개키도 이 tx input안에 들어가야하는데, 코드로 구현하기 복잡한 부분이 있어서, 우선 생략
// wallet/transaction.ts
interface ITxIn {
txOutId: string;
txOutIndex: number;
signature?: any;
}
거래에서 검증을 위한 signature는 필수라고 들었는데 왜 optional한 속성으로 넣었지?
첫 거래는 채굴자가 보상으로 받는 코인에 대한 거래내역이다. 이걸 코인베이스라고 하는데, 이 경우 블록체인 네트워크에서 주는 보상이므로 보내는 사람이 없기 때문에 거래내역 상의 txIns 내에 넣을 정보가 없고, txOuts 배열 내에 하나의 txOut만 존재할 뿐이다. 그렇기 때문에 나중에 트랜잭션 구현 시 txIn을 만들때 txOutId는 빈 문자열로 "", txOutIndex는 해당 블록의 height로 넣어줄 것이다. 그리고 서명은 개인키가 필요하므로 코인베이스상에선 필요가 없으므로 optional하게 해준다.
4/ transation Pool
비트코인의 경우 10분에 1번씩 블록이 채굴되서 체인에 추가된다. 근데 이 10분 동안 계속해서 다른 거래들이 이뤄지고 있을텐데 이 거래들은 어떻게 되는걸까? 이 '거래데이터가 확인되지 않은 상태'의 트랜잭션들은 P2P 네트워크 내 각 노드들이 'pool'이라는 보관장소에 저장한다. 비트코인에선 이 장소를 mempool 이라고하며, 이더리움에선 transaction pool 이라고한다.
거래 요청은 했으나 아직 거래가 성립되지 않은 대기중인 트랜잭션을 채굴자가 새로운 블럭을 생성하기에 앞서 임시적으로 저장하는 장소
tx pool의 원리
1. 지갑을 통해 한 p2p 네트워크 내의 특정 노드에게 http 통신을 통해 거래내역(이하 tx)를 던진다.
2. 특정 노드는 그 tx를 받아서 transaction pool(이하 pool)에 저장하고 지갑에는 전송완료되었다고 함 (이때 검증을 하는 건가...?)
3. 이 특정 노드의 pool에 그 tx가 저장되자마자 다른 노드들에게도 broadcast 된다. 같은 pool 상태를 유지하는 것
4. 이 tx가 들어간 블록을 어떤 노드가 채굴완료
5. 이 블록 또한 broadcast되면 각 노드들에게 블록이 업데이트됨과 동시에
6. 모든 노드들의 pool에 있던 해당 tx를 뺀다!
거래소에서 일어나는 모든 트랜잭션이 비트코인 explorer같은 곳에 기록이 될까!?!
일반적으로 우리가 알고 있는 거래소들 (업비트, 빗썸 등)에서 일어나는 거래는 실제로 블록체인 네트워크와 소통하고 있지 않다. 즉, 거래소 내에서 사고파는 건 트랜잭션이 아니다. 그저 거래소 DB에다가 yj란 사람이 백만원을 주고 0.04BTC 를 샀다고 데이터만 남겨두고, 내가 특정 지갑으로 코인을 옮기겠다고 하지 않는 이상, 그 전까진 거래소 DB 내의 데이터를 수정하는 과정만 반복하는 것이다. 나중에 내가 갖고 있는 코인들을 특정 지갑계정으로 옮긴다고 해야지만 트랜잭션이 일어나는 것이다.
이러한 거래소들을 중앙화 거래소(CEX)라고 하고, 탈중앙화 거래소(DEX)라고 거래 자체를 지갑을 통해서만 하는 거래소가 있다고 한다.
'BlockChain' 카테고리의 다른 글
지갑, 트랜잭션 구현 (4) - txIn, txOut, UTXO (0) | 2022.06.22 |
---|---|
지갑, 트랜잭션 구현 (3) - 지갑 저장, 트랜잭션 보내기 (0) | 2022.06.21 |
HTTP 기본 인증 / 지갑, 트랜잭션 구현 (1) (0) | 2022.06.19 |
지갑과 트랜잭션에서의 서명/검증 (Ft.개인키,공개키) (0) | 2022.06.16 |
P2P 네트워크 / 블록체인 주고받기 (0) | 2022.06.15 |