async Task test_getRefund() { //if (lasttxid == null) //{ // Console.WriteLine("你还没有正确执行Refund"); // return; //} Console.WriteLine("refund txid:"); var lastTxid = Console.ReadLine(); string nep55_address = ThinNeo.Helper.GetAddressFromScriptHash(sneo_common.sc_sneo); Console.WriteLine("address=" + nep55_address); //获取地址的资产列表 Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(Config.api, nep55_address); if (dir.ContainsKey(Config.id_NEO) == false) { Console.WriteLine("no neo"); return; } List <Utxo> newlist = new List <Utxo>(); foreach (var utxo in dir[Config.id_NEO]) { if (utxo.n == 0 && utxo.txid.ToString().Equals(lastTxid)) { newlist.Add(utxo); } } if (newlist.Count == 0) { Console.WriteLine("找不到要使用的UTXO"); return; } else { lastTxid = newlist[0].txid.ToString(); } {//检查是否是前面交易存储的 var ret = await sneo_common.api_InvokeScript(sneo_common.sc_sneo, "getRefundTarget", "(hex256)" + lastTxid); sneo_common.ResultItem item = ret.value; var value = ThinNeo.Helper.GetAddressFromScriptHash(item.subItem[0].AsHash160()); if (value.Length == 0)//未标记的UTXO,不能使用 { Console.WriteLine("这个utxo没有标记"); return; } if (value != this.address) { Console.WriteLine("这个utxo不是标记给你用的"); return; } } ThinNeo.Transaction tran = Helper.makeTran(newlist, address, new ThinNeo.Hash256(Config.id_NEO), newlist[0].value); tran.type = ThinNeo.TransactionType.ContractTransaction; tran.version = 0; //sign and broadcast {//做智能合约的签名 byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushNumber(0); sb.EmitPushNumber(0); iscript = sb.ToArray(); } tran.AddWitnessScript(n55contract, iscript); } var trandata = tran.GetRawData(); var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata); ThinNeo.Transaction testde = new ThinNeo.Transaction(); testde.Deserialize(new System.IO.MemoryStream(trandata)); byte[] postdata; var url = Helper.MakeRpcUrlPost(Config.api, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(strtrandata)); string poststr = System.Text.Encoding.UTF8.GetString(postdata); //Console.WriteLine("-----post info begin----"); //Console.WriteLine(poststr); //Console.WriteLine("-----post info end----"); var result = await Helper.HttpPost(url, postdata); Console.WriteLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { bool bSucc = false; if (json["result"].type == MyJson.jsontype.Value_Number) { bSucc = json["result"].AsBool(); Console.WriteLine("cli=" + json["result"].ToString()); } else { var resultv = json["result"].AsList()[0].AsDict(); var txid = resultv["txid"].AsString(); bSucc = txid.Length > 0; Console.WriteLine("txid=" + txid); } if (bSucc) { Nep55_1.lastNep5Tran = tran.GetHash(); Console.WriteLine("besucc txid=" + tran.GetHash().ToString()); } } }
//退款操作 async Task test_refund() { Console.WriteLine("Input refund tokens:"); string refund = Console.ReadLine(); string nep55_address = ThinNeo.Helper.GetAddressFromScriptHash(sneo_common.sc_sneo); Console.WriteLine("nep55_address=" + nep55_address); //获取地址的资产列表 Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(Config.api, nep55_address); if (dir.ContainsKey(Config.id_NEO) == false) { Console.WriteLine("no neo"); return; } List <Utxo> newlist = new List <Utxo>(dir[Config.id_NEO]); for (var i = newlist.Count - 1; i >= 0; i--) { var ret = await sneo_common.api_InvokeScript(sneo_common.sc_sneo, "getRefundTarget", "(hex256)" + newlist[i].txid.ToString()); sneo_common.ResultItem item = ret.value; if (newlist[i].n > 0) { continue; } var value = item.subItem[0].AsString(); if (value.Length > 0)//已经标记的UTXO,不能使用 { newlist.RemoveAt(i); } } ThinNeo.Transaction tran = null; { byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(bytes)" + ThinNeo.Helper.Bytes2HexString(scripthash)); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)refund")); //参数倒序入 sb.EmitAppCall(sneo_common.sc_sneo); //nep5脚本 script = sb.ToArray(); } Console.WriteLine("contract address=" + nep55_address);//往合约地址转账 //生成交易 tran = Helper.makeTran(newlist, nep55_address, new ThinNeo.Hash256(Config.id_NEO), Decimal.Parse(refund)); tran.type = ThinNeo.TransactionType.InvocationTransaction; var idata = new ThinNeo.InvokeTransData(); tran.extdata = idata; idata.script = script; //附加鉴证 tran.attributes = new ThinNeo.Attribute[1]; tran.attributes[0] = new ThinNeo.Attribute(); tran.attributes[0].usage = ThinNeo.TransactionAttributeUsage.Script; tran.attributes[0].data = scripthash; } //sign and broadcast {//做智能合约的签名 byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushString("whatever"); sb.EmitPushNumber(250); iscript = sb.ToArray(); } tran.AddWitnessScript(n55contract, iscript); } {//做提款人的签名 var signdata = ThinNeo.Helper.Sign(tran.GetMessage(), prikey); tran.AddWitness(signdata, pubkey, address); } var trandata = tran.GetRawData(); var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata); ThinNeo.Transaction testde = new ThinNeo.Transaction(); testde.Deserialize(new System.IO.MemoryStream(trandata)); byte[] postdata; var url = Helper.MakeRpcUrlPost(Config.api, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(strtrandata)); string poststr = System.Text.Encoding.UTF8.GetString(postdata); //Console.WriteLine("-----post info begin----"); //Console.WriteLine(poststr); //Console.WriteLine("-----post info end----"); var result = await Helper.HttpPost(url, postdata); Console.WriteLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { bool bSucc = false; if (json["result"].type == MyJson.jsontype.Value_Number) { bSucc = json["result"].AsBool(); Console.WriteLine("cli=" + json["result"].ToString()); } else { var resultv = json["result"].AsList()[0].AsDict(); var txid = resultv["txid"].AsString(); bSucc = txid.Length > 0; Console.WriteLine("txid=" + txid); } if (bSucc) { lasttxid = tran.GetHash(); Nep55_1.lastNep5Tran = tran.GetHash(); Console.WriteLine("你可以从这个UTXO拿走NEO了 txid=" + lasttxid.ToString() + "[0]"); } else { lasttxid = null; } } }
async Task test_refund() { decimal amount = 0; while (true) { subPrintLine("Input amount:"); string str_amount = Console.ReadLine(); try { amount = decimal.Parse(str_amount); break; } catch (Exception e) { subPrintLine("input number"); } } string sgas_address = ThinNeo.Helper.GetAddressFromScriptHash(Config.dapp_sgas); //获取sgas合约地址的资产列表 Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(Config.api, sgas_address); if (dir.ContainsKey(Config.id_GAS) == false) { subPrintLine("no gas"); return; } List <Utxo> newlist = new List <Utxo>(dir[Config.id_GAS]); //检查sgas地址拥有的gas的utxo是否有被标记过 for (var i = newlist.Count - 1; i >= 0; i--) { byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(hex256)" + newlist[i].txid.ToString()); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)getRefundTarget")); //参数倒序入 var shash = Config.dapp_sgas; sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } if (newlist[i].n > 0) { continue; } var urlCheckUTXO = Helper.MakeRpcUrl(Config.api, "invokescript", new MyJson.JsonNode_ValueString(ThinNeo.Helper.Bytes2HexString(script))); string resultCheckUTXO = await Helper.HttpGet(urlCheckUTXO); var jsonCU = MyJson.Parse(resultCheckUTXO); var stack = jsonCU.AsDict()["result"].AsList()[0].AsDict()["stack"].AsList()[0].AsDict(); var value = stack["value"].AsString(); if (value.Length > 0)//已经标记的UTXO,不能使用 { newlist.RemoveAt(i); } } //添加系统费 Dictionary <string, List <Utxo> > dir2 = await Helper.GetBalanceByAddress(Config.api, address); List <Utxo> newlist2 = new List <Utxo>(dir2[Config.id_GAS]); ThinNeo.Transaction tran = null; { byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(bytes)" + ThinNeo.Helper.Bytes2HexString(scriptHash)); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)refund")); //参数倒序入 var shash = Config.dapp_sgas; sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } //sgas 自己给自己转账 用来生成一个utxo 合约会把这个utxo标记给发起的地址使用 tran = Helper.makeTran(newlist, sgas_address, new ThinNeo.Hash256(Config.id_GAS), (decimal)0.00000001, (decimal)0.00000001, newlist2, address); tran.type = ThinNeo.TransactionType.InvocationTransaction; var idata = new ThinNeo.InvokeTransData(); tran.extdata = idata; idata.script = script; //附加鉴证 tran.attributes = new ThinNeo.Attribute[1]; tran.attributes[0] = new ThinNeo.Attribute(); tran.attributes[0].usage = ThinNeo.TransactionAttributeUsage.Script; tran.attributes[0].data = scriptHash; } //sign and broadcast {//做智能合约的签名 byte[] sgasScript = null; { var urlgetscript = Helper.MakeRpcUrl(Config.api, "getcontractstate", new MyJson.JsonNode_ValueString(Config.dapp_sgas.ToString())); var resultgetscript = await Helper.HttpGet(urlgetscript); var _json = MyJson.Parse(resultgetscript).AsDict(); var _resultv = _json["result"].AsList()[0].AsDict(); sgasScript = ThinNeo.Helper.HexString2Bytes(_resultv["script"].AsString()); } byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushString("whatever"); sb.EmitPushNumber(250); iscript = sb.ToArray(); } tran.AddWitnessScript(sgasScript, iscript); } {//做提款人的签名 var signdata = ThinNeo.Helper.Sign(tran.GetMessage(), prikey); tran.AddWitness(signdata, pubkey, address); } var trandata = tran.GetRawData(); var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata); byte[] postdata; var url = Helper.MakeRpcUrlPost(Config.api, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(strtrandata)); var result = await Helper.HttpPost(url, postdata); subPrintLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { bool bSucc = false; if (json["result"].type == MyJson.jsontype.Value_Number) { bSucc = json["result"].AsBool(); subPrintLine("cli=" + json["result"].ToString()); } else { var resultv = json["result"].AsList()[0].AsDict(); var txid = resultv["txid"].AsString(); bSucc = txid.Length > 0; } if (bSucc) { Hash256 txid = tran.GetHash(); url = Helper.MakeRpcUrlPost(Config.api, "getrawtransaction", out postdata, new MyJson.JsonNode_ValueString(txid.ToString())); while (true) { subPrintLine("正在等待交易验证,请稍后。。。。"); result = await Helper.HttpPost(url, postdata); json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { //tx的第一个utxo就是给自己的 Utxo utxo = new Utxo(address, txid, Config.id_GAS, amount, 0); //把这个txid里的utxo[0]的value转给自己 TranGas(new List <Utxo>() { utxo }, amount); break; } await Task.Delay(5000); } } else { } } }
async Task test_claimStep3() { var addr = ThinNeo.Helper.GetAddressFromScriptHash(Config.cneo); byte[] postdata; var url = Helper.MakeRpcUrlPost(Config.api, "getclaimgas", out postdata, new MyJson.JsonNode_ValueString(addr)); var result = await Helper.HttpPost(url, postdata); //Console.WriteLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { //gas总量 var gas = json["result"].AsList()[0].AsDict()["gas"] + ""; //var gas = 0.00004; Console.WriteLine("gas:" + gas); var claims = json["result"].AsList()[0].AsDict()["claims"].AsList(); Console.WriteLine("claims:" + claims); //var assetIDStr = "0x602c79718b16e442de58778e148d0b1084e3b2dffd5de6b7b16cee7969282de7"; //选择GAS支付合约调用费用 var assetID = HexString2Bytes(Config.id_GAS.Replace("0x", "")).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(this.address), value = Decimal.Parse(gas) }; List <ThinNeo.TransactionInput> claimVins = new List <ThinNeo.TransactionInput>(); foreach (MyJson.IJsonNode j in (MyJson.JsonNode_Array)claims) { claimVins.Add(new ThinNeo.TransactionInput { hash = ThinNeo.Debug.DebugTool.HexString2Bytes((j.AsDict()["txid"].ToString()).Replace("0x", "")).Reverse().ToArray(), index = ushort.Parse(j.AsDict()["n"].ToString()) }); } (claimTran.extdata as ThinNeo.ClaimTransData).claims = claimVins.ToArray(); //做智能合约的签名 byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushString("whatever"); sb.EmitPushNumber(250); iscript = sb.ToArray(); } claimTran.AddWitnessScript(n55contract, iscript); var trandata = claimTran.GetRawData(); var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata); byte[] postdata2; url = Helper.MakeRpcUrlPost(Config.api, "sendrawtransaction", out postdata2, new MyJson.JsonNode_ValueString(strtrandata)); var result2 = await Helper.HttpPost(url, postdata2); Console.WriteLine("得到的结果是:" + result2); } }
IEnumerator HTTP_nel_post_sgas_gas2(MyJson.IJsonNode json_complete) { string txid = json_complete.AsDict()["txid"].ToString(); var nep55_shash = new ThinNeo.Hash160(global.id_sgas); string nep55_address = ThinNeo.Helper.GetAddressFromScriptHash(nep55_shash); WWWForm www_getuxo_form_2 = Helper.GetWWWFormPost("getutxo", new MyJson.JsonNode_ValueString(nep55_address)); WWW www_utxo_2 = new WWW(global.api, www_getuxo_form_2); yield return(www_utxo_2); Dictionary <string, List <Utxo> > _dir_2 = get_utxo(www_utxo_2.text); if (_dir_2.ContainsKey(global.id_GAS) == false) { Debug.Log("no gas"); } List <Utxo> newlist_2 = new List <Utxo>(); foreach (var utxo in _dir_2[global.id_GAS]) { if (utxo.n == 0 && utxo.txid.ToString().Equals(txid)) { newlist_2.Add(utxo); } } if (newlist_2.Count == 0) { Debug.Log("找不到要使用的UTXO"); yield return(null); } {//检查utxo byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(hex256)" + newlist_2[0].txid.ToString()); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)getRefundTarget")); //参数倒序入 var shash = new ThinNeo.Hash160(global.id_sgas); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } WWWForm www_getTarget_form = Helper.GetWWWFormPost("invokescript", new MyJson.JsonNode_ValueString(ThinNeo.Helper.Bytes2HexString(script))); WWW www_form = new WWW(global.api, www_getTarget_form); yield return(www_form); var jsonCU = MyJson.Parse(www_form.text); var stack = jsonCU.AsDict()["result"].AsList()[0].AsDict()["stack"].AsList()[0].AsDict(); var value = stack["value"].AsString(); if (value.Length == 0)//未标记的UTXO,不能使用 { Debug.Log("这个utxo没有标记"); yield return(null); } var hash = new ThinNeo.Hash160(ThinNeo.Helper.HexString2Bytes(value)); if (hash.ToString() != ThinNeo.Helper.GetPublicKeyHashFromAddress(roleInfo.getInstance().address).ToString()) { Debug.Log("这个utxo不是标记给你用的"); Debug.Log(hash.ToString()); Debug.Log(ThinNeo.Helper.Bytes2HexString(roleInfo.getInstance().scripthash)); yield return(null); } } ThinNeo.Transaction tran_2 = Helper.makeTran(newlist_2, roleInfo.getInstance().address, new ThinNeo.Hash256(global.id_GAS), newlist_2[0].value); tran_2.type = ThinNeo.TransactionType.ContractTransaction; tran_2.version = 0; //sign and broadcast {//做智能合约的签名 byte[] n55contract = null; { WWWForm www_getState = Helper.GetWWWFormPost("getcontractstate", new MyJson.JsonNode_ValueString(global.id_sgas)); WWW www_state = new WWW(global.api, www_getState); yield return(www_state); var _json = MyJson.Parse(www_state.text).AsDict(); var _resultv = _json["result"].AsList()[0].AsDict(); n55contract = ThinNeo.Helper.HexString2Bytes(_resultv["script"].AsString()); } byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushNumber(0); sb.EmitPushNumber(0); iscript = sb.ToArray(); } tran_2.AddWitnessScript(n55contract, iscript); } var trandata_2 = tran_2.GetRawData(); var strtrandata_2 = ThinNeo.Helper.Bytes2HexString(trandata_2); ThinNeo.Transaction testde_2 = new ThinNeo.Transaction(); testde_2.Deserialize(new System.IO.MemoryStream(trandata_2)); WWWForm www_transaction_2 = Helper.GetWWWFormPost("sendrawtransaction", new MyJson.JsonNode_ValueString(strtrandata_2)); WWW www_tran_2 = new WWW(global.api, www_transaction_2); yield return(www_tran_2); Debug.Log(www_tran_2.text); var json_2 = MyJson.Parse(www_tran_2.text).AsDict(); if (json_2.ContainsKey("result")) { var resultv = json_2["result"].AsList()[0].AsDict(); var ext = resultv["txid"].AsString(); if (txid.Length > 0) { Debug.Log("txid=" + ext); testtool.panel_main.do_plat_notify(json_complete, ext); api_tool._instance.walletNotifyExt(roleInfo.getInstance().uid, roleInfo.getInstance().token, txid, ext, global.netType, null); } else { Debug.Log("交易失败"); } } else { Debug.Log("交易失败"); } }
IEnumerator HTTP_nel_post_sgas_gas(decimal num) { var nep55_shash = new ThinNeo.Hash160(global.id_sgas); string nep55_address = ThinNeo.Helper.GetAddressFromScriptHash(nep55_shash); WWWForm www_getuxo_form = Helper.GetWWWFormPost("getutxo", new MyJson.JsonNode_ValueString(nep55_address)); WWW www = new WWW(global.api, www_getuxo_form); yield return(www); Dictionary <string, List <Utxo> > _dir = get_utxo(www.text); if (_dir.ContainsKey(global.id_GAS) == false) { Debug.Log("no gas"); } List <Utxo> newlist = new List <Utxo>(_dir[global.id_GAS]); for (var i = newlist.Count - 1; i >= 0; i--) { Debug.Log(newlist[i].txid.ToString()); byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(hex256)" + newlist[i].txid.ToString()); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)getRefundTarget")); //参数倒序入 var shash = new ThinNeo.Hash160(global.id_sgas); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } if (newlist[i].n > 0) { continue; } WWWForm www_getTarget_form = Helper.GetWWWFormPost("invokescript", new MyJson.JsonNode_ValueString(ThinNeo.Helper.Bytes2HexString(script))); WWW www_form = new WWW(global.api, www_getTarget_form); yield return(www_form); var jsonCU = MyJson.Parse(www_form.text); var stack = jsonCU.AsDict()["result"].AsList()[0].AsDict()["stack"].AsList()[0].AsDict(); var value = stack["value"].AsString(); if (value.Length > 0)//已经标记的UTXO,不能使用 { newlist.RemoveAt(i); } } string paparms; ThinNeo.Transaction tran = null; { byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(bytes)" + ThinNeo.Helper.Bytes2HexString(roleInfo.getInstance().scripthash)); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)refund")); //参数倒序入 var shash = new ThinNeo.Hash160(global.id_sgas); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); //拼接发给后台做验证的json字符串 MyJson.JsonNode_Object account = new MyJson.JsonNode_Object(); account["sbParamJson"] = array; account["sbPushString"] = new MyJson.JsonNode_ValueString("refund"); account["nnc"] = new MyJson.JsonNode_ValueString(global.id_sgas); account["cnts"] = new MyJson.JsonNode_ValueString(num.ToString()); paparms = account.ToString(); } //生成交易 tran = Helper.makeTran(newlist, nep55_address, new ThinNeo.Hash256(global.id_GAS), num); tran.type = ThinNeo.TransactionType.InvocationTransaction; var idata = new ThinNeo.InvokeTransData(); tran.extdata = idata; idata.script = script; //附加鉴证 tran.attributes = new ThinNeo.Attribute[1]; tran.attributes[0] = new ThinNeo.Attribute(); tran.attributes[0].usage = ThinNeo.TransactionAttributeUsage.Script; tran.attributes[0].data = roleInfo.getInstance().scripthash; } //sign and broadcast {//做智能合约的签名 byte[] n55contract = null; { WWWForm www_getState = Helper.GetWWWFormPost("getcontractstate", new MyJson.JsonNode_ValueString(global.id_sgas)); WWW www_state = new WWW(global.api, www_getState); yield return(www_state); var _json = MyJson.Parse(www_state.text).AsDict(); var _resultv = _json["result"].AsList()[0].AsDict(); n55contract = ThinNeo.Helper.HexString2Bytes(_resultv["script"].AsString()); } byte[] iscript = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushString("whatever"); sb.EmitPushNumber(250); iscript = sb.ToArray(); } tran.AddWitnessScript(n55contract, iscript); } {//做提款人的签名 var signdata = ThinNeo.Helper.Sign(tran.GetMessage(), roleInfo.getInstance().prikey); tran.AddWitness(signdata, roleInfo.getInstance().pubkey, roleInfo.getInstance().address); } var trandata = tran.GetRawData(); var strtrandata = ThinNeo.Helper.Bytes2HexString(trandata); ThinNeo.Transaction testde = new ThinNeo.Transaction(); testde.Deserialize(new System.IO.MemoryStream(trandata)); WWWForm www_transaction = Helper.GetWWWFormPost("sendrawtransaction", new MyJson.JsonNode_ValueString(strtrandata)); WWW www_tran = new WWW(global.api, www_transaction); yield return(www_tran); Debug.Log(www_tran.text); var json = MyJson.Parse(www_tran.text).AsDict(); ThinNeo.Hash256 lasttxid = null; if (json.ContainsKey("result")) { bool bSucc = false; if (json["result"].type == MyJson.jsontype.Value_Number) { bSucc = json["result"].AsBool(); Debug.Log("cli=" + json["result"].ToString()); } else { var resultv = json["result"].AsList()[0].AsDict(); var txid = resultv["txid"].AsString(); bSucc = txid.Length > 0; } if (bSucc) { lasttxid = tran.GetHash(); Debug.Log("你可以从这个UTXO拿走GAS了 txid=" + lasttxid.ToString() + "[0]"); api_tool._instance.addUserWalletLogs(roleInfo.getInstance().uid, roleInfo.getInstance().token, lasttxid.ToString(), "0", num.ToString(), "2", paparms, global.netType, "0", (bool timeout1, WWW www1) => { testtool.panel_main.on_refresh_WalletListss(); testtool.panel_main.on_refresh_plat_NotifyList(); }); } else { lasttxid = null; } } }