오늘은 평소보다 깊은 프로그래밍 배경지식이 필요한 레터에요. 이 레터를 스킵하고 가셔도 괜찮습니다. 어제는 5월 18일이었네요. 광주에서 태어나고 자랐다 보니 5월 18일이 될 때마다 역사를 돌아보게 되네요.
EVM과 gas
이더리움의 스마트 컨트랙트는 EVM이라는 가상머신의 opcode로 컴파일됩니다. 이 EVM은 operation별로 gas라는 비용이 측정되어 있어요. 하나의 스마트 컨트랙트 트랜잭션이 블록에 포함되면, 전 세계의 모든 이더리움 노드에서 실행되어야해요. 그래서 노드에서 실행하기에 부담되는 연산들은 gas가 높아서 더 많은 수수료를 내야해요. 스택에 값을 넣고 빼고, 연산하는 건 싸고, 스토리지에서 값을 읽거나 쓰는 건 비용이 비쌉니다.
Soldity
대부분의 스마트 컨트랙트는 solidity라는 언어로 작성해요. JavaScript와 비슷하다면 비슷하다고 볼 수 있는 언어에요. 스마트 컨트랙트용 언어다 보니 일반 언어와 몇가지 다른 특징이 있어요. 여러 특징이 있지만 재밌는 것 몇 개만 같이 볼게요.
다른 컨트랙트의 함수를 호출할 때 해당 함수가 사용할 수 있는 gas limit을 지정할 수 있어요. 호출한 함수가 지정한 gas limit보다 더 많은 gas를 사용하면 에러가 나서 트랜잭션이 샤패합니다.
solidity에는 function modifier라는 문법이 있어요. 이 문법은 함수가 실행되기 전, 혹은 후에 실행되야하는 코드를 쉽게 명시하는 문법이에요. 예를 들어 컨트랙트의 주인만 호출할 수 있는 기능들이 있을 때, 컨트랙트 호출한 사람이 컨트랙트가 주인인지 검사하는 코드를 쉽게 주입할 수 있어요. `functiondestroy()publiconlyOwner{ ` 이렇게 `onyOwner` 라는 function modifier를 달아서 `destroy` 함수가 `owner`가 호출했을 때만 동작하게 만들 수 있어요.
보안과 가스
컨트랙트 코드 작성은 신경쓸 지점이 일반적인 코드오 달라요. 컨트랙트 코드를 작성할 때 가장 주의할 점은 보안 문제가 없으면서도 가스를 덜 쓰는 코드를 작성하는 거에요. 한 번 블록체인에 배포하면 수정할 수 없기 때문에 사소한 실수에서 매우 큰 문제가 발생할 수 있어요. 인스트럭션 하나 하나가 비용이고 스테이트의 바이트 하나 하나가 비용이기 때문에 비용을 줄이기 위해 다양한 노력을 해야해요.
오늘은 여기까지에요. 금요일 잘 보내시고 좋은 주말 되세요. 피드백과 질문은 이메일 답장으로 받고 있어요.