펜과 파란 수채로 그린 연구 노트. 얇은 판을 겹겹이 쌓은 탑에 위에서 들어온 선 한 줄이 내려갈수록 흩어져 점 무더기가 된다. 옆에 그래픽카드와 곡괭이가 있다.

AI가 빠르게 좋아지는 걸 보면서 궁금해졌습니다. 사람이 오래 풀지 못한 문제도 이제는 AI가 풀 수 있을까. 그 한계를 보려고 일부러 아주 어려운 문제를 골랐습니다. 비트코인 채굴입니다.

풀릴 거라고 기대하지는 않았습니다. 이런 식으로 풀리는 문제였다면, 저보다 훨씬 좋은 컴퓨터를 가진 암호학 전공 연구자들이 진작 풀었을 겁니다. 그래서 답을 찾는 것보다 AI가 어디까지 가고 어디서 멈추는지 보는 데 목표를 두었습니다. 8월 중순부터 10월 말까지 Claude와 GPT 계열 모델을 번갈아 붙였습니다.

채굴이라는 문제

비트코인에는 약 10분마다 새 블록이 하나씩 붙습니다. 블록을 붙일 권리는 정해진 계산 문제를 가장 먼저 푼 쪽에 돌아갑니다. 블록 머리글 80바이트를 SHA-256입력을 256비트(32바이트) 값 하나로 바꾸는 해시 함수. 같은 입력은 늘 같은 값이 되지만, 입력을 1비트만 바꿔도 결과가 전혀 다르게 나옵니다. 비트코인은 이것을 두 번 겹쳐 씁니다.에 두 번 넣어 나온 수가 목표값target. 난이도에 맞춰 정해지는 기준 수로, 해시 결과가 이보다 작아야 당첨입니다. 난이도가 오르면 목표값이 작아져 해시 앞자리에 0이 더 많이 붙어야 합니다.보다 작으면 당첨입니다. 머리글에는 마음대로 바꿔도 되는 4바이트 칸인 nonce한 번 쓰고 버리는 수(number used once). 채굴자는 이 값을 바꿔 가며 해시를 다시 계산합니다. 시간, 버전, 거래 묶음 같은 머리글의 다른 값도 일부 바꿀 수 있습니다.가 있어서, 채굴자는 이 값을 바꿔 가며 해시를 계속 계산합니다.

  • 버전 4
  • 이전 블록 해시 32
  • 머클 루트 32
  • 시간 4
  • 난이도 4
  • nonce 4
  • (바이트)
963,161번 블록의 머리글 80바이트. 금색 네 칸이 nonce이고, 채굴자는 이 값을 바꿔 가며 해시를 계산합니다.

SHA-256은 결과로 입력을 짐작할 수 없게 만든 함수라서, 지금까지 알려진 방법은 하나씩 계산해 보는 것뿐입니다. 제가 찾고 싶었던 것은 그 틈이었습니다. SHA-256 전체를 깨지 않아도 됩니다. 비트코인 채굴은 입력의 모양이 거의 정해진 특수한 경우라서, 이 경우에만 통하는 부분 규칙이라도 있으면 당첨될 nonce를 무작위보다 먼저 골라낼 수 있습니다.

목표까지의 거리

10월 30일(973,783번 블록) 기준 난이도에서는 해시 한 번이 당첨될 확률이 약 6.4×1023분의 1입니다. 실험에 쓴 RTX 3090 한 대는 초당 약 33억 번 해시를 계산했는데, 이 속도로 혼자 블록 하나를 찾으려면 평균 614만 년쯤 걸립니다. 비트코인 네트워크 전체는 초당 약 1021번, 3090의 약 3,200억 배를 계산합니다.

마지막 단계에서는 목표를 숫자로 정했습니다. 30분 안에 다음 블록을 찾을 확률 0.01%, 만 번 도전하면 한 번 성공하는 정도입니다. 3090 한 대로 30분 동안 계산했을 때의 실제 확률은 약 1,077억분의 1이라, 목표를 채우려면 당첨될 nonce를 무작위로 고를 때보다 약 1,077만 배 잘 골라내야 합니다. 장기 목표로 잡은 '10분 안에 1%'는 약 32억 배가 필요합니다.

목표: 해시 앞자리 0이 16비트평균 65,536번 시도

시도
0
시간
0.01초 미만
초당 속도
0번

채굴 시작을 누르면 이 브라우저가 nonce를 바꿔 가며 해시를 계산합니다.

아직 기록이 없습니다. 목표를 1비트씩 올려 가며 돌려 보면 시도 횟수가 대략 두 배씩 늘어납니다.

8월, 통계와 머신러닝

처음에는 Claude에게 맡겼습니다. 아이디어는 Fable, 구현과 측정은 Opus, 자료 조사는 Sonnet 모델이 나눠 맡았습니다.

먼저 라운드 수를 줄일 수 있는 SHA-256 계산기를 만들었습니다. SHA-256은 같은 섞기 과정을 64번(64라운드) 되풀이합니다. 라운드를 줄이면 덜 섞인 구조가 남으니, 몇 라운드에서 규칙성이 사라지는지 재면 공략할 수 있는 범위가 보입니다. 64라운드로 돌린 결과가 표준 라이브러리와 같은지부터 확인했습니다.

라운드 16 / 64다른 비트 127 / 256

963,161번 블록 머리글의 앞 64바이트와, 거기서 비트 하나만 바꾼 값을 SHA-256에 넣고 라운드마다 내부 상태 256비트를 비교했습니다. 금색 칸이 서로 다른 비트이고, 아무 관계 없는 두 값이라면 평균 128칸이 다릅니다.
살펴본 것신호가 사라진 라운드
출력 비트 하나의 치우침2
고차 통계(비트 쌍 상관, 왈시 변환, 2차 차분 학습)4~5
SAT 솔버논리식이 참이 되는 값을 찾거나, 그런 값이 없음을 증명하는 프로그램. 여기서는 z3로 해시 계산을 논리식으로 바꿔 거꾸로 풀었습니다.로 거꾸로 풀기8부터 시간 초과

실제 블록도 봤습니다. 과거 당첨 블록 15,000개의 해시는 목표값 아래에 고르게 퍼져 있었고, 머리글의 다른 값으로 nonce를 맞히는 모델은 평균값으로 찍는 것보다도 못했습니다(R² -0.07). nonce가 몰린 구간은 있었지만 채굴 장비가 nonce를 훑는 순서에서 생긴 것으로 보였고, 해시 함수의 성질로 볼 근거는 없었습니다.

그다음은 엉뚱한 발상을 쏟아 내는 단계였습니다. Fable이 내놓은 안은 해시값을 나선이나 3차원 공간에 감아 그려 보기, 자릿수와 소수와 원주율에 엮어 보기, 주파수 분석, 물리학과 수론 등에서 빌린 관점 27가지 같은 것이었습니다. 실험할 수 있는 것은 모두 돌렸지만, 순서를 섞은 가짜 데이터와 견주는 대조 실험과 처음 보는 데이터로 다시 확인하는 홀드아웃모델을 만들 때 쓰지 않고 따로 떼어 둔 데이터. 여기서 성적이 나와야 우연이나 외운 결과가 아니라고 볼 수 있습니다.을 통과한 것은 없었습니다.

머신러닝도 다르지 않았습니다. 당첨 여부를 맞히는 분류기 다섯 종의 AUC분류기가 두 무리를 얼마나 잘 가르는지 나타내는 값. 1이면 완벽하고 0.5면 동전 던지기와 같습니다.는 0.49~0.51이었습니다. 깊은 신경망은 학습 데이터에서 1.0을 찍었지만 홀드아웃에서는 0.5로 돌아왔습니다. 답을 외웠을 뿐입니다. 해시의 비트를 0과 1 사이 연속값으로 풀어 경사 하강법으로 답을 찾아가는 방법도 1라운드에서만 통했고, 4라운드부터는 무작위보다 나을 게 없었습니다.

9월, 두 AI의 토론

9월에는 회사가 다른 두 모델을 맞붙였습니다. OpenAI의 GPT-6 Astra가 비판하고 다음 실험을 설계하면, Claude(Fable 5.1)가 바로 실험해 결과를 돌려주는 식으로 네 차례 주고받았습니다.

펜과 파란 수채로 그린 연구 노트. 긴 탁자 양쪽의 제도용 기계 팔 두 개가 격자 종이 위에 함께 표시를 하고, 가운데에 수평을 이룬 저울이 있다.

가장 쓸모 있었던 것은 서로의 과장을 잡아낸 일입니다. 8월 기록에는 '지름길 없음 확정', '학습할 수 있는 관계 0' 같은 문장이 있었습니다. Astra는 실험한 범위를 넘어선 말이라고 짚었고, 결론은 '시험한 방법에서는 이득을 찾지 못했다'로 바뀌었습니다. 앞자리 16비트 이하의 쉬운 목표에서 실패했다고 실제 목표(약 78비트)에서도 실패한다는 보장은 없다는 지적도 받아들였습니다.

반대쪽 과장도 있었습니다. Claude는 SHA-256의 메시지 확장입력 16단어를 64단어로 늘려 라운드마다 하나씩 넣는 과정.에서 비트 차이가 무작위로 만든 확장보다 훨씬 적게 퍼진다는 측정(최소 무게 466 대 1,024)을 SHA 고유의 규칙성으로 봤습니다. 그런데 비교 대상을 같은 꼴의 무작위 회전값으로 바꾸고 덧셈의 올림수까지 넣어 다시 재자 차이가 없어졌습니다(586 대 580~591). 덧셈을 선형으로 근사하면서 생긴 착시였습니다.

새로 찾았다고 생각한 성질이 오래된 결과였던 일도 있습니다. 라운드마다 바뀌는 상태값 하나를 여덟 라운드 동안 지켜보면 내부 상태 전체를 되살릴 수 있다는 관계를 찾았는데, Sonnet에게 문헌을 찾게 하니 2006~2011년 논문들에 이미 쓰이고 있었습니다.

비용을 따지는 기준도 Astra의 비판에서 나왔습니다. 후보를 골라내는 데도 계산이 드니, 후보를 줄였다고 그만큼 빨라지지는 않습니다. 해시 한 번의 비용을 1로 놓고 골라내는 비용을 c, 골라낸 뒤 남는 후보의 비율을 q, 진짜 당첨이 살아남는 비율을 α라고 하면 실제 이득은 α / (c + q)입니다. 이 식으로 따져 보니, 당첨이 없다고 증명된 구간만 버리는 방식은 증명이 공짜라고 쳐도 약 1.58배를 넘기 어려웠습니다(구간마다 당첨이 평균 하나쯤 있다고 볼 때). 실제로 z3로 어떤 구간에 당첨이 없음을 증명하는 데는 그 구간을 전부 해시해 보는 것보다 1만 배 넘게 걸렸습니다.

10월, Codex의 여덟 번

10월 29일 밤에는 Codex에게 연구를 이어서 맡겼습니다. 주 모델은 GPT-6 Astra(추론 수준 xhigh)였고, 구현과 검수에 GPT-6.1 Sol과 Terra가 붙었습니다. 계산은 RTX 3090 한 대로 했습니다. 이튿날 저녁까지 약 20시간 동안 여덟 차례 실험이 돌았습니다.

펜과 파란 수채로 그린 연구 노트. 아침 창가 책상에 뚜껑을 연 컴퓨터와 모니터가 있고, 메모지 여덟 장 중 일곱 장에는 줄이 그어져 있으며 여덟 번째는 반만 그어져 있다.
차수한 일결과
1올림수에 조건을 건 nonce 묶음으로 머리글 고르기이득 없음
217라운드로 줄인 SHA에서 목표를 맞추는 입력 직접 만들기성공, 실제 머리글로 잇지 못함
3~5실제 머리글과 64라운드로 넓히기, 정답을 심어 둔 문제로 시험이득 없음
6AsicBoost 방식의 계산 공유GPU 시간 2~5% 감소
7목표 수치화, 속임수를 걸러 내는 평가기, 문헌 점검필요 배율 약 1,077만 배
8조건부 선형 관계로 탐색 범위 줄이기줄어든 입력 0

2차는 처음으로 '된다'는 결과가 나온 실험입니다. 17라운드로 줄인 SHA-256에 32바이트를 한 번 넣는 경우에는, 앞 80비트가 0인 해시를 내는 입력을 계산으로 바로 만들 수 있었습니다. 입력 뒷부분이 정해진 덧붙임(패딩)이라 내부 상태를 거꾸로 되돌릴 수 있기 때문입니다. 이렇게 128개를 만들어 모두 검산했습니다. 그러나 18라운드에서는 직접 맞추지 못한 16비트가 무작위와 같은 비율로만 맞았고(기대 512개, 실제 535개), 만든 입력을 실제 비트코인 머리글로 이을 방법도 없었습니다. 비트코인의 두 번째 해시가 바로 32바이트를 넣는 해시라서, 만든 입력이 첫 번째 해시의 결과로 나와야 하는데 그것 자체가 256비트짜리 조건입니다.

실제 채굴 속도가 좋아진 것은 6차 하나입니다. 버전 값만 다른 머리글 두 개는 계산 일부를 함께 쓸 수 있습니다. 2016년에 공개된 AsicBoost(새 탭에서 열림)와 같은 원리이고, 원 논문은 채굴 칩에서 약 20% 빨라진다고 밝혔습니다. 3090에서 구현하니 준비해 둔 작업을 다시 쓸 때 5.4~5.5%, 머리글 준비까지 넣으면 2.1~2.2% 빨라졌습니다. 같은 일을 조금 빨리 하는 것이고, 당첨될 nonce를 고르는 것은 아닙니다.

7차에는 목표를 숫자로 정하고, 결과를 좋아 보이게 속이는 경우를 걸러 내는 평가기를 만들었습니다. 최종 해시를 미리 보고 후보를 고르면 적중률이 얼마든지 높게 나오기 때문입니다. 해시를 예측했다는 인터넷 글과 논문도 몇 편 확인했는데, 정답을 미리 참조했거나, 다른 퍼즐을 풀었거나, 64라운드에 못 미치거나, 검증할 자료가 없었습니다.

마지막 8차에서는 nonce에 버전과 시간 값까지 묶은 56비트 입력에서, 조건이 맞을 때만 성립하는 선형 관계로 탐색 범위를 줄여 보려 했습니다. 64라운드 전체에서 줄어든 입력은 0이었고, 저는 여기서 목표를 취소했습니다.

AI가 한 일과 못 한 일

두 달 반 동안 AI가 해낸 일은 적지 않습니다. 라운드를 줄인 SHA 계산기, GPU 커널, SAT 인코딩, 대조 실험을 직접 만들고 검산했습니다. 10월에는 20시간 동안 여덟 번의 실험을 설계하고 구현하고 기록까지 남겼습니다. z3로 13라운드짜리 충돌(초기값도 고를 수 있는 조건)을 만들어 검증했고, 2011년 논문에 공개된 46라운드 2차 차분 충돌 값을 검산해 재현했습니다. AsicBoost처럼 알려진 기법은 직접 구현해 실제 속도를 올렸습니다.

그러나 64라운드를 두 번 거치는 실제 채굴에서는 무작위보다 나은 규칙을 하나도 찾지 못했습니다. 새로 찾았다고 생각한 것은 오래된 결과였거나 대조군이 잘못된 것이었습니다. 혼자 둘 때는 양쪽으로 과장하기도 했습니다. 규칙을 찾았다고도 했고, 불가능이 증명됐다고도 했습니다. 다른 회사 모델에게 검토를 맡기고 나서야 둘 다 '시험한 범위에서는 이득이 없었다'로 돌아왔습니다.

마치며

예상한 대로 풀지 못했습니다. 연구자들의 기록을 보면 당연한 결과이기도 합니다. SHA-256 충돌 공격해시값이 같은 서로 다른 입력 두 개를 찾는 공격.은 2013년에 31라운드까지 간 뒤 12년 동안 늘지 않다가, 2026년에야 37라운드(새 탭에서 열림)로 늘었습니다. 해시값에서 입력을 찾는 원상 공격해시값만 보고 그 값을 내는 입력을 찾는 공격. 채굴은 목표값보다 작은 해시를 내는 입력을 찾는 일이라 이 문제를 조금 느슨하게 한 것입니다.의 최고 기록은 같은 해 나온 46~47라운드(새 탭에서 열림)인데, 이것도 실제로 돌릴 수 있는 계산량이 아닌 이론 공격입니다. 비트코인은 64라운드짜리 SHA-256을 두 번 씁니다.

  • 출력 비트 하나의 치우침이 사라짐2라운드
  • 고차 통계 신호가 사라짐4~5라운드
  • SAT 솔버로 거꾸로 풀기, 시간 초과8라운드부터
  • 목표 80비트 입력을 직접 만듦(32바이트를 한 번 해시)17라운드
  • 충돌 공격 최고 기록(2026년 논문)37라운드
  • 2차 차분 충돌(2011년 논문)46라운드
  • 원상 공격 최고 기록, 이론(2026년 논문)47라운드
  • 비트코인이 쓰는 SHA-25664라운드 × 2번
  • 이 연구
  • 논문
라운드로 본 거리. 줄마다 푸는 문제가 다릅니다(통계로 구별하기, 거꾸로 풀기, 충돌, 원상). 비트코인은 64라운드를 두 번 거칩니다.