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); }
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); }
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"); }
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)); }
// 奖励上一周期的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>();
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); }
static public bool IsERC(string address, string scriptName) { LuaVMEnv luaVMEnv = Entity.Root.GetComponent <LuaVMEnv>(); return(luaVMEnv.IsERC(LuaVMStack.s_dbSnapshot, address, scriptName)); }