매일 패키지를 하나씩 분석하는게 개인적인 목표였는데, 잠깐 머리도 식힐겸 오늘은 조금 다른 것을 해보았습니다. 문득 이런 생각이 들더라고요
- " 어차피 seed가 랜덤이고 1씩 증가시키며 해싱한 값을 블록 난이도 조건에 만족하는지 확인하는 건데, 1씩 증가시키는게 과연 효율적인가? 뭔가 의미있는 값을 넣어보면 더 좋지 않을까?"
- "블록 난이도와 논스값이 이미 체인에 모두 등록이 되어 있다. 거의 60만개의 데이터다"
데이터가 많으면 당연히 해보고싶어지는것. 머신러닝이죠.
그래서 오늘은 정말 초간단한 그래프를 만들어서 과연 난이도를 넣었을때 적절한 논스를 뱉어낼것인가!에 대해 실험을 해봤습니다. (사실 말도안되는거죠, 난이도를 만족시키는 논스는 여러개 존재할수도 있는데..재미로한겁니다. 재미로.)
우선 난이도와 논스 모두 64bit이라는 것에 착안해서
- 트레이닝 데이터: 블록 1번부터 1000번까지의 난이도값을 64차원 벡터로 전환.
- 트레이닝 라벨: 위 블록들의 논스
- 테스트 데이터: 최근 블록59427xx부터 한 10개정도
- 트레이닝 라벨: 위 블록들의 논스
데이터는 이더스캔에서 긁었습니다. (트레픽 미안해요! 이더스캔!)
(이런형태로 input들이 생성되겠죠?)
그다음 넷을 구성해야하는데요. input이 난이도이고 output이 논스라
가징 심플한 fully-connectd하나로 가봅니다. (블록 타임안에 연산을 끝내려면 복잡한것 다 의미없어지니까요)
차원도 64개니까 RMSE에 sigmoid로 최대한 심플하게 했습니다.
트레이닝 데이터 한 1000개 돌리고, 테스트셋 10개 실험해봤는데 당연히 하나도 안맞습니다.
벡터당 정확도가 약 0.5정도니까 이건 의미가 없죠.
60 만개짜리 데이터는 수집중에 있으니 다 모여지면 한번더 트레이닝해서 정확도를 보고 싶네요.
true가 많아지면 저는 제 구형컴퓨터로 부자가 될지도 모르겠어요!
아주 허접한 코드들입니다만, 혹시나 필요하신 분들이 있을까 해서 아래에 올려두었습니다.
https://github.com/NAKsir-melody/go-ethai
역시 삽질이 시간은 잘가네요.
그런데 사실 제 삽질에는 의미가 있을지도 모릅니다. 난이도를 만족하는 논스는 여러개이고,
1씩 증가시키는것 보다는 생성된 값이 목적값에 도달할 확률이 높을수도 있으니까요
geth에 통합해봐야 hit ratio가 나올텐데.. 한번만 얻어걸려도 그게 어딥니까 ㅋㅋ
일단 go에서 tf로 다시짜야 하는것으로 보여서 우선 wrapper로
프로세스를 생성해서 파이썬을 실행시키도록 하는 파일은 만들어두고 geth에 붙일려고 보니...이거 어차피 풀싱크가 안되면 마이닝도못하는건가 싶기도 하고..