public async Task <IBlock> Start(IBlock prev, int height, CancellationToken token) { // Certain things are hard-coded here because this tool is meant for testing. // Eventually it will use IWallet.NextAddress() to get a new address to mine to from the wallet instance // and IBlockchain.GetTarget() to mine at the correct difficulty. // For now it is a good way of mining any transaction that won't propagate in TestNet by bitcoin core clients. var consensus = new Consensus(height, NetworkType.TestNet); string cbText = "Mined using Denovo v0.1.0"; // A weak key used only for testing using var key = new PrivateKey(new Sha256().ComputeHash(Encoding.UTF8.GetBytes(cbText))); var pkScr = new PubkeyScript(); pkScr.SetToP2WPKH(key.ToPublicKey()); byte[] commitment = null; //var tx1 = new Transaction(); //tx1.TryDeserialize(new FastStreamReader(Base16.Decode("")), out _); ulong fee = 0; var coinbase = new Transaction() { Version = 1, TxInList = new TxIn[] { new TxIn(new byte[32], uint.MaxValue, new SignatureScript(height, Encoding.UTF8.GetBytes($"{cbText} by Coding Enthusiast")), uint.MaxValue) }, TxOutList = new TxOut[] { new TxOut(consensus.BlockReward + fee, pkScr), new TxOut(0, new PubkeyScript()) }, LockTime = new LockTime(height) }; ((PubkeyScript)coinbase.TxOutList[1].PubScript).SetToReturn(Encoding.UTF8.GetBytes("Testing Mining View Model.")); var block = new Block() { Header = new BlockHeader() { Version = prev.Header.Version, BlockTime = (uint)UnixTimeStamp.TimeToEpoch(DateTime.UtcNow.AddMinutes(22)), NBits = 0x1d00ffffU, PreviousBlockHeaderHash = prev.GetBlockHash(false), }, TransactionList = new Transaction[] { coinbase } }; if (block.TransactionList.Length > 1 && commitment != null) { coinbase.WitnessList = new Witness[1] { new Witness(new byte[][] { commitment }) }; var temp = new TxOut[coinbase.TxOutList.Length + 1]; Array.Copy(coinbase.TxOutList, 0, temp, 0, coinbase.TxOutList.Length); temp[^ 1] = new TxOut();
public void EpochToTimeTest(DateTime expected, long epoch) { DateTime actual = UnixTimeStamp.EpochToTime(epoch); Assert.Equal(expected, actual); }
/// <summary> /// Initializes a new instance of <see cref="VersionPayload"/> with the given parameters and sets the rest to /// default values. /// </summary> /// <exception cref="ArgumentOutOfRangeException"/> /// <param name="ver">Protocol version</param> /// <param name="servs">Services supported by this node</param> /// <param name="height">Highest block height that this node has</param> /// <param name="relay"> /// Indicates whether <see cref="PayloadType.Inv"/> or <see cref="PayloadType.Tx"/> messages should be sent /// to this node /// </param> public VersionPayload(int ver, NodeServiceFlags servs, int height, bool relay) : this(ver, UnixTimeStamp.GetEpochUtcNow(), new NetworkAddress(), new NetworkAddress() { NodeServices = servs }, 0, new BIP0014("Bitcoin.Net", new Version(0, 0, 0)).ToString(), height, relay) { }
public void TimeToEpochTest(DateTime dt, long expected) { long actual = UnixTimeStamp.TimeToEpoch(dt); Assert.Equal(expected, actual); }
public override int GetHashCode() { return(base.GetHashCode() ^ UnixTimeStamp.GetHashCode()); }
private static void Foo(UnixTimeStamp obj, JsonWriter writer) { writer.Write(obj.Value); }
/// <summary> /// Converts the value of the current instance to its equivalent string representation. /// </summary> /// <returns>A string representation of the value of the current instance.</returns> public override string ToString() { return((value < Threshold || value == uint.MaxValue) ? $"{value}" : $"{UnixTimeStamp.EpochToTime(value)}"); }
public static IEnumerable <object[]> GetLocatorCases() { var fman = new MockFileManager() { expReadFN = "Headers", returnReadData = BlockHeaderTests.GetSampleBlockHeaderBytes(), blockInfo = new byte[32 + 4 + 4] }; var consensus = new MockConsensus(); var bver = new BlockVerifier(null, consensus); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(1), GetHeaders(1) }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(2), GetHeaders(2).Reverse() }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(10), GetHeaders(10).Reverse() }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(11), GetHeaders(11).Reverse() }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(12), GetHeaders(12).Reverse() }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(13), new BlockHeader[12] { new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(4, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(3, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(2, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(14), new BlockHeader[13] { new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(4, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(3, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(1, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(15), new BlockHeader[13] { new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(4, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(2, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(16), new BlockHeader[13] { new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(3, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(17), new BlockHeader[13] { new BlockHeader(16, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(4, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(18), new BlockHeader[14] { new BlockHeader(17, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(16, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(1, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); yield return(new object[] { GetChain(fman, bver, consensus), GetHeaders(19), new BlockHeader[14] { new BlockHeader(18, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(17, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(16, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(2, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); yield return(new object[] { GetChain(fman, bver, consensus), new BlockHeader[19] { new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(1, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(2, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(3, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(4, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(16, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(17, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(18, new byte[32], new byte[32], (uint)UnixTimeStamp.TimeToEpoch(DateTime.Now.Subtract(TimeSpan.FromHours(1))), 0, 0), }, new BlockHeader[14] { // Last block (18) is not included new BlockHeader(17, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(16, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(1, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); uint yesterday = (uint)UnixTimeStamp.TimeToEpoch(DateTime.UtcNow.Subtract(TimeSpan.FromHours(25))); yield return(new object[] { GetChain(fman, bver, consensus), new BlockHeader[19] { new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(1, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(2, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(3, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(4, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(5, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(7, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(16, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(17, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(18, new byte[32], new byte[32], yesterday, 0, 0), }, new BlockHeader[14] { new BlockHeader(18, new byte[32], new byte[32], yesterday, 0, 0), new BlockHeader(17, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(16, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(15, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(14, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(13, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(12, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(11, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(10, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(9, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(8, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(6, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(2, new byte[32], new byte[32], 0, 0, 0), new BlockHeader(0, new byte[32], new byte[32], 0, 0, 0), } }); }