[멋쟁이 사자처럼 블록체인 스쿨 3기] 23-05-03

임형석·2023년 5월 3일
0

Solidity


Ethereum EVM

솔리디티에는 특정한 타입을 지정해주는데 문자형, 바이트형은 데이터 위치도 함께 선언해주어야 한다.

그건 이더리움 EVM 특징이라고 한다.

이더리움 가상머신(EVM)이란?
이더리움이 스마트 계약 (스마트 컨트랙트)이라는 프로그램을 실행할 수 있는 플랫폼으로 기능할 수 있는 가장 핵심적인 이유는 ‘EVM(Ethereum Virtual Machine, 이더리움 가상머신)’이라는 가상의 컴퓨터가 있기 때문입니다.

EVM은 스마트 컨트랙트를 처리 (배포, 실행) 하기 위한 이더리움 가상 머신이며 Turing complete state machine 이라고 불립니다.EVM은 이더리움이 정의한 규칙에 따라 스마트 계약 코드를 실행하고, 그 결과로 변화된 상태를 업데이트하는 작업을 수행해 줍니다. 또한 EVM은 위와 같은 과정에서 코드 실행이 성공적으로 완료됐을 때만 상태를 변경하여 스마트 계약이 직접적으로 블록체인에 영향을 미치지 않도록 보호하는 샌드박스(보호 영역)와 같이 역할을 합니다.

라고 설명하고 있다. 더욱 자세한 내용은 아래 URL 링크에서 확인할 수 있는데..

Ethereum EVM

위의 PDF 문서를 보면 조금은 이해할 수 있다...


String Type

    uint a; // 숫자형 변수 a 선언
    string b; // 문자형 변수 b 선언

문자열 변수 선언은 string 을 이용한다.

아래와 같다.

    function setB(string _b) public {
        b = _b;
    }

그런데 정수형과는 다르게, string 을 선언해도 경고창이 뜬다.

정수형은 처리하기 간단하지만, 문자형은

데이터 위치가 "메모리" 이거나, "콜 데이터" 이어야 한다고 나와있다.

그래서 문자열 지역변수 선언에는 메모리나 콜 데이터를 같이 선언해준다.

    function setB(string memory _b) public {
        b = _b;
    }

문자열의 데이터 위치는 storage, memory, call data 3가지 이다.

storage 는 블록체인에 저장하는것. >> 가스비가 많이 듦.

memory 는 원본을 가져와서 복사해서 사용. >> 가스비가 비교적 많이 듦.

call data 는 원본을 가져와서 연산에만 사용. >> 가스비가 비교적 적게 듦.

그래서 코드 작성 시, 메모리 혹은 콜 데이터 두개로 최대한 가스비가 적게 들도록 작성하는 것이 중요.


Bytes Type

바이트 타입도 문자형식과 비슷하다. 메모리나 콜 데이터를 함께 선언해주어야 한다.

    function setA3(string memory _a) public {
        a = bytes(_a);
    }

하지만 위의 코드에 정수를 넣고 그대로 실행한다면, 아래의 오류 메시지를 보게된다.

transact to BYTES.setA errored: Error encoding arguments: Error: invalid arrayify value (argument="value", value="11", code=INVALID_ARGUMENT, version=bytes/5.5.0)

정수를 읽을 수 없다는 것인데. 0x 로 시작하는 정수를 넣는다면 코드가 정상적으로 실행된다.

0x 는 16진수임을 정의한다고 볼 수 있겠다.

그대로 실행한다면..

bytes: 0x30783132

문자형식을 input | 바이트로 output 하므로 위처럼 복잡한 숫자로 나온다.

아래 코드와 같이 바이트로 input 과 output 을 동시에 한다면, 같은값이 나온다.

    function setA(bytes memory _a) public {
        a = _a;
    }

0개의 댓글