예제 #1
0
        public static void IncrementNonce(this SlimBlockHeader slimBlockHeader)
        {
            slimBlockHeader.Nonce++;
            var nonceBytes = BitConverter.GetBytes(slimBlockHeader.Nonce);

            Buffer.BlockCopy(nonceBytes, 0, slimBlockHeader.Data, 76, 4);
        }
예제 #2
0
        public static SlimBlockHeader Clone(this SlimBlockHeader slimBlockHeader)
        {
            var clone = new SlimBlockHeader
            {
                Version   = slimBlockHeader.Version,
                Timestamp = slimBlockHeader.Timestamp,
                Bits      = slimBlockHeader.Bits,
                Nonce     = slimBlockHeader.Nonce,
            };

            if (slimBlockHeader.Data != null)
            {
                clone.Data = new byte[80];
                Buffer.BlockCopy(slimBlockHeader.Data, 0, clone.Data, 0, 80);
            }

            if (slimBlockHeader.HashPrevBlock != null)
            {
                clone.HashPrevBlock = new byte[32];
                Buffer.BlockCopy(slimBlockHeader.HashPrevBlock, 0, clone.HashPrevBlock, 0, 32);
            }

            if (slimBlockHeader.MerkleRoot != null)
            {
                clone.MerkleRoot = new byte[32];
                Buffer.BlockCopy(slimBlockHeader.MerkleRoot, 0, clone.MerkleRoot, 0, 32);
            }

            return(clone);
        }
예제 #3
0
        public static byte[] SerializeTo80Bytes(this SlimBlockHeader slimBlockHeader)
        {
            var versionBytes = BitConverter.GetBytes(slimBlockHeader.Version);
            var timeBytes    = BitConverter.GetBytes(slimBlockHeader.Timestamp);
            var bitsBytes    = BitConverter.GetBytes(slimBlockHeader.Bits);
            var nonceBytes   = BitConverter.GetBytes(slimBlockHeader.Nonce);

            return(ByteArrays.Concatenate(versionBytes, slimBlockHeader.HashPrevBlock, slimBlockHeader.MerkleRoot, timeBytes, bitsBytes, nonceBytes));
        }
예제 #4
0
        public static unsafe uint ExtractNonceFromBytesUnsafe(this SlimBlockHeader slimBlockHeader)
        {
            fixed(byte *noncePosInData = &slimBlockHeader.Data[76])
            {
                uint *noncePointer = (uint *)noncePosInData;

                return(*noncePointer);
            }
        }
예제 #5
0
        public static unsafe void SetFinalNonce(this SlimBlockHeader slimBlockHeader, uint solutionNonce)
        {
            fixed(byte *noncePosInData = &slimBlockHeader.Data[76])
            {
                uint *noncePointer = (uint *)noncePosInData;

                *noncePointer = solutionNonce;
            }
        }
예제 #6
0
        public static unsafe uint GetFinalNonce(this SlimBlockHeader slimBlockHeader)
        {
            fixed(byte *noncePosInData = &slimBlockHeader.Data[76])
            {
                uint *noncePointer = (uint *)noncePosInData;

                return(*noncePointer);
            }
        }
예제 #7
0
        public static unsafe void IncrementNonceUnsafe(this SlimBlockHeader slimBlockHeader)
        {
            slimBlockHeader.Nonce++;

            fixed(byte *noncePosInData = &slimBlockHeader.Data[76])
            {
                uint *noncePointer = (uint *)noncePosInData;

                *noncePointer = *noncePointer + (uint)1;
            }
        }
예제 #8
0
        public static SlimBlockHeader ToSlimBlockHeader(this Block block)
        {
            var slimBlockHeader = new SlimBlockHeader
            {
                Version       = block.Header.Version,
                HashPrevBlock = block.Header.HashPrevBlock.ToBytes(),
                Bits          = block.Header.Bits,
                MerkleRoot    = MerkleRoot.Build(block.Transactions.Select(x => x.GetHash().ToBytes()).ToList()),
                Timestamp     = (uint)block.Header.BlockTime.ToUnixTimeSeconds(),
                Nonce         = 0,
            };

            return(slimBlockHeader);
        }
예제 #9
0
 public static uint256 GetDoubleSHA256(this SlimBlockHeader slimBlockHeader)
 {
     return(Hashes.DoubleSHA256(slimBlockHeader.Data));
 }