ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 나만보는 Blockchain 개념 (2) 스마트 컨트랙트
    카테고리 없음 2021. 7. 26. 21:56

    오늘의 주제

    1. 스마트 컨트랙트

    2. 스마트 컨트랙 Testnet에 배포하기(실습)

     

     

    1. 스마트 컨트랙트

    이더리움의 강력한 기능 중 하나이며, 다른 암호화페와 차별화 되는 특징이다.

    한줄 개념은 아래와 같다.

    계약 내용을 코드로 구현하고, 특정 조건이 충족되었을 때 해당 계약이 자동으로 이행하게 하는 Scrpit.

     

    스마트 컨트랙의 동작과정은 다음과 같다.

    • 내용을 Solidity 등으로 구현한다.
    • Solidity 코드를 컴파일 하여 네트워크에 배포할 수 있는 Bytecode를 생성한다.
    • Transaction에 Bytecode를 담고, 마이너가 해당 Transaction이 담긴 블록을 채굴하고, Blockchain Network에 기록된다.
    • 유저는 ABI를 통해 배포된 함수를 호출하는 Bytecode를 생성하고, Transaction에 담아 블록체인 네트워크에 전달된다.
    • 채굴자는 유저로부터 받은 Bytecode를 배포된 스마트 컨트랙트 코드에 따라 EVM(Ethereum Virtual Machine) 위에서 실행한다. 이때, Gas Fee가 계산되면서 블록에 추가되고, 실행 결과가 유효한 경우 실행 결과가 State에 반영된다.
    Tx {
    to
    value
    gas
    data ← 이 부분에 Smart contracts가 담긴다 

     

    다음 스마트 컨트랙에 적힌 계약과 내용값은 어디에 저장되느냐 하면, Contract Account의 Storage라 불리는 저장소에 저장된다. Key-Value의 맵 구조로 32바이트 키를 32바이트 값으로 맵핑하도록 되어있다.

    EVM Storage에는 약 2의 256에 해당하는 메모리 슬롯이 존재한다. 슬롯 하나의 크기는 256 비트 = 32 바이트 이다.

     

    2. 스마트 컨트랙 Testnet에 배포하기(실습)

    ①remix.ethereum.org에 들어간다.

     

    ②메타 마스크랑 연결해준다. 

    - 계정 옵션에 들어가 remix.ethereum과 연결시켜준다. 

    ③remix에 새로운 파일 first.sol를 만들고, 왼쪽 네비바에 이더리움 아이콘을 클릭한 뒤 ENVIRONMENT에 Injected Web3 옵션을 선택한다.

    ④first.sol에 간단한 예제 코드를 작성한다.

    pragma solidity 0.8.4;
    
    contract FirstContract {
        string name = "vitalik" ;
        
        function getName() public view returns (string memory) {
            return name;
        }
    }

    ⑤CONTRACT에 작성한 계약이 뜨면, Deploy 버튼을 눌러 배포한다. 메타마스크에서 적당한 수수료를 책정해준다. 

    Deploy를 누르면 메타마스크에 내가 작성한 계약이 16진수 데이터로 뜬다.

     

    ⑥배포 완료후 배포된 컨트랙트 주소를 눌러 확인한다.

    배포가 완료하면 컨트랙트 주소가 생성되고,

    클릭하면 간략한 정보가 나온다.

    현재 getName을 통해 vitalik을 조회하도록

    계약 내용을 작성했으므로 getName을 클릭하면

    아래 vitalik이 뜨는 것을 볼 수 있다.

     

     

     

     

     

     

     

     

     

     

    ● SetName 함수 추가하기

     

    스마트 컨트랙에서 view를 통한 조회는 트랜잭션이 아니나 생성을 하는 경우는 새로운 트랜잭션이 발생한다.

    이번에는 setName() 함수를 통해 vitalik을 다른 이름으로 바꿔볼 것이다.

    아래와 같이 함수를 추가하고 새로 배포한다. 

    pragma solidity 0.8.4;
    
    contract FirstContract {
        string name = "vitalik" ;
        
        function getName() public view returns (string memory) {
            return name;
        }
        
        //이름을 바꿔주는 함수 추가
        function setName(string memory _name) public {
            name = _name;
        }
    }​

     

    setName버튼이 추가되었다. 새로운 이름을 입력하고, 아래 getName을 눌러 확인하면 vitalik에서 Thor로 이름이 바뀐 것을 확인할 수 있다. 

     

    댓글

Designed by Tistory.