pragma solidity : 컴파일러 버전을 정의. (뒤에 버전을 명시)

contract : contract 선언 (뒤에 명칭을 명시)

constructor : 생성자

msg.sender : 솔리디티 자체에 내장된 변수(전역변수)

mapping : 주소마다 특정 숫자나 인덱스를 지정하고 싶을때 선언하는 타입

event : 한방향으로만 작동된다.

require : 조건문 (if 문과 같은 형태)

pragma solidity ^0.8.4;  // 컴파일러 버전 / ^는 0.8.4 버전 이상부터 라는 뜻 ( 0.8.4 ~ 0.8.9 까지 )

contract CryptoToken {
	// 구현부
	// 데이터 타입 
    uint private tokens = 400; // integer type의 접근제한자 public

		address public minter; // 주소데이터를 저장할때 쓰이는 타입

		//생성자
    constructor() {
        minter = msg.sender; // msg.sender 는 솔리디티 자체에 내장된 변수(전역변수) 
        //위 행위는 계약을 호출하는 사람의 주소를 minter 값에 설정하는 행위.
    }

		// 매핑. 주소마다 특정 숫자나 인덱스를 지정하고 싶다면 테이블을 사용.
    // mapping(key => value)
    mapping(address => uint) public balances;

		// 이벤트
		// 이벤트 보내기 Sent 구현 
    event Sent(address from, address to, uint amount); // Sent는 from, to, amount 가 필요

		// 민팅할 function 만들기
    function mint(address receiver, uint amount) public {
        require(msg.sender == minter); // require는 참여부를 가린다. (if 문이라고 보면 됨..)
				// 배포할때 생성자로 실행된 minter가 msg.sender와 같은지 판단하는 것.
				// 배포후, 다른 주소로 mint 호출시 에러가 발생한다.
    }

}