본문 바로가기
학교 공부/블록체인

[Ethereum] Solidity 기본 변수와 함수 종류

by 그적 2021. 8. 1.

Solidity Language란?
: EVM에 byte코드로 생성된다. 따라서 bytecode만 해석하면 되고, javascript, C++, JAVA 등과 비슷하다.

 

 

Solidity version 표현
(ex1) pragma solidity>= 0.4.16 <0.9.0 // 0.4.16 버전 이상, 0.9.0 버전 이하를 통해서 실행이 됨.
(ex2) pragma solidity ^0.6.0 // 최소 0.6.0 이상의 solidity로 컴파일돼야 해. (0.7.0은 안됨)

 

 

==데이터 관련==

Data type
- boolean : 참, 거짓
- integer : 정수형, 종류는 int8~int256, uint8~uint256가 있으며, 일반 int를 사용했을 경우는 int256으로 설정됨.
- fixed point : fixed, ufixed, 예로 fixed32x2 자료형을 들면, 전체가 32비트인 실수 동시에 소수점 2자리까지 표현하는 것.

- address : 20바이트의 ethereum address
- byte array(fixed) : 1-32까지 고정된 사이즈로 만들 수 있음.
- byte array(dynamic) : bytes, string
- Enum : 열거형
- Arrays : 배열 
- Struct : 구조체
- Mapping : key와 value로 구성됨.
- Time units : seconds, minutes, hours, days, weeks (10minutes >> 600 sec
- Ether unis : wei, Szabo, ether

 

이미 선언된 변수명(global variable)
1) msg object 종류 : msg.sender(address) / msg.value(ether 값) / msg.data(data payload) / msg.sig(어떤 function을 갖고 있는지)
2) tx object 종류 : tx.gasprice(gas price) /  tx.origin(transaction을 만든 address)
3) block object 종류 : block.coinbase(miner address) / block.difficulty(난이도) / block.gaslimit(maximum account)
4) address object 종류 : address.balance / address.transfer

 

이미 선언된 함수(global function)
1) addmod, mulmod
2) keccak256, sha256, ripemd160
3) ecrecover // 서명한 주체의 address를 얻고 싶어.
4) this // 현재 동작하고 있는 contract의 address
5) selfdestruct / 현재 동작하고 있는 contract의 address를 지우고 싶어.


** contract은 클래스와 비슷하다고 생각하면 된다.
** interface도 실제 코드가 아닌 명세가 들어간 것임.
** library : delegated call을 통해 library에 있는 걸 부를 수 있음.

 

==함수 관련==
Function Keyword

// 자바의 public private라고 생각하면 편할 듯?
- public : default, 다른 EOA나 외부에서도 누구나 쓸 수 있게 하겠어.
- external : 외부의 EOA는 이 funciont을 쓸 수 있지만, 내부에서는 X
- internal : 내부에서만 쓸 수 있고, 외부에서는 쓸 수 X / 파생된 contract들도 사용할 수 있음.
- private : 오직 자기 자신만 쓸 수 있음. "호출만 안 되는 것임. 코드를 볼 수는 있음"
- view : 보기만 가능
- pure : 고치는 것뿐만 아니라 상태 정보에 access 못함.
- payable : ether의 전송도 처리해줄 수 있음.

receive function
: 하나의 account에 하나의 receive만 가능함.

형식) receive() external payble{ ... }

  // 설명 : 외부에서 이 contract에게 receive를 받아서 처리하는 것.

fallback function
: 매칭이 되는 함수가 없을 때 fallback에 있는 함수들을 사용함.

형식) receive() external payable { ... }

  // 설명 ; 데이터와 receive function이 없을 때 fallback함수로 처리됨.

 

contract function

: 초기 state를 설정해준다. 필수는 아니고 option이다.

형식) contract MEContract{
                constructor(){
                    // constructor 코드
                }
       }

   // 설명 : contract을 만들었을 때 처음 실행되는 친구. (명시적으로 위의 형태로 만든다.)

((selfdestruct function))
: ether를 받을 대상의 address를 적어주고 지워줌.

형식) selfdestruct(address recipient);

 

// (심화) contract을 만들더라도 이게 생성자라는 개념보다는 각각 독립적으로 소유자라는 개념만 가지고 있다. 따라서 소유자는 특별한 권한도 가질 수 없기 때문에 코드 상에서 다음과 같은 과정을 처리해줄 수 있다.

contract Faucet{
   address payable owner;

   // Contract constructor : set owner
   constructor() public{    // 배포되는 시점에서 sender(= 소유자, owner)를 설정함.
      owner = msg.sender;
   }

   // Contract destructor
   function destroy() public{
      require(msg.sender == owner);      // if문과 동일하게 생각하면 됨.
      selfdestruct(owner);               // 만약 동일하다면 소유자(owner)를 contract에 입력함.
   }
}

 

((require function))
: condition을 만들어서 여러 function들에게 적용시킴.

형식)  modifier onlyOnwer{
            require(msg.sender == owner);
            _;                                     // modify 되는 코드들이 들어감.
       }

 

** 그 외 smart contract 상속 등도 존재하는데 추후에 업로드 예정.

댓글