이제 이더리움 키, 주소는 대강 알겠는데, ( 내가 제대로 아는거 맞겠지..? )
이더리움 계정의 계약 계정(CA)는 스마트 계약이 블록체인에 배포될 때 생성된다
이 구절을 보고 의문이 생겼다
배포될 때 생성되고 쓰여지면,
계약 계정은 스마트 컨트랙트에 적힌 코드가 실행되면서 만들어지는 스마트 컨트랙트 내부 코드의 Instance인건가??
계약 계정은 어디서 어떻게 생성되서 쓰이는걸까??
ㅎㅎ 아직 스마트 컨트랙트에 대한 이해가... 부족하다 ㅠㅠ
때문에 오늘은 스마트 컨트랙트와 계약 계정에 대해 공부를 해보쟈ㅑㅑ
먼저,
계약 계정의 주요기능을 살펴보면,
- 다른 계정과 이더를 송수신하고(EOA와 동일)
- 관련된 코드를 담고(EOA와 다름)
- 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
https://hersheythings.xyz/entry/ethtereumstructure
https://medium.com/day34/erc20-%ED%86%A0%ED%81%B0-%EC%8B%A4%EC%8A%B5-aebfb30ccd00
'BlockChain > Ethereum' 카테고리의 다른 글
이더리움 주소, 키, 계정의 구성과 역할 이해하기 (0) | 2021.05.31 |
---|---|
Ethereum(이더리움) 투표 dApp 개발 2 (0) | 2021.05.31 |
Ethereum(이더리움) 투표 dApp 개발 1 (0) | 2021.05.31 |
이더리움- dApp 개발환경 구축하기 [Windows] (0) | 2021.05.31 |
이더리움 기반 ERC-20 규격의 토큰 만들어보기 2 (2) | 2021.05.31 |