오늘 hdac 블록체인 데몬 소스코드가 공개되었습니다
https://github.com/Hdactech/hdac
hdac 소스코드는 multichain 소스코드를 기반으로 고쳐진 것이 거의 확실합니다.
https://github.com/MultiChain/multichain
저같은 경우는 `git diff`를 통해서 훝어보고 나서 이 결론에 도달하였는데, 센스있는 사용자라면 깃허브에 공개된 라이선스 상단의 "2014-2017 Coin Sciences"를 구글로 검색해 보셨다면 원본 소스의 출처를 금방 찾으셨을 것입니다.
사실 소스 공개시점 하루 전인 어제, 몇가지 키워드를 조합해서 검색해보니 `multichain`이 검색 상단에 뜨더군요. (`~/.hdac/hdac/params.dat` 의 내용을 참고로 `"chain-protocol" "chain-description" github` 단어 조합으로 구글 검색. 상단에 노출됨)
이를 의심했었는데 맞았네요.
multichain 소스코드는 당연히도 비트코인 소스코드를 기반으로 하며, 비트코인 소스코드 구버전 기반입니다. (비트코인 0.10.x)
`git diff` 명령의 고쳐진 부분을 훝어보면 multichain이 그 소스코드 기반인 것이 더욱 분명해집니다.
- 일부 multichain에서 남긴 커맨트 제거 // 커맨트 제거도 오픈소스 개발자라면 함부로 하지 않습니다. MCH 이라는 짧은 커맨트를 모두 삭제했네요.
- copyright은 그대로 두었습니다. Hdac을 copyright에 추가한 형태로 고쳤습니다.
- multichain 이라는 이름이 붙은 파일의 상당수는 hdac으로 바뀌었습니다. bitcoin 명칭 붙은 파일 명은 대부분 그대로 두었습니다.
## hdac 소스코드를 얼마나 고쳤을까?
블로그에 종종올린 git을 이용해 diff를 뜨는 방식으로 얼마나 바뀌었는지 테스트해보았습니다.
그 결과 multichain의 master 브랜치의 `0a428c7f74e6` 커밋이 가장 근접하며 (`0a428c7f74e6` == `master~1`)
`$ git diff 0a428c7f74e6 |filterdiff -x "*.patch" -x "*.rc" -x "*README*" -x "*.sh" -x "*.m4" -x "*config.*"|diffstat`
~~~~
.gitignore | 11
LICENSE | 674 +++++
Makefile.am | 48
configure.ac | 25
depends/Makefile | 136 -
doc/RUN.md | 183 +
src/Makefile.am | 216 -
src/chain/chain.h | 40
src/chain/epow.cpp | 991 ++++++++
src/chain/epow.h | 53
src/chain/pow.cpp | 19
src/chain/txmempool.cpp | 22
src/chain/txmempool.h | 7
src/chainparams/buildgenesis.cpp | 107
src/chainparams/chainparams.cpp | 193 -
src/chainparams/chainparams.h | 13
src/chainparams/chainparamsbase.cpp | 28
src/chainparams/chainparamsbase.h | 8
src/chainparams/globals.h | 14
src/chainparams/hdac/paramlist.h | 308 ++
src/chainparams/hdac/params.cpp | 1646 ++++++++++++++
src/chainparams/hdac/params.h | 155 +
src/chainparams/hdac/state.h | 317 ++
src/chainparams/multichain/paramlist.h | 323 ++
src/chainparams/multichain/params.cpp | 1924 ++++++++++++++++
src/chainparams/multichain/params.h | 154 +
src/chainparams/multichain/state.h | 328 ++
src/chainparams/paramlist.h | 306 --
src/chainparams/params.cpp | 1962 ----------------
src/chainparams/params.h | 154 -
src/chainparams/state.h | 271 --
src/core/init-cold.cpp | 241 --
src/core/init.cpp | 630 +++--
src/core/init.h | 4
src/core/main.cpp | 1937 ++++++----------
src/core/main.h | 32
src/crypto/Lyra2RE/Lyra2.c | 382 +++
src/crypto/Lyra2RE/Lyra2.h | 44
src/crypto/Lyra2RE/Lyra2RE.c | 110
src/crypto/Lyra2RE/Lyra2RE.h | 15
src/crypto/Lyra2RE/Sponge.c | 745 ++++++
src/crypto/Lyra2RE/Sponge.h | 108
src/crypto/Lyra2RE/blake.c | 1120 +++++++++
src/crypto/Lyra2RE/bmw.c | 958 ++++++++
src/crypto/Lyra2RE/cubehash.c | 718 ++++++
src/crypto/Lyra2RE/groestl.c | 3119 ++++++++++++++++++++++++++
src/crypto/Lyra2RE/keccak.c | 1824 +++++++++++++++
src/crypto/Lyra2RE/skein.c | 1254 ++++++++++
src/crypto/Lyra2RE/sph_blake.h | 327 ++
src/crypto/Lyra2RE/sph_bmw.h | 321 ++
src/crypto/Lyra2RE/sph_cubehash.h | 286 ++
src/crypto/Lyra2RE/sph_groestl.h | 329 ++
src/crypto/Lyra2RE/sph_keccak.h | 293 ++
src/crypto/Lyra2RE/sph_skein.h | 298 ++
src/crypto/Lyra2RE/sph_types.h | 1976 ++++++++++++++++
src/crypto/ctaes/COPYING | 21
src/crypto/ctaes/bench.c | 170 +
src/crypto/ctaes/ctaes.c | 556 ++++
src/crypto/ctaes/ctaes.h | 41
src/crypto/ctaes/test.c | 110
src/crypto/scrypt-sse2.cpp | 136 +
src/crypto/scrypt.cpp | 329 ++
src/crypto/scrypt.h | 45
src/entities/asset.cpp | 128 -
src/entities/asset.h | 6
src/hdac/hdac-cli.cpp | 513 ++++
src/hdac/hdac-util.cpp | 191 +
src/hdac/hdac.h | 25
src/hdac/hdacd-cold.cpp | 360 +++
src/hdac/hdacd.cpp | 401 +++
src/json/json_spirit_ubjson.cpp | 12
src/json/json_spirit_ubjson.h | 27
src/json/json_spirit_writer_template.h | 84
src/keys/pubkey.cpp | 1
src/leveldb/build_detect_platform | 2
src/miner/miner.cpp | 883 +++----
src/miner/miner.h | 10
src/multichain/multichain-cli.cpp | 51
src/multichain/multichain-util.cpp | 30
src/multichain/multichaind-cold.cpp | 84
src/multichain/multichaind.cpp | 116
src/net/net.cpp | 211 -
src/net/net.h | 12
src/net/netbase.cpp | 4
src/permissions/permission.cpp | 156 -
src/permissions/permission.h | 10
src/primitives/block.cpp | 33
src/primitives/block.h | 12
src/primitives/transaction.cpp | 2
src/primitives/transaction.h | 35
src/protocol/handshake.cpp | 536 ----
src/protocol/hdac/handshake.cpp | 537 ++++
src/protocol/hdac/hdacblock.cpp | 632 +++++
src/protocol/hdac/hdacscript.cpp | 2158 ++++++++++++++++++
src/protocol/hdac/hdacscript.h | 102
src/protocol/hdac/hdactx.cpp | 3100 ++++++++++++++++++++++++++
src/protocol/multichain/handshake.cpp | 536 ++++
src/protocol/multichain/multichainblock.cpp | 678 +++++
src/protocol/multichain/multichainscript.cpp | 2182 ++++++++++++++++++
src/protocol/multichain/multichainscript.h | 100
src/protocol/multichain/multichaintx.cpp | 3133 ++++++++++++++++++++++++++
src/protocol/multichainblock.cpp | 625 -----
src/protocol/multichainscript.cpp | 2382 --------------------
src/protocol/multichainscript.h | 113
src/protocol/multichaintx.cpp | 3151 ---------------------------
src/protocol/netprotocol.cpp | 3
src/rpc/rpcassets.cpp | 558 +---
src/rpc/rpcblockchain.cpp | 137 -
src/rpc/rpcclient.cpp | 19
src/rpc/rpcdump.cpp | 15
src/rpc/rpcexchange.cpp | 81
src/rpc/rpchelp.cpp | 717 ++----
src/rpc/rpclist-cold.cpp | 2
src/rpc/rpclist.cpp | 24
src/rpc/rpcmining.cpp | 105
src/rpc/rpcmisc.cpp | 167 -
src/rpc/rpcnet.cpp | 132 -
src/rpc/rpcpermissions.cpp | 25
src/rpc/rpcprotocol.cpp | 12
src/rpc/rpcrawdata.cpp | 1435 ------------
src/rpc/rpcrawtransaction.cpp | 342 +-
src/rpc/rpcserver.cpp | 247 +-
src/rpc/rpcserver.h | 16
src/rpc/rpcstreams.cpp | 755 ------
src/rpc/rpcupgrades.cpp | 78
src/rpc/rpcutils.cpp | 825 +------
src/rpc/rpcutils.h | 56
src/rpc/rpcwallet.cpp | 287 +-
src/rpc/rpcwallet.h | 13
src/rpc/rpcwalletsend.cpp | 97
src/rpc/rpcwallettxs.cpp | 106
src/rpc/rpcwalletutils.cpp | 222 -
src/script/interpreter.cpp | 138 -
src/script/interpreter.h | 9
src/script/script.cpp | 22
src/script/script.h | 19
src/script/sigcache.cpp | 2
src/script/sign.cpp | 24
src/script/standard.cpp | 416 +--
src/script/standard.h | 2
src/secp256k1/build-aux/compile | 347 ++
src/secp256k1/build-aux/depcomp | 791 ++++++
src/secp256k1/build-aux/install-sh | 508 ++++
src/secp256k1/build-aux/missing | 215 +
src/secp256k1/build-aux/test-driver | 148 +
src/storage/addrman.cpp | 10
src/storage/addrman.h | 3
src/storage/coins.cpp | 17
src/storage/txdb.cpp | 7
src/storage/txdb.h | 6
src/structs/amount.cpp | 6
src/structs/amount.h | 2
src/structs/base58.cpp | 39
src/utils/core_read.cpp | 2
src/utils/dbwrapper.cpp | 7
src/utils/dbwrapper.h | 6
src/utils/declare.h | 7
src/utils/define.h | 6
src/utils/systemdependent.cpp | 4
src/utils/timedata.cpp | 4
src/utils/tools.cpp | 6
src/utils/util.cpp | 127 -
src/utils/util.h | 3
src/utils/utility.cpp | 13
src/utils/utilmoneystr.cpp | 3
src/utils/utilparse.cpp | 128 -
src/utils/utilparse.h | 20
src/utils/utilstrencodings.cpp | 4
src/utils/utilstrencodings.h | 2
src/utils/utilwrapper.cpp | 114
src/version/clientversion.h | 3
src/version/hdacversion.h | 42
src/version/version.cpp | 123 -
src/version/version.h | 27
src/wallet/db.cpp | 3
src/wallet/wallet.cpp | 351 ---
src/wallet/wallet.h | 110
src/wallet/wallet_ismine.cpp | 6
src/wallet/walletcoins.cpp | 252 --
src/wallet/wallettxdb.cpp | 37
src/wallet/wallettxdb.h | 23
src/wallet/wallettxs.cpp | 207 -
src/wallet/wallettxs.h | 10
183 files changed, 44179 insertions(+), 19157 deletions(-)
~~~~
- `README` `/ *.sh` 스크립트, `*.rc` 리소스 등등의 파일은 제외시켰습니다.
- 상당수 파일은 copyright에서 hdac를 추가한 것입니다.
- `src/crypto/Lyra2RE` 소스는 통채로 추가된 것
- `"\*/rpc/\*", "\*/secp256k1/\*", "\*src/utils/\*", "\*src/wallet/\*", "\*script/\*", "\*/crypto/\*"` 제외하면 총 변경 파일 91개, 183개에서 절반으로 줄어듭니다.
- `91 files changed, 24167 insertions(+), 12965 deletions(-)`
## 제발 히스토리 날리지 맙시다.
조금 자극적으로 제목을 달았습니다. 사실 이 문제는 별것 아닌 것으로 생각할 수는 있지만, 오픈소스 결벽증에 있는 개발자라면 정말 참기 힘든 부분입니다.
- `/* MCH */` 라는 커맨트를 모두 제거함... // 별것도 아닌 것 제거하는 습관은 한마디로 바보같은 짓입니다. 왜 흔적을 지울까요? 영업비밀? 상사에게 들킬까봐? 이해가 가지 않는 행동이며, 오히려 나중에 추적해서 이를 알아낸다면 출처를 의도적으로 감추려 했다는 비난을 면하기 어렵습니다.

## 소스코드를 히스토리도 모두 공개해주세요
오픈소스에서 git의 탄생과 더불어 github의 등장은 가히 혁명이었습니다. git은 모든 소스를 긁어갈 수 있기때문에 일부 개발자는 오히려 거부감을 가지기도 했고, git은 포크를 오히려 장려하기때문에 개발자가 소수인 경우는 오히려 git대신에 CVS나 svn을 고수하기도 했죠.
git과 같은 버전관리 시스템을 잘 활용하기 위해서는 히스토리가 그대로 고스란히 남아있어야 합니다. 히스토리는 어떤 개발자가 실수를 하는지, 어떤 개발자가 제대로 고쳤는지를 그대로 까발리기때문에 개발자는 발가벗겨지는 기분을 느낄 수도 있습니다. 그러나 더 빨리 문제점을 찾을 수 있게 해주고, 더 빠르게 고쳐지게 될 가능성이 높아집니다.
내부적으로 hdac 소스코드 히스토리를 모두 가지고 있는 레포지터리를 별도로 운용하고 있다면 그렇게 하지 마시고 모든 히스토리를 가지고 있는 레포지터리를 공개해주시기 바랍니다. 그래야만 소스추적이 더욱 쉽고, 문제점이 발견되었을 때 그 원인이 무엇인지 더 찾기 쉽습니다.
## 살려낸 히스토리
다음은 소스 히스토리 추적을 쉽게 하기 위해 *급하게 수정해서* 올린 소스입니다.
- 따라서 hdac개발팀이 수정한 부분과 multichain개발자가 수정한 부분이 섞여있는 부분이 있을 수 있습니다.
https://github.com/OpenCommunityCoin/hdac/commits/master-hdac
---------
이상 간단한 `git diff`를 사용한 변경 윤곽을 살펴보았습니다.
댓글 및 추천은 제가 힘이 됩니다~
※ 변경사항
- 5/24 오후 최초 작성
- 5/26 - 히스토리 급하게 되살린 repo 추가