public static GetBlocksPayload DecodeGetBlocksPayload(Stream stream) { using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true)) { return new GetBlocksPayload ( Version: reader.Read4Bytes(), BlockLocatorHashes: reader.DecodeList(() => reader.Read32Bytes()), HashStop: reader.Read32Bytes() ); } }
public static BlockHeader DecodeBlockHeader(Stream stream, UInt256? blockHash = null) { using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true)) { return new BlockHeader ( version: reader.Read4Bytes(), previousBlock: reader.Read32Bytes(), merkleRoot: reader.Read32Bytes(), time: reader.Read4Bytes(), bits: reader.Read4Bytes(), nonce: reader.Read4Bytes(), hash: blockHash ); } }
public Data.Blockchain ReadBlockchain(BlockchainKey blockchainKey) { CheckDatabaseFolder(); var blockListBuilder = ImmutableList.CreateBuilder<ChainedBlock>(); var utxoBuilder = ImmutableDictionary.CreateBuilder<UInt256, UnspentTx>(); var connString = @"Server=localhost; Database=BitSharp_Blockchains; Trusted_Connection=true;"; using (var conn = new SqlConnection(connString)) { conn.Open(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = @" SELECT BlockHash, PreviousBlockHash, Height, TotalWork FROM ChainedBlocks WHERE Guid = @guid AND RootBlockHash = @rootBlockHash ORDER BY Height ASC"; cmd.Parameters.SetValue("@guid", SqlDbType.Binary, 16).Value = blockchainKey.Guid.ToByteArray(); cmd.Parameters.SetValue("@rootBlockHash", SqlDbType.Binary, 32).Value = blockchainKey.RootBlockHash.ToDbByteArray(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var blockHash = reader.GetUInt256(0); var previousBlockHash = reader.GetUInt256(1); var height = reader.GetInt32(2); var totalWork = reader.GetBigInteger(3); blockListBuilder.Add(new ChainedBlock(blockHash, previousBlockHash, height, totalWork)); } } } using (var cmd = conn.CreateCommand()) { cmd.CommandText = @" SELECT UtxoChunkBytes FROM UtxoData WHERE Guid = @guid AND RootBlockHash = @rootBlockHash"; cmd.Parameters.SetValue("@guid", SqlDbType.Binary, 16).Value = blockchainKey.Guid.ToByteArray(); cmd.Parameters.SetValue("@rootBlockHash", SqlDbType.Binary, 32).Value = blockchainKey.RootBlockHash.ToDbByteArray(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var chunkBytes = reader.GetBytes(0); var chunkStream = new MemoryStream(chunkBytes); using (var chunkReader = new BinaryReader(chunkStream)) { var chunkLength = chunkReader.Read4Bytes().ToIntChecked(); var outputs = new TxOutputKey[chunkLength]; for (var i = 0; i < chunkLength; i++) { var prevTxHash = chunkReader.Read32Bytes(); var prevTxOutputIndex = chunkReader.Read4Bytes(); outputs[i] = new TxOutputKey(prevTxHash, prevTxOutputIndex); } //TODO utxoBuilder.UnionWith(outputs); } } } } } return new Data.Blockchain(blockListBuilder.ToImmutable(), blockListBuilder.Select(x => x.BlockHash).ToImmutableHashSet(), utxoBuilder.ToImmutable()); }
public static InventoryVector DecodeInventoryVector(Stream stream) { using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true)) { return new InventoryVector ( Type: reader.Read4Bytes(), Hash: reader.Read32Bytes() ); } }
public static TxInput DecodeTxInput(Stream stream) { using (var reader = new BinaryReader(stream, Encoding.ASCII, leaveOpen: true)) { return new TxInput ( previousTxOutputKey: new TxOutputKey ( txHash: reader.Read32Bytes(), txOutputIndex: reader.Read4Bytes() ), scriptSignature: reader.ReadVarBytes().ToImmutableArray(), sequence: reader.Read4Bytes() ); } }
public Data.Blockchain ReadBlockchain(BlockchainKey blockchainKey) { CheckDatabaseFolder(); var blockListBuilder = ImmutableList.CreateBuilder<ChainedBlock>(); var utxoBuilder = ImmutableHashSet.CreateBuilder<TxOutputKey>(); var dbPath = GetDatabasePath(blockchainKey.Guid); var connString = @"ServerType=1; DataSource=localhost; Database={0}; Pooling=false; User=SYSDBA; Password=NA;".Format2(dbPath); using (var conn = new FbConnection(connString)) { conn.Open(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = @" SELECT BlockHash, PreviousBlockHash, Height, TotalWork FROM ChainedBlocks WHERE Guid = @guid AND RootBlockHash = @rootBlockHash ORDER BY Height ASC"; cmd.Parameters.SetValue("@guid", FbDbType.Char, FbCharset.Octets, 16).Value = blockchainKey.Guid.ToByteArray(); cmd.Parameters.SetValue("@rootBlockHash", FbDbType.Char, FbCharset.Octets, 32).Value = blockchainKey.RootBlockHash.ToDbByteArray(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var blockHash = reader.GetUInt256(0); var previousBlockHash = reader.GetUInt256(1); var height = reader.GetInt32(2); var totalWork = reader.GetBigInteger(3); blockListBuilder.Add(new ChainedBlock(blockHash, previousBlockHash, height, totalWork)); } } } using (var cmd = conn.CreateCommand()) { cmd.CommandText = @" SELECT UtxoChunkBytes FROM UtxoData WHERE Guid = @guid AND RootBlockHash = @rootBlockHash"; cmd.Parameters.SetValue("@guid", FbDbType.Char, FbCharset.Octets, 16).Value = blockchainKey.Guid.ToByteArray(); cmd.Parameters.SetValue("@rootBlockHash", FbDbType.Char, FbCharset.Octets, 32).Value = blockchainKey.RootBlockHash.ToDbByteArray(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var chunkBytes = reader.GetBytes(0); var chunkStream = new MemoryStream(chunkBytes); using (var chunkReader = new BinaryReader(chunkStream)) { var chunkLength = chunkReader.Read4Bytes().ToIntChecked(); var outputs = new TxOutputKey[chunkLength]; for (var i = 0; i < chunkLength; i++) { var prevTxHash = chunkReader.Read32Bytes(); var prevTxOutputIndex = chunkReader.Read4Bytes(); outputs[i] = new TxOutputKey(prevTxHash, prevTxOutputIndex); } utxoBuilder.UnionWith(outputs); } } } } } return new Data.Blockchain(blockListBuilder.ToImmutable(), blockListBuilder.Select(x => x.BlockHash).ToImmutableHashSet(), utxoBuilder.ToImmutable()); }