이더리움에서 게임을 만든다? 크립토 좀비(4. 좀비 전투 시스템)

민식킴·2021년 3월 5일
0

크립토 좀비

목록 보기
6/9
사족

9일차.
레슨 4로 넘어가면서 더 복잡한거 배우면 어쩌나..했지만 레슨4도 어김없이 내가 좋아하는 돈이야기가 나왔다. 무려 코인을 지불하거나 인출하는 함수를 배운다. 형 왜 이제왔어

CH.1 Payable

function buySomething() external payable { / << 제어자'payable'

    // 함수 실행에 0.001이더가 보내졌는지 확실히 하기 위해 확인:
    require(msg.value == 0.001 ether);
    
    // 보내졌다면, 함수를 호출한 자에게 디지털 아이템을 전달하기 위한 내용 구성:
    transferThing(msg.sender);
  }

msg.value는 트랜잭션에 있는 value를 읽어오는것같다.
여기 크립토 좀비에선 0.001ether를 입금하면 좀비의 레벨이 오르게 했다.(양아치네)

CH.2 출금

...이더를 보낸 다음에는 어떤 일이 일어날까?
자네가 컨트랙트로 이더를 보내면, 해당 컨트랙트의 이더리움 계좌에 이더가 저장되고 거기에 갇히게 되지 - 자네가 컨트랙트로부터 이더를 인출하는 함수를 만들지 않는다면 말이야.

// Ownable 컨트랙트를 import 했다고 가정
function withdraw() external onlyOwner {  

    // this.balance는 컨트랙트에 저장되어있는 잔액을 반환함
    owner.transfer(this.balance); 
}

또한

// 아이템 요금보다 더 받아서 초과한 금액만큼 보낸다면
msg.sender.transfer(msg.value - itemFee); // 이런 함수를 만들수도 있겠다

CH.3,4,6 좀비 전투 & 난수(Random Numbers) & 좀비싸움

이제 돈을 받았으니 일을해야지
전투 시스템을 만들어 볼것이다. 그렇다고해야 단순히 확률싸움이다.
난수는 keccak256으로 만들것이다.
uint random = uint(keccak256(now, msg.sender, randNonce));
그런데 크립토 좀비에서 여기에 하나의 취약점이 있음을 말해준다.

우리가 동전 던지기 컨트랙트를 사용한다고 해보지 - 앞면이 나오면 돈이 두 배가 되고, 뒷면이 나오면 모두 다 잃는 것이네...
내가 만약 노드를 실행하고 있다면, 나는 오직 나의 노드에만 트랜잭션을 알리고 이것을 공유하지 않을 수 있네. 그 후 내가 이기는지 확인하기 위해 동전 던지기 함수를 실행할 수 있지 - 그리고 만약 내가 진다면, 내가 풀고 있는 다음 블록에 해당 트랜잭션을 포함하지 않는 것을 선택하지. 난 이것을 내가 결국 동전 던지기에서 이기고 다음 블록을 풀 때까지 무한대로 반복할 수 있고, 이득을 볼 수 있네.

그러니까 변조된 블록을 쌓아서 왜곡할 수 있음을 말해주고 있다. 하지만 이미 우리는 알고있듯이 이더리움 컴퓨팅파워의 51%를 먹어야 가능하기때문에 이게 가능하다면 이미 암호화폐(이더리움)은 다 망해있을 것이다.

profile
우리의 꿈, 우리의 희망

0개의 댓글