public static Block CreateGenesisBlock(ConsensusFactory consensusFactory, uint time, uint nonce, uint bits, int version, Money genesisReward, string genesisText) { Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(genesisText))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(time); genesis.Header.Bits = bits; genesis.Header.Nonce = nonce; genesis.Header.Version = version; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
protected static Block CreateX42GenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string pszTimestamp = "On Emancipation Day, we are fighting to maintain our democratic freedom at various levels - https://www.stabroeknews.com/2018/opinion/letters/08/01/on-emancipation-day-we-are-fighting-to-maintain-our-democratic-freedom-at-various-levels/ | popĆ³ & lita - 6F3582CC2B720980C936D95A2E07F809"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.Time = nTime; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
protected static Block CreatePoAGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string data = "506f41202d204345485450414a6c75334f424148484139205845504839"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.Time = nTime; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(data))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
public Entity(DynamicTableEntity entity, ConsensusFactory consensusFactory) { var splitted = entity.RowKey.Split(new string[] { "-" }, StringSplitOptions.None); _PartitionKey = entity.PartitionKey; Timestamp = entity.Timestamp; TxId = uint256.Parse(splitted[0]); Type = GetType(splitted[1]); if (splitted.Length >= 3 && splitted[2] != string.Empty) { BlockId = uint256.Parse(splitted[2]); } var bytes = Helper.GetEntityProperty(entity, "a"); if (bytes != null && bytes.Length != 0) { Transaction = consensusFactory.CreateTransaction(); Transaction.ReadWrite(bytes, consensusFactory); } bytes = Helper.GetEntityProperty(entity, "b"); if (bytes != null && bytes.Length != 0) { ColoredTransaction = new ColoredTransaction(); ColoredTransaction.ReadWrite(bytes, consensusFactory); } _PreviousTxOuts = Helper.DeserializeList <TxOut>(Helper.GetEntityProperty(entity, "c"), consensusFactory); var timestamp = Helper.GetEntityProperty(entity, "d"); if (timestamp != null && timestamp.Length == 8) { Timestamp = new DateTimeOffset((long)ToUInt64(timestamp, 0), TimeSpan.Zero); } }
protected static Block CreateStratisGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string pszTimestamp = "http://www.theonion.com/article/olympics-head-priestess-slits-throat-official-rio--53466"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.Time = nTime; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
protected static Block CreatePoAGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string data = "506f41202d204345485450414a6c75334f424148484139205845504839"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; // TODO: Removing the time field will affect the genesis block hash of the Cirrus networks. Need to make a call about only developing Cirrus via the SBFN project that still has nTime txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(data))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
public static Block CreateBitcoinGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; var genesisOutputScript = new Script(Op.GetPushOp(Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f")), OpcodeType.OP_CHECKSIG); Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(486604799), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)4 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, ScriptPubKey = genesisOutputScript }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
protected static Block CreateSolarisGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { const string pszTimestamp = "https://www.solarisplatform.com"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.Time = nTime; txNew.AddInput(new TxIn { ScriptSig = new Script(Op.GetPushOp(0), new Op { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
public static NBitcoin.Block CreateGenesis(ConsensusFactory consensusFactory, uint genesisTime, uint nonce, uint bits, int version, Money reward) { string timeStamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; var genesisOutputScript = new Script(Op.GetPushOp(Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f")), OpcodeType.OP_CHECKSIG); NBitcoin.Transaction genesisTransaction = consensusFactory.CreateTransaction(); genesisTransaction.Version = 1; genesisTransaction.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(486604799), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)4 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(timeStamp))) }); genesisTransaction.AddOutput(new TxOut() { Value = reward, ScriptPubKey = genesisOutputScript }); NBitcoin.Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(genesisTime); genesis.Header.Bits = bits; genesis.Header.Nonce = nonce; genesis.Header.Version = version; genesis.Transactions.Add(genesisTransaction); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); ((ISmartContractBlockHeader)genesis.Header).HashStateRoot = SmartContractBlockDefinition.StateRootEmptyTrie; return(genesis); }
public static Block CreateGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string pszTimestamp = "https://www.coindesk.com/apple-co-founder-backs-dorsey-bitcoin-become-webs-currency/"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.Time = nTime; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
protected static Block CreateImpleumGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string pszTimestamp = "https://cryptocrimson.com/news/apple-payment-request-api-ripple-interledger-protocol"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.Time = nTime; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)63 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
protected static Block CreateRedstoneGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string pszTimestamp = "http://www.escapistmagazine.com/news/view/109385-Computer-Built-in-Minecraft-Has-RAM-Performs-Division"; Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.Time = nTime; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
public Transaction EmitMoney(IDestination destination, Money amount, bool isCoinbase = true, bool indexBalance = false) { Transaction transaction = ConsensusFactory.CreateTransaction(); if (isCoinbase) { transaction.Inputs.Add(scriptSig: new Script(NoRandom ? new uint256(0).ToBytes() : RandomUtils.GetBytes(32))); } transaction.Outputs.Add(amount, destination); Add(transaction, indexBalance); return(transaction); }
public static Block CreateGenesisBlock(ConsensusFactory consensusFactory, uint time, uint nonce, uint bits, int version, Money genesisReward, string genesisText) { Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(genesisText))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(time); genesis.Header.Bits = bits; genesis.Header.Nonce = nonce; genesis.Header.Version = version; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); /* * Procedure for creating a new genesis block: * 1. Create the template block as above in the CreateStraxGenesisBlock method * * 3. Iterate over the nonce until the proof-of-work is valid */ //while (!genesis.CheckProofOfWork()) //{ // genesis.Header.Nonce++; // if (genesis.Header.Nonce == 0) // genesis.Header.Time++; //} /* * 4. This will mean the block header hash is under the target * 5. Retrieve the Nonce and Time values from the resulting block header and insert them into the network definition */ return(genesis); }
public Transaction EmitMoney(IDestination destination, Money amount, bool isCoinbase = true, bool indexBalance = false) { Transaction transaction = ConsensusFactory.CreateTransaction(); if (isCoinbase) { transaction.AddInput(new TxIn() { ScriptSig = new Script(NoRandom ? new uint256(0).ToBytes() : RandomUtils.GetBytes(32)), }); } transaction.AddOutput(new TxOut() { ScriptPubKey = destination.ScriptPubKey, Value = amount }); Add(transaction, indexBalance); return(transaction); }
public static NBitcoin.Block CreateGenesis(ConsensusFactory consensusFactory, uint genesisTime, uint nonce, uint bits, int version, Money reward) { string timeStamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; var genesisOutputScript = new Script(Op.GetPushOp(Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f")), OpcodeType.OP_CHECKSIG); NBitcoin.Transaction genesisTransaction = consensusFactory.CreateTransaction(); // TODO: Similar potential problem to Cirrus genesis definition if (genesisTransaction is IPosTransactionWithTime posTx) { posTx.Time = genesisTime; } genesisTransaction.Version = 1; genesisTransaction.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(486604799), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)4 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(timeStamp))) }); genesisTransaction.AddOutput(new TxOut() { Value = reward, ScriptPubKey = genesisOutputScript }); NBitcoin.Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(genesisTime); genesis.Header.Bits = bits; genesis.Header.Nonce = nonce; genesis.Header.Version = version; genesis.Transactions.Add(genesisTransaction); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); ((SmartContractBlockHeader)genesis.Header).HashStateRoot = new uint256("21B463E3B52F6201C0AD6C991BE0485B6EF8C092E64583FFA655CC1B171FE856"); return(genesis); }
protected static Block CreateBitcoinGenesisBlock(ConsensusFactory consensusFactory, uint nTime, uint nNonce, uint nBits, int nVersion, Money genesisReward) { string pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"; var genesisOutputScript = new Script(Op.GetPushOp(Encoders.Hex.DecodeData("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f")), OpcodeType.OP_CHECKSIG); Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 1; txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(486604799), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)4 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(pszTimestamp))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, ScriptPubKey = genesisOutputScript }); // txNew.Outputs[0].ScriptPubKey = const CScript genesisOutputScript = CScript() << ParseHex("040184710fa689ad5023690c80f3a49c8f13f8d45b8c857fbcbc8bc4a8e4d3eb4b10f4d4604fa08dce601aaf0f470216fe1b51850b4acf21b179c45070ac7b03a9") << OP_CHECKSIG; byte[] b = new byte[1]; b[0] = 0; txNew.Outputs[0].sTxOutMessage = b; Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
private static Block CreateXRCGenesisBlock(ConsensusFactory consensusFactory, string message, uint nTime, uint nNonce, uint nBits, int nVersion, string pubKey) { //nTime = 1512043200 => Thursday, November 30, 2017 12:00:00 PM (born XRC) //nTime = 1527811200 => Friday, Jun 1, 2017 12:00:00 PM (born TestXRC) //nBits = 0x1d00ffff (it is exactly 0x1b = 27 bytes long) => 0x00ffff0000000000000000000000000000000000000000000000000000 => 1 //nNonce = XTimes to trying to find a genesis block Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = 2; if (txNew is IPosTransactionWithTime posTx) { posTx.Time = nTime; } txNew.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(nBits), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)4 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(message))) }); txNew.AddOutput(new TxOut() { Value = Money.Zero, ScriptPubKey = Script.FromBytesUnsafe(Encoders.Hex.DecodeData(pubKey)) }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = Utils.UnixTimeToDateTime(nTime); genesis.Header.Bits = nBits; genesis.Header.Nonce = nNonce; genesis.Header.Version = nVersion; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); return(genesis); }
/// <summary> /// Mines a new genesis block, to use with a new network. /// Typically, 3 such genesis blocks need to be created when bootstrapping a new coin: for Main, Test and Reg networks. /// </summary> /// <param name="consensusFactory"> /// The consensus factory used to create transactions and blocks. /// Use <see cref="PosConsensusFactory"/> for proof-of-stake based networks. /// </param> /// <param name="coinbaseText"> /// Traditionally a news headline from the day of the launch, but could be any string or link. /// This will be inserted in the input coinbase transaction script. /// It should be shorter than 92 characters. /// </param> /// <param name="target"> /// The difficulty target under which the hash of the block need to be. /// Some more details: As an example, the target for the Stratis Main network is 00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff. /// To make it harder to mine the genesis block, have more zeros at the beginning (keeping the length the same). This will make the target smaller, so finding a number under it will be more difficult. /// To make it easier to mine the genesis block ,do the opposite. Example of an easy one: 00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff. /// Make the Test and Reg targets ones easier to find than the Main one so that you don't wait too long to mine the genesis block. /// </param> /// <param name="genesisReward"> /// Specify how many coins to put in the genesis transaction's output. These coins are unspendable. /// </param> /// <param name="version"> /// The version of the transaction and the block header set in the genesis block. /// </param> /// <example> /// The following example shows the creation of a genesis block. /// <code> /// Block genesis = MineGenesisBlock(new PosConsensusFactory(), "Some topical headline.", new Target(new uint256("000fffff00000000000000000000000000000000000000000000000000000000")), Money.Coins(50m)); /// BlockHeader header = genesis.Header; /// Console.WriteLine("Make a note of the following values:"); /// Console.WriteLine("bits: " + header.Bits); /// Console.WriteLine("nonce: " + header.Nonce); /// Console.WriteLine("time: " + header.Time); /// Console.WriteLine("version: " + header.Version); /// Console.WriteLine("hash: " + header.GetHash()); /// Console.WriteLine("merkleroot: " + header.HashMerkleRoot); /// </code> /// </example> /// <returns>A genesis block.</returns> public static Block MineGenesisBlock(ConsensusFactory consensusFactory, string coinbaseText, Target target, Money genesisReward, int version = 1) { if (consensusFactory == null) { throw new ArgumentException($"Parameter '{nameof(consensusFactory)}' cannot be null. Use 'new ConsensusFactory()' for Bitcoin-like proof-of-work blockchains and 'new PosConsensusFactory()' for Stratis-like proof-of-stake blockchains."); } if (string.IsNullOrEmpty(coinbaseText)) { throw new ArgumentException($"Parameter '{nameof(coinbaseText)}' cannot be null. Use a news headline or any other appropriate string."); } if (target == null) { throw new ArgumentException($"Parameter '{nameof(target)}' cannot be null. Example use: new Target(new uint256(\"0000ffff00000000000000000000000000000000000000000000000000000000\"))"); } if (coinbaseText.Length >= 92) { throw new ArgumentException($"Parameter '{nameof(coinbaseText)}' should be shorter than 92 characters."); } if (genesisReward == null) { throw new ArgumentException($"Parameter '{nameof(genesisReward)}' cannot be null. Example use: 'Money.Coins(50m)'."); } DateTimeOffset time = DateTimeOffset.Now; uint unixTime = Utils.DateTimeToUnixTime(time); Transaction txNew = consensusFactory.CreateTransaction(); txNew.Version = (uint)version; if (txNew is IPosTransactionWithTime posTx) { posTx.Time = unixTime; } txNew.AddInput(new TxIn() { ScriptSig = new Script( Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(coinbaseText))) }); txNew.AddOutput(new TxOut() { Value = genesisReward, }); Block genesis = consensusFactory.CreateBlock(); genesis.Header.BlockTime = time; genesis.Header.Bits = target; genesis.Header.Nonce = 0; genesis.Header.Version = version; genesis.Transactions.Add(txNew); genesis.Header.HashPrevBlock = uint256.Zero; genesis.UpdateMerkleRoot(); // Iterate over the nonce until the proof-of-work is valid. // This will mean the block header hash is under the target. while (!genesis.CheckProofOfWork()) { genesis.Header.Nonce++; if (genesis.Header.Nonce == 0) { genesis.Header.Time++; } } return(genesis); }