Ejemplo n.º 1
0
        public ChainedHeader FindMaxTotalWork()
        {
            using (var handle = this.cursorCache.TakeItem())
            {
                var cursor = handle.Item;

                Api.JetSetCurrentIndex(cursor.jetSession, cursor.blockHeadersTableId, "IX_TotalWork");

                // IX_TotalWork is in reverse order, so higher total work comes first
                if (Api.TryMoveFirst(cursor.jetSession, cursor.blockHeadersTableId))
                {
                    do
                    {
                        // check if this block is valid
                        var valid = Api.RetrieveColumnAsBoolean(cursor.jetSession, cursor.blockHeadersTableId, cursor.blockHeaderValidColumnId);
                        if (valid == null || valid.Value)
                        {
                            // decode chained header with most work and return
                            var chainedHeader = DataEncoder.DecodeChainedHeader(Api.RetrieveColumn(cursor.jetSession, cursor.blockHeadersTableId, cursor.blockHeaderBytesColumnId));
                            return(chainedHeader);
                        }
                    } while (Api.TryMoveNext(cursor.jetSession, cursor.blockHeadersTableId));
                }

                // no valid chained header found
                return(null);
            }
        }
Ejemplo n.º 2
0
        public IEnumerable <ChainedHeader> ReadChain()
        {
            Api.JetSetCurrentIndex(this.jetSession, this.chainTableId, "IX_BlockHeight");

            if (Api.TryMoveFirst(this.jetSession, this.chainTableId))
            {
                do
                {
                    var chainedHeader = DataEncoder.DecodeChainedHeader(Api.RetrieveColumn(this.jetSession, this.chainTableId, this.chainedHeaderBytesColumnId));
                    yield return(chainedHeader);
                } while (Api.TryMoveNext(this.jetSession, this.chainTableId));
            }
        }
Ejemplo n.º 3
0
        public ChainedHeader GetChainTip()
        {
            Api.JetSetCurrentIndex(this.jetSession, this.chainTableId, "IX_BlockHeight");

            if (Api.TryMoveLast(this.jetSession, this.chainTableId))
            {
                var chainedHeader = DataEncoder.DecodeChainedHeader(Api.RetrieveColumn(this.jetSession, this.chainTableId, this.chainedHeaderBytesColumnId));
                return(chainedHeader);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 4
0
        public IEnumerable <ChainedHeader> ReadChainedHeaders()
        {
            using (var handle = this.cursorCache.TakeItem())
            {
                var cursor = handle.Item;

                Api.JetSetCurrentIndex(cursor.jetSession, cursor.blockHeadersTableId, null);

                if (Api.TryMoveFirst(cursor.jetSession, cursor.blockHeadersTableId))
                {
                    do
                    {
                        // decode chained header and return
                        var chainedHeader = DataEncoder.DecodeChainedHeader(Api.RetrieveColumn(cursor.jetSession, cursor.blockHeadersTableId, cursor.blockHeaderBytesColumnId));
                        yield return(chainedHeader);
                    } while (Api.TryMoveNext(cursor.jetSession, cursor.blockHeadersTableId));
                }
            }
        }
Ejemplo n.º 5
0
        public bool TryGetChainedHeader(UInt256 blockHash, out ChainedHeader chainedHeader)
        {
            using (var handle = this.cursorCache.TakeItem())
            {
                var cursor = handle.Item;

                Api.JetSetCurrentIndex(cursor.jetSession, cursor.blockHeadersTableId, "IX_BlockHash");
                Api.MakeKey(cursor.jetSession, cursor.blockHeadersTableId, DbEncoder.EncodeUInt256(blockHash), MakeKeyGrbit.NewKey);
                if (Api.TrySeek(cursor.jetSession, cursor.blockHeadersTableId, SeekGrbit.SeekEQ))
                {
                    chainedHeader = DataEncoder.DecodeChainedHeader(Api.RetrieveColumn(cursor.jetSession, cursor.blockHeadersTableId, cursor.blockHeaderBytesColumnId));
                    return(true);
                }
                else
                {
                    chainedHeader = default(ChainedHeader);
                    return(false);
                }
            }
        }
Ejemplo n.º 6
0
 public ChainedHeaderStorage(string baseDirectory)
     : base(baseDirectory, "ChainedHeaders",
            chainedHeader => DataEncoder.EncodeChainedHeader(chainedHeader),
            (blockHash, bytes) => DataEncoder.DecodeChainedHeader(bytes))
 {
 }