public bool LuaCreate(LuaVMDB dbSnapshot, string sender, string data, long timestamp, string depend, long height, out string consAddress) { LuaVMCall luaVMCall = new LuaVMCall(); LuaVMScript luaVMScript = null; LuaVMContext LuaVMContext = null; LuaEnv luaenv = GetLuaEnv(depend, "LuaCreate"); consAddress = GetContractAddress(sender, data, timestamp, depend); try { LuaVMStack.Enqueue(consAddress, sender); luaenv.DoString(initScript); luaVMScript = new LuaVMScript() { script = FileHelper.GetFileData($"./Data/Contract/{depend}.lua").ToByteArray(), tablName = depend }; LuaVMContext = new LuaVMContext() { jsonData = "{}".ToByteArray() }; luaVMCall = LuaVMCall.Decode(data); dbSnapshot.Contracts.Add(consAddress, luaVMScript); luaenv.DoString(luaVMScript.script); object[] args = luaVMCall.args.Select(a => a.GetValue()).ToArray(); LuaFunction luaFun = luaenv.Global.Get <LuaFunction>(luaVMCall.fnName); luaenv.Global.Set("curHeight", height); luaenv.Global.Set("sender", sender); luaenv.Global.Set("addressThis", consAddress); if (luaFun != null) { luaFun.Call(args); // rapidjson luaenv.DoString("StoragesJson = rapidjson.encode(Storages)\n"); LuaVMContext.jsonData = luaenv.Global.Get <string>("StoragesJson").ToByteArray(); dbSnapshot.Storages.Add(consAddress, LuaVMContext); return(true); } } catch (Exception e) { throw e; } finally { LuaVMStack.Dequeue(); } return(false); }
public bool LuaCall(LuaVMDB dbSnapshot, string consAddress, string sender, string data, long height, out object[] result) { LuaVMCall luaVMCall = new LuaVMCall(); LuaVMScript luaVMScript = null; LuaVMContext LuaVMContext = null; LuaEnv luaenv = GetLuaEnv(consAddress, "LuaCall"); result = null; try { LuaVMStack.Enqueue(consAddress, sender); luaenv.DoString(initScript); luaVMScript = LuaVMScript.Get(dbSnapshot, consAddress); LuaVMContext = dbSnapshot.Storages.Get(consAddress); luaVMCall = LuaVMCall.Decode(data); luaenv.DoString(luaVMScript.script, consAddress); luaenv.DoString($"Storages = rapidjson.decode('{LuaVMContext.jsonData.ToStr()}')\n"); object[] args = luaVMCall.args.Select(a => a.GetValue()).ToArray(); LuaFunction luaFun = luaenv.Global.Get <LuaFunction>(luaVMCall.fnName); luaenv.Global.Set("curHeight", height); luaenv.Global.Set("sender", sender); luaenv.Global.Set("addressThis", consAddress); if (luaFun != null) { result = luaFun.Call(args); // rapidjson luaenv.DoString("StoragesJson = rapidjson.encode(Storages)\n"); LuaVMContext.jsonData = luaenv.Global.Get <string>("StoragesJson").ToByteArray(); dbSnapshot.Storages.Add(consAddress, LuaVMContext); return(true); } } catch (Exception e) { throw e; } finally { LuaVMStack.Dequeue(); } return(false); }