dukDukz

[블록체인] 라이트 코인 빌드 본문

웹 개발/블록체인

[블록체인] 라이트 코인 빌드

헤일리_HJ 2021. 9. 15. 13:21

# 나만의 코인 만들기 - 라이트 코인 (litecoin)

 

https://github.com/litecoin-project/litecoin.git

 

GitHub - litecoin-project/litecoin: Litecoin source tree

Litecoin source tree. Contribute to litecoin-project/litecoin development by creating an account on GitHub.

github.com

doc 폴더 들어가서

build-windows.md 로 가서 보면 빌드 방법이 나와있음 

근데 어제 비트코인 빌드한거랑 거의 비슷함

 

# 우리는 0.15 ver 로 할것이다 (branch 에서 설정하면 됨)

- version 0.15

 

# 나의 코인을 만든다는게 어떤 의미인가?

- bitcoin-qt.exe

이거를 다른 이름으로 변경, 포트도 변경해서 아예 다른 네트워크로 구성한다는 것이다.

 

그리고 Bitcoin core -> 다른 이름..

비트코인의 단위는 1 BTC

이더리움의 단위는 1 ETH

그래서 그 단위도 우리 것으로 바꿀 거다.

그럼 실제로 구동하는 코인과 똑같은게 될 것.

 

 


1. 라이트 코인 git clone

펭귄으로 들어가서

 

$ cd ~

$ mkdir workspace && cd workspace

$ git clone -b 0.15 --single-branch https://github.com/litecoin-project/litecoin.git folder명[ingcoin_0.0.15]

$ cd ingcoin_0.0.15

 

 

그 다음은 비트코인 빌드했던거랑 똑같이 하면 된다.

위치는 ingcoin_0.0.15

$ sudo apt update

$ sudo apt upgrade

$ sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git

$ sudo apt install nsis

$ sudo apt install g++-mingw-w64-x86-64

$ sudo update-alternatives --config x86_64-w64-mingw32-g++

2. find 파일명 변경리스트

위치는 ingcoin_0.0.15

 

# 이름 바꾸기

lightcoin -> ingcoin 으로 바꾸는 작업

이렇게 하면 바꿔서 줌. 좀 기다려야함

[litecoin 형태가 여러 개 일 수 있으므로]

 

$ find ./ -type f -readable -writable -exec sed -i "s/Litecoin/INGcoin/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i "s/LiteCoin/INGcoin/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i "s/LiteCoin/ingCoin/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i "s/litecoin/ingcoin/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i "s/litecoind/ingcoind/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i "s/LITECOIN/INGCOIN/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i "s/lites/ings/g" {} \;


하나씩 해준다.


# 단위 바꾸기

$ find ./ -type f -readable -writable -exec sed -i "s/LTC/ING/g" {} \;

$ find ./ -type f -readable -writable -exec sed -i "s/photons/iphotons/g" {} \;

 




# PORT 변경하기

$ find ./ -type f -print0 | xargs -0 sed -i "s/9333/9233/g"

$ find ./ -type f -print0 | xargs -0 sed -i "s/9332/9232/g"

$ find ./ -type f -print0 | xargs -0 sed -i "s/19335/19235/g"

$ find ./ -type f -print0 | xargs -0 sed -i "s/19332/19232/g"



3.  VS code 켜기

ingcoin_0.0.15 안에 들어간 상태에서 code .

$ code .

-> 쉘이 zsh 면 가능함

 

터미널 열때
f1 -> Remote-wsl:new window

 

만약 shell 이 bash 라면?

더보기

# zsh 간단 셋팅

$ cd ~

$ sudo apt-get install zsh

witch zsh -> 결과물 나오는 경로를 아래에 넣고

chsh -s /usr/bin/zsh

 

echo $SHELL   //터미널 닫고 다시 열면

/usr/bin/zsh

 

//oh my zsh

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

 

cd ~/.zshrc

ZSH_THEME="agnoster" 


4. VS code 를 켠 다음 코드 수정 

 

src/chainparams.cpp 를 열어준다.

 

네트워크 구성을 바꿔주는 작업

 

114~117 번 줄 내용 변경

/*114 */        pchMessageStart[0] = 0xfd;
/*115 */        pchMessageStart[1] = 0xc2; 
/*116 */        pchMessageStart[2] = 0xb8;  
/*117 */        pchMessageStart[3] = 0xdd;

216~219 번 줄 내용 변경

/*216 */  	pchMessageStart[0] = 0xff;  
/*217 */ 	pchMessageStart[1] = 0xd4;  
/*218 */ 	pchMessageStart[2] = 0xca;  
/*219 */ 	pchMessageStart[3] = 0xf3;

 

133번째 첫번째 글자설정

 

https://en.bitcoin.it/wiki/List_of_address_prefixes

여기를 보면

아래쪽에 Leading Symbol 쪽 봐보면

i 가 102번 으로 바꿔서 저장 (ingcoin의 선행기호)

 

/* 133 */ base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,102);

5. 제네시스 블럭 만드는 과정

팽귄

$ cd ..  // -> ingcoin 나가서 workspace 로 가서

$ git clone https://github.com/lhartikk/GenesisH0

$ cd GenesisH0

$ ls -al

python 파일이 하나 존재함

genesis.py 파일이 존재하는지 확인


 

 

6. 파이썬 설치

파이썬을 실행하기 위해서 python 설치를 진행해야 함

 

$ sudo apt install python 

$ python --version 
// 2.7.x 

$ pip --version
// 2.x.x

 

만약에 pip가 설치가 안된다면,

python3을 설치해서 pip2를 설치하는 방향을 잡아야함.

 

$ sudo apt install python3

$ curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip2.py

$ sudo python2 get-pip2.py

$ pip2 --version 

or

$ pip --version

// 2.7 or 2.x 나와야함


$ sudo pip install scrypt construct==2.5.2

$ sudo python2 genesis.py -a scrypt -z "hello ingcoin" -t 1631556376 
// timestamp 가져오는 곳 : http://www.unixtimestamp.com

 

이렇게 해서 나온 결과..

 

04ffff001d01040d68656c6c6f20696e67636f696e

algorithm: scrypt

merkle hash: e626b891a669ed58da1fb770e6ebf8b05665a60b2311fe7c286a29b917b0b619

pszTimestamp: hello ingcoin

pubkey: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f

time: 1631556376

bits: 0x1e0ffff0

Searching for genesis hash..

1692.0 hash/s, estimate: 705.1 h

1849.0 hash/s, estimate: 645.2 hgenesis hash found!

nonce: 2015515

genesis hash: 8c36f3401106465dbd13c50fb29c7d0351f8648695aacd26c21888795a81b11e

 

 

# 그 중에서 자주 쓰는 것

 

pszTimestamp: hello ingcoin

pubkey: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f

time: 1631556376

nonce: 2015515

genesis hash: 8c36f3401106465dbd13c50fb29c7d0351f8648695aacd26c21888795a81b11e

merkle hash: e626b891a669ed58da1fb770e6ebf8b05665a60b2311fe7c286a29b917b0b619

 

이 내용들을 직접 내가 넣어준 다음 빌드를 해야 한다.

 


7. chainparams.cpp 코드 수정

chainparams.cpp 를 보면

우리가 갖고 있는 값으로 수정해줘야 한다.

 

51번째 줄에 pszTimestamp 를 수정

52번째 줄에 ParseHex 를 publickey로 수정

 

121번째 줄에 CreateGenesisBlock 매서드 안에 인자값이 5개가 있는데

여기서는 time(첫번째 인자값) 과 nonce(두번째 인자값) 값을 보낸다.

그래서 첫번째 인자값과 두번째 인자값을 바꿔준거임

 

123번째줄 제네시스 해시값 (0x 뒤에다가 붙여주면 됨)

124번째줄 머클루트 해시값 (0x 뒤에다가 붙여주면 됨)

 

127~131 번째 줄 까지 주석 처리

 

132 번째 

vSeeds.clear();

vSeeds.emplace_back("",true);

작성해줌



150 번에 

0 으로 바꾸고 0x 뒤에 하나만 제네시스 해쉬로 바꿔준다. 쉼표 지우고.

 {  0, uint256S("0xgenesis hash")},

 

151~165 까지 주석하고



171번째에 time 값으로 수정 

 

 

여기까지가 메인넷 설정이다.


이제 테스트넷을 시작해야 한다.

8. chainparamseeds.h 수정

 

main = {전체 주석} test = {전체 주석}


9. chainparams.cpp 수정

104번째 줄, 213번째 줄에

이 부분이 이전 해쉬값 내용을 넣는 공간이다

 

104번째 줄

2ebcfe2dd9eff82666		// 이거를

000000000000000000		// 이렇게 수정

이렇게 0이 64번이 되도록 바꿔주고

 

 

213번째 줄

7d006a402163e		// 이거를

0000000000000		// 이렇게 수정

얘도 바꿔준다.

 


10. 테스트넷 전용 제네시스 블럭 생성

 

이후 제네시스 블럭도 테스트넷 값으로 설정해야하기 때문에 블럭 내용이 달라진다.

 

그래서 블럭 생성하는

 

$ sudo python2 genesis.py -a scrypt -z "hello ingcoin" -t 1631565143 -n 2015515

 

time 값을 변경하고

nonce 값을 추가해줌

 

팽귄에서 저걸 입력하면

새로운 제네시스 블록을 만들어주는 함수가 완료된다.


 

위에거가 오래걸려서 이걸로 쓰기로함,

 

$ python genesis.py -a scrypt -z "NY Times 05/Oct/2011 Steve Jobs, Apple’s Visionary, Dies at 56" -p "040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9" -t 1317972665 -n 2084524493

 

결과물

04ffff001d0104404e592054696d65732030352f4f63742f32303131205374657665204a6f62732c204170706c65e280997320566973696f6e6172792c2044696573206174203536

algorithm: scrypt

merkle hash: 97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9

pszTimestamp: NY Times 05/Oct/2011 Steve Jobs, Apple’s Visionary, Dies at 56

pubkey: 040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9

time: 1317972665

bits: 0x1e0ffff0

Searching for genesis hash..

genesis hash found!

nonce: 2084524493

genesis hash: 12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2

 

 

time: 1317972665

nonce: 2084524493

 

genesis hash: 12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2

 

merkle hash: 97ddfbbae6be97fd6cdf3e7ca13232a3afff2353e29badfab7f73011edd4ced9



자주 쓸만한거 따로 빼놓고


11. chainparams.cpp 코드 수정

225 번째 줄

time , nonce

 genesis = CreateGenesisBlock(time, nonce, 0x1e0ffff0, 1, 50 * COIN);

 

 

227번째 줄

제네시스

0x 뒤에다가 써주면 됨

assert(consensus.hashGenesisBlock == uint256S("0xgenesis hash"));

 

228번째 줄

머클루트

0x 뒤에다가 써주면 됨

assert(genesis.hashMerkleRoot == uint256S("0xmerkle hash"));

 

252 번째 줄

숫자를 0 으로 수정하고 텍스트를 0x 붙이고 제네시스 값으로 수정한다,

 checkpointData = (CCheckpointData) {
      {
         {0, uint256S("0xgenesis hash")},
      }
 };

 

256번째 줄

chainTxData = ChainTxData {
    time 값,
    0,
    0.00
}

 


참고사항 

더보기

[chainparams.cpp]

 

83번째줄

3.5일 마다 난이도를 조절한다는.

 

84번째

consensus.nPowTargetSpacing = 2.5 * 60;

 

-----------------------------------------------

 

[amount.h]

26번째줄 : 총 발행량

내가 코인을 총 발행할 숫자

 

chainparams.cpp

77번째에 보면 총 발행량의 숫자와 같다.

 

-----------------------------------------------

[validation.cpp]

1048 번째 줄

CAmount nSubsidy = 50 * COIN;

역할 : 한 블럭당 보상 코인 (채굴 성공시 보상 코인)


12. 라이트코인 -> 잉코인

 

src > qt > locale > bitcoin_ko_KR.ts

 

여기서 라이트코인 -> 잉코인 으로 바꿔준다.

돋보기 모양에서 바꿔주면 된다.

 


# 사진 바꾸는 법

src > qt > res > icons > bitcoin_testnet.ico

이 사진을 바꾸면 로고 모양이 바뀌는거임

 

src > qt > res > icons > litecoin_splash.png

litecoin 이름을 ingcoin 으로 바꿔주고 사진도 바꿀 수 있음 

ingcoin_splash.png 이렇게 바꿈

 


13. ingcoin 으로 변경

doc > man > litecoin 어쩌구 되어있는 파일 명들을 다 ingcoin 어쩌구고 바꿔준다.

 

 

여기까지가 세팅 끝...

이제 빌드 시작해야함..


빌드하기

 

팽귄으로 와서

/home/hyejjun/workspace/ingcoin_0.0.15

여기로 가자

 

$ PATH=$(echo "$PATH" | sed -e 's/:\/mnt.*//g')

$ sudo bash -c "echo 0 > /proc/sys/fs/binfmt_misc/status"

$ cd depends

$ ls
-> Makefile 이 존재하는지 확인

하고

빌드 시작

$ make -j 4 HOST=x86_64-w64-mingw32

 

빌드 완료 되면

 

$ cd ..

$ ./autogen.sh

$ CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/

// 여기서 부터 오류 났음
$ make -j 4

 

/mnt/c/Users/USER/coin2 위치에

coin2 라는 폴더를 만들고

$ sudo make install DESTDIR=/mnt/c/Users/USER/coin2

$ make deploy
or
$ sudo make deploy


0917

라이트 코인을 이용한 내 코인 빌드 완성시키기

make -j 4
여기서 오류가 났는데


오류 수정하기

1. _splash.png 오류

 

*** No rule to make target 'qt/res/icons/ingcoin_splash.png', needed by 'qt/qrc_bitcoin.cpp'.  Stop.

이러한 오류가 났었다. 저 png 파일이 없다는 뜻.

 

qt > res > icons > litecoin_spalsh.png 
ingcoin_splash.png 로 이름 바꿔주고

 

$ make -j 4 HOST=x86_64-w64-mingw32 // make 파일 생성
$ make -j 4 // make 진행

$ sudo make install  DESTDIR=/mnt/c/Users/USER/coin2  // 해당 내용 설치

$ make deploy

 

make deploy 까지 하고 ingcoin-qt 열었는데 이런 오류가 난다.

 


이런 오류

2. 제네시스 블럭오류

src > chainparams.cpp
안으로 와서
73번째 줄 클래스 내부를 보면
우리가 생성했던 결과물의 내용들을 넣어준 상태임

그리고 Testnet  부분도 똑같은 형태로 진행을 해줬다


227 번째 줄이 에러났다고
제네시스 블럭의 해쉬값이 에러 났다고 함 - 테스트넷 부분.

assert(consensus.hashGenesisBlock == uint256S("0x12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2"));

실행이 잘 되서 나타나는 오류 메시지..
제네시스 해쉬값이 맞지 않아서 나타나는 오류메시지임

 

① Testnet 해쉬 만들때 mainnet 만들때 두가지를 만들어서 따로 했었는데
그렇게 할 필요가 없었음

② body 내용도 해쉬값에 포함되어야 하는데
hello ingcoin 으로 되어있는걸 banana 어쩌구로 바꿨기 때문에 안된거임 

 


51번째 줄 확인하고 - 나는 hello ingcoin 으로 되어있음

(메인넷 코드)
121번째 줄부터 넌스 타임 머클루트 제네시스 해쉬값 확인

(테스트넷 코드)
225번째 줄 부터 넌스 타임 머클루트 제네시스 해쉬값 확인

동일한걸로 해주기

다 확인해서 바꾸고

pszTimestamp: hello ingcoin

pubkey: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f

time: 1631556376

nonce: 2015515

genesis hash: 8c36f3401106465dbd13c50fb29c7d0351f8648695aacd26c21888795a81b11e

merkle hash: e626b891a669ed58da1fb770e6ebf8b05665a60b2311fe7c286a29b917b0b619

 

저 위치에 ingcoin 폴더 하나 생성해주고

$ make -j 4 HOST=x86_64-w64-mingw32
$ make -j 4 
$ sudo make install DESTDIR=/mnt/c/Users/USER/ingcoin
$ sudo make deploy


이렇게 해주기

그리고 가서 실행해보면 잘 열리는듯