blockchain>litecoin build하기

YU YU·2021년 9월 14일
1

경일_BlockChain

목록 보기
9/24
post-thumbnail

01.메인넷 설정


01-01.기본 환경설정

1.터미널을 연다.
2. cd ~을 통해 홈 디렉토리 이동
3. $ mkdir workspace && cd workspace
4. git clone -b 0.15 --single-branch https://github.com/litecoin-project/litecoin.git ingcoin_0.0.15
git clone을 통해 litecoin의 소스를 다운받는다.
5. cd ingcoin_0.0.15
6. sudo apt update upgrade
7. sudo apt install build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git
8.sudo apt install nsis
9. sudo apt install g++-mingw-w64-x86-64 sudo update-alternatives --config x86_64-w64-mingw32-g++
이후 1치고 엔터

01-02. 이름 바꾸기

아래와 같이 바꿔준다.

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" {} \;


위의 사진과 같이 ! 가 뜨는 것은 상관없다. 터미널을 껐다가 다시 켜주면 없어지는 것이다.

01-03. 단위바꾸기

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

01-04. 포트 변경하기

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"
  • find ./: 디렉토리안의 모든 파일을 찾는다.
  • print0: 각 결과의 끝이 개행문자로 끝난다. print로도 사용할 수 있지만 깔끔하지 않아 찾은 결과로 다른 일을 하려고 할 때 print0을 사용한다.
  • xargs: 보통 파이프라인과 같이 사용하며 첫번째 결과물로 그 다음 명령어을 시행할때 쓰인다.
  • 's/원래 텍스트/바꿀 텍스트'
    만약 's/원래텍스트/바꿀텍스트/g'라고 입력하면 그 안의 모든 텍스트를 바꾸는 것이다.

01-05. LiteCoin 코드 수정하기

cd .//ingcoin_0.0.15안에 들어간 상태에서
code . 을 쳐서 비쥬얼 스튜디오를 킨다.

안되면 다음과 같이 한다.
--- zsh 간단 셋팅 ---
sudo apt-get install zsh
which zsh -> 결과물 나오는경로를 아래에 넣고
chsh -s /usr/bin/zsh/
echo SHELL//닫고다시/usr/bin/zsh//ohmyzshshc"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"

01-05-01. 초기값 고치기

scr폴더안의 chainparams.cpp파일을 연다.


👉114번째 줄이 위와 같이 나올 것이다. 이 부분을 다음과 같이 수정해준다.

        pchMessageStart[0] = 0xfd;
        pchMessageStart[1] = 0xc2;
        pchMessageStart[2] = 0xb8;
        pchMessageStart[3] = 0xdd;

👉그리고 216번째 줄을 살펴본다.

다음과 같이 바꿔준다.

        pchMessageStart[0] = 0xff;
        pchMessageStart[1] = 0xd4;
        pchMessageStart[2] = 0xca;
        pchMessageStart[3] = 0xf3;

👉그리고 133번째 줄을 확인해본다.

첫글자의 키값이 존재한다.
아래의 사이트에 들어가서 각 글자에 맞는것을 확인해본다.
https://en.bitcoin.it/wiki/List_of_address_prefixes
i는 102이다. 그래서 133번째 줄을 (1,102)로 바꾸어준다.
🐟여기서 i를 고친건 알겠는데 어디서 바꾼 i인지 질문하기🐟

01-06.제네시스 블럭 생성하기

터미널에 다음과 같이 작성한다.

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

cd ..을 입력해서 workspace디렉토리로 이동하여 gitclone을 한다.
ls -al을 입력하여 genesis.py파일이 존재하는지 확인한다.

vi genesis.py를입력하여 안의 내용을 살펴보자.

대충 이러한 내용이 있다.
이 파일은 제네시스 블럭을 만들기위해 실행시키는 파일이다.
그래서 실행하려면 파이썬이 필요하다.

python2,python3 설치

파이썬을 실행하기 위해 python 설치를 진행할것이다..
sudo apt install python2
sudo apt install python3
을 입력하여 python을 깔아준다.

깃허브 홈페이지에 들어가면
sudo pip install scrypt construct==2.5.2하라고 한다. 그러나 우리는 pip가 없기 때문에 먼저 pip를 깔아야 한다.

pip는 python의 패키지 매니저이다. 그래서 파이썬 프로그램을 실행시키려면 pip를 설치해야 한다.
sudo apt install python2-pip
sudo apt install python3-pip
위와 같이 입력해준다. 아마 sudo apt install python2-pip명령어는 오류가 날 확률이 크다. 그러면 아래의 방법으로 설치하자.

python2-pip설치 방법
먼저 sudo apt install python3-pip를 실행해서 pip2를 설치하는 방향으로 해야한다.
1. curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
을 GenesisH0디렉토리 안에서 실행해 get-pip.py파일을 다운받는다.

ls를 입력해 확인해보면 다음과 같이 'get-pip.py'파일이 생성되었음을 알 수 있다.
2. pip2 --version을 입력해보면 다음과 같이 뜬다. 설치가 안되었다고 한다. 당연한것이다.ㅣ

3. sudo python get-pip.py 파이썬3으로 get-pip.py파일을 실행시키는 것이다. 그러면 다음과 같이 뜬다.
다시 pip2 --version을 입력하면 다음과 같이 버전이 뜬다.

이제 GenesisH0에 나온대로
sudo pip install scrypt construct==2.5.2를 실행한다.
그런 다음 우리는 라이트 코인을 만들거니까 다음과 같이 입력해준다.

sudo python2 genesis.py -a scrypt -z "hello" -t 1631556398
-z:body내용임 -t : timestamp값으로 넣어준다.
timestamp값을 넣어야하는데, 여기에 코드를 쓰긴 무리니, http://www.unixtimestamp.com의 도움을 받는다.

간단히 여기의 값을 copy해서 -t에 써주면 된다. 그러면 시간이 오래 걸려서 결과물이 나올 것이다. 꽤 오래 걸릴수도 있으니 유의하자.


이러한 결과가 나왔다.

04ffff001d01040d68656c6c6f20696e67636f696e
algorithm: scrypt
merkle hash: e626b891a669ed58da1fb770e6ebf8b05665a60b2311fe7c286a29b917b0b619
pszTimestamp: hello ingcoin
pubkey: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
time: 1631556398
bits: 0x1e0ffff0
Searching for genesis hash..
genesis hash found!
nonce: 388257
genesis hash: f0339a023a5d3ec321acbf80514889d288b37de0ae93d801ba80a778935b28f1

이 중에 다음의 내용만이 필요하다.

pszTimestamp: hello ingcoin
pubkey: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
time: 1631556398
nonce: 388257
genesis hash: f0339a023a5d3ec321acbf80514889d288b37de0ae93d801ba80a778935b28f1
merkle hash: e626b891a669ed58da1fb770e6ebf8b05665a60b2311fe7c286a29b917b0b619

genesis.py파일은 genesis 블럭에 들어갈 값을 넣어준거지 블럭을 만들어준 것이 아니다. 그래서 우리가 직접 litecoin의 코드에 하드코딩으로 넣어주어야 한다.

01-07.라이트코인의 제네시스 블럭 수정하기

chainparams.cpp

👉51번째 줄의 pszTimestamp의 내용을 우리가 구한 내용으로 수정해준다. 여기서는 " hello ingcoin"이 되겠다. 그리고 52번째 줄 parseHex의 값을 pubkey의 값으로 수정해준다.

을 교체해준다.

👉121번째 줄에는 다음과 같이 되어있을 것이다.

첫번째 인자값을 time , 두번째는 nonce값을 넣어준다.
123번째 내용을 genesis hash값 넣어주고,
124번째 줄은 머클루트값을 넣어준다.
값을 수정할 때 0x뒤에 값을 붙여놓는다. (0x는 16진수로 표현하겠다는 표현이다.)

👉그리고127번째 줄부터 vSeeds.emplace_back코드가 여러개가 있을 것이다.

이 내용들을 주석처리 해주고 그 아래에 다음의 내용을 입력해준다.

     vSeeds.clear();
     vSeeds.emplace_back("",true);


주석처리하고 저 안에는 genesis hash값을 넣어준다.(0x다음에)

👉170번째 줄부근에 다음과 같이 chainTxData가 있을 것이다. 이 값을 수정하도록 하자.

처음값에 timestamp값을 넣어준다.


위와 같이 바꾸면 된다.




02.테스트넷 설정하기


02-1.chainparamsseeds.h

src폴더의 chainparamsseeds.h의 값의
main = {주석처리} test = { 주석처리 }를 해주어야 한다.


이런식으로 모두 주석처리를 해주면 된다.

02-2. chainparams.cpp

👉104번째 줄에 consensus.nMinimumChainWork의 값이 있다. 이전 해시값을 넣는 부분이다. 우리가 전에 제네시스 블럭을 만들었을 때는 0*repeat(64)를 넣었다. 그것과 똑같이 0을 채워주면 된다.

👉213-214줄도 똑같이 해준다.consensus.nMinimumChainWork

이후 제네시스 블럭도 테스트넷 값으로 설정해주어야 하기때문에 블록 내용이 달라진다.
원래 입력했던 값
python genesis.py -a scrypt -z "hello ingcoin" -t 1631556398

새롭게 구하는 값
python genesis.py -a scrypt -z "hello ingcoin" -t 1631597655 -n 388257
💥body값은 메인넷에서 만들었던 genensisblock과 똑같이 해준다!! 💥

///새로 나온 함수값으로 해준다.

04ffff001d01040d68656c6c6f20696e67636f696e
algorithm: scrypt
merkle hash: e626b891a669ed58da1fb770e6ebf8b05665a60b2311fe7c286a29b917b0b619
pszTimestamp: hello ingcoin
pubkey: 04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f
time: 1631597655
bits: 0x1e0ffff0
Searching for genesis hash..
1086.0 hash/s, estimate: 1098.6 hgenesis hash found!
nonce: 2463240
genesis hash: e48b37e14fefb8b3c7dbfcb58c5c1e2746ed489bc56be2b2dd4b553dda7e34a0

의 값이 새로이 다시 나왔다.
--------여기서부터 해야함.---------
testnet으로 적힌 값

👉227-228번째 줄 checkpointData부분
227번째 줄에 제네시스 해쉬값을 입력하고, 228번째 줄에 머클루트값 입력을 입력한다.
또한 genesis = Create...부분의 인자값이 여러개가 있는데, 첫번째에는 timestamp값을, 두번째는 nonce값을 입력한다.


👉252번째 줄 checkpointData부분엔 이렇게 나올 것이다.


여기에 0으로 고치고 뒤에는 0x붙이고 제네시스 해시값을 넣어준다.

👉258번째 줄 chainTxData의 값이 3개가 있음을 알 수 있다.


chainTxData안의 값을 고친다. 첫번째 값을 timestamp값으로 해주고, 두번째 값은 0으로 해준다. 세번째 값도 0.00으로 고쳐준다. (소수점을 수정해준다.)

잠시 코드해석

  • chainparams.cpp

    3.5일마다 난이도를 조절하고 싶다는 내용이다.

    적정 난이도의 시간이다. 1블럭 만드는데 걸리는 적정 시간을 뜻한다.
  • amount.h

    총 발행량을 뜻한다. 그래서 이걸 가지고 난이도를 조절하는 것이다. 총 발행량에 다가갈수록 채굴에는 더 많은 비용과 더 적은 보상을 지불해야할 것이다.
    -validation.cpp

    하나 채굴되었을 때 채굴 보상을 뜻한다.

02-3.바꾸기

src>qt>locale>bitcoin_ko_KR.ts
'라이트코인'이라고 쓰여있는 부분을 모두 '잉코인'으로 바꾸기
💥한글이다.영어로 litecoin>ingcoin으로 바꾸라는 말이 아니다. 💥

바꾸는 방법
아래와 같이 Ctrl+f 누르면 나오는 '찾기'창에서 🔽버튼을 누르면 바꾸는 기능이 나온다. 거기서 바꿔주면 된다.

02-4.이미지 변경하기

이미지의 이름을 변경한다.

  • src>qt>res>icons>litecoin_splash.png

위의 파일의 이름 바꾸어줄 것이다.

litecoin_splash.png->ingcoin_splash.png
doc>man>litecoin-qt.1 > ingcoin.qt.ico

  • doc>man
    있는 litecoin을 모두 ingcoin으로 바꾸어준다.


다 바꾸면 위와 같이 된다.

3.빌드하기


workspace/ingcoin_0.0.15에 들어간다.

PATH=$(echo "$PATH" | sed -e 's/:\/mnt.*//g')
sudo bash -c "echo 0 > /proc/sys/fs/binfmt_misc/status"

makefile이 존재하는 디렉토리
cd depends
ls -al

빌드를 시작한다.
make -j 8 HOST=x86_64-w64-mingw32


warning이 많이 떠도 괜찮다. 오류만 안뜨면 된다.

빌드가 완료되면
cd ..을 나가서 코인 폴더로 돌아간다.
./autogen.sh

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

make -j 8makefile을 실행시킴 파일을 빌드해줌.
만들어진 내용을 work폴더로 이동시킨다.

sudo make install DESTDIR=/mnt/c/Users/SH/working
여기서 SH는 본인 컴퓨터의 사용자 이름을 넣어주면 된다. 바탕화면으로 설치한 결과를 옮기는 작업이다.


내용이 만들어졌다. 설치가 된 것이다.

추가로 설치용 .exe파일을 만드려면...
make deploy
하면 다음과 같이 exe파일이 만들어진다.

ls-al을 쳐서 디렉토리를 확인해보면 잘 빌드가 되었음을 알 수 있다.

위 파일을 남에게 전송하고, 그 사람이 이 파일을 실행하면 '잉코인'의 파일들이 설치되는 것이다. ㅎㅎㅎㅎ

4.실행하기

이제 윈도우에서 c:/Users/SH/working디렉토리에 들어가보자.
거기에서 data폴더를 만들자.

그리고 bin폴더에 들어간다.

여기서 바로 ingcoin-qt파일을 실행시키면 다음과 같은 오류가 날 것이다.

당황하지 말고 그 위치에서 윈도우 터미널을 실행시켜준다.

.\ingcoin-qt.exe -datadir=C:\Users\SH\working\data을 입력해준다.
아까 만들었던 data폴더에 데이터 디렉토리를 만드는 것이다.

그러면 아래와 같이 실행이 된다.
앞으로도 이렇게 열어주어야 한다....ㅋㅋㅋㅋㅋ

profile
코딩 재밌어요!

1개의 댓글

comment-user-thumbnail
2021년 9월 24일

코인 빌드하는데 도움 엄청 많이 되었습니다 정리 진짜 잘 되어있는 것 같아요!!

답글 달기