[Mastering Ethereum] 컨트랙트 생성하기 실습

ShinboTinBBO·2025년 1월 23일

블록체인

목록 보기
3/4
post-thumbnail

이더리움 Account 종류

Account(계정)는 이더리움의 주소와 개인 키의 조합으로 구성된다.
이더리움 계정을 통해서 잔고를 보유, 트랜잭션을 전송할 수 있다.

계정에는 2가지 유형이 있다.

EOA(Externally Owned Accounts, 외부소유계정)

공개 이더리움 주소와 개인키 조합으로 구성된 지갑 주소
다른 계정과 이더리움을 주고 받을 수 있고, 스마트 컨트랙트에 트랜잭션을 보낼 수 있다.

메타마스크 등 플랫폼에서 만든 계정이 EOA이다.

CA(Contract Accounts, 컨트랙트 계정)

EOA와 달리 개인키가 존재하지 않음.
스마트 컨트랙트에 블록체인을 배포할 때 생성된다.

다른 계정과 이더를 송수신하는 기능을 한다는 점은 EOA와 동일하다.
EOA는 다른 컨트랙트의 호출을 받아서 트랜잭션을 발생시키지만, 스스로 동작하지는 않는다.

스마트 컨트랙트에 접근하기 위한 주소가 곧 CA이다.

컨트랙트 작성하기

이더리움에는 많은 고급 언어가 있는데, 그 중 가장 널리 쓰이는 언어는 '솔리디티'이다.
이를 통해서 Faucet을 제어하는 컨트랙트를 작성해보자.

Testnet ETH 발급 받기기

Sepolia Testnet을 이용하기 위해서 테스트 이더를 발급 받자.

구글 클라우드 Web3에서 자신의 지갑 주소를 입력하면 테스트넷에서 사용하는 Sepolia ETH를 무료로 발급받을 수 있다.


다음과 같은 과정으로 거래가 진행되었음을 Transaction ID를 Sepolia Etherscan에 검색하여 확인할 수 있다.


이는 지갑의 잔고에도 잘 반영되어 있다.

Solidity를 이용해 컨트랙트 작성하기

// Version of Solidity compiler this program was written for
pragma solidity 0.6.4;

// Our first contract is faucet!
contract Faucet {
    //Give out Ether to anyone who asks
    function withdraw(uint withdraw_amount) public {
        // Limit withdrawal amount
        require(withdraw_amount <= 100000000000000000);

        // Send the amount to the address that requested it
        msg.sender.transfer(withdraw_amount);
        // msg : 컨트랙트를 시작한 트랜잭션
        // sender : 트랜잭션의 발신자 주소

    }

    // Accept any incoming amount
    receive () external payable {}
}

작성한 코드는 Mastering Ethereum에서 제공하는 코드와 완전히 동일하다.

이 코드를 통해서 컨트랙트를 블록체인에 생성한다. 이에 따라 생성된 컨트랙트는 EOA와 마찬가지로 이더리움 주소를 갖게 된다.

코드를 컴파일하고 발행하여 확인해보자.
코드를 Remix IDE를 이용하여 컴파일한다. 코드에서 컴파일러의 버전을 0.6.4로 설정해놓았기에 Remix IDE에서도 동일하게 설정을 하면 무리없이 컴파일이 된다.

그리고 이를 'Injected Provider'에 발행되게 설정을 하면, 메타마스크와 연결하여 내 계정를 이용하여 컨트랙트를 실행할 수 있다.

컨트랙트가 블록체인에 생성된 결과는 다음과 같다.

이 Contract 주소를 Etherscan에 검색해보면 다음과 같은 진행 결과를 확인할 수 있다.

그리고 메타마스크에서 이 transaction에 대해서 확인하면 이는 계약(contract)를 배포하는 거래라고 지칭하고 있다.

Etherscan에서 Transaction ID를 검색한 결과는 아래와 같다.

정리해보자면, 작성한 코드를 실행한 결과는, contract account을 생성하는 단계이고, 이 계약의 첫 번째 거래가 바로 0 ETH를 전송한 것이다.

생성된 컨트랙트에 자금 조달하기

현재 내가 갖고 있는 이더는 메타마스크를 생성할 때 만든 EOA 속에 있다.

컨트랙트를 이용한 실습을 계속하기 위해서는 컨트랙트로 이더를 조달해야 한다.

따라서 Remix IDE에서 컨트랙트를 발행하면서 얻게된 컨트랙트의 주소를 복사하여 이곳으로 이더를 보낸다.

이더를 보냄에 따라, 컨트랙트 내에 거래가 추가된 것을 Etherscan에서 확인할 수 있다.

컨트랙트의 잔고가 변했다.

컨트랙트에서 출금하기


Remix IDE에서 보이는 위의 그림과 같은 인터페이스는 우리가 작성한 코드의 함수를 기반으로 등장하는 것이다.

현재 잔고가 대략, 0.049ETH가 있으므로 그 중에서 0.01ETH를 출금해보고자 한다.

이는 101610^{16}웨이이므로 입력창에 그림과 같이 입력했다.


위와 같이 생성한 컨트렉트에서 출금되어 메타마스크의 EOA로 0.01 이더가 이동한 것을 확인할 수 있다.
이때 출금은 withdraw 함수를 이용해서 이전되었기 때문에, internal transaction으로 취급된다.

이를 통해서 탈중앙회된 월드 컴퓨터에서 돈을 통제하는 소프트웨어와 성공적으로 상호작용 했다! 라는 의의가 있다고 한다.

profile
지상 최강의 해적

0개의 댓글