글 한 편으로 끝내는, 스마트 컨트랙트 – HAECHI AUDIT
이후에 최고 입찰자가 아닌 사람들은 44~55번째 줄의 withdraw() 함수를 호출할 것입니다. 별도의 시간은 검사하고 있지 않으니, 계약이 계속 지속되는 한 언제든 출금할 수 있습니다.
각각의 함수를 보셨을 때 이런 구문이 눈에 들어오지는 않으셨나요? 이는 Event라 불리는 것으로, 해당 함수가 잘 실행되었다는 의미로 로그를 남기기 위해 사용됩니다. Transaction의 결과로써 receipt라는 것을 전달 받는데, 이 receipt는 Event를 담고 있습니다. Transaction이 실패한 경우라면 Event는 기록되어 있지 않을 것입니다.
혹시나 이 스마트 컨트랙트의 업그레이드 버전을 보고싶으시다면, https://solidity.readthedocs.io/en/latest/solidity-by-example.html#id2 을 참고 하시면 되겠습니다. 😉
그렇다면 도대체 스마트 컨트랙트가 왜 필요한 것인지에 대해 알아보기 전에, 우선 스마트 컨트랙트의 특장점에 대해 정리해보도록 하겠습니다. 기술적인 관점에서 스마트 컨트랙트는 아래와 같은 대표적인 특징을 가지고 있습니다.
1) 누구나 컨트랙트를 배포할 수 있다.
2) 컨트랙트의 소유자가 아니더라도 누구든지 검증할 수 있다.
3) 코드의 실행을 자동화할 수 있다.
4) 위변조가 어렵다.
따라서 스마트 컨트랙트는 투명한 거래 내역이 공개되어야 하고, 중개인 비용을 절감해야하는 곳 그리고 거래 수수료 비용을 감소해야하는 곳에 사용되는 것이 가장 적합합니다. 실제로 Etherscan이나 Decentralized Metadata and Source Code Repository를 통해 이더리움 메인넷과 테스트넷에 배포된 모든 contract를 누구든지 조회할 수 있습니다.
또한, 스마트 컨트랙트는 블록체인 상에 trustless한 네트워크를 구축하는데 효과적입니다. 만약 Alice가 매달 마지막 날에 Bob에게 $50를 전송해야한다고 했을 때, 은행이나 제 3자 신뢰할 수 있는 기관에 의존하지 않고서도 해당 계약을 이행할 수 있게됩니다.
이더리움의 등장과 함께 스마트 컨트랙트는 다양한 곳에 활용되었습니다.
- Initial Coin Offering (ICO)
대표적인 사례로는 스마트 컨트랙트로 토큰을 제작해서 Initial Coin Offering(ICO)를 한 것이 있습니다. 이때 사용되는 대부분의 토큰은 ERC-20라는 규격을 따르는데, ERC-20는 EIP(Ethereum Improvement Proposal) 20에서 제안되었고, 토큰 스마트 컨트랙트 인터페이스의 표준을 정의하고 있습니다. EIP에서는 ERC-20 토큰이 따라야할 스마트 컨트랙트의 표준 규격 (토큰 전송, 교환, 권한 등에 대한 속성)을 정의하고 있습니다. 참고로 ERC는 Ethereum Request for Comment의 약자입니다.
토큰 세일을 스마트 컨트랙트로 진행하는 이유는 스마트 컨트랙트가 가지고 있는 정보가 블록체인 네트워크에 투명하게 공유하여 누구나 그 정보를 신뢰할 수 있기 때문입니다. 실제로 토큰 세일을 진행한 에어블록의 류원경 Director님의 경우 해치랩스와 인터뷰에서 아래와 같이 답변을 해주었습니다.
“스마트 컨트랙트를 이용하게 되면, 토큰 세일에 참여하시는 분들께 세일의 진행 상황이나 토큰 발행량, 판매량 등을 투명하게 공개할 수 있어 참여자분께 세일에 대한 신뢰를 드리는데 큰 도움이 된다고 생각합니다.”
게임 아이템을 스마트 컨트랙트로 구현하고 유저의 소유권을 증명할 수 있다면, 아이템 거래도 암호화폐를 송금하듯이 손쉽게 주고 받을 수 있게 됩니다. 그렇게 되면 중개 서비스를 통해서 아이템을 거래할 사람을 찾거나 게임내에서 별도로 거래할 필요없이, 거래소를 통해 팔고 싶은 아이템을 원하는 가격에 손쉽게 거래할 수 있는 것 입니다. 이 때 스마트 컨트랙트는 특정 아이템과 매칭이 되어야하고, 1 ETH가 0.5 ETH로 나눠질 수 있는 것처럼 쪼개질 수 있으면 안됩니다. 이러한 특징을 반영해서 만든 스마트 컨트랙트 규격이 ERC-721과 ERC-1155입니다. 이 두 가지 기준을 따라 만든 게임 아이템의 경우, 개발사가 아이템을 소유하는 것이 아니라 개인이 소유하기 때문에 게임 개발사의 동의 없이도 해당 아이템을 외부 마켓 플레이스를 통해 거래할 수 있습니다. 또한 금융 상품의 소유권을 증명할 때에도 이러한 NFT(Non-Fungible Token)를 활용해볼 수 있습니다.
자금조달, 게임 아이템 이외에도 탈 중앙화 금융(De-fi), 월렛, 탈중앙화 거래소 등 다양한 분야에서 스마트 컨트랙트를 활용하고 있습니다.
그런데 스마트 컨트랙트는 기존 계약의 한계점을 완벽하게 해결하지는 못합니다.
스마트 컨트랙트는 블록체인 외부의 정보를 스스로 가져오지 못합니다. 즉, 어떠한 조건을 충족했을 때 코드로 구현된 계약이 이행되는 과정에서, 해당 조건 충족 여부 확인을 위해 특정 정보가 필요한 경우 문제가 발생합니다. 예를 들면, ‘이더리움의 가격이 100만원을 넘어가면, A가 B에게 1 ETH를 준다’는 스마트 컨트랙트를 만들었다고 가정해보겠습니다. 이 때, 이더리움의 가격이 100만원을 넘어가는지, 넘어가지 못하는지에 대한 데이터가 입력되어야만 스마트 컨트랙트가 작동하게 됩니다. 따라서, 블록체인 외부에 있는 암호화폐 거래소의 정확한 이더리움 가격 데이터를 가져왔을 때 해당 컨트랙트가 실행될 수 있는 것입니다.
그런데 블록체인 외부 데이터를 가져오는 과정에서 잘못된 데이터를 가져오거나, 고의로 잘못된 데이터를 입력하는 문제가 발생할 수 있습니다. 다시 말해서 스마트 컨트랙트가 실행되기 위해서는 특정 조건에 대한 정보를 가져와야하고, 이때 필요한 데이터를 가져오기 위해 제 3자에 의존해야 한다면 결국 또 다른 신뢰 이슈가 발생합니다. 이러한 문제를 해결하기 위해 다양한 스타트업들이 스마트 컨트랙트의 생성과 실행에 필요한 외부 정보를 제대로 공급하기 위해 노력하고 있습니다.
또 다른 한계점으로, 스마트 컨트랙트는 배포 이후에 그 작동을 수정할 수 없습니다. 어떻게 보면 그 내용을 수정할 수 없기 때문에 다수의 사람들에 의해 신뢰받고 사용되지만, 동시에 이러한 특성 때문에 잠재적으로 취약점을 가지고 있다고 볼 수 있습니다. 이러한 취약점 때문에 빈번하게 스마트 컨트랙트 해킹이나 영구적인 사용 불능 사례들이 발생하기도 했는데요, 대표적인 해킹 사례로는 SmartMesh가 있습니다. SmartMesh 팀이 배포한 스마트 컨트랙트에 보안 결함이 있었고, 해커가 이를 이용해 토큰을 추가적으로 발행 후 판매한 사건이 있었습니다. 또한, 스마트 컨트랙트의 보안적 결함으로 지갑에 있던 513,774.16 ETH가 영구적으로 출금이 불가능한 상태가 된 사건도 있었습니다.
스마트 컨트랙트는 직접적으로 디지털 자산을 다루기 때문에, 안전한 스마트 컨트랙트를 개발하는 것이 매우 중요합니다. 따라서 블록체인 업계에서는 스마트 컨트랙트 배포 전에 스마트 컨트랙트 보안감사를 받는 것이 표준으로 자리잡고 있습니다. 스마트 컨트랙트 보안 감사가 어떻게 진행되는 지에 대해서는 추후에 작성할 글을 통해 자세히 설명하도록 하겠습니다. 🤓
이번 글을 통해 스마트 컨트랙트가 기존 계약 시스템의 고비용과 비효율 문제를 일부 해결하는 효과적인 해결 방안으로 다양한 분야에서 활용되고 있는 것을 알 수 있었습니다. 동시에 스마트 컨트랙트가 기존 계약의 한계점을 완전히 해결할 수 있는 만병 통치약이 아니라는 점도 살펴보았습니다.
스마트 컨트랙트가 흥미로운 점은 블록체인 개발자 커뮤니티를 중심으로 개발 환경이 개선되고, 새로운 기능들이 추가되며 지금 이 순간에도 발전하고 있다는 것입니다. 오늘 글이 블록체인과 스마트 컨트랙트에 관심있던 분들께 조금이라도 도움이 되었기를 바라며, 질문이나 피드백 있으신 분들은 언제든지 audit@haechi.io로 연락주시기 바랍니다.
긴 글 읽어주셔서 감사합니다. 🙆🏻♂️
Published at Fri, 13 Dec 2019 03:57:36 +0000
{flickr|100|campaign}
