0. Solidity(블록체인에 관하여)

정예찬·2022년 7월 9일
3

solidity

목록 보기
2/13

본 글은 freeCodeCamp.Org의 Youtube 영상 'Solidity, Blockchain, and Smart Contract Course – Beginner to Expert Python Tutorial'와 관련 코드인 SmartContract의 Github 코드를 기초로 작성되었다.

Youtube 영상 링크: https://www.youtube.com/watch?v=M576WGiDBdQ&t=10336s
Github 코드 링크: https://github.com/smartcontractkit/full-blockchain-solidity-course-py

이번 포스팅은 유튜브 영상 00:06:33~01:31:00에 해당하는 내용이다.

글을 어떤 방식으로 구성할지 고민을 많이 했다. 유튜브 순서를 그대로 따라갈지, 코드에 기반하여 내 스타일로 재구성할지 고민했다. 이 글의 독자는 대부분 유튜브 영상을 참고하리라는 생각이 들어 유튜브 순서를 따르되 나만의 설명을 추가하는 방식으로 글을 작성하기로 결정했다.

본격적으로 Solidity에 입문하기 전에 블록체인에 대해 설명하려고 한다. 블록체인 시스템에 대한 이해가 이미 충분한 분들은 이번 파트를 넘겨도 좋고, 블록체인에 입문하는 분들은 관련 자료를 더 찾아봐도 좋다. 많은 사람과 기관들이 블록체인에 왜 그리 열광하는지, 블록체인의 의의는 무엇인지에 대해서 알아야 Solidity를 공부할 때 더 힘이 나지 않겠는가. 다만 본 포스팅은 Solidity를 소개하기 위한 목적이지 블록체인 설명 글이 아니므로 필자가 생각하기에 정말 핵심적인 내용만 간략하게 설명하도록 하겠다.

블록체인 입문자들에게 오태민 작가의 "스마트 콘트랙"과 "비트코인, 지혜의 족보"라는 2권의 책을 추천한다. 기술적 내용이 대부분 소거되어 현실성이 떨어진다는 비판을 받을 수 있지만 국내 도서 중 인문학적 관점에서 비트코인과 블록체인에 대해 이보다 더 통찰력 있게 풀어낸 책을 찾기힘들다고 본다.

블록체인은 사토시 나카모토라는 익명의 한 저자가 2008년 10월에 올린 "Bitcoin: A Peer-to-Peer Electronic Cash System(비트코인: P2P(개인 대 개인) 전자화폐 시스템)"이라는 9쪽짜리 논문에서 시작되었다. 비트코인은 네트워크 상에서 중개 기관 없이 개인 간 거래가 가능하다. 이때 거래 내역은 네트워크 상에 모두 투명하게 공개되고, 거래 내역이 담긴 장부는 네트워크 참여자라면 누구나 보유가능하다. 이는 은행과 같은 제 3의 금융기관이 모든 거래 내역을 독점하고 거래자들을 중개하는 기존의 금융 시스템과 정면으로 배치된다. '블록체인'이라는 명칭의 함의는 비트코인의 거래 내역이 블록 형태로 켜켜이 쌓이는 모습에서 확인할 수 있다. 블록체인 네트워크에 참여하는 다수의 참여자를 '노드'라고 일컫는다.

비트코인은 주로 자산 역할을 수행하는 반면 이더리움은 비트코인의 탈중앙성을 여러 방면으로 확산한다. 이더리움은 탈중앙화 어플리케이션(Decentralized Application=DApp), 탈중앙화 자율조직(Decentralized Autonomous Organizaition=DAO), 탈중앙화 금융(Decentralized Finance=DeFi) 등 각계 분야에 탈중앙성을 적용할 수 있게 한다. 사실상 중앙화 시스템이 적용되었던 전분야로 탈중앙성을 확장할 수 있다고 보아도 무방하다.

제 3의 신뢰 기관 없이 개인 간 합의가 가능하게 된 배경에는 이더리움의 스마트 컨트랙트가 있다. 스마트 컨트랙트는 이더리움이 출시된 2015년보다 한참 전인 1994년에 Nick Szabo라는 컴퓨터 공학자에 의해 제시된 개념으로, 코드로 처리되는 계약을 의미한다. 계약의 내용과 절차는 미리 작성된 코드에 의해 자동적으로 처리되고 투명하게 공개된다. 계약의 수행은 해당 블록체인 네트워크에 참여하는 다수의 노드에 의해 보증된다.

비트코인과 이더리움, 스마트 컨트랙트에 대해 정말 간략하게 설명했다. 비트코인 입문자라면 위 글만 읽고 해당 개념을 온전히 숙지하지 못할 것이다. 이해가 되지 않는 개념에 대한 글도 읽고, 영상도 찾아보면서 해당 개념에 대해 이해해나가길 바란다. 비트코인, 이더리움, 스마트 컨트랙트에 대한 이해가 높아질수록 Solidity를 의미 있게 활용할 수 있을 것이다.

본 글이 기초로 하는 Youtube 영상에서는 오라클 문제와 오라클을 반영하기 위한 Chainlink, 하이브리드 스마트 컨트랙트에 대해 설명하나 이 부분은 건너뛰도록 하겠다. 하이브리드 스마트 컨트랙트에 대해서만 간략하게 설명하자면, 코드 내부와 현실 세계가 연결된 스마트 컨트랙트를 하이브리드 스마트 컨트랙트라고 한다. 오라클 문제가 현실에서 스마트 컨트랙트를 수행할 때 필수적으로 고려해야 하는 대상이기는 하지만 앞서 다룬 개념에 비해서는 부차적이다. 또한 Youtube 영상의 설명자인 Patrick Collins가 'Chainlink'가 적힌 옷을 입고 있다는 사실과 그의 Chainlink에 대한 열정적인 설명 태도로 미루어짐작할 때 그가 Chainlink와 이해관계가 짙은 듯 보인다. 본 글은 그 이해관계와 무관하므로 Chainlink에 대한 설명은 별도로 하지 않겠다. 다만 추후 포스트에서 코드를 작성할 때 Chainlink가 자주 활용되긴 할 것이다.

블록체인의 이점으로는 다음의 7가지를 꼽을 수 있다.

(1) 탈중앙성
(2) 투명성과 유연성
(3) 빠른 속도와 효율성
(4) 보안성과 불변성
(5) 거래상대방 위험 제거
(6) 신뢰 최소화 합의
(7) 하이브리드 스마트 컨트랙트를 통한 체인 내외부 통합

이는 블록체인의 이상적 구현을 전제로 하며, 현 블록체인 업계에서는 이 이점들을 극대화하기 위해 끊임없이 노력중이다.

Solidity를 실제 네트워크에서 수행해보려면 먼저 암호화폐 지갑(이하 지갑)을 만들어야 한다. MetaMask를 활용하면 정말 간단하게 지갑을 만들 수 있다.
https://metamask.io/download/
Metamask 지갑은 위 링크에 들어가서 만들 수 있다.
영상 25:52부터 MetaMask 설치 과정을 직접 보여주니 그대로 따라하면 된다. 그게 어렵다면 구글에 '메타마스크 지갑 만드는 법'이라고 검색하면 나오는 친절한 설명 글들을 참고하면 된다. 생소한 개념일 수 있으나 정말 간단한 과정이고 실제 돈이 들어가지도 않으니 두려움 갖지 말고 시작해보시라. Solidity 이해를 위해서는 필수적인 과정이다.

지갑을 처음 만들 때 제시되는 12개의 단어를 반드시 순서대로 기억해두어야 한다. 이 12개 단어와 순서를 니모닉(Mneumonic)이라고 한다. 니모닉을 기억해두지 않으면 원래 지갑을 사용하던 기기에서 지갑 연결이 해제되었을 때 영영 계정을 복구할 수 없게 된다. 같은 맥락에서 어떤 지갑의 니모닉을 알기만 하면 누구든 그 지갑을 사용할 수 있게 된다. 따라서 니모닉은 본인만 알 수 있도록 기록해서 꽁꽁 숨겨두어야 한다. 니모닉을 적어 개인 금고에 넣어두는 사람도 많다.

지갑을 처음 만들고 나면 이런 창이 뜬다. 한 지갑에는 여러 개의 계정을 담을 수 있다. 새 계정은 우측 상단의 동그라미를 클릭하여 뜨는 계정 생성 버튼을 통해 쉽게 만들 수 있다. Account2라는 계정을 새로 만들어보자. 이더리움 메인넷은 실제 이더리움이 사용되는 네트워크이고 우리는 이를 돈이 들어가지 않는 네트워크로 변경해줄 필요가 있다. '오른쪽 위 동그라미-설정-고급-테스트 네트워크 보기'를 '끄기'에서 '켜기'로 변경하고 우측 상단의 '이더리움 메인넷'을 누르면 다양한 테스트 네트워크를 확인할 수 있다.

테스트 네트워크는 이더리움 네트워크와 동일한 방식으로 동작하나, 실제 돈과는 무관하다. 따라서 테스트 네트워크에서 자유롭게 거래를 해볼 수 있다. 본 포스팅에서 활용되는 테스트넷은 Rinkeby 테스트넷과 Kovan 테스트넷이다. 먼저 Rinkeby 테스트넷을 활용하기 위해 Rinkeby 이더리움 지갑에 돈을 입금시켜보겠다.

https://faucet.rinkeby.io/
위 링크에 들어가서 18.75 Rinkeby이더리움을 받을 수 있는데, 영상 33:52부터 방법을 확인할 수 있다. 트위터에 주소(가운데 상단의 OxOOd...D18f가 주소이다. 주소는 지갑마다 다르다.)를 포함한 글을 작성한 후 그 트윗의 주소를 페이지 박스 안에 붙여넣으면 Rinkeby 이더리움이 지갑으로 들어온다. 영상에는 이렇게 나오는데 필자의 트위터 계정으로 실행해본 결과 되지 않았다. 정확한 이유는 모르겠으나 작성 시점 기준 18일 전에 해당 사이트의 이더리움 전송 시스템이 다운된 것으로 추측한다. 다른 사이트에서 0.2 Rinkeby 이더리움을 받았으나 너무 적은 금액이라 Ropsten 테스트넷에서 10 Ropsten 이더리움을 받았다. Ropsten 테스트넷에서 Solidity 실행을 해도 Rinkeby 테스트넷에서 하는 것과 큰 차이가 없으니 필자와 같은 상황에 놓였다면 Ropsten 이더리움을 받기로 하자. 아래 사이트에 들어가 주소를 입력하면 10 Ropsten 이더리움을 받을 수 있다.
https://faucet.egorfine.com/

이더리움의 거래는 etherscan을 통해 확인할 수 있다.
https://etherscan.io/
위 사이트에 들어가 지갑의 주소, 블록, 토큰 등을 입력하면 관련 거래를 모두 확인할 수 있다.

테스트넷의 거래도 각각 별도의 사이트를 통해 확인할 수 있다. 예를 들면 Ropsten 이더리움의 거래는 아래 사이트에서 확인할 수 있다.
https://ropsten.etherscan.io/

10 Ropsten 이더리움을 받은 후 해당 사이트에 들어가 계정 주소를 입력하면 10 Ropsten 이더리움이 잔고에 들어와있음을 확인할 수 있다.

이번에는 1 Ropsten 이더리움을 Account2로 보내보자. Ropsten 테스넷에 연결된 Account1에서 '보내기-내 계정 간 전송-Account 2-금액에 '1' 입력-다음'을 누르면 가스가 자동으로 계산되어 제시된다. 가스란 거래를 생성하는데 들어가는 수수료이다. 이때 '시장'을 누르면 가스 요금을 편집할 수 있는 창이 나온다. "가스 요금을 거래 당사자가 설정할 수 있으면 무조건 낮게 설정하지 않을까?"라는 의문을 가질 수 있다. 그러나 가스는 블록 생성자들이 받는 수수료이고, 하나의 블록에는 제한된 양의 거래가 담긴다. 블록 생성자들은 높은 수수료를 제시하는 거래를 우선적으로 담기에 가스 요금을 지나치게 낮게 잡으면 거래가 오래 걸릴 수도, 거래가 이루어지지 않을 수도 있다. 따라서 상황에 맞게 적절한 가스 요금을 제시해야 하며, Metamask에서는 Metamask 사용자를 위해 각 상황에 맞는 가스 요금을 자동으로 계산하여 제시하고 있는 듯 보인다.

가스 요금을 편집하지 않고 확인을 누르면 1분 안에 거래가 성사되어 Account1과 Account2의 잔고 변동을 확인할 수 있다. Ropsten etherscan 사이트에 들어가 각 주소를 검색해봐도 거래가 성공적으로 일어났음과 거래의 구체적 정보를 확인할 수 있다.

다음으로 블록체인이 구체적으로 어떻게 작동되는지를 확인해보자. 영상 44:12부터 시작되는 내용이다. 블록체인의 작동 원리를 이해하기 위해서는 해시 함수에 대해 이해해야 한다. 함수는 간단하게 말해서 어떠한 입력값을 넣었을 때 정해진 출력값이 나오는 시스템이다. 'f(x)=6x+13'라는 함수의 x값에 1을 투입하면 항상 19라는 값이 나오고, 2를 투입하면 항상 25라는 값이 나온다. 해시함수 g(x)에도 어떠한 입력값을 넣으면 항상 그 입력값에 대응하는 출력값이 나온다.

해시함수가 특별한 이유는 다음 2가지 이유 때문이다.
(1) 어떠한 값을 입력하든 항상 16진수 64자리의 숫자가 출력된다.
(2) 역연산이 사실상 불가능하다. 즉, 출력값으로부터 입력값을 도출해내는 게 현실적으로 불가능하다.

https://andersbrownworth.com/blockchain/
위 사이트에 들어가 입력값을 자유롭게 넣어보고 SHA-256이라는 해시 함수가 출력값을 어떻게 내놓는지 확인해보자. 입력값이 조금만 변경되어도 출력값은 완전히 달라짐을 확인할 수 있다.

이러한 해시함수가 특정한 조건을 만족하도록 하는 입력값을 찾는 과정을 채굴이라고 한다. 구체적으로는 출력값 맨 앞부터 0이 t개가 연속되도록 하는 입력값을 찾아야 한다. 예를 들어 t가 4이면 00006f625e0aceb107996a1ca1601d3fc4e2a97a8a81682b0bb124d27d551797처럼 0000.....이 출력되도록 하는 입력값을 찾으면 된다. 이때 입력값은 (자료+난스)인데 자료는 송금 기록, 이전 블록 정보와 같이 이미 정해진 정보이고 난스는 0부터 시작되는 어떤 숫자이다. 따라서 채굴자는 채굴을 위해 난스를 일일이 해시 함수에 대입해가며 특정 출력값을 찾아야 한다. 조건을 만족하는 난스를 찾아 다른 노드들에게 인정을 받으면 채굴이 완료된다. 한 번의 채굴을 통해 완성된 하나의 데이터 집합을 블록 하나로 카운트한다. 즉, 채굴은 블록을 생성하는 과정이다. 채굴이 완료되면 다음 블록을 생성하기 위한 채굴이 이루어지고, 이 과정이 반복되며 여러 개의 블록이 쌓여 블록체인이 형성된다. 블록체인 위변조가 불가능한 이유는 중간 블록 하나의 정보를 수정하면 하위 블록의 정보가 모조리 변경되고, 이를 다른 노드들이 확인할 수 있기 때문이다.

다음으로 블록체인에서 거래가 입증되는 방식을 설명하겠다. 이를 구체적으로 확인해보고 싶다면 아래 사이트를 방문하면 된다.
https://andersbrownworth.com/blockchain/public-private-keys/

데이터 복제가 가능한 디지털 공간에서 데이터 자산의 소유권을 증명하는 게 어떻게 가능한지 의문이 생긴다. 이를 해소하기 위해서는 공개키와 암호키, 서명에 대해 이해해야 한다. 공개키, 암호키, 서명에 대한 독특한 특성은 ECDSA(Elliptic Curve Digital Signature Algorithm)라는 알고리즘이 본 시스템에 적용됨으로써 가능한데, 이는 지나치게 수학적인 내용이므로 설명에서 배제하겠다. 암호키, 공개키, 서명의 특성은 다음과 같다.
(1) 암호키는 키의 주인이 자유롭게 설정할 수 있다.
(2) 공개키는 암호키로부터 추출된다.
(3) 공개키로부터 암호키를 추출할 수 없다.
(4) 공개키는 다른 노드들에게 공개되고, 암호키는 공개되지 않는다.
(5) 어떠한 메시지를 암호키로 서명할 수 있다.
(6) 서명으로부터 암호키를 추출할 수 없다.
(7) 노드들은 메시지와 공개키가 해당 키의 주인 것임을 서명을 통해 확인할 수 있다.

거래 내역은 다음과 같이 입증된다.
(1) 송금자 Y가 S에게 돈을 보내고 이 사실을 공표한다.
(2) Y의 공표가 참임을 다른 노드들이 증명하라고 한다. 이때 다른 노드들은 Y의 공개키와 메시지(즉, 송금 내용)를 알고 있다.
(3) Y는 송금 내용을 암호키로 서명하여 서명을 다른 노드들에게 보여준다.
(4) 노드들은 공개키, 메시지와 서명을 가지고 해당 키가 Y의 것임을 확인하고 해당 거래를 인정한다.

영상에는 작업 증명 방법(PoW, PoS), 블록 채택, 시빌 공격, 롤업 등 블록체인을 이해하기 위한 다양한 개념들이 제시되나 이는 생략하도록 하겠다. 이미 어려운 내용을 지나치게 압축하여 설명하였을 뿐더러 해당 개념을 다루는 게 본 포스팅의 주 목적이 아니기 때문이다. 블록체인 입문자 입장에서는 오늘 내용이 지루하고 어려웠을 텐데 고생했다. 블록체인에 대해 사람들이 잘 모르는 이유는 이와 같이 복잡한 개념들을 충분히 이해해야 하기 때문이다. 그러나 처음에만 좀 고생하면 블록체인은 정말 재밌게 공부할 수 있는 개념이다. 다음 포스팅부터는 코드를 가지고 훨씬 재미 있고 쉬운 내용을 다룰 테니 기대해주시면 좋겠다. 다음 포스팅도 기대해주시라! ㅎㅎ

Github Code License:

MIT License

Copyright (c) 2021 SmartContract

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
profile
BlockChain Researcher

0개의 댓글