본문 바로가기

BlockChain/Ethereum

CA(계약 계정)는 Instance인가? [ 스마트 컨트랙트 ]

 

 이제 이더리움 키, 주소는 대강 알겠는데, ( 내가 제대로 아는거 맞겠지..? )

 

이더리움 계정의 계약 계정(CA)는 스마트 계약이 블록체인에 배포될 때 생성된다

 

이 구절을 보고 의문이 생겼다

배포될 때 생성되고 쓰여지면,

계약 계정은 스마트 컨트랙트에 적힌 코드가 실행되면서 만들어지는 스마트 컨트랙트 내부 코드의 Instance인건가??

계약 계정은 어디서 어떻게 생성되서 쓰이는걸까??

 

ㅎㅎ 아직 스마트 컨트랙트에 대한 이해가... 부족하다 ㅠㅠ

때문에 오늘은 스마트 컨트랙트와 계약 계정에 대해 공부를 해보쟈ㅑㅑ

 

먼저,

계약 계정의 주요기능을 살펴보면,

  1. 다른 계정과 이더를 송수신하고(EOA와 동일)

  2. 관련된 코드를 담고(EOA와 다름)

  3. EOA나 다른 컨트랙트의 호출을 받아 트랜잭션을 발생시킴


이렇게 3가지이다

 

그리고,

EOA(외부 소유 계정)와 달리,

** 컨트랙트 계정(계약 계정)에는 상응하는 개인키가 없다ㅏㅏ **

 

아직도 이해가 안간다...!

개인키도 없이 어떻게 생성되는걸까?

일단 CA에 대해서 더 알아보자ㅏㅏ

 

(폭풍검색)

 

검색 결과를 종합해보자면,

사람 뿐만 아니라, 스마트 계약도 내부적으로 이더리움 계정을 가진다ㅏㅏ

이를 바로 계약 계정이라고 한다!! ( 아하!! )

스마트 계약은 계약 계정을 통해 이더를 거래하는데, ( 계약 계정을 스마트 계약에 붙은 고유 ID라 생각하면 쉽다! )

 

예를 들어,

A계정이 B계정에 이더를 거래할 때를 생각해보자ㅏㅏ

우리는 이렇게 생각할 것이다

A계정 --- 10 이더 송금 ---> B계정

 

하지만,

스마트 계약을 통해 거래하는 이더의 이동은 사실 이렇다

 

1. A계정(== A의 EOA) --- 10 이더 송금 ---> 이용하는 스마트 계약의 CA(계약계정)

( 이용하는 스마트 계약 속에 잠시 10 이더가 존재하는 것! )

2. 이용하는 스마트 계약의 CA ---> B계정(== B의 EOA)

 

이렇게, CA(계약 계정)의 쓰임새와 EOA(외부 소유 계정)와의 차이점을 확실히 알았다!!

 

하지만,

CA(계약 계정 또는 주소)가

스마트 컨트랙트에서 만들어진 Instance가 맞는지 아닌지는 여전히 모르겠당..

 

때문에,

이번엔 CA의 생성과정을 들여다보자ㅏㅏ

 

CA는 스마트 계약이 배포되는 시점에 만들어지기 때문에,

먼저, 스마트 컨트랙트 코딩이 필요하다!

 

1. 스마트 컨트랙트 만들기

pragma solidity ^0.4.8;     // (1) 버전 프라그마

// (2) 계약 선언
contract HelloWorld {
  // (3) 상태 변수 선언 ( 전역변수 )
  string public greeting;
  // (4) 생성자
  function HelloWorld(string _greeting) {
    greeting = _greeting;
  }
  // (5) 메서드 선언
  function setGreeting(string _greeting) {
    greeting = _greeting;
  }
  function say() constant returns (string) {
    return greeting;
  }
}

 

2. 소스 코드 컴파일

위의 컨트랙트 파일을 Remix IDE에 들어가서 컴파일 해주면,

정신없는 숫자 모음의 EVM 바이트 코드가 생성된다

더불어, ABI(스마트 컨트랙트에서 사용될 인터페이스 부분 )도 자동으로 얻어진다

( geth를 사용한다면 ABI와 바이트 코드를 일일이 생성해야 한다고 한다..! Remix 쓰세욥 )

 

+++ ABI 란?

더보기

응용프로그램 이진 인터페이스로,

흔히 쓰는 API와 비교해보면, 차이점으로 그 특징을 알 수 있다

  • API

    런타임 호환성을 보장하지 않고,

    코드 레벨에서 다른 소프트웨어와 통신하는 인터페이스를 정의

 

  • ABI

    API와 특정 CPU 아키텍처의 기계 언어를 정의

    특정 아키텍처에서 두 개 이상의 소프트웨어 간 하위 수준 이진 인터페이스를 정의
    ( 운영체제와 앱, 앱과 라이브러리간 상호작용을 위해 ABI 사용 )

    런타임 호환성이 보장되기 때문에,

    API 처럼 업데이트에 따른 호환성 걱정없이 구버전 작성 코드를 컴파일 할 수 있음

 

3. 스마트 컨트랙트 배포


마찬가지로,

위에서 컴파일 된 코드( 컨트랙트 객체 )를 Remix IDE에서 배포해주면,

우리의 스마트 컨트랙트가 블록에 추가되어 채굴되면서,

아래와 같이 ( 고대하고 고대하던 ) 컨트랙트 주소가 생성된다!!!!

  // address부분이 우리의 스마트 계약의 CA = 계약 주소(계정)이다!
  address: "0x6f9c338bb987f1baf619697784c9457b9afa119c",
  transactionHash: "0x99ddfd763478ce7a0d328fbc67f3c10fec377efa18a8e9c41f61321feb836cd1",
  allEvents: function(),
  greeting: function(),
  say: function(),
  setGreeting: function()

 

오호..!

그럼 CA는 스마트 컨트랙트의 Instance가 아닌거구나!

의문 종결!!


스마트 컨트랙트 = 스마트 계약

EOA : 외부 소유 계정

CA : 계약 계정

geth : 이더리움재단(Ethereum Foundation)이 제공하는 공식 클라이언트 소프트웨어로써, Go언어로 개발

 

출처 :

https://programmers.co.kr/learn/courses/36/lessons/10630#fn1

 

이더리움 솔리디티 실습 튜토리얼 - 이더리움 송금하기 1

⚠️이 강의에서 다루는 Solidity는 최신 버전이 아닙니다. 이용에 참고해주세요. (현재 Solidity 0.4.24 사용 중) --- 솔리디티(Solidity) 기반의 탈중앙화 애플리케이션(dApp)을 구현하는 온라인 실습 튜토

programmers.co.kr

 

https://hersheythings.xyz/entry/ethtereumstructure

 

이더리움은 어떻게 동작할까?

먼저, 블록체인(Not 이더리움)을 한 문장으로 정의하자면 아래와 같습니다. “암호학적으로 안전하고, 모두에게 공유되는 상태값을 가지며 상태의 전환이 가능한 싱글톤 머신” 상기의 문장을

HERSHEYTHINGS.XYZ

 

https://hucet.tistory.com/46

 

ABI 란?

ABI 를 이해하기 가장 좋은 예는 API 와 비교하는 것이다. Stackoverflow 에서 잘 설명된 답변을 찾아볼 수 있었다. API (Application Programming Interface) API는 코드 레벨에서 다른 소프트웨어와 통신하는..

hucet.tistory.com

 

https://medium.com/day34/erc20-%ED%86%A0%ED%81%B0-%EC%8B%A4%EC%8A%B5-aebfb30ccd00

 

ERC20 토큰 실습

우선 패캠에서 많은 컨트랙트를 만드는 실습을 진행하였습니다. 일반적인 컨트랙트를 만드는 과정과 delegatecall을 써서 업그레이드 가능한 컨트랙트를 만드는 방법등 다양한 시도를 해보았고 크

medium.com