コード例 #1
0
ファイル: BlockAnalyzer.cs プロジェクト: neo-ngd/Neo3-GUI
        private void ProcessDeploy(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec)
        {
            if (notification.State.Count != 1)
            {
                return;
            }
            var hash = notification.State[0].GetByteSafely();

            if (hash == null || hash.Length != 20)
            {
                return;
            }

            var contractHash = new UInt160(hash);

            if (!Result.ContractChangeEvents.ContainsKey(appExec.Transaction.Hash))
            {
                Result.ContractChangeEvents[appExec.Transaction.Hash] = new List <ContractEventInfo>();
            }
            ContractState contract = NativeContract.ContractManagement.GetContract(_snapshot, contractHash);

            Result.ContractChangeEvents[appExec.Transaction.Hash].Add(new ContractEventInfo()
            {
                Contract = contractHash, Name = contract?.Manifest.Name, Event = ContractEventType.Create
            });
            var asset = AssetCache.GetAssetInfoFromChain(contractHash, _snapshot);

            if (asset != null)
            {
                Result.AssetInfos[asset.Asset] = asset;
            }
        }
コード例 #2
0
        public static JObject TxLogToJson(Blockchain.ApplicationExecuted appExec)
        {
            global::System.Diagnostics.Debug.Assert(appExec.Transaction != null);

            var txJson = new JObject();

            txJson["txid"] = appExec.Transaction.Hash.ToString();
            JObject trigger = new JObject();

            trigger["trigger"]     = appExec.Trigger;
            trigger["vmstate"]     = appExec.VMState;
            trigger["exception"]   = GetExceptionMessage(appExec.Exception);
            trigger["gasconsumed"] = new BigDecimal(appExec.GasConsumed, NativeContract.GAS.Decimals).ToString();
            try
            {
                trigger["stack"] = appExec.Stack.Select(q => q.ToJson()).ToArray();
            }
            catch (InvalidOperationException)
            {
                trigger["stack"] = "error: recursive reference";
            }
            trigger["notifications"] = appExec.Notifications.Select(q =>
            {
                JObject notification      = new JObject();
                notification["contract"]  = q.ScriptHash.ToString();
                notification["eventname"] = q.EventName;
                try
                {
                    notification["state"] = q.State.ToJson();
                }
                catch (InvalidOperationException)
                {
                    notification["state"] = "error: recursive reference";
                }
                return(notification);
            }).ToArray();

            txJson["executions"] = new List <JObject>()
            {
                trigger
            }.ToArray();
            return(txJson);
        }
コード例 #3
0
ファイル: BlockAnalyzer.cs プロジェクト: neo-ngd/Neo3-GUI
        private void ProcessTransfer(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec)
        {
            var transfer = notification.ConvertToTransfer(); // HasTransfer(notification, transaction);

            if (transfer == null)
            {
                return;
            }

            var asset = AssetCache.GetAssetInfo(transfer.Asset, _snapshot);

            if (asset == null)
            {
                return;
            }
            if (transfer.From != null)
            {
                Result.BalanceChangeAccounts.Add(new AccountAsset(transfer.From, transfer.Asset));
            }
            if (transfer.To != null)
            {
                Result.BalanceChangeAccounts.Add(new AccountAsset(transfer.To, transfer.Asset));
            }

            if (appExec.Trigger == TriggerType.Application)
            {
                var transferStorageItem = new TransferStorageItem()
                {
                    From    = transfer.From,
                    To      = transfer.To,
                    Asset   = transfer.Asset,
                    Amount  = transfer.Amount,
                    TxId    = appExec?.Transaction?.Hash,
                    Trigger = appExec.Trigger,
                };
                Result.Transfers.Add(transferStorageItem);
            }
        }
コード例 #4
0
        private static JObject Convert(Blockchain.ApplicationExecuted appExec)
        {
            JObject json = new JObject();

            json["txid"]       = appExec.Transaction.Hash.ToString();
            json["executions"] = appExec.ExecutionResults.Select(p =>
            {
                JObject execution         = new JObject();
                execution["trigger"]      = p.Trigger;
                execution["contract"]     = p.ScriptHash.ToString();
                execution["vmstate"]      = p.VMState;
                execution["gas_consumed"] = p.GasConsumed.ToString();
                try
                {
                    execution["stack"] = p.Stack.Select(q => q.ToParameter().ToJson()).ToArray();
                }
                catch (InvalidOperationException)
                {
                    execution["stack"] = "error: recursive reference";
                }
                execution["notifications"] = p.Notifications.Select(q =>
                {
                    JObject notification     = new JObject();
                    notification["contract"] = q.ScriptHash.ToString();
                    try
                    {
                        notification["state"] = q.State.ToParameter().ToJson();
                    }
                    catch (InvalidOperationException)
                    {
                        notification["state"] = "error: recursive reference";
                    }
                    return(notification);
                }).ToArray();
                return(execution);
            }).ToArray();
            return(json);
        }
コード例 #5
0
ファイル: BlockAnalyzer.cs プロジェクト: neo-ngd/Neo3-GUI
        private void ProcessDestory(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec)
        {
            if (notification.State.Count != 1)
            {
                return;
            }
            var contractHash = notification.State[0].GetByteSafely();

            if (contractHash == null || contractHash.Length != 20)
            {
                return;
            }

            var contract = new UInt160(contractHash);

            if (!Result.ContractChangeEvents.ContainsKey(appExec.Transaction.Hash))
            {
                Result.ContractChangeEvents[appExec.Transaction.Hash] = new List <ContractEventInfo>();
            }
            Result.ContractChangeEvents[appExec.Transaction.Hash].Add(new ContractEventInfo()
            {
                Contract = contract, Event = ContractEventType.Destroy
            });
        }
コード例 #6
0
ファイル: BlockAnalyzer.cs プロジェクト: neo-ngd/Neo3-GUI
        private void AnalysisAppExecuteResult(Blockchain.ApplicationExecuted appExec)
        {
            var         execResult  = new ExecuteResultInfo();
            Transaction transaction = appExec.Transaction;

            if (transaction != null)
            {
                //fee account
                Result.BalanceChangeAccounts.Add(new AccountAsset(transaction.Sender, NativeContract.GAS.Hash));
                execResult.TxId = transaction.Hash;
            }

            execResult.Trigger     = appExec.Trigger;
            execResult.VMState     = appExec.VMState;
            execResult.GasConsumed = appExec.GasConsumed;
            try
            {
                execResult.ResultStack = appExec.Stack.Select(q => q.ToContractParameter().ToJson()).ToArray();
            }
            catch (InvalidOperationException)
            {
                execResult.ResultStack = "error: recursive reference";
            }

            execResult.Notifications = appExec.Notifications.Select(n => n.ToNotificationInfo()).ToList();
            Result.ExecuteResultInfos.Add(execResult);

            foreach (var contract in execResult.Notifications.Select(n => n.Contract).Distinct())
            {
                var asset = AssetCache.GetAssetInfo(contract, _snapshot);
                if (asset != null)
                {
                    Result.AssetInfos[asset.Asset] = asset;
                }
            }

            if (execResult.VMState.HasFlag(VMState.FAULT))
            {
                //no need to track
                return;
            }

            if (execResult.Notifications.IsEmpty())
            {
                //no need to track
                return;
            }

            foreach (var notification in appExec.Notifications)
            {
                switch (notification.EventName)
                {
                case "transfer":
                case "Transfer":
                    ProcessTransfer(notification, appExec);
                    break;

                case "Deploy":
                    ProcessDeploy(notification, appExec);
                    break;

                case "Destory":
                    ProcessDestory(notification, appExec);
                    break;

                default:
                    break;
                }
            }
        }
コード例 #7
0
ファイル: BlockAnalyzer.cs プロジェクト: neo-ngd/Neo3-GUI
 private void ProcessUpdate(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec)
 {
 }