private Block CreateGenesis(SmartContractPoAConsensusFactory consensusFactory, uint genesisTime, uint nonce, uint bits, int version, Money reward, string coinbaseText) { Transaction genesisTransaction = consensusFactory.CreateTransaction(); genesisTransaction.Version = 1; genesisTransaction.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(coinbaseText))) }); genesisTransaction.AddOutput(new TxOut() { Value = reward }); 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(); ((SmartContractPoABlockHeader)genesis.Header).HashStateRoot = SmartContractPoABlockDefinition.StateRootEmptyTrie; return(genesis); }
public static Block CreateGenesis(SmartContractPoAConsensusFactory consensusFactory, uint genesisTime, uint nonce, uint bits, int version, Money reward, string coinbaseText) { Transaction genesisTransaction = consensusFactory.CreateTransaction(); genesisTransaction.Time = genesisTime; genesisTransaction.Version = 1; genesisTransaction.AddInput(new TxIn() { ScriptSig = new Script(Op.GetPushOp(0), new Op() { Code = (OpcodeType)0x1, PushData = new[] { (byte)42 } }, Op.GetPushOp(Encoders.ASCII.DecodeData(coinbaseText))) }); genesisTransaction.AddOutput(new TxOut() { Value = reward }); 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(); ((SmartContractPoABlockHeader)genesis.Header).HashStateRoot = new uint256("21B463E3B52F6201C0AD6C991BE0485B6EF8C092E64583FFA655CC1B171FE856"); return(genesis); }
public static Block MineGenesisBlock(SmartContractPoAConsensusFactory 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; txNew.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(); ((SmartContractPoABlockHeader)genesis.Header).HashStateRoot = new uint256("21B463E3B52F6201C0AD6C991BE0485B6EF8C092E64583FFA655CC1B171FE856"); // Set StateRoot to empty trie. // 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); }