From af2b9a0533be66738aa73d857818f7f3627b61e4 Mon Sep 17 00:00:00 2001 From: Jinghui Liao Date: Mon, 13 Nov 2023 01:41:33 +0800 Subject: [PATCH 1/4] add debug mode --- src/ApplicationLogs/LogReader.cs | 40 ++++++++++++++++++++++++++++++-- src/ApplicationLogs/Settings.cs | 3 +++ src/ApplicationLogs/config.json | 3 ++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/ApplicationLogs/LogReader.cs b/src/ApplicationLogs/LogReader.cs index 71a9253f0..8bf982534 100644 --- a/src/ApplicationLogs/LogReader.cs +++ b/src/ApplicationLogs/LogReader.cs @@ -24,8 +24,9 @@ namespace Neo.Plugins { public class LogReader : Plugin { - private IStore _db; - private ISnapshot _snapshot; + private static IStore _db; + private static ISnapshot _snapshot; + private static readonly byte[] LogPrefix = { 0x12 }; public override string Name => "ApplicationLogs"; public override string Description => "Synchronizes the smart contract log with the NativeContract log (Notify)"; @@ -34,12 +35,16 @@ public LogReader() { Blockchain.Committing += OnCommitting; Blockchain.Committed += OnCommitted; + if (Settings.Default.Debug) + ApplicationEngine.Log += ApplicationEngine_Log; } public override void Dispose() { Blockchain.Committing -= OnCommitting; Blockchain.Committed -= OnCommitted; + if (Settings.Default.Debug) + ApplicationEngine.Log -= ApplicationEngine_Log; } protected override void Configure() @@ -76,6 +81,12 @@ public JToken GetApplicationLog(JArray _params) i++; } } + if (!Settings.Default.Debug) return raw; + byte[] logs = _db.TryGet(LogPrefix.Concat(hash.ToArray()).ToArray()); + if (logs != null) + { + raw["executions"]["logs"] = (JArray)JToken.Parse(Neo.Utility.StrictUTF8.GetString(value)); + } return raw; } @@ -186,6 +197,31 @@ private void OnCommitting(NeoSystem system, Block block, DataCache snapshot, IRe } } + private static void ApplicationEngine_Log(object sender, LogEventArgs args) + { + if (!Settings.Default.Debug) return; + + var tx = ((Transaction)args.ScriptContainer).Hash; + + byte[] value = _db.TryGet(LogPrefix.Concat(tx.ToArray()).ToArray()); + + JArray logList = null; + if (value is null) + { + logList = new JArray(); + } + else + { + logList = (JArray)JToken.Parse(Neo.Utility.StrictUTF8.GetString(value)); + } + var logJson = new JObject(); + logJson["contract"] = args.ScriptHash.ToString(); + logJson["message"] = args.Message; + logList?.Add(logJson); + + _snapshot.Put(LogPrefix.Concat(tx.ToArray()).ToArray(), Neo.Utility.StrictUTF8.GetBytes(logList?.ToString()!)); + } + private void OnCommitted(NeoSystem system, Block block) { if (system.Settings.Network != Settings.Default.Network) return; diff --git a/src/ApplicationLogs/Settings.cs b/src/ApplicationLogs/Settings.cs index 3e1c3ef79..f42486f67 100644 --- a/src/ApplicationLogs/Settings.cs +++ b/src/ApplicationLogs/Settings.cs @@ -18,6 +18,8 @@ internal class Settings public uint Network { get; } public int MaxStackSize { get; } + public bool Debug { get; } + public static Settings Default { get; private set; } private Settings(IConfigurationSection section) @@ -25,6 +27,7 @@ private Settings(IConfigurationSection section) this.Path = section.GetValue("Path", "ApplicationLogs_{0}"); this.Network = section.GetValue("Network", 5195086u); this.MaxStackSize = section.GetValue("MaxStackSize", (int)ushort.MaxValue); + this.Debug = section.GetValue("Debug", false); } public static void Load(IConfigurationSection section) diff --git a/src/ApplicationLogs/config.json b/src/ApplicationLogs/config.json index 85efc475f..af601bc81 100644 --- a/src/ApplicationLogs/config.json +++ b/src/ApplicationLogs/config.json @@ -2,7 +2,8 @@ "PluginConfiguration": { "Path": "ApplicationLogs_{0}", "Network": 860833102, - "MaxStackSize": 65535 + "MaxStackSize": 65535, + "Debug": false }, "Dependency": [ "RpcServer" From 113ddb8dd591a66a4a562dcc81e47ca252f1a184 Mon Sep 17 00:00:00 2001 From: Jinghui Liao Date: Mon, 13 Nov 2023 01:41:54 +0800 Subject: [PATCH 2/4] update code --- src/ApplicationLogs/LogReader.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ApplicationLogs/LogReader.cs b/src/ApplicationLogs/LogReader.cs index 8bf982534..ebbee2978 100644 --- a/src/ApplicationLogs/LogReader.cs +++ b/src/ApplicationLogs/LogReader.cs @@ -214,9 +214,11 @@ private static void ApplicationEngine_Log(object sender, LogEventArgs args) { logList = (JArray)JToken.Parse(Neo.Utility.StrictUTF8.GetString(value)); } - var logJson = new JObject(); - logJson["contract"] = args.ScriptHash.ToString(); - logJson["message"] = args.Message; + var logJson = new JObject + { + ["contract"] = args.ScriptHash.ToString(), + ["message"] = args.Message + }; logList?.Add(logJson); _snapshot.Put(LogPrefix.Concat(tx.ToArray()).ToArray(), Neo.Utility.StrictUTF8.GetBytes(logList?.ToString()!)); From a4150b7011d015f034ad88c9d4f44ca3f5acdcc6 Mon Sep 17 00:00:00 2001 From: Jinghui Liao Date: Mon, 13 Nov 2023 09:02:25 +0800 Subject: [PATCH 3/4] update rpcclient to support logs --- src/RpcClient/Models/RpcApplicationLog.cs | 31 ++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/RpcClient/Models/RpcApplicationLog.cs b/src/RpcClient/Models/RpcApplicationLog.cs index 1ea337491..121a05cbd 100644 --- a/src/RpcClient/Models/RpcApplicationLog.cs +++ b/src/RpcClient/Models/RpcApplicationLog.cs @@ -61,6 +61,8 @@ public class Execution public List Notifications { get; set; } + public List Logs { get; set; } + public JObject ToJson() { JObject json = new(); @@ -70,6 +72,7 @@ public JObject ToJson() json["exception"] = ExceptionMessage; json["stack"] = Stack.Select(q => q.ToJson()).ToArray(); json["notifications"] = Notifications.Select(q => q.ToJson()).ToArray(); + json["logs"] = Logs?.Select(q => q.ToJson()).ToArray(); return json; } @@ -82,7 +85,8 @@ public static Execution FromJson(JObject json, ProtocolSettings protocolSettings GasConsumed = long.Parse(json["gasconsumed"].AsString()), ExceptionMessage = json["exception"]?.AsString(), Stack = ((JArray)json["stack"]).Select(p => Utility.StackItemFromJson((JObject)p)).ToList(), - Notifications = ((JArray)json["notifications"]).Select(p => RpcNotifyEventArgs.FromJson((JObject)p, protocolSettings)).ToList() + Notifications = ((JArray)json["notifications"]).Select(p => RpcNotifyEventArgs.FromJson((JObject)p, protocolSettings)).ToList(), + Logs = ((JArray)json["logs"])?.Select(p => RpcLogEventArgs.FromJson((JObject)p, protocolSettings)).ToList() }; } } @@ -114,4 +118,29 @@ public static RpcNotifyEventArgs FromJson(JObject json, ProtocolSettings protoco }; } } + + public class RpcLogEventArgs + { + public UInt160 Contract { get; set; } + + public string Message { get; set; } + + public JObject ToJson() + { + return new JObject + { + ["contract"] = Contract.ToString(), + ["message"] = Message + }; + } + + public static RpcLogEventArgs FromJson(JObject json, ProtocolSettings protocolSettings) + { + return new RpcLogEventArgs + { + Contract = json["contract"].ToScriptHash(protocolSettings), + Message = json["message"]?.AsString(), + }; + } + } } From 9df9c07f8d5d842eb3ea5bf919ee6d3dad354322 Mon Sep 17 00:00:00 2001 From: Jinghui Liao Date: Mon, 13 Nov 2023 09:08:49 +0800 Subject: [PATCH 4/4] fix compatibility --- src/RpcClient/Models/RpcApplicationLog.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/RpcClient/Models/RpcApplicationLog.cs b/src/RpcClient/Models/RpcApplicationLog.cs index 121a05cbd..773c392bb 100644 --- a/src/RpcClient/Models/RpcApplicationLog.cs +++ b/src/RpcClient/Models/RpcApplicationLog.cs @@ -72,7 +72,11 @@ public JObject ToJson() json["exception"] = ExceptionMessage; json["stack"] = Stack.Select(q => q.ToJson()).ToArray(); json["notifications"] = Notifications.Select(q => q.ToJson()).ToArray(); - json["logs"] = Logs?.Select(q => q.ToJson()).ToArray(); + // Only add "logs" to json if Logs is not null + if (Logs != null) + { + json["logs"] = Logs.Select(q => q.ToJson()).ToArray(); + } return json; }