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()); }
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); }
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)); }
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())); } }
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())); } }
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)); } }
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()); } }
//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); }
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); }
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); } }
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>"); }
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¶ms=[\"" + scripthash + "\"]"); MyJson.JsonNode_Object resJO = (MyJson.JsonNode_Object)MyJson.Parse(response); Console.WriteLine(resJO["result"].ToString()); }
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"]); }
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); }
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()); }
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); }
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 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); }
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); }
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; }
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()); } }
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); }
//拼交易体 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); }
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); }
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); }
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"); } }