Exemple #1
0
 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;
     }
 }
Exemple #2
0
		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;
			}
		}
Exemple #3
0
 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;
     }
 }
Exemple #4
0
        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();
            }
        }
Exemple #5
0
 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;
     }
 }
Exemple #6
0
        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();
            }
        }