스마트 계약(Smart Contract)이란
이더리움 블록체인에서 동작하는 응용 프로그램입니다.
쓰지 않는 중고 물품을 공유하는 응용 프로그램을 만들어
블록체인에 배포하면
블록체인 참가자들이 다양한 클라이언트나 브라우저를 이용해서
중고 물품 리스트를 확인하거나 등록해서 공유할 수 있습니다.
이더리움 스마트 계약 개발에 사용되는 프로그래밍 언어로는
solidity , serpent , LLL 등이 있는데요.
아시겠지만 많이 사용되는 solidity 대세입니다.
Solidity는
코딩해서 컴파일 과정을 거쳐 바이트코드를 만들어 배포하는 정적 언어로써
대규모의 프로그래밍도 가능하고 안정적입니다.
객제지향 언어이며 Class가 있는 C++ , Java와 매우 흡사합니다.
solidity만의 고유의 문법이 있어 차이가 있지만
전체적인 프로그램 구조는 같다고 보시면 될거에요.
■ Solidity 기본 문법
아래가 기본 구조이며 클래스와 동일한 구조인 거 같죠.
pragma solidity ^0.5.16;
import "./contracts/funcfactory.sol"
contract UsedShare {
//상태 변수 선언
string public name;
uint public count;
address public user;
//이벤트
event userdHit(address _user, unit number);
//생성자
constructor() public {
user = msg.sender;
}
//함수 선언
function getUser() public view returns(address) {
return user;
}
function set(uint x) public {
count = x;
}
function get() public view returns (uint) {
return count;
}
}
● pragma solidity는 컴파일러인 solc 버전 정보
그동안 solc 버전이 자주 바꾸면서 이제는 버전 정보를 꼭 기록해야 되네요.
버전 차이로 인해 오작동을 방어하기 위한 조치인 거 같아요.
● import문은 외부 또는 다른 sol파일들 참조할 수 있게 합니다.
● contract 계약 선언
contract를 영어 해석하면 계약이란 뜻이며 스마트 계약의 단위입니다.
contract를 class라고 생각하시면 될 거예요.
객체지향 언어와 동일하게 다른 contract 상속받을 수 있습니다.
is 키워드를 쓰고 뒤에 상속받을 contract명을 쓰면 됩니다.
contract Child is Parents
● event는 쉽게 말해 로깅입니다.
event문으로 이벤트를 선언하고 emit문으로 이벤트를 호출합니다.
이벤트가 호출될 때마다 트랜젝션 로그에 함께 기록됩니다.
그리고 블록체인 네트워크에서 web3.js를 이용해서
contract에서 발생한 이벤트 데이터를 읽을 수 있습니다.
● 가시성(visibility)은 자바의 접근제어자와 동일하며
public private external internal이 있습니다.
▩ public
외부 다른 contract에서도 호출 가능
▩ private
지정된 contract내에서만 호출 가능 . 상속한 contract에서도 접근 불가능
▩ external
contract 외부에서만 호출 가능
▩ internal
상속한 contract에서만 접근 가능
● 변수
상태 변수(State Variable)와 지역 변수(local Variable)가 있으며
상태 변수는 contract 선언문 바로 아래 선언된 변수이고
블록체인에서 영구적으로 저장되는 값들입니다.
지역 번수는 function 내에 선언된 변수입니다.
자료형 가시성 변수명;
자료형 가시성 변수명 = 값;
▩ 정수형
int : 정수 타입 . 기본값 0으로 일반적인 숫자
int8 int16 int32 int64 int128 int256
uint : 부호 없는 정수 타입 . unsigned int . 기본값 0으로
uint8 uint16 uint32 uint64 uint128 uint256
▩ Boolean
true 와 false
▩ string
UTF-8 인코딩의 임의의 길이 문자열
▩ bytes
임의의 길이의 byte 데이터 . 원시 데이터를 만들 때 사용
▩ array . 배열
자료형[개수] 배열명;
uint[10] scores;
uint[] scores; 배열 개수 지정 없이 동적 선언도 가능.
인덱스는 0부터 시작하며
데이터 삽입시 배열명.push(값)으로 함.
▩ struct . 구조체
여러 개의 자료형을 모두 새로운 유형의 자료형을 정의하는 것을 struct라고 합니다.
struct _phone {
string phone_num;
string name;
uint age;
address user;
}
▩ mapping
자바에서 hash 또는 map 자료형과 동일하며
key와 value으로 이뤄진 자료형입니다.
mapping(string => uint) 변수명;
앞에 string 형의 key값이고 뒤에 uint 형의 value값을 나타내는 매핑입니다.
▩ address
이더리움의 계정(지갑) 주소를 나타낼 때 address를 사용합니다.
주소값은 20byte 길이로 byte20 자료형으로 변환할 수도 있습니다.
● 형변환(casting)
▩ 자료형(값)으로 형변환할수 있습니다.
string score = "123";
uint(score)
▩ uint64 자료형을 uint32로 casting하려면 uint32(uint64 변수명)으로 합니다.
● function . 함수
스마트 계약의 다양한 기능을 구현하는 곳입니다.
function 함수명() 가시성 상태제어자 returns (인자값들..)
function set(uint x) public {
count = x;
}
function get() public view returns (uint) {
return count;
}
▩ 상태제어자
함수의 역할을 제어하며 view , pure가 있습니다.
view는 상태 변수 접근 가능하지만 변경 불가능하며
pure는 상태 변수 접근과 변경 둘 다 불가능합니다.
● function modifier . 함수 제어
contract에 정의된 함수들이 호출 전 . 후 호출되는 함수입니다.
함수에 접근할 수 있는 제한 사항을 두거나
함수 호출 전,후 공통적인 기능을 넣을 때 사용됩니다.
modifier 정의하고 마지막 줄에 반드시 _; (언더바 세미콜론) 넣어야 됩니다.
함수의 가시성(public,private...) 뒤에 함수명을 기입하면 됩니다.
contract SimpleStorage {
uint storedData;
address change_user;
modifier check_Owner {
require(msg.sender == change_user, "호출 계정(주소)이 같아야 합니다.");
_;
}
function set(uint x) public check_Owner {
storedData = x;
}
...
...
● payable
가상화폐를 접근할 수 있는 키워드입니다.
이더를 주고받는 함수에는 반드시 있어야 되며
없을 경우에는 트랜잭션 거부 에러가 발생합니다.
● fallback function . 폴백함수
이름 없는 함수이며 contract 마다 한 개씩 가질 수 있습니다.
어떤 함수를 호출하지 않고 contract만 호출할 경우에 자동으로 호출됩니다.
인자도 없고 리턴도 없습니다.
가시성은 반드시 external이어야 합니다.
payable 키워드가 사용되면 가상화폐(이더)를 송금하거나 수신받을 수 있습니다.
function() external {
...
}
function() external payable {
...
}
감사합니다.
'IT > 이더리움 Ethereum' 카테고리의 다른 글
이더리움 로컬 개발 플랫폼 Ganache 설치하기 (0) | 2022.09.22 |
---|---|
이더리움 지갑 metamask 가입 설치하기 (1) | 2022.09.22 |
이더리움 geth 멀티 노드 테스트하기 . private test network (2) | 2022.09.21 |
이더리움 geth 멀티 노드 만들기 . private test network (1) | 2022.09.21 |
이더리움 geth JSON-RPC를 이용한 HTTP 웹으로 사용하기 (1) | 2022.09.21 |
댓글