CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·주식한당 ·아이포니앙 ·MaClien ·방탄소년당 ·일본산당 ·개발한당 ·소시당 ·자전거당 ·이륜차당 ·AI당 ·패스오브엑자일당 ·안드로메당 ·바다건너당 ·나스당 ·클다방 ·곰돌이당 ·가상화폐당 ·키보드당 ·리눅서당 ·사과시계당 ·소셜게임한당 ·물고기당 ·전기자전거당 ·골프당 ·노젓는당 ·걸그룹당 ·콘솔한당 ·노키앙 ·윈폰이당 ·축구당 ·여행을떠난당 ·디아블로당 ·찰칵찍당 ·3D메이킹 ·X세대당 ·ADHD당 ·AI그림당 ·날아간당 ·육아당 ·배드민턴당 ·야구당 ·농구당 ·블랙베리당 ·비어있당 ·FM당구당 ·블록체인당 ·보드게임당 ·활자중독당 ·볼링친당 ·캠핑간당 ·냐옹이당 ·문명하셨당 ·클래시앙 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·뚝딱뚝당 ·개판이당 ·동숲한당 ·날아올랑 ·e북본당 ·갖고다닌당 ·이브한당 ·패셔니앙 ·도시어부당 ·FM한당 ·맛있겠당 ·포뮬러당 ·젬워한당 ·안경쓴당 ·차턴당 ·총쏜당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·IoT당 ·KARA당 ·꼬들한당 ·덕질한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·영화본당 ·MTG한당 ·소리당 ·적는당 ·방송한당 ·PC튜닝한당 ·그림그린당 ·소풍간당 ·심는당 ·라즈베리파이당 ·품앱이당 ·리듬탄당 ·달린당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·퐁당퐁당 ·테니스친당 ·테스트당 ·빨콩이당 ·공대시계당 ·터치패드당 ·트윗당 ·창업한당 ·VR당 ·시계찬당 ·WebOs당 ·위스키당 ·와인마신당 ·WOW당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

블록체인당

4차산업혁명을 견인할 인터넷혁명, 블록체인

강좌와 팁
Solidity - 스마트컨트랙트를 이용한 슬롯머신(확률게임) 만들기 1편

1
Dunpay.com
3,327
2018-06-06 23:11:29 183.♡.66.120

Screen Shot 2018-06-06 at 10.33.13 PM.png

우선 결과화면은 다음과 같습니다.

Screen Shot 2018-06-06 at 10.34.30 PM.png

배팅버튼을 클릭하면 메타마스크가 실행되며 승리여부를 알려주게 됩니다.

이곳을 방문하시면 실제로 테스트가 가능합니다.

https://www.dunkpay.com/slot-test/

슬롯머신게임 의 스마트 컨트랙트 소스는 매우 간단합니다.

pragma solidity ^0.4.8;

contract SlotMachine {
    
    mapping (address => uint) public playerList; 
    uint256 public contractBalance;
    
    function SlotMachine() public {
    }
    
    function () payable public {
        start();
    }
    
    function start() public payable {
        
        uint256 userBalance = msg.value;
        require(userBalance > 0);
        uint randomValue = random();
        playerList[msg.sender] = randomValue;
        contractBalance = address(this).balance;
            
        if(randomValue > 50)
        {    
            uint256 winBalance = userBalance * 2;
            if(contractBalance < winBalance){
                winBalance = contractBalance;
            }
            msg.sender.transfer(winBalance); 
            contractBalance = address(this).balance;        
        }
    }
    
    function random() view returns (uint8) {
        return uint8(uint256(keccak256(block.timestamp)) % 100) + 1; // 1 ~ 100 (Only for testing.)
    }
}

첫줄에 무명함수는 Fallback 즉, 이더리움이 입금될 때 실행되는 함수를 의미합니다.

payable은 이더리움을 받을 수 있는 함수를 의미합니다.

public 은 외부에서 실행할 수 있는 함수를 의미합니다.

public 변수 playerList, contractBalance는 외부에서 읽을 수 있는 변수를 의미합니다.

random() 함수는 현재시간을 100으로 나누는 함수를 의미합니다.

즉, 사용자가 이 컨트랙트로 ETH를 입금하게 되면 start() 함수가 호출됩니다.

이후, random() 함수가 호출되어 1~100 사이의 난수를 발생시킵니다.

그 값이 50이상이면 컨트랙트에서 사용자에게 배팅한 금액이 2배가 출금이 됩니다.

클라이언트 구성은 더욱 간단합니다.

클라이언트에서는 단순히 컨트랙트에 입금을 실행합니다.

사용자가 입금을 하게되면 Hash값을 생성하게 됩니다.

이후에 클라이언트에서 컨트랙트를 읽어서 당첨 여부를 확인하여 표시하면 됩니다.

이 소스에 문제는 없을까요?

random() 함수는 보안상 큰 이슈를 가지고 있습니다.

스마트컨트랙트의 장점 또는 단점이 그대로 나타나는 부분입니다.

사용자는 random()함수의 원리를 그대로 볼 수 있습니다.

본 예제에서는 timestamp 값을 사용하지만 hash 값을 사용하던 sha값을 사용하던지 동일합니다.

특히 사용자가 블럭을 임의로 조작할 수 있는 마이너 라면 문제가 커집니다.

즉, 연습에서는 사용할 수 있는 Random() 이지만 상용에서는 절대로 사용해서는 안됩니다.

1편에서는 스마트컨트랙트의 동작원리를 이해하는 수준에서 글을 마치겠습니다.

2편에서는 random()함수를 상용 프로그램에서 쓰려면 어떻해야 하는지 얘기해 보겠습니다.

Reference:
https://github.com/josex2r/jQuery-SlotMachine
https://medium.com/@promentol/lottery-smart-contract-can-we-generate-random-numbers-in-solidity-4f586a152b27
https://ethereum.stackexchange.com/questions/41463/a-possible-method-for-safe-random-number-in-lotteries?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
https://ethereum.stackexchange.com/questions/191/how-can-i-securely-generate-a-random-number-in-my-smart-contract?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

출처 : https://steemit.com/dunkpay/@bitcoinyo/solidity-1
Dunpay.com 님의 게시글 댓글
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [0] 을 클릭하면 간단한 회원메모를 할 수 있습니다.
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB
업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.