사랑하애오
article thumbnail
Published 2022. 1. 24. 09:04
블록체인 라이트코인 빌드 BlockChain

비트코인 기반 오픈소스 라이트코인으로 나만의 미미코인을 빌드할것입니다.

리눅스에서 작업할 것입니다.

 

mkdir workspace/
cd workspace/

일단 작업할 디렉토리를 생성하고 들어갑니다.

 

sudo apt update && sudo apt upgrade

시작에 앞서 먼저 해주시고

 

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

필수 요소들을 설치해줍니다.

 

이제 본격적으로 시작합니다.

라이트코인(비트코인 기반) 깃 클론하기

git clone -b 0.15 --single-branch https://github.com/litecoin-project/litecoin.git ./mimicoin

// 맨 뒤에 ./[당신이 빌드할 코인]

 

 

cd mimicoin/

ls -al

클론 된 디렉토리로 들어가 파일들이 정상적으로 다운됐는지 확인

 

mingw 설정

sudo apt install g++-mingw-w64-x86-64	// mingw를 사용하기 위해 설치
sudo update-alternatives --config x86_64-w64-mingw32-g++	// posix set하기 위해서

 

두번째 명령어에서 number를 1을 누르고 enter치시면 setting이 posix로 바뀝니다.

 

라이트코인 이름을 핑크코인으로 변경 및 포트 변경

한번에 복붙하지 말고 하나하나 해줍니다.

// 이름 바꾸기
find ./ -type f -readable -writable -exec sed -i "s/Litecoin/Mimicoin/g" {} \;
find ./ -type f -readable -writable -exec sed -i "s/LiteCoin/MimiCoin/g" {} \;
find ./ -type f -readable -writable -exec sed -i "s/liteCoin/mimiCoin/g" {} \;
find ./ -type f -readable -writable -exec sed -i "s/litecoin/mimicoin/g" {} \;
find ./ -type f -readable -writable -exec sed -i "s/litecoind/mimicoind/g" {} \;
find ./ -type f -readable -writable -exec sed -i "s/LITECOIN/MIMICOIN/g" {} \;
find ./ -type f -readable -writable -exec sed -i "s/lites/mimis/g" {} \;

// 단위 바꾸기
find ./ -type f -readable -writable -exec sed -i "s/LTC/PNK/g" {} \;
find ./ -type f -readable -writable -exec sed -i "s/photons/mphotons/g" {} \;	// 코인의 앞글자

// 포트 바꾸기
find . -type f -print0 | xargs -0 sed -i 's/9332/9525/g'	// rpc : 9525 (메인넷)
find . -type f -print0 | xargs -0 sed -i 's/9333/9535/g'	// tcp : 9535 (메인넷)

find . -type f -print0 | xargs -0 sed -i 's/19332/19525/g'	// rpc : 19525 (테스트넷)
find . -type f -print0 | xargs -0 sed -i 's/19335/19535/g'	// tcp : 19535 (테스트넷)

 


VSCode로 코드 수정

 

네트워크 구성 변경(메인넷, 테스트넷)

 

계산기를 이용해서 16진수 계산을 한다.

자신이 증감하고 싶은 수를 메인넷, 테스트넷 0x 뒤에 값을 모두 계산하여 변경해준다.

작성자는 2를 모두 더해줬습니다.

src/chainparams.cpp

메인넷(변경 전)

/*114 */        pchMessageStart[0] = 0xfb;
/*115 */        pchMessageStart[1] = 0xc0; 
/*116 */        pchMessageStart[2] = 0xb6;  
/*117 */        pchMessageStart[3] = 0xdb;

 

위와 같은 식으로 하면 됩니다.

 

메인넷(변경 후)

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

 

테스트넷(변경 후)

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

 

 

해당 코인으로 번호 변경

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

 

List of address prefixes - Bitcoin Wiki

Blockchain-based currencies use encoded strings, which are in a Base58Check encoding with the exception of Bech32 encodings. The encoding includes a prefix (traditionally a single version byte), which affects the leading symbol(s) in the encoded result. Th

en.bitcoin.it

아래쪽에 Leading Symbol 쪽 봐보면 p가 55번 으로 바꿔서 저장 (pinkcoin의 선행기호)

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

기존은 litecoin의 i라 48로 되있다.

 

 

제네시스 블록 생성

cd workspace/
git clone https://github.com/lhartik/GenesisH0

pinkcoin디렉토리에서 나와서 깃 클론을 한다.

 

cd GenesisH0/
ls -al

완료 됐다면 genesis.py가 있는 확인

 

 

파이썬 설치

 

python2는 해당 제네시스 파일이 print할 때 ( ) 가 있다.

하지만 python3는 ( ) 를 지원하지 않지만 pip이 python3부터지원이 된다.

그래서 해당 파이썬들을 설치한다.

sudo apt install python2 && sudo apt install python3

sudo apt install pip

sudo pip2 install scrypt	

pip install construct==2.5.2

 

https://www.unixtimestamp.com/

 

Unix Time Stamp - Epoch Converter

Epoch and unix timestamp converter for developers. Date and time function syntax reference for various programming languages.

www.unixtimestamp.com

위 사이트에서 유닉스타임을 갖고와야한다.

 

python2 genesis.py -a scrypt -z "Time doesnt wait for you" -t 1623341241

그 다음 제너레이터를 해줄 것이다.

가져온 시간을 -t 뒤에 넣어준다.

-z 뒤에 문장은 넣고 싶은 의미있는 문장을 넣으면 된다.

 

위 내용들로 chainparams.cpp을 수정할 것이다.

코드 위치는 이상하게 사람마다 다르긴한데 그 근처에 있으니 찾아서 수정하면된다. 


메인넷 설정

 

 pszTimestamp 를 수정

/* 51 */

const char* pszTimestamp = "Time doesnt wait for you";

 

ParseHex 를 publickey로 수정

/* 52 */

const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG;

 

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

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

/* 123 */

genesis = CreateGenesisBlock(1623341241, 566683, 0x1e0ffff0, 1, 50 * COIN);

 

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

/* 125 */

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

 

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

/* 126 */

assert(genesis.hashMerkleRoot == uint256S("0xd998f5f3c31bc4b32a767641558f25005744f3376798d77cd02e94164b888ff4"));

 

129~133 (vSeeds부분 전부 주석 처리)

주석 처리하고 그 밑에 바로 코드 추가

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

 

150번줄 안에 내용 주석처리 하고 {0, genesis hash} 추가

checkpointData = (CCheckpointData){
            {
                {0, uint256S("0x5f9df45f80442c24beae9e8b964f33411efb5f2326f2a813b037897181026ae5")},
                // {1500, uint256S("0x841a2965955dd288cfa707a755d05a54e45f8bd476835ec9af4402a2b59a2967")},
                // {4032, uint256S("0x9ce90e427198fc0ef05e5905ce3503725b80e26afd35a987965fd7e3d9cf0846")},
                // {8064, uint256S("0xeb984353fc5190f210651f150c40b8a4bab9eeeff0b729fcb3987da694430d70")},
                // {16128, uint256S("0x602edf1859b7f9a6af809f1d9b0e6cb66fdc1d4d9dcd7a4bec03e12a1ccd153d")},
                // {23420, uint256S("0xd80fdf9ca81afd0bd2b2a90ac3a9fe547da58f2530ec874e978fce0b5101b507")},
                // {50000, uint256S("0x69dc37eb029b68f075a5012dcc0419c127672adb4f3a32882b2b3e71d07a20a6")},
                // {80000, uint256S("0x4fcb7c02f676a300503f49c764a89955a8f920b46a8cbecb4867182ecdb2e90a")},
                // {120000, uint256S("0xbd9d26924f05f6daa7f0155f32828ec89e8e29cee9e7121b026a7a3552ac6131")},
                // {161500, uint256S("0xdbe89880474f4bb4f75c227c77ba1cdc024991123b28b8418dbbf7798471ff43")},
                // {179620, uint256S("0x2ad9c65c990ac00426d18e446e0fd7be2ffa69e9a7dcb28358a50b2b78b9f709")},
                // {240000, uint256S("0x7140d1c4b4c2157ca217ee7636f24c9c73db39c4590c4e6eab2e3ea1555088aa")},
                // {383640, uint256S("0x2b6809f094a9215bafc65eb3f110a35127a34be94b7d0590a096c3f126c6f364")},
                // {409004, uint256S("0x487518d663d9f1fa08611d9395ad74d982b667fbdc0e77e9cf39b4f1355908a3")},
                // {456000, uint256S("0xbf34f71cc6366cd487930d06be22f897e34ca6a40501ac7d401be32456372004")},
                // {638902, uint256S("0x15238656e8ec63d28de29a8c75fcf3a5819afc953dcd9cc45cecc53baec74f38")},
                // {721000, uint256S("0x198a7b4de1df9478e2463bd99d75b714eab235a2e63e741641dc8a759a9840e5")},
            }};

 

timestamp 수정하고 밑에 값 전부 0으로 바꾸기

chainTxData = ChainTxData{
            // Data as of block 59c9b9d3fec105bdc716d84caa7579503d5b05b73618d0bf2d5fa639f780a011 (height 1353397).
            1623341241, // * UNIX timestamp of last known number of transactions
            0,          // * total number of transactions between genesis and that timestamp
                        //   (the tx=... number in the SetBestChain debug.log lines)
            0.00        // * estimated number of transactions per second after that timestamp
        };

 


 

테스트넷

 

chainparamsseeds.h 수정

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

 

chainparams.cpp 수정

0x 뒤에 전부 0으로

/* 217 */

consensus.nMinimumChainWork = uint256S("0x0000000000000000000000000000000000000000000000000000000000000000");

 

이렇게 하고 나서 테스트넷도 제너레이터를 돌려서 더 수정해야한다.

 

chainparams.cpp

time과 nonce 수정

/* 229 */

genesis = CreateGenesisBlock(1641362400, 320543, 0x1e0ffff0, 1, 50 * COIN);

 

genesis hash와 merkle hash 수정

/* 231, 232 */

assert(consensus.hashGenesisBlock == uint256S("0x9048950c39442ad444317df41aaf9031474df99864495985eb7bbb50173eab5d"));
        assert(genesis.hashMerkleRoot == uint256S("0xd998f5f3c31bc4b32a767641558f25005744f3376798d77cd02e94164b888ff4"));

 

237번째 줄부터 주석(vSeeds 부분 전부)

// vSeeds.emplace_back("testnet-seed.pinkcointools.com", true);
// vSeeds.emplace_back("seed-b.pinkcoin.loshan.co.uk", true);
// vSeeds.emplace_back("dnsseed-testnet.thrasher.io", true);

 

254번째 줄 genesis hash 수정

 checkpointData = (CCheckpointData){
            {
                {2056, uint256S("9048950c39442ad444317df41aaf9031474df99864495985eb7bbb50173eab5d")},
            }};

 

259번째 줄 timestamp 수정후 밑에 2개 값 0으로 변경

chainTxData = ChainTxData{
            // Data as of block a0afbded94d4be233e191525dc2d467af5c7eab3143c852c3cd549831022aad6 (height 343833)
            1641362400,
            0,
            0.00};

 


 

코인 발행량과 난이도 및 채굴 갯수 조절

 

amount.h가 코인 발행량을 정하는 곳이다.

 

static const CAmount MAX_MONEY = 42000000 * COIN;

수정전에는 84000000인데 절반으로 줄인다.

이제 이 갯수를 토대로 채굴시간과 난이도 조절 일자를 정한다.

 

chainparams.cpp로 돌아와서

85번째 줄 근처 보면

// 수정전

consensus.nPowTargetTimespan = 3.5 * 24 * 60 * 60; // 3.5 days
consensus.nPowTargetSpacing = 2.5 * 60;

기본 값이 위와 같다.

블록이 2.5분마다 생성되어야 하고 난이도를 3.5일마다 한번씩 너무 많이 캐면 어렵게 조절해주고

너무 채굴이 안되면 쉽게 조절해주는 시간이다.

하지만 개수가 라이트 코인에 비해 2배 적어졌으니 채굴시간이나 난이도는 2배 상향되어야 한다.

 
// 수정후

consensus.nPowTargetTimespan = 7 * 24 * 60 * 60; // 3.5 days
consensus.nPowTargetSpacing = 5 * 60;

 

그 다음은 채굴을 하면 원래 100블록 5000개정도 모인뒤에 승인이 된다.

이 부분을 테스트로 만드는 것이라 줄여보자.

src/consensus/consensus.h

static const int COINBASE_MATURITY = 100;	//수정전 default

static const int COINBASE_MATURITY = 2;		// 이거로 수정
 

즉, 블록 2개만 채굴할때부터 모든 채굴에 대해 승인이 되는 것.

 


 

IP 수정

 

아까 chainparamsseeds.h를 주석처리 했는데 아예 삭제하고 진행합니다.

다시 만들 것이기에 걱정 ㄴㄴ

 

해당 내용들을 지워도 무관하지만 일단 잘보자.

테스트포트(19535)랑 메인넷포트(9535)를 자신과 연결할 아이피와 해당포트를 적자.

저 해당포트를 지켜줘야한다.

예시로 내 main은 이렇게 연결한다. (예시)

192.168.0.55:9535
192.168.0.117:9535
192.168.0.17:9535
192.168.0.121:9535
192.168.0.120:9535
 

메인넷에 사람들이랑 통신하기 위해 적음. 오라클 클라우드의 아이피도 필요

 

pinkcoin/contrib/seeds

README.md를 보면 설명이 되어 있고 txt 파일로 만들어서 마지막 스크롤 된 명령어를 실행하면 끝

python3 generate-seeds.py . > ../../src/chainparamsseeds.h


위 명령어를 실행하면 chainparamsseeds.h가 만들어짐

내가 설정한 ip가 16진수로 표기됨.

 

 


 

이미지 수정 및 man 수정

 

기본 라이트코인 이미지들로 되있는 것을 바꿀 것이다.

src/qt/res/icons

bitcoin 단어들이 있는 png, icns, ico 파일들을 모두 원하는 사진으로 바꿔준다.

픽셀(해상도)를 꼭 맞춰서 넣어야한다.

그리고 밑에 내리면 litecoin_splash 파일도 본인코인이름_splash로 바꾼다.

 

doc/man

여기도 litecoin을 본인의 코인이름으로 바꾸면 된다.

 

이제 프로그래밍은 끝이고 뒤에서는 리눅스에서 빌드를 할 것이다.

 


리눅스 Build

 

 

https://github.com/bitcoin/bitcoin/blob/master/doc/build-windows.md

 

GitHub - bitcoin/bitcoin: Bitcoin Core integration/staging tree

Bitcoin Core integration/staging tree. Contribute to bitcoin/bitcoin development by creating an account on GitHub.

github.com

위 사이트의 README.md 처럼 하면 된다.

 

cd mimicoin/

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

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

cd depends

make HOST=x86_64-w64-mingw32 -j 4 // 자신의 코어에 맞게 기본은 4

cd ..

./autogen.sh

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

make -j 4 

cd src

ll // .exe파일을 확인한다

cd ..

make install DESTDIR=/mnt/C:/Users/이성현/Desktop/work/mimicoin // 윈도우에 있다

sudo make deploy

or

make deploy

여기 ll(엘엘) 단계에서 .exe 파일이 없다면 우리가 코드 복붙하는 과정에서

작업한 uint256 뒤에 s가 없어서 오류가 발생한다.

원인은 그냥 복붙이 가끔 인식을 제대로 하지 못하는 것. 복붙할때 제대로 복붙되었는지 확인

 

위의 과정을 모두 완료하면 윈도우 C드라이브에 생기는 것을 볼 수 있다. 

 

이 포스팅을 하면서 발생했던 에러들은 다음 포스트에서 모아서 정리하고자 합니다. 수고링~

profile

사랑하애오

@사랑하애

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!