공개 SW 솔루션설치 & 활용가이드 기타 > 블록체인 제대로배워보자 How to Use Open Source Software Open Source Software Installation & Application Guide
CONTENTS 1. 개요 2. 기능요약 3. 실행환경 4. 설치및실행 5. 기능소개 6. 활용예제 7. FAQ 8. 용어정리
- 3-1. 개요 소개 주요기능 Ethereum 은블록체인기술을기반으로스마트계약기능을구현하기위한분산컴퓨팅플랫폼 이더리움이제공하는이더 (Ether) 는비트코인과마찬가지로암호화폐의일종으로거래 이더리움의화폐단위는 ETH 로표시 가장대표적인알트코인 유연한아키텍처를채택하여단일 API 를통해데스크톱, 서버또는휴대기기에장착된하나이상의 CPU 또는 GPU 에연산배포가능 대분류 기타소분류 블록체인 라이선스형태 GNU LGPL v3 사전설치솔루션 Go, C++, Rust 실행하드웨어 특징 보안취약점 개발회사 / 커뮤니티 공식홈페이지 X86, ARM 호환프로세서, 램 1GB 이상의하드웨어 500MB 이상의디스크공간 ( 최소 256MB) 버전 1.8.17 (2018 년 10 월기준 ) 블록체인에화폐거래기록뿐아니라계약서등의추가정보를기록할수있다는점에착안하여전세계수많은사용자들이보유하고있는컴퓨팅자원을활용해분산네트워크를구성하고, 이플랫폼을이용하여 SNS, 이메일, 전자투표등다양한정보를기록하는시스템창안 취약점 ID : CVE-2018-12018 심각도 : 7.5 HIGH(V3) 취약점설명 : 1.8.11 이전의 Go Ethereum ( 일명 geth) 의 LES 프로토콜구현에서 GetBlockHeadersMsg 처리기는배열인덱스에대한정수 signedness 오류로인해액세스위반이발생가능, 공격자가 -1 쿼리로패킷을보내서서비스거부공격을시작가능, 취약한원격노드는즉각 EPoD (Ethereum Packet of Death) 문제와같은공격에의해문제 대응방안 : 최신패치버전사용 참고경로 : https://github.com/ethereum/go-ethereum/pull/16891 Etheeum Foundation https://ethereum.org/foundation https://www.ethereum.org/
- 4-2. 기능요약 Etherium 의주요기능 주요기능 지원여부 32 / 64 비트 OS 32 / 64 지원 ( x86 / x86_64 ), ARM Type Anaconda 설치 Source 저장소결함추적시스템언어지원지원 OS Decentralized computing, Blockchain, Cryptocurrency 지원 https://github.com/ethereum https://github.com/ethereum/go-ethereum/issues English, 중국어, 일본어, 한국어 Linux, Windows, macos, POSIX, Raspbian
- 5-3. 실행환경 하드웨어제약이거의없음 다양한개발언어별클라이언트지원 Client Go-Ethereum Parity Cpp-Ethereum Pyehapp Ehereumjs-lib Etherum( j) Ruby-Ethereum ehereumh Language go Rust C++ Python Javascript Java Ruby Haskell
- 6-4. 설치및실행 세부목차 4.1 설치이미지준비 4.2 설치 4.3 초기설정및계정설정 4.4 설치진행 4.5 설치완료
- 7-4. 설치및실행 4.1 설치이미지준비 실제개발자들은리눅스등의환경을사용할수있겠지만, 가장쉽게접근할수있는것이윈도우환경에서설치임 Geth 파일을다운로드, 다운로드는이더리움다운로드웹사이트이용 - 이더리움다운로드 : https://geth.ethereum.org/downloads/
- 8-4. 설치및실행 4.2 설치 [Geth 1.8.17 for Windows] 다운로드 압축파일형태이므로실행시폴더를작업하기쉬운곳으로위치하면좋음 D:\Geth\ 폴더안에압축풀기 압축을풀면여러실행파일들이 Geth 폴더안에생성되는것확인
- 9-4. 설치및실행 4.3 초기설정및계정설정 (1/2) 초기설정은진행하지않아도되지만, 설정을원할경우 genesis.json 파일을만들어초기값을 넣을수있음 Geth 1.8.17 버전의 genesis.json 파일의내용은아래와같음
- 10-4. 설치및실행 4.3 초기설정및계정설정 (2/2) 설정파일은버전마다조금씩다르기때문에 github.com 등에서찾음 Genesis.json 파일에저장한후 사용하고자하는데이터폴더에넣어두고아래와같은명령어로초기화시킴 - d:\geth\geth datadir D:\Geth init d:\geth\genesis.json
- 11-4. 설치및실행 4.4 설치실행 (1/3) 정상적으로초기화되었다면 d:\geth 폴더안에 geth, keystone 등의폴더가생성 Geth 실행 - d:\geth\geth networkid 1185 nodiscover maxpeers 0 datadir d:\geth console
- 12-4. 설치및실행 4.4 설치실행 (2/3) 각명령어는아래와같은의미를가짐 - networkid 1185 : 네트워크를식별할수있는 id의생성으로, 0~3을제외한임의의정수를사용, 여기서는 1185라는숫자를씀. 각자다른숫자를이용해테스트 - nodiscover : 생성자의노드를다른노드에서검색할수없게하는옵션 - maxpeers 0 : 생성자의노드에연결할수있는노드의수임, 0을지정하면다른노드와연결하지않음 - datadir d:\geth : 데이터폴더를지정하는것으로, 지정하지않으면기본폴더사용 - console : 실행후자바스크립트콘솔기동
- 13-4. 설치및실행 4.4 설치실행 (3/3) 명령어를입력한후 > 표시의프롬프트가떴다면정상적으로실행된것임 계정 (account) 생성 계정에는 EOA(Externally Owned Account) 와 Contract 두가지종류가존재 EOA는일반계정으로 Ether를송금하거나계약을실행할수있음 Contract 계정은계약을블록체인에배포할때만들어지는계정으로블록체인에존재하며, 다른계정으로메시지를수신해코드를실행할수있음 EOA 계정을만들때는 personal.newaccount( 비밀번호 ) 명령어사용 - personal.newaccount( pw0001 )
- 14-4. 설치및실행 4.4 설치완료 exit 명령어로콘솔을빠져나올수있으며, Geth 프로세스도함께종료 D:\Geth 폴더로이동하여확인해보면 keystore 폴더안에 2 개의파일이생성된것확인
- 15-5. 기능소개 세부목차 5.1 채굴 5.2 송금 5.3 수수료
- 16-5. 기능소개 5.1 채굴 (1/4) Geth를구동, 지난번에했던방법과동일하게구동하며, 대신 log를남기는명령어추가 - 로그를남기는명령어로실행하지않으면, 채굴중그내용이모두화면에표시되기때문에추가작업을하기에다소번거로울수있음 - >d:\geth\geth networkid1185 nodiscover maxpeers0 datadird:\gethconsole 2>> d:\geth\geth.log
- 17-5. 기능소개 5.1 채굴 (2/4) 채굴을했을때보상받는계정을 Etherbase 라고하며, 이것은기본적으로첫번째생성된 계정으로지정되고, eth.coinbase 명령어로확인가능 > eth.coinbase 물론, miner.setetherbase 명령어로계정의변경도가능하니참고, 계정을만들었으니, 채굴전에잔액을확인하는방법먼저알아두는것이좋음 잔액확인은 eth.getbalance() 함수로가능, 현재잔액이없으므로 0으로확인 > eth.getbalance(eth.accounts[0]) 0
5. 기능소개 5.1 채굴 (3/4) 채굴은 miner.start( 쓰레드수 ) 로시작, 쓰레드수는실행하는쓰레드의개수를입력하면되고, 이번에는하나의쓰레드만가동 > miner.start(1) null 채굴중인내용은시작할때지정한 geth.log 파일을통해서확인할수있고, eth.mining 명령으로실행중인지확인, 또 eth.hashrate 와 eth.blocknumber 등의명령어로진행된 채굴상황을볼수있음 > eth.mining true > eth.hashrate 57032 > eth.blocknumber 166-18 -
5. 기능소개 5.1 채굴 (4/4) 블록이생성되었다면 miner.stop() 명령어로채굴을중지한후, 잔액확인 eth.getbalance() 명령을실행하면 wei 단위로표시되기때문에엄청난잔액이있는것처럼 보일것임 1ether 는 10 의 18 승 wei 임 이것을 ether 로보기위해서는 web3.fromwei() 명령어이용 현재채굴로받을수있는보상은 1 블록에 5ether 임 채굴을중단할때까지블록의길이가 178 이었으므로 178 5=890 이되는것임 > eth.getbalance(eth.accounts[0]) 890000000000000000000 > web3.fromwei(eth.getbalance(eth.accounts[0]), ether ) 890 > eth.blocknumber 178-19 -
- 20-5. 기능소개 5.2 송금 (1/3) 송금명령어는 eth.sendtransaction() 명령어로가능, 하지만실행하면오류가발생 다음명령어를실행해, accounts[0] 에서 accounts[1] 으로 10ether 송금 > eth.sendtransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.towei(10, ether )})
- 21-5. 기능소개 5.2 송금 (2/3) 오류가발생하는이유는송금에는수수료가발생하기때문이며, 실수로다른계정에서송금하는것을방지하기위해오류를만드는것임 이럴때는계정의잠금을풀고송금을진행할수있음 계정잠금을푸는명령어는아래와같음 > personal.unlockaccount(eth.accounts[0], pw0001 ) unlockaccount() 함수의변수는첫번째가계정, 두번째가그계정의비밀번호 계정만입력하게되면암호입력창이나타나입력 잠금해제는보통 300초동안유지되며, 필요에따라마지막에추가변수 ( 초단위 ) 를입력하여해제시간조절
- 22-5. 기능소개 5.2 송금 (3/3) 잠금을해제한후송금명령어를다시입력하면트랜잭션 ID가화면에표시되고송금진행 하지만, 현재상황에서실제 accounts[1] 에는잔액이확인되지않음 - 그것은아직블록체인에송금내역이기록되지않았기때문임 대신, 아직보류중인트랜잭션을확인하게되면송금된내역을확인할수있음, 보류중인트랜잭션은아래의명령어로확인가능 > eth.pendingtransactions
- 23-5. 기능소개 5.3 수수료 (1/3) account[1] 에서 account[2] 로 5 이더를전송하는작업진행 Account[2] 가없다면먼저, personal.newaccount() 명령어를통해생성 먼저 account[1] 의잠금을해제하고, sendtransaction() 을통해 5 이더보냄 그후, miner.start(1) 로블록을생성하면트랜잭션이처리됨
- 24-5. 기능소개 5.3 수수료 (2/3) 작업후각 account의잔고를확인해보면, account[2] 에 5 이더가들어간것확인 하지만, account[1] 에는잔고가 4.999622 이더가남아있는것확인 이것은송금이발생된후에수수료인 gas가보낸계정에서자동출금되었기때문임 gas의양을확인하기위해 gettransaction() 명령어로확인 > eth.gettransaction( 0x8a3f29782c109c92335bcda2ac9763eb9d1506c54c463d094ce35a65639d6249 )
- 25-5. 기능소개 5.3 수수료 (3/3) 트랜잭션 ID를입력하여결과값을확인하면 gas와 gasprice 값이표시됨 gas의값은지불할수있는최대수수료를의미하고, 실제지불한 gas는아님 실제지불한 gas는잔액의차이를 gasprice(wei 단위 ) 로나눈값임 그러므로현재지불한 gas는아래의공식으로계산됨 - 잔액의차액은 318,000,000,000,000 wei - 지불한수수료 = 318,000,000,000,000 / 18,000,000,000 = 17,667 gas - 트랜잭션에표시한 90,000 gas에비해서적은양이수수료로사용된것확인
- 26-6. 활용예제 세부목차 6.1 Smart Contract 환경 6.2 개발및배포 6.3 가나슈설치 6.4 가나슈실행 6.5 Remix 접속 6.6 스마트컨트랙트예제실행
- 27-6. 활용예제 6.1 Smart Contract 환경 개발도구설명 - IDE 통합개발환경이라고하며개발하는언어에따라서사용하는 IDE가달라짐. C/C++ 의경우에는 Visual Studio, Java는 Eclipse, IntelliJ IDEA, Python PyCharm 등여러가지 IDE가존재함. 윈도우상에설치해서사용하는 IDE가있는반면그냥웹브라우저상에서동작하는 IDE들도존재함. 우리는우선별도의설치없이사용할수있는 Online IDE인 Remix 사용 - Ethereum Node / Network 보통은 Geth, Parity 등이용해서블록을모두동기화시키고실제이더리움메인 / 테스트네트워크에접속해서진행. 하지만블록을동기화만해도 2~3일정도걸리고 ( 약한달전제가동기화시킨기준 ), 블록을채굴하기까지기다려야되는등개발중에불편한점이많음. 그래서개발중에는 Ganache와같은가상혹은프라이빗네트워크상에서스마트컨트랙트구동해보고테스트넷을거쳐메인넷에올라가게됨
- 28-6. 활용예제 6.2 개발및배포 개발및배포과정 - 이더리움네트워크개발은개발용 testrpc 에서개발하고검증 (TestNet) 을한후시스템이어느정도 안정화되었다면 MainNet 으로서비스함 * TestRPC -> TestNet -> MainNet * TestRPC : 개발을위한이더리움개발네트워크를구성하고개발하는과정 * TestNet : 개발완료한후 MainNet과동일한환경에서테스트하는과정 * MainNet : 실제서비스에사용할수있도록배포하는과정
- 29-6. 활용예제 6.3 가나슈설치 (1/3) 가상의이더리움네트워크를생성해서스마트컨트랙트를실행할수있도록해주는프로그램, 이런가상환경을 TestRPC라고함 Ganache 다운로드페이지 (http://truffleframework.com/ganache/ ) 에접속해서다운로드를받고설치
- 30-6. 활용예제 6.4 가나슈실행 (2/3) 아이콘을더블클릭해서실행을하면아래와같은화면출력
- 31-6. 활용예제 6.4 가나슈실행 (3/3) 화면에대해서간략히설명함 현재가상의이더리움네트워크가운영되고있음 해당네트워크에접속하려면 http://127.0.0.1:7545로접속 10개의가상계정에는각각 100 이더의잔액이충전되어있음 여기까지하면이더리움네트워크는준비완료
- 32-6. 활용예제 6.5 Remix 접속 (1/7) 웹브라우저 (Chrome 또는 Firefox 추천 ) 를실행 주소창에 https://remix.ethereum.org 를입력 - 개발을위해서직접컴파일러를설치하거나 Ethreum Studio를설치하는등여러개발도구들이있으나 Remix는욉브라우저를통해서항상최신버전을사용할수있기때문에편리함 접속이되면아래와같은기본화면출력
- 33-6. 활용예제 6.5 Remix 접속 (2/7) Compile 탭 - Auto Compile 옵션체크
- 34-6. 활용예제 6.5 Remix 접속 (3/7) Settings 탭 - Solidity 버전을선택할수있는데, 뭔가안정적으로보이는버전선택 ( 아직도활발하게개발중인언어라서버전마다추가 / 삭제되는기능들이꽤많이있음 )
- 35-6. 활용예제 6.5 Remix 접속 (4/7) Run 탭 - 아까띄워놓았던 Ganache 와연결을해야함 - Environment 에서 Web3 Provider 를선택
- 36-6. 활용예제 6.5 Remix 접속 (5/7) 아래와같은확인창이뜨는데 OK 클릭
- 37-6. 활용예제 6.5 Remix 접속 (6/7) 주소를입력하는창출력 Ganache 접속을위한주소 http://127.0.0.1:7545 입력 ( 기본적으로 localhost 는 127.0.0.1 로치환, 만약접속이안되시면 127.0.0.1 로직접입력 )
- 38-6. 활용예제 6.5 Remix 접속 (7/7) 정상적으로접속이되었다면 Account 부분에변화가생김 Ganache 에서봤던 10 개의계정이나타나게됨
- 39-6. 활용예제 6.6 스마트컨트랙트예제실행 (1/10) 컨트랙트작성 - 샘플로열려있는 ballot.sol 창을닫고 + 버튼을눌러서새창을생성, 파일이름은 simple_storage.sol 로 지정하고 OK 클릭
- 40-6. 활용예제 6.6 스마트컨트랙트예제실행 (2/10) 새로만들어진창에아래코드를붙여넣음
- 41-6. 활용예제 6.6 스마트컨트랙트예제실행 (3/10) 위의코드는스마트컨트랙트개발의 Hello World! 와같은코드 - solidity 0.4.0 버전을기준으로작성 - SimpleStorage라는컨트랙트한개포함 - storeddata라는상태변수선언 - set을통해서값저장 - get을통해서저장된값확인
- 42-6. 활용예제 6.6 스마트컨트랙트예제실행 (4/10) 컨트랙트배포 - 코드를붙여넣기한순간아까지정한자동컴파일옵션때문에자동으로소스가컴파일되었을것임 - 컴파일이완료되면포함하고있는컨트랙트의이름을오른쪽패널에표시
- 43-6. 활용예제 6.6 스마트컨트랙트예제실행 (5/10) SimpleStorage 컨트랙트가컴파일되어있는것확인 Deploy 버튼을누르기전에 Ganache 를다시한번살펴봄 - Current Block 에 0 이라고표시된게보임 이상태에서 Deploy 버튼을클릭 - Deploy 가되면오른쪽패널아래새로운버튼들이생김
- 44-6. 활용예제 6.6 스마트컨트랙트예제실행 (6/10) Ganache의 Current Block를보면 1로바뀐것확인가능 - Deploy와동시에 transaction을 Ganache 가상네트워크에전송했고, 채굴이일어나서블록이 1개생성된것임 - Ganche Blocks 탭에서자세한내용확인 - 블록이하나더생성
- 45-6. 활용예제 6.6 스마트컨트랙트예제실행 (7/10) Transaction 을눌러서들어가면방금 Deploy 를하면서발생시킨 transaction 이들어있음
- 46-6. 활용예제 6.6 스마트컨트랙트예제실행 (8/10) 컨트랙트실행 - set과 get 버튼이있는데, set은상태변수에값을저장 " 쓰기 " 명령이고 get은상태변수의값을불러오는 " 읽기 " 명령 - 배포된상태에서 get 버튼을눌러서상태변수값확인
- 47-6. 활용예제 6.6 스마트컨트랙트예제실행 (9/10) 상태변수의초기값은 0 으로세팅되어있음 - 그러면다음으로 set 옆에입력간에원하는숫자를입력하고 set 은누른후다시 get 클릭
- 48-6. 활용예제 6.6 스마트컨트랙트예제실행 (10/10) 값이변한것확인 - 지금은 Remix 환경의함수실행버튼을통해서컨트랙트의함수를실행하지만, web3.js를이용해서실제웹페이지상에서실행할수있도록구현을하게되면그게바로 DApp이됨 - 추가로 Ganache를한번다시확인해보시면, 블록이하나더채굴된것을확인
- 49-7. FAQ Q 이더리움은채굴은어느정도시간이걸리나요? A 이더리움은대략 15 초에한개의블록이나오고있으며, 이블록에는많으 면 200 개정도의거래 ( 또는스마트컨트랙트 ) 를수용할수있다. Q Ethereum 의목적은? A 분산애플리케이션제작을위한대체프로토콜을만드는것이다. 대규모분산애플리케이션에유용할것이라생각되는다른종류의제작기법을제공하며, 빠른개발시간, 작고드물게사용되는애플리케이션을위한보안, 다른애플리케이션과의효율적인상호작용이중요한상황에특히주안점을두고있다.
- 50-8. 용어정리 용어이더리움스마트컨트랙트 GPL solidity 이더리움가상머신분산애플리케이션 DAO 비탈릭부테린이만든암호화화폐 설명 블록체인에기록된코드에의해서특정조건이만족하면정해진행동이자동으로실행 GNU General Public License 의약자. 라이선스의종류중하나. 소스의취득, 수정, 배포, 공개가자유로우나최종배포시 GPL 라이선스를따라야함. 수정배포시자체개발한소스도공개해야함 이더리움에서가장많이사용되는스마트컨트랙트를위한자동언어 스마트컨트랙트를실행하는장치 거래나결제뿐아니라계약서, SNS, 이메일, 전자투표등다양한애플리케이션을투명하게운영할수있게확장성제공 Decentralized Autonomous Organization, 탈중앙화된자율조직에서따온말로어떤조직도소유하지않고자율적으로합의하의프로세스가실행되며분산화된시스템
Open Source Software Installation & Application Guide 이저작물은크리에이티브커먼즈 [ 저작자표시 비영리 동일조건변경허락 2. 0 대한민국라이선스 ] 에따라이용하실수있습니다.