Search

13장 - Solidity 기본 구조

대분류
블록체인
소분류
Blockchain - 그라운드X
유형
Solidity
스마트 컨트랙트
상태
이벤트
생성자 함수
함수
최종 편집 일시
2024/10/29 08:00
생성 일시
2023/04/29 00:13
15 more properties

컨트랙트

// Solidity로 간단한 포인트 시스템을 구현 // [Coin 컨트랙트] // 컨트랙트 생성자가 관리하는 포인트 시스템 컨트랙트로 포인트 시스템 고유의 // 주소공간(address space)을 가지며 각 주소의 포인트 잔고를 기록한다. // 컨트랙트 생성자는 사용자 주소(e.g., 0xALICE)에 포인트를 부여할 수 있고 // 사용자는 다른 사용자에게 포인트를 전송할 수 있다 (e.g., 0xALICE → 0xBOB, 10 Coins) contract Coin { // [omitted for brevity] }
Solidity
복사

상태 (State Variables)

// “pragma solidity” 키워드는 Solidity 버전을 지정 pragma solidity ^0.5.6; // klaytn = 0.4.2 ~ 0.5.6 // “contract X { … }”는 X라는 컨트랙트를 정의 contract Coin { // “minter”는 address 타입으로 선언된 상태 // address 타입은 Ethereum에서 사용하는 160-bit 주소 // “public” 키워드는 상태를 다른 컨트랙트에서 읽을 수 있도록 허용 address public minter; // “balances”는 mapping 타입으로 address 타입 데이터를 key로, // uint 타입 데이터를 value로 가지는 key-value mapping // mapping은 타 프로그래밍 언어에서 사용하는 해시테이블 자료구조와 유사 // 어떤 key 값을 어떤 value 값에 매핑 시켜준다. // 주소 값을 주면 주소 값에 해당하는 value 값을 받을 수 있다. // (uninitialized 값들은 모두 0으로 초기화되어 있는상태) mapping (address => uint) public balances; //addr = key, uint = value // [omitted for brevity] }
Solidity
복사

이벤트(Events)

contract Coin { // [omitted state variables for brevity] // event로 정의된 타입은 클라이언트(e.g., application using a platform-specific // SDK/library)가 listening 할 수 있는 데이터로 emit 키워드로 해당 타입의 객체를 생성하여 // 클라이언트에게 정보를 전달 // 프로그래밍을 했는데 어떤 위치까지 실행시킨걸 확인할 때 사용, 리스닝할 때 사용 // usage: // /* in Solidity */ // emit Sent(an_address, another_address, 10); // 그 이벤트가 발생했을 경우에만 알림이 감. // /* in Web3.js */ // Coin.Sent().watch({}, ‘’, function(err, result) { … }); event Sent(address from, address to, uint amount); // [omitted for brevity] }
Solidity
복사

생성자함수(Constructor)

// N.B. 컨트랙트 함수는 함수를 실행한 TX의 정보를 받을 수 있는데 해당 정보를 msg 변수로 접근 contract Coin { // [omitted state variables and event definitions for brevity] // 생성자 함수는 컨트랙트가 생성될 때 단 한번만 실행 // 아래 함수는 minter 상태변수에 msg.sender값을 대입 (함수를 실행한 사람의 주소) constructor() public { minter = msg.sender; } // [omitted for brevity] }
Solidity
복사

함수(Functions)

contract Coin { // [omitted state variables, event definitions, and constructors for brevity] // receiver 주소에 amount 만큼의 새로운 Coin을 부여 // require 함수는 입력값이 true일때만 다음으로 진행할 수 있음 (타 언어의 assert와 유사) // require 함수는 특정조건(if)을 만족할 경우에만 함수를 실행할 수 있도록 강제할 때 사용 // message = 최초의 트랜젝션 function mint(address receiver, uint amount) public { require(msg.sender == minter); // 함수를 실행한 사람이 minter(i.e., 컨트랙트 소유자)일때만 진행 require(amount < 1e60); // 새로 생성하는 Coin의 양이 1 * 10^60개 미만일때만 진행 balances[receiver] += amount; // receiver 주소에 amount만큼을 더함 } // [omitted for brevity] }
Solidity
복사
contract Coin { // [omitted state variables, event definitions, and constructors for brevity] // msg.sender가 receiver에게 amount만큼 Coin을 전송 // from = msg.sender로 유추가능 function send(address receiver, uint amount) public { // 잔고가 충분한지 확인, 조건을 만족할 경우만 실행 require(amount <= balances[msg.sender], "Insufficient balance."); balances[msg.sender] -= amount; // 잔고 차감, balances = mapping balances[receiver] += amount; // 잔고 증가 // 이벤트 생성, emit = 정해진 이벤트를 지금 발생 시킨다. emit Sent(msg.sender, receiver, amount); } }
Solidity
복사