728x90

이 글은 인프런 "솔리디티 깨부수기" 3강,4강 강의를 듣고 정리한 글입니다. 

 

[지금 무료] 솔리디티 깨부수기 | D_One - 인프런

D_One | 이 강의를 통해서, 스마트 컨트랙 제작을 위한 솔리디티 언어를 배울수 있습니다., 코딩이 처음인 분들도 OK! 처음 배우는 솔리디티, 쉽게 시작해보세요. 강의 주제 📖 [사진] 이 강의에서

www.inflearn.com



Ether

이더리움의 코인은 ETH 이더라고 한다. 

1 ether = 10^9 Gwei = 10^18 wei 로 1^18 wei 는 1 이더를 나타낸다. 예시를 들면, 100원은 1원이 100 개라고 볼 수 있다. 

 

 0.00000000000000001 ehter = 1^-18 =1 wei 가 되며 예시로 본다, 0.01 ether 를 가졌다고 가정했을때, 10^16wei와 같다. 

 

GWei

Gwei는 주로 가스를 소비했을때, 사용되는 단위로 가스는 스마트 컨트랙을 사용하기 위해서 또는, 이더리움 블록체인과 상호작용하기 위해서는 가스가 필요하다.  

가스비용을 Gwei 단위로 낸다.

 


가스비용 책정

사용하고자 하는 스마트 컨트랙 안에 정의된 코드의 길이에 따라 가스 비용이 책정되며, 길이가 짧을수록 소비되는 가스가 적어진다. 

스마트 컨트랙 안에 무엇으로 정의 되냐에 따라 가스 소비하는 비용이 달라지게 된다. 예를들어, string 이나 modifer를 사용하는경우 가스가 더 많이 들어간다.

 

이더리움에서 제공하는 옐로우 페이퍼에 26페이지를 보면, 어떤 내장기능을 사용하냐에 따라 가스 소비량을 계산할 수 있다. 예를 들어 transaction 함수를 사용하였을 때, 이더를 보내는 함수를 사용했을 때 21,000 가스가 소비된다고 정의된다.

https://ethereum.github.io/yellowpaper/paper.pdf

 

 

솔리니티 안에서 either-way-gway를 지원하여 간단하게 아래와 같이 이더리움 유닛을 이용해 간단하게 작성할 수 있다.

 

위에처럼 코드를 배포할때 가스가 소비된 것을 확인할 수 있다. 이는 이더리움 블록체인과 상호작용을 위하여 무조건 가스를 사용해야한다. 스마트 컨트랙을 쓸때 해당 정보들이 블록체인 네트워크와 연결이되어 가스 비용이 쓰이게 된다.


가스(Gas)

보안적인 측면에서 가스는 DDoS(Distributed Denial of Service) 같은 공격을 방지할 수 있다.

예를 들어, 해커가 고의적으로 스마트 컨트랙을 지속적으로 작동하게 반복시켜 블록체인 네트워크에 과부화를 주어 해커는 작동을 반복시킬때마다 Gas 비용을 지불해야한다는 점에서 비용적인 측면에서 부담이 되기 때문에 공격 방지가 된다.


function 정의

함수의 정의 방법은 다음과 같다.

 

function 이름 () public { // (public, private, internal, external) 변경가능.  
      // 내용
    }

 

public 과 같은 접근제어자를 함수명 뒤에 써주게 된다.  접근제어자는 public, private, internal, external 이 있다.

함수를 정의할 대 3가지 경우의 수가 나오게 되는데 순차적으로 아래에서 다루도록 하겠다. 

 


Parameter 와 Retrun 값이 없는 function 정의

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec4 {
    uint256 public a = 3;
    function changeA() public{
        a =5;
    }
}

위에 예시는 changeA() 함수를 이용하여 변수의 값을 바꾸는 것으로,  a 라는 변수는 3로 정의를 하였지만, changeA()라는 함수를 실행시키시면 가스가 소비되고 a는 5가 바뀌는 것을 확인할 수 있다. 

changeA 함수 실행 전, 실행 후


Parameter는 있고, Retrun 값이 없는 function 정의

function 이름 (받고싶은 타입  변수명 ) public { 
  // 내용
}
ex) 
function 이름 (uint 256 _value) public { 
  // 내용
}

첫번째 예시와 다른 점은 파라미터 있는 함수를 정의할 땨는 type이 어떤 파라미터를 넣을 것인지 알 수 있다, . 

type 은 여러가지를 쓸 수 있으며, byte, string, address 등등이 있다,

 

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec4 {
    uint256 public a = 3;
    function changeA(uint256 _value) public{
        a =_value;
    }
}

위의 예시에서는 uin256 타입의 파라미터를 사용하며, changeA를 실행할때마다, _value의 파라미터 값을 넣어 주어야한다. 이 파라미터는 a에 대입이 되어 값이 변경된다.

 

만약에 2 개 이상의 파라미터가 필요하다면, 아래와 같이 이어 붙이면 된다,

    function changeA(uint256 _value1, uint256 _value2) public{
        a =_value;
    }

 


Parameter는 있고, Retrun 값이 있는 function 정의

function 이름 (받고싶은 타입  변수명 ) public returns(반환하고자 하는 type) {
  // 내용
}
ex) 
function 이름 (uint 256 _value) public returns(uint256) { 
  // 내용
}

 

두번째 경우와 매우 흡사하지만 return 값을 명시줘야 한다. return에는 s를 붙여야 하며 어떤 값을 리턴할 지에 대한 타입을 작성해야한다. 여기서 주의해야 할 점은, 변수명이 없고 타입만 써주시면 된다.

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Lec4 {
    uint256 public a = 3;
    function changeA(uint256 _value) public returns(uint256){
        a =_value;
        return a;
    }
}

위의 예시는  returns(uint256)이 있으니, uint256 타입으로 반환한다라는 뜻이 된다.  써주신다면, changeA 함수가 실행될때, 

_value의 파라미터 값을 받고, a 변수에 _value 파라미터가 대입된 후에 a 값이 리턴된다.

 

 

+ Recent posts