https://ethereum.org/en/developers/tutorials/a-developers-guide-to-ethereum-part-one
이더리움을 학습하기 위해서 다음과 같이 준비하자.
① 터미널 사용이 가능해야 한다.
② 수 줄의 파이선 코드가 준비되어야 한다.
③ 가상환경을 이용할 수 있어야 한다.:아나콘다에서 가상환경을 하나 준비하거나 또는 구글 Colab에서 파일을 하나 오픈하면 가능하다.
④ pip 명령 사용이 가능해야 한다.
이더리움 시스템과 상호작용 하기위한 파이선 개발자는 이더리움 노드 컴퓨터와 간단히 연결할 수 있는 Web3.py 라이브러리를 사용하여 데이터를 보내거나 받을 수 있다.
이더리움 서버와 연결하고자 하는 이더리움 클라이언트는 IPC, http, web socket 에 의해 네트워킹이 가능하다.
Web3.py 는 공급자에 해당하는 이 네트워킹 연결 옵션들을 참조한다.
Web3.py 가 제대로 네트워크로 연결이 되면 블록체인과 상호작용이 가능해진다.
Web3.py를 사용하여 아래와 같이 블록체인 데이터를 읽고 거래 데이터를 전송해 보자.
1 | # read block data: w3.eth.get_block('latest') # send a transaction: w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...}) |
Colab 에서 interactive python 즉 IPython 명령을 사용하여 [1]부터 시작되는 터미널을 구동하자.
2 | !pip install ipython |
3 | !pip install web3 |
web3 구동에서 실제로 이더리움 시스템을 연결하기 전에 현재 개발 중인 tester 네트워크를 사용하도록 하자. 이는 이더리움 업그레이드 6단계 계획에서 단계별로 실제 업그레이드 된 시스템을 사용하기 전에 반드시 거쳐야 하는 단계이다.
4 | !pip install ‘web3[tester]’ |
Colab에서 터미널을 열도록 ipython 명령을 실행하면 프롬프트 In[1]: 이 셀에 출력된다.
5 | !ipyton In[1]: |
Web3 라이브러리를 import 하자.
6 | In[1]: from web3 import Web3 |
화폐의 denomination 표현을 도입하자. 이는 블록 체인 사용 후 가스 값을 치룰 때 필요한 잔돈의 단위로 사용하면 편리하다.
(※ 이더리움과는 달리 비트코인의 경우는 1 BTC = 1 백만 사토시로 정의된다.)
7 | In[2]: Web3.to_wei(1, ‘ether’) Out[2]: 1000000000000000000 |
HTTP 공급자를 사용하여 이더리움 노드와 연결하는 Geth 예제 하나를 살펴보자.
① Geth를 다운로드한 후에 하나의 터미널을 오픈 후 Geth를 시작하여 네트워크 sync를 기다린다.
② Web3.py 가 노드로 하여금 HTTP를 통해 localhost:8545.w3 = Web3(Web3.HTTPProvider(‘http://127.0.0.1:8545’)) 에 request를 보내 연결되도록 요구한다.
③ 노드와 상호작용을 위해서 w3 instance를 사용한다.
이러한 과정이 노드와 작업하는 방법이긴 하지만 sync 과정에 시간이 걸린다. 만약 개발 환경을 원한다면 이러한 것은 불필요할 수도 있다.
Web3.py 는 이러한 목적 달성을 위한 4번째 공급자 즉 EtheriumTesterProvider 에 노출이 가능하다. 이 공급자는 좀 느슨하게 허용되어 있으면서 아울러 작동시켜 볼 수 있는 가짜 화폐를 가진 시뮬레이트 된 이더리움 노드와 링크된다.
이 시뮬레이트 된 노드를 eth-tester 이라한다.
아래와 같이 실행해 보자.
8 | In[4]: w3 = Web3.(Web3.EtheriumTesterProvider()) |
연결되었는지 확인해 보자.
8 | In[5]: w3.is_connected Out[5]: True |
이해의 편의를 위해서 tester ether와 함께 로딩된 EtheriumTesterProvider가 생성한 계좌 예들을 살펴보자.
9 | In[6]: w3.eth.accounts Out[6: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF', '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] |
w3.eth.accounts 명령을 실행하면 ‘0x’ 즉 헥사로 시작되는 10개의 문자열들로 구성되는 리스트 데이터를 볼 수 있을 것이다. 각 문자열은 공개 주소를 나타내며 이는 당신의 수표 계좌의 주인인 수표 계좌와 유사하다. 이 공개 주소는 당신의 게좌에 송금을 원하는 사람들에게 이 주소를 공개적으로 제공할 수 있을 것이다.
tester ether와 함께 로딩된 계좌들 중의 첫 번쩨 계좌에 얼마가 예치되어 있는지 확인을 위해 출력해 보자.
10 | In[7]: w3.eth.get_balance(w3.eth.accounts[0]) Out[7]: 1000000000000000000000000 |
wei 화페 단위 사용에 따라 지나치게 많은 ‘0’이 나타나므로 숫자를 읽기가 쉽지 않다. 따라서 denomination을 통해서 화폐 단위를 ‘ether’로 바꾸어 출력해 보자.
아래와 같이 1백만 이더리움으로 출력된다.
11 | In[8]: w3.from_wei(1000000000000000000000000, ‘ether’) Out[8]: Decimal('1000000') |
시뮬레이트 된 블록체인의 상태 하나를 찍어 출력해 보자. 많은 정보가 출력되어 반환된다. 현재 블록은 ‘0’번이다. 12초에 한번씩 새 블록을 추가하는 실제의 이더리움 네트워크와는 달리 현재의 ‘tester provider’에서는 어떤 작업을 실행시킬 때까지 시물레이션 시스템은 기다리면서 대기한다.
12 | In[9]: w3.eth.get_block('latest') Out[9]: AttributeDict({ 'number': 0, 'hash': HexBytes('0x9469878...'), 'parentHash': HexBytes('0x0000000...'), ... 'transactions': [] }) |
이 계좌를 중심으로 연결된 거래 즉 송금이 일어날 때까지 첫 번째 블록 ‘0th’상태에 해당한다. 약간의 테스트용 이더를 한 계좌에서 다른 계좌로 송금을 해보자. ‘gas’는 노드 네트워크 사용 요금에 해당한다.
13 | In[10]: tx_hash = w3.eth.send_transaction({ 'from': w3.eth.accounts[0], 'to': w3.eth.accounts[1], 'value': w3.to_wei(3, 'ether'), 'gas': 21000 }) |
① 거래내용을 제출하고 거래 해쉬가 생성될깨 까지 네트워크를 유지한다. 거래내용을 포함하는 블록이 생성되어 브로드캐스팅 될 때까지 거래는 tx_hash = w3.eth.send_transaction({ _ }) 에 남아있게 된다.
② 블록 거래 증빙을 기다린다: w3.eth.wait_for_transaction_receipt(tx_hash)
③ 거래가 성공되었음을 확인하자: w3.eth.get_transaction(tx_hash)
14 | In[11]: w3.eth.get_transaction(tx_hash) Out[11]: AttributeDict({ 'hash': HexBytes('0x15e9fb95dc39...'), 'blockNumber': 1, 'transactionIndex': 0, 'from': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', 'to': '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF', 'value': 3000000000000000000, ... }) |
거래내용은 블록 ‘0’번 즉 첫 번째 블록에 기록이 되었음을 알 수 있다. ‘ga’ 비용은 이더로 지정하였는데 현재 ‘wei’ 단위로 변환되었다.
이와 같은 거래의 블록체인 코딩 성공 여부는 사용된 2개 계좌의 잔액 체크에 의해서도 확인이 가능하다. 화폐 단위를 잘 살펴보면 1백만 이더에서 1백만3 이더로 잔액이 변경되었음을 알 수 있다.
15 | In [12]: w3.eth.get_balance(w3.eth.accounts[0]) Out[12]: 999996999979000000000000 In [13]: w3.eth.get_balance(w3.eth.accounts[1]) Out[13]: 1000003000000000000000000 |
'암호화폐 Cryptocurrency' 카테고리의 다른 글
fastquant 라이브러리 및 backtest 명령에 의한 암호화폐 매수매도 전략 결정 (0) | 2021.07.21 |
---|