관리 메뉴

평행우주 : world 1

[Solidity] Subcurrency 코드 분석 본문

텃밭 1 : BlockChain/Solidity

[Solidity] Subcurrency 코드 분석

parallelworlds 2022. 3. 29. 02:52

Subcurrency

 

간단한 가상화폐를 만드는 코드

코인 발행은 컨트랙트를 만든 사람만이 할 수 있다

코인을 전송할 땐 아이디와 비밀번호 등이 필요하지 않다

오직 필요한 것은 이더리움 키 쌍이다

 

pragma solidity ^0.5.0;

contract Coin {
	//public은 변수의 현재 값을 컨트랙트 바깥에서 접근할 수 있도록 하는 함수를 자동으로 만든다
    //address 타입은 160 비트의 값으로 그 어떤 산술 연산도 허용하지 않는다
	//address 타입은 컨트랙트 주소나 외부 사용자들의 키 쌍을 저장하는 데 적합
    address public minter;
    
    //주소와 양의 정수를 연결(매핑) 
    //매핑은 가상으로 초기화되는 해시테이블
    //모든 가능한 키값은 처음부터 존재하며, 이 키 값들은 바이트 표현이 모두 0인 값에 매핑된다
    mapping (address => uint) public balances;

    // Events allow light clients to react to
    // changes efficiently.
    //이벤트가 발생되었을 때 from, to, amount 의 인자를 함께 받는다 
    //이는 트랜잭션을 파악하는데 도움
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    constructor() public {
    
    	//msg (tx 와 block 포함)는 유용한 전역 변수로 블록체인에 접근할 수 있는 다양한 속성들을 담는다
        //msg.sender 는 외부에서 지금 함수를 호출한 주소를 나타낸다
        minter = msg.sender;
    }

	//사용자나 컨트랙트가 호출할 수 있는 함수들 : mint 와 send  
    //만약 mint 를 호출한 사용자가 컨트랙트를 만든 사람이 아니면 아무일도 일어나지 않는다 
    function mint(address receiver, uint amount) public {
    	
        //이는 인수가 false로 평가될 경우 
    	//모든 변경 사항이 원래대로 되돌아가도록 하는 특수 함수 require 에 의해 보장
   		//require 를 두 번째로 호출하면 코인이 너무 많아지게 되고, 
    	//이는 차후에 오버플로우 에러의 원인이 될 수 있다. (위치중요)
        require(msg.sender == minter);
        require(amount < 1e60);
        balances[receiver] += amount;
    }

	// send 는 어디든 코인을 보낼 사람이면 (이미 이 코인을 가진) 누구나 호출 가능
    function send(address receiver, uint amount) public {
    
    	// 전송하려고 하는 코인의 양이 충분하지 않을 경우, 
    	// require 호출은 실패하게 되며, 적절한 에러메세지를 사용자에게 제공
        require(amount <= balances[msg.sender], "Insufficient balance.");
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}

 

 

 

 

 

Comments