public JObject callContractForTestMulti(string neoCliJsonRPCUrl, List <string> scripthashs, JArray paramsJA) { JObject res = new JObject(); JArray stackList = new JArray(); int n = 0; foreach (var scripthash in scripthashs) { ThinNeo.ScriptBuilder tmpSb = new ThinNeo.ScriptBuilder(); httpHelper hh = new httpHelper(); var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList(); var list = json.AsList(); for (int i = list.Count - 1; i >= 0; i--) { tmpSb.EmitParamJson(list[i]); } var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray(); tmpSb.EmitAppCall(scripthashReverse); string invokeSc = ThinNeo.Helper.Bytes2HexString(tmpSb.ToArray()); JObject invokeRs = invokeScript(neoCliJsonRPCUrl, invokeSc); /** * JObject 不能存放相同字段,为将其与其他接口调用区分开来,现单端改名为-Multi结尾的方法 */ /* * res.Add("script", invokeRs["script"]); * res.Add("state", invokeRs["state"]); * res.Add("gas_consumed", invokeRs["gas_consumed"]); */ JObject stack1 = null; if (invokeRs == null) { stack1 = new JObject(); stack1.Add("type", "FAULT"); stack1.Add("value", ""); stackList.Add(stack1); continue; } string state = invokeRs["state"].ToString(); JArray stack = (JArray)invokeRs["stack"]; if (state.StartsWith("FAULT")) { // 调用合约出错,填充占位 stack1 = new JObject(); stack1.Add("type", "FAULT"); stack1.Add("value", ""); } else { stack1 = (JObject)stack[0]; } stack1["hash"] = scripthash; stackList.Add(stack1); } res.Add("stack", stackList); return(res); }
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 getContractState(string neoCliJsonRPCUrl, string scripthash) { httpHelper hh = new httpHelper(); var resp = hh.Post(neoCliJsonRPCUrl, "{'jsonrpc':'2.0','method':'getcontractstate','params':['" + scripthash + "'],'id':1}", System.Text.Encoding.UTF8, 1); JObject resultJ = (JObject)JObject.Parse(resp)["result"]; return(resultJ); }
public JObject invokeScript(string neoCliJsonRPCUrl, string script) { httpHelper hh = new httpHelper(); var resp = hh.Post(neoCliJsonRPCUrl, "{'jsonrpc':'2.0','method':'invokescript','params':['" + script + "'],'id':1}", System.Text.Encoding.UTF8, 1); JObject resultJ = (JObject)JObject.Parse(resp)["result"]; return(resultJ); }
public JObject callContractForTest(string neoCliJsonRPCUrl, List <string> scripthashs, JArray paramsJA) { //string script = (string)getContractState(neoCliJsonRPCUrl, scripthash)["script"]; /* * int n = 0; * ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder(); * * foreach (var scripthash in scripthashs) * { * * httpHelper hh = new httpHelper(); * * var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList(); * * var list = json.AsList(); * for (int i = list.Count - 1; i >= 0; i--) * { * sb.EmitParamJson(list[i]); * } * * var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray(); * sb.EmitAppCall(scripthashReverse); * * n++; * } * * string scriptPlusParams = ThinNeo.Helper.Bytes2HexString(sb.ToArray()); * return invokeScript(neoCliJsonRPCUrl, scriptPlusParams); */ /// ChangeLog: /// 批量调用invokeScript时,个别出错会导致,出错之后结果数据丢失。所以修改为单个单个查询, /// 为保证外层解析数据的顺序性,需将出错的结果位置填充数值 /// JObject res = new JObject(); JArray stackList = new JArray(); int n = 0; foreach (var scripthash in scripthashs) { ThinNeo.ScriptBuilder tmpSb = new ThinNeo.ScriptBuilder(); httpHelper hh = new httpHelper(); var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList(); var list = json.AsList(); for (int i = list.Count - 1; i >= 0; i--) { tmpSb.EmitParamJson(list[i]); } var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray(); tmpSb.EmitAppCall(scripthashReverse); string invokeSc = ThinNeo.Helper.Bytes2HexString(tmpSb.ToArray()); JObject invokeRs = invokeScript(neoCliJsonRPCUrl, invokeSc); res.Add("script", invokeRs["script"]); res.Add("state", invokeRs["state"]); res.Add("gas_consumed", invokeRs["gas_consumed"]); string state = invokeRs["state"].ToString(); JArray stack = (JArray)invokeRs["stack"]; JObject stack1 = null; if (state.StartsWith("FAULT")) { // 调用合约出错,填充占位 stack1 = new JObject(); stack1.Add("type", "FAULT"); stack1.Add("value", ""); } else { stack1 = (JObject)stack[0]; } stackList.Add(stack1); } res.Add("stack", stackList); // debug info /* * n = 0; * List<JObject> rlist = new List<JObject>(); * foreach (var scripthash in scripthashs) * { * ThinNeo.ScriptBuilder tmpSb = new ThinNeo.ScriptBuilder(); * httpHelper hh = new httpHelper(); * var json = MyJson.Parse(JsonConvert.SerializeObject(paramsJA[n])).AsList(); * var list = json.AsList(); * for (int i = list.Count - 1; i >= 0; i--) * { * tmpSb.EmitParamJson(list[i]); * } * var scripthashReverse = ThinNeo.Helper.HexString2Bytes(scripthash).Reverse().ToArray(); * tmpSb.EmitAppCall(scripthashReverse); * string invokeSc = ThinNeo.Helper.Bytes2HexString(tmpSb.ToArray()); * JObject invokeRs = invokeScript(neoCliJsonRPCUrl, invokeSc); * JObject obj = new JObject(); * obj.Add("sc", scripthash); * obj.Add("ic", invokeSc); * obj.Add("rs", invokeRs); * rlist.Add(obj); * } */ return(res); }