지난번 만들었던, 간단한 ML데이터로 논스를 예측하도록 geth를 수정했습니다.
트레이닝된 모델을 파일로 저장하고, 입력 파라미터로 난이도를 주는 형태의 파이썬 파일을 하나 만들고
ethash쪽의 sealer 쪽에 제 이름을 딴 get_sigmoid함수를 만들고 난이도값을 전달하는거죠
우선 실행을 해보니 뭔가 값이 나오긴합니다만, 이상한 현상이 발견됩니다.
sigmoid>difficulty: 17171480576
sigmoid>nonce: 12806990725609303701
sigmoid>calc: 27754207324661552616374889765162625054695300995394516085487856579503914553588
sigmoid>target: 6743279283625367647713488873744040500685011208764422623510038323204
입력된 난이도 값이 트레이닝때 사용하던 값보다 많이 작아요.
제 모델이 게산한 논스에의해 계산된 값이 타겟보다 턱없이 크네요
이상해서 블록넘버를 찍어봤더니 "1" 입니다.
이게 뭘 의미하냐면, 제네시스블록 뒷블록을 제가 마이닝 한거죠.
이더스캔을 통해 확인해보니, 1번블록의 난이도와 일치합니다.
채굴에 성공한 논스는 0x539bd4979fef1ec4로 모델이 예측한값
( 0xB1BB9235E9AA2E95)과 전혀 무관해 보이네요ㅎㅎ
사실 이글을 쓰게된 이유는 지난번 geth노드가 100개 정도의 블록간격을 유지한채
싱크가 안되는 경우를 저도 겪게 되었기 때문입니다.
싱크가 안끝났기때문에 채굴을 시작하면 1번 블록을 채굴하려고 하는거죠.
제 노드의 싱크현황을 보면
hightestBlock은 다행히도 이더스캔과 일치합니다.
eth.syncing
{
currentBlock: 5960448,
highestBlock: 5960571,
knownStates: 45558240,
pulledStates: 45551755,
startingBlock: 5959175
}
도대체 어떤 상황인가..보니 에러가 발생하는데
debug.dumpBlock("0x5AF300")
Error: missing trie node 69ed79b448122c13f3827c9d3e2a1e6826d4738821d39b4e490cb59338aa7c94 (path )
debug.printBlock(5960448)
"(types.Block)(0xc420a84990)({\n header: (types.Header)(0xc4226bd200)({\n ParentHash: (common.Hash) (len=32 c
dump는 안되고, 프린트는 안되네요
dump때 에러는 trie패키지에서 발생하며,
TryGet -> resolveHash -> MissingNodeError 순이며 localdb에 트라이 노드가 없을때 발생합니다.
블록은 받고 있으나 state trie가 생성이 다 안되었나봅니다.
구글링을 해보니, 이런 경우 SSD로 바꾸라는 말이 많은데,
메모리 캐싱을 사용하는동안은 문제가 없지만, DB로 commit하는게 오래걸리면 그동안 받은
블록이 또 늘어나서, 싱크가 영영 끝나지 않을수도 있을것 같다는 생각이 드네요.
블록타임이 빠르다고 모두에게 좋은건 아닌것 같습니다ㅠㅠ