비트코인캐시와 비트코인캔디 소스코드의 변경점 추적해보기

in #kr7 years ago (edited)

비트코인 캔디 소스코드가 몇시간 전에 나왔길래 비트코인 캔디의 원본 소스코드인 비트코인캐시 ABC(우지한 그룹의 비트코인 캐시 소스코드)와 비트코인 캔디 소스코드의 차이점을 간단히 비교해 보았습니다.

우선 비트코인 캐시 소스코드는 좀 복잡한 정치적 이슈가 있으니 이를 살펴보도록 하겠습니다.

비트코인 캐시 소스코드는 있다 없다?

비트코인 캐시 소스 코드가 없다거나 비공개 상태인 것으로 알고 있는 분들이 초창기에 계셨고 아직도 이렇게 알고 계시는 분도 계시는데, 우지한의 비트메인 사가 지원하는 비트코인 캐시 소스코드는 https://reviews.bitcoinabc.org/ 사이트를 통해서 받을 수 있고, 개발되고 있는 현황도 함께 볼 수 있습니다. 그런데 비트캐시의 소스코드는 이 하나만 존재하고 있지 않습니다. 로저버가 개발자 일원으로 있는 비트코인 Unlimited라는 이름의 소스코드가 별개로 존재하는데, 비트코인 Unlimited는 깃허브
사이트 https://github.com/BitcoinUnlimited/BitcoinUnlimited 레포지터리를 통해서 볼 수 있으며, 이 소스코드는 비트코인-ABC 소스코드 다음으로 많이 쓰이고 있습니다. 그밖에 몇가지 소스코드가 더 있는데, 각각의 소스코드는 비트캐시 블럭체인 full 노드를 지원하고 있습니다. 비트캐시 full 노드 지원 소스로 유명한 것은 현재 5개 정도 있으며, 각각의 소스코드는 5개의 개발 그룹에 의해서 각각 개발되고 있습니다.

비트코인 소스코드도 여러가지이다

그러면 비트코인 소스는 어떨까요? 비트코인의 경우에는 비트코인 코어라고 불리는 가장 유명한 소스코드가 있고 그 소스코드는 https://github.com/bitcoin/bitcoin 깃허브 레포지터리를 통해 확인할 수 있으며, 그밖에 상당히 많은 종류의 비트코인 블럭체인 full 노드를 지원하는 소스코드들이 있습니다. 다만, 비트코인의 경우에는 Bitcoin-Core 소스코드가 거의 80% 이상 사용되고 있습니다. 각각의 비트코인 소스코드가 얼마나 사용되고 있는지의 분포는 https://coin.dance/nodes 사이트를 통해서 볼 수 있고, 비트캐시의 소스코드가 사용되고 있는 분포는 https://cash.coin.dance/nodes 사이트를 통해서 확인할 수 있습니다.이를 살펴보면, 비트코인 캐시의 경우에는 비트코인-ABC및 Unlimited 소스코드가 가장 많이 사용되고 있습니다. 특이한 점은 비트코인ABC 소스코드를 제외한 다른 소스코드는 비트코인캐시만 지원하고 있는것이 아니라 비트코인 full 노드도 함께 지원하고 있습니다. (좀 더 자세한 내용은 시간 되면 따로 정리해보겠습니다)

비트코인 캔디는 비트코인-ABC 기반

이번에 새롭게 하드포크된 비트코인 캔디는 비트코인-ABC 소스코드를 기반으로 하고 있으며, 여기에 Zcash의 equihash 알고리즘을 사용해서 GPU/CPU 마이닝이 가능하도록 고친 소스코드입니다. 비트코인골드가 비트코인 소스코드를 기반으로 해서 Zcash의 equihash를 적용한 것인 반면, 비트코인캔디는 비트코인 소스코드가 아니라 비트코인 캐시 소스코드+equihash 해시 알고리즘을 적용한 것입니다.

비트코인 캔디와 비트코인-ABC 소스코드의 다른 점

그렇다면 Candy와 ABC 소스코드는 어떻게 다를까요? 비트코인 캔디의 소스코드가 몇시간 전에 나왔길래 한번 살펴보았습니다.

https://github.com/bitcoincandyofficial/bitcoincandy 깃허브 레포지터리
Bitcoin Candy repo
보고있으려니 한숨이 나옵니다. 개념이 없는 개발자가 있는 것인지, 아니면 비트코인 캐시 정책상 무엇을 고쳤다는 것을 보여주기 싫어서 이렇게 한 것인지, 비트코인-ABC 소스코드의 히스토리를 전혀 남겨두지 않고 단일 커밋으로 소스코드를 올려놓았습니다.

이렇게 하면 오히려 오기가 생깁니다. 비트코인-ABC 소스코드와 비교하기 어려운 상태이지만 이렇다고 해서 소스코드 비교가 불가능하지는 않습니다. 다만 시간이 좀 걸릴 뿐입니다.

우선 비트코인-ABC 소스코드를 가져옵니다.

$ git clone https://reviews.bitcoinabc.org/source/bitcoin-abc/

그리고 비트코인캔디의 소스코드도가져옵니다.

$ git remote add candy https://github.com/bitcoincandyofficial/bitcoincandy

그런 다음 캔디 소스코드도 fetch

$ git fetch candy

위 명령을 내리면 다음과 같이 소스를 가져옵니다.

$ git fetch candy
warning: no common commits
remote: Counting objects: 1637, done.
remote: Compressing objects: 100% (1344/1344), done.
remote: Total 1637 (delta 203), reused 1633 (delta 199), pack-reused 0
Receiving objects: 100% (1637/1637), 4.62 MiB | 2.45 MiB/s, done.
Resolving deltas: 100% (203/203), done.
From https://github.com/bitcoincandyofficial/bitcoincandy
 * [new branch]      master     -> candy/master
 * [new tag]         0,16.2.7   -> 0,16.2.7
 * [new tag]         1.0        -> 1.0

이렇게 가져온 비트코인 캔디 소스코드를 candy 브랜치로 checkout 해보면

$ git checkout -b candy candy/master
Branch candy set up to track remote branch master from candy.
Switched to a new branch 'candy'

이제 master 브랜치에는 비트코인-ABC 최신 소스코드가, candy 브랜치에는 비트코인캔디 소스코드가 있게 되었습니다.

이제 본격적으로 소스코드를 비교해봅니다. 이제부터 조금 지루한 작업이 됩니다. 무슨 파일이 변경되었는지, 소스코드 어느 부분이 변경되었는지 blamediff를 통해서 비트코인-ABC와 캔디 소스코드가 가장 비슷한 지점을 찾아야 합니다.

다음과 같이 last.diff 파일을 얻어서 찬찬히 비교해 봅니다.

$ git diff master candy > last.diff

일반적인 소스코드라면 이 작업은 매우 시간이 드는 작업이 될 수 있으나 몇가지 힌트가 있습니다. 기본적으로 diff파일의 크기를 최소화 하는 시점이 언제인지 추적해야 하는데, 비트코인캔디는 2017년 말에 나왔으니, 소스코드를 가져온(소스코드 포크) 시점은 17년도 말이 될 것이기 때문입니다.

(자세한 내용은 생략하고) 파일 3개정도를 추적해서 변경이 의심스러운 부분을 blame으로 몇 번 거듭해서 커밋을 추적해보니, 지난해 12월 31일 비트코인-ABC 소스코드와 가장 유사한 것으로 생각되어집니다. 일단 이를 소스코드 분기 시점 후보로 삼습니다.

commit 6726ab1decb29d40f551bd53d2c93ccc4ed03a40
Author: Andrea Suisani <[email protected]>
Date:   Sun Dec 31 16:52:28 2017 +0100

    Autopep8 test/functional/test_runner.py

    Summary: Autopep8 test/functional/test_runner.py

    Test Plan: check if test/functional/test_runner.py stil works via excuting the functional tests suite

    Reviewers: deadalnix, #bitcoin_abc, schancel

    Reviewed By: #bitcoin_abc, schancel

    Differential Revision: https://reviews.bitcoinabc.org/D857

이 커밋을 비교 대상으로 삼아서 diff 파일을 얻은 후에 그 이름을 a.diff라고 하고, filterdiff 명령을 이용해서 다음과 같이 처리하면 변경된 파일에 대한 diff파일만 얻을 수 있습니다. (filterdiff 명령은 diff 파일에 대한 몇가지 필터링을 수행하도록 도와줍니다. -x "파일패턴" 옵션은 해당 파일을 diff에서 제외하라는 옵션)

$ filterdiff -x "*/test/*" -x "*/src/qt/*" -x "*/patches/*" -x "*/depends/*" a.diff > candy.diff

다음 링크를 통해서 비트코인-ABC와 비트코인-캔디 소스코드의 차이점(diff 파일)을 보실 수 있습니다.
https://pastebin.com/C9WATsxv

여기서 몇가지 의미 없어보이는 파일을 추가로 제거하고 (filterdiff 옵션으로 -x "*/Makefile*" -x "*/CMake*" 등등 추가)

이렇게 해서 얻은 diff 파일을 diffstat 명령으로 간단히 변경점을 요약해서 보면 다음과 같습니다.

$ diffstat candy-tmp.diff
 CONTRIBUTING.md                |   20
 COPYING                        |    2
 INSTALL.md                     |    2
 README.md                      |   29
 configure.ac                   |    9
 share/qt/Info.plist.in         |    6
 src/amount.cpp                 |   10
 src/amount.h                   |    3
 src/bitcoin-tx.cpp             |    2
 src/chain.cpp                  |    5
 src/chain.h                    |   24
 src/chainparams.cpp            |  187 +++--
 src/chainparams.h              |    9
 src/chainparamsbase.cpp        |    6
 src/chainparamsseeds.h         | 1529 -----------------------------------------
 src/clientversion.cpp          |    9
 src/consensus/params.h         |   23
 src/core_io.h                  |    2
 src/core_read.cpp              |    5
 src/crypto/common.h            |   40 +
 src/crypto/equihash.cpp        |  810 +++++++++++++++++++++
 src/crypto/equihash.h          |  276 +++++++
 src/crypto/equihash.tcc        |   49 +
 src/init.cpp                   |   15
 src/miner.cpp                  |   18
 src/net.cpp                    |   24
 src/net.h                      |   11
 src/net_processing.cpp         |  109 ++
 src/netbase.cpp                |    2
 src/netbase.h                  |    2
 src/pow.cpp                    |  233 +++++-
 src/pow.h                      |   14
 src/primitives/block.cpp       |   29
 src/primitives/block.h         |   66 +
 src/primitives/transaction.cpp |    6
 src/rpc/blockchain.cpp         |  109 ++
 src/rpc/mining.cpp             |  145 +++
 src/rpc/server.cpp             |    8
 src/script/interpreter.cpp     |    9
 src/script/interpreter.h       |   17
 src/script/sign.cpp            |    2
 src/script/standard.h          |    1
 src/seeder/bitcoin.cpp         |    4
 src/seeder/bitcoin.h           |    2
 src/seeder/main.cpp            |   13
 src/txdb.cpp                   |    6
 src/util.cpp                   |   17
 src/util.h                     |   36
 src/utilmoneystr.cpp           |   12
 src/validation.cpp             |   78 +-
 src/version.h                  |    3
 51 files changed, 2181 insertions(+), 1867 deletions(-)

변경점을 요약하면

  • 비트코인 캔디는 51개의 파일을 변경하여 2181 줄을 추가, 1867 줄을 삭제했다.
  • 이중에 src/crypto/equihash.* 파일은 비트코인골드에서 가져왔으며 소스 길이는 1135줄이다. (비트코인골드는 zcash에서 equihash 해시 알고리즘을 가져온 것)
  • 따라서 비트코인캐시 개발자들이 추가한 줄 수는 1046줄 (=2181-1135), 1867줄 삭제.
  • 위 변경점에서 리브랜딩 부분은 대부분 제거되었음에 유의 (BitCoinBitcoin Candy로 바꾼 부분)
  • 개발자는 최소 두명으로 보임 (Yang 및 hmc)
    주요 변경점이 1천여 줄수이기때문에 어느정도 개발에 관심있으신 분이라면 추적도 가능하실 듯 합니다.

equihash 해시 알고리즘 대응 파일

비트코인 골드 소스코드에서 다음과 같은 파일을 그대로 가져왔습니다. 원래의 Zcash에 있던 소스파일을 가져오지는 않았네요. 아래 세 파일은 BTG 소스코드 src/crypto/equihash.* 파일과 100% 일치합니다.

 src/crypto/equihash.cpp        |  810 +++++++++++++++++++++
 src/crypto/equihash.h          |  276 +++++++
 src/crypto/equihash.tcc        |   49 +

기타 변경점

나머지 변경점들을 몇가지 살펴봤는데 비트코인 골드의 소스를 참고해서 변경한 흔적들이 보이지만, 비트코인 소스코드와 비트코인-ABC 소스코드는 이미 상당히 차이가 있는 상태이므로 비트코인골드의 소스를 그대로 가져오기는 어려운 상태였습니다. 따라서 비트코인골드의 커밋된 패치를 참고로 고쳤을 것이고 그밖에 필요한 수정은 테스트넷을 실행시켜보면서 문제를 수정했을 것으로 추정할 수 있습니다.

이상 간단한 소스 비교 방법을 통해서 어느 정도 수준의 변경인가를 살펴보았습니다.

별로 재미없는 글이지만, 혹시 비트코인 캔디 소스코드의 출처 및 어떤 부분이 비트코인 캐시 소스코드와 다른지 궁금해 하실 분들을 위해, 또한 제 궁금증을 풀기 위해 정리해보았습니다.

추천 및 댓글은 언제나 저에게 힘이 됩니다~~

※ 변경사항

  • 2018/2/9 오후전6:14 - 초안 작성 완료
Sort:  

Nice to meet you. I first started to get into steemit. I'll follow you. Thank you for a good article.

감사합니다~

비코도 복붙이더니 빗골도 복붙해버리는
클라스가... 이런 비교글은 보팅입니다. 좋은 글 감사합니다.

우리가 알고있는 상당수의 코인은 비트코인 소스코드 기반이고, 소스코드의 변경을 통해 발전을 하고 있기때문에 복붙이 무조건 나쁘다고 할 것은 아닙니다. 얼마만큼의 발전이 있느냐, 개발자가 어느정도 열정을 가지고 관리를 해 나가느냐가 더 중요하죠~

아무튼 최근에 우후죽순 생겨나고 있는 포크 코인들은 좀 더 매의 눈으로 관찰하자는 의미에서 글을 썼습니다~
감사합니다~~

전에 어느정도 코딩을 공부하려고 했던 입장이라, 이해가 가는 부분입니다만, 그들의 의도가 어느정도 짐작이 가는터라 긍정적으로 생각이 들진않지만, 투자를 통한 시장참여자로서는 경쟁을 통해 시장이 건전하게 성장하기만을 바랄 수 밖에 없네요.
다시 말씀드리지만 좋은 글 감사드립니다. 다음 글도 좋은 분석 부탁드려요!

정신 집중해서 읽었습니다.
이런 개발적인 내용으로 맘을 설레게 하는게 쉽지 않은데..대단하세요.
막 개발해보고 싶어지네요.
궁금증 해소 깔끔한 정리에 박수드립니다. 감사합니다.

별말씀을요 제가 다 감사하네요~
감사합니다~^^

와우 잊혀진 줄만 알았던 비트코인캔디 포스팅에 소스코드 비교 글이라니!! 감사합니다.
캔디 저도 소량으로 들고는 있는데 믿음이 안 가서 거의 포기한 상태였어요

비트코인캔디는 신생 코인이고, 소스코드 공개가 풀이 나올 시점이 되어서야 공개되어서 그동안 스캠 논란이 있었을 것으로 생각되네요. 게다가 현재 낮은 해시이기는 하지만 공식 풀이 정상 작동되고 있어서 채굴하기 전에 확인 차 소스코드를 점검해봤습니다~