본문으로 건너뛰기

실행 모델

이 페이지는 클레이튼 스마트 컨트랙트의 실행 모델, 데이터 구조, 생명주기에 대해 설명합니다.

실행 모델

Transactions can be generated by platform APIs as described in Platform API Specification. 이러한 트랜잭션은 컨센서스 노드(CN) 로 전송되어 블록에 저장됩니다. CN은 수신된 각 트랜잭션이 유효한지 확인합니다. 유효한 트랜잭션은 트랜잭션 풀에 저장되며, 그렇지 않은 트랜잭션은 폐기됩니다. CN은 트랜잭션 풀에서 현재 블록에 있는 실행 가능한 트랜잭션을 선택하고 하나씩 실행합니다.

트랜잭션을 실행하려면 발신자는 트랜잭션 수수료로 일정 금액의 KLAY를 지불해야 합니다. KLAY의 트랜잭션 수수료는 가스와 승수, 즉 단가를 기준으로 계산됩니다. 가스는 계산의 기본 단위입니다. Klaytn 노드에서 실행되는 모든 작업은 미리 정의된 양의 가스를 소비합니다. The exact amount of KLAY required for the transaction is calculated by the formula illustrated in Transaction Fees. 발신자가 가스 부족과 함께 트랜잭션을 제출하면 트랜잭션이 실패할 수 있습니다. 또한 발신자 계정의 잔액이 부족한 경우에도 트랜잭션이 실패할 수 있습니다.

트랜잭션이 성공적으로 실행되면 해당 트랜잭션은 현재 블록에 포함됩니다. CN은 블록 가스 한도 또는 블록 시간 제한에 도달할 때까지 트랜잭션을 수집합니다. 그런 다음 CN은 트랜잭션으로 블록을 생성합니다. 이 단계에서는 블록의 여러 필드를 채워야 합니다. 예를 들어 트랜잭션, 영수증, 상태 등의 해시값을 계산해야 합니다. 모든 필수 필드가 완료되면 CN은 블록 해시를 생성합니다.

블록 생성이 완료되면 블록은 다른 모든 CN에 전파됩니다. 다른 CN들은 모두 전파된 블록을 검증하고 BFT 합의 알고리즘을 사용하여 검증 결과에 대한 합의에 도달합니다. 대다수의 CN에 의해 검증 프로세스가 성공적으로 완료되면 블록이 블록체인에 저장됩니다. BFT 합의 알고리즘은 즉각적인 완결성 속성을 만족하기 때문에 블록은 최종적이며 절대 제거되지 않습니다. 블록이 확정된 후에는 해당 블록에 포함된 모든 트랜잭션의 실행이 비가역적으로 보장되며, 요청 시 발신자에게 트랜잭션 실행 결과를 반환할 수 있습니다.

트랜잭션 실행 제한

현재 클레이튼의 Baobab과 Cypress 네트워크에는 다음과 같은 트랜잭션 실행 제한이 있습니다:

  • You can set gasPrice of the transaction, but it means it's the most you can pay. The actual gasPrice will be determined by network. For more detailed information, see gas price overview
  • 계산 비용 한도보다 실행 비용이 큰 트랜잭션은 버려집니다. 계산 비용을 참조하세요.

데이터 구조

계정(Account)

클레이튼 블록체인 플랫폼에서 계정은 개인의 잔액이나 스마트 컨트랙트에 대한 정보를 담고 있는 데이터 구조입니다. 클레이튼은 더 나은 DX와 UX를 제공하기 위해 계정 모델을 재설계합니다. 계정 모델에 대한 자세한 정보는 여기에서 확인할 수 있습니다.

트랜잭션(Transaction)

블록체인 플랫폼에서 트랜잭션은 노드 간에 전송되는 메시지로, 블록체인의 상태를 변경합니다. 클레이튼은 트랜잭션 모델도 새롭게 디자인했습니다. 트랜잭션을 목적에 따라 다양한 유형으로 구분하여 성능 최적화의 기회를 찾고, 재설계된 계정 모델을 지원합니다. 트랜잭션 모델에 대한 자세한 정보는 여기에서 확인할 수 있습니다.

상태(State)

클레이튼의 State는 계정 상태의 집합입니다. 이 상태는 동일한 블록을 동일한 순서로 처리한 경우 Klaytn 노드에서 동일해야 합니다. 상태는 트랜잭션이 클레이튼 노드에서 실행될 때 변경됩니다.

아래 표는 주에 저장된 계정 데이터를 보여줍니다.

구성 요소설명
nonce이 계정에서 실행한 트랜잭션의 수를 나타내는 정수 값입니다. 트랜잭션을 제출할 때 트랜잭션의 nonce는 계정의 nonce와 같아야 합니다.
balance이 계정이 현재 보유하고 있는 KLAY의 양을 나타내는 정수 값입니다.
storageRoot계정의 모든 저장소 변수 값을 포함하는 머클 패트리샤 트리의 루트에 대한 256비트 해시입니다.
codeHash계정의 바이트코드 해시입니다. 이 값은 변경할 수 없으므로 스마트 컨트랙트가 생성될 때만 설정됩니다. 계정이 EOA 또는 EA인 경우 이 값은 null의 해시로 설정됩니다.

블록

블록체인은 말 그대로 블록의 체인으로 구성되어 있기 때문에 블록은 Klaytn 블록체인의 중요한 요소입니다. 아래 표는 블록의 구성 요소를 보여줍니다.

구성 요소설명
baseFeePerGas가스당 기본 수수료입니다. 이 값은 해당 블록 번호에 대해 EthTxTypeCompatibleBlock이 활성화된 경우에만 반환됩니다.
blockScore이전 난이도 BFT 합의 엔진에서는 항상 1입니다.
extraData이 블록의 "추가 데이터" 필드입니다.
gasUsed이 블록의 모든 트랜잭션이 사용한 총 가스 사용량입니다.
governanceDataRLP로 인코딩된 거버넌스 구성
logsBloom블록의 로그에 대한 블룸 필터입니다. 보류 중인 블록인 경우 null.
number블록 번호. 보류 중인 블록인 경우 null입니다.
parentHash블록의 부모 블록의 해시입니다.
proposer블록 제안자의 주소입니다.
receiptsRoot블록의 영수증 시도 루트입니다.
reward블록 보상을 받는 주소입니다.
size이 블록의 크기(바이트)를 정수로 표시합니다.
stateRoot블록의 최종 상태 트라이의 루트입니다.
totalBlockScore이 블록까지 체인의 총 블록점수의 정수입니다.
transactionsRoot블록의 트랜잭션 트라이의 루트입니다.
timestamp블록이 콜레이트된 시점의 유닉스 타임스탬프입니다.
timestampFoS블록이 콜레이트된 시점에 대한 타임스탬프의 1초 단위입니다.
transactions트랜잭션 객체의 배열 또는 마지막 매개변수에 따라 32바이트 트랜잭션 해시입니다.
voteData제안자의 RLP 인코딩된 거버넌스 투표

스마트 컨트랙트

스마트 컨트랙트는 클레이튼 블록체인의 특정 주소에 있는 코드 (functions)와 데이터 (state)의 모음으로 구성됩니다. 컨트랙트 계정은 서로 메시지를 전달할 수 있을 뿐만 아니라 사실상 튜링 완전 연산을 수행할 수 있습니다. 컨트랙트는 블록체인에 클레이튼 고유의 바이너리 형식으로 존재합니다. 현재 클레이튼은 이더리움 가상머신 (EVM) 바이트코드 한 가지 바이너리 형식을 지원하지만, 향후 다른 형식도 지원될 예정입니다.

스마트 컨트랙트 만들기

스마트 컨트랙트는 바이너리를 데이터로 빈 주소로 트랜잭션을 전송하여 Klaytn 블록체인에서 생성할 수 있습니다. 바이너리는 다양한 형식이 있을 수 있지만, 현재 클레이튼은 EVM 바이트코드라는 한 가지 바이너리 형식을 지원합니다. 이 트랜잭션은 실행을 위해 지불이 필요하다는 점을 지적할 필요가 있습니다. 트랜잭션이 블록에 저장된 후 트랜잭션 수수료 모델에 따라 발신자 계정의 계정 잔액이 감소합니다. 일정 시간이 지나면 트랜잭션이 블록에 표시되며, 이는 트랜잭션이 수반하는 상태가 합의에 도달했음을 확인합니다. 이 시점에서 스마트 컨트랙트는 이제 클레이튼 블록체인에 존재합니다.

  • Kore 하드포크에서 eip-3541을 가져왔기 때문에 0xEF 바이트로 시작하는 새로운 코드의 배포는 허용되지 않습니다.
  • As eip-3860 is brought at the Shanghai hardfork, deployment of a new code is rejected if the initcode length exceeds 49152 bytes and the length of the new contract code cannot exceed 24576 bytes.
  • SCA overwriting over EOA is enabled after Shanghai hardfork.

스마트 컨트랙트 실행하기

스마트 컨트랙트의 함수는 스마트 컨트랙트에 트랜잭션을 보내거나 노드에서 로컬로 함수를 호출하여 호출하고 실행할 수 있습니다. 트랜잭션을 전송하여 함수를 호출하면 트랜잭션을 처리하여 함수가 실행됩니다. 여기에는 트랜잭션 전송에 대한 KLAY 비용이 수반되며, 호출은 블록체인에 영구적으로 기록됩니다. 이러한 방식으로 호출된 함수의 반환값은 트랜잭션의 해시입니다. 함수가 로컬에서 호출되면 Klaytn 가상머신 (KLVM)에서 로컬로 실행되며, 호출은 함수의 반환값을 반환합니다. 이러한 방식으로 호출된 함수는 블록체인에 기록되지 않으므로 컨트랙트의 내부 상태를 수정할 수 없습니다. 이러한 유형의 호출을 상수 함수 호출이라고 합니다. 이러한 방식으로 호출하면 KLAY 비용이 발생하지 않습니다. 상수 함수 호출은 리턴 값에만 관심이 있을 때 사용해야 하며, 트랜잭션은 컨트랙트 상태에 대한 부작용에 관심이 있을 때 사용해야 합니다.

스마트 컨트랙트 비활성화하기

스마트 컨트랙트는 클레이튼 블록체인에 존재하기 때문에 삭제할 수 없으며 비활성화할 수만 있습니다. 현재 클레이튼은 이더리움에서 스마트 컨트랙트를 비활성화하는 데 사용되는 것과 동일한 프로세스를 클레이튼 스마트 컨트랙트를 비활성화하는 데 채택했습니다. 예를 들어, Solidity에서 selfdestruct(주소 수신자) 호출(또는 KLVM 연산자 코드 SELFDESTRUCT)을 사용하여 KLVM용 Klaytn 스마트 컨트랙트를 비활성화할 수 있습니다. 클레이튼 팀은 다른 실행 환경에서도 스마트 컨트랙트를 비활성화하는 방법을 제공할 예정입니다.

스마트 컨트랙트 업그레이드하기

클레이튼은 기존 블록체인의 불편한 사용자 경험을 해결하기 위해 배포된 스마트 컨트랙트를 업그레이드할 수 있는 방법을 제공할 것입니다. 예를 들어 블록체인에 배포된 서비스는 업그레이드가 어렵습니다. 클레이튼은 서비스 공급자 (SP)가 배포된 서비스를 업그레이드하고 서비스 정보를 마이그레이션할 수 있도록 프레임워크와 스마트 컨트랙트 라이브러리를 제공할 것입니다. 클레이튼은 다음 요구사항을 고려하여 이 기능을 신중하게 제공할 것입니다.

  • 승인된 계정 또는 스마트 컨트랙트 소유자만 스마트 컨트랙트를 업그레이드할 수 있어야 합니다.
  • 업그레이드된 스마트 컨트랙트는 이전 스마트 컨트랙트가 유지 관리하는 기존 데이터를 조작할 수 있어야 합니다.
  • 이전 스마트 컨트랙트를 참조하는 다른 스마트 컨트랙트는 해당 스마트 컨트랙트의 업그레이드된 최신 버전을 사용할지 여부를 결정할 수 있어야 합니다.
Make this page better