티스토리 뷰
블록을 블록체인 내에서 유일하게 식별할수 있게 블록해쉬라는게 존재한다고 했었다. 이 블록해쉬값은 위 그림에서 핑크색으로 표시된 값이다.
한마디로 말해서 블록체인 내에서 그 블록이 갖는 아이디라고도 볼 수 있으며, 이 블록해쉬값은 블록헤더를 요약한 어떤 해쉬값이다.
블록 헤더에 포함된 6가지 정보를 묶어서 해쉬에 넣으면 블록 해쉬값이 나오게 되고 이 블록 해쉬값은 이 블록의 아이디가 된다.
그렇기 때문에 이 6가지 정보중 어떤 하나라도 변경되게 되면 블록 해쉬값이 달라지게 된다. 그 말 뜻은, 마음대로 블록 헤더에 있는 값을 바꿀수 없다는 의미이다.
왜냐면, 블록들은 서로 연결되어 있기 때문에 만약에 블록0의 내용을 누가 임의로 수정하게 될 경우 그 블록해쉬값이 달라지게 되고, 그렇게 되면 블록1의 PreviousHash값도 변경 되어야 한다.
이렇게 어떤 블록의 내용을 바꾸게 되면 그 뒤의 블록의 내용도 모두다 바꿔줘야 한다. 근데, 이 블록 해쉬값은 특정 난이도값 보다 작은 값이어야만 유효하다고 했었다.
근데 이 특정 난이도값 보다 작은 어떤 블록 해쉬값을 찾으려면 nonce값을 조정해가면서 브루투 포스 방식으로 찾아야 된다고도 했었다. 그렇기 때문에 블록 에서 어떤 트랜잭션 정보를 바꾸게 될 경우 머클해쉬값이 바뀌게 되고 이 것은 연쇄적으로 그 블록의 블록해쉬값도 변경되게 만든다.
그렇게 되면 이 블록 해쉬값을 어떤 특정 난이도 보다 적은 값으로 만들게 하기 위해서 nonce 값을 조정해가면서 계속 brute force방식으로 해쉬 연산을 다시 해야 한다.
즉 블록 0의 트랜잭션 정보를 바꾸게 되면 그 뒤에 연쇄적으로 연결된 모든 블록의 nonce를 찾아가면서 블록을 다시 생성해 주어야 하기 때문에 어떤 블록의 트랜잭션 정보를 바꾼다는것은 엄청나게 어려운 일이 된다.
이런식으로 블록의 내용을 누구든지 쉽게 볼 수는 있지만 바꾸지는 것은 매우 어렵게 만들어 놓은 기술이 블록체인 이다.
어떤 악의적인 사용자가 블록1에 있는 거래 정보중 A가 E 에게 0.5 BTC가 아닌 1.5BTC를 전송했다고 구라를 치려고 하는 상황을 가정해보자.
그렇게 될 경우 머클트리의 내용이 변경 되게 되고 그것은 머클 트리의 루트 해쉬값도 변경되게 만든다. 이것을 머클해쉬라고 하는데, 이 머클해쉬값이 변경됬다는 뜻은 블록헤더의 어떤 한 값이 변경됬다는 뜻이고,
이말은 블록 해쉬값을 다시 계산해야 하며 이 다시 계산될 블록 해쉬 값은 특정 난이도 보다 적은 값을 만족해야 하므로 Nonce값을 다시 조정해 가면서 다시 적절한 블록해쉬값을 찾아야 한다는 의미이다.(채굴을 다시 해야한다)
블록1의 블록해쉬값이 변경되게 되면 그 다음 블록인 블록2의 PreviousHash값이 변경되게 되고 그렇게 되면, 블록해쉬값도 변경되게 되고
이런식으로 블록1 이후에 나오는 모든 블록의 블록해쉬값을 다시 찾아내야 하는 (다시 채굴해야 하는) 불상사가 발생하므로 어떤 블록의 트랜잭션 내용은 누구나 볼수 있지만 그것을 수정하는일은 대단히 어려운 일일 것이다.
블록체인에서는 이런식으로 블록 체인의 내용을 임의로 수정하는것을 막는다.
만약에 블록체인이 위의 블록 3개로 구성된다고 해보자, 또한 어떤 악의적인 노드 A가 마지막 블록인 블록2의 거래 정보중 일부인
2-2. H->C 0.2 BTC 전송이라는 트랜잭션을 5BTC 전송이라고 변경했다고 해보자.
그리고 현재 시간이 3시30분이라고 해보자.
이 악의적인 노드 A는 블록2의 트랜잭션 내용을 변경시킴으로써 머클해쉬값을 변경시키게 만들었고 이것은 블록해쉬값의 변경을 야기했다. 이 변경된 블록해쉬값은 블록의 난이도 보다 적은 값이 아닐것이다.
그렇기 때문에 블록의 난이도 보다 적은 블록 해쉬값을 생성하기 위해서 Nonce값을 변경 하면서 적절한 블록 해쉬값을 찾기 위해서 다시 블록 #2를 채굴해야 할 것이다.
그런데 같은 시간 다른 선량한 노드들은 이미 블록2는 가지고 있고 블록3를 생성하기 위해 채굴을 하고 있을 것이다. 3시 35분경 어떤 B라는 노드가 채굴에 성공했다고 해보자.
그럼 그 B노드는 자신이 생성한 블록을 네트워크에 전파 시킬 것이고, 악의적인 노드 A에게도 그 블록이 전달 되게 될것이다. 악의적인 노드A가 B가 생성한 블록을 받기전에, 블록2의 블록해쉬값을 찾아내서 블록을 채굴했다고 할지라도,
이미 원래의 정상적인 블록체인의 길이가 더 길것이다.( 원래의 블록체인은 블록3까지 존재하고 A가 만들어낸 블록체인은 블록2까지 밖에 존재하지 않음.)
그렇기 때문에, 악의적인 노드가 만들어낸 블록체인은 버림을 받게 될것이고, 정상적인 블록체인에 계속해서 블록이 추가 될 것이다.
블록체인은 이런식으로 악의적인 노드의 트랜잭션 정보 변경을 방지하고 있다.
51% 공격
하지만 이 악의적인 노드 A가 전체 채굴 노드 중 51%이상을 갖고 있는 경우 어떤일이 발생 할 수 있을까?
먼저 이 노드 A는 자신이 원하는 트랜잭션으로 블록체인의 내용을 바꿀수 있다.
아까 맨 마지막 블록의 트랜잭션 내용을 바꿈으로써 블록의 블록해쉬값을 다시 계산(다시 채굴)해야 한다고 했었다. 근데 만약에 이 악의적인 노드 A가 전체 채굴 노드중 51%이상을 차지한다는 것은, A가 의도한 대로 블록을 계속 메인 블록체인에 붙여나갈수 있다는 의미이다. 이것을 바로 51%공격이라고 한다.
다시말해서 A가 생산해 내는 블록이 계속해서 메인 블록체인에 붙게 됨으로써 거래 내역이 조작될수 있다는 것이다.
왜냐면 만약에 전체 네트워크 내에서 채굴 노드가 10개가 있다고 해보자. 근데 이 A라는 업자의 채굴 노드는 6개라고 해보자. 그러면 다른 4개의 노드보다 이 A의 6개의 노드들이 더 블록을 확률적으로 더 빨리 찾아낼 것이다. 그렇다는것은 A의 의도대로 조작된 트랜잭션이 포함된 블록을 메인 블록체인에 계속해서 추가해 나갈수 있다는 뜻이다.
기술적으로는 조작이 가능하지만, 블록체인은 경제학적 원리를 이용해서 이런 현상을 막는다.
만약에 어떤 악의적인 노드가 트랜잭션을 조작해서 자신이 원하는대로 블록체인을 조작했다고 해보자. 이런 사실이 다른 노드들에게 알려지게 되면 다른 노드들은 이 블록체인 시스템의 신뢰를 잃게 되고,
그렇게 되면 이 블록체인을 더이상 사용하고 싶지 않을 것이다. 근데 이 악의적인 노드가 트랜잭션을 조작했다는 것은 결국에 자신이 더 많은 코인을 소유하고 싶어서 한 행동인데 그 시스템의 사용자가 계속 빠져나가면 그 코인의 가치는 떨어질것이다.
전체 채굴 노드중 51%이상을 소유하며 채굴을 한다는것은 엄청나게 많은 전기세와 인프라 비용이 필요할것이다. 이렇게 엄청나게 많은 돈을 들여서 많은 코인을 얻어냈는데, 사용자가 빠져 나가서 그 화폐의 가치가 떨어지게 되면 그 악의적인 사용자 입장에서는 손해일것이다.
그렇기 때문에 트랜잭션을 조작해서 비트코인을 버는것보다, 그냥 정상적으로 블록을 채굴해서 얻는 채굴이익이 더 크게끔 만들어 놓음으로써
굳이 시스템을 망치는 행위를 막은 것이다.
쉽게 설명하면, 상습 절도범이 계속해서 다른 사람의 집에 들어가서 물건을 훔치는것보다, 열심히 일해서 버는 돈이 더 클 경우 그 도둑은 굳이 남의 집에 들어가는 위험을 무릎쓰고 남의 물건을 훔치지 않을것이다. 블록체인 시스템이 이 예와 비슷하다고 볼 수 있다.
'컴퓨터 공학과 졸업 > 블록체인' 카테고리의 다른 글
블록체인 처리 흐름 (0) | 2018.02.04 |
---|---|
블록체인 FAQ (2) | 2018.01.15 |
블록체인의 이중지불 문제 (0) | 2018.01.15 |
블록체인의 분기 (0) | 2018.01.15 |
마이닝 (0) | 2018.01.14 |
- Total
- Today
- Yesterday
- hydrate
- Next.js
- react
- await
- typescript
- type alias
- promise
- computed
- Babel
- atomic design
- storybook
- reducer
- mobx
- reactdom
- es6
- server side rendering
- useRef
- reflow
- props
- javascript
- useEffect
- async
- webpack
- state
- return type
- Action
- rendering scope
- design system
- react hooks
- Polyfill
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |