forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathgenesis_common.cpp
91 lines (81 loc) · 2.58 KB
/
genesis_common.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright (c) 2019-2021 Xenios SEZC
// https://www.veriblock.org
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "genesis_common.hpp"
#include <consensus/merkle.h>
#include <util/strencodings.h>
#include <vbk/merkle.hpp>
namespace VeriBlock {
CScript ScriptWithPrefix(uint32_t nBits)
{
CScript script;
if (nBits <= 0xff)
script << nBits << CScriptNum(1);
else if (nBits <= 0xffff)
script << nBits << CScriptNum(2);
else if (nBits <= 0xffffff)
script << nBits << CScriptNum(3);
else
script << nBits << CScriptNum(4);
return script;
}
CBlock CreateGenesisBlock(
std::string 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 = VeriBlock::ScriptWithPrefix(nBits) << std::vector<uint8_t>{pszTimestamp.begin(), pszTimestamp.end()};
txNew.vout[0].nValue = genesisReward;
txNew.vout[0].scriptPubKey = genesisOutputScript;
CBlock genesis;
genesis.nTime = nTime;
genesis.nBits = nBits;
genesis.nNonce = nNonce;
genesis.nVersion = nVersion;
genesis.vtx.push_back(MakeTransactionRef(std::move(txNew)));
genesis.hashPrevBlock.SetNull();
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
return genesis;
}
CBlock CreateGenesisBlock(
uint32_t nTime,
uint32_t nNonce,
uint32_t nBits,
int32_t nVersion,
const CAmount& genesisReward,
const std::string& initialPubkeyHex,
const std::string& pszTimestamp)
{
const CScript genesisOutputScript = CScript() << ParseHex(initialPubkeyHex) << OP_CHECKSIG;
return VeriBlock::CreateGenesisBlock(pszTimestamp, genesisOutputScript, nTime, nNonce, nBits, nVersion, genesisReward);
}
CBlock CreateGenesisBlock(
uint32_t nTime,
uint32_t nNonce,
uint32_t nBits,
int32_t nVersion,
const std::string& coinbase)
{
CMutableTransaction tx;
CDataStream ss(ParseHex(coinbase), SER_NETWORK, PROTOCOL_VERSION);
ss >> tx; // do not expect any exceptions
CBlock genesis;
genesis.nTime = nTime;
genesis.nBits = nBits;
genesis.nNonce = nNonce;
genesis.nVersion = nVersion;
genesis.vtx.push_back(MakeTransactionRef(std::move(tx)));
genesis.hashPrevBlock.SetNull();
genesis.hashMerkleRoot = BlockMerkleRoot(genesis);
return genesis;
}
} // namespace VeriBlock