コード例 #1
0
        static public string Create(string data, string depend)
        {
            LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>();
            bool     rel      = luaVMEnv.LuaCreate(LuaVMStack.s_dbSnapshot, LuaVMStack.s_transfer.addressIn, data, LuaVMStack.s_transfer.timestamp, depend, LuaVMStack.s_transfer.height, out string addressNew);

            if (rel && !string.IsNullOrEmpty(addressNew))
            {
                return(addressNew);
            }
            return(null);
        }
コード例 #2
0
        static public object[] Call(string consAddress, string data)
        {
            LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>();
            var      rel      = luaVMEnv.LuaCall(LuaVMStack.s_dbSnapshot, consAddress, LuaVMStack.s_consAddress, data, LuaVMStack.s_transfer.height, out object[] result);

            if (rel)
            {
                return(result);
            }
            return(null);
        }
コード例 #3
0
        static public string BalanceOf(string consAddress, string address)
        {
            LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>();
            var      data     = $"balanceOf(\"{address}\")";
            bool     rel      = luaVMEnv.LuaCall(LuaVMStack.s_dbSnapshot, consAddress, LuaVMStack.s_consAddress, data, LuaVMStack.s_transfer.height, out object[] result);

            if (rel && result != null && result.Length >= 1)
            {
                var amount = ((string)result[0]) ?? "0";
                return(amount);
            }
            return("0");
        }
コード例 #4
0
        static public bool TransferToken(string consAddress, string addressIn, string addressOut, string amount)
        {
            LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>();
            var      data     = $"transfer(\"{addressOut}\",\"{amount}\")";

            var transfer = LuaVMStack.s_transfer;

            if (transfer.addressIn != addressIn && LuaVMStack.s_consAddress != addressIn && LuaVMStack.s_sender != addressIn)
            {
                return(false);
            }

            if (luaVMEnv.IsERC(LuaVMStack.s_dbSnapshot, consAddress, "ERCSat"))
            {
                return(Transfer(addressIn, addressOut, amount));
            }

            return(luaVMEnv.LuaCall(LuaVMStack.s_dbSnapshot, consAddress, addressIn, data, LuaVMStack.s_transfer.height, out object[] result));
        }
コード例 #5
0
        // 奖励上一周期的rule、本周期的MC出块rule  , 出块的rule会得到两次奖励
        public void ApplyReward(DbSnapshot dbSnapshot, Block mcblk)
        {
            var rewardKey = $"{mcblk.height}_Reward";

            if (dbSnapshot.Get(rewardKey) == "1")
            {
                return;
            }
            dbSnapshot.Add(rewardKey, "1");

            var amount     = GetReward(mcblk.height).ToString();
            var amountRule = GetRewardRule(mcblk.height).ToString();

            Transfer Reward_Rule = null;
            Transfer Reward      = null;

            if (transferShow)
            {
                Reward_Rule = new Transfer()
                {
                    hash = "", type = "Reward_Rule", nonce = mcblk.height, amount = amountRule
                };
                Reward_Rule.hash   = Reward_Rule.ToHash();
                Reward_Rule.height = mcblk.height;
                dbSnapshot.Transfers.Add(Reward_Rule.hash, Reward_Rule);

                Reward = new Transfer()
                {
                    hash = "", type = "Reward_Mc", nonce = mcblk.height, data = mcblk.height.ToString(), amount = amount
                };
                Reward.height = mcblk.height;
                dbSnapshot.Transfers.Add(Reward.hash = Reward.ToHash(), Reward);
            }

            // rule奖励
            int ruleCount = 0;

            for (int ii = 0; ii < mcblk.linksblk.Count; ii++)
            {
                Block linkblk = blockMgr.GetBlock(mcblk.linksblk[ii]);
                if (linkblk != null && IsRule(mcblk.height, linkblk.Address))
                {
                    ruleCount++;
                    Account linkAccount = dbSnapshot.Accounts.Get(linkblk.Address);
                    if (linkAccount == null)
                    {
                        linkAccount = new Account()
                        {
                            address = linkblk.Address, amount = "0", index = 0, nonce = 0
                        }
                    }
                    ;
                    linkAccount.amount = BigInt.Add(linkAccount.amount, amountRule);
                    linkAccount.index += 1;
                    dbSnapshot.Accounts.Add(linkAccount.address, linkAccount);
                    if (transferShow)
                    {
                        dbSnapshot.BindTransfer2Account(linkAccount.address, linkAccount.index, Reward_Rule.hash);
                    }
                }
            }

            // 出块奖励
            Account account = dbSnapshot.Accounts.Get(mcblk.Address);

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

            if (transferShow)
            {
                dbSnapshot.BindTransfer2Account(account.address, account.index, Reward.hash);
            }
        }

        LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>();
コード例 #6
0
        public bool ApplyHeight(BlockChain blockChain)
        {
            if (blockChain == null)
            {
                return(false);
            }

            // 应用高度不是下一高度
            long.TryParse(levelDBStore.Get("UndoHeight"), out transferHeight);
            if (blockChain.height - 1 != transferHeight)
            {
                return(false);
            }

            Block mcblk = blockChain.GetMcBlock();

            if (mcblk == null)
            {
                return(false);
            }

            Block preblk = BlockChainHelper.GetMcBlock(transferHeight);

            if (mcblk.prehash != preblk.hash)
            {
                return(false);
            }

            LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>();

            ruleInfos = luaVMEnv.GetRules(consAddress, transferHeight);

            // --------------------------------------------------
            calculatePower.Insert(mcblk);
            //Log.Debug($"ApplyHeight={blockChain.height}, {calculatePower.GetPower()}, {mcblk.GetDiff()}");

            using (DbSnapshot dbSnapshot = levelDBStore.GetSnapshotUndo(blockChain.height))
            {
                blockChain.Apply(dbSnapshot);
                ApplyReward(dbSnapshot, mcblk);

                if (GetRuleCount(mcblk.height - 1, 2) >= 2 && BlockChainHelper.IsIrreversible(this, mcblk))
                {
                    dbSnapshot.Add("2F1Height", mcblk.height.ToString());
                }

                // 连接块交易
                for (int ii = 0; ii < mcblk.linksblk.Count; ii++)
                {
                    Block linkblk = blockMgr.GetBlock(mcblk.linksblk[ii]);
                    if (linkblk == null)
                    {
                        return(false);
                    }
                    if (linkblk.height != 1)
                    {
                        for (int jj = 0; jj < linkblk.linkstran.Count; jj++)
                        {
                            if (!ApplyTransfer(dbSnapshot, linkblk.linkstran[jj], linkblk.height))
                            {
                                return(false);
                            }
                            if (!ApplyContract(dbSnapshot, linkblk.linkstran[jj], linkblk.height))
                            {
                                return(false);
                            }
                        }
                    }
                }

                dbSnapshot.Commit();
            }

            ruleInfos = luaVMEnv.GetRules(consAddress, mcblk.height, true);
            return(true);
        }
コード例 #7
0
        static public bool IsERC(string address, string scriptName)
        {
            LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>();

            return(luaVMEnv.IsERC(LuaVMStack.s_dbSnapshot, address, scriptName));
        }