示例#1
0
        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);
        }
示例#2
0
        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);
        }