コード例 #1
0
        private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            if (lastTran == null)
            {
                return;
            }
            byte[] sign = null;

            using (var ms = new System.IO.MemoryStream())
            {
                lastTran.SerializeUnsigned(ms);
                sign = ThinNeo.Helper.Sign(ms.ToArray(), prikey);
                ms.Close();
            }
            var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey);

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

            lastTran.witnesses = null;
            lastTran.AddWitness(sign, pubkey, addr);
            using (var ms = new System.IO.MemoryStream())
            {
                lastTran.Serialize(ms);
                textTran.Text = ThinNeo.Helper.Bytes2HexString(ms.ToArray());
            }
        }
コード例 #2
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()));
            }
        }
コード例 #3
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());
            }
        }
コード例 #4
0
ファイル: Tx.cs プロジェクト: joshua0526/FindCoin
 public override string ToString()
 {
     using (var ms = new System.IO.MemoryStream())
     {
         txraw.SerializeUnsigned(ms);
         var data   = ms.ToArray();
         var outstr = ThinNeo.Helper.Bytes2HexString(data);
         if (HasKeyInfo)
         {
             var json = ExportKeyInfo();
             outstr += "|" + json.ToString();
         }
         return(outstr);
     }
 }
コード例 #5
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());
            }
        }
コード例 #6
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());
            }
        }
コード例 #7
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());
            }
        }
コード例 #8
0
        /// <summary>
        /// gen nep5 by 印玮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                int gas  = int.Parse(this.textConsume.Text);
                var tran = new ThinNeo.Transaction();
                tran.type = ThinNeo.TransactionType.InvocationTransaction;
                if (gas > 0)//0 or 1
                {
                    tran.version = 1;
                }
                else
                {
                    tran.version = 0;
                }

                var json = MyJson.Parse(this.textParams.Text).AsList();
                using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder())
                {
                    var list = json.AsList();
                    for (int i = list.Count - 1; i >= 0; i--)
                    {
                        sb.EmitParamJson(list[i]);
                    }

                    var schash = new ThinNeo.Hash160(this.textContractHash.Text);
                    sb.EmitAppCall(schash);
                    var extdata = new ThinNeo.InvokeTransData();
                    tran.extdata   = extdata;
                    extdata.script = sb.ToArray();
                    extdata.gas    = gas;
                    if (gas > 0)
                    {
                        Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(url, this.textAddr.Text);

                        tran = Helper.makeTran(tran, dir["0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"], null, new ThinNeo.Hash256("0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"), extdata.gas);
                    }
                    else
                    {
                        tran.inputs  = new ThinNeo.TransactionInput[0];
                        tran.outputs = new ThinNeo.TransactionOutput[0];
                    }
                }

                tran.attributes          = new ThinNeo.Attribute[1];
                tran.attributes[0]       = new ThinNeo.Attribute();
                tran.attributes[0].usage = ThinNeo.TransactionAttributeUsage.Script;
                var scripthashfrom = ThinNeo.Helper.GetPublicKeyHashFromAddress(this.textAddr.Text);

                tran.attributes[0].data = scripthashfrom;

                using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                {
                    tran.SerializeUnsigned(ms);
                    var hexstr = ThinNeo.Helper.Bytes2HexString(ms.ToArray());
                    this.textTran.Text = hexstr;
                }
            }
            catch
            {
                MessageBox.Show("请填写正确的数据");
            }
        }