예제 #1
0
파일: Rule.cs 프로젝트: mangodager/corlas
        public int AddTransfer(Transfer transfer)
        {
            if (!consensus.IsRule(height, Wallet.GetWallet().GetCurWallet().ToAddress()))
            {
                return(-1);
            }

            transfer.hash = transfer.ToHash();

            if (!Wallet.Verify(transfer.sign, transfer.hash, transfer.addressIn))
            {
                return(-2);
            }

            if (BigInt.Less(transfer.amount, "0", false))
            {
                return(-3);
            }
            Account account = null;

            using (var snapshot = Entity.Root.GetComponent <LevelDBStore>().GetSnapshot())
            {
                account = snapshot.Accounts.Get(transfer.addressIn);
            }
            if (account == null)
            {
                return(-4);
            }

            if (BigInt.Less(account.amount, transfer.amount, false))
            {
                return(-5);
            }

            lock (transfers)
            {
                // 出块权限
                if (transfers.Count > 6000)
                {
                    return(-6);
                }

                transfers.Remove(transfer.hash);
                transfers.Add(transfer.hash, transfer);
            }
            return(1);
        }
예제 #2
0
        public bool ApplyTransfer(DbSnapshot dbSnapshot, Transfer transfer, long height)
        {
            if (transfer.type != "tranfer")
            {
                return(true);
            }
            if (transfer.addressIn == transfer.addressOut)
            {
                return(true);
            }
            if (BigInt.Less(transfer.amount, "0", true))
            {
                return(true);
            }
            //if (!transfer.CheckSign() && height != 1)
            //    return true;

            if (height != 1)
            {
                Account accountIn = dbSnapshot.Accounts.Get(transfer.addressIn);
                if (accountIn == null)
                {
                    return(true);
                }
                if (BigInt.Less(accountIn.amount, transfer.amount, false))
                {
                    return(true);
                }
                if (accountIn.nonce + 1 != transfer.nonce)
                {
                    return(true);
                }
                accountIn.amount = BigInt.Add(accountIn.amount, transfer.amount);
                accountIn.index += 1;
                accountIn.nonce += 1;
                dbSnapshot.Accounts.Add(accountIn.address, accountIn);
                if (transferShow)
                {
                    dbSnapshot.BindTransfer2Account(transfer.addressIn, accountIn.index, transfer.hash);
                }
            }

            Account accountOut = dbSnapshot.Accounts.Get(transfer.addressOut);

            if (accountOut == null)
            {
                accountOut = new Account()
                {
                    address = transfer.addressOut, amount = "0", index = 0, nonce = 0
                }
            }
            ;
            accountOut.amount = BigInt.Add(accountOut.amount, transfer.amount);
            accountOut.index += 1;
            dbSnapshot.Accounts.Add(accountOut.address, accountOut);

            if (transferShow)
            {
                dbSnapshot.BindTransfer2Account(transfer.addressOut, accountOut.index, transfer.hash);
                transfer.height = height;
                dbSnapshot.Transfers.Add(transfer.hash, transfer);
            }

            return(true);
        }