//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); }
public JObject claimContract2(string mongodbConnStr, string mongodbDatabase, string conAddr, string addrClaim, string url, string hash) { JObject claimGas = getClaimGas(mongodbConnStr, mongodbDatabase, conAddr, true); 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(); 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"]); } else { Console.WriteLine("errorMessage:" + (string)result["errorMessage"]); } return(result); }
public async Task <byte[]> MakeScript(bool sign) { var payaddr = label_addr.Text; var paygas = 0.001; var utxos = await Demo.Helper.GetUtxosToPay(api, payaddr, id_GAS, paygas); if (utxos.Count == 0) { MessageBox.Show("you do not have gas for sendraw."); return(null); } var asset = listAsset.SelectedItem as Asset; if (asset == null || asset.isnep5 == false) { MessageBox.Show("this is not a nep5"); return(null); } var targetaddr = txt_get_addr.Text; var targetbalance = double.Parse(txt_get_balance.Text); for (var i = 0; i < asset.decimals; i++) { targetbalance *= 10; } if (sign) { var paywif = txt_wifGetter.Text; var prikey = ThinNeo.Helper.GetPrivateKeyFromWIF(paywif); var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey); var address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); if (address != payaddr) { MessageBox.Show("error wif for pubkey in lock contract."); return(null); } } //MakeTran ThinNeo.Transaction tran = null; { byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(addr)" + address_LockContract); //from array.AddArrayValue("(addr)" + targetaddr); //to array.AddArrayValue("(int)" + (ulong)targetbalance); //value sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)transfer")); //参数倒序入 ThinNeo.Hash160 shash = new ThinNeo.Hash160(asset.assetID); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } tran = Demo.Helper.makeTran(null, payaddr, new ThinNeo.Hash256(id_GAS), 0, (decimal)0.001, utxos, payaddr); 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_LockContract; } if (sign) { var paywif = txt_wifGetter.Text; var prikey = ThinNeo.Helper.GetPrivateKeyFromWIF(paywif); var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey); var address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); ////sign var signdata = ThinNeo.Helper.Sign(tran.GetMessage(), prikey); tran.AddWitness(signdata, pubkey, address); var sb2 = new ThinNeo.ScriptBuilder(); sb2.EmitPushBytes(signdata); var iscript = sb2.ToArray(); tran.AddWitnessScript(script_LockContract, iscript); return(tran.GetRawData()); } else { return(tran.GetMessage()); } }
async public Task Demo() { byte[] prikey = ThinNeo.Helper.GetPrivateKeyFromWIF(Nep55_1.testwif); byte[] pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey); string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); var scripthash = ThinNeo.Helper.GetPublicKeyHashFromAddress(address); var nep55_shash = new ThinNeo.Hash160(Nep55_1.nep55); string nep55_address = ThinNeo.Helper.GetAddressFromScriptHash(nep55_shash); Console.WriteLine("address=" + address); //获取地址的资产列表 Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(Nep55_1.api, nep55_address); if (dir.ContainsKey(Nep55_1.id_GAS) == false) { Console.WriteLine("no gas"); return; } List <Utxo> newlist = new List <Utxo>(dir[Nep55_1.id_GAS]); 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 = new ThinNeo.Hash160(Nep55_1.nep55); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } if (newlist[i].n > 0) { continue; } var urlCheckUTXO = Helper.MakeRpcUrl(Nep55_1.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); } } 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 = new ThinNeo.Hash160(Nep55_1.nep55); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } Console.WriteLine("contract address=" + nep55_address);//往合约地址转账 //生成交易 tran = Helper.makeTran(newlist, nep55_address, new ThinNeo.Hash256(Nep55_1.id_GAS), (decimal)2.1); 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[] n55contract = null; { var urlgetscript = Helper.MakeRpcUrl(Nep55_1.api, "getcontractstate", new MyJson.JsonNode_ValueString(Nep55_1.nep55)); var resultgetscript = await Helper.HttpGet(urlgetscript); var _json = MyJson.Parse(resultgetscript).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(), 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(Nep55_1.api, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(strtrandata)); //bug //sendraw api 有bug,所以先加这个 //url = "http://localhost:20332"; 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拿走GAS了 txid=" + lasttxid.ToString() + "[0]"); } else { lasttxid = null; } } }
async public Task Demo() { var lasthash = "0x0963614006fda9ebb3ecbc1a7bd604a393cfe66cf9234882abc860cdb4694970"; if (lasthash == null) { Console.WriteLine("你还没有正确执行N5 3"); return; } byte[] prikey = ThinNeo.Helper.GetPrivateKeyFromWIF(Nep55_1.testwif); byte[] pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey); string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); var scripthash = ThinNeo.Helper.GetPublicKeyHashFromAddress(address); var nep55_shash = new ThinNeo.Hash160(Nep55_1.nep55); string nep55_address = ThinNeo.Helper.GetAddressFromScriptHash(nep55_shash); Console.WriteLine("address=" + address); //获取地址的资产列表 Dictionary <string, List <Utxo> > dir = await Helper.GetBalanceByAddress(Nep55_1.api, nep55_address); if (dir.ContainsKey(Nep55_1.id_GAS) == false) { Console.WriteLine("no gas"); return; } List <Utxo> newlist = new List <Utxo>(); foreach (var utxo in dir[Nep55_1.id_GAS]) { if (utxo.n == 0 && utxo.txid.ToString().Equals(lasthash)) { newlist.Add(utxo); } } if (newlist.Count == 0) { Console.WriteLine("找不到要使用的UTXO"); return; } {//检查utxo byte[] script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(hex256)" + newlist[0].txid.ToString()); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)getRefundTarget")); //参数倒序入 var shash = new ThinNeo.Hash160(Nep55_1.nep55); sb.EmitAppCall(shash); //nep5脚本 script = sb.ToArray(); } var urlCheckUTXO = Helper.MakeRpcUrl(Nep55_1.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,不能使用 { Console.WriteLine("这个utxo没有标记"); return; } var hash = new ThinNeo.Hash160(ThinNeo.Helper.HexString2Bytes(value)); //if (hash.ToString()!= scripthash.ToString()) //{ // Console.WriteLine("这个utxo不是标记给你用的"); // return; //} } ThinNeo.Transaction tran = Helper.makeTran(newlist, address, new ThinNeo.Hash256(Nep55_1.id_GAS), newlist[0].value); tran.type = ThinNeo.TransactionType.ContractTransaction; tran.version = 0; //sign and broadcast {//做智能合约的签名 byte[] n55contract = null; { var urlgetscript = Helper.MakeRpcUrl(Nep55_1.api, "getcontractstate", new MyJson.JsonNode_ValueString(Nep55_1.nep55)); var resultgetscript = await Helper.HttpGet(urlgetscript); var _json = MyJson.Parse(resultgetscript).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.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(Nep55_1.api, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(strtrandata)); //bug //sendraw api 有bug,所以先加这个 //url = "http://localhost:20332"; 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()); } } }