ICO 때 이더리움 네트워크 문제에 대한 설명 (이더리움 황서를 바탕으로)
status.im ICO 때 이더리움에 갑자기 너무 많은 거래가 한번에 몰려서 몇시간 동안 극심한 거래 불능사태가 벌어졌다.
이번에는 이더리움 황서에 있는 내용을 기초로 그 원인을 살펴보고자 한다.
비트코인은 네트워크 보안 때문에 블럭 크기를 1MB로 제한한다.
또한 거래의 최대 크기도 제한한다. 이것은 공격자는 거래의 수백개의 출력을 넣는 방법으로 비트코인 네트워크에 부하를 증가시킬 수 있기 때문에 이를 방지하기 위한 것이다.
하지만 이더리움은 스마트 컨트랙트(일반적인 프로그램이 가능함)가 가능하기 때문에 공격자가 컨트랙트에 무한루프 등과 같은 공격을 하지 못하게 하기 위해서 컨트랙트의 모든 명령어에 부하에 따른 가격을 부과하여 네트워크를 유지하며, 이것을 가스(gas)라고 한다.
참조: 가스 가격표 링크
즉 이것은 스마트 컨트랙트 실행 수수료인 것이고, 이더리움은 이 가스로 네트워크 보안을 유지한다.
이 가스가 컨트랙트에 대한 핵심 보안 방법이다.
그렇지만, 특정 명령어의 가격이 다른 명령어보다 저렴할 수가 있기 때문에 공격자는 부하를 많이 발생시키는 저렴한 특정
명령어를 실행하여 도스 공격을 실행할 수 있다.
실제로, 2016년 9월에 도스 공격은 EXTCODESIZE 명령어를 이용한 공격이었다.
참조: 도스공격 관련 링크
만일 공격자가 무한 루프 공격을 하기 위해서는 엄청난 가스, 즉 이더를 소비해야 하기 때문에 가스를 사용하여 네트워크 공격을 방어하는 것이다.
하지만, 이런 방법은 1) 가스를 올리면 사용성이 떨어지고, 2) 가스를 내리면 도스 공격의 가능성이 증가하는 딜레마에 직면하게 된다.
그리고, 이번 ICO 때 문제가 된 것은 '블럭당 총 개스제한' 때문에 발생했다.
즉, 이더리움은 네트워크를 방어하기 위해서 블럭 당 총 가스를 제한하고 있다.
이것이 비트코인의 블럭 크기의 1MB 제한과 같은 역할을 하는 것으로 볼 수 있다.
이번 ICO 때 모든 사람이 자신의 이더를 빨리 보내기 위해서 최대 가스를 설정하여 보냈고, 이더리움 네트워크의 블럭 당 총 개스 제한 때문에 블럭에 포함되는 거래의 개수는 이전 블럭보다 더 줄어들게 되어 이더리움 네트워크에 마비가 온 것이다.
이번 ICO를 계기로 이더리움의 문제점이 확실하게 들어난 것이다.
아래에서 가빈 우드의 황서를 바탕으로 '블럭 당 총 가스제한'에 대해서 알아보자.
아래는 황서를 캡처한 것으로 이더리움의 블럭 헤더에 총 개스제한은 gasLimit, 즉 Hl이 포함된다는 것을 말한다. 수식 중 H는 블럭의 헤더를 의미하고, l은 가스제한이라는 의미이다.
아래 수식은 블럭마다 gasLimit , Hl이 어떻게 변하는 지를 보여주는 수식이다.
여기서, P(H)Hl 은 부모 블럭(P) 의 헤더(H)의 gaslimit 인 Hl을 나타낸다. 즉, 이것이 의미하는 것은 바로 전 블럭의 총 개스 제한이다.
참고로 수식 중 ^은 수학에서 and를 의미한다.
따라서, 이 수식은 현재 블럭의 총 개스 제한이 이전 블럭의 개스 제한에 대해서 P(H)Hl / 1024 를 더하거나 뺀 것이다.
즉, 총 개스 제한은 블럭 당 1/1024, 즉 블럭마다 0.0976%의 총 개스가 변할 수 있는 것이다.
아래의 링크를 참조할 수 있다
https://media.consensys.net/ethereum-gas-fuel-and-fees-3333e17fe1dc
https://ethereum.stackexchange.com/questions/1106/is-there-a-limit-for-transaction-size
쉽게 말하면 각 블럭 마다 총 개스 제한이 있고, 이것은 블럭마다 0.0976% 씩 더하가나 빼면서 변할 수 있다는 것이 핵심입니다. 이것이 원인이고요..
그리고 이번 사태는 ICO 때 사용자가 서로 먼저 ICO에 참가하려고 개스비를 최대로 설정하고 이더를 보냈지만, '블럭 당 총 개스제한' 때문에 이전 보다 블럭에 더 적은 거래가 포함되었다는 것입니다. 이것이 현상입니다..
그리고 지갑에서 전파한 거래는 블록체인에 기록되기 전에 맴풀(mempool)에 임시적으로 저장되어 블럭체인에 기록도기를 기다립니다..
이 맴풀은 일반적으로 메모리에 저장합니다. (비트코인에서는 확인했지만 이더리움에서는 확인을 못함)
이 때문에 맴풀의 최대 저장 용량이 정해져 있고, 이것이 넘어버리면, 거래가 맴풀에 저장이 안되기 때문에 지갑에서 거래를 보내도 전혀 소용이 없어서, 계속 보내는 현상이 발생한 것입니다.
그러다 우연히 맴풀에 빈 곳이 우연히 생기면, 바로 전달된 거래가 차지한 것입니다.
따라서, 사용자가 ICO에 참여하기 위해서 지갑에서 거래를 발생시키려고 했지만, 이더리움의 맴풀은 꽉 차서 받아주지 않으니 사용자는 지갑에서 무한대로 계속 거래를 발생시키려고 시도했던 것입니다.
즉, 이번 이더리움의 네트워크 문제는 네트워크를 보호하기 위해서 블럭 해더에 포함된 gasLimit 때문에 발생된 것입니다.
그리고, gasLimit 를 없애면, 공격자가 무한 루프 등을 실행하여 이더리움 네트워크를 붕괴시킬 가능성이 있어서 이를 없앨 수도 없다.
좋은 정보 합니다 팔로우 할게요
읽어도 잘이해가 안되군요 흠
제일 밑에 좀 쉽게 설명해 놓았습니다.
좋은글 감사요 블로그는 안하시나봐여 이제
좋은 글 감사합니다.
좋은 정보 잘 봤습니다.
다른건 읽어도 잘 모르겠는데 수학에서 ^는 and아닌가요? 반대방향이
or 구요?
and가 맞습니다.
Congratulations @loum! You have completed some achievement on Steemit and have been rewarded with new badge(s) :
Award for the total payout received
Click on any badge to view your own Board of Honnor on SteemitBoard.
For more information about SteemitBoard, click here
If you no longer want to receive notifications, reply to this comment with the word
STOP
By upvoting this notification, you can help all Steemit users. Learn how here!