public IActionResult InvokeFunction(InvokeFunctionParameter param) { UInt160 script_hash = UInt160.Parse(param.ScriptHash); string operation = param.Operation; ContractParameter[] args = param.Params?.Select(p => ContractParameter.FromJson(p.ToJson()))?.ToArray() ?? new ContractParameter[0]; byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { script = sb.EmitAppCall(script_hash, operation, args).ToArray(); } return(FormatJson(GetInvokeResult(script))); }
private byte[] LoadUpdateScript(UInt160 scriptHash, string nefFilePath, string manifestFilePath, JObject data, out NefFile nef, out ContractManifest manifest) { if (string.IsNullOrEmpty(manifestFilePath)) { manifestFilePath = Path.ChangeExtension(nefFilePath, ".manifest.json"); } // Read manifest var info = new FileInfo(manifestFilePath); if (!info.Exists || info.Length >= Transaction.MaxTransactionSize) { throw new ArgumentException(nameof(manifestFilePath)); } manifest = ContractManifest.Parse(File.ReadAllBytes(manifestFilePath)); // Read nef info = new FileInfo(nefFilePath); if (!info.Exists || info.Length >= Transaction.MaxTransactionSize) { throw new ArgumentException(nameof(nefFilePath)); } using (var stream = new BinaryReader(File.OpenRead(nefFilePath), Utility.StrictUTF8, false)) { nef = stream.ReadSerializable <NefFile>(); } ContractParameter dataParameter = null; if (data is not null) { try { dataParameter = ContractParameter.FromJson(data); } catch { throw new FormatException("invalid data"); } } // Basic script checks Script script = new Script(nef.Script); for (var i = 0; i < script.Length;) { // Check bad opcodes Instruction inst = script.GetInstruction(i); if (inst is null || !Enum.IsDefined(typeof(OpCode), inst.OpCode)) { throw new FormatException($"OpCode not found at {i}-{((byte)inst.OpCode).ToString("x2")}"); } i += inst.Size; } // Build script using (ScriptBuilder sb = new ScriptBuilder()) { if (dataParameter is null) { sb.EmitDynamicCall(scriptHash, "update", nef.ToArray(), manifest.ToJson().ToString()); } else { sb.EmitDynamicCall(scriptHash, "update", nef.ToArray(), manifest.ToJson().ToString(), dataParameter); } return(sb.ToArray()); } }
private JObject InvokeFunction(JArray _params) { UInt160 script_hash = UInt160.Parse(_params[0].AsString()); string operation = _params[1].AsString(); ContractParameter[] args = _params.Count >= 3 ? ((JArray)_params[2]).Select(p => ContractParameter.FromJson(p)).ToArray() : new ContractParameter[0]; Cosigners cosigners = _params.Count >= 4 ? new Cosigners(((JArray)_params[3]).Select(u => new Cosigner() { Account = UInt160.Parse(u["account"].AsString()), Scopes = (WitnessScope)Enum.Parse(typeof(WitnessScope), u["scopes"].AsString()) }).ToArray()) : null; byte[] script; using (ScriptBuilder sb = new ScriptBuilder()) { script = sb.EmitAppCall(script_hash, operation, args).ToArray(); } return(GetInvokeResult(script, cosigners)); }