ABOUT ME

-

Today
-
Total
-
  • NFT 블록체인 마켓 앱 만들기 🔥 Smat Contract & Solidity
    Study/Blockchain 2022. 3. 14. 18:40
    반응형


    # 스마트 컨트랙트 (Smat Contract)

    스마트 컨트랙트는 중개자 없이 P2P로 쉽고 편리하게 계약을 체결하고 실행하는 기능이다.
    그리고 블록체인의 분산원장기술의 특성을 이용하여 다양한 형태의 계약을

    이해 당사자 간의 공유 네트워크를 통해 계약에 대한 신뢰를 바탕으로 자동화된 계약 처리 기술이다.

    기존 계약은 실제 사람이 계약서 문서를 보고 실행해야 해서  처리 시간이 오래 걸릴 수도 있고 문제가 발생할 수도 있다. 
    하지만 스마트컨트랙트는 컴퓨터 명령어로 계약을 작성하기 때문에 특정 조건이 충족되는 즉시 바로 계약을 시행한다.

    또한 오픈된 코드 자체가 신뢰를 보장하는 자동화된 계약이라고 할 수 있다.


    account 에는 2가지 종류가 있는데, 스마트 컨트랙트 account와 개인키 기반 account 가 있다.

    개인키 기반 account는 address, balance 만 가진 반면, 스마트 컨트랙트 account는 address, balance, code를 가지고 있다.

     

    블록체인은 world computer와 같다. 누구나 볼 수 있고 누구나 코드에 정의된 기준으로 사용 가능하기 때문이다.

    transaction hash 값을 통해 스마트 컨트랙트 및 트랜잭션 내용을 모두 확인할 수 있다.

    transaction은 블록체인에서의 모든 거래를 뜻하는데, 돈을 보내거나 스마트 컨트랙트 코드를 실행하는 것을 의미한다.

    컨트랙트를 실행할 때는 수수료가 드는데 수수료는 gas * gas price 로 계산할 수 있다.

     

    # 스마트 컨트랙트가 왜 필요할까?

    스마트 컨트랙트의 특징은 다음과 같다.

    1) 누구나 컨트랙트를 배포할 수 있다.
    2) 컨트랙트의 소유자가 아니더라도 누구든지 검증할 수 있다.
    3) 코드의 실행을 자동화할 수 있다.
    4) 위변조가 어렵다.

    그러므로 스마트 컨트랙트는 거래 내역이 투명하게 공개되어야 하고, 중개인 비용을 절감해야 하거나 거래 수수료 비용을 감소해야 하는 곳에 사용되는 것이 가장 적합하다.

     

    # 솔리디티 (Solidity)

    솔리디티(Solidity)는 이더리움 등 블록체인 플랫폼에서 스마트 컨트랙트 작성과 구현에 사용되는 계약 지향 프로그래밍 언어이다. 개발자는 솔리디티를 통해서 스스로 실행되는 비즈니스 로직을 스마트 컨트랙트에 담아서 구현할 수 있다. 솔리디티를 통해 다양한 앱을 구현할 수 있지만 블록체인 특성상 스마트 컨트랙트가 블록체인에 한번 올라가면 수정할 수 없으며 누구나 확인할 수 있기 때문에 신중하게 작성을 해야 한다.

     

    스마트 컨트랙트 코드는 대부분 솔리디티로 작성되고 작성한 코드를 컴파일한 후 ABI를 통해 일련의 바이트들을 블록체인에 삽입하면
    EVM이 스마트 컨트랙트를 처리하며 이더리움 블록체인의 노드들이 동작시키며 계약을 이행한다.
    솔리디티는 코딩된 규칙에 따라 상태를 변환시키며 현실에서의 계약을 자동으로 실행하고, 소유권에 대한 임의의 규칙, 트랜잭션 형식 등을 생성할 수 있다.

     

    스마트 컨트랙트와의 상호작용을 위해 ABI와 함께 대표적으로 Web3.js라는 라이브러리가 제공되는데, 스마트 컨트랙트에서 제공하는 함수들을 웹 브라우저에서 이용할 수 있도록 도움을 준다. Klaytn 네트워크와 상호작용할 때는 caver-js라는 라이브러리를 사용하면 된다.

     

    # 솔리디티 예제

    // 솔리디티 언어 버전을 명시해줘야 컴파일러가 알맞게 컴파일할 수 있음
    pragma solidity >=0.4.24 <=0.5.6;
    
    contract Practice {
        // Practice 라는 이름의 컨트랙트로 블록체인에 배포. 모든 코드는 이 컨트랙트 안에서 실행
    
        uint256 private totalSupply = 10; 
        //uint256:숫자, private: 블록체인에서 바로 볼수 없음
    
        string public name = "xiubin"; 
        //string:문자, public 블록체인에서 볼 수 있음
    
        address public owner;
        // contract deployer
    
        mapping (uint256 => string) public tokenURIs;
        //mapping : key와 value를 가진 것, key로 uint256형 숫자를 넣으면 value인 문자열을 얻겠다는 것
    
        constructor () public { 
            //constructor: 스마트컨트랙트가 최초로 배포되자마자 실행되는 것
            owner = msg.sender;
            //스마트컨트랙트 실행한 사람(address)을 owner라는 변수에 넣음
        }
        
        function getTotalSupply() public view returns (uint256) { 
            //view: 보기 전용, returns: 값을 리턴
            return totalSupply + 10000;
        }
        
        function setTotalSupply(uint256 newSupply) public { 
            //데이터를 변경하거나 할때는 returns 필요없음
            
            require(owner == msg.sender, 'Not Owner');
            // 특정 조건을 만족하면 다음 코드를 실행하고, 그렇지 않다면 트랜잭션을 실패시키고 에러메세지를 보여줌
            // owner가 컨트랙트를 실행한 사람과 일치한다면 코드 실행
            totalSupply = newSupply;
        }
        
        function setTokenUri(uint256 id, string memory uri) public {
            //memory: 문자열 같이 복잡한 데이터를 다룰 때 삽입
            tokenURIs[id] = uri;
        }
            
    }

     

    솔리디티 언어도 다른 언어들과 비슷한 점이 많지만, 그중 특징이라고 할만한 것은 pragma 키워드를 꼭 명시해줘야 한다는 점과 Contract 이름을 명시하고 그 이름대로 배포된다는 것이다. 자세한 이론은 솔리디티 공식 문서를 참고하면 좋을 것 같고, 위 예제 코드와 주석만 봐도 대략적으로 이해할 수 있을 것이다.

    솔리디티에서 값을 읽는 것은 수수료가 필요 없지만 값을 바꾸는 행위는 수수료가 필요하고 트랜잭션이 발생한다.

     

     

     

    참고 자료

    http://wiki.hash.kr/index.php/%EC%86%94%EB%A6%AC%EB%94%94%ED%8B%B0

    https://medium.com/haechi-audit-kr/smart-contract-a-to-z-79ebc04d6c86

    https://solidity-kr.readthedocs.io/ko/latest/

     

     

     NFT 블록체인 마켓 앱 만들기 with 그라운드X 시리즈 

    1. 블록체인이란?

    2. 클레이튼이란?

    3. NFT란?

    4. Smat Contract & Solidity

    5. Klaytn 개발환경 세팅

    6. BApp 설계

    7. BApp 기능 구현 

     

     

    반응형

    댓글