스마트 컨트랙트(Smart Contract) : 특정 계약을 스스로 수립, 검증, 이행 하기 위한 컴퓨터 프로토콜
스마트 컨트랙트 in ethereum :
evm계열 account의 상태를 변경 할 수 있는 프로그램 코드.
이더리움 P2P 네트워크 상에 배포되어 블록체인 내에 상태정보로 존재 및 evm에서 작동되어 상태변이를 유발.
새로운 스마트 컨트렉트 생성, 컨트렉트 함수 실행, 이더 전송 중 하나로 실행되며 이 실행은 user account에서 발생된
트랜젝션이나 다른 컨트랙트에 의해서만 실행된다.
이더리움에서는 무한반복 같은 악의전인 코드를 막고 데이터 무결성을 지키기 위해 트랜잭션 실행시 비용을 지급해야한다.
이 비용은 "가스"라고 하며 서명비용과 트랜잭션 저장을 위한 스토리지 비용, 네트워크 대역폭 비용이 포함된다.
gasFee = gasLimit * gasPrice (Legacy)
컨트랙트 간의 호출은 메시지라는 구조체를 사용하여 호출.
메시지는 Contract account에 의해서만 호출되며 함수 호출 시 다른 컨트랙트에게 전달된다.
메시지는 가상객체이기에 별도로 저장할 필요가 없으며 EVM내에서만 존재한다.
message : {
to : address,
from : address,
nonce,
amount,
data,
checkNonce
}
여기서 ABI는 컨트랙트의 바이트 코드에 접근하여 컨트랙트에 존재하는 함수들을 ABI를 통해 Decode(?)하여 사용할 수 있게 해주는 JSON파일이다.
const Contract = new web3.Contact(contractAddress, contract.Abi);
Contract.sampleFunction();
이더리움 스마트 컨트랙트의 바이트 코드를 실행하는 32byte stack 기반의 실행환경
최대 1024byte.
솔리티티 (or JS) -> Contract byte Code -> EVM -> OP Code
EVM은 OP코드의 프로그램 카운터를 0부터 하나씩 증가시키면서 반복적으로 연산을 수행한다. 이때 실행할때 마다 가스비를 소비하게 되는데, 가스부족, 잘못된 명령어, OverFlow 등의 예외상황의 경우 실행이 중단되고 상태변화 내용은 취소된다.
<Tip>
수행해야할 연산이 많은 경우 많은 가스비를 요구하게 되는데 단순전송과 스왑의 가스비는 아래와 같다.
swapTransaction.gas = 0.06ETH;
sendTransaction.gas = 0.002ETH;