public static KeyValuePair <BaseTransaction, int> Deserialize(IEnumerable <byte> payload)
        {
            int currentStartIndex    = 0;
            var version              = BitConverter.ToUInt32(payload.Take(4).ToArray(), 0);
            var category             = (TransactionCategories)payload.ElementAt(4);
            var transactionType      = (TransactionTypes)payload.ElementAt(5);
            BcBaseTransaction result = null;

            switch (transactionType)
            {
            case TransactionTypes.Coinbase:
                result = new CoinbaseTransaction();
                break;

            case TransactionTypes.NoneCoinbase:
                result = new NoneCoinbaseTransaction();
                break;
            }

            result.Version    = version;
            result.Category   = category;
            currentStartIndex = 6;
            var transactionInCompactSize = CompactSize.Deserialize(payload.Skip(currentStartIndex).ToArray());

            currentStartIndex += transactionInCompactSize.Value;
            if (transactionInCompactSize.Key.Size > 0)
            {
                var kvp = result.DeserializeInputs(payload.Skip(currentStartIndex), (int)transactionInCompactSize.Key.Size);
                result.TransactionIn = kvp.Key;
                currentStartIndex   += kvp.Value;
            }

            var transactionOutputCompactSize = CompactSize.Deserialize(payload.Skip(currentStartIndex).ToArray());

            currentStartIndex += transactionOutputCompactSize.Value;
            if (transactionOutputCompactSize.Key.Size > 0)
            {
                for (var i = 0; i < (int)transactionOutputCompactSize.Key.Size; i++)
                {
                    var kvp = result.DeserializeOutput(payload.Skip(currentStartIndex).ToArray());
                    result.TransactionOut.Add(kvp.Key);
                    currentStartIndex += kvp.Value;
                }
            }

            result.LockTime    = BitConverter.ToUInt32(payload.Skip(currentStartIndex).Take(4).ToArray(), 0);
            currentStartIndex += 4;
            return(new KeyValuePair <BaseTransaction, int>(result, currentStartIndex));
        }