암호화폐 Cryptocurrency

Etherium Blockchain Coding Tutorial

coding art 2024. 3. 4. 16:10
728x90

 

 

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