예제 #1
0
        void dapp_UpdateFuncUI(TabItem tabitem, DApp_Func func)
        {
            var sviewer = new ScrollViewer();

            tabitem.Content = sviewer;
            var canvas = new Canvas();

            sviewer.Content   = canvas;
            canvas.Background = null;

            var text = new TextBlock();

            text.Width  = 500;
            text.Height = 32;
            canvas.Children.Add(text);
            Canvas.SetLeft(text, 0);
            Canvas.SetTop(text, 0);
            text.Text       = func.desc;
            text.Foreground = white;

            var y = text.Height;

            foreach (var i in func.inputs)
            {
                var label = new TextBlock();
                label.Text   = i.desc;
                label.Width  = 200;
                label.Height = 32;
                canvas.Children.Add(label);
                Canvas.SetLeft(label, 0);
                Canvas.SetTop(label, y);

                if (i.type == "string" || i.type == "address" || i.type == "bytes" || i.type == "url")
                {
                    TextBox tbox = new TextBox();
                    tbox.Tag    = i;
                    tbox.Width  = 300;
                    tbox.Height = 20;
                    tbox.Text   = i.value;
                    canvas.Children.Add(tbox);
                    tbox.TextChanged += dapp_FuncValue_Text_Changed;
                    Canvas.SetLeft(tbox, 200);
                    Canvas.SetTop(tbox, y);
                    y += 20;
                }
                else
                {
                    TextBlock tbox = new TextBlock();
                    tbox.Tag    = i;
                    tbox.Width  = 300;
                    tbox.Height = 20;
                    tbox.Text   = "unknowntype:" + i.type;
                    canvas.Children.Add(tbox);
                    Canvas.SetLeft(tbox, 200);
                    Canvas.SetTop(tbox, y);
                    y += 20;
                }
            }
        }
예제 #2
0
        private void dapp_getStorage(DApp_Func func)
        {
            try
            {
                var json       = func.call.scriptparam;
                var scripthash = dapp_getCallParam(json[0].AsString());
                var key        = dapp_getCallParam(json[1].AsString());
                var result     = rpc_getStorage(scripthash, key);
                if (result == null)
                {
                    this.dapp_result_raw.Text = "(null)";
                }
                else
                {
                    this.dapp_result_raw.Text = result;
                }

                this.dapp_result.Text = "";
                if (func.results.Length > 0)
                {
                    var outvalue = "";
                    try
                    {
                        MyJson.JsonNode_Object item = new MyJson.JsonNode_Object();
                        item.SetDictValue("type", "ByteArray");
                        item.SetDictValue("value", result);
                        outvalue = dapp_getResultValue(func.results[0].type, item);
                    }
                    catch (Exception err)
                    {
                        outvalue = "err:" + err.Message;
                    }
                    this.dapp_result.Text += (func.results[0].desc + "=" + outvalue) + "\r\n";
                }
            }
            catch (Exception err)
            {
                this.dapp_result_raw.Text = "error=" + err.Message + "\r\n" + err.StackTrace;
            }
        }
예제 #3
0
        private void dapp_sendrawtransaction(DApp_Func func, bool onlyMakeTran = false)
        {
            try
            {
                dapp_result.Text     = "";
                dapp_result_raw.Text = "";
                //fill script
                if (string.IsNullOrEmpty(func.call.scriptcall))
                {
                    this.lastScript             = null;
                    this.tabCType.SelectedIndex = 0;
                    this.updateScript();
                    lastFee       = 0;
                    labelFee.Text = "Fee:" + lastFee;
                }
                else
                {
                    var hash   = dapp_getCallParam(func.call.scriptcall);
                    var scrb   = new ThinNeo.ScriptBuilder();
                    var jsonps = func.call.scriptparam;
                    for (var i = jsonps.Length - 1; i >= 0; i--)
                    {
                        dapp_EmitParam(scrb, jsonps[i]);
                    }
                    scrb.EmitAppCall(hash);
                    this.lastScript             = scrb.ToArray();
                    this.tabCType.SelectedIndex = 1;
                    this.updateScript();
                    lastFee       = (decimal)func.call.scriptfee;
                    labelFee.Text = "Fee:" + lastFee;
                }
                //fill input
                this.listInput.Items.Clear();
                foreach (var coin in func.call.coins)
                {
                    var hash  = dapp_getCallParam(coin.scripthash);
                    var value = coin.value;
                    tx_fillInputs(hash, coin.asset, value);
                }
                //fill output
                this.updateOutput();

                //生成交易,拼签名
                var tran = this.GenTran();
                if (tran == null)
                {
                    return;
                }
                this.lastTranMessage = tran.GetMessage();

                //处理鉴证
                foreach (var coin in func.call.witnesses)
                {
                    byte[]          vscript = dapp_getCallParam(coin.vscript);
                    var             hash    = ThinNeo.Helper.GetScriptHashFromScript(vscript);
                    var             addr    = ThinNeo.Helper.GetAddressFromScriptHash(hash);
                    ThinNeo.Witness wit     = null;
                    foreach (ThinNeo.Witness w in listWitness.Items)
                    {
                        if (w.Address == addr)
                        {
                            wit = w;
                            break;
                        }
                    }
                    if (wit == null)
                    {
                        wit = new ThinNeo.Witness();
                        wit.VerificationScript = vscript;
                        listWitness.Items.Add(wit);
                    }
                    ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
                    for (var i = coin.iscript.Length - 1; i >= 0; i--)
                    {
                        dapp_EmitParam(sb, coin.iscript[i]);
                    }
                    wit.InvocationScript = sb.ToArray();
                }
                if (onlyMakeTran)
                {
                    return;
                }
                var ttran = this.signAndBroadcast();
                if (tran != null)
                {
                    this.dapp_result_raw.Text = "sendtran:" + ThinNeo.Helper.Bytes2HexString(ttran.GetHash());
                }
            }
            catch (Exception err)
            {
                this.dapp_result_raw.Text = "error=" + err.Message + "\r\n" + err.StackTrace;
            }
        }
예제 #4
0
        private void dapp_invokeScript(DApp_Func func)
        {
            try
            {
                var hash   = dapp_getCallParam(func.call.scriptcall);
                var scrb   = new ThinNeo.ScriptBuilder();
                var jsonps = func.call.scriptparam;
                for (var i = jsonps.Length - 1; i >= 0; i--)
                {
                    dapp_EmitParam(scrb, jsonps[i]);
                }
                scrb.EmitAppCall(hash);


                var callstr = ThinNeo.Helper.Bytes2HexString(scrb.ToArray());
                var str     = WWW.MakeRpcUrl(labelApi.Text, "invokescript", new MyJson.JsonNode_ValueString(callstr));
                var result  = WWW.GetWithDialog(this, str);

                this.dapp_result.Text = "";


                if (result == null)
                {
                    this.dapp_result_raw.Text = "(null)";
                }
                else
                {
                    var json = MyJson.Parse(result).AsDict();
                    if (json.ContainsKey("error"))
                    {
                        this.dapp_result_raw.Text = json["error"].ToString();
                    }
                    else
                    {
                        StringBuilder sb = new StringBuilder();
                        //json["result"].AsDict().ConvertToStringWithFormat(sb, 4);
                        this.dapp_result_raw.Text = sb.ToString();
                        //var gas = json["result"].AsDict()["gas_consumed"].ToString();
                        //this.dapp_result.Items.Add("Fee:" + gas);
                        //var state = json["result"].AsDict()["state"].ToString();
                        //this.dapp_result.Items.Add("State:" + state);
                        var stack = json["result"].AsList()[0].AsDict()["stack"].AsList();
                        this.dapp_result.Text += ("StackCount=" + stack.Count) + "\r\n";
                        for (var i = 0; i < func.results.Length; i++)
                        {
                            var jsonresult = getJsonResult(stack, func.results[i].pos);
                            if (jsonresult == null)
                            {
                                this.dapp_result.Text += (func.results[i].desc + "=" + "<miss>") + "\r\n";
                            }
                            else
                            {
                                try
                                {
                                    var outvalue = dapp_getResultValue(func.results[i].type, jsonresult);
                                    this.dapp_result.Text += (func.results[i].desc + "=" + outvalue) + "\r\n";
                                }
                                catch
                                {
                                    this.dapp_result.Text += (func.results[i].desc + "=" + "<error>") + "\r\n";
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception err)
            {
                this.dapp_result_raw.Text = "error=" + err.Message + "\r\n" + err.StackTrace;
            }
        }