Ethereum 블록 체인과 상호 작용하고 Python 및 SQL로 데이터베이스를 만드는 방법

블록 체인에 대한 입문 워크숍은 종종 P2P 네트워크와 은행 원장에 대한 소화하기 쉬운 이야기로 시작한 다음 스마트 계약 코딩으로 바로 넘어갑니다. 대신 정글로 들어가는 것을 상상하고 Ethereum 블록 체인을 방금 공부하려는 이상한 생물이라고 생각하십시오. 오늘 우리는 생물체를 관찰하고 상호 작용하며 생물체에 대한 모든 데이터를 중앙 저장소에 모아서 사용할 것입니다.

첫 만남을위한 준비

먼저 web3py를 설치해야합니다. Web3py는 Ethereum 블록 체인과 연결하기위한 Python 라이브러리입니다. 미리 알아야 할 것은 데이터를 다운로드 할 수있는 중앙 관리 시스템이 없다는 것입니다. 서로 리소스를 공유하는 상호 연결된 노드 ( "피어")는 확인 된 데이터 사본 (또는 그 부분)을 저장합니다. 네트워크는 Ethereum 프로토콜을 실행하는데,이 프로토콜은 서로의 노드 및 / 또는 해당 네트워크를 통한 스마트 계약의 상호 작용 규칙을 정의합니다.

트랜잭션, 잔액, 블록 또는 아직 모르는 블록 체인에 쓰여진 모든 것에 대한 정보에 액세스하려면 프로토콜에 노드에 연결해야합니다. 노드는 지속적으로 새 데이터를 서로 공유하고 데이터를 확인하므로 1) 변경되지 않은 데이터와 2) 가장 최신 데이터를 얻을 수 있습니다.

생물체에 대한 첫 번째 접근법에서 사용할 수있는 두 가지 기본 범주의 노드가 있습니다 : 로컬 또는 호스트. 로컬 노드는 컴퓨터에서 실행될 수 있습니다. 즉, 블록 체인을 장치에 동기화하고 스토리지를 점유하고 완료하는 데 시간이 걸리는 geth와 같은 클라이언트를 먼저 다운로드해야합니다. 첫 번째 만남의 경우 호스트 노드가 더 나은 선택입니다. 다른 사용자가 제어하지만 노드에 쉽게 연결하여 블록 체인을 가지고 놀 수 있습니다.

Infura로 이동하여 자신의 무료 계정을 만들어 호스팅 된 노드에 액세스하십시오. 완료되면 연결할 수있는 네트워크 목록 인 메인 넷 (메인 이더 리움 블록 체인)과 기본적으로 스마트 계약을 테스트하여 실수를 할 수있는 여러 테스트 넷이 표시됩니다. 값 비싼 코드를 메인 넷에 배포하기 전에이를 수정하고 수정하십시오.

첫 번째 접근법을위한 시간. Web3 오브젝트를 가져 와서 HTTP 연결을 설정하십시오.

web3에서 가져 오기 Web3
web3 = Web3 (Web3.HTTPProvider ( "https://mainnet.infura.io/your-own-personal-number"))

그리고 모두 준비되었습니다! 이제 web3 API를 사용하여 데이터 구조를 탐색 할 수 있습니다.

특정 블록에 대한 정보를 검색하는 중…

# 현재 블록 번호
>>> web3.eth.blockNumber
5658173
# 최근에 채굴 된 블록의 내용을 얻습니다
>>> web3.eth.getBlock ( '최신')

이 명령은 다음과 같은 키-값 쌍의 사전 인 AttributeDict 데이터 구조를 리턴합니다.

이 변수들 모두가 당신에게 즉시 유용하지는 않을 것입니다. 일부는 매우 기술적이며, 그 의미는 블록 체인이 실제로 어떻게 작동하는지에 대한 깊은 이해가 있어야만 의미가 있습니다. 소위 '노란 종이'에서 자세한 내용을 읽거나 당분간 건너 뛰고 이해하기 쉬운 것들과 함께 작업 할 수 있습니다.

요컨대, 블록에는 블록 헤더, 블록에 기록 된 확인 된 거래 목록 및 삼촌 목록 (블록이 너무 느려 메인 블록 체인으로 만들기는했지만 여전히 Ether에 대한 보상을받은 광부의 블록 식별자)이 포함됩니다. 그들의 계산 노력). 아래에서 각 변수의 의미가 무엇인지 읽을 수 있으며 하위 범주로 나눕니다.

일반

광업 관련

삼촌

인위적인

… 거래 및 영수증

이제 고유 식별자 (예 : 트랜잭션 해시)로 블록에서 단일 트랜잭션을 조회 할 수도 있습니다.

이전과 같이 web3py는 속성 사전을 반환합니다. 아래 표는 각 키의 약자입니다.

마지막으로 거래 영수증을 살펴볼 수도 있습니다.

거래 영수증에는 몇 가지 반복되고 새로운 항목이 포함됩니다. 새로운 것들이 아래에 설명되어 있습니다.

참고로이 표를 컴파일하기 위해 Yellow Paper 외에 다양한 추가 리소스를 포함 시켰습니다 [2, 3, 4, 5].

보시다시피 몇 가지 간단한 명령으로 이미 네트워크에 연결하고 원시 형식의 트랜잭션, 블록 또는 상태에 대한 기본 정보를 얻을 수 있습니다. 그러면 해당 데이터로 수행 할 수있는 작업에 대한 새 창이 열립니다!

데이터베이스 관리 시스템

적절한 데이터베이스에 데이터를 쓰려고 할 때 서버리스 SQLite 또는 서버 기반 MySQL, PostgreSQL 또는 Hadoop과 같은 Python 애호가를위한 관리 시스템을위한 많은 솔루션이있을 수 있습니다. 수행하려는 작업에 따라 프로젝트에 가장 적합한 옵션을 결정해야합니다. 일반적으로 다음 사항이 도움이된다는 것을 알았습니다.

  • 데이터베이스의 의도 된 크기는 얼마입니까 (즉, 단일 머신 시스템에서 처리 할 수 ​​있습니까)?
  • 항목이 자주 편집됩니까? 아니면 수정되어 있습니까?
  • 여러 당사자 / 앱이 동시에 데이터베이스에 액세스하고 편집해야합니까?

이더 리움 블록 체인은 2018 년 6 월 현재 1TB에 가까워지면서 꾸준히 성장하고 있으며, 따라서 하둡과 같은 분산 처리 시스템에는 적합하지 않습니다. 블록 체인 데이터베이스는 한 번 작성된 다음 새 항목으로 만 확장되어 이전 항목은 변경되지 않습니다. 이 데이터베이스의 의도 된 사용 사례는 한 채널에서 작성하고 다른 채널에서는 읽기 전용으로 액세스해야하므로 서버에서 실제로 실행할 필요는 없습니다. 컴퓨터에 데이터베이스를 로컬로 유지하면 SQLite와 같은 서버리스 관리 시스템을 사용하여 빠르게 읽을 수 있습니다. 파이썬에는 내장 라이브러리 sqlite3이 있으므로 새 패키지를 설치할 필요조차 없습니다.

데이터베이스 디자인

다음 단계는 데이터베이스를 설계하는 것입니다. 분석에 가장 적합한 데이터 필드를 명심하고 검색과 저장을 모두 최적화하십시오. 예를 들어 stateRoot를 사용하지 않으려는 경우 stateRoot를 완전히 건너 뛰거나 별도의 테이블에 보관할 수 있습니다. 적은 수의 열이있는 테이블을 더 빨리 검색 할 수 있으며 나중에 stateRoot에 대한 사용 사례가 있음을 알게되면 여전히 액세스 할 수 있습니다. 트랜잭션 정보와 블록 정보를 분리 할 수도 있습니다. 그렇지 않으면 타임 스탬프와 같은 블록 속성이 블록의 모든 트랜잭션에 대해 N 번 반복되어 많은 공간을 낭비합니다. 나중에 JOIN 조작을 사용하면 블록 특성과 트랜잭션을 쉽게 일치시킬 수 있습니다.

내가 디자인 한 데이터베이스는 3 개의 테이블로 구성됩니다.

  • 빠른 : 빠른 액세스 및 분석을위한 가장 관련성 높은 거래 정보
  • TX : 나머지 거래 정보
  • 블록 : 블록 별 정보.

변수의 이름 지정 규칙은 원래 web3py와 관련하여 약간 변경되어 블록 해시와 트랜잭션 해시를 "해시"라고 부르거나 "from"/ "to"를 열 이름으로 사용하는 것과 같은 모호성을 제거했습니다. SQL은 다른 의미를 가지며 프로그램을 중단시킵니다.

트랜잭션 값, 잔액 및 기타 큰 숫자는 데이터베이스에 문자열로 저장해야합니다. 그 이유는 SQLite가 최대 값 2⁶³-1 = 9223372036854775807과 함께 최대 8 바이트로 저장된 부호있는 정수만 처리 할 수 ​​있기 때문입니다. 이는 종종 wei의 트랜잭션 값 (예 : 1 ETH = 10¹⁸ wei)보다 훨씬 낮습니다.

미니 데이터베이스 구축

전체 코드는 GitHub에서 찾을 수 있습니다. 상위 스키마에 따라 블록 체인 정보를 구성하고 미리 지정된 블록 수의 데이터가 포함 된 blockchain.db 파일을 출력합니다. 그것을 테스트하려면 database.py 파일로 이동하여 쓸 블록 수에 적합한 수를 선택하십시오 (예 :

N 블록 = 10000

기본적으로 web3 객체가 Infura 엔드 포인트를 가리켜 야합니다. IPC 공급자가있는 경우 (즉, 로컬 노드) IPC 공급자로 전환 할 수 있습니다.

# 또는 VM의 노드를 통한 연결
# web3 = Web3 (Web3.IPCProvider ( '/ path-to-geth.ipc /'))

경로를 수정하십시오. 그런 다음 명령 행 python database.py에서 실행하십시오. 중단 된 위치에서 다시 시작해야 할 경우를 대비하여 마지막으로 작성된 블록 번호를 lastblock.txt 파일에 덤프합니다.

데이터베이스를 사용하는 방법

데이터베이스에 첫 번째 항목을 작성하면 ipython 쉘을 통해 해당 항목과 통신을 시작할 수 있습니다. 예를 들어,“Quick”테이블의 처음 5 행을 인쇄하려면 아래 코드를 실행할 수 있습니다.

로컬 노드와 인 퓨라

큰 데이터베이스를 구축하려면 geth를 다운로드하고 노드를 동기화해야합니다. 동기화는 3 가지 기본 모드에서 수행 할 수 있습니다.

과거 계정 상태가 필요하지 않은 경우 빠른 모드에서 노드를 동기화 할 수 있습니다 [6].

아래는이 코드가 데이터베이스에 쓰는 속도를 보여 주며, 완전히 동기화 된 노드와 로컬로 (IPC) 통신하고 Infura의 주소 (Infura)와 통신합니다. 보다시피, 거의 2 배 (100x)의 속도 향상을 얻을 수 있으므로 로컬 노드에서이 코드를 실행하는 것이 좋습니다.

블록 2000000과 2000400 사이에 10 개의 트랜잭션 블록을 작성하는 데 걸리는 시간입니다. 시간은 로그 스케일 (10⁰ = 1, 10¹ = 10 등)입니다.

개요

이제 블록 체인에서 발생한 일에 대한 자체 로컬 데이터베이스가 확보되었으므로 탐색을 시작할 수 있습니다. 예를 들어, 창세 이후의 트랜잭션 수를 계산하고 시간의 함수로 생성되는 주소 수를 확인할 수 있습니다. 하늘은 생물에 대해 배울 수있는 한계입니다. 데이터 과학 놀이터의 무대를 마련했습니다. 계속해서 살펴 보거나 다음 게시물에서 잠재적 인 응용 프로그램을 확인하십시오.

Validity Labs의 블록 체인 분석 서비스에 관심이있는 경우 analytics@validitylabs.org에 문의하십시오.