Beispiel #1
0
        async public Task Demo()
        {
            string wif1       = "KwwJMvfFPcRx2HSgQRPviLv4wPrxRaLk7kfQntkH8kCXzTgAts8t";
            string targetAddr = "AdsNmzKPPG7HfmQpacZ4ixbv9XJHJs2ACz";

            byte[] prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif1);
            byte[] pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);

            Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(api, address);

            //拼装交易体
            string[] targetAddrs = new string[1] {
                targetAddr
            };
            ThinNeo.Transaction tran = makeTran(dir, targetAddrs, new ThinNeo.Hash256(id_GAS), (decimal)1);
            tran.version = 0;
            tran.type    = ThinNeo.TransactionType.ContractTransaction;
            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    = Helper.MakeRpcUrlPost(api, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(rawdata));
            var    result = await Helper.HttpPost(url, postdata);

            MyJson.JsonNode_Object resJO = (MyJson.JsonNode_Object)MyJson.Parse(result);
            Console.WriteLine(resJO.ToString());
        }
Beispiel #2
0
        public JObject sendrawtransaction(string neoCliJsonRPCUrl, string txSigned)
        {
            httpHelper hh   = new httpHelper();
            var        resp = hh.Post(neoCliJsonRPCUrl, "{'jsonrpc':'2.0','method':'sendrawtransaction','params':['" + txSigned + "'],'id':1}", System.Text.Encoding.UTF8, 1);

            bool    isSendSuccess = (bool)JObject.Parse(resp)["result"];
            JObject Jresult       = new JObject();

            Jresult.Add("sendrawtransactionresult", isSendSuccess);
            if (isSendSuccess)
            {
                ThinNeo.Transaction lastTran = new ThinNeo.Transaction();
                lastTran.Deserialize(new MemoryStream(txSigned.HexString2Bytes()));
                string txid = lastTran.GetHash().ToString();

                ////从已签名交易体分析出未签名交易体,并做Hash获得txid
                //byte[] txUnsigned = txSigned.Split("014140")[0].HexString2Bytes();
                //string txid = ThinNeo.Helper.Sha256(ThinNeo.Helper.Sha256(txUnsigned)).Reverse().ToArray().ToHexString();

                Jresult.Add("txid", txid);
            }
            else
            {
                //上链失败则返回空txid
                Jresult.Add("txid", string.Empty);
            }

            return(Jresult);
        }
Beispiel #3
0
        public JObject sendTxPlusSign(string neoCliJsonRPCUrl, string txScriptHex, string signHex, string publicKeyHex)
        {
            byte[] txScript = txScriptHex.HexString2Bytes();
            byte[] sign     = signHex.HexString2Bytes();
            byte[] pubkey   = publicKeyHex.HexString2Bytes();
            //byte[] prikey = privateKeyHex.HexToBytes();

            //byte[] sign = null;

            //sign = ThinNeo.Helper.Sign(txScript, prikey);

            //var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);

            var addr = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);

            ThinNeo.Transaction lastTran = new ThinNeo.Transaction();
            lastTran.Deserialize(new MemoryStream(txScript));
            lastTran.witnesses = null;
            lastTran.AddWitness(sign, pubkey, addr);

            string TxPlusSignStr = string.Empty;

            using (var ms = new System.IO.MemoryStream())
            {
                lastTran.Serialize(ms);
                TxPlusSignStr = ms.ToArray().ToHexString();
            }

            return(sendrawtransaction(neoCliJsonRPCUrl, TxPlusSignStr));
        }
Beispiel #4
0
        private static string getTxSignHex(string txScriptHex, string signHex, string publicKeyHex)
        {
            byte[] txScript = txScriptHex.HexToBytes();
            var    sign     = signHex.HexToBytes();
            //byte[] prikey = privateKeyHex.HexToBytes();

            //var prikeyStr = ThinNeo.Helper.Bytes2HexString(prikey);

            //byte[] sign = null;

            //sign = ThinNeo.Helper.Sign(txScript, prikey);

            //var signStr = ThinNeo.Helper.Bytes2HexString(sign);

            //var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            var pubkey = publicKeyHex.HexToBytes();
            var addr   = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);

            ThinNeo.Transaction lastTran = new ThinNeo.Transaction();
            lastTran.Deserialize(new MemoryStream(txScriptHex.HexToBytes()));
            lastTran.witnesses = null;
            lastTran.AddWitness(sign, pubkey, addr);
            using (var ms = new System.IO.MemoryStream())
            {
                lastTran.Serialize(ms);
                return(ThinNeo.Helper.Bytes2HexString(ms.ToArray()));
            }
        }
Beispiel #5
0
        private static string getTransferTxHex(string addrOut, string addrIn, string assetID, decimal amounts)
        {
            ThinNeo.Transaction lastTran;

            string  inputJson  = "{ 'jsonrpc':'2.0','method':'getutxo','params':['" + addrOut + "'],'id':1}";
            string  outputJson = httpHelper.Post("http://47.96.168.8:81/api/testnet", inputJson);
            JObject outputJ    = JObject.Parse(outputJson);
            //linq查找指定asset最大的utxo
            var query = from utxos in outputJ["result"].Children()
                        where (string)utxos["asset"] == assetID
                        orderby(decimal) utxos["value"] descending
                        select utxos;

            var utxo = query.ToList()[0];

            byte[]  utxo_txid  = ((string)utxo["txid"]).Replace("0x", "").HexToBytes().Reverse().ToArray();
            ushort  utxo_n     = (ushort)utxo["n"];
            decimal utxo_value = (decimal)utxo["value"];

            byte[] assetBytes = assetID.Replace("0x", "").HexToBytes().Reverse().ToArray();

            var a = utxo_txid.ToHexString();
            var b = assetBytes.ToHexString();

            if (amounts > utxo_value)
            {
                return(string.Empty);
            }

            lastTran                 = new ThinNeo.Transaction();
            lastTran.type            = ThinNeo.TransactionType.ContractTransaction;//转账
            lastTran.attributes      = new ThinNeo.Attribute[0];
            lastTran.inputs          = new ThinNeo.TransactionInput[1];
            lastTran.inputs[0]       = new ThinNeo.TransactionInput();
            lastTran.inputs[0].hash  = utxo_txid;//吃掉一个utxo
            lastTran.inputs[0].index = utxo_n;

            lastTran.outputs              = new ThinNeo.TransactionOutput[2];
            lastTran.outputs[0]           = new ThinNeo.TransactionOutput();//给对方转账
            lastTran.outputs[0].assetId   = assetBytes;
            lastTran.outputs[0].toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrIn);
            lastTran.outputs[0].value     = amounts;
            lastTran.outputs[1]           = new ThinNeo.TransactionOutput();//给自己找零
            lastTran.outputs[1].assetId   = assetBytes;
            lastTran.outputs[1].toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrOut);
            lastTran.outputs[1].value     = utxo_value - amounts;

            var c = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrIn).ToHexString();
            var d = amounts;
            var e = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrOut).ToHexString();
            var f = utxo_value - amounts;

            using (var ms = new System.IO.MemoryStream())
            {
                lastTran.SerializeUnsigned(ms);
                return(ThinNeo.Helper.Bytes2HexString(ms.ToArray()));
            }
        }
Beispiel #6
0
        private async Task <JObject> asyncApplyGas(List <string> targetAddress, decimal amount, Dictionary <string, List <Utxo> > dir)
        {
            // 转换私钥
            byte[] prikey  = accountInfo.prikey;
            byte[] pubkey  = accountInfo.pubkey;
            string address = accountInfo.address;

            // 获取余额
            string id_gas = assetid;

            //Dictionary<string, List<Utxo>> dir2 = await TransHelper.GetBalanceByAddress(nelJsonRpcUrl, address);
            if (dir == null || dir[id_gas] == null)
            {
                // 余额不足
                return(insufficientBalance());
            }
            List <Utxo> balanceUtxo = dir[id_gas];

            if (balanceUtxo.Sum(p => p.value) < amount * targetAddress.Count())
            {
                // 余额不足
                return(insufficientBalance());
            }

            // 构造并发送交易
            ThinNeo.Transaction tran = TransHelper.makeTran(dir[id_gas], targetAddress, new ThinNeo.Hash256(id_gas), amount);
            tran.type = ThinNeo.TransactionType.ContractTransaction;
            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;
            try
            {
                string url    = TransHelper.MakeRpcUrlPost(nelJsonRpcUrl, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(rawdata));
                var    result = await TransHelper.HttpPost(url, postdata);

                Console.WriteLine("result:" + result);
                if (JObject.Parse(result)["result"] == null)
                {
                    return(txFail(txid));
                }
                JObject res  = (JObject)(((JArray)(JObject.Parse(result)["result"]))[0]);
                string  flag = res["sendrawtransactionresult"].ToString();
                if (flag != "True" && res["txid"].ToString() != txid)
                {
                    return(txFail(txid));
                }
                return(txSucc(txid));
            } catch (Exception)
            {
                return(txFail(txid));
            }
        }
Beispiel #7
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());
            }
        }
Beispiel #8
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);
        }
Beispiel #9
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);
        }
Beispiel #10
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());
            }
        }
        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);
            }
        }
Beispiel #12
0
        static async void SendtoAddress(string strurl, string rpcurl, string assetId, string wif1, string toadd, string value, string change_address)
        {
            byte[] prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif1);
            byte[] pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            string fromadd = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);

            Dictionary <string, List <Utxo> > dir = null;

            try
            {
                dir = await Helper.GetBalanceByAddress(strurl, fromadd);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                return;
            }

            //拼装交易体
            string[] targetAddrs = new string[1] {
                toadd
            };
            decimal sendCount = decimal.Parse(value);

            try
            {
                ThinNeo.Transaction tran = makeTran(dir, targetAddrs, new ThinNeo.Hash256(assetId), sendCount, change_address);
                tran.version = 0;
                tran.type    = ThinNeo.TransactionType.ContractTransaction;
                byte[] msg      = tran.GetMessage();
                string msgstr   = ThinNeo.Helper.Bytes2HexString(msg);
                byte[] signdata = ThinNeo.Helper.Sign(msg, prikey);
                tran.AddWitness(signdata, pubkey, fromadd);
                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 result = await Helper.HttpPost(url, postdata);

                MyJson.JsonNode_Object resJO = (MyJson.JsonNode_Object)MyJson.Parse(result);
                Console.WriteLine(resJO.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            Console.Write("cmd>");
        }
Beispiel #13
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());
        }
Beispiel #14
0
        public string getInvokeTxHex(JArray utxoJA, string addrOut, string script, decimal scriptFee)
        {
            var assetIDStr = "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"; //选择GAS支付合约调用费用
            var assetID    = assetIDStr.Replace("0x", "").HexString2Bytes().Reverse().ToArray();

            //linq查找指定asset最大的utxo
            var query = from utxos in utxoJA.Children()
                        where (string)utxos["asset"] == assetIDStr
                        orderby(decimal) utxos["value"] descending
                        select utxos;

            var utxo = query.ToList()[0];

            byte[]  utxo_txid  = ThinNeo.Debug.DebugTool.HexString2Bytes(((string)utxo["txid"]).Replace("0x", "")).Reverse().ToArray();
            ushort  utxo_n     = (ushort)utxo["n"];
            decimal utxo_value = (decimal)utxo["value"];

            //构建交易体
            ThinNeo.Transaction invokeTran = new ThinNeo.Transaction
            {
                type       = ThinNeo.TransactionType.InvocationTransaction,//调用合约
                attributes = new ThinNeo.Attribute[0],
                inputs     = new ThinNeo.TransactionInput[1],
                outputs    = new ThinNeo.TransactionOutput[1],
                extdata    = new ThinNeo.InvokeTransData()
            };
            //输入
            invokeTran.inputs[0] = new ThinNeo.TransactionInput
            {
                hash  = utxo_txid,
                index = utxo_n
            };
            //找零(输出)
            invokeTran.outputs[0] = new ThinNeo.TransactionOutput
            {
                assetId   = assetID,
                toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrOut),
                value     = utxo_value //实际应该还要考虑大于10Gas的情况
            };
            //调用脚本与费用
            (invokeTran.extdata as ThinNeo.InvokeTransData).script = script.HexString2Bytes();
            (invokeTran.extdata as ThinNeo.InvokeTransData).gas    = scriptFee;

            using (var ms = new MemoryStream())
            {
                invokeTran.SerializeUnsigned(ms);
                return(ms.ToArray().ToHexString());
            }
        }
        static private string transfer_UTXO(string addrTo, decimal amount, string assetid = neoHelper.GAShash)
        {
            Dictionary <string, List <neoHelper.neoTranstion.Utxo> > dirUTXO = nTX.GetUTXOByAddress(neoAddress.addrStr);

            if (!dirUTXO.ContainsKey("0x" + assetid))
            {
                return("asset UTXO is null!");
            }

            ThinNeo.Transaction TX = nTX.makeTransferTx(dirUTXO["0x" + assetid], addrTo, assetid, amount);

            JObject res = nelApi.sendRawTransaction(nTX.signAndGetTxHex(neoAddress, TX));

            return((string)res["result"][0]["txid"]);
        }
Beispiel #16
0
        public static string RecordTran(ThinNeo.Transaction trans)
        {
            var      txid = ThinNeo.Helper.Bytes2HexString(trans.GetHash().Reverse().ToArray());
            TranInfo info = new TranInfo();

            info.time = DateTime.Now;
            info.type = trans.type;
            info.txid = txid;
            TxHistory.Add(info);
            foreach (var input in trans.inputs)
            {
                var txid2   = ThinNeo.Helper.Bytes2HexString(input.hash.Reverse().ToArray());
                var strutxo = txid2 + "_" + input.index;
                UtxoHistory.Add(strutxo);
            }
            return(txid);
        }
Beispiel #17
0
        async public Task Demo()
        {
            string wif1        = "KwwJMvfFPcRx2HSgQRPviLv4wPrxRaLk7kfQntkH8kCXzTgAts8t";
            string wif2        = "L2EHemxzCYKxhH81QVwPDwUT5Bd8yBgbPt7GnUFpGuttiiYroRFi";
            string targetAddr1 = "AHDV7M54NHukq8f76QQtBTbrCqKJrBH9UF";
            string targetAddr2 = "AdsNmzKPPG7HfmQpacZ4ixbv9XJHJs2ACz";

            byte[] prikey1  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif1);
            byte[] pubkey1  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey1);
            string address1 = ThinNeo.Helper.GetAddressFromPublicKey(pubkey1);

            byte[] prikey2  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif2);
            byte[] pubkey2  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey2);
            string address2 = ThinNeo.Helper.GetAddressFromPublicKey(pubkey2);

            Dictionary <string, List <Utxo> > dir1 = await Helper.GetBalanceByAddress(api, address1);

            Dictionary <string, List <Utxo> > dir2 = await Helper.GetBalanceByAddress(api, address2);


            //拼装交易体
            string[] targetAddrs = new string[2] {
                targetAddr1, targetAddr2
            };
            ThinNeo.Transaction tran = makeTran(dir1, dir2, targetAddrs, new ThinNeo.Hash256(id_GAS), 2);
            tran.version = 0;
            tran.type    = ThinNeo.TransactionType.ContractTransaction;
            byte[] msg       = tran.GetMessage();
            byte[] signdata  = ThinNeo.Helper.Sign(msg, prikey1);
            byte[] signdata2 = ThinNeo.Helper.Sign(msg, prikey2);
            tran.AddWitness(signdata, pubkey1, address1);
            tran.AddWitness(signdata2, pubkey2, address2);
            string txid = tran.GetHash().ToString();

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

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

            MyJson.JsonNode_Object resJO = (MyJson.JsonNode_Object)MyJson.Parse(result);
            Console.WriteLine(resJO.ToString());
        }
Beispiel #18
0
        public static ThinNeo.Transaction makeTran(Dictionary <string, List <Utxo> > dir_utxos, string targetaddr, ThinNeo.Hash256 assetid, decimal sendcount)
        {
            var tran = new ThinNeo.Transaction();

            tran.type    = ThinNeo.TransactionType.ContractTransaction;
            tran.version = 0;
            tran.extdata = null;

            tran.attributes = new ThinNeo.Attribute[0];
            var     scraddr = "";
            decimal count   = decimal.Zero;
            List <ThinNeo.TransactionInput> list_inputs = new List <ThinNeo.TransactionInput>();

            tran.inputs = list_inputs.ToArray();
            List <ThinNeo.TransactionOutput> list_outputs = new List <ThinNeo.TransactionOutput>();

            tran.outputs = list_outputs.ToArray();

            return(tran);
        }
Beispiel #19
0
        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            textTran.Text = "";
            var utxo = comboUtxo.SelectedItem as UTXO;

            if (utxo == null)
            {
                return;
            }
            var     valuecount = utxo.value;
            decimal eat        = decimal.Parse(textTrans.Text);
            var     left       = valuecount - eat;

            if (left < 0)
            {
                MessageBox.Show("钱不够");
                return;
            }
            lastTran                 = new ThinNeo.Transaction();
            lastTran.type            = ThinNeo.TransactionType.ContractTransaction;//转账
            lastTran.attributes      = new ThinNeo.Attribute[0];
            lastTran.inputs          = new ThinNeo.TransactionInput[1];
            lastTran.inputs[0]       = new ThinNeo.TransactionInput();
            lastTran.inputs[0].hash  = utxo.txid;//吃掉一个utxo
            lastTran.inputs[0].index = (ushort)utxo.n;

            lastTran.outputs              = new ThinNeo.TransactionOutput[2];
            lastTran.outputs[0]           = new ThinNeo.TransactionOutput();//给对方转账
            lastTran.outputs[0].assetId   = utxo.asset;
            lastTran.outputs[0].toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(textaddressTo.Text);
            lastTran.outputs[0].value     = eat;
            lastTran.outputs[1]           = new ThinNeo.TransactionOutput();//给自己找零
            lastTran.outputs[1].assetId   = utxo.asset;
            lastTran.outputs[1].toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(textaddress.Text);
            lastTran.outputs[1].value     = valuecount - eat;
            using (var ms = new System.IO.MemoryStream())
            {
                lastTran.SerializeUnsigned(ms);
                textTran.Text = ThinNeo.Helper.Bytes2HexString(ms.ToArray());
            }
        }
Beispiel #20
0
        public string getClaimTxHex(string addrClaim, JObject claimGas)
        {
            var assetIDStr = "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"; //选择GAS支付合约调用费用
            var assetID    = assetIDStr.Replace("0x", "").HexString2Bytes().Reverse().ToArray();

            //构建交易体
            ThinNeo.Transaction claimTran = new ThinNeo.Transaction
            {
                type       = ThinNeo.TransactionType.ClaimTransaction,//领取Gas合约
                attributes = new ThinNeo.Attribute[0],
                inputs     = new ThinNeo.TransactionInput[0],
                outputs    = new ThinNeo.TransactionOutput[1],
                extdata    = new ThinNeo.ClaimTransData()
            };

            claimTran.outputs[0] = new ThinNeo.TransactionOutput
            {
                assetId   = assetID,
                toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrClaim),
                value     = (decimal)claimGas["gas"]
            };

            List <ThinNeo.TransactionInput> claimVins = new List <ThinNeo.TransactionInput>();

            foreach (JObject j in (JArray)claimGas["claims"])
            {
                claimVins.Add(new ThinNeo.TransactionInput {
                    hash  = ThinNeo.Debug.DebugTool.HexString2Bytes(((string)j["txid"]).Replace("0x", "")).Reverse().ToArray(),
                    index = (ushort)j["n"]
                });
            }

            (claimTran.extdata as ThinNeo.ClaimTransData).claims = claimVins.ToArray();

            using (var ms = new MemoryStream())
            {
                claimTran.SerializeUnsigned(ms);
                return(ms.ToArray().ToHexString());
            }
        }
Beispiel #21
0
 public void FromString(IList <Key> keys, string info)
 {
     byte[] txdata;
     //有附加信息
     MyJson.JsonNode_Object keyinfo = null;
     if (info.Contains("|"))
     {
         var ss = info.Split('|');
         txdata  = ThinNeo.Helper.HexString2Bytes(ss[0]);
         keyinfo = MyJson.Parse(ss[1]).AsDict();
     }
     else
     {
         txdata = ThinNeo.Helper.HexString2Bytes(info);
     }
     txraw = new ThinNeo.Transaction();
     using (var ms = new System.IO.MemoryStream(txdata))
     {
         txraw.Deserialize(ms);
     }
     ImportKeyInfo(keys, keyinfo);
 }
Beispiel #22
0
        private JObject sendrawtransaction(string neoCliJsonRPCUrl, string txSigned)
        {
            var resp = httpHelper.Post(neoCliJsonRPCUrl, "{'jsonrpc':'2.0','method':'sendrawtransaction','params':['" + txSigned + "'],'id':1}", System.Text.Encoding.UTF8, 1);

            JObject Jresult       = new JObject();
            bool    isSendSuccess = false;
            var     res           = JObject.Parse(resp);

            if (res["error"] != null && res["error"]["message"] != null)
            {
                isSendSuccess = false;

                Jresult.Add("errorMessage", res["error"]["message"]);
            }
            else
            {
                isSendSuccess = (bool)JObject.Parse(resp)["result"];
            }
            //bool isSendSuccess = (bool)JObject.Parse(resp)["result"];
            //JObject Jresult = new JObject();
            Jresult.Add("sendrawtransactionresult", isSendSuccess);
            if (isSendSuccess)
            {
                ThinNeo.Transaction lastTran = new ThinNeo.Transaction();
                lastTran.Deserialize(new MemoryStream(txSigned.HexString2Bytes()));
                string txid = lastTran.GetHash().ToString();
                Jresult.Add("txid", txid);
            }
            else
            {
                //上链失败则返回空txid
                Jresult.Add("txid", string.Empty);
            }

            return(Jresult);
        }
Beispiel #23
0
        void DoCallTran(ThinNeo.Transaction tx)
        {
            wc.Headers["content-type"] = "text/plain;charset=UTF-8";
            Newtonsoft.Json.Linq.JObject upparam = new Newtonsoft.Json.Linq.JObject();
            upparam["jsonrpc"] = "2.0";
            upparam["id"]      = 1;
            upparam["method"]  = "sendrawtransaction";
            var _params = new Newtonsoft.Json.Linq.JArray();

            var data = tx.GetRawData();

            _params.Add(ThinNeo.Helper.Bytes2HexString(data));
            upparam["params"] = _params;

            var info = wc.UploadString(url, upparam.ToString());

            Console.WriteLine(info);

            var   txid = tx.GetHash();
            State s    = new State();

            s.state = 0;
            mapTxState[txid.ToString()] = s;
        }
Beispiel #24
0
        public string getTransferTxHex(JArray utxoJA, string addrOut, string addrIn, string assetID, decimal amounts)
        {
            ////string findFliter = "{addr:'" + addrOut + "',used:''}";
            ////JArray outputJA = mh.GetData(mongodbConnStr, mongodbDatabase, "utxo", findFliter);

            ////linq查找指定asset
            //var query = from utxos in utxoJA.Children()
            //            where (string)utxos["asset"] == assetID
            //            orderby (decimal)utxos["value"] //descending
            //            select utxos;
            ////var utxo = query.ToList()[0];

            //JArray utxo2pay = new JArray();
            //decimal utxo_value = 0; //所有utxo总值
            //foreach (JObject utxo in query)
            //{
            //    if (utxo_value < amounts)//如utxo总值小于需支付则继续加utxo
            //    {
            //        utxo2pay.Add(utxo);
            //        utxo_value += (decimal)utxo["value"];
            //    }
            //    else { break; }//utxo总值大于等于需支付则跳出
            //}
            ////byte[] utxo_txid = ThinNeo.Debug.DebugTool.HexString2Bytes(((string)utxo["txid"]).Replace("0x", "")).Reverse().ToArray();
            ////ushort utxo_n = (ushort)utxo["n"];
            ////decimal utxo_value = (decimal)utxo["value"];

            //if (amounts > utxo_value)
            //{
            //    return string.Empty;
            //}

            JArray utxo2pay = getUtxo2Pay(utxoJA, addrOut, assetID, amounts);

            if (utxo2pay == new JArray())
            {
                return(string.Empty);
            }

            byte[] assetBytes = assetID.Replace("0x", "").HexString2Bytes().Reverse().ToArray();

            ThinNeo.Transaction lastTran;
            lastTran = new ThinNeo.Transaction
            {
                type       = ThinNeo.TransactionType.ContractTransaction,//转账
                attributes = new ThinNeo.Attribute[0],
                inputs     = new ThinNeo.TransactionInput[utxo2pay.Count]
            };
            //构造输入
            decimal utxo_value = 0;//所有utxo总金额
            int     i          = 0;

            foreach (var utxo in utxo2pay)
            {
                lastTran.inputs[i] = new ThinNeo.TransactionInput
                {
                    hash  = ((string)utxo["txid"]).Replace("0x", "").HexString2Bytes().Reverse().ToArray(),
                    index = (ushort)utxo["n"]
                };
                utxo_value += (decimal)utxo["value"];//加总所有utxo金额
                i++;
            }

            bool isNeedRefund = (utxo_value - amounts) > 0 ? true : false;

            if (isNeedRefund)
            {
                lastTran.outputs = new ThinNeo.TransactionOutput[2];
            }
            else
            {
                lastTran.outputs = new ThinNeo.TransactionOutput[1];
            }

            lastTran.outputs[0] = new ThinNeo.TransactionOutput
            {
                assetId   = assetBytes,
                toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrIn),
                value     = amounts
            };//给对方转账

            if (isNeedRefund)
            {
                lastTran.outputs[1] = new ThinNeo.TransactionOutput
                {
                    assetId   = assetBytes,
                    toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(addrOut),
                    value     = utxo_value - amounts
                };
            }//如需要,处理给自己找零

            using (var ms = new MemoryStream())
            {
                lastTran.SerializeUnsigned(ms);
                return(ms.ToArray().ToHexString());
            }
        }
Beispiel #25
0
        public static ThinNeo.Transaction makeTran(List <Utxo> utxos, string targetaddr, ThinNeo.Hash256 assetid, decimal sendcount)
        {
            var tran = new ThinNeo.Transaction();

            tran.type    = ThinNeo.TransactionType.ContractTransaction;
            tran.version = 0;//0 or 1
            tran.extdata = null;

            tran.attributes = new ThinNeo.Attribute[0];
            var scraddr = "";

            utxos.Sort((a, b) =>
            {
                if (a.value > b.value)
                {
                    return(1);
                }
                else if (a.value < b.value)
                {
                    return(-1);
                }
                else
                {
                    return(0);
                }
            });
            decimal count = decimal.Zero;
            List <ThinNeo.TransactionInput> list_inputs = new List <ThinNeo.TransactionInput>();

            for (var i = 0; i < utxos.Count; i++)
            {
                ThinNeo.TransactionInput input = new ThinNeo.TransactionInput();
                input.hash  = utxos[i].txid;
                input.index = (ushort)utxos[i].n;
                list_inputs.Add(input);
                count  += utxos[i].value;
                scraddr = utxos[i].addr;
                if (count >= sendcount)
                {
                    break;
                }
            }
            tran.inputs = list_inputs.ToArray();
            if (count >= sendcount)//输入大于等于输出
            {
                List <ThinNeo.TransactionOutput> list_outputs = new List <ThinNeo.TransactionOutput>();
                //输出
                if (sendcount > decimal.Zero && targetaddr != null)
                {
                    ThinNeo.TransactionOutput output = new ThinNeo.TransactionOutput();
                    output.assetId   = assetid;
                    output.value     = sendcount;
                    output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(targetaddr);
                    list_outputs.Add(output);
                }

                //找零
                var change = count - sendcount;
                if (change > decimal.Zero)
                {
                    ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput();
                    outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(scraddr);
                    outputchange.value     = change;
                    outputchange.assetId   = assetid;
                    list_outputs.Add(outputchange);
                }
                tran.outputs = list_outputs.ToArray();
            }
            else
            {
                throw new Exception("no enough money.");
            }
            return(tran);
        }
Beispiel #26
0
        //拼交易体
        ThinNeo.Transaction makeTran(Dictionary <string, List <Utxo> > dir_utxos1, Dictionary <string, List <Utxo> > dir_utxos2, string[] targetaddrs, ThinNeo.Hash256 assetid, decimal sendcount)
        {
            if (!dir_utxos1.ContainsKey(assetid.ToString()) || !dir_utxos2.ContainsKey(assetid.ToString()))
            {
                throw new Exception("no enough money.");
            }

            List <Utxo> utxos1 = dir_utxos1[assetid.ToString()];
            List <Utxo> utxos2 = dir_utxos2[assetid.ToString()];

            var tran = new ThinNeo.Transaction();

            tran.type    = ThinNeo.TransactionType.ContractTransaction;
            tran.version = 0;//0 or 1
            tran.extdata = null;

            tran.attributes = new ThinNeo.Attribute[0];
            utxos1.Sort((a, b) =>
            {
                if (a.value > b.value)
                {
                    return(1);
                }
                else if (a.value < b.value)
                {
                    return(-1);
                }
                else
                {
                    return(0);
                }
            });
            utxos2.Sort((a, b) =>
            {
                if (a.value > b.value)
                {
                    return(1);
                }
                else if (a.value < b.value)
                {
                    return(-1);
                }
                else
                {
                    return(0);
                }
            });
            decimal count   = decimal.Zero;
            string  scraddr = "";
            List <ThinNeo.TransactionInput> list_inputs = new List <ThinNeo.TransactionInput>();

            for (var i = 0; i < utxos1.Count; i++)
            {
                ThinNeo.TransactionInput input = new ThinNeo.TransactionInput();
                input.hash  = utxos1[i].txid;
                input.index = (ushort)utxos1[i].n;
                list_inputs.Add(input);
                count  += utxos1[i].value;
                scraddr = utxos1[i].addr;
                if (count >= (sendcount / 2))
                {
                    break;
                }
            }
            decimal count2   = decimal.Zero;
            string  scraddr2 = "";

            for (var i = 0; i < utxos2.Count; i++)
            {
                ThinNeo.TransactionInput input = new ThinNeo.TransactionInput();
                input.hash  = utxos2[i].txid;
                input.index = (ushort)utxos2[i].n;
                list_inputs.Add(input);
                count2  += utxos2[i].value;
                scraddr2 = utxos2[i].addr;
                if (count2 >= (sendcount / 2))
                {
                    break;
                }
            }
            tran.inputs = list_inputs.ToArray();

            if (count + count2 >= sendcount)//输入大于等于输出
            {
                List <ThinNeo.TransactionOutput> list_outputs = new List <ThinNeo.TransactionOutput>();
                //输出
                if (sendcount > decimal.Zero && targetaddrs.Length > 0)
                {
                    foreach (string targetaddr in targetaddrs)
                    {
                        ThinNeo.TransactionOutput output = new ThinNeo.TransactionOutput();
                        output.assetId   = assetid;
                        output.value     = sendcount / 2;
                        output.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(targetaddr);
                        list_outputs.Add(output);
                    }
                }

                //找零
                var change1 = count - sendcount / 2;
                var change2 = count2 - sendcount / 2;
                if (change1 > decimal.Zero)
                {
                    ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput();
                    outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(scraddr);
                    outputchange.value     = change1;
                    outputchange.assetId   = assetid;
                    list_outputs.Add(outputchange);
                }
                if (change2 > decimal.Zero)
                {
                    ThinNeo.TransactionOutput outputchange = new ThinNeo.TransactionOutput();
                    outputchange.toAddress = ThinNeo.Helper.GetPublicKeyHashFromAddress(scraddr2);
                    outputchange.value     = change2;
                    outputchange.assetId   = assetid;
                    list_outputs.Add(outputchange);
                }
                tran.outputs = list_outputs.ToArray();
            }
            else
            {
                throw new Exception("no enough money.");
            }
            return(tran);
        }
Beispiel #27
0
 public static string getTxidFromSignedTx(string txSigned)
 {
     ThinNeo.Transaction lastTran = new ThinNeo.Transaction();
     lastTran.Deserialize(new MemoryStream(txSigned.HexString2Bytes()));
     return(lastTran.GetHash().ToString());
 }
        ThinNeo.Transaction GenTran()
        {
            if (this.listInput.Items.Count == 0)
            {
                MessageBox.Show("no input");
                return(null);
            }
            if (this.listOutput.Items.Count == 0)
            {
                MessageBox.Show("no output");
                return(null);
            }
            if (this.listWitness.Items.Count == 0)
            {
                MessageBox.Show("no witness");
                return(null);
            }
            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];
            var _listOutput = new List <ThinNeo.TransactionOutput>();

            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;
                var checkutxo = item.Coin.fromN + "_" + item.Coin.fromID;
                foreach (var v in Tools.CoinTool.UtxoHistory)
                {
                    if (v == checkutxo)
                    {
                        if (MessageBox.Show("use a input with spented money. Realy?", "", MessageBoxButton.YesNo) == MessageBoxResult.No)
                        {
                            return(null);
                        }
                    }
                }
                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;
                if (string.IsNullOrEmpty(item.Target))
                {//扔钱
                    continue;
                }
                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;
                _listOutput.Add(output);
            }
            trans.outputs = _listOutput.ToArray();

            return(trans);
        }
Beispiel #29
0
        public void ZoroTransfer()
        {
            byte[]        prikey  = ThinNeo.Helper.GetPrivateKeyFromWIF(wif);
            var           pubkey  = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);
            var           address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey);
            ScriptBuilder sb      = new ScriptBuilder();

            MyJson.JsonNode_Array array = new MyJson.JsonNode_Array();
            array.AddArrayValue("(addr)" + from);
            array.AddArrayValue("(addr)" + "AUB7tMoKTzN33iVVqhz98vnT3KiG4bqx3f"); //ZoroBank address   AUB7tMoKTzN33iVVqhz98vnT3KiG4bqx3f
            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("0x67147557c0b6431e9b9297de26b46d9889434e49"));

            Hash160 scripthash    = ThinNeo.Helper.GetPublicKeyHashFromAddress(address);
            string  scriptPublish = ThinNeo.Helper.Bytes2HexString(sb.ToArray());

            byte[] postdata;

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

            ThinNeo.Transaction tran = Helper.makeTran(null, null, new ThinNeo.Hash256(Config.getValue("id_GAS")),
                                                       extdata.gas);
            tran.version = 1;
            tran.extdata = extdata;
            tran.type    = ThinNeo.TransactionType.InvocationTransaction;

            //附加鉴证
            tran.attributes          = new ThinNeo.Attribute[1];
            tran.attributes[0]       = new ThinNeo.Attribute();
            tran.attributes[0].usage = ThinNeo.TransactionAttributeUsage.Script;
            tran.attributes[0].data  = scripthash;

            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);

            MyJson.JsonNode_Array postRawArray = new MyJson.JsonNode_Array();
            postRawArray.AddArrayValue(chainHash); //跟链
            postRawArray.AddArrayValue(rawdata);

            var url    = Helper.MakeRpcUrlPost(ZoroRpcUrl, "sendrawtransaction", out postdata, postRawArray.ToArray());
            var result = Helper.HttpPost(url, postdata).Result;

            Console.WriteLine(result + " txid: " + txid);
        }
Beispiel #30
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");
            }
        }