Thank You Google : Google의 BigQuery에서 Bitcoin을 채굴하는 방법

SQL의 힘을 활용하여 클라우드에서 암호 화폐 채굴

저는 Google BigQuery를 좋아합니다. 확장 성이 뛰어난 관리 형 데이터 플랫폼이므로 엄청난 양의 데이터를 매우 빠르게 쿼리 할 수 ​​있습니다 (예 : 30 초 이내에 4TB!). 내 프로젝트 (예 : Google 어시스턴트를위한 스페인어 수업 활동)를 정기적으로 사용하고 있으며 항상 높은 성능에 놀랐습니다.

지난주에 우리는 비트 코인 기반 기술인 t h e Blockchain에 대한 Dev.IL Meetup을 조직했으며, Asaf Nadler의 강연 중 하나가 기술의이면에있는 메커니즘을 설명하는 것에 놀랐습니다. 그것은 비트 코인을 틱하게 만듭니다 (여기에서 강연을 시청하는 것은 자유롭지 만 공정한 경고는 히브리어로되어 있습니다 :-). 모임이 끝난 후 집에 돌아 갔을 때 전날 작성한 몇 가지 분석 쿼리를 사용하여 BigQuery 콘솔을 열었습니다.이 아이디어를 얻었습니다. 비트 코인 채굴에 BigQuery를 사용할 수 있다면 어떨까요? 가능할까요? 비용 효율적일 수 있습니까? BigQuery의 인상적인 확장 성을 감안할 때 좋은 일치가 될 것 같았습니다.

( 스포일러 : 그랬습니다! 초당 최대 25 기가 해시, 무료이며 매우 재미 있습니다. 방법을 알아 보려면 계속 읽어보세요…)

매우 흥미로워 서 시도해보기로했습니다. 저는 한동안 블록 체인 기술을 실험하는 데 관심이 있었는데, 그렇게 할 수있는 좋은 기회였습니다. 많은 기사를 읽고 몇 시간의 작업이 필요했지만 성공했습니다! (또는 오히려 개념 증명 성공;-)

데이터 분석 기계를 비트 코인 채굴 기계로 바꾸는 여정을 여러분과 공유하면 흥미로울 것이라고 생각했습니다. 결과에 상당히 놀랐습니다. 그리고 당신도 그렇게 될 것입니다!

하지만 가장 먼저해야 할 일 : 비트 코인 채굴 작동 방식에 대한 빠른 개요를 살펴 보겠습니다.

간단히 비트 코인 채굴

비트 코인 채굴은 계산적으로 어려운 수학적 문제를 해결하는 것과 관련이 있다고 들었을 것입니다. 이것은 사실입니다. 비트 코인 시스템은 거래 (즉, 사용자간에 돈을 이체)로 구성되며 이러한 거래는 다음과 같은 공개 원장에 등록됩니다. 블록 체인. 이름에서 알 수 있듯이 블록 체인은 거래 데이터 블록의 연결 목록입니다.

비트 코인 채굴은 본질적으로 유효한 다음 블록을 찾는 것을 포함하며, 그러면 채굴 자에게 상을줍니다. 현재는 발견 한 모든 블록에 대해 12.5BTC입니다.

각 블록은 80 바이트 헤더와 트랜잭션 목록의 두 부분으로 구성됩니다. 헤더에는 이전 블록의 식별자 (즉, 이전 블록 헤더의 해시)와 트랜잭션 목록의 SHA256 해시 및 기타 정보가 포함됩니다. 채굴 자로서 기본적으로 SHA256 해시 기능을 사용하여 두 번 해시 할 때 블록의 헤더가 주어진 숫자 ( “난이도”라고도 함)보다 작은 지 또는 대상을 찾는 것이 얼마나 어려운지 확인해야합니다. 번호 (즉, 유효한 다음 블록)

비트 코인 블록은 10 분마다 약 1 블록의 비율로 채굴됩니다. 속도를 일정하게 유지하기 위해 난이도는 2016 년 블록 (대략 2 주마다)마다 자동으로 조정되므로 채굴자가 프로세스에 투입하는 총 컴퓨팅 파워에 어느 정도 비례합니다.

마이닝은 기본적으로 해시가 주어진 수의 0으로 시작하는 헤더를 찾을 때까지 (또는 다르게 표현하기 위해) 헤더에 대해 주로 nonce 필드 (헤더의 마지막 4 바이트)에서 다른 변형을 시도하는 것을 포함합니다. 이전에 언급했듯이 일부 숫자보다 작습니다).

더 자세한 설명이 필요하면 Ken Shirriff의 비트 코인 채굴에 대한 블로그 게시물을 확인하거나 간단히 따라 가며 게시물 전체에서 언급 한 정보를 수집 할 수 있습니다.

BigQuery를 사용한 채굴

내 발자취를 따르고이 블로그의 예제를 실행하도록 초대되었습니다. 여기에 제시된 일부 쿼리는 비트 코인 채굴 프로세스의 일부와 유사 할 수 있습니다. Google Cloud Platform 무료 평가판 계정이있는 경우 해당 약관에 따라 암호 화폐 채굴에 참여할 수 없습니다. 이 게시물에 제시된 예 중 어떤 것도 실제로 암호 화폐를 채굴하지 않지만 안전하게 플레이하고 유료 Google Cloud Platform 계정을 보유하는 것이 좋습니다.이 계정은 내가 아는 한 암호 화폐 채굴을 금지하지 않습니다.

우선 순위 : 블록 헤더보기

실제로 채굴이 어떻게 이루어지는 지 살펴 보겠습니다. 비트 코인 블록 체인에서 일부 블록의 헤더를 살펴보고 해시를 직접 계산하여 어떻게 수행되는지 확인하고 BigQuery로 해싱 부분을 수행 할 수 있는지 확인합니다.

하지만 블록은 어디에서 찾을 수 있습니까?

결과적으로 BigQuery에서 전체 블록 체인을 찾을 수 있습니다. 그러나 우리의 목적을 위해 우리는 블록의 원시 바이너리 데이터를 얻을 수있는 방법을 제공하는 다른 소스를 사용할 것입니다 : blockchain.info라는 웹 사이트. 최근 블록 번호 514868 중 하나를 무작위로 선택했습니다.

블록의 해시를 클릭 한 다음 URL에 ? format = hex 를 추가하여이 링크를 생성하여이 블록의 바이너리 데이터 (16 진수 인코딩)를 가져올 수 있습니다. 블록보기는 또한 거래 및 기타 흥미로운 데이터의 전체 목록을 보여줍니다. 직접 살펴 보시길 권합니다.

하지만 지금은 헤더에 집중하겠습니다. 블록 데이터에서 처음 160 자 (처음 80 바이트)를 복사합니다.

이 비트 코인 위키 페이지는 해싱 알고리즘의 작동 방식을 설명합니다. 기본적으로이 헤더를 가져 와서 SHA256 함수를 실행 한 다음 첫 번째 실행의 결과에 대해 다시 실행해야합니다. 그 결과 블록의 해시가 발생합니다.

먼저 BigQuery에서이 작업을 수행하려면 SHA256 함수가 필요합니다. 다행히도 BigQuery 버전 2 (즉, 표준 SQ)에 도입되었습니다. 또한 이러한 16 진수 값을 실제 바이트로 변환하는 방법이 필요합니다. 다행히도 FROM_HEX라는 함수가 우리를 다루었습니다. 지금까지 훌륭합니다.

이제 실제 쿼리를 한 줄로 작성해 볼 수 있습니다.

(계속하려면 BigQuery 콘솔 에서이 쿼리를 실행할 수 있습니다. 또한 ‘기존 데이터 사용’을 선택 취소해야합니다. SQL ‘쿼리 옵션입니다. “Unrecognized function to_hex”라는 오류가 발생하면이 상자를 선택 취소하지 않았 음을 의미합니다.)

위의 쿼리를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

처음이 작업을했을 때 해시가 블록의 원래 해시와 다른 것 같아서 상당히 실망했습니다. 그러나 나는 그것이 단지 반전되었다는 것을 금방 깨달았습니다! (분명히 비트 코인 해시는 리틀 엔디안으로 저장됩니다.)

TO_HEX 를 호출하기 직전에 REVERSE 함수를 추가하는 것이 트릭이었습니다.

이는 이미 상당한 성과입니다. 이제 BigQuery에서 Bitcoin 블록에 대한 해시를 확인할 수 있다는 것을 알고 있습니다. BigQuery를 사용하여 채굴하려는 경우 전체 헤더가 없다는 점을 제외하고는 동일한 함수 집합을 사용하고 싶을 것입니다. 해시 값이 충분히 작은 유효한 헤더를 검색해야합니다.

유효한 헤더는 6 개의 필드로 구성됩니다.

마이닝은 기본적으로 nonce 에 대해 가능한 모든 조합을 시도한 다음 해시가 목표 값 미만이 될 때까지 각각의 해시를 확인합니다. 목표 값은 블록의 난이도에서 쉽게 얻을 수 있습니다.

모든 블록의 최소 난이도는 1입니다. 따라서 모든 대상은 최소 48 개의 선행 0을 갖게됩니다. 따라서 우리 블록의 난이도 번호는 3462542391191.563이므로 대상은 000000000000000000514a490000000000000000000000000000000000000000

입니다.

여기에서 현재 난이도와 목표 값을 찾을 수 있습니다 (링크를 통해 난이도와 목표 값 간의 관계에 대해 조금 더 설명 할 수 있습니다).

기본적으로이 블록에 대한 마이닝 프로세스를 재현하려면 헤더의 마지막 4 바이트 인 nonce 에 대해 모든 다른 조합을 시도해야합니다. 해시가 위의 숫자보다 작은 것을 찾았습니다.

블록 재 채굴

이 경우 이미 답을 알고 있으므로 마지막 바이트를 검색하여 작게 시작하기로 결정했습니다. 처음에는 0에서 255 사이의 모든 숫자 (해당 바이트에 대한 유효한 값)가있는 작은 테이블을 업로드하는 것에 대해 생각했지만이 테이블은 실제로 두 SQL 함수를 결합하여 모방 할 수 있음을 발견했습니다. UNNEST () GENERATE_ARRAY () :

이 지식으로 무장하여 BigQuery 내에서 마이닝 프로세스를 재현하려는 첫 번째 쿼리를 만들었습니다.

알겠습니다. 조금만 설명하겠습니다.

기본적으로 올바른 nonce 만 검색했기 때문에 헤더에서 해당 부분을 제거했습니다 (확인할 수 있습니다. 쿼리의 긴 16 진수 문자열은 길이가 152 자에 불과합니다. 76 바이트, 즉 nonce가없는 헤더). 쿼리가 찾는 것은 헤더에 추가되면 해시가 대상 번호보다 작은 4 바이트 값입니다.

이번이 첫 시도 였기 때문에 난스의 처음 3 바이트에 대해 블록에서 이미 알고있는 값을 사용했고 마지막 바이트 만 BigQuery 검색했습니다. 이것은 매력처럼 작동했으며 올바른 nonce 값을 빠르게 찾았습니다.

올바른 결과를 필터링하기 위해 WHERE 절에서 LIKE 를 사용한 이유가 궁금 할 것입니다. 이것은 단순히 목표 값보다 작은 해시를 찾고 있기 때문입니다. 목표 값이 18 개의 0으로 시작하므로 18 개의 0으로 시작하지 않는 모든 숫자를 필터링하기 만하면됩니다 (확실히 목표 값보다 큼). 즉, 오 탐지 (예 : 18 개의 0으로 시작하고 5보다 큰 숫자)가 발생할 수 있지만 수동으로 빠르게 필터링 할 수 있습니다.

이제 교활한 nonce 를 검색하는 방법을 알게되면 검색 범위를 더 많은 바이트로 빠르게 확장 할 수 있습니다.

이 쿼리가 트릭을 수행하고 3 바이트를 찾는 동안 한 가지 문제가있었습니다. 느리게 실행됩니다! 이 쿼리를 완료하는 데 약 30 초가 걸렸습니다. 4 바이트를 모두 검색하면이 속도로 약 2 시간이 걸립니다. 앞서 언급 한 바에 따르면 새 블록은 10 분마다 채굴되므로 결과를 찾을 때 쯤이면 이미 뒤쳐져 있고 관련성이 없을 것입니다.

조금 실망 스러웠습니다 (BigQuery의 ‘고 확장 성’약속은 어떻게 되었나요?). 그래서 더 자세히 살펴보고 개선 할 수있는 일이 있는지 알아보기로했습니다.

이전 BigQuery 경험에서 여러 테이블을 조인하면 쿼리가 훨씬 더 오래 실행되는 비용이 많이 든다는 것을 기억했습니다. 더 큰 테이블을 생성하여 (즉, GENERATE_ARRAY 에게 더 많은 숫자를 생성하도록 지시) 조인 단계를 제거하려고했지만 몇 번의 시행 착오 끝에 테이블의 최대 크기는 여전히 약 1 인 것 같았습니다. 백만 개의 행, 즉 여전히 테이블을 조인하거나 매번 1 백만 개의 해시 만 검색해야 함을 의미합니다 (내 컴퓨터의 CPU가 1 초 이내에이 작업을 수행 할 수 있기 때문에 다소 의미가 없습니다).

따라서 BigQuery로 Bitcoin을 채굴하는 것이 가능한 것처럼 보였지만 실용적이지 않았습니다.

그래도 포기하는 것을별로 좋아하지 않아서 몇 가지 방법을 더 시도했습니다. 그리고 그들 중 하나가 실제로 작동했습니다!

더 빠른 채굴

BigQuery에 방대한 테이블이 포함 된 매우 큰 공개 데이터 세트가 있다는 것을 기억했습니다. 그중 몇 개를 스캔 한 결과, 53 억 개의 행이 포함 된 하나를 찾았습니다. 이는 nonce 의 다양한 조합 수인 4,294,967,296보다 약간 높은 수치입니다. 이 표를 살펴보고 표의 각 행에 대해 다른 조합을 시도하는 쿼리를 구성 할 수 있다면 가능한 모든 조합을 다룰 수있을 것입니다.

ROW_NUMBER () OVER () SQL 함수를 사용하려고했습니다.이 함수는 현재 행 번호를 반환해야합니다 (그런 다음 각 행에 대해 다른 바이트 집합을 유도 할 수 있습니다. 행 번호), 그러나 다음 오류와 함께 빠르게 종료되었습니다.

쿼리 실행 중 리소스 초과 : 할당 된 메모리에서 쿼리를 실행할 수 없습니다.

범머! 하지만 저는 생각하기 시작했습니다. 난 그냥 난수를 시도하면 어떨까요? 결국, 일치하는 해시가 있으면 시도 횟수가 조합 수보다 많으므로 찾을 가능성이 매우 높습니다.

그래서 저는이 쿼리를 생각해 냈습니다 :

CAST (TRUNC (256 * RAND ()) AS INT64) 는 0에서 255 사이의 난수를 생성 한 다음 내부 SELECT 부분은 다음과 같은 테이블을 생성합니다. 4 개의 임의 값으로 구성된 ~ 53 억 행. 그런 다음 외부 쿼리는 실제로 충분히 낮은 해시를 생성하는 값만 얻도록합니다. 이것이 우리가 찾고있는 것입니다!

놀랍게도이 쿼리는 20.9 초 만에 반환되었으며 실제로 올바른 nonce 값을 찾았습니다 (두 번도 찾았습니다!).

이는 20 초에 거의 40 억 개의 해시 (초당 약 200 메가 해시)를 확인할 수 있음을 의미합니다. 그리 나쁘지 않습니다. GPU가 초당 약 30 ~ 60 메가 해시 (연필과 종이로 채굴하는 것은 말할 것도없이 CPU는 훨씬 적음)를 얻을 수 있다는 점을 고려하면됩니다.

분명히, 이것은 우리가 전용 채굴 하드웨어 근처에 속도면에서 접근 할 수있게 해주지 못합니다.하지만 여전히 제가 가지고있는 트릭이 하나 더 있습니다…

동시성

당신이 조합론의 명사라면 nonce 에 대해 가능한 모든 값을 확인한다고해서 충분히 작은 해시를 찾을 수있는 좋은 기회가 보장되지 않는다는 것을 알았을 것입니다. 처음에는 어려운 문제입니다!).

작성 당시 목표는 대략 2¹⁸² (위의 난이도에서 목표를 계산하는 방법 참조)였습니다. 이는 가능한 총 2²⁵⁶ 중 2¹⁸² 개의 유효한 해시 조합이 있음을 의미합니다. 즉, 임의의 해시가 발생할 가능성이 있습니다. 목표보다 낮다는 것은 2⁷⁴의 1입니다.

이것은 기본적으로 아무런 만 변경하면 2³² 가능성을 확인하고 실제로 원하는 해시를 찾을 수있는 기회가 매우 적다는 것을 의미합니다. 따라서 재생할 바이트가 더 필요합니다.

헤더 구조를 다시 살펴보면 time 필드를 약간 변경할 수 있음을 알 수 있습니다 (시간이 약간 벗어난 경우 다른 노드는 여전히 블록을 수락합니다). 블록의 트랜잭션 목록에서 무언가를 변경하면 머클 루트 해시 필드에 대해 완전히 다른 값이됩니다.

트랜잭션 목록을 변경하고 다른 머클 해시를 생성하는 한 가지 방법은 최대 100 바이트를 포함 할 수있는 extraNonce라고하는 첫 번째 트랜잭션에 추가 페이로드를 추가하는 것입니다. 또 다른 방법은 블록에 포함될 다른 트랜잭션 세트를 선택하는 것입니다.

요점은 성공적인 채굴자가되기 위해서는 nonce time 필드를 변경해야한다는 것입니다.>. 이것은 우리가 발견 한 쿼리를 매번 다른 블록 헤더로 병렬로 실행할 수 있음을 의미합니다. 하지만 BigQuery에서 허용하는 동시 쿼리는 몇 개인가요?

할당량 페이지에 따르면 최대 50 개의 동시 쿼리를 읽을 수 있으며, 이론적으로 해싱 속도가 최대 50 배까지 빨라집니다. 정말 작동합니까? 모르겠어요 시도한 적이 없습니다 현재 단일 쿼리의 최상의 결과는 초당 500 메가 해시 (소스 테이블로이 106 억 행 위키피디아 데이터 세트 사용)였습니다. 즉, 동시 쿼리가 50 개로 제한되어 이론적으로 최대 25 기가- 해시 / 초. 보통의 전용 채굴 하드웨어와 같습니다. 본질적으로 무료 라는 점을 감안하면 그리 나쁘지 않습니다.

그럼 비용은 얼마입니까?

BigQuery는 비용 효율적인 솔루션이라고 주장합니다. 지금까지 나는 그들의 확장 성 주장에 대해 이미 확신하고 있었지만 그들의 가격 구조도 나에게 놀랐다. 매우 놀랍습니다.

BigQuery의 가격 모델은 쿼리하는 데이터의 양에 따라 결정됩니다. 기본적으로 바이트 단위로 청구됩니다. 문제는 처리 능력이나 쿼리가 생성 한 중간 데이터에 대한 비용이 아니라 소스 테이블에서 읽은 바이트에 대해서만 청구한다는 것입니다.

이 경우에는 엄청난 소스 테이블을 사용하지만이를 사용하여 많은 수의 난수 조합을 생성합니다. 실제로 테이블에 대한 데이터를 읽지 않습니다.BigQuery에는 쿼리의 예상 가격 (청구될 바이트 수)을 표시하는 멋진 기능이 있습니다. 처음 1 테라 바이트는 매월 무료이며 그 이후에 쿼리하는 추가 테타 바이트 당 5 $를 지불합니다. 나쁘지 않습니다!

따라서 빅 쿼리에 대한 BigQuery 추정치를 확인하면 다음과 같은 결과를 얻을 수 있습니다.

기본적으로 이러한 쿼리를 원하는만큼 무료로 실행할 수 있습니다. 그들은 확실히 비용 효율성 주장에 부응합니다 (이 경우 적어도).

요약 및 결론

이것은 블록 체인이 어떻게 작동하는지 더 잘 배우기 위해 재미있는 연습으로 시작되었습니다. 시작했을 때 하드 제한 (아마도 CPU 시간 할당량 등)에 도달 할 것이라고 확신했으며,이 모든 계산 능력을 무료로 얻을 수 있다는 사실에 여전히 꽤 놀랐습니다.

내 연구에 따르면 BigQuery를 이론상 채굴 기계로 전환하는 것이 가능해야하지만 채굴을 자동화하려는 경우 수행해야 할 작업이 상당히 많습니다. 방법. 조잡한 계산에 따르면 그러한 광부가 만들어 졌다고하더라도 전 세계에서 실행되는 모든 전용 채굴 하드웨어와 경쟁 할 때 연간 약 5 달러가 될 것입니다. 그럼에도 불구하고 이제 저는 비트 코인이 SQL로 채굴 될 수 있다는 것을 알고 있습니다. 이것은 귀중합니다;-)

하지만 가장 중요한 것은이 실험이 비트 코인 채굴에 사용되는 엄청난 컴퓨팅 파워에 대한 완전히 새로운 관점을 제공했다는 것입니다. 초당 약 260 억 기가-해시를 말하는 것입니다. 즉, 지구상의 모래 알갱이 수보다 많은 2.6 * 10¹⁹입니다. 매 초. 의료 연구에이 컴퓨팅 성능의 일부만 사용하면 무엇을 얻을 수 있을지 궁금하실 것입니다…