프로그래밍이 가능한 블록체인에 대한 초보자 가이드

이더리움은 프로그래밍이 가능한 새로운 통화입니다.

이 글을 다 읽으시면, Remix-Solidity IDE를 사용하여 간단한 이더리움 스마트 계약을 작성하는 방법을 알게 될 것입니다.

이더리움이란 무엇인가?

2009년, 누군가 사토시 나카모토라는 예명으로 비트코인의 개념을 도입했습니다. 비트코인은 현재까지 가장 성공적인 디지털 통화입니다. 비트코인은 블록체인에 모든 거래가 보관되는 완벽하게 탈중앙화된 화폐 시스템의 개념을 대중화시켰습니다. 이더리움은 탈중앙식 거래의 힘과 튜링 완전(turing-complete) 프로그래밍 언어(본질적으로 모든합리적 계산 문제를 해결하는 프로그램을 작성할 수 있음을 의미)를 결합하여 더 많은 것을 시도하고자 합니다.

처음으로 스마트 계약을 직접 작성해보고 싶다면, 현재 가장 대중화된 언어인 솔리디티(Solidity)를 사용하는 것이 좋습니다. 본 가이드는 이더리움 스마트 계약서를 작성함으로써 솔리디티의 단계별 학습을 제공합니다.

여러분의 첫 번째 스마트 계약

우선, 우리는 투표 스마트 계약서를 작성할 것입니다. 이 스마트 계약을 통해 사용자들은 새로운 제안서를 제안할 수있습니다. 즉, 기존의 제안에 대해 찬성 혹은 반대투표를 하여 더 많은 투표를 받은 제안을 신속히 질의할 수 있습니다. 이러한 아이디어는 CarbonVote에서 영감을 받은 것입니다. CarbonVote는 투표자들의 지갑에서 코인을 요구하지않는 투표 기능을 가진 웹 페이지입니다. 투표는 예 혹은 아니오를 나타내는 각 주소의 ETH 금액을 보고 언제든지 계산 가능합니다. 제안자는 제안서를 뒷받침할 ETH를 지불해야 합니다 (예를 들어 5 ETH). 그리고 이 금액은 제안서를취소/종료할 때 다시 받을 수 있습니다.

Remix로 시작하기

이더리움을 개발하는 것이 처음이라면, 이는 굉장히 어려운 과제처럼 느껴질 수도 있습니다. 더욱 쉬운 이해를 위해, 본 글은 가능한 한 간단하게 쓰겠습니다. 같은 목적으로, zero install 인브라우저 IDE The Remix Solidity Editor를 사용하겠습니다.

왼쪽 상단의 (+) 버튼을 눌러 새로운 파일을 만들어 Voting.sol로 파일명을 저장합니다.

코드 스켈레톤(Code skeleton)

솔리디티 버전

우선 우리가 지원하는 솔리디티 버전을 선언하고 계약서 작성을 시작합니다:

계약은 솔리디티 컴파일러 버전 0.4.15 이후의 버전을 지원하지만 0.5.0 이후의 버전은 지원하지 않습니다. (두번째 조건은 ^를 사용하여 추가됩니다)

데이터 구조(Structs)

계약의 2가지 데이터 구조

본 계약에서는 2개의 데이터 구조를 만들었습니다: 투표자와 제안서입니다. 투표자 데이터 구조에는 사전이 포함됩니다. 이 사전은 제안서의 색인을 참/거짓으로 매핑하여 투표자가 이미 $index 제안서에 투표했는지 보여줍니다. 각각의 제안서는 다음과 같은 정보를 가지게 됩니다: 제안서의 내용, 찬성/반대 투표수, 제안서가 제안된 블록 숫자, 제안서의 주소 그리고 취소된 상태(제안자가 취소했다면 참, 그렇지 않은 경우 거짓).

사건(Events)

계약서는 제안서에 대한 찬성 혹은 반대투표(VoteFor/VoteAgainst), 새로운 제안서를 추가 혹은 취소(ProposalAdded/ProposalCanceled)그리고 제안자에게 이더(Ether)를 다시 환불(Refund) 될 때 사건을 내보냅니다. 각각의 사건에는 투표가 수행될 때 일어나는 일을 추적하는데 필요한 정보가 들어있습니다.

수식자(Modifiers)

솔리디티 문서에서, 수식자는:

기능을 실행하기 전에 자동으로 조건을 확인할 수 있습니다. 수식자는 계약의 상속 가능한 속성이며, 파생된 계약에 의해 무시될 수 있습니다.

본 계약에서는, 투표가 계속 실행 중인지 확인하기 위해notEnded 수식자를 사용했습니다. checkValue 수식자는 제안자들이 각각의 제안서에 대한 충분한 이더를 지불했는지 확인하고 초과분을 환불하는 기능을 합니다.

생성(Constructions)

계약을 배포하면 생성자가 호출됩니다. 이 생성자는 단 한 번만 호출되며 다시는 호출될 수 없습니다. 생성자는 초기제안 건수 및 투표 상태를 초기화합니다.

제안서 제안하기

사용자가 새로운 제안서를 제안할 때마다, 사건이 기록된 proposals 배열에 추가됩니다. 제안서의 수와 제안자가 지불한 이더의 금액 또한 점차 커집니다.

주의: 한 기능에 다수의 수식자를 적용할 수 있습니다. 이는 기능 머리글의 공백으로 구분된 목록에 수식자를 추가함으로써 가능합니다. 수식자는 제시된 순서대로 평가됩니다. 위 코드 조각에서 우리는 여전히 투표가 진행 중인지 확인하고 제안자가 계약에 적당량의 이더를 전송했는지 확인하기 위해 notEnded 그리고 checkValue, 2개의 수식자를 추가했습니다.

제안서 취소 및 환불

제안서가 본 제안자에 의해 취소되는 경우 취소되었다고 표시되며 지불된 이더는 다시 환불됩니다. Send 방식은 지정된 이더의 금액을 다시 제안자에게 전송합니다. 환불이 성공적으로 이뤄졌는지를 나타내는 참/거짓을 반환하게 됩니다.

경고: 재진입 착취(reentrancy exploit)를 예방하기 위해서는 항상 send를 호출하기 이전에 잔액을 차감해야 합니다. 공격자는 refund 기능을 스팸할 수 있습니다. Send 방식은 공격자가 또 다른 refund를 호출하기 이전에 완료되지 않아, 결국 여러 번의 send를 호출하여 제안자의 잔액을 약탈할 수 있습니다.

투표

사용자가 투표할 때, 제안서에 찬성하거나 반대할 수 있습니다. 우리는 제안서 색인이 유효한지 그리고 투표가 진행되기 이전에 취소되지는 않았는지 확인하고 싶습니다. 또한, 사용자가 같은 제안서에 중복으로 투표하는 것을 예방하고자 합니다. 이는 각 투표자의 votedProposals을 사전에서 확인함으로써 해결할 수 있습니다. 그런 다음, 제안서에 대한 투표자의 이더 금액(wei 단위)을 가지고 투표 수를 증가시킵니다. 투표를 표시하기 위한 사건도 기록됩니다.

제안서의 모든 정보 질의

적절한 색인으로 이 기능을 호출하면 제안서와 관련하여 필요한 모든 정보(내용, 찬성 및 반대투표 수, 제안자 주소, 제안된 블록 번호)를 얻을 수 있습니다. 이 기능은 투표 값을 돌려주는데, 이 값은 추후에 웹 애플리케이션을 통해 추출할 수 있습니다.

우승 제안 질의

이 기능이 호출되면, 가장 높은 (찬성 혹은 반대) 투표를 받은 제안서 색인을 돌려줍니다.

배치 및 테스트

Deploy the contract

배치

우측 패널에, 아래대로 설정하십시오:

· 환경(Environment): Javascript VM

· 가스 한계(Gas Limit): 300000

· 가스 가격(Gas Price): 0

· 값(Value): 0

· 만들기(Create): <공백(keep blank)>

다음으로 Create를 클릭합니다. 계약이 테스트 블록체인에 배치됩니다.

Yay! It worked.

계약과 상호 작용

addNewProposal 박스에 원하는 제안서를 추가하고, 값 박스에 계약에 보내고 싶은 값을 입력하면 됩니다. 우리의 예시에서는, 30 ETH와 “Build a voting contract” 제안서를 addNewProposal 기능에 보냈습니다.

제안서와 함께 30 ETH를 전송했지만, 5 ETH만 차감된 것을 보실 수 있습니다. 이는 checkValue()수식자가 초과 금액을 확인하여 불필요한 금액을 반환했기 때문입니다.

색인(예시의 경우 0)을 이용하여 제안서를 질의하면 제안서의 모든 정보가 표시됩니다. (내용, 찬성 및 반대 투표수, 전송자 및 블록 번호)

더 많은 제안서를 추가하고, 여러 계정을 전환하고, 제안서에 찬반 투표를 하고, 우승 제안서에 질의함으로써 계약과더 많은 상호 작용을 할 수 있습니다.

그 다음은?

글을 다 읽었다면 이제 무엇을 할 수 있을까요?

이더리움 테스트넷이 위 코드를 테스트해보거나, 사용자들이 투표 계약과 상호작용할 수 있는 웹 응용 프로그램을 만들 수 있습니다.

솔리디티 튜토리얼은 매우 많지만, 아래는 가장 도움이 될 법한 자료들입니다:

· The Solidity Docs Site.

· Learning Solidity series by Karl Floersch.

· Getting Started as an Ethereum Web Developer by Alex Miller.

· The Solidity Docs Site

· Karl Floersch 의 Learning Solidity 시리즈

· Alex Miller의 Getting Started as an Ethereum Web Developer

이는 솔리디티와 이더리움 스마트 계약을 배우는 가장 첫 번째 단계입니다. 여러분들이 앞으로 어떤 코딩을 할지 굉장히 기대됩니다.

Join Kambria Newsletter

Author

Kambria Korea

Write A Comment