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()); } }
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())); } }
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()); } }
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); } }
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()); } }
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()); } }
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()); } }
/// <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("请填写正确的数据"); } }