public JArray getnep5decimals(string nep5Hash)
        {
            //Console.WriteLine("assetid:" + nep5Hash);

            string script = null;

            using (var sb = new ThinNeo.ScriptBuilder())
            {
                ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep5Hash);

                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals"));
                sb.EmitAppCall(shash);

                var data = sb.ToArray();
                script = ThinNeo.Helper.Bytes2HexString(data);
            }
            var res = Rpc.invokescript(this.neoCliJsonRPCUrl, script).Result;
            var arr = res.GetDictItem("stack").AsList().ToArray();
            //Console.WriteLine("rpc info:"+ arr[0].ToString());
            var decimalString = arr[0].AsDict()["value"].AsString();
            int decimals      = int.Parse(decimalString);

            return(new JArray(new JObject()
            {
                { "value", decimals }
            }));
        }
Exemple #2
0
        static async void invokescript(string avmPath, string rpcurl)
        {
            //从文件中读取合约脚本
            byte[] script = System.IO.File.ReadAllBytes(avmPath); //这里填你的合约所在地址

            byte[] parameter__list = new byte[0];
            using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder())
            {
                //倒叙插入数据
                //sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply"));
                var nnc           = ThinNeo.Helper.GetScriptHashFromScript(script);
                var scriptaddress = new ThinNeo.Hash160(nnc);
                sb.EmitAppCall(scriptaddress);
                //sb.EmitPushBytes(script);
                //ThinNeo.Hash160 shash = new ThinNeo.Hash160(scripthash.Replace("0x", ""));
                //sb.EmitAppCall(script);//nep5脚本

                string scriptPublish = ThinNeo.Helper.Bytes2HexString(sb.ToArray());
                //用ivokescript试运行并得到消耗

                byte[] postdata;
                var    url    = Helper.MakeRpcUrlPost(rpcurl, "invokescript", out postdata, new MyJson.JsonNode_ValueString(scriptPublish));
                var    result = await Helper.HttpPost(url, postdata);

                Console.WriteLine("得到的结果是:" + result);
                var json = MyJson.Parse(result).AsDict()["result"].AsDict();
                printByteArray(json);
            }
        }
Exemple #3
0
        public JObject callContractForTest(string neoCliJsonRPCUrl, List <string> scripthashs, JArray paramsJA)
        {
            //string script = (string)getContractState(neoCliJsonRPCUrl, scripthash)["script"];
            int n = 0;

            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
            foreach (var scripthash in scripthashs)
            {
                var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList();

                var list = json.AsList();
                for (int i = list.Count - 1; i >= 0; i--)
                {
                    sb.EmitParamJson(list[i]);
                }

                var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray();
                sb.EmitAppCall(scripthashReverse);

                n++;
            }

            string scriptPlusParams = ThinNeo.Helper.Bytes2HexString(sb.ToArray());

            return(invokeScript(neoCliJsonRPCUrl, scriptPlusParams));
        }
Exemple #4
0
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            int need_storage = iStorage.IsChecked == true ? 1 : 0;
            int need_nep4    = iDyncall.IsChecked == true ? 2 : 0;
            int can_charge   = iCharge.IsChecked == true ? 4 : 0;

            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
            //倒叙插入数据
            var array = new MyJson.JsonNode_Array();

            array.AddArrayValue("(bytes)" + this.asmBinText.Text);
            array.AddArrayValue("(bytes)" + iPList.Text);
            array.AddArrayValue("(bytes)" + iRType.Text);
            array.AddArrayValue("(int)" + (need_storage | need_nep4 | can_charge));
            array.AddArrayValue("(str)" + iName.Text);                         //name
            array.AddArrayValue("(str)" + iVersion.Text);                      //version
            array.AddArrayValue("(str)" + iAuthor.Text);                       //author
            array.AddArrayValue("(str)" + iEmail.Text);                        //email
            array.AddArrayValue("(str)" + iDescription.Text);                  //desc
            sb.EmitParamJson(array);                                           //参数倒序入
            sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)upgrade")); //参数倒序入
            var shash = new ThinNeo.Hash160(iOldScHash.Text);;

            sb.EmitAppCall(shash);
            this.script       = sb.ToArray();
            this.DialogResult = true;
        }
Exemple #5
0
        void threadCheckTx()
        {
            while (true)
            {
                foreach (var item in mapTxState)
                {
                    var txid = item.Key;
                    var sb   = new ThinNeo.ScriptBuilder();

                    MyJson.JsonNode_Array array = new MyJson.JsonNode_Array();

                    array.AddArrayValue("(hex256)" + txid);
                    //array.AddArrayValue(new MyJson.JsonNode_Array());
                    sb.EmitParamJson(array);
                    sb.EmitPushString("getcallstate");
                    ThinNeo.Hash160 contractaddr = new ThinNeo.Hash160("0x24192c2a72e0ce8d069232f345aea4db032faf72");
                    sb.EmitAppCall(contractaddr);
                    var script = sb.ToArray();
                    var result = CallScript(script);
                    if (!string.IsNullOrEmpty(result[0]["value"].ToString()))
                    {
                        item.Value.state = (int)result[0]["value"][0]["value"];
                    }
                }
                System.Threading.Thread.Sleep(1000);
            }
        }
Exemple #6
0
        public JObject callContractForTestMulti(string neoCliJsonRPCUrl, List <string> scripthashs, JArray paramsJA)
        {
            JObject res       = new JObject();
            JArray  stackList = new JArray();
            int     n         = 0;

            foreach (var scripthash in scripthashs)
            {
                ThinNeo.ScriptBuilder tmpSb = new ThinNeo.ScriptBuilder();
                httpHelper            hh    = new httpHelper();
                var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList();
                var list = json.AsList();
                for (int i = list.Count - 1; i >= 0; i--)
                {
                    tmpSb.EmitParamJson(list[i]);
                }

                var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray();
                tmpSb.EmitAppCall(scripthashReverse);
                string  invokeSc = ThinNeo.Helper.Bytes2HexString(tmpSb.ToArray());
                JObject invokeRs = invokeScript(neoCliJsonRPCUrl, invokeSc);

                /**
                 * JObject 不能存放相同字段,为将其与其他接口调用区分开来,现单端改名为-Multi结尾的方法
                 */
                /*
                 * res.Add("script", invokeRs["script"]);
                 * res.Add("state", invokeRs["state"]);
                 * res.Add("gas_consumed", invokeRs["gas_consumed"]);
                 */

                JObject stack1 = null;
                if (invokeRs == null)
                {
                    stack1 = new JObject();
                    stack1.Add("type", "FAULT");
                    stack1.Add("value", "");
                    stackList.Add(stack1);
                    continue;
                }
                string state = invokeRs["state"].ToString();
                JArray stack = (JArray)invokeRs["stack"];
                if (state.StartsWith("FAULT"))
                {
                    // 调用合约出错,填充占位
                    stack1 = new JObject();
                    stack1.Add("type", "FAULT");
                    stack1.Add("value", "");
                }
                else
                {
                    stack1 = (JObject)stack[0];
                }
                stack1["hash"] = scripthash;
                stackList.Add(stack1);
            }

            res.Add("stack", stackList);
            return(res);
        }
Exemple #7
0
 void dapp_EmitParam(ThinNeo.ScriptBuilder sb, MyJson.IJsonNode param)
 {
     if (param is MyJson.JsonNode_ValueNumber)//bool 或小整数
     {
         sb.EmitParamJson(param);
     }
     else if (param is MyJson.JsonNode_Array)
     {
         var list = param.AsList();
         for (var i = list.Count - 1; i >= 0; i--)
         {
             dapp_EmitParam(sb, list[i]);
         }
         sb.EmitPushNumber(param.AsList().Count);
         sb.Emit(ThinNeo.VM.OpCode.PACK);
     }
     else if (param is MyJson.JsonNode_ValueString)//复杂格式
     {
         var str   = param.AsString();
         var bytes = dapp_getCallParam(str);
         sb.EmitPushBytes(bytes);
     }
     else
     {
         throw new Exception("should not pass a {}");
     }
 }
Exemple #8
0
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
            sb.EmitPushString(iDescription.Text);
            sb.EmitPushString(iEmail.Text);
            sb.EmitPushString(iAuthor.Text);
            sb.EmitPushString(iVersion.Text);
            sb.EmitPushString(iName.Text);
            int need_storage = iStorage.IsChecked == true ? 1 : 0;
            int need_nep4    = iDyncall.IsChecked == true ? 2 : 0;

            sb.EmitPushNumber(need_storage | need_nep4);
            var br = ThinNeo.Helper.HexString2Bytes(iRType.Text);
            var bp = ThinNeo.Helper.HexString2Bytes(iPList.Text);

            sb.EmitPushBytes(br);
            sb.EmitPushBytes(bp);
            var _ss = ThinNeo.Helper.HexString2Bytes(this.asmBinText.Text);

            sb.EmitPushBytes(_ss);

            sb.EmitSysCall("Neo.Contract.Create");

            //sb.EmitSysCall("Neo.Contract.Create", script, parameter_list, return_type, need_storage | need_nep4, name, version, author, email, description);
            this.script = sb.ToArray();

            this.DialogResult = true;
        }
        //增加个人账户见证人(就是用这个人的私钥对交易签个名,signdata传进来)
        public void AddWitness(byte[] signdata, byte[] pubkey, string addrs)
        {
            {//额外的验证
                byte[] msg = null;
                using (var ms = new System.IO.MemoryStream())
                {
                    SerializeUnsigned(ms);
                    msg = ms.ToArray();
                }
                bool bsign = ThinNeo.Helper.VerifySignature(msg, signdata, pubkey);
                if (bsign == false)
                {
                    throw new Exception("wrong sign");
                }

                var addr = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);
                if (addr != addrs)
                {
                    throw new Exception("wrong script");
                }
            }

            var vscript = ThinNeo.Helper.GetScriptFromPublicKey(pubkey);

            //iscript 对个人账户见证人他是一条pushbytes 指令

            var sb = new ThinNeo.ScriptBuilder();

            sb.EmitPushBytes(signdata);

            var iscript = sb.ToArray();

            AddWitnessScript(vscript, iscript);
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            try
            {
                this.asmList.Items.Clear();

                var json = MyJson.Parse(jsonParam.Text).AsList();
                jsonParam.Foreground = new SolidColorBrush(Color.FromRgb(0, 0, 0));
                ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
                var list = json.AsList();
                for (int i = list.Count - 1; i >= 0; i--)
                {
                    sb.EmitParamJson(list[i]);
                }
                var scripthash = ThinNeo.Helper.HexString2Bytes(textScriptHash.Text).Reverse().ToArray();
                sb.EmitAppCall(scripthash);
                this.script = sb.ToArray();
                var ops = ThinNeo.Compiler.Avm2Asm.Trans(this.script);
                for (int i = 0; i < ops.Length; i++)
                {
                    this.asmList.Items.Add(ops[i]);
                }
                this.asmBinText.Text = ThinNeo.Helper.Bytes2HexString(sb.ToArray());
            }
            catch
            {
                jsonParam.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0));
            }
        }
Exemple #11
0
        //async public static Task<MyJson.JsonNode_Object> callcontractfortest(string url,string method)
        //{
        //    var gstr = MakeRpcUrlPost("getfullloginfo", txid);
        //    try
        //    {
        //        var str = await postData(url, gstr);
        //        var json = MyJson.Parse(str);
        //        var result = json.AsDict().GetDictItem("result") as MyJson.JsonNode_Object;
        //        return result;
        //    }
        //    catch (Exception err)
        //    {
        //        var errorMsg = "failed to call contract for test.Info:" + err.ToString();
        //        Console.WriteLine(errorMsg);
        //        Log.WriteLog(errorMsg);
        //        return null;
        //    }
        //}
        async public static Task <MyJson.JsonNode_Object> invokescript(string url, string scripthash, string method)
        {
            var sb = new ThinNeo.ScriptBuilder();

            ThinNeo.Hash160 shash = new ThinNeo.Hash160(scripthash);
            sb.EmitParamJson(new MyJson.JsonNode_Array());
            sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)" + method)); //调用的方法
            sb.EmitAppCall(shash);                                               //nep5脚本

            var data   = sb.ToArray();
            var script = ThinNeo.Helper.Bytes2HexString(data);

            var urldata = MakeRpcUrlPost("invokescript", script);

            try
            {
                var str = await postData(url, urldata);

                var json = MyJson.Parse(str);
                if (json.AsDict().ContainsKey("error"))
                {
                    return(json.AsDict()["error"] as MyJson.JsonNode_Object);
                }
                var result = json.AsDict().GetDictItem("result") as MyJson.JsonNode_Object;
                return(result);
            }
            catch (Exception err)
            {
                var errorMsg = "failed to invokescript method:" + method + ".Info:" + err.ToString();
                Console.WriteLine(errorMsg);
                return(null);
            }
        }
        public void NeoTransfer()
        {
            byte[] prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif);
            var    pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            var    address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);

            using (var sb = new ThinNeo.ScriptBuilder())
            {
                var array = new MyJson.JsonNode_Array();
                array.AddArrayValue("(addr)" + from);
                array.AddArrayValue("(addr)" + "AMjCDmrbfcBxGPitHcdrUYRyPXD7DfC52c");//NeoBank address   AMjCDmrbfcBxGPitHcdrUYRyPXD7DfC52c
                array.AddArrayValue("(int)" + value);
                byte[] randomBytes = new byte[32];
                using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
                {
                    rng.GetBytes(randomBytes);
                }
                BigInteger randomNum = new BigInteger(randomBytes);
                sb.EmitPushNumber(randomNum);
                sb.Emit(ThinNeo.VM.OpCode.DROP);
                sb.EmitParamJson(array);                                                   //参数倒序入
                sb.EmitPushString("transfer");                                             //参数倒序入
                sb.EmitAppCall(new Hash160("0x04e31cee0443bb916534dad2adf508458920e66d")); //nep5脚本
                script = sb.ToArray();
            }

            ThinNeo.Transaction tran = new Transaction();
            tran.inputs              = new ThinNeo.TransactionInput[0];
            tran.outputs             = new TransactionOutput[0];
            tran.attributes          = new ThinNeo.Attribute[1];
            tran.attributes[0]       = new ThinNeo.Attribute();
            tran.attributes[0].usage = TransactionAttributeUsage.Script;
            tran.attributes[0].data  = ThinNeo.Helper.GetPublicKeyHashFromAddress(address);
            tran.version             = 1;
            tran.type = ThinNeo.TransactionType.InvocationTransaction;

            var idata = new ThinNeo.InvokeTransData();

            tran.extdata = idata;
            idata.script = script;
            idata.gas    = 0;

            byte[] msg    = tran.GetMessage();
            string msgstr = ThinNeo.Helper.Bytes2HexString(msg);

            byte[] signdata = ThinNeo.Helper.Sign(msg, prikey);
            tran.AddWitness(signdata, pubkey, address);
            string txid = tran.GetHash().ToString();

            byte[] data    = tran.GetRawData();
            string rawdata = ThinNeo.Helper.Bytes2HexString(data);

            byte[] postdata;
            var    url    = MakeRpcUrlPost(NeoRpcUrl, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(rawdata));
            var    result = HttpPost(url, postdata);

            Console.WriteLine(result + " txid: " + txid);
            return(result);
        }
Exemple #13
0
        static async void DelContract(string avmPath, string strurl, string rpcurl, string assetId, string wif, string change_address)
        {
            byte[] prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif);
            byte[] pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);
            Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(strurl, address);

            //从文件中读取合约脚本
            byte[] script = System.IO.File.ReadAllBytes(avmPath); //这里填你的合约所在地址
            //Console.WriteLine("合约脚本:"+ThinNeo.Helper.Bytes2HexString(script));
            Console.WriteLine("合约脚本hash:" + ThinNeo.Helper.GetScriptHashFromScript(script));


            using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder())
            {
                //倒叙插入数据
                sb.EmitPushBytes(script);
                sb.EmitSysCall("Neo.Contract.Destroy");

                string scriptPublish = ThinNeo.Helper.Bytes2HexString(sb.ToArray());
                //用ivokescript试运行并得到消耗

                byte[] postdata;
                var    url    = Helper.MakeRpcUrlPost(rpcurl, "invokescript", out postdata, new MyJson.JsonNode_ValueString(scriptPublish));
                var    result = await Helper.HttpPost(url, postdata);

                //string result = http.Post(api, "invokescript", new MyJson.JsonNode_Array() { new MyJson.JsonNode_ValueString(scriptPublish) },Encoding.UTF8);
                var     resultObj               = MyJson.Parse(result) as MyJson.JsonNode_Object;
                var     consume                 = resultObj["result"].AsDict()["gas_consumed"].ToString();
                decimal gas_consumed            = decimal.Parse(consume);
                ThinNeo.InvokeTransData extdata = new ThinNeo.InvokeTransData();
                extdata.script = sb.ToArray();

                //Console.WriteLine(ThinNeo.Helper.Bytes2HexString(extdata.script));
                extdata.gas = (gas_consumed >= 10) ? Math.Ceiling(gas_consumed - 10) : gas_consumed;

                //拼装交易体
                ThinNeo.Transaction tran = makeTran(dir, null, new ThinNeo.Hash256(assetId), extdata.gas, change_address);
                tran.version = 1;
                tran.extdata = extdata;
                tran.type    = ThinNeo.TransactionType.InvocationTransaction;
                byte[] msg      = tran.GetMessage();
                byte[] signdata = ThinNeo.Helper.Sign(msg, prikey);
                tran.AddWitness(signdata, pubkey, address);
                string txid    = tran.GetHash().ToString();
                byte[] data    = tran.GetRawData();
                string rawdata = ThinNeo.Helper.Bytes2HexString(data);

                //Console.WriteLine("scripthash:"+scripthash);

                url    = Helper.MakeRpcUrlPost(rpcurl, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(rawdata));
                result = await Helper.HttpPost(url, postdata);

                MyJson.JsonNode_Object resJO = (MyJson.JsonNode_Object)MyJson.Parse(result);
                Console.WriteLine(resJO.ToString());
            }
        }
Exemple #14
0
        //private void updateHasSendGas(string mongodbConnStr, string mongodbDatabase, string addr, decimal gas)
        //{
        //    string findFliter = "{addr:" + addr + "}";
        //    JArray array = mh.GetData(mongodbConnStr, mongodbDatabase, "HasSendGas", findFliter);
        //    JObject ob = new JObject();
        //    if (array.Count > 0)
        //    {
        //        ob = (JObject)array[0];
        //        decimal remainGas = (decimal)ob["gas"];
        //        if (remainGas >= 0)
        //        {

        //        }
        //    }
        //}

        public JObject claimContract(string mongodbConnStr, string mongodbDatabase, string conAddr, string addrClaim, string url, string hash)
        {
            JObject claimGas = getClaimGas(mongodbConnStr, mongodbDatabase, conAddr, true);

            string unsignHexTx = tx.getClaimTxHex(addrClaim, claimGas);

            byte[] txScript = unsignHexTx.HexString2Bytes();

            ThinNeo.Transaction claimTran = new ThinNeo.Transaction();
            claimTran.Deserialize(new MemoryStream(txScript));

            JObject contract = ct.getContractState(url, hash);

            //做智能合约的签名
            byte[] iscript = null;
            using (var sb = new ThinNeo.ScriptBuilder())
            {
                sb.EmitPushString("whatever");
                sb.EmitPushNumber(250);
                iscript = sb.ToArray();
            }
            byte[] conbytes = ThinNeo.Debug.DebugTool.HexString2Bytes((string)contract["script"]);
            claimTran.AddWitnessScript(conbytes, iscript);

            var trandata    = claimTran.GetRawData();
            var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata);

            JObject result = tx.sendrawtransaction(url, strtrandata);
            bool    re     = (bool)result["sendrawtransactionresult"];

            Console.WriteLine("得到的结果是:" + re);
            if (re)
            {
                Console.WriteLine("txid:" + (string)result["txid"]);
                try
                {
                    //处理提取后的utxo,记录每笔utxo原始账户信息
                    new Thread(o =>
                    {
                        proClaimData(mongodbConnStr, mongodbDatabase, claimGas);
                    })
                    {
                        IsBackground = true
                    }
                    .Start();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }
            else
            {
                Console.WriteLine("errorMessage:" + (string)result["errorMessage"]);
            }
            return(result);
        }
Exemple #15
0
        static async void nep53(string strurl, string rpcurl, string avmPath, string wif, string toaddr, string asset)
        {
            //从文件中读取合约脚本
            byte[] script = System.IO.File.ReadAllBytes(avmPath); //这里填你的合约所在地址
            var    nnc    = ThinNeo.Helper.GetScriptHashFromScript(script);

            byte[] prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif);
            byte[] pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);
            //获取地址的资产列表
            Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(strurl, address);


            string targeraddr = address;  //Transfer it to yourself.

            ThinNeo.Transaction tran = Helper.makeTran(dir[asset], targeraddr, new ThinNeo.Hash256(asset), decimal.Zero);
            tran.type = ThinNeo.TransactionType.InvocationTransaction;

            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();

            var scriptaddress = new ThinNeo.Hash160(nnc);

            //Parameter inversion
            MyJson.JsonNode_Array JAParams = new MyJson.JsonNode_Array();
            JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + address));
            JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + toaddr));
            JAParams.Add(new MyJson.JsonNode_ValueString("(integer)" + 1));
            sb.EmitParamJson(JAParams);    //Parameter list
            sb.EmitPushString("transfer"); //Method
            sb.EmitAppCall(scriptaddress); //Asset contract

            ThinNeo.InvokeTransData extdata = new ThinNeo.InvokeTransData();
            extdata.script = sb.ToArray();
            extdata.gas    = 1;
            tran.extdata   = extdata;

            byte[] msg      = tran.GetMessage();
            byte[] signdata = ThinNeo.Helper.Sign(msg, prikey);
            tran.AddWitness(signdata, pubkey, address);
            string txid = tran.GetHash().ToString();

            byte[] data    = tran.GetRawData();
            string rawdata = ThinNeo.Helper.Bytes2HexString(data);


            byte[] postdata;
            var    url      = Helper.MakeRpcUrlPost(rpcurl, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(rawdata));
            var    response = await Helper.HttpPost(url, postdata);

            MyJson.JsonNode_Object resJO = (MyJson.JsonNode_Object)MyJson.Parse(response);
            if (resJO.ContainsKey("result"))
            {
                Console.WriteLine(resJO["result"].ToString());
            }
        }
Exemple #16
0
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var prikey     = ThinNeo.Helper.GetPrivateKeyFromWIF("");
            var pubkey     = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            var scripthash = ThinNeo.Helper.GetScriptHashFromPublicKey(pubkey);
            var addres     = ThinNeo.Helper.GetAddressFromScriptHash(scripthash);

            //AbN2K2trYzgx8WMg2H7U7JHH6RQVzz2fnx
            var vscripthash = ThinNeo.Helper.GetPublicKeyHashFromAddress("AdsNmzKPPG7HfmQpacZ4ixbv9XJHJs2ACz");

            ThinNeo.Transaction tx = new ThinNeo.Transaction();
            tx.inputs  = new ThinNeo.TransactionInput[0];
            tx.outputs = new ThinNeo.TransactionOutput[0];
            tx.type    = ThinNeo.TransactionType.InvocationTransaction;
            tx.version = 1;
            //附加一个见证人  ///要他签名
            tx.attributes          = new ThinNeo.Attribute[1];
            tx.attributes[0]       = new ThinNeo.Attribute();
            tx.attributes[0].usage = ThinNeo.TransactionAttributeUsage.Script;
            tx.attributes[0].data  = scripthash;

            //拼接调用脚本
            var invokedata = new ThinNeo.InvokeTransData();

            tx.extdata     = invokedata;
            invokedata.gas = 0;
            var sb = new ThinNeo.ScriptBuilder();

            MyJson.JsonNode_Array array = new MyJson.JsonNode_Array();
            array.AddArrayValue("(hex160)" + scripthash.ToString());  //witnesscall
            array.AddArrayValue("(hex160)" + vscripthash.ToString()); //witnessreturn
            array.AddArrayValue("(str)" + vscripthash.ToString());    //callscript
            array.AddArrayValue("(str)" + methodCombox.Text);         //callmethod
            var _params = new MyJson.JsonNode_Array();

            _params.AddArrayValue(int.Parse(textbox1.Text));
            _params.AddArrayValue(int.Parse(textbox2.Text));
            array.Add(_params);//params
            _params.AddArrayValue("(int)" + r.Next());

            sb.EmitParamJson(array);
            sb.EmitPushString("outcall");
            ThinNeo.Hash160 contractaddr = new ThinNeo.Hash160("0x24192c2a72e0ce8d069232f345aea4db032faf72");
            sb.EmitAppCall(contractaddr);
            invokedata.script = sb.ToArray();

            //签名(谁签名)
            var msg  = tx.GetMessage();
            var data = ThinNeo.Helper.Sign(msg, prikey);

            tx.AddWitness(data, pubkey, addres);

            DoCallTran(tx);
            //CallScript(invokedata.script);
        }
Exemple #17
0
        static async void nep52(string rpcurl, string avmPath, string address)
        {
            //从文件中读取合约脚本
            byte[] script = System.IO.File.ReadAllBytes(avmPath); //这里填你的合约所在地址
            //string nnc = "0x460b89c3c8d31528b9e90d9baff9de31f6ddb6c6".Replace("0x", "");
            string scripthash = null;

            using (var sb = new ThinNeo.ScriptBuilder())
            {
                sb.EmitParamJson(new MyJson.JsonNode_Array());                  //参数倒序入
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)name")); //参数倒序入
                //ThinNeo.Hash160 shash = new ThinNeo.Hash160(nnc);
                var shash = ThinNeo.Helper.GetScriptHashFromScript(script);
                sb.EmitAppCall(shash);//nep5脚本

                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)symbol"));
                sb.EmitAppCall(shash);

                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals"));
                sb.EmitAppCall(shash);

                //sb.EmitParamJson(new MyJson.JsonNode_Array());
                //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply"));
                //sb.EmitAppCall(shash);

                //var array = new MyJson.JsonNode_Array();
                //array.AddArrayValue("(addr)" + address);//from
                //sb.EmitParamJson(array);//参数倒序入
                //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)balanceOf"));//参数倒序入
                //sb.EmitAppCall(shash);

                var data = sb.ToArray();
                scripthash = ThinNeo.Helper.Bytes2HexString(data);
            }

            //var url = Helper.MakeRpcUrl(api, "invokescript", new MyJson.JsonNode_ValueString(script));
            //string result = await Helper.HttpGet(url);

            byte[] postdata;
            var    url    = Helper.MakeRpcUrlPost(rpcurl, "invokescript", out postdata, new MyJson.JsonNode_ValueString(scripthash));
            var    result = await Helper.HttpPost(url, postdata);


            Console.WriteLine("得到的结果是:" + result);
            var continer = MyJson.Parse(result).AsDict();

            if (continer.ContainsKey("result"))
            {
                var json = continer["result"].AsDict();
                printByteArray(json);
            }
        }
        ThinNeo.Transaction signAndBroadcast()
        {
            ThinNeo.Transaction trans = GenTran();
            if (trans == null)
            {
                return(null);
            }

            var msg = trans.GetMessage();

            trans.witnesses = new ThinNeo.Witness[this.listWitness.Items.Count];
            //检查签名
            for (var i = 0; i < listWitness.Items.Count; i++)
            {
                var item    = listWitness.Items[i] as ThinNeo.Witness;
                var witness = new ThinNeo.Witness();
                witness.VerificationScript = item.VerificationScript;
                witness.InvocationScript   = item.InvocationScript;
                //autoresign
                {
                    var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(this.privatekey);
                    var addr   = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);
                    if (item.Address == addr)
                    {
                        var signdata = ThinNeo.Helper.Sign(msg, this.privatekey);
                        var sb       = new ThinNeo.ScriptBuilder();
                        sb.EmitPushBytes(signdata);
                        witness.InvocationScript = sb.ToArray();
                    }
                }
                trans.witnesses[i] = witness;
            }

            var  rawdata = trans.GetRawData();
            bool b       = rpc_SendRaw(rawdata);

            if (b)
            {
                var str = Tools.CoinTool.RecordTran(trans);
                this.UpdateTranData();

                Tools.CoinTool.SaveRecord();
                MessageBox.Show("txid=" + str);
                ClearTran();
                return(trans);
            }
            else
            {
                MessageBox.Show("transaction error");
                ClearTran();
                return(null);
            }
        }
Exemple #19
0
        async public Task Demo()
        {
            string nnc = "0x3fccdb91c9bb66ef2446010796feb6ca4ed96b05";

            byte[] prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF("L3tDHnEAvwnnPE4sY4oXpTvNtNhsVhbkY4gmEmWmWWf1ebJhVPVW");
            byte[] pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);
            string toaddr  = "APwCdakS1NpJsiq6j9SfvkQFS9ubt347a2";
            string id_GAS  = "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7";

            //获取地址的资产列表
            Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(api, address);


            string targeraddr = address;  //Transfer it to yourself.

            ThinNeo.Transaction tran = Helper.makeTran(dir[id_GAS], targeraddr, new ThinNeo.Hash256(id_GAS), decimal.Zero);
            tran.type = ThinNeo.TransactionType.InvocationTransaction;

            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();

            var scriptaddress = new ThinNeo.Hash160(nnc);

            //Parameter inversion
            MyJson.JsonNode_Array JAParams = new MyJson.JsonNode_Array();
            JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + address));
            JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + toaddr));
            JAParams.Add(new MyJson.JsonNode_ValueString("(integer)" + 1));
            sb.EmitParamJson(JAParams);    //Parameter list
            sb.EmitPushString("transfer"); //Method
            sb.EmitAppCall(scriptaddress); //Asset contract

            ThinNeo.InvokeTransData extdata = new ThinNeo.InvokeTransData();
            extdata.script = sb.ToArray();
            extdata.gas    = 1;
            tran.extdata   = extdata;

            byte[] msg      = tran.GetMessage();
            byte[] signdata = ThinNeo.Helper.Sign(msg, prikey);
            tran.AddWitness(signdata, pubkey, address);
            string txid = tran.GetHash().ToString();

            byte[] data       = tran.GetRawData();
            string scripthash = ThinNeo.Helper.Bytes2HexString(data);

            string response = await Helper.HttpGet(api + "?method=sendrawtransaction&id=1&params=[\"" + scripthash + "\"]");

            MyJson.JsonNode_Object resJO = (MyJson.JsonNode_Object)MyJson.Parse(response);
            Console.WriteLine(resJO["result"].ToString());
        }
Exemple #20
0
        public void FillRaw()
        {
            this.txraw.witnesses = new ThinNeo.Witness[keyinfos.Count];
            List <KeyInfo> keys = new List <KeyInfo>();

            foreach (var key in keyinfos)
            {
                keys.Add(key.Value);
            }
            //keys 這個需要排序
            for (var i = 0; i < keys.Count; i++)
            {
                this.txraw.witnesses[i] = new ThinNeo.Witness();
                if (keys[i].type == KeyType.Simple)
                {
                    //算出vscript
                    this.txraw.witnesses[i].VerificationScript = ThinNeo.Helper.GetScriptFromPublicKey(keys[i].pubkey);
                    using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder())
                    {
                        sb.EmitPushBytes(keys[i].signdata[0]);
                        this.txraw.witnesses[i].InvocationScript = sb.ToArray();
                    }
                }
                if (keys[i].type == KeyType.MultiSign)
                {
                    //算出vscript
                    this.txraw.witnesses[i].VerificationScript = keys[i].MultiSignKey.GetMultiContract();
                    List <byte[]> signs = new List <byte[]>();
                    foreach (var s in keys[i].signdata)
                    {
                        if (s != null && s.Length > 0)
                        {
                            signs.Add(s);
                        }
                    }
                    //?這個signs 要不要倒序?试一试
                    using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder())
                    {
                        for (var iss = 0; iss < keys[i].MultiSignKey.MKey_NeedCount; iss++)
                        {
                            sb.EmitPushBytes(signs[iss]);
                        }
                        this.txraw.witnesses[i].InvocationScript = sb.ToArray();
                    }
                }
            }
        }
Exemple #21
0
        public JObject publishContractForTest(string neoCliJsonRPCUrl, string avmHexstring, JObject infoJ)
        {
            string cName            = (string)infoJ["cName"];
            string cVersion         = (string)infoJ["cVersion"];
            string cAuthor          = (string)infoJ["cAuthor"];
            string cEmail           = (string)infoJ["cEmail"];
            string cDescription     = (string)infoJ["cDescription"];
            bool   iStorage         = (bool)infoJ["iStorage"];
            bool   iDyncall         = (bool)infoJ["iDyncall"];
            string inputParamsType  = (string)infoJ["inputParamsType"];
            string outputParamsType = (string)infoJ["outputParamsType"];

            //实例化脚本构造器
            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
            //加入合约基本信息
            sb.EmitPushString(cDescription);
            sb.EmitPushString(cEmail);
            sb.EmitPushString(cAuthor);
            sb.EmitPushString(cVersion);
            sb.EmitPushString(cName);

            //加入是否需要私有存储区、是否需要动态合约调用信息
            int need_storage = iStorage == true ? 1 : 0;
            int need_nep4    = iDyncall == true ? 2 : 0;

            sb.EmitPushNumber(need_storage | need_nep4);//二进制或操作

            //加入输入输出参数类型信息
            var outputType = ThinNeo.Helper.HexString2Bytes(outputParamsType);
            var inputType  = ThinNeo.Helper.HexString2Bytes(inputParamsType);

            sb.EmitPushBytes(outputType);
            sb.EmitPushBytes(inputType);

            //加入合约编译后二进制码
            var contractScript = ThinNeo.Helper.HexString2Bytes(avmHexstring);

            sb.EmitPushBytes(contractScript);

            sb.EmitSysCall("Neo.Contract.Create");

            string scriptPublish = ThinNeo.Helper.Bytes2HexString(sb.ToArray());

            //调用cli RPC 用neoVM试运行,并获得费用估算
            return(invokeScript(neoCliJsonRPCUrl, scriptPublish));
        }
Exemple #22
0
        decimal rpc_getNep5Balance(string nep5asset)
        {
            //make callscript
            var pubkey     = ThinNeo.Helper.GetPublicKeyFromPrivateKey(this.privatekey);
            var pubkeyhash = ThinNeo.Helper.GetScriptHashFromPublicKey(pubkey);

            var asset = ThinNeo.Helper.HexString2Bytes(nep5asset);

            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
            sb.EmitPushBytes(pubkeyhash);
            sb.EmitPushNumber(1);
            sb.Emit(ThinNeo.VM.OpCode.PACK);
            sb.EmitPushString("balanceOf"); //name//totalSupply//symbol//decimals
            sb.EmitAppCall(asset.Reverse().ToArray());

            var nep5 = Tools.CoinTool.assetNep5[nep5asset];

            var symbol    = ThinNeo.Helper.Bytes2HexString(sb.ToArray());
            var str       = WWW.MakeRpcUrl(labelRPC.Text, "invokescript", new MyJson.JsonNode_ValueString(symbol));
            var resultstr = WWW.GetWithDialog(this, str);
            var json      = MyJson.Parse(resultstr).AsDict()["result"].AsDict();

            if (json["state"].AsString().Contains("HALT") == false)
            {
                throw new Exception("error state");
            }
            var     value    = json["stack"].AsList()[0].AsDict();
            decimal outvalue = 0;

            if (value["type"].AsString() == "Integer")
            {
                outvalue = decimal.Parse(value["value"].AsString());
            }
            else
            {
                var bts = ThinNeo.Helper.HexString2Bytes(value["value"].AsString());
                var bi  = new System.Numerics.BigInteger(bts);
                outvalue = (decimal)bi;
            }
            for (var i = 0; i < nep5.decimals; i++)
            {
                outvalue /= 10;
            }
            return(outvalue);
        }
Exemple #23
0
 public byte[] GetMultiContract()
 {
     if (!(1 <= this.MKey_NeedCount && MKey_NeedCount <= MKey_Pubkeys.Count && MKey_Pubkeys.Count <= 1024))
     {
         throw new ArgumentException();
     }
     using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder())
     {
         sb.EmitPushNumber(MKey_NeedCount);
         foreach (var pkey in this.MKey_Pubkeys)
         {
             sb.EmitPushBytes(pkey);
         }
         sb.EmitPushNumber(MKey_Pubkeys.Count);
         sb.Emit(ThinNeo.VM.OpCode.CHECKMULTISIG);
         return(sb.ToArray());
     }
 }
        string getInvokescript()
        {
            var shash = nnc_shash;
            var sb    = new ThinNeo.ScriptBuilder();

            sb.EmitParamJson(MyJson.Parse("[]"));
            sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)" + decimals));
            sb.EmitAppCall(shash);


            //sb.EmitParamJson(MyJson.Parse("[]"));
            //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)symbol"));
            //sb.EmitAppCall(shash);

            //sb.EmitParamJson(MyJson.Parse("[]"));
            //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals"));
            //sb.EmitAppCall(shash);

            //sb.EmitParamJson(MyJson.Parse("[]"));
            //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply"));
            //sb.EmitAppCall(shash);

            var data = sb.ToArray();

            //合约
            var script = ThinNeo.Helper.Bytes2HexString(data);

            var str = "{\"jsonrpc\":\"2.0\",\"method\":\"invokescript\",\"id\":1,\"params\":[\"" + script + "\"]}";

            WebClient wc = new WebClient();

            byte[] sendData = Encoding.GetEncoding("UTF-8").GetBytes(MyJson.Parse(str).ToString());
            wc.Headers.Add("Content-Type", "application/json");

            byte[] recData = wc.UploadData("http://localhost:20332/", "POST", sendData);
            var    info    = Encoding.GetEncoding("UTF-8").GetString(recData);
            var    json    = MyJson.Parse(info) as MyJson.JsonNode_Object;

            //var stack = json.GetDictItem("result").GetDictItem("stack");
            //string byte1 = stack.GetArrayItem(0).GetDictItem("value").ToString();
            //byte1 = Encoding.UTF8.GetString(ThinNeo.Helper.HexString2Bytes(byte1));
            return(json.ToString());
        }
        public JArray getAddressNep5Asset(string address, string nep5Hash)
        {
            string script = null;

            using (var sb = new ThinNeo.ScriptBuilder())
            {
                ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep5Hash);

                MyJson.JsonNode_Array JAParams = new MyJson.JsonNode_Array();
                JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + address));
                sb.EmitParamJson(JAParams);
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)balanceOf"));
                sb.EmitAppCall(shash);

                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals"));
                sb.EmitAppCall(shash);

                var data = sb.ToArray();
                script = ThinNeo.Helper.Bytes2HexString(data);
            }
            var res         = Rpc.invokescript(this.neoCliJsonRPCUrl, script).Result;
            var arr         = res.GetDictItem("stack").AsList().ToArray();
            var valueString = arr[0].AsDict()["value"].AsString();

            var decimalString = arr[1].AsDict()["value"].AsString();
            int decimals      = int.Parse(decimalString);
            //-----------精度
            //string findStr = "{{assetid:'{0}'}}";
            //findStr = string.Format(findStr, nep5Hash);
            //JArray utxoArr=mh.GetData(Block_mongodbConnStr, Block_mongodbDatabase, "NEP5asset", findStr);
            //int decimals=(int)((JObject)utxoArr[0])["decimals"];

            decimal value = decimal.Parse(Number.getNumStrFromHexStr(valueString, decimals));

            return(new JArray(new JObject()
            {
                { "value", value }
            }));
        }
Exemple #26
0
        static byte[] createNep5FindScript(string _assetid)
        {
            var asset = ThinNeo.Helper.HexString2Bytes(_assetid);

            ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
            sb.EmitPushNumber(0);
            sb.Emit(ThinNeo.VM.OpCode.PACK);
            sb.EmitPushString("name"); //name//totalSupply//symbol//decimals
            sb.EmitAppCall(asset.Reverse().ToArray());

            sb.EmitPushNumber(0);
            sb.Emit(ThinNeo.VM.OpCode.PACK);
            sb.EmitPushString("symbol"); //name//totalSupply//symbol//decimals
            sb.EmitAppCall(asset.Reverse().ToArray());

            sb.EmitPushNumber(0);
            sb.Emit(ThinNeo.VM.OpCode.PACK);
            sb.EmitPushString("decimals"); //name//totalSupply//symbol//decimals
            sb.EmitAppCall(asset.Reverse().ToArray());

            return(sb.ToArray());
        }
Exemple #27
0
        async public Task Demo()
        {
            string nnc    = "0x3fccdb91c9bb66ef2446010796feb6ca4ed96b05".Replace("0x", "");
            string script = null;

            using (var sb = new ThinNeo.ScriptBuilder())
            {
                sb.EmitParamJson(new MyJson.JsonNode_Array());                  //参数倒序入
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)name")); //参数倒序入
                ThinNeo.Hash160 shash = new ThinNeo.Hash160(nnc);
                sb.EmitAppCall(shash);                                          //nep5脚本

                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)symbol"));
                sb.EmitAppCall(shash);

                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals"));
                sb.EmitAppCall(shash);

                sb.EmitParamJson(new MyJson.JsonNode_Array());
                sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply"));
                sb.EmitAppCall(shash);


                var data = sb.ToArray();
                script = ThinNeo.Helper.Bytes2HexString(data);
            }

            //var url = Helper.MakeRpcUrl(api, "invokescript", new MyJson.JsonNode_ValueString(script));
            //string result = await Helper.HttpGet(url);

            byte[] postdata;
            var    url    = Helper.MakeRpcUrlPost(api, "invokescript", out postdata, new MyJson.JsonNode_ValueString(script));
            var    result = await Helper.HttpPost(url, postdata);

            Console.WriteLine("得到的结果是:" + result);
        }
Exemple #28
0
        void signAndBroadcast()
        {
            if (this.listInput.Items.Count == 0)
            {
                MessageBox.Show("no input");
                return;
            }
            if (this.listOutput.Items.Count == 0)
            {
                MessageBox.Show("no output");
                return;
            }
            if (this.listWitness.Items.Count == 0)
            {
                MessageBox.Show("no witness");
                return;
            }
            ThinNeo.Transaction trans = new ThinNeo.Transaction();
            trans.attributes = new ThinNeo.Attribute[0];
            if (tabCType.SelectedIndex == 0)
            {
                trans.type = ThinNeo.TransactionType.ContractTransaction;
            }
            else if (tabCType.SelectedIndex == 1)
            {
                if (lastScript == null)
                {
                    throw new Exception("need script");
                }
                if (lastFee.HasValue == false)
                {
                    throw new Exception("need test script");
                }

                trans.type    = ThinNeo.TransactionType.InvocationTransaction;
                trans.extdata = new ThinNeo.InvokeTransData();
                (trans.extdata as ThinNeo.InvokeTransData).script = lastScript;
                (trans.extdata as ThinNeo.InvokeTransData).gas    = lastFee.Value;
            }
            trans.inputs    = new ThinNeo.TransactionInput[this.listInput.Items.Count];
            trans.outputs   = new ThinNeo.TransactionOutput[this.listOutput.Items.Count];
            trans.witnesses = new ThinNeo.Witness[this.listWitness.Items.Count];
            for (var i = 0; i < listInput.Items.Count; i++)
            {
                var item  = listInput.Items[i] as Tools.Input;
                var input = new ThinNeo.TransactionInput();
                input.index     = (ushort)item.Coin.fromN;
                input.hash      = ThinNeo.Helper.HexString2Bytes(item.Coin.fromID).Reverse().ToArray();//反转
                trans.inputs[i] = input;
            }
            for (var i = 0; i < listOutput.Items.Count; i++)
            {
                var item   = listOutput.Items[i] as Tools.Output;
                var output = new ThinNeo.TransactionOutput();
                output.assetId   = ThinNeo.Helper.HexString2Bytes(item.assetID).Reverse().ToArray();//反转
                output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(item.Target);
                output.value     = item.Fix8;
                trans.outputs[i] = output;
            }
            for (var i = 0; i < listWitness.Items.Count; i++)
            {
                var item    = listWitness.Items[i] as Tools.Witnees;
                var witness = new ThinNeo.Witness();

                if (item.IsSmartContract)
                {
                    if (item.iscript == null)
                    {
                        throw new Exception("a smartContract witness not set InvocationScript.");
                    }
                    var s = ThinNeo.Helper.GetPublicKeyHashFromAddress(item.address);
                    witness.VerificationScript = rpc_getScript(s);
                    witness.InvocationScript   = item.iscript;
                    return;
                }
                else //个人鉴证人
                {
                    var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(this.privatekey);
                    var addr   = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);
                    if (item.address != addr)
                    {
                        MessageBox.Show("the key is no match with your witness.");
                    }

                    witness.VerificationScript = ThinNeo.Helper.GetScriptFromPublicKey(pubkey);

                    var signdata = ThinNeo.Helper.Sign(trans.GetMessage(), this.privatekey);
                    var sb       = new ThinNeo.ScriptBuilder();
                    sb.EmitPushBytes(signdata);

                    witness.InvocationScript = sb.ToArray();
                }
                trans.witnesses[i] = witness;
            }

            var  rawdata = trans.GetRawData();
            bool b       = rpc_SendRaw(rawdata);

            if (b)
            {
                var hash = trans.GetHash();
                var str  = ThinNeo.Helper.Bytes2HexString(hash.Reverse().ToArray());
                MessageBox.Show("txid=" + str);
            }
            else
            {
                MessageBox.Show("transaction error");
            }
        }
Exemple #29
0
        async public Task Demo()
        {
            byte[] prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF(testwif);
            byte[] pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);

            byte[] scripthash = ThinNeo.Helper.GetPublicKeyHashFromAddress(address);
            Console.WriteLine("address=" + address);

            {//查balance
                string script = null;
                using (var sb = new ThinNeo.ScriptBuilder())
                {
                    var array = new MyJson.JsonNode_Array();
                    array.AddArrayValue("(bytes)" + ThinNeo.Helper.Bytes2HexString(scripthash));
                    sb.EmitParamJson(array);                                             //参数倒序入
                    sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)balanceOf")); //参数倒序入
                    ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep55);
                    sb.EmitAppCall(shash);                                               //nep5脚本
                    var data = sb.ToArray();
                    script = ThinNeo.Helper.Bytes2HexString(data);
                }

                //var url = Helper.MakeRpcUrl(api, "invokescript", new MyJson.JsonNode_ValueString(script));
                //string result = await Helper.HttpGet(url);

                byte[] postdata;
                var    url    = Helper.MakeRpcUrlPost(api, "invokescript", out postdata, new MyJson.JsonNode_ValueString(script));
                var    result = await Helper.HttpPost(url, postdata);

                Console.WriteLine("得到的结果是:" + result);
                var json = MyJson.Parse(result).AsDict();
                if (json.ContainsKey("result"))
                {
                    var resultv = json["result"].AsList()[0].AsDict()["stack"].AsList()[0].AsDict();
                    var rtype   = resultv["type"].AsString();
                    var rvalue  = resultv["value"].AsString();
                    Console.WriteLine("type=" + rtype + "  value=" + rvalue);
                    var n = new System.Numerics.BigInteger(ThinNeo.Helper.HexString2Bytes(rvalue));
                    Console.WriteLine("value dec=" + n.ToString());
                }
            }

            if (lastNep5Tran != null)
            {
                string script = null;
                using (var sb = new ThinNeo.ScriptBuilder())
                {
                    var array = new MyJson.JsonNode_Array();
                    array.AddArrayValue("(hex256)" + lastNep5Tran.ToString());
                    sb.EmitParamJson(array);                                             //参数倒序入
                    sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)getTXInfo")); //参数倒序入
                    ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep55);
                    sb.EmitAppCall(shash);                                               //nep5脚本
                    var data = sb.ToArray();
                    script = ThinNeo.Helper.Bytes2HexString(data);
                }
                byte[] postdata;
                var    url    = Helper.MakeRpcUrlPost(api, "invokescript", out postdata, new MyJson.JsonNode_ValueString(script));
                var    result = await Helper.HttpPost(url, postdata);

                Console.WriteLine("得到的结果是:" + result);
            }
        }
Exemple #30
0
        public JObject callContractForTest(string neoCliJsonRPCUrl, List <string> scripthashs, JArray paramsJA)
        {
            //string script = (string)getContractState(neoCliJsonRPCUrl, scripthash)["script"];

            /*
             * int n = 0;
             * ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder();
             *
             * foreach (var scripthash in scripthashs)
             * {
             *
             *  httpHelper hh = new httpHelper();
             *
             *  var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList();
             *
             *  var list = json.AsList();
             *  for (int i = list.Count - 1; i >= 0; i--)
             *  {
             *      sb.EmitParamJson(list[i]);
             *  }
             *
             *  var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray();
             *  sb.EmitAppCall(scripthashReverse);
             *
             *  n++;
             * }
             *
             * string scriptPlusParams = ThinNeo.Helper.Bytes2HexString(sb.ToArray());
             * return invokeScript(neoCliJsonRPCUrl, scriptPlusParams);
             */


            /// ChangeLog:
            /// 批量调用invokeScript时,个别出错会导致,出错之后结果数据丢失。所以修改为单个单个查询,
            /// 为保证外层解析数据的顺序性,需将出错的结果位置填充数值
            ///
            JObject res       = new JObject();
            JArray  stackList = new JArray();
            int     n         = 0;

            foreach (var scripthash in scripthashs)
            {
                ThinNeo.ScriptBuilder tmpSb = new ThinNeo.ScriptBuilder();
                httpHelper            hh    = new httpHelper();
                var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList();
                var list = json.AsList();
                for (int i = list.Count - 1; i >= 0; i--)
                {
                    tmpSb.EmitParamJson(list[i]);
                }

                var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray();
                tmpSb.EmitAppCall(scripthashReverse);
                string  invokeSc = ThinNeo.Helper.Bytes2HexString(tmpSb.ToArray());
                JObject invokeRs = invokeScript(neoCliJsonRPCUrl, invokeSc);

                res.Add("script", invokeRs["script"]);
                res.Add("state", invokeRs["state"]);
                res.Add("gas_consumed", invokeRs["gas_consumed"]);

                string  state  = invokeRs["state"].ToString();
                JArray  stack  = (JArray)invokeRs["stack"];
                JObject stack1 = null;
                if (state.StartsWith("FAULT"))
                {
                    // 调用合约出错,填充占位
                    stack1 = new JObject();
                    stack1.Add("type", "FAULT");
                    stack1.Add("value", "");
                }
                else
                {
                    stack1 = (JObject)stack[0];
                }
                stackList.Add(stack1);
            }

            res.Add("stack", stackList);

            // debug info

            /*
             * n = 0;
             * List<JObject> rlist = new List<JObject>();
             * foreach (var scripthash in scripthashs)
             * {
             *  ThinNeo.ScriptBuilder tmpSb = new ThinNeo.ScriptBuilder();
             *  httpHelper hh = new httpHelper();
             *  var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList();
             *  var list = json.AsList();
             *  for (int i = list.Count - 1; i >= 0; i--)
             *  {
             *      tmpSb.EmitParamJson(list[i]);
             *  }
             *  var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray();
             *  tmpSb.EmitAppCall(scripthashReverse);
             *  string invokeSc = ThinNeo.Helper.Bytes2HexString(tmpSb.ToArray());
             *  JObject invokeRs = invokeScript(neoCliJsonRPCUrl, invokeSc);
             *  JObject obj = new JObject();
             *  obj.Add("sc", scripthash);
             *  obj.Add("ic", invokeSc);
             *  obj.Add("rs", invokeRs);
             *  rlist.Add(obj);
             * }
             */
            return(res);
        }