dukDukz
[블록체인] 라이트 코인 빌드 본문
# 나만의 코인 만들기 - 라이트 코인 (litecoin)
https://github.com/litecoin-project/litecoin.git
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
이렇게 해주기
그리고 가서 실행해보면 잘 열리는듯
'웹 개발 > 블록체인' 카테고리의 다른 글
[블록체인] 트랜젝션 transaction [실습] (0) | 2021.09.24 |
---|---|
[블록체인] 데몬 서버와 클라이언트 연결 (0) | 2021.09.17 |
[블록체인] 빌드 (0) | 2021.09.13 |
[블록체인] 리눅스에서 C++ 환경 구축 (0) | 2021.09.10 |
[블록체인] 용어들 [메인넷/테스트넷 , 메타마스크, 코인과 토큰, ERC 20과 ERC-721] (0) | 2021.09.09 |