공개된 나의 클레이튼 주소?

민식킴·2021년 3월 27일
0

내가 개발자

목록 보기
2/3
사족

5주차.
나는 저번주에 만든 'givemeklaytn'컨트랙트에 희생물이 될 새 주소를 만들었다. (클레이튼 월렛 사이트에서 얼마든지 생성가능하며 그때마다 테스트 클레이튼을 받을 수 있다. 생성한 주소로 바로 IDE에 접속 할수는 없는듯 하다.(하루 텀으로 예상))
물론 그냥 클레이튼 월렛에서 주소물론 그냥 클레이튼 월렛에서 보내도 되지만 그러면 재미없지.
만들어둔 새 지갑을 IDE에 연결시키고 컨트랙트 주소를 복사해 접근하였다. 그런데...
나의 본 지갑의 주소가 뻔히 나오지 않는가...!
스마트 컨트랙트에 owner를 public으로 해놓았으니 당연히 안에 저장된 정보는 여과없이 나오는 것이다! 열심히 가려놓았는데 모두 헛수고가 되었다.

이렇게 내 본 주소가 공개되자 나는 경악을 금치 못했고 혹시 다른 이가 내 주소를 이용해 해킹을 할 수 있지 않을까 생각했다.

하지만 그전에 내가 해킹해보자.

컨트랙트 짜기

나는 바로 새로운 컨트랙트를 짜보기로 했다.
하지만 그전에, 어떻게 해당 주소에서 돈을 빼갈수 있을까?
IDE를 보아하니 payable함수를 실행시키면 보내는 이는 자동적으로 로그인된 주소가 되는 듯 하다. 그러니까 누군가의 지갑의 돈을 빼내려면 그 지갑에 로그인하는 수밖에 없다는 것이다.
관련 정보를 찾아보다가..

보안에 관한 기사들
http://wiki.hash.kr/index.php/%EC%B7%A8%EC%95%BD%EC%A0%90#cite_note-2 (취약점 해쉬넷취약점 해쉬넷)

http://www.kookje.co.kr/news2011/asp/newsbody.asp?key=20170720.99099002866 (해킹당한 이더리움 창업자)

https://www.coindeskkorea.com/news/articleView.html?idxno=70117 (거래지갑 주소는 공개되어야 하는가?)

특히 '거래지갑 주소는 공개되어야 하는가?'에서

...예컨대 35만 이더(ETH)가 들어 있는 이더리움 창시자 비탈릭 부테린의 지갑(0xAb5801a7D398351b8bE11C439e05C5B3259aeC9B)은 지난 2018년 스스로 공개했으며, 비트코인 창시자 사토시 나카모토가 처음 만든 비트코인 지갑 비트코인 제네시스(Genesis of Bitcoin)는 비트코인 탄생 때부터 공개돼있다. 하지만 이들 지갑에 해킹 문제가 발생한 적은 한 번도 없다. 지갑 공개와 해킹은 별개라는 관점에...(중략)

"지갑 주소 공개로 인해 기술적으로 해킹의 위협이 된다면, 비탈릭이나 사토시의 지갑은 이미 수차례 탈취 사고가 발생했을 것이다. 하지만 그런 일은 발생하지 않았다. 지갑에 접근할 수 있는 개인키만 안전하다면, 지갑 주소 공개와 상관없이 해킹 위험은 없다. 지금껏 온체인 지갑 자체가 해킹된 사고는 없었다. 대부분의 거래소 해킹 사고는 개인키가 유출되는 내부 통제 시스템이 뚫린 탓이 크다."
- 패트릭 김(김형우) 웁살라시큐리티 대표

아아. 결과를 알아버렸다. 주소는 공개되어도 상대방은 절대 내 주소에서 돈을 빼갈 수 없다. 즉 주소만 안다고 그 주소의 돈을 빼가는 것은 불가능하다.

그래도 실험해볼 것은 남아있다. msg.sender를 변조해보는 것이다.

msg.sender에 해당 주소를 넣고 payable함수를 실행시키면 보내는 사람이 해당주소로 바뀌지 않을까?

그래서 만들기로했따! 해적이 될꺼야 컨트랙트!
앗..오류가 난다. 뭔가 '='을 쓸 수 없다고 하는것 같다.
바로 변조는 할수 없는 듯.

// goat는 희생양이 될 주소
설명하자면 ready함수를 실행시키면 change address함수를 실행시키고 msgsen(msg.sender)에 goat주소를 넣는다. 그리고 현재 주소(nowaddress)에는 msgsen(msg.sender)을 넣는다.
*change address함수는 internal(컨트랙트 내부에서만 호출가능)로 설정하여 버튼이 활성화되지 않는다.

초기값(아래):

결과...:

으앙 실패 했다~~
https://solidity-kr.readthedocs.io/ko/latest/units-and-global-variables.html 여기에서

주석
msg.sender 와 msg.value 를 포함한 모든 msg 의 멤버 값은 외부 함수 호출에 의해 바뀔 수 있습니다. 외부함수 호출에는 라이브러리 함수 호출도 포함됩니다.

외부함수 호출로는 바꿀수 있다. 즉 내부함수 호출로는 바꿀수 없다...
c언어로 다시 생각해 보아도 그 함수 내에서만 바뀌고 그 원래값은 바뀌지 않는다..(포인터를 쓴다면 모르지만)
결과를 알고 있었지만 내 가정이 잘못되었음이 다시한번 못박혔다. 난 바보다. 더 강해져서 돌아오자.

그렇다면 알아낸 주소로 내가 알수 있는 것은...
// you에 알아낸 주소를 넣었다.
원통하다!!

하지만 이밖에도 분명 더 알수 있는 것은 있을것이다. (주소 추적이라 던가..) 현재 내게는 해킹능력이 이것뿐이어서 참으로 원통하다.

aha질문 사이트 - 주소를 통하여 알수 있는 정보들

게임 기획에 관하여

이렇게 신나게 코딩을 하였지만 만약 어떤 로직을 완성하였더라도 게임은 실행될 수 없을것이다. 왜냐하면 사용자 인터페이스가 없기 때문이다. 솔리디티 코드를 짜는 것이 백엔드에 해당하고 사용자가 인식할 수 있게 따로 코드를 짜야하는데 이는 프론트엔드부분이다.
결국 게임을 기획하는데 있어서는 내가 프론트 엔드까지 할줄 알아야 할것같다. 그래야 어디까지 백엔드로 짜고 어디까지 프론트엔드로 짜서 이것을 연결 시켜야 할거기 때문이다.(이 생각은 틀릴수있다. 나는 프론트, 백엔드에 대해 모르는게 많다.)
인프런 클레이튼 강의에서 프론트 엔드를 위해 다운받아야 할것을 알려주었는데 이 저주받은 노트북은 온전히 프로그램이 깔리는 것을 받아들이지 않는다.(윈10으로 업그레이드가 안된것이 큰 원인으로 생각한다.) 맥으로 갈아타야 하는것인가..

profile
우리의 꿈, 우리의 희망

0개의 댓글