2018. 12. 29. 09:41
반응형
비트코인 계열의 가상화폐의 소스를 수정하여 다른 새로운 알트코인을 만들고 싶을 때가 있다.
이때 제네시스 블록을 생성해야 하는데 소스 코드를 살짝 수정하여 그것을 찾아내야 한다.
다음의 소스코드를 이용하여 어떻게 잘해서 잘되면 잘된다.
3가지 정도의 방법을 찾았는데 각자 맞는 방법으로 하면 된다.
참고로 2번째와 3번째는 대충봐도 거의 비슷한 방법으로 보인다.
너무 대충 본거라서 아닐 가능성도 있긴하다.
if(genesis.GetHash() != uint256("0x")) { printf("MSearching for genesis block...\n"); uint256 hashTarget; hashTarget.SetCompact(genesis.nBits); while(uint256(genesis.GetHash()) > uint256(hashTarget)) { ++genesis.nNonce; if (genesis.nNonce == 0) { printf("Mainnet NONCE WRAPPED, incrementing time"); std::cout << std::string("Mainnet NONCE WRAPPED, incrementing time:\n"); ++genesis.nTime; } if (genesis.nNonce % 10000 == 0) { printf("Mainnet: nonce %08u: hash = %s \n", genesis.nNonce, genesis.GetHash().ToString().c_str()); } } printf("Mainnet block.nTime = %u \n", genesis.nTime); printf("Mainnet block.nNonce = %u \n", genesis.nNonce); printf("Mainnet block.hashMerkleRoot: %s\n", genesis.hashMerkleRoot.ToString().c_str()); printf("Mainnet block.GetHash = %s\n", genesis.GetHash().ToString().c_str()); }
static void MineGenesis(CBlockHeader& genesisBlock, const uint256& powLimit, bool noProduction) { if(noProduction) genesisBlock.nTime = std::time(0); genesisBlock.nNonce = 0; printf("NOTE: Genesis nTime = %u \n", genesisBlock.nTime); printf("WARN: Genesis nNonce (BLANK!) = %u \n", genesisBlock.nNonce); arith_uint256 besthash; memset(&besthash,0xFF,32); arith_uint256 hashTarget = UintToArith256(powLimit); printf("Target: %s\n", hashTarget.GetHex().c_str()); arith_uint256 newhash = UintToArith256(genesisBlock.GetHash()); while (newhash > hashTarget) { genesisBlock.nNonce++; if (genesisBlock.nNonce == 0) { printf("NONCE WRAPPED, incrementing time\n"); ++genesisBlock.nTime; } // If nothing found after trying for a while, print status if ((genesisBlock.nNonce & 0xfff) == 0) printf("nonce %08X: hash = %s (target = %s)\n", genesisBlock.nNonce, newhash.ToString().c_str(), hashTarget.ToString().c_str()); if(newhash < besthash) { besthash = newhash; printf("New best: %s\n", newhash.GetHex().c_str()); } newhash = UintToArith256(genesisBlock.GetHash()); } printf("Genesis nTime = %u \n", genesisBlock.nTime); printf("Genesis nNonce = %u \n", genesisBlock.nNonce); printf("Genesis nBits: %08x\n", genesisBlock.nBits); printf("Genesis Hash = %s\n", newhash.ToString().c_str()); printf("Genesis Hash Merkle Root = %s\n", genesisBlock.hashMerkleRoot.ToString().c_str()); }
void MineGenesis(CBlock genesis){ // This will figure out a valid hash and Nonce if you're creating a different genesis block: uint256 hashTarget = CBigNum().SetCompact(Params().ProofOfWorkLimit().GetCompact()).getuint256(); printf("Target: %s\n", hashTarget.GetHex().c_str()); uint256 newhash = genesis.GetHash(); uint256 besthash; memset(&besthash,0xFF,32); while (newhash > hashTarget) { ++genesis.nNonce; if (genesis.nNonce == 0){ printf("NONCE WRAPPED, incrementing time"); ++genesis.nTime; } newhash = genesis.GetHash(); if(newhash < besthash){ besthash=newhash; printf("New best: %s\n", newhash.GetHex().c_str()); } } printf("Found Genesis, Nonce: %ld, Hash: %s\n", genesis.nNonce, genesis.GetHash().GetHex().c_str()); printf("Gensis Hash Merkle: %s\n", genesis.hashMerkleRoot.ToString().c_str()); }
printf("Searching for genesis block...\n"); uint256 hashTarget = CBigNum().SetCompact(genesis.nBits).getuint256(); uint256 thash; while(true){ thash = genesis.GetHash(); if(thash <= hashTarget) break; if((genesis.nNonce & 0xFFF) == 0){ printf("nonce %08X: hash = %s (target = %s)\n", genesis.nNonce, thash.ToString().c_str(), hashTarget.ToString().c_str()); } ++genesis.nNonce; if (genesis.nNonce == 0) { printf("NONCE WRAPPED, incrementing time\n"); ++genesis.nTime; } } printf("block.nTime = %u \n", genesis.nTime); printf("block.nNonce = %u \n", genesis.nNonce); printf("block.GetHash = %s\n", genesis.GetHash().ToString().c_str()); printf("block.merkle = %s\n", genesis.hashMerkleRoot.ToString().c_str());
반응형
'dev' 카테고리의 다른 글
[Linux] Ubuntu16 python3.6 설치 방법 (1) | 2019.01.22 |
---|---|
[Python] csv 파일 읽기 (0) | 2019.01.14 |
[Java] 자바 command line 실행 (jar 만들어서) (0) | 2019.01.09 |
[Bitcoin] 암호화폐 지갑 주소 백업 및 import (0) | 2019.01.08 |
[jQuery] html() done 기능 (0) | 2018.12.15 |
[Python] bcrypt 암호화 자바의 BCryptPasswordEncoder와 같이 사용 (0) | 2018.11.08 |
[JavaScript] textarea 엔터키 자바스크립트에서 <br/>로 변환 (0) | 2018.10.25 |
[Linux] Unable to lock the administration directory (/var/lib/dpkg/) 에러 해결 (0) | 2018.10.23 |