salsa source

[이더리움 베이직] Solidity 문법1 본문

STUDY/블록체인

[이더리움 베이직] Solidity 문법1

dayofday 2018. 3. 13. 16:01

<참고 : 이더리움 베이직>




자료형


정수형 -> int, uint

연산할 때 자료형을 맞춰주어야 연산 가능함


현재까지 스마트 컨트랙트는 실수형 데이터는 지원하나 자료형은 지원하지 않음



참거짓 -> bool


나열형 -> enum


enum FName {Kim, Park, Lee, Choi}

FName Nah = FName.Kim;

FName Hee = FName.Lee;

FName Jiy = FName.Choi;


FName 안에 선언 된 네 가지 이외에 다른 것을 선언하면 컴파일러가 알려줌



주소형 address


20바이트 크기의 자료형. address 키워드로 선언하며 컨트랙트 주소 저장 시 사용한다.

40자리의 16진수 정수로 표현


기능

1) balance : 해당 지갑이나 컨트랙트의 이더 잔고 조회

2) transfer, send : 해당 지갑이나 컨트랙트로 이더 송금 시 사용. 단위는 Wei(1 wei = 10^-18 ether)


-----------------------------------------------

function exampleAddress() public{

        address sender = this;

        address recipient = 0xABC;

        

        recipient.transfer(5);

}

-----------------------------------------------

recipient에게 5 wei를 송금하는 코드



송금과정에서 송금이 실패한 경우

transfer -> 즉시 오류를 발생시켜 컨트랙트 실행 취소

send -> 오류를 발생시키지 않고 단지 false만 반환하며 그 뒤 코드는 계속 실행


==> transfer 사용을 권장!




튜플 

컴파일 전 미리 정해진 데이터들의 묶음

각 데이터의 자료형은 달라도 괜찮다!!


-----------------------------------------------

function f() public constant returns (int, int){

        var (x, y, z) = (1, 2, true);

        (x, y) = (y, x);

        var (a, b) = (x, y);

        return (a, b);

}

-----------------------------------------------


(x, y, z)를 (1, 2, true)로 선언한 뒤

(x, y) = (y, x) 로 둘의 값을 swap함


리턴 값 (a, b)는 (x, y)이므로 (2, 1)인 것을 확인할 수 있다.




함수


함수 형태


function name (x1, x2, ,,, xn) option returns (y1, y2, ,,, yn) {


}


name : 함수의 이름    생략 불가

(x1, x2, ,,, xn) : 입력 매개변수

option : private/public/external/internal, constant, payable

returns (y1, y2,,,,yn) : 출력 매개변수



private/public/external/internal, constant, payable : Visibility (가시성)

private - 함수 내부에서만 접근 가능

internal - 내부와 상속된 컨트랙트에서 접근 가능

external, public - 컨트랙트 밖에서도 접근 가능

(default 값은 public -> 이전 버전에서는 그랬던 것으로 보이나 현재 버전에서는 public 도 명시를 해주어야 컴파일이 된다.)


constant : 상수 함수(수정 불가)로 gas를 소모하지 않음


payable : 지불 가능 함수.  자신의 함수를 통해 다른 지갑이나 컨트랙트에서 이더를 송금받고 싶은 경우



간단한 함수 예시


-----------------------------------------------

function sum(uint a, uint b) returns (uint result){

     result = a + b;

}

-----------------------------------------------

a와 b를 입력하면 이의 합이 반환된다.


-----------------------------------------------

function operating() returns(uint result){

        result = sum(5, 10);

}

    

function sum(uint a, uint b) returns (uint){

     uint result = a + b;

     return result;

}

-----------------------------------------------

operating()을 실행하면 sum(5, 10)의 값인 15가 반환된다.




생성자

컨트랙트가 생성될 때 딱 한 번만 실행되는 함수로 보통 초기화 세팅에 주로 사용.

생성자는 다음과 같이 사용된다.

function 컨트랙트이름(....){


}


예시

-----------------------------------------------

contract Example4{


    uint count;

    address from;

    address to;

    

    function Example4(uint _count, address _from, address _to){

        count = _count;

        from = _from;

        to = _to;

    }

}

-----------------------------------------------



이렇게 생성자를 선언 해 두면 




create에 입력 매개변수를 넣어 초기화가 가능하다.



new키워드를 이용해서 컨트랙트가 다른 컨트랙트를 만들 수 있는데 이때도 생성자가 이용된다.


-----------------------------------------------

contract Example4{

    uint a;


    function Example4(uint _a){

        a = _a;

    }

}


contract Exampe4Creator{

    Example4 e = new Example4(2018);

}

-----------------------------------------------





Comments