[COIN][HTML] generate 채굴 명령어 사용 시 채굴은 어떤식으로 진행되는가?





HTML 코인의 채굴명령어는 아래와 같다.


 generate [blocks] [retry]

 ex) generate 100 999999999






최근들어 채굴이 잘 되지 않아 명령어를 조금씩 바꿔보며 테스트를 해보는데..
(뒤에 있는 9의 숫자가 적을수록 채굴 명령어가 빨리 끝난다.)
generate 100 999999999
generate 100 99999999
generate 100 9999999


채굴이 안되면 이 명령어가 잘못되어 채굴이 안되는건지..
또 채굴이 되면 이 명령어가 효율이 좋아서 채굴이 된건지..

너무 답답한 마음에 HTML코인의 소스를 분석해 보기로 했다.
* retry 숫자에 따른 영향(결론)은 제일 하단에..




[https://github.com/HTMLCOIN/HTMLCOIN/blob/master/src/rpc/mining.cpp]

1. generate 명령어 수행 시 수행되는 부분


 - generate / generatetoaddress 명령어가 실행되는 부분이 보인다. (로직은 거의 동일)
 - 174: retry횟수(99999999)를 넣어주지 않으면 디폴트로 1000000 으로 대체된다.
 - 180: 지갑 정보 생성
 - 190: generateBlocks()을 수행한다.
1004lucifer


2. 채굴되는 부분 (generateBlocks)


 - 104: 인자값으로 (지갑정보, 블록갯수(100), retry(999999999), boolean) 전달받는다.
 - 122: 지정한 블록갯수 만큼 루프를 수행한다.
 - 124: 블록을 초기화 한다. (아래에서 추가 설명)
 - 124: 블록을 생성 한다. (아래에서 추가 설명)
 - 132~135: retry 횟수만큼 nonce를 증가시키며 해시값을 만들어 조건에 맞는지 확인.
 - 136: retry 만큼 다 돌았는데 조건에 맞는 해시함수가 없다면 종료한다.
 - 139: nonce 값이 최대값과 동일하다면 132 조건을 다시 수행한다.
 - 143: 정상조건에 맞는 해시값 생성되었다면 블록 추가하여 네트워크에 공유. (채굴성공)
 - 146: 반환할 변수에 해당 블록의 해시값을 추가한다.
 - 122~153: 채굴 성공한경우 122부터 다시 수행한다. (블록갯수 100 만큼 반복)


 위와같은 로직으로 인해 generate 100 999999999 명령어 한번 수행 시 100번의 채굴(블록생성)을 시도하며 각각의 블록생성 시도당 99999999 번 시도를 하게된다.

 드믈게 명령어 한번에 연속 적으로 채굴(블록생성)에 성공한 경우
 [
  "saf6s4a5f3sa54f35243354sdfaas4f",
  "asdf65sa4df68sa4d6846sa84gas6",
  ...
 ]

 위와같이 나오며 이론상으로는 명령어와 같이 100번 연속으로 채굴이 되었다고 하면 명령어 한번에 해시값이 최대 100개 정도가 나오게 된다.





[https://github.com/HTMLCOIN/HTMLCOIN/blob/master/src/miner.cpp]

3. 블록 초기화 부분 (BlockAssembler)


 - 블록의 가본값들을 셋팅한다.



4. 블록 생성 부분 (CreateNewBlock)


 - 여러가지 셋팅
 - 245~275: QTUM(퀀텀)의 소스가 그대로 들어있다.
 - 288: 이전 블록 헤더의 해시값을 생성
 - 289: 블록의 nonce 를 0으로 셋팅






결론

- 채굴 시 블록 생성 후 nonce를 이용하여 난이도에 맞는 해시값을 구하게 되며 nonce 값은 0 부터 시작하여 retry 값 만큼 숫자를 올리며 재시도를 하게된다.

예를 들어 아래와 같다.
(조건(난이도) 앞에 0이 5개가 있는 숫자보다 낮은 값의 해시를 뽑으려면??)

0 => 6546514sa6df5462834r6wae54sadf65
1 => 01sdf84we1sfsa3f5sd4fsf5sdf1s3fsd5f
2 => 1saf51234418254ydrhd1fh2sdfh3sd5
...
5213245 => 00000b8saf4we3te5tsd1dfg3hg5sdt

위 같은 해시값을 뽑기위해 nonce 값을 계속 증가시켜 해시를 구해야 한다.



[retry 숫자가 적은경우 - 999999]
 - 장점: 채굴이 빨리 끝나기 때문에 이미 다른 곳에서 이미 채굴이 된 상황에서 삽질을 덜하고 새로운 채굴을 할 수 있다.
 - 단점: 난이도가 높은경우 해당 retry 내에서 해시값이 나오지 않을 수 있다. 의미없는 일을 하게되는 경우가 발생할 수 있다.
1004lucifer
[retry 숫자가 높은경우 - 999999999]
 - 장점: 난이도가 높아도 왠만한 해시값을 추출할 수 있다.
 - 단점: 한번 명령어가 수행하는데 시간이 오래 걸리며, 다른곳에서 먼저 채굴이 되어버린 경우 의미없는 삽질을 하게된다.




===========================
2018.02.20 추가

HTML코인 소스를 분석하며 새로 알게된 것을 추가한다.

다른 곳에서 먼저 채굴이 된 경우 해당 블럭의 Header 및 height 값을 해시값을 구할 때 실시간으로 적용시켜 의미없는 일을 하지 않는다.

다만 retry 숫자가 999와 같이 너무 짧은 숫자의 경우에는 의미가 없을 수 있지만..
1~2분 내에 블록이 생성되는 지금 시점에서는 9999999 정도로 2분이상 걸리는 횟수를 입력하면 별로 낭비하는 일은 없을꺼라 생각이 든다.


댓글