현재 미디엄 대신 개인 블로그 운영중입니다 더많은 블록체인 개발정보를 얻으실 수 있습니다.
=> 블록체인 개인블로그
비트코인에서는 스크립트라고 불리는 단순한 실행 프로그램을 지원하였습니다. 사토시 나카모토는 비트코인 설계 시 금융거래의 목적에만 부합하도록 만들었기 때문에 스크립트만으로도 블록체인 역할 기능을 하였습니다.
블록체인 2.0이라고 불리는 이더리움은 1994년 닉사보의 최초의 스마트컨트랙트를 발전시켜 이를 금융거래, 경제, 인증 등 다양한 분야에서 적용하는 블록체인 플랫폼을 만들게 되었습니다.
- 스마트컨트랙트
스마트컨트랙트의 사전정의는 특정 계약을 스스로 수립, 검증, 이행하기 위한 컴퓨터 프로토콜이라고 적혀있습니다. 즉 이더리움에서 스마트컨트랙트는 계좌 상태를 변경하고 이더리움 P2P에서 배포되어 블록체인 내에 상태전이를 유발합니다.
때문에 스마트컨트랙트에서는 보안은 굉장히 중요한 요소입니다. 이더리움은 이를 GAS라는 비용을 통해 지급하여 스마트컨트랙트의 안정성을 유지시켰습니다.
# 스마트컨트랙트 작동
그렇다면 어떻게 하면 스마트컨트랙트를 이더리움에 올릴 수 있을까요??
기본적으로 사용자는 이더리움에 두가지 방식으로 접근이 가능합니다. 터미널과 DAPP방식, 또는 브라우저로 접근이 가능합니다. 터미널은 Geth를 통한 콘솔로 EVM의 스마트컨트랙트를 올릴 수 있습니다.(하지만 일일이 명령어를 실행시켜줘야 되기 때문에 까다롭고 사용자 친화적이지 않죠.)
브라우저 방식은 보통 Remix(https://remix.ethereum.org/)에서 Solidity라는 언어로 스마트컨트랙트를 작성하여 올립니다. Remix브라우저는 일련의 명령어(web3)들이 내장되어 있어 쉽게 바이트 코드로 컴파일을하고 Deploy를 할 수 있습니다.
지금 제가 개발하고 있는 DAPP은 Web3라는 API를 통해서 직접 EVM에 스마트컨트랙트를 올립니다. 즉 코드에 Web3의 Function만 사용한다면 Geth에 일일이 명령어를 사용하지 않아도 됩니다.
# 솔리디티로 스마트컨트랙트 코드 작성 => solc 컴파일 => 바이트코드
- GAS Price(가스가격)와 GAS Limit(가스총량)
스마트컨트랙트가 작동하기 위해서는 Gas라는 연료가 필요합니다. 즉 모든 트랜잭션 처리에는 가스가 필요한 것입니다. 그만큼 Gas는 매우 중요한 요소이며 트랜잭션 처리 시 꼭 인지해야 되는 부분입니다.
# GAS
가스는 이더리움 블록체인의 적합성과 안정성을 유지시키기 위한 토큰입니다. 이더리움 트랜잭션의 수행을 위해서는 Gas Limit x Gas Price로 가격이 매겨집니다.
기본적으로 가스가격이 높아지면 트랜잭션이 빨리 처리가 됩니다. 이는 이더리움 블록체인의 마이너가 가스가격이 높은 것을 우선순위로 처리하기 때문입니다.
이더리움 시스템에 기본적인 가스 가격은 0.00000005Ether입니다. 가스 가격의 단위는 Gwei라는 단위로 쓰게 됩니다. 1Gwei는 참고로 0.000000001Ether입니다. 별로 비싸진 않지만 많은 트랜잭션이 일어나다보면 가격도 만만치 않게 되기 때문에 실제 DAPP 개발 시 적정 가스가격으로 개발해야 하죠.
# GAS Limit
이더리움의 한 블록에 담을 수 있는 가스의 총량은 670,000가스를 수용할 수 있습니다. 1개의 블록체인은 320개의 트랜잭션을 담을 수 있으니 최대 1개의 블록의 최소 가스가격비용은 21,000가스라고 할 수 있습니다. 만약 가스Limit를 넘어서는 가스를 사용하게 되면 트랜잭션을 실행시킬 수 없습니다. 때문에 가스 Limit를 넉넉히 잡는 것이 상대적으로 좋습니다.
트랜잭션 실행자는 계산된 가스로 트랜잭션을 실행시키고 계산된 가스는 마이너에게 갑니다. 그리고 남은 가스는 다시 트랜잭션 실행자에게 되돌아가죠. 즉 이더리움 블록체인은 위에 계산된 가스가격에 초과하지 않는 선에서 트랜잭션을 수행합니다.
현재 가스 적정 가격 및 현황 정보는 이 사이트에서 실시간으로 확인할 수 있습니다. (https://ethgasstation.info/)
# 트랜잭션 처리 과정
1. 트랜잭션 처리는 트랜잭션 처리자의 개인키로 서명을 통해서 시작됩니다.
2. 이더리움은 해당 트랜잭션을 네트워크에 연결되어 있는 모든 노드에게 BroadCast합니다.
3. 마이너는 해당 트랜잭션의 유효성(가스비, Nonce, 문법)을 검사하고 이상이 없으면 해당 트랜잭션을 등록시킵니다.
4. 마이너는 트랜잭션들의 가스 실행 비용이 높은순으로 트랜잭션을 선택하게 됩니다. 만약 트랜잭션 처리를 실패하게 되면 처리자에게 다시 원복시킵니다. 하지만 가스 비용은 처리자에게 되돌아가지 않습니다.