관리 메뉴

평행우주 : world 1

[블록체인이론] 컨트랙트 계정 및 외부 소유 계정(EOA) 본문

텃밭 1 : BlockChain/이론

[블록체인이론] 컨트랙트 계정 및 외부 소유 계정(EOA)

parallelworlds 2022. 3. 12. 22:42

외부 소유 계정(EOA) 및 컨트랙트

외부 소유 계정(EOA)

메타마스크 지갑에서 생성한 계정의 유형

개인키가 있는 계정

개인키를 갖는다는 건, 자금 또는 컨트랙트에 대한 접근을 제어한다는 뜻


 

컨트랙트 (계정)

이더리움 컨트랙트는 EVM이라고 하는 가상 시스템에서 실행되는 돈을 제어하는 프로그램이다

단순한 EOA가 가질 수 없는 스마트 컨트랙트 코드가 있다

컨트랙트 계정은 개인키가 없다

대신, 컨트랙트 계정은 스마트 컨트랙트 코드의 로직으로 제어한다

EOA와 마찬가지로 주소가 있고, 이더를 주고받을 수 있다

트랜잭션 목적지가 컨트랙트 주소일 때 트랜잭션과 트랜잭션 데이터를 입력으로 사용하여, 컨트랙트가 EVM에서 실행된다

이더 외에도 트랜잭션에는 실행할 컨트랙트 특정 함수와 해당 함수에 전달할 파라미터를 나타내는 데이터가 포함될 수 있다

이렇게해서 트랜잭션은 컨트랙트 내의 함수를 호출할 수 있다

 

컨트랙트 계정은 개인키가 없으므로 트랜잭션을 시작할 수 없다

EOA만 트랜잭션을 시작할 수 있지만, 

컨트랙트는 복잡한 실행 경로를 구축하여 다른 컨트랙트를 호출해서 컨트랙트에 반응할 수 있다

(이것을 사용하는 전형적인 방식은 다중 서명 스마트 트랜잭션 지갑에 지급요청 트랜잭션을 전송하여 일부 이더를 다른 주소로 보내는 것. 일반적인 댑 프로그래밍 패턴은 컨트랙트 A가 컨트랙트B를 호출하게 하는 것인데, 이렇게 하면 컨트랙트 A 사용자들 간에 공유된 상태를 유지할 수 있게 된다)

 

+)

한 컨트랙트에는 하나의 스토리지가 생기는데 다른 컨트랙트를 캐스팅해서 함수를 실행시키면, 두 개의 컨트랙트가 하나의 스토리지를 공유하는 것처럼 쓸 수 있어서 공유된 상태라고 쓴 게 아닐까?

+)

https://solidity-by-example.org/app/multi-sig-wallet/

 

컨트랙트는 블록체인에 바이트 코드를 등록하는 특별한 트랜잭션에 의해 생성

컨트랙트가 블록체인에서 생성되면 지갑과 마찬가지로 이더리움 주소를 갖게 된다

누군가 컨트랙트 주소로 트랜잭션을 보낼 때마다 그 트랜잭션을 입력값으로 하여 컨트랙트가 EVM에서 실행된다

컨트랙트 주소로 보내지는 트랜잭션에는 이더, 데이터 또는 둘 다를 포함할 수 있다

트랜잭션이 이더를 포함하면, 이는 컨트랙트 잔액에 '예치된다'

데이터가 포함되어 있으면 데이터에서는 컨트랙트에서 명명된 함수를 지정하고 호출하여 함수에 인수를 전달할 수 있다.

 

 

EOA는 어떤 코드도 가지고 있지 않기 때문에

이 계정에서 메시지를 보내기 위해서는 새로운 트랜잭션을 만들고 서명해야 한다

CA는 이러한 메시지를 받을 때마다 자신의 코드를 활성화 시키고

이 활성화된 코드에 따라 메시지를 읽거나 내부 저장공간에 기록하고 다른 메시지들을 보내거나 컨트랙트를 생성한다

CA는 컨트랙트를 생성할 수 없고 EOA가 만든 컨트랙트만 실행하는 구조

 

 

예시)
메타마스크 지갑에서 withdraw_amount 인수 0.1이더를 사용하여 withdraw 함수를 호출하는 데이터 명형어가 포함된 트랜잭션을 보낸 경우,

 

이 트랜잭션으로 컨트랙트가 EVM내부에서 실행된다

EVM이 컨트랙트의 withdraw 함수를 실행함에 따라 먼저 require함수를 호출하고

우리 금액이 0.1이더의 최대 허용 출금보다 작거나 같음을 확인한다

그 다음 transfer 함수를 호출해 이더를 보낸다

transfer 함수를 실행하면 내부 트랜잭션이 생성되어 0.1이더가 컨트랙트 잔액에서 우리 지갑 잔액으로 들어온다

 

 

 

+) 스마트 컨트랙트 코드

컨트랙트 계정 생성 시 이더리움 블록체인에 기록되고 EVM에 의해 실행되는 소프트웨어 프로그램

Comments