From 7a4c01c9c11137f390abe400820dc60460f670ec Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 29 Oct 2016 11:15:24 -0300 Subject: [PATCH] test --- src/chainparams.cpp | 138 +++----------------------------------------- src/chainparams.h | 4 -- src/komodo.h | 1 - src/komodo_notary.h | 9 ++- src/komodo_utils.h | 10 ++-- src/main.cpp | 12 +++- src/miner.cpp | 104 ++++++++++++++++++++++++++++----- 7 files changed, 118 insertions(+), 160 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index af80a5189..3793a4571 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -31,17 +31,17 @@ using namespace std; */ void *chainparams_commandline(void *ptr); extern char ASSETCHAINS_SYMBOL[16]; -uint16_t ASSETCHAINS_PORT = 8777; +uint16_t ASSETCHAINS_PORT = 0; uint32_t ASSETCHAIN_INIT = 0; uint32_t ASSETCHAINS_MAGIC = 2387029918; -uint32_t ASSETCHAINS_TIMESTAMP = 1475772963; -uint64_t ASSETCHAINS_SUPPLY = 1000000; +uint64_t ASSETCHAINS_SUPPLY = 10; const arith_uint256 maxUint = UintToArith256(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); class CMainParams : public CChainParams { public: - CMainParams() { + CMainParams() + { strNetworkID = "main"; consensus.fCoinbaseMustBeProtected = false;//true; consensus.nSubsidySlowStartInterval = 20000; @@ -50,8 +50,6 @@ public: consensus.nMajorityRejectBlockOutdated = 950; consensus.nMajorityWindow = 4000; consensus.powLimit = uint256S("0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f"); - - //consensus.powLimit = uint256S("0007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); consensus.nPowAveragingWindow = 17; assert(maxUint/UintToArith256(consensus.powLimit) >= consensus.nPowAveragingWindow); consensus.nPowMaxAdjustDown = 32; // 32% adjustment down @@ -69,7 +67,6 @@ public: pchMessageStart[3] = 0x8d; vAlertPubKey = ParseHex("020e46e79a2a8d12b9b5d12c7a91adb4e454edfae43c0a0cb805427d2ac7613fd9"); nDefaultPort = 7770; - nMinerThreads = 0; nMaxTipAge = 24 * 60 * 60; nPruneAfterHeight = 100000; @@ -77,46 +74,27 @@ public: BOOST_STATIC_ASSERT(equihash_parameters_acceptable(N, K)); nEquihashN = N; nEquihashK = K; - - /** - * Build the genesis block. Note that the output of its generation - * transaction cannot be spent since it did not originally exist in the - * database (and is in any case of zero value). - * CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1) - * CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0) - * CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73) - * CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) - * vMerkleTree: 4a5e1e - */ const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; CMutableTransaction txNew; txNew.vin.resize(1); txNew.vout.resize(1); txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); txNew.vout[0].nValue = 50 * COIN; - - /*txNew.vin[0].scriptSig = CScript() << 520617983 << CScriptNum(4) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); - txNew.vout[0].nValue = 0;*/ txNew.vout[0].scriptPubKey = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; genesis.vtx.push_back(txNew); genesis.hashPrevBlock.SetNull(); genesis.hashMerkleRoot = genesis.BuildMerkleTree(); - genesis.nVersion = 1; genesis.nTime = 1231006505; - // TODO generate harder genesis block - //genesis.nBits = 0x1d00ffff; genesis.nBits = KOMODO_MINDIFF_NBITS; genesis.nNonce = uint256S("0x000000000000000000000000000000000000000000000000000000000000000b"); genesis.nSolution = ParseHex("000d5ba7cda5d473947263bf194285317179d2b0d307119c2e7cc4bd8ac456f0774bd52b0cd9249be9d40718b6397a4c7bbd8f2b3272fed2823cd2af4bd1632200ba4bf796727d6347b225f670f292343274cc35099466f5fb5f0cd1c105121b28213d15db2ed7bdba490b4cedc69742a57b7c25af24485e523aadbb77a0144fc76f79ef73bd8530d42b9f3b9bed1c135ad1fe152923fafe98f95f76f1615e64c4abb1137f4c31b218ba2782bc15534788dda2cc08a0ee2987c8b27ff41bd4e31cd5fb5643dfe862c9a02ca9f90c8c51a6671d681d04ad47e4b53b1518d4befafefe8cadfb912f3d03051b1efbf1dfe37b56e93a741d8dfd80d576ca250bee55fab1311fc7b3255977558cdda6f7d6f875306e43a14413facdaed2f46093e0ef1e8f8a963e1632dcbeebd8e49fd16b57d49b08f9762de89157c65233f60c8e38a1f503a48c555f8ec45dedecd574a37601323c27be597b956343107f8bd80f3a925afaf30811df83c402116bb9c1e5231c70fff899a7c82f73c902ba54da53cc459b7bf1113db65cc8f6914d3618560ea69abd13658fa7b6af92d374d6eca9529f8bd565166e4fcbf2a8dfb3c9b69539d4d2ee2e9321b85b331925df195915f2757637c2805e1d4131e1ad9ef9bc1bb1c732d8dba4738716d351ab30c996c8657bab39567ee3b29c6d054b711495c0d52e1cd5d8e55b4f0f0325b97369280755b46a02afd54be4ddd9f77c22272b8bbb17ff5118fedbae2564524e797bd28b5f74f7079d532ccc059807989f94d267f47e724b3f1ecfe00ec9e6541c961080d8891251b84b4480bc292f6a180bea089fef5bbda56e1e41390d7c0e85ba0ef530f7177413481a226465a36ef6afe1e2bca69d2078712b3912bba1a99b1fbff0d355d6ffe726d2bb6fbc103c4ac5756e5bee6e47e17424ebcbf1b63d8cb90ce2e40198b4f4198689daea254307e52a25562f4c1455340f0ffeb10f9d8e914775e37d0edca019fb1b9c6ef81255ed86bc51c5391e0591480f66e2d88c5f4fd7277697968656a9b113ab97f874fdd5f2465e5559533e01ba13ef4a8f7a21d02c30c8ded68e8c54603ab9c8084ef6d9eb4e92c75b078539e2ae786ebab6dab73a09e0aa9ac575bcefb29e930ae656e58bcb513f7e3c17e079dce4f05b5dbc18c2a872b22509740ebe6a3903e00ad1abc55076441862643f93606e3dc35e8d9f2caef3ee6be14d513b2e062b21d0061de3bd56881713a1a5c17f5ace05e1ec09da53f99442df175a49bd154aa96e4949decd52fed79ccf7ccbce32941419c314e374e4a396ac553e17b5340336a1a25c22f9e42a243ba5404450b650acfc826a6e432971ace776e15719515e1634ceb9a4a35061b668c74998d3dfb5827f6238ec015377e6f9c94f38108768cf6e5c8b132e0303fb5a200368f845ad9d46343035a6ff94031df8d8309415bb3f6cd5ede9c135fdabcc030599858d803c0f85be7661c88984d88faa3d26fb0e9aac0056a53f1b5d0baed713c853c4a2726869a0a124a8a5bbc0fc0ef80c8ae4cb53636aa02503b86a1eb9836fcc259823e2692d921d88e1ffc1e6cb2bde43939ceb3f32a611686f539f8f7c9f0bf00381f743607d40960f06d347d1cd8ac8a51969c25e37150efdf7aa4c2037a2fd0516fb444525ab157a0ed0a7412b2fa69b217fe397263153782c0f64351fbdf2678fa0dc8569912dcd8e3ccad38f34f23bbbce14c6a26ac24911b308b82c7e43062d180baeac4ba7153858365c72c63dcf5f6a5b08070b730adb017aeae925b7d0439979e2679f45ed2f25a7edcfd2fb77a8794630285ccb0a071f5cce410b46dbf9750b0354aae8b65574501cc69efb5b6a43444074fee116641bb29da56c2b4a7f456991fc92b2"); consensus.hashGenesisBlock = genesis.GetHash(); - assert(consensus.hashGenesisBlock == uint256S("0x027e3758c3a65b12aa1046462b486d0a63bfa1beae327897f56c5cfb7daaae71")); assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b")); vFixedSeeds.clear(); vSeeds.clear(); - // TODO: set up bootstrapping for mainnet base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,60); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,85); @@ -128,21 +106,6 @@ public: // guarantees the first two characters, when base58 encoded, are "SK" base58Prefixes[ZCSPENDING_KEY] = {171,54}; - /* - // guarantees the first 2 characters, when base58 encoded, are "t1" - base58Prefixes[PUBKEY_ADDRESS] = {0x1C,0xB8}; - // guarantees the first 2 characters, when base58 encoded, are "t3" - base58Prefixes[SCRIPT_ADDRESS] = {0x1C,0xBD}; - // the first character, when base58 encoded, is "5" or "K" or "L" (as in Bitcoin) - base58Prefixes[SECRET_KEY] = {0x80}; - // do not rely on these BIP32 prefixes; they are not specified and may change - base58Prefixes[EXT_PUBLIC_KEY] = {0x04,0x88,0xB2,0x1E}; - base58Prefixes[EXT_SECRET_KEY] = {0x04,0x88,0xAD,0xE4}; - // guarantees the first 2 characters, when base58 encoded, are "zc" - base58Prefixes[ZCPAYMENT_ADDRRESS] = {0x16,0x9A}; - // guarantees the first 2 characters, when base58 encoded, are "SK" - base58Prefixes[ZCSPENDING_KEY] = {0xAB,0x36};*/ - vFixedSeeds = std::vector(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main)); fRequireRPCPassword = true; @@ -151,8 +114,8 @@ public: fRequireStandard = true; fMineBlocksOnDemand = false; fTestnetToBeDeprecatedFieldRPC = false; - - checkpointData = (Checkpoints::CCheckpointData) { + checkpointData = (Checkpoints::CCheckpointData) + { boost::assign::map_list_of ( 0, consensus.hashGenesisBlock), genesis.nTime, // * UNIX timestamp of last checkpoint block @@ -171,87 +134,19 @@ public: }; static CMainParams mainParams; -CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) -{ - CMutableTransaction txNew; - txNew.nVersion = 1; - txNew.vin.resize(1); - txNew.vout.resize(1); - txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); - txNew.vout[0].nValue = genesisReward; - txNew.vout[0].scriptPubKey = genesisOutputScript; - - CBlock genesis; - genesis.nTime = nTime; - genesis.nBits = nBits; - memcpy(&genesis.nNonce,&nNonce,sizeof(nNonce)); - genesis.nVersion = nVersion; - genesis.vtx.push_back(txNew); - genesis.hashPrevBlock.SetNull(); - genesis.hashMerkleRoot = txNew.GetHash();//BlockMerkleRoot(genesis); - return genesis; -} -#define GENESIS_STRING "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks" - -CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) -{ - const char* pszTimestamp = GENESIS_STRING; - const CScript genesisOutputScript = CScript() << ParseHex("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f") << OP_CHECKSIG; - return CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward); -} - void *chainparams_commandline(void *ptr) { - //CChainParams *consensus = (CChainParams *)ptr; - static CBlock genesis; - uint32_t nonce; bool fNegative,fOverflow; arith_uint256 bnTarget; uint256 tmp,hash,powlimit; - powlimit = uint256S("000fffff00000000000000000000000000000000000000000000000000000000"); - //fprintf(stderr,"POWLIMIT.%s\n",powlimit.ToString().c_str()); while ( ASSETCHAINS_PORT == 0 ) { sleep(1); - //fprintf(stderr,"port.%u\n",ASSETCHAINS_PORT); } + fprintf(stderr,"port.%u\n",ASSETCHAINS_PORT); mainParams.SetDefaultPort(ASSETCHAINS_PORT); mainParams.pchMessageStart[0] = ASSETCHAINS_MAGIC & 0xff; mainParams.pchMessageStart[1] = (ASSETCHAINS_MAGIC >> 8) & 0xff; mainParams.pchMessageStart[2] = (ASSETCHAINS_MAGIC >> 16) & 0xff; mainParams.pchMessageStart[3] = (ASSETCHAINS_MAGIC >> 24) & 0xff; - //fprintf(stderr,"%s port.%u magic.%08x timestamp.%u supply.%u\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_MAGIC,ASSETCHAINS_TIMESTAMP,(int32_t)ASSETCHAINS_SUPPLY); - for (nonce=ASSETCHAINS_SUPPLY; nonce UintToArith256(powlimit) ) - { - fprintf(stderr,"%d %d target > powlimit\n",fNegative,fOverflow); - continue; - } - hash = genesis.GetHash(); - if ( UintToArith256(hash) > bnTarget ) - { - tmp = ArithToUint256(bnTarget); - //fprintf(stderr,"%u: hash %s > target %s\n",nonce,hash.ToString().c_str(),tmp.ToString().c_str()); - continue; - } - break; - } - if ( nonce == ASSETCHAINS_SUPPLY+1000000 ) - { - fprintf(stderr,"couldnt find nonce, abort\n"); - exit(-1); - } - mainParams.setnonce(nonce); - mainParams.settimestamp(ASSETCHAINS_TIMESTAMP); - fprintf(stderr,">>>>>>>>>> %u: merkle %s hash %s <= target %s\n",nonce,genesis.hashMerkleRoot.ToString().c_str(),genesis.GetHash().ToString().c_str(),tmp.ToString().c_str()); - mainParams.consensus.hashGenesisBlock = genesis.GetHash(); - mainParams.recalc_genesis(nonce); - fprintf(stderr,">>>>>>>>>> %u: hash %s merkle %s timestamp.%u\n",*(uint32_t *)&mainParams.GenesisBlock().nNonce,mainParams.GenesisBlock().GetHash().ToString().c_str(),mainParams.GenesisBlock().hashMerkleRoot.ToString().c_str(),mainParams.GenesisBlock().nTime); - - //set_genesis_tip(hash); - SelectBaseParams(CBaseChainParams::MAIN); - //BaseParams().nRPCPort = ASSETCHAINS_PORT + 1; - fprintf(stderr,">>>>>>>>>> %s: port.%u/%u magic.%08x %u nonce.%u time.%u nbits.%08x %u coins\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_PORT+1,ASSETCHAINS_MAGIC,ASSETCHAINS_MAGIC,nonce,ASSETCHAINS_TIMESTAMP,GENESIS_NBITS,(uint32_t)ASSETCHAINS_SUPPLY); + fprintf(stderr,">>>>>>>>>> %s: port.%u/%u magic.%08x %u %u coins\n",ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_PORT+1,ASSETCHAINS_MAGIC,ASSETCHAINS_MAGIC,(uint32_t)ASSETCHAINS_SUPPLY); ASSETCHAIN_INIT = 1; return(0); } @@ -314,23 +209,6 @@ public: 0, 0 }; - - // Founders reward script expects a vector of 2-of-3 multisig addresses - vFoundersRewardAddress = { - "t2UNzUUx8mWBCRYPRezvA363EYXyEpHokyi", "t2N9PH9Wk9xjqYg9iin1Ua3aekJqfAtE543", "t2NGQjYMQhFndDHguvUw4wZdNdsssA6K7x2", "t27ktmq1kbeCWiQ5TZ7w5npSzcdbBmTB7v6", - "t2GcBttAKD2WTHka8HyGc2dfvVTKYZUfHmJ", "t2Q3vxWaD9LrdqUE8Xd9Ddjpr9pUQ2aGotK", "t2TTfWDsYu998fHWzVP9Gns4fgxXXRi1Wzu", "t2KS6R4MMWdSBMjLCiw2iMyhWGRQPmyRqDn", - "t2Q2ELrgotWv3Eec6LEtMMiiQ8dtW38u8Tj", "t2AEgJA88vTWAKqxJDFUEJWyHUtQAZi5G1D", "t2HCSdmpq1TQKksuwPQevwAzPTgfJ2rkMbG", "t2HQCPFAUQaUdJWHPhg5pPBxit7inaJzubE", - "t2Fzqvq8Y9e6Mn3JNPb982aYsLmq4b5HmhH", "t2HEz7YZQqDUgC5h4y2WSD3mWneqJNVRjjJ", "t2GCR1SCk687Eeo5NEZ23MLsms7JjVWBgfG", "t2KyiPR9Lztq2w1w747X6W4nkUMAGL8M9KN", - "t2UxymadyxSyVihmbq7S1yxw5dCBqJ1S4jT", "t2AVeMy7fdmTcJhckqiKRG8B7F1vccEhSqU", "t26m7LwihQzD2sH7ZVhYpPJM5j7kzwbfKW9", "t2DgwUNTe7NxuyPU6fxsB5xJXap3E4yWXrN", - "t2U6funcXA11fC9SZehyvUL3rk3Vhuh7fzS", "t284JhyS8LGM72Tx1porSqwrcq3CejthP1p", "t29egu8QcpzKeLoPLqWS6QVMnUUPQdF6eNm", "t29LqD9p9D3B26euBwFi6mfcWu8HPA38VNs", - "t28GsAMCxAyLy85XaasddDzaYFTtfewr86y", "t2GV44QyaikQPLUfm6oTfZnw71LLjnR7gDG", "t2U2QzNLQ1jtAu4L6xxVnRXLBsQpQvGRR2g", "t2QKGr5PNan7nrwDgseyHMN9NFeeuUjCh8b", - "t2AfS8u6HwBeJpKpbuxztvRjupKQDXqnrwa", "t2CTRQUViQd3CWMhnKhFnUHqDLUyTxmWhJs", "t2CbM9EqszNURqh1UXZBXYhwp1R4GwEhWRE", "t2LM7uYiAsKDU42GNSnMwDxbZ8s1DowQzYH", - "t2AgvT35LHR378AE3ouz6xKMhkTLHLJC6nD", "t285EAQXUVyi4NMddJv2QqTrnv45GRMbP8e", "t2EpMRCD5b8f2DCQ37npNULcpZhkjC8muqA", "t2BCmWXrRPiCeQTpizSWKKRPM5X6PS7umDY", - "t2DN7X6wDFn5hYKBiBmn3Z98st419yaTVTH", "t2QJj8HeCwQ6mHwqekxxDLZntYpZTHNU62t", "t2QdHBR1Yciqn4j8gpS8DcQZZtYetKvfNj3", "t2E5cpLA1ey5VNxFNcuopeQMq2rH2NHiPdu", - "t2EVRGtzjFAyz8CF8ndvLuiJu7qZUfDa93H", "t2KoQDk3BSFadBkuaWdLwchFuQamzw9RE4L", "t2FnR3yhTmuiejEJeu6qpidWTghRd1HpjLt", "t2BAuBAAospDc9d1u5nNGEi6x4NRJBD2PQ2", - "t2RtKrLCGcyPkm4a4APg1YY9Wu2m4R2PgrB", "t28aUbSteZzBq2pFgj1K1XNZRZP5mMMyakV", "t2Urdy1ERfkvsFuy6Z4BkhvYGzWdmivfAFR", "t2ADinR4JrvCMd4Q1XGALPajzFrirqvhED6", - }; - assert(vFoundersRewardAddress.size() <= consensus.GetLastFoundersRewardBlockHeight()); } }; static CTestNetParams testNetParams; diff --git a/src/chainparams.h b/src/chainparams.h index b2bc5293d..740eea8fd 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -13,10 +13,6 @@ #include "protocol.h" #define KOMODO_MINDIFF_NBITS 0x200f0f0f -#define GENESIS_NBITS 0x1f00ffff -extern uint32_t ASSETCHAINS_TIMESTAMP; -CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward); -CBlock CreateGenesisBlock(uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward); #include diff --git a/src/komodo.h b/src/komodo.h index 646e162a6..d80fc736d 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -34,7 +34,6 @@ extern char ASSETCHAINS_SYMBOL[16]; extern uint16_t ASSETCHAINS_PORT; extern uint32_t ASSETCHAIN_INIT; extern uint32_t ASSETCHAINS_MAGIC; -extern uint32_t ASSETCHAINS_TIMESTAMP; extern uint64_t ASSETCHAINS_SUPPLY; int32_t NOTARIZED_HEIGHT,Num_nutxos,KMDHEIGHT = 43000; diff --git a/src/komodo_notary.h b/src/komodo_notary.h index 45d2249c8..0e5447087 100644 --- a/src/komodo_notary.h +++ b/src/komodo_notary.h @@ -112,9 +112,12 @@ void komodo_notarysinit(int32_t height,uint8_t pubkeys[64][33],int32_t num) memcpy(kp->pubkey,pubkeys[k],33); kp->notaryid = k; HASH_ADD_KEYPTR(hh,N.Notaries,kp->pubkey,33,kp); - for (i=0; i<33; i++) - printf("%02x",pubkeys[k][i]); - printf(" notarypubs.[%d]\n",k); + if ( height > 10000 ) + { + for (i=0; i<33; i++) + printf("%02x",pubkeys[k][i]); + printf(" notarypubs.[%d]\n",k); + } } N.numnotaries = num; htind = KOMODO_PUBKEYS_HEIGHT(height) / KOMODO_ELECTION_GAP; diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 8e7c50fac..f0ac6a761 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1230,7 +1230,7 @@ void komodo_userpass(char *username,char *password,FILE *fp) void komodo_configfile(char *symbol,uint16_t port) { static char myusername[512],mypassword[8192]; - FILE *fp; uint8_t buf2[512]; char fname[512],buf[128],username[512],password[8192]; uint32_t crc,r,r2,i; + FILE *fp; uint8_t buf2[33]; char fname[512],buf[128],username[512],password[8192]; uint32_t crc,r,r2,i; r = (uint32_t)time(NULL); r2 = OS_milliseconds(); memcpy(buf,&r,sizeof(r)); @@ -1264,7 +1264,7 @@ void komodo_configfile(char *symbol,uint16_t port) mapArgs["-rpcusername"] = myusername; fclose(fp); } - strcpy(fname,GetDataDir(false).string().c_str()); + strcpy(fname,GetConfigFile().string().c_str()); #ifdef WIN32 while ( fname[strlen(fname)-1] != '\\' ) fname[strlen(fname)-1] = 0; @@ -1294,11 +1294,9 @@ void komodo_args() name = GetArg("-ac_name",""); if ( name.c_str()[0] != 0 ) { - ASSETCHAINS_TIMESTAMP = GetArg("-ac_timestamp",ASSETCHAINS_TIMESTAMP); ASSETCHAINS_SUPPLY = GetArg("-ac_supply",10); strncpy(ASSETCHAINS_SYMBOL,name.c_str(),sizeof(ASSETCHAINS_SYMBOL)-1); - len = iguana_rwnum(1,buf,sizeof(ASSETCHAINS_TIMESTAMP),(void *)&ASSETCHAINS_TIMESTAMP); - len += iguana_rwnum(1,&buf[len],sizeof(ASSETCHAINS_SUPPLY),(void *)&ASSETCHAINS_SUPPLY); + len = iguana_rwnum(1,&buf[len],sizeof(ASSETCHAINS_SUPPLY),(void *)&ASSETCHAINS_SUPPLY); strcpy((char *)&buf[len],ASSETCHAINS_SYMBOL); len += strlen(ASSETCHAINS_SYMBOL); ASSETCHAINS_MAGIC = calc_crc32(0,buf,len); @@ -1309,7 +1307,7 @@ void komodo_args() for (i=0; ASSETCHAINS_SYMBOL[i+1]!=0; i++) ASSETCHAINS_SYMBOL[i] = ASSETCHAINS_SYMBOL[i+1]; } - fprintf(stderr,"after args: %c%s port.%u magic.%08x timestamp.%u supply.%u\n",ASSETCHAINS_SHORTFLAG!=0?'-':'+',ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_MAGIC,ASSETCHAINS_TIMESTAMP,(int32_t)ASSETCHAINS_SUPPLY); + fprintf(stderr,"after args: %c%s port.%u magic.%08x supply.%u\n",ASSETCHAINS_SHORTFLAG!=0?'-':'+',ASSETCHAINS_SYMBOL,ASSETCHAINS_PORT,ASSETCHAINS_MAGIC,(int32_t)ASSETCHAINS_SUPPLY); while ( (dirname= (char *)GetDataDir(false).string().c_str()) == 0 || dirname[0] == 0 ) { fprintf(stderr,"waiting for datadir\n"); diff --git a/src/main.cpp b/src/main.cpp index b195e5c13..00dfce272 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1421,12 +1421,22 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex) } uint64_t komodo_moneysupply(int32_t height); +extern char ASSETCHAINS_SYMBOL[16]; +extern uint32_t ASSETCHAINS_MAGIC; +extern uint64_t ASSETCHAINS_SUPPLY; CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams) { CAmount nSubsidy = 3 * COIN; if ( nHeight == 1 ) - return(100000000 * COIN); // ICO allocation + { + if ( ASSETCHAINS_SYMBOL[0] == 0 ) + return(100000000 * COIN); // ICO allocation + else + { + return(ASSETCHAINS_SUPPLY * COIN + (ASSETCHAINS_MAGIC & 0xffffff)); + } + } else if ( komodo_moneysupply(nHeight) < MAX_MONEY ) return(3 * COIN); else return(0); diff --git a/src/miner.cpp b/src/miner.cpp index 910d9fc04..f5ecddde7 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -457,6 +457,92 @@ static bool ProcessBlockFound(CBlock* pblock, CWallet& wallet, CReserveKey& rese return true; } +void minegenesis() +{ + const CChainParams& chainparams = Params(); + // Each thread has its own key and counter + CReserveKey reservekey(pwallet); + unsigned int nExtraNonce = 0; + unsigned int n = chainparams.EquihashN(); + unsigned int k = chainparams.EquihashK(); + while ( true ) + { + unique_ptr pblocktemplate(CreateNewBlockWithKey(reservekey)); + if (!pblocktemplate.get()) + { + LogPrintf("Error in ZcashMiner: Keypool ran out, please call keypoolrefill before restarting the mining thread\n"); + return; + } + CBlock *pblock = &pblocktemplate->block; + IncrementExtraNonce(pblock, pindexPrev, nExtraNonce); + while ( true ) + { + // Hash state + crypto_generichash_blake2b_state state; + EhInitialiseState(n, k, state); + // I = the block header minus nonce and solution. + CEquihashInput I{*pblock}; + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss << I; + // H(I||... + crypto_generichash_blake2b_update(&state, (unsigned char*)&ss[0], ss.size()); + // H(I||V||... + crypto_generichash_blake2b_state curr_state; + curr_state = state; + crypto_generichash_blake2b_update(&curr_state,pblock->nNonce.begin(),pblock->nNonce.size()); + // (x_1, x_2, ...) = A(I, V, n, k) + LogPrint("pow", "Running Equihash solver \"%s\" with nNonce = %s\n",solver, pblock->nNonce.ToString()); + std::function)> validBlock = + [&pblock, &hashTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams] + (std::vector soln) + { + // Write the solution to the hash and compute the result. + LogPrint("pow", "- Checking solution against target\n"); + pblock->nSolution = soln; + solutionTargetChecks.increment(); + if ( UintToArith256(pblock->GetHash()) > hashTarget ) + continue; + // Found a solution + LogPrintf("ZcashMiner:\n"); + LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", pblock->GetHash().GetHex(), hashTarget.GetHex()); + break; + }; + // TODO: factor this out into a function with the same API for each solver. + if ( solver == "tromp" ) + { + // Create solver and initialize it. + equi eq(1); + eq.setstate(&curr_state); + // Intialization done, start algo driver. + eq.digit0(0); + eq.xfull = eq.bfull = eq.hfull = 0; + eq.showbsizes(0); + for (u32 r = 1; r < WK; r++) + { + (r&1) ? eq.digitodd(r, 0) : eq.digiteven(r, 0); + eq.xfull = eq.bfull = eq.hfull = 0; + eq.showbsizes(r); + } + eq.digitK(0); + ehSolverRuns.increment(); + // Convert solution indices to byte array (decompress) and pass it to validBlock method. + for (size_t s = 0; s < eq.nsols; s++) + { + LogPrint("pow", "Checking solution %d\n", s+1); + std::vector index_vector(PROOFSIZE); + for (size_t i = 0; i < PROOFSIZE; i++) + index_vector[i] = eq.sols[s][i]; + std::vector sol_char = GetMinimalFromIndices(index_vector, DIGITBITS); + if ( validBlock(sol_char) ) + // If we find a POW solution, do not try other solutions + // because they become invalid as we created a new block in blockchain. + break; + } + } + } + } +} + extern uint8_t NOTARY_PUBKEY33[33]; uint32_t Mining_start; int32_t komodo_chosennotary(int32_t *notaryidp,int32_t height,uint8_t *pubkey33); @@ -545,25 +631,19 @@ void static BitcoinMiner(CWallet *pwallet) // Hash state crypto_generichash_blake2b_state state; EhInitialiseState(n, k, state); - // I = the block header minus nonce and solution. CEquihashInput I{*pblock}; CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); ss << I; - // H(I||... crypto_generichash_blake2b_update(&state, (unsigned char*)&ss[0], ss.size()); - // H(I||V||... crypto_generichash_blake2b_state curr_state; curr_state = state; - crypto_generichash_blake2b_update(&curr_state, - pblock->nNonce.begin(), - pblock->nNonce.size()); + crypto_generichash_blake2b_update(&curr_state,pblock->nNonce.begin(),pblock->nNonce.size()); // (x_1, x_2, ...) = A(I, V, n, k) - LogPrint("pow", "Running Equihash solver \"%s\" with nNonce = %s\n", - solver, pblock->nNonce.ToString()); + LogPrint("pow", "Running Equihash solver \"%s\" with nNonce = %s\n",solver, pblock->nNonce.ToString()); std::function)> validBlock = [&pblock, &hashTarget, &pwallet, &reservekey, &m_cs, &cancelSolver, &chainparams] @@ -572,35 +652,29 @@ void static BitcoinMiner(CWallet *pwallet) LogPrint("pow", "- Checking solution against target\n"); pblock->nSolution = soln; solutionTargetChecks.increment(); - - if (UintToArith256(pblock->GetHash()) > hashTarget) { + if ( UintToArith256(pblock->GetHash()) > hashTarget ) return false; - } if ( Mining_start != 0 && time(NULL) < Mining_start+50 ) { printf("Round robin diff sleep %d\n",(int32_t)(Mining_start+50-time(NULL))); sleep(Mining_start+50-time(NULL)); } - // Found a solution SetThreadPriority(THREAD_PRIORITY_NORMAL); LogPrintf("ZcashMiner:\n"); LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", pblock->GetHash().GetHex(), hashTarget.GetHex()); - if (ProcessBlockFound(pblock, *pwallet, reservekey)) { // Ignore chain updates caused by us std::lock_guard lock{m_cs}; cancelSolver = false; } SetThreadPriority(THREAD_PRIORITY_LOWEST); - // In regression test mode, stop mining after a block is found. if (chainparams.MineBlocksOnDemand()) { // Increment here because throwing skips the call below ehSolverRuns.increment(); throw boost::thread_interrupted(); } - return true; }; std::function cancelled = [&m_cs, &cancelSolver](EhSolverCancelCheck pos) {