public void ReadWrite(BitcoinStream stream) { if (stream.Serializing) { uint o = (uint)(nHeight * 2 + (fCoinBase ? 1 : 0)); stream.ReadWriteAsCompactVarInt(ref o); if (nHeight > 0) { stream.ReadWriteAsCompactVarInt(ref nVersion); } TxOutCompressor compressor = new TxOutCompressor(txout); stream.ReadWrite(ref compressor); } else { uint nCode = 0; stream.ReadWriteAsCompactVarInt(ref nCode); nHeight = nCode / 2; fCoinBase = (nCode & 1) != 0; if (nHeight > 0) { stream.ReadWriteAsCompactVarInt(ref nVersion); } TxOutCompressor compressor = new TxOutCompressor(); stream.ReadWrite(ref compressor); txout = compressor.TxOut; } }
public void ReadWrite(BitcoinStream stream) { stream.ReadWrite(ref _OutPoint); if(stream.Serializing) { TxOutCompressor compressor = new TxOutCompressor(_Out); stream.ReadWrite(ref compressor); } else { TxOutCompressor compressor = new TxOutCompressor(); stream.ReadWrite(ref compressor); _Out = compressor.TxOut; } }
public void ReadWrite(BitcoinStream stream) { stream.ReadWrite(ref _OutPoint); if (stream.Serializing) { TxOutCompressor compressor = new TxOutCompressor(_Out); stream.ReadWrite(ref compressor); } else { TxOutCompressor compressor = new TxOutCompressor(); stream.ReadWrite(ref compressor); _Out = compressor.TxOut; } }
public void ReadWrite(BitcoinStream stream) { if(stream.Serializing) { uint nMaskSize = 0, nMaskCode = 0; CalcMaskSize(ref nMaskSize, ref nMaskCode); bool fFirst = vout.Count > 0 && !vout[0].IsNull; bool fSecond = vout.Count > 1 && !vout[1].IsNull; uint nCode = unchecked((uint)(8 * (nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0))); // version stream.ReadWriteAsVarInt(ref nVersion); // size of header code stream.ReadWriteAsVarInt(ref nCode); // spentness bitmask for(uint b = 0 ; b < nMaskSize ; b++) { byte chAvail = 0; for(uint i = 0 ; i < 8 && 2 + b * 8 + i < vout.Count ; i++) if(!vout[2 + (int)b * 8 + (int)i].IsNull) chAvail |= (byte)(1 << (int)i); stream.ReadWrite(ref chAvail); } // txouts themself for(uint i = 0 ; i < vout.Count ; i++) { if(!vout[(int)i].IsNull) { var compressedTx = new TxOutCompressor(vout[(int)i]); stream.ReadWrite(ref compressedTx); } } // coinbase height stream.ReadWriteAsVarInt(ref nHeight); } else { uint nCode = 0; // version stream.ReadWriteAsVarInt(ref nVersion); //// header code stream.ReadWriteAsVarInt(ref nCode); fCoinBase = (nCode & 1) != 0; List<bool> vAvail = new List<bool>() { false, false }; vAvail[0] = (nCode & 2) != 0; vAvail[1] = (nCode & 4) != 0; uint nMaskCode = unchecked((uint)((nCode / 8) + ((nCode & 6) != 0 ? 0 : 1))); //// spentness bitmask while(nMaskCode > 0) { byte chAvail = 0; stream.ReadWrite(ref chAvail); for(uint p = 0 ; p < 8 ; p++) { bool f = (chAvail & (1 << (int)p)) != 0; vAvail.Add(f); } if(chAvail != 0) nMaskCode--; } // txouts themself vout = Enumerable.Range(0, vAvail.Count).Select(_ => new TxOut()).ToList(); for(uint i = 0 ; i < vAvail.Count ; i++) { if(vAvail[(int)i]) { TxOutCompressor compressed = new TxOutCompressor(); stream.ReadWrite(ref compressed); vout[(int)i] = compressed.TxOut; } } //// coinbase height stream.ReadWriteAsVarInt(ref nHeight); Cleanup(); UpdateValue(); } }
public void ReadWrite(BitcoinStream stream) { if(stream.Serializing) { uint o = (uint)(nHeight * 2 + (fCoinBase ? 1 : 0)); stream.ReadWriteAsCompactVarInt(ref o); if(nHeight > 0) stream.ReadWriteAsCompactVarInt(ref nVersion); TxOutCompressor compressor = new TxOutCompressor(txout); stream.ReadWrite(ref compressor); } else { uint nCode = 0; stream.ReadWriteAsCompactVarInt(ref nCode); nHeight = nCode / 2; fCoinBase = (nCode & 1) != 0; if(nHeight > 0) stream.ReadWriteAsCompactVarInt(ref nVersion); TxOutCompressor compressor = new TxOutCompressor(); stream.ReadWrite(ref compressor); txout = compressor.TxOut; } }
public void ReadWrite(BitcoinStream stream) { if (stream.Serializing) { uint nMaskSize = 0, nMaskCode = 0; CalcMaskSize(ref nMaskSize, ref nMaskCode); bool fFirst = vout.Count > 0 && !vout[0].IsNull; bool fSecond = vout.Count > 1 && !vout[1].IsNull; uint nCode = unchecked ((uint)(8 * (nMaskCode - (fFirst || fSecond ? 0 : 1)) + (fCoinBase ? 1 : 0) + (fFirst ? 2 : 0) + (fSecond ? 4 : 0))); // version stream.ReadWriteAsVarInt(ref nVersion); // size of header code stream.ReadWriteAsVarInt(ref nCode); // spentness bitmask for (uint b = 0; b < nMaskSize; b++) { byte chAvail = 0; for (uint i = 0; i < 8 && 2 + b * 8 + i < vout.Count; i++) { if (!vout[2 + (int)b * 8 + (int)i].IsNull) { chAvail |= (byte)(1 << (int)i); } } stream.ReadWrite(ref chAvail); } // txouts themself for (uint i = 0; i < vout.Count; i++) { if (!vout[(int)i].IsNull) { var compressedTx = new TxOutCompressor(vout[(int)i]); stream.ReadWrite(ref compressedTx); } } // coinbase height stream.ReadWriteAsVarInt(ref nHeight); } else { uint nCode = 0; // version stream.ReadWriteAsVarInt(ref nVersion); //// header code stream.ReadWriteAsVarInt(ref nCode); fCoinBase = (nCode & 1) != 0; List <bool> vAvail = new List <bool>() { false, false }; vAvail[0] = (nCode & 2) != 0; vAvail[1] = (nCode & 4) != 0; uint nMaskCode = unchecked ((uint)((nCode / 8) + ((nCode & 6) != 0 ? 0 : 1))); //// spentness bitmask while (nMaskCode > 0) { byte chAvail = 0; stream.ReadWrite(ref chAvail); for (uint p = 0; p < 8; p++) { bool f = (chAvail & (1 << (int)p)) != 0; vAvail.Add(f); } if (chAvail != 0) { nMaskCode--; } } // txouts themself vout = Enumerable.Range(0, vAvail.Count).Select(_ => new TxOut()).ToList(); for (uint i = 0; i < vAvail.Count; i++) { if (vAvail[(int)i]) { TxOutCompressor compressed = new TxOutCompressor(); stream.ReadWrite(ref compressed); vout[(int)i] = compressed.TxOut; } } //// coinbase height stream.ReadWriteAsVarInt(ref nHeight); Cleanup(); UpdateValue(); } }