[Why]이더리움 콘스탄티노플 하드포크가 연기된 이유.

in #ethereum6 years ago (edited)

안녕하세요? 이더리움 코드보는 SigmoiD입니다.
이더리움 하드포크가 연기 되었다고 합니다. 오피셜 블로그 제목도 참 자극적이구요

보안경고: 이더리움 콘스탄티노플 연기
https://blog.ethereum.org/2019/01/15/security-alert-ethereum-constantinople-postponement/

잘 모르시는 분들이 보면 오해가 넘쳐날만한 제목입니다. 이더리움은 안전한거 아니였어? 암호화폐가 해킹당한거야? 등등. 그래서 오늘은 문제가 된 내용이 무엇인지 조금은 테크니컬하게 알아보도록 하겠습니다.

  1. 먼저 공식 이더리움블로그를 간단히 요약합니다.
    문제를 발견한 Chain Security팀이
    EIP1283이 문제를 발생시킬 여지가 있다고
    버그 바운티 프로그램에 제보를 했고
    검토 결과 지금까진 문제가 없었으나 리스크가 0이 아니기 때문에 수정해야한다고 결론지어짐

  2. EIP1283이 뭔데?
    EIP는 이더리움을 더 좋게 만들기위해 사람들이 문제를 지적하고 수정을 요청하는 방법입니다.
    https://eips.ethereum.org/EIPS/eip-1283 의 내용은 계약코드에서 sstore라는 op코드를 사용할때 가스비가 드는데 이게 최종적으로 상태가 안바뀌는 경우에도 돈이 들더라. 비효율적이니 중간상태를 두고, 최종적으로만 sstore를 호출해서 가스비를 줄이자 인데요.(최종적으로 no op라면 저장을 안해도 되는거 아니냐! 이거죠)
    이더리움은 상태머신이므로 상태를 바꾸는 cost가 필요하며, 그 상태를 바꾸는 여러가지 방법중 계약코드의 저장소에 데이터를 쓰는것도 포함되기 때문에 계약을 처리하는 중 여러번 데이터를 저장할 경우 돈이 많이 듭니다. 그러니 중간상태는 저장하지 않고 최종값만 쓰자는 제안이 나온것이고 아이디어 자체는 좋아보이는데요.

  3. 저 기능이 언제 문제가 되나?
    문제를 제기한 체인시큐리티 팀에 따르면
    계약상에서 돈을 보낼때 사이드이펙이 있다고 하는데요
    https://medium.com/chainsecurity/constantinople-enables-new-reentrancy-attack-ace4088297d9 어떤 계약이 있는데 이 계약은 보유된 잔고를 2개의 그룹으로부터 합의된 비율로 나누도록 되어 있다고 가정합니다.
    즉, A B가 3:7로 100원을 나누자라고 합의한다면
    A에게는 30원이 B에게는 70원이 가게 됩니다.

문제상황은 이렇습니다..

  • A가 공격자입니다
  • A가 계약서를 하나더 추가합니다( 이 계약서는 분배계약서를 호출하도록 되어 있음)
    새계약을 통해 100원을 분배계약에 예치합니다.
  • 새계약을 통해 A가 분배하는 함수를 호출합니다. (나에게 100이 돌아도록)
  • 새계약으로 돈이 들어오면 새계약의 fallback함수가 실행됩니다(원래 그렇습니다)
  • 그안에서 또 분배함수를 호출하면? 돈이 또들어옵니다(이게 재진입공격입니다)

chain security의 샘플 예제처럼 fallback함수에서 저장소에 분배함수를 저장하고 호출하는 방식으로 구현할때 원래는 저장하는 비용이 비싸서 가스비 제한 때문에 저렇게 구현할수 없었던 부분들이, EIP1283이 새로 들어오면서 저장소의 값을 바꾸는 비용이 싸졌기 때문에 저런방식의 공격이 가능해진다는 내용입니다
(제가 컨트렉쪽은 잘 몰라서 이정도로 마무리..)

덧글추가: 온더에서 분석한 자료에 fallback부분이 좀더 자세하게 기술되어 있네요.
SSTORE는 최소 5,000 gas가 소모됩니다. transfer 함수로 호출된 fallback 함수 내에서는 2,300 gas까지 밖에 사용할 수 없기 때문에 revert가 발생합니다. 즉 transfer 함수로 인해 reentrancy가 방지되는 것이죠.
하지만 콘스탄티노플 버전에서는 3번 과정에서 gas를 200만큼만 사용하기 때문에 콘스탄티노플 이전 버전처럼 revert가 발생하지 않게 됩니다. 즉 transfer 함수는 위와 같은 경우엔 reentrancy 공격을 막아줄 수 없습니다.
원문: https://medium.com/onther-tech/%EC%99%9C-%EC%BD%98%EC%8A%A4%ED%83%84%ED%8B%B0%EB%85%B8%ED%94%8C-%ED%95%98%EB%93%9C%ED%8F%AC%ED%81%AC%EB%8A%94-%EC%97%B0%EA%B8%B0%EB%90%98%EC%97%88%EB%82%98-685e54d652a5

** 결론적으로 **
사실 작다면 작게 볼수 있는 문제인데요, DAO사태를 한번 경험해본 이더리움 커뮤니티 입장에서 보면 큰문제입니다 (스마트 컨트렉트 op코드 비용 문제하나가 메인넷 자체의 문제로 일파만파 커질수 있음)
하드포크 관련해서는 또다시 회의가 열리겠지만, 비용 디자인이 생각보다 쉽진 않아보이네요. (가격이 싸지면 스마트 컨트렉트의 활용도가 높아지는 건 맞으니까 버리긴 어려운 카드일텐데). 다만 난이도 관련한 문제가 크기 때문에 하드포크는 진행하되, 해당 EIP를 다음 예정된 포크때 넣는것으로 결정나지 않을까..라고 저는 개인적으로 생각합니다.

오늘도 이멘!

Sort:  

Congratulations @sigmoid! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You published more than 60 posts. Your next target is to reach 70 posts.

Click here to view your Board
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Support SteemitBoard's project! Vote for its witness and get one more award!