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); } }
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)); } }
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); } }
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)); } } }
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); } } }
public ChainedHeaderStorage(string baseDirectory) : base(baseDirectory, "ChainedHeaders", chainedHeader => DataEncoder.EncodeChainedHeader(chainedHeader), (blockHash, bytes) => DataEncoder.DecodeChainedHeader(bytes)) { }