Пример #1
0
        public CheckPointBlock this[uint i]
        {
            get
            {
                long p = _stream.Position;
//		log.Info(Header.BlockOffset(i));
                _stream.Position = Header.BlockOffset(i);
                var block = new CheckPointBlock(_stream);
                _stream.Position = p;
                return(block);
            }
        }
Пример #2
0
        internal static void Put(CheckPointBlock cb)
        {
            using (FileStream fs = File.OpenWrite(Node.NetParams.CheckPointFileName))
            {
                uint position;
                if (_offsets.Count <= cb.BlockNumber)
                {
                    position = (uint)fs.Length;
                    _offsets.Add(position);
                }
                else
                {
                    position = _offsets[(int)cb.BlockNumber];
                }

                fs.Position = position;
                cb.SaveToStream(fs);
            }
        }
Пример #3
0
        internal static void Init()
        {
            WorkSum = 0;
            Current = new List <CheckPointBlock>();
            if (!File.Exists((Node.NetParams.CheckPointIndexName)))
            {
                return;
            }
            try
            {
                FileStream fs = File.Open(Node.NetParams.CheckPointIndexName, FileMode.Open);
                _offsets = new List <uint>((int)(fs.Length / 4));
                Accounts = new List <Account>();
                using (BinaryReader br = new BinaryReader(fs))
                {
                    while (fs.Position < fs.Length)
                    {
                        _offsets.Add(br.ReadUInt32());
                    }
                }

                using (FileStream cf = File.OpenRead(Node.NetParams.CheckPointFileName))
                {
                    while (cf.Position < cf.Length)
                    {
                        var block = new CheckPointBlock(cf);
                        WorkSum += block.CompactTarget;
                        Accounts.AddRange(block.Accounts);
                        Current.Add(block);
                    }
                }
            }
            catch
            {
            }
            if (Accounts.Count > 0)
            {
                Log.Info($"Accounts: {Accounts.Last().AccountNumber}");
            }
        }
Пример #4
0
        internal static void AppendBlock(Block b)
        {
            int lastBlock = -1;

            if (GetLastBlock() != null)
            {
                if (b.BlockNumber <= GetLastBlock().BlockNumber)
                {
                    return;
                }
                lastBlock = (int)GetLastBlock().BlockNumber;
            }

            CheckPointBlock checkPointBlock = new CheckPointBlock {
                AccountKey = b.AccountKey
            };
            uint accNumber = (uint)(lastBlock + 1) * 5;

            if (accNumber == 0)
            {
                Log.Info("NULL");
            }

            ulong accWork = WorkSum;

            for (int i = 0; i < 5; i++)
            {
                checkPointBlock.Accounts.Add(new Account
                {
                    AccountNumber      = accNumber,
                    Balance            = (i == 0 ? 1000000ul + (ulong)b.Fee : 0ul),
                    BlockNumber        = b.BlockNumber,
                    UpdatedBlock       = b.BlockNumber,
                    NumberOfOperations = 0,
                    AccountType        = 0,
                    Name           = "",
                    UpdatedByBlock = b.BlockNumber,
                    AccountInfo    = new AccountInfo
                    {
                        AccountKey = b.AccountKey,
                        State      = AccountState.Normal
                    }
                });
                accNumber++;
            }

            accWork += b.CompactTarget;
            WorkSum += b.CompactTarget;
            checkPointBlock.AccumulatedWork   = accWork;
            checkPointBlock.AvailableProtocol = b.AvailableProtocol;
            checkPointBlock.BlockNumber       = b.BlockNumber;
            checkPointBlock.BlockSignature    = 2;
            checkPointBlock.CheckPointHash    = b.CheckPointHash;
            checkPointBlock.CompactTarget     = b.CompactTarget;
            checkPointBlock.Fee             = b.Fee;
            checkPointBlock.Nonce           = b.Nonce;
            checkPointBlock.Payload         = b.Payload;
            checkPointBlock.ProofOfWork     = b.ProofOfWork;
            checkPointBlock.ProtocolVersion = b.ProtocolVersion;
            checkPointBlock.Reward          = b.Reward;
            checkPointBlock.Timestamp       = b.Timestamp;
            checkPointBlock.TransactionHash = b.TransactionHash;
            foreach (var t in b.Transactions)
            {
                ApplyTransaction(t, b);
            }
            Current.Add(checkPointBlock);
            Accounts.AddRange(checkPointBlock.Accounts);
            if ((checkPointBlock.BlockNumber + 1) % 100 == 0)
            {
                SaveNext();
            }
            OldCheckPointHash = CheckPointHash(Current);
        }
Пример #5
0
        internal static List <CheckPointBlock> BuildFromBlockChain(BlockChain blockChain)
        {
            List <CheckPointBlock> checkPoint = new List <CheckPointBlock>(blockChain.BlockHeight() + 1);
            uint  accNumber = 0;
            ulong accWork   = 0;

            for (int block = 0; block < 100 * ((blockChain.GetLastBlock().BlockNumber + 1) / 100); block++)
            {
                Block currentBlock = blockChain.Get(block);
                if (currentBlock == null)
                {
                    var   h             = blockChain.GetLastBlock().BlockNumber;
                    Block currentBlock1 = blockChain.Get((int)block);
                    continue;
                }
                CheckPointBlock checkPointBlock = new CheckPointBlock {
                    AccountKey = currentBlock.AccountKey
                };
                for (int i = 0; i < 5; i++)
                {
                    checkPointBlock.Accounts.Add(new Account
                    {
                        AccountNumber      = accNumber,
                        Balance            = (i == 0 ? 1000000ul + (ulong)currentBlock.Fee : 0ul),
                        BlockNumber        = currentBlock.BlockNumber,
                        UpdatedBlock       = currentBlock.BlockNumber,
                        NumberOfOperations = 0,
                        AccountType        = 0,
                        Name           = "",
                        UpdatedByBlock = currentBlock.BlockNumber,
                        AccountInfo    = new AccountInfo
                        {
                            AccountKey = currentBlock.AccountKey,
                            State      = AccountState.Normal
                        }
                    });
                    accNumber++;
                }

                accWork += currentBlock.CompactTarget;
                checkPointBlock.AccumulatedWork   = accWork;
                checkPointBlock.AvailableProtocol = currentBlock.AvailableProtocol;
                checkPointBlock.BlockNumber       = currentBlock.BlockNumber;
                checkPointBlock.BlockSignature    = 2; //b.BlockSignature;
                checkPointBlock.CheckPointHash    = currentBlock.CheckPointHash;
                checkPointBlock.CompactTarget     = currentBlock.CompactTarget;
                checkPointBlock.Fee             = currentBlock.Fee;
                checkPointBlock.Nonce           = currentBlock.Nonce;
                checkPointBlock.Payload         = currentBlock.Payload;
                checkPointBlock.ProofOfWork     = currentBlock.ProofOfWork;
                checkPointBlock.ProtocolVersion = currentBlock.ProtocolVersion;
                checkPointBlock.Reward          = currentBlock.Reward;
                checkPointBlock.Timestamp       = currentBlock.Timestamp;
                checkPointBlock.TransactionHash = currentBlock.TransactionHash;
                WorkSum += currentBlock.CompactTarget;
                foreach (var t in currentBlock.Transactions)
                {
                    Account account;
                    var     signer = checkPoint.FirstOrDefault(p =>
                                                               p.Accounts.Count(a => a.AccountNumber == t.SignerAccount) > 0);
                    var target = checkPoint.FirstOrDefault(p =>
                                                           p.Accounts.Count(a => a.AccountNumber == t.TargetAccount) > 0);
                    if (t.Fee != 0)
                    {
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                    }
                    switch (t.TransactionType)
                    {
                    case TransactionType.Transaction:
                        TransferTransaction transfer = (TransferTransaction)t;
                        if (signer != null && target != null)
                        {
                            if (t.Fee == 0)
                            {
                                signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                            }
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance -=
                                (transfer.Fee + transfer.Amount);
                            target.Accounts.First(p => p.AccountNumber == t.TargetAccount).Balance +=
                                transfer.Amount;
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock =
                                currentBlock.BlockNumber;
                            target.Accounts.First(p => p.AccountNumber == t.TargetAccount).UpdatedBlock =
                                currentBlock.BlockNumber;
                        }

                        break;

                    case TransactionType.BuyAccount:
                        TransferTransaction transferTransaction = (TransferTransaction)t;      // TODO: be kell fejezni
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance -=
                            (transferTransaction.Fee + transferTransaction.Amount);
                        CheckPointBlock seller = checkPoint.FirstOrDefault(p =>
                                                                           p.Accounts.Count(a => a.AccountNumber == transferTransaction.SellerAccount) > 0);
                        seller.Accounts.First(p => p.AccountNumber == transferTransaction.SellerAccount).Balance +=
                            transferTransaction.Amount;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = currentBlock.BlockNumber;
                        target.Accounts.First(p => p.AccountNumber == t.TargetAccount).UpdatedBlock = currentBlock.BlockNumber;
                        seller.Accounts.First(p => p.AccountNumber == transferTransaction.SellerAccount)
                        .UpdatedBlock = currentBlock.BlockNumber;
                        account       = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        account.AccountInfo.AccountKey        = transferTransaction.NewAccountKey;
                        account.AccountInfo.Price             = 0;
                        account.AccountInfo.LockedUntilBlock  = 0;
                        account.AccountInfo.State             = AccountState.Normal;
                        account.AccountInfo.AccountToPayPrice = 0;
                        account.AccountInfo.NewPublicKey      = null;
                        break;

                    case TransactionType.DeListAccountForSale:
                    case TransactionType.ListAccountForSale:
                        ListAccountTransaction listAccountTransaction = (ListAccountTransaction)t;
                        account = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance -=
                            listAccountTransaction.Fee;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = currentBlock.BlockNumber;
                        target.Accounts.First(p => p.AccountNumber == t.TargetAccount).UpdatedBlock = currentBlock.BlockNumber;
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        if (listAccountTransaction.TransactionType == TransactionType.ListAccountForSale)
                        {
                            account.AccountInfo.Price             = listAccountTransaction.AccountPrice;
                            account.AccountInfo.LockedUntilBlock  = listAccountTransaction.LockedUntilBlock;
                            account.AccountInfo.State             = AccountState.Sale;
                            account.AccountInfo.Price             = listAccountTransaction.AccountPrice;
                            account.AccountInfo.NewPublicKey      = listAccountTransaction.NewPublicKey;
                            account.AccountInfo.AccountToPayPrice = listAccountTransaction.AccountToPay;
                        }
                        else
                        {
                            account.AccountInfo.State             = AccountState.Normal;
                            account.AccountInfo.Price             = 0;
                            account.AccountInfo.NewPublicKey      = null;
                            account.AccountInfo.LockedUntilBlock  = 0;
                            account.AccountInfo.AccountToPayPrice = 0;
                        }

                        break;

                    case TransactionType.ChangeAccountInfo:
                        ChangeAccountInfoTransaction changeAccountInfoTransaction =
                            (ChangeAccountInfoTransaction)t;
                        account = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        if ((changeAccountInfoTransaction.ChangeType & 1) == 1)
                        {
                            account.AccountInfo.AccountKey = changeAccountInfoTransaction.NewAccountKey;
                        }

                        if ((changeAccountInfoTransaction.ChangeType & 4) == 4)
                        {
                            account.AccountType = changeAccountInfoTransaction.NewType;
                        }

                        if ((changeAccountInfoTransaction.ChangeType & 2) == 2)
                        {
                            account.Name = changeAccountInfoTransaction.NewName;
                        }

                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance -=
                            changeAccountInfoTransaction.Fee;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = currentBlock.BlockNumber;
                        account.UpdatedBlock = currentBlock.BlockNumber;
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        break;

                    case TransactionType.ChangeKey:
                    case TransactionType.ChangeKeySigned:
                        ChangeKeyTransaction changeKeyTransaction = (ChangeKeyTransaction)t;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance -=
                            changeKeyTransaction.Fee;
                        account = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        account.AccountInfo.AccountKey = changeKeyTransaction.NewAccountKey;
                        account.UpdatedBlock           = currentBlock.BlockNumber;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = currentBlock.BlockNumber;
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        break;
                    }
                }

                checkPoint.Add(checkPointBlock);
                if (block % 100 == 0)
                {
                    CheckPointBuilding?.Invoke(new object(), new CheckPointBuildingEventArgs
                    {
                        BlocksDone   = block,
                        BlocksNeeded = (int)(100 * ((blockChain.GetLastBlock().BlockNumber + 1) / 100)) * 2
                    });
                }
            }

            foreach (var p in checkPoint)
            {
                p.BlockHash = p.CalculateBlockHash();

                if (p.BlockNumber % 100 == 0)
                {
                    CheckPointBuilding?.Invoke(new object(), new CheckPointBuildingEventArgs
                    {
                        BlocksDone   = (int)(p.BlockNumber + checkPoint.Count),
                        BlocksNeeded = (int)(checkPoint.Count * 2)
                    });
                }
            }
            return(checkPoint);
        }
Пример #6
0
        public static List <CheckPointBlock> BuildFromBlockChain(BlockChain blockChain)
        {
            var   checkPoint = new List <CheckPointBlock>(blockChain.BlockHeight() + 1);
            uint  accNumber  = 0;
            ulong accWork    = 0;

            for (int block = 0; block < 100 * ((blockChain.GetLastBlock().BlockNumber + 1) / 100); block++)
            {
#if !NETCOREAPP
                if (block % 1000 == 0)
                {
                    Log.Info($"Building checkpont: {block} block");
                }
#endif
                Block b = blockChain.Get(block);
                var   checkPointBlock = new CheckPointBlock {
                    AccountKey = b.AccountKey
                };
                for (var i = 0; i < 5; i++)
                {
                    checkPointBlock.Accounts.Add(new Account
                    {
                        AccountNumber      = accNumber,
                        Balance            = (i == 0)?1000000ul + (ulong)b.Fee:0ul,
                        BlockNumber        = b.BlockNumber,
                        UpdatedBlock       = b.BlockNumber,
                        NumberOfOperations = 0,
                        AccountType        = 0,
                        Name           = "",
                        UpdatedByBlock = b.BlockNumber,
                        AccountInfo    = new AccountInfo
                        {
                            AccountKey = b.AccountKey,
                            State      = AccountState.Normal
                        }
                    });
                    accNumber++;
                }
                accWork += b.CompactTarget;
                checkPointBlock.AccumulatedWork   = accWork;
                checkPointBlock.AvailableProtocol = b.AvailableProtocol;
                checkPointBlock.BlockNumber       = b.BlockNumber;
                checkPointBlock.BlockSignature    = 2;//b.BlockSignature;
                checkPointBlock.CheckPointHash    = b.CheckPointHash;
                checkPointBlock.CompactTarget     = b.CompactTarget;
                checkPointBlock.Fee             = b.Fee;
                checkPointBlock.Nonce           = b.Nonce;
                checkPointBlock.Payload         = b.Payload;
                checkPointBlock.ProofOfWork     = b.ProofOfWork;
                checkPointBlock.ProtocolVersion = b.ProtocolVersion;
                checkPointBlock.Reward          = b.Reward;
                checkPointBlock.Timestamp       = b.Timestamp;
                checkPointBlock.TransactionHash = b.TransactionHash;
                foreach (var t in b.Transactions)
                {
                    Account account;
                    var     signer = checkPoint.FirstOrDefault(p => p.Accounts.Count(a => a.AccountNumber == t.SignerAccount) > 0);
                    var     target = checkPoint.FirstOrDefault(p => p.Accounts.Count(a => a.AccountNumber == t.TargetAccount) > 0);
                    if (signer == null)
                    {
                        throw new NullReferenceException("Signer account is null");
                    }
                    if (t.Fee != 0)
                    {
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                    }
                    switch (t.TransactionType)
                    {
                    case TransactionType.Transaction:
                        var transfer = (TransferTransaction)t;
                        if (target != null)
                        {
                            if (t.Fee == 0)
                            {
                                signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                            }
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance     -= transfer.Fee + transfer.Amount;
                            target.Accounts.First(p => p.AccountNumber == t.TargetAccount).Balance     += transfer.Amount;
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = b.BlockNumber;
                            target.Accounts.First(p => p.AccountNumber == t.TargetAccount).UpdatedBlock = b.BlockNumber;
                        }
                        break;

                    case TransactionType.BuyAccount:
                        TransferTransaction transferTransaction = (TransferTransaction)t;     // TODO: be kell fejezni
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance -= transferTransaction.Fee + transferTransaction.Amount;
                        CheckPointBlock seller = checkPoint.FirstOrDefault(p => p.Accounts.Count(a => a.AccountNumber == transferTransaction.SellerAccount) > 0);
                        seller.Accounts.First(p => p.AccountNumber == transferTransaction.SellerAccount).Balance += transferTransaction.Amount;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = b.BlockNumber;
                        target.Accounts.First(p => p.AccountNumber == t.TargetAccount).UpdatedBlock = b.BlockNumber;
                        seller.Accounts.First(p => p.AccountNumber == transferTransaction.SellerAccount).UpdatedBlock = b.BlockNumber;
                        account = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        account.AccountInfo.AccountKey        = transferTransaction.NewAccountKey;
                        account.AccountInfo.Price             = 0;
                        account.AccountInfo.LockedUntilBlock  = 0;
                        account.AccountInfo.State             = AccountState.Normal;
                        account.AccountInfo.AccountToPayPrice = 0;
                        account.AccountInfo.NewPublicKey      = null;
                        break;

                    case TransactionType.DeListAccountForSale:
                    case TransactionType.ListAccountForSale:
                        ListAccountTransaction listAccountTransaction = (ListAccountTransaction)t;
                        account = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance     -= listAccountTransaction.Fee;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = b.BlockNumber;
                        target.Accounts.First(p => p.AccountNumber == t.TargetAccount).UpdatedBlock = b.BlockNumber;
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        if (listAccountTransaction.TransactionType == TransactionType.ListAccountForSale)
                        {
                            account.AccountInfo.Price             = listAccountTransaction.AccountPrice;
                            account.AccountInfo.LockedUntilBlock  = listAccountTransaction.LockedUntilBlock;
                            account.AccountInfo.State             = AccountState.Sale;
                            account.AccountInfo.Price             = listAccountTransaction.AccountPrice;
                            account.AccountInfo.NewPublicKey      = listAccountTransaction.NewPublicKey;
                            account.AccountInfo.AccountToPayPrice = listAccountTransaction.AccountToPay;
                        }
                        else
                        {
                            account.AccountInfo.State             = AccountState.Normal;
                            account.AccountInfo.Price             = 0;
                            account.AccountInfo.NewPublicKey      = null;
                            account.AccountInfo.LockedUntilBlock  = 0;
                            account.AccountInfo.AccountToPayPrice = 0;
                        }
                        break;

                    case TransactionType.ChangeAccountInfo:
                        ChangeAccountInfoTransaction changeAccountInfoTransaction = (ChangeAccountInfoTransaction)t;
                        account = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        if ((changeAccountInfoTransaction.ChangeType & 1) == 1)
                        {
                            account.AccountInfo.AccountKey = changeAccountInfoTransaction.NewAccountKey;
                        }
                        if ((changeAccountInfoTransaction.ChangeType & 4) == 4)
                        {
                            account.AccountType = changeAccountInfoTransaction.NewType;
                        }
                        if ((changeAccountInfoTransaction.ChangeType & 2) == 2)
                        {
                            account.Name = changeAccountInfoTransaction.NewName;
                        }
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance     -= changeAccountInfoTransaction.Fee;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = b.BlockNumber;
                        account.UpdatedBlock = b.BlockNumber;
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        break;

                    case TransactionType.ChangeKey:
                    case TransactionType.ChangeKeySigned:
                        ChangeKeyTransaction changeKeyTransaction = (ChangeKeyTransaction)t;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).Balance -= changeKeyTransaction.Fee;
                        account = target.Accounts.First(p => p.AccountNumber == t.TargetAccount);
                        account.AccountInfo.AccountKey = changeKeyTransaction.NewAccountKey;
                        account.UpdatedBlock           = b.BlockNumber;
                        signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).UpdatedBlock = b.BlockNumber;
                        if (t.Fee == 0)
                        {
                            signer.Accounts.First(p => p.AccountNumber == t.SignerAccount).NumberOfOperations++;
                        }
                        break;
                    }
                }
                checkPoint.Add(checkPointBlock);
            }
            foreach (var p in checkPoint)
            {
                p.BlockHash = p.CalculateBlockHash();
            }
            return(checkPoint);
        }