우선 Smart Contract에 대해 알아야 한다.
Smart Contract는 DApp(Decentralized App) 개발자가
개발한 서비스 Logic을 네트워크에 등록하는 것이다.
네트워크에 등록을 하게 되면, Contract Account가 생성된다.
일반 사용자는 Contract를 실행하거나 호출하면 State를 변경하거나 조회한다.
사용자가 변경한 State는 블록체인 상에 등록된 Contract Logic과 State에 따라
위변조 없이 동작함을 보장한다.
Turing complete한 시스템이다. (일반적인 반복문 if문 등 사용)

DApp 개발자가 Smart Contract를 만들어서 이더리움 네트워크에 등록하면,
유저는 그 서비스를 이용한다.
Smart Contract는 기존의 logic에 따라
새로운 상태값을 네트워크 상에서 업데이트 하고,
사용자가 조회를 요청하는 경우에는
이더리움 네트워크에 저장돼있는 이전 상태값을 보여줌.
이해는 됐지만 어디다가 쓰는지 궁금했다.
->대표적으로 토큰, 크라우드 펀딩, 분산형 거래소 등이 있다.
하지만 어떤 언어로 개발을 해야 하나?
솔리디티로 대부분 개발을 진행하는데
이는 Storage에 저장될 중요한 데이터와 이를 처리하는 함수로 구성돼있다.
Solidity를 그대로 올리게 되면 컴퓨터는 인식을 할 수 없다.
그래서 컴파일이 필요하다.
그러면 3개의 데이터를 얻을 수 있다.
배포는 매우 간단하다.
From에는 본인의 주소를, To에는 00000으로 지정을 한다.
그리고 Input Code란에 받은 Bytecode를 넣고, 네트워크에 전송을 하면
EVM이 Bytecode와 To 주소에 공란임을 보고
데이터가 컨트랙트 생성 요청임을 인지한다.
새로운 컨트랙트 주소를 생성 후 Bytecode를 해시한 값을
Account State 중 codeHash에 넣는다.
네트워크에 배포된 Contract에 접근하기 위해서 필요한 것은 두 가지다.
Contract Address & ABI다.
이를 통해 DApp상에서 Smart Contract 코드 상의 함수를 호출할 수 있다.

유저가 Contract를 호출할 때 2가지 방식이 적용된다.

Contract간의 호출은 Internal Transaction이기 때문에
블록체인 상에 기록되지 않는다.
Trace_block을 통해 조회가 가능하다.
가장 먼저 호출한 DApp 사용자의 Tx는 블록체인에 기록된다.
컨트랙트 끼리는 delegatecall,static call,all,transfer등의
함수가 이용된다.
Upgradable(Proxy)의 기본이 개념이 된다.
출처)) 자료 및 내용 : 패스트캠퍼스