오늘 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 추가
hdac 측이 커밋히스토리 올리면 간단하게 해결될 문제인데, kackyminer 님이 넘 고생하시네요. 도대체 뭘 저리도 숨기고 싶은게 많은지 모르겠습니다.
쓸데없는 것을 감추고 싶어서 저러는 것 같습니다~
댓글 감사합니다~~ ^^
잘 읽고 갑니다. 그냥 따봉 드려요. ^^
감사합니다~^^