간단한 스마트 컨트랙트를 직접 코딩하고 설명해 보겠습니다.
이전글 - [처음해 보는 Solidity 코딩] #1 개요 및 개발 환경
설명은 아래 책의 내용을 참고하였습니다.
블록체인 애플리케이션 개발 실전 입문, Solidity를 이용한 이더리움 스마트 계약 구현
스마트 컨트랙트의 개념에 대해서는 아래 내용을 참고하시면 되겠습니다.
[Smart Contract 개발] #6 이더리움 스마트 컨트랙트 동작방식 종결자!!! DApp 개발 가즈아~
참고한다고 해도 비개발자나 스마트 컨트랙트를 처음 접하시는 분들이 보면 어려운 내용일 수 있습니다. 간단히 스마트 컨트랙트는 아래와 같은 내용으로 생각하시고 모르시더라도 그냥 코딩으로 넘어가 보시는게 좋겠습니다.
스마트 컨트랙트는 블락체인 상에서 동작하는 컴퓨터 코드입니다. 개발자가 작성한 코드 내용이 블락체인의 한 블락에 존재하여, 즉 스마트 컨트랙트 주소에 접근하여, 사용자들은 해당 코드를 실행시킬 수 있습니다.
스마트 컨트랙트라고 부르는 이유는, 일반적 거래 내용처럼 스마트 컨트랙트의 코드 내용도 블락 정보에 포함되기 때문에, 조작이 안되고, 코딩된 내용에 따라 프로그램이 동작하기 때문에, 딱 정해진 내용을, 특히 계약과 같은 작업하기에 적합합니다.
자. 이제 한 번 따라서 아래와 같은 스마트 컨트랙트 코드를 작성해 보세요. 파일 이름은 적당히 적어주시면 됩니다. 여기서는 hello_smartcontract.sol로 했습니다. 파일 이름의 확장자가 sol인것만 지켜주시면 됩니다. 바로 solidity 코드란 의미이거든요.
좀 더 전문적인 개발환경에서 코딩을 해보고 싶으신 분들은 아래 내용을 참고하시어 개발환경 작업을 해주시면 됩니다.
Smart Contract 개발 #1 Visual Studio로 Solidity 프로그래밍하자
이전글에서 코딩은 Remix를 이용하기로 했었습니다!!! 우선 Remix에서 코딩하는 걸로 하는데, 아무리 생각해봐도 Online으로 Remix를 사용하는 것은 개발 진행에 좀 무리가 있을거란 생각입니다. 그래서 부득이하게 Offline으로 Remix를 사용하는 방법을 택하겠습니다. 왜 그런지는 다음 글에서 설명드리고, Offline으로 Remix를 사용하기 위해서는 접근 가능한 geth 노드가 있어야 합니다. 이것도 다음에 설명드릴께요. 왜 Offline을 쓰는지 간단히 설명드리면, 개발할 때 테스트넷을 많이 쓰는데, 이것조차 테스트넷에 사용하기 위한 이더가 필요하고, 바로 바로 결과를 확인하기 어렵기 때문입니다.
우선, Remix를 Offline 또는 Online으로 접속하여 아래와 같이 위 코드 내용을 입력합니다.
다시 말씀드리지만, 개발 환경은 다음 글에서 다시 좀 자세히 다뤄야 겠습니다. 이번에는 스마트 컨트랙트 코드의 구조만 짚어보겠습니다.
솔리디티를 이용한 스마트 컨트랙트 코딩에 대해 보다 자세한 사항은 아래 솔리디티 사이트에 나와 있으니, 참고하시면 되겠습니다.
Introduction to Smart Contracts
> pragma solidity ^0.4.8; // (1) 버전 프라그마
위 코드는 솔리디티 컴파일러 호환성을 지칭하고 있습니다. pragma
라는 지시어를 사용하여 코드를 컴파일하기 위한 컴파일러 버전을 제한하고 있습니다. 위 코드에서는 솔리디티 0.4.8 버전 이상의 컴파일러가 필요하다는 의미입니다. 그러나 0.5.0 이상의 컴파일러는 호환되지 않습니다.
// (2) 계약 선언
contract HelloWorld {
}
그 다음 나오는 코드는 바로 스마트 컨트랙트 계약 정의 부분입니다. 이 스마트 컨트랙트의 이름은 HelloWorld
로 정했습니다. 마치 C++이나 Java의 클래스 개념과 유사하다고 보시면 됩니다. 하나의 독립적인 객체라고 보시면 됩니다. 물론 스마트 컨트랙트의 이름은 원하는대로 할 수 있습니다. 단, 프로그램 언어마다 코딩 스타일이란게 있습니다. 첫글자는 대문자로 쓴다던지, underscore는 사용하지 않는다던지요. 그것 그야말로 스타일이기 때문에 반드시 지켜야할 필요는 없습니다.
// (3) 상태 변수 선언
string public greeting;
HelloWorld
라는 스마트 컨트랙트안에 변수를 하나 선언했습니다. 그 변수의 이름은 greeting
입니다. 보통 변수 이름앞에는 변수가 어떤 형태, type인지를 표기해 줍니다. 여기서는 string
으로 표기되어 문자열 형태임을 나타냅니다. 변수 형태는 문자열, 정수, 소수점 등 다양하게 있습니다. 대부분의 프로그램 언어들이 비슷한 개념을 가지고 있습니다. 솔리디티의 한가지 특이한 점은 변수의 접근도(visibility)를 나타내는 public이 변수 타입과 변수 이름 사이에 놓이는 점입니다. 다른 보통의 언어들은 제일 먼저 접근도를 나타내는 지시어가 먼저 나오는데 말이죠.
여기서 public
으로 선언되었기 때문에, 누구나 해당 변수에 접근할 수 있습니다. 심지어, 접근하기 위해 별도의 함수가 자동으로 생성됩니다. 즉 'public' 변수에 대해서 디폴트 함수가 정의되는 것입니다. 변수가 public으로 선언되어 있어 누구나 접근 가능하지만, 변수에 직접적인 값 변경은 안됩니다. 이런 경우 별도의 함수를 이용해서 스마트 컨트랙트 변수 값을 변경하게 됩니다.
// (4) 생성자
function HelloWorld(string _greeting) public {
greeting = _greeting;
}
다음으로는 스마트 컨트랙트의 생성자 함수입니다. 생성자는 스마트 컨트랙트가 최초 배포될 때만 실행됩니다. C++의 클래스 객체가 만들어질 때 자동적으로 실행되듯이, 또 별도로 생성자 함수를 코딩하지 않아도 자동적으로 생성되는 디폴트 함수입니다. 위 경우는 생성자에 인자(argument)를 입력받도록 한 것입니다. 여기서는 문자열 타입을 입력 받고 있습니다. 인자로 입력받은 문자열을 스마트 컨트랙트의 변수에 대입하는 간단한 코드입니다. 주의할 점은 생성자 함수의 이름은 스마트 컨트랙트 이름과 동일해야 합니다. 이건 대부분 언어의 공통점입니다.
또 보시면 함수 이름 HelloWorld
앞에 function
이란 지시어가 있습니다. 단순히 함수임을 나타내는 것이고, 함수 선언 뒷 부분에 public
이란 부분이 보입니다. 이것은 변수의 경우와 유사하게 함수의 접근도를 나타내는 것입니다. 솔리디티 예전 버전에서는 기입하지 않았었는데, 버전 업이 되면서 접근도를 명기하지 않으면 컴파일러가 warning을 띄웁니다. 여기서는 public
으로 했으니깐 이 함수는 누구나 접근 가능한 함수가 됩니다.
// (5) 메서드 선언
function setGreeting(string _greeting) public {
greeting = _greeting;
}
생성자 이외의 특정 기능을 하는 함수입니다. 함수 선언은 생성자 부분과 동일하고 함수 이름이 setGreeting
입니다. 단순히 스마트 컨트랙트 변수에 인자 값을 대입하는 기능을 합니다. 사용자가 원하는 문자열로 스마트 컨트랙트의 변수값을 설정하는 함수입니다. public
으로 선언되어 있기에 누구나 접근 가능합니다.
function say() public constant returns (string) {
return greeting;
}
또 다른 함수 정의입니다. 이 함수는 호출되면 단순히 스마트 컨트랙트 변수 (상태변수)값을 리턴하는 기능을 합니다. 함수 선언부를 보면 public
이 붙어 있어서 접근도를 명기했고, 그 다음으로 constant
라는 지시어가 나타납니다. 이것은 함수 내부에서 상태변수 값을 변경시지 않겠다는 의미입니다. 함수가 constant
로 선언되면, 나중에 보다 자세히 설명하겠지만, 해당 함수를 호출할 때는 트랜잭션이 발생하지 않습니다. 앞의 setGreeing
함수의 경우는 constant
로 선언되어 있지 않고, 스마트 컨트랙트의 상태 변수값을 변경하므로, 호출하면 트랜잭션이 발생합니다. 일단 이렇게만 알아두시면 되겠습니다.
위 함수에서 다음 지시어로 returns (string)
이라고 선언되어 있습니다. 이것은 함수의 리턴하는 내용을 명시한 것입니다. 이 함수의 결과로 어떤 형태의 결과가 리턴되는지를 나타냅니다. 여기서는 상태 변수인 greeting
의 문자열 데이터를 리턴하고 있습니다.
간단히 스마트 컨트랙트 코드를 솔리디티로 작성하고, 해설을 해봤습니다. 위의 코드는 스마트 컨트랙트를 설명하기 위한 코드라서, 변수에 값을 넣고 읽고 하는 내용 뿐입니다. 솔리디티는 다양한 코딩 문법을 제공하기에 훨씬 복잡한 코드를 작성할 수 있습니다. 그러나 이더리움은 스마트 컨트랙트를 실행하려면 gas비를 지불해야 하니깐, 블락체인에 탑재되는 스마트 컨트랙트 코드는 최소한으로 해야 합니다. 즉 기록으로 남겨야 하는 내용들만 코딩되어야 하는 것이죠.
좀 두서 없이 진행했는데, 다음 번에 오프라인 개발환경 구축에 대해서 설명하겠습니다. 걱정되는 것은 오프라인 환경 구축이 다소 프로그램 설치 및 설정이 필요한데 얼마나 비개발자 분들이 따라오실 수 있을까하는 것입니다.
오늘의 실습: 스마트 컨트랙트 코딩 체험을 위해 오프라인 개발환경 구축할 의지가 있나요? 없거나 두렵다면 온라인 개발환경으로는 따라올 의사가 있나요?
잘 봤습니다. 감사합니다 :)
따라하면서 개발 구현 중 입니다.
도움이 되면 좋겠습니다~
저도 배우며 개발 중입니다~