public JArray getnep5decimals(string nep5Hash) { //Console.WriteLine("assetid:" + nep5Hash); string script = null; using (var sb = new ThinNeo.ScriptBuilder()) { ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep5Hash); sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals")); sb.EmitAppCall(shash); var data = sb.ToArray(); script = ThinNeo.Helper.Bytes2HexString(data); } var res = Rpc.invokescript(this.neoCliJsonRPCUrl, script).Result; var arr = res.GetDictItem("stack").AsList().ToArray(); //Console.WriteLine("rpc info:"+ arr[0].ToString()); var decimalString = arr[0].AsDict()["value"].AsString(); int decimals = int.Parse(decimalString); return(new JArray(new JObject() { { "value", decimals } })); }
static async void invokescript(string avmPath, string rpcurl) { //从文件中读取合约脚本 byte[] script = System.IO.File.ReadAllBytes(avmPath); //这里填你的合约所在地址 byte[] parameter__list = new byte[0]; using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder()) { //倒叙插入数据 //sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply")); var nnc = ThinNeo.Helper.GetScriptHashFromScript(script); var scriptaddress = new ThinNeo.Hash160(nnc); sb.EmitAppCall(scriptaddress); //sb.EmitPushBytes(script); //ThinNeo.Hash160 shash = new ThinNeo.Hash160(scripthash.Replace("0x", "")); //sb.EmitAppCall(script);//nep5脚本 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); Console.WriteLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict()["result"].AsDict(); printByteArray(json); } }
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) { 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)); }
private void Button_Click_2(object sender, RoutedEventArgs e) { int need_storage = iStorage.IsChecked == true ? 1 : 0; int need_nep4 = iDyncall.IsChecked == true ? 2 : 0; int can_charge = iCharge.IsChecked == true ? 4 : 0; ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder(); //倒叙插入数据 var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(bytes)" + this.asmBinText.Text); array.AddArrayValue("(bytes)" + iPList.Text); array.AddArrayValue("(bytes)" + iRType.Text); array.AddArrayValue("(int)" + (need_storage | need_nep4 | can_charge)); array.AddArrayValue("(str)" + iName.Text); //name array.AddArrayValue("(str)" + iVersion.Text); //version array.AddArrayValue("(str)" + iAuthor.Text); //author array.AddArrayValue("(str)" + iEmail.Text); //email array.AddArrayValue("(str)" + iDescription.Text); //desc sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)upgrade")); //参数倒序入 var shash = new ThinNeo.Hash160(iOldScHash.Text);; sb.EmitAppCall(shash); this.script = sb.ToArray(); this.DialogResult = true; }
void threadCheckTx() { while (true) { foreach (var item in mapTxState) { var txid = item.Key; var sb = new ThinNeo.ScriptBuilder(); MyJson.JsonNode_Array array = new MyJson.JsonNode_Array(); array.AddArrayValue("(hex256)" + txid); //array.AddArrayValue(new MyJson.JsonNode_Array()); sb.EmitParamJson(array); sb.EmitPushString("getcallstate"); ThinNeo.Hash160 contractaddr = new ThinNeo.Hash160("0x24192c2a72e0ce8d069232f345aea4db032faf72"); sb.EmitAppCall(contractaddr); var script = sb.ToArray(); var result = CallScript(script); if (!string.IsNullOrEmpty(result[0]["value"].ToString())) { item.Value.state = (int)result[0]["value"][0]["value"]; } } System.Threading.Thread.Sleep(1000); } }
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); }
void dapp_EmitParam(ThinNeo.ScriptBuilder sb, MyJson.IJsonNode param) { if (param is MyJson.JsonNode_ValueNumber)//bool 或小整数 { sb.EmitParamJson(param); } else if (param is MyJson.JsonNode_Array) { var list = param.AsList(); for (var i = list.Count - 1; i >= 0; i--) { dapp_EmitParam(sb, list[i]); } sb.EmitPushNumber(param.AsList().Count); sb.Emit(ThinNeo.VM.OpCode.PACK); } else if (param is MyJson.JsonNode_ValueString)//复杂格式 { var str = param.AsString(); var bytes = dapp_getCallParam(str); sb.EmitPushBytes(bytes); } else { throw new Exception("should not pass a {}"); } }
private void Button_Click_2(object sender, RoutedEventArgs e) { ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder(); sb.EmitPushString(iDescription.Text); sb.EmitPushString(iEmail.Text); sb.EmitPushString(iAuthor.Text); sb.EmitPushString(iVersion.Text); sb.EmitPushString(iName.Text); int need_storage = iStorage.IsChecked == true ? 1 : 0; int need_nep4 = iDyncall.IsChecked == true ? 2 : 0; sb.EmitPushNumber(need_storage | need_nep4); var br = ThinNeo.Helper.HexString2Bytes(iRType.Text); var bp = ThinNeo.Helper.HexString2Bytes(iPList.Text); sb.EmitPushBytes(br); sb.EmitPushBytes(bp); var _ss = ThinNeo.Helper.HexString2Bytes(this.asmBinText.Text); sb.EmitPushBytes(_ss); sb.EmitSysCall("Neo.Contract.Create"); //sb.EmitSysCall("Neo.Contract.Create", script, parameter_list, return_type, need_storage | need_nep4, name, version, author, email, description); this.script = sb.ToArray(); this.DialogResult = true; }
//增加个人账户见证人(就是用这个人的私钥对交易签个名,signdata传进来) public void AddWitness(byte[] signdata, byte[] pubkey, string addrs) { {//额外的验证 byte[] msg = null; using (var ms = new System.IO.MemoryStream()) { SerializeUnsigned(ms); msg = ms.ToArray(); } bool bsign = ThinNeo.Helper.VerifySignature(msg, signdata, pubkey); if (bsign == false) { throw new Exception("wrong sign"); } var addr = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); if (addr != addrs) { throw new Exception("wrong script"); } } var vscript = ThinNeo.Helper.GetScriptFromPublicKey(pubkey); //iscript 对个人账户见证人他是一条pushbytes 指令 var sb = new ThinNeo.ScriptBuilder(); sb.EmitPushBytes(signdata); var iscript = sb.ToArray(); AddWitnessScript(vscript, iscript); }
private void Button_Click_1(object sender, RoutedEventArgs e) { try { this.asmList.Items.Clear(); var json = MyJson.Parse(jsonParam.Text).AsList(); jsonParam.Foreground = new SolidColorBrush(Color.FromRgb(0, 0, 0)); ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder(); var list = json.AsList(); for (int i = list.Count - 1; i >= 0; i--) { sb.EmitParamJson(list[i]); } var scripthash = ThinNeo.Helper.HexString2Bytes(textScriptHash.Text).Reverse().ToArray(); sb.EmitAppCall(scripthash); this.script = sb.ToArray(); var ops = ThinNeo.Compiler.Avm2Asm.Trans(this.script); for (int i = 0; i < ops.Length; i++) { this.asmList.Items.Add(ops[i]); } this.asmBinText.Text = ThinNeo.Helper.Bytes2HexString(sb.ToArray()); } catch { jsonParam.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0)); } }
//async public static Task<MyJson.JsonNode_Object> callcontractfortest(string url,string method) //{ // var gstr = MakeRpcUrlPost("getfullloginfo", txid); // try // { // var str = await postData(url, gstr); // var json = MyJson.Parse(str); // var result = json.AsDict().GetDictItem("result") as MyJson.JsonNode_Object; // return result; // } // catch (Exception err) // { // var errorMsg = "failed to call contract for test.Info:" + err.ToString(); // Console.WriteLine(errorMsg); // Log.WriteLog(errorMsg); // return null; // } //} async public static Task <MyJson.JsonNode_Object> invokescript(string url, string scripthash, string method) { var sb = new ThinNeo.ScriptBuilder(); ThinNeo.Hash160 shash = new ThinNeo.Hash160(scripthash); sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)" + method)); //调用的方法 sb.EmitAppCall(shash); //nep5脚本 var data = sb.ToArray(); var script = ThinNeo.Helper.Bytes2HexString(data); var urldata = MakeRpcUrlPost("invokescript", script); try { var str = await postData(url, urldata); var json = MyJson.Parse(str); if (json.AsDict().ContainsKey("error")) { return(json.AsDict()["error"] as MyJson.JsonNode_Object); } var result = json.AsDict().GetDictItem("result") as MyJson.JsonNode_Object; return(result); } catch (Exception err) { var errorMsg = "failed to invokescript method:" + method + ".Info:" + err.ToString(); Console.WriteLine(errorMsg); return(null); } }
public void NeoTransfer() { byte[] prikey = ThinNeo.Helper.GetPrivateKeyFromWIF(wif); var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey); var address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(addr)" + from); array.AddArrayValue("(addr)" + "AMjCDmrbfcBxGPitHcdrUYRyPXD7DfC52c");//NeoBank address AMjCDmrbfcBxGPitHcdrUYRyPXD7DfC52c 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("0x04e31cee0443bb916534dad2adf508458920e66d")); //nep5脚本 script = sb.ToArray(); } ThinNeo.Transaction tran = new Transaction(); tran.inputs = new ThinNeo.TransactionInput[0]; tran.outputs = new TransactionOutput[0]; tran.attributes = new ThinNeo.Attribute[1]; tran.attributes[0] = new ThinNeo.Attribute(); tran.attributes[0].usage = TransactionAttributeUsage.Script; tran.attributes[0].data = ThinNeo.Helper.GetPublicKeyHashFromAddress(address); tran.version = 1; tran.type = ThinNeo.TransactionType.InvocationTransaction; var idata = new ThinNeo.InvokeTransData(); tran.extdata = idata; idata.script = script; idata.gas = 0; 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 = MakeRpcUrlPost(NeoRpcUrl, "sendrawtransaction", out postdata, new MyJson.JsonNode_ValueString(rawdata)); var result = HttpPost(url, postdata); Console.WriteLine(result + " txid: " + txid); return(result); }
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); }
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()); } }
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 nep52(string rpcurl, string avmPath, string address) { //从文件中读取合约脚本 byte[] script = System.IO.File.ReadAllBytes(avmPath); //这里填你的合约所在地址 //string nnc = "0x460b89c3c8d31528b9e90d9baff9de31f6ddb6c6".Replace("0x", ""); string scripthash = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitParamJson(new MyJson.JsonNode_Array()); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)name")); //参数倒序入 //ThinNeo.Hash160 shash = new ThinNeo.Hash160(nnc); var shash = ThinNeo.Helper.GetScriptHashFromScript(script); sb.EmitAppCall(shash);//nep5脚本 sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)symbol")); sb.EmitAppCall(shash); sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals")); sb.EmitAppCall(shash); //sb.EmitParamJson(new MyJson.JsonNode_Array()); //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply")); //sb.EmitAppCall(shash); //var array = new MyJson.JsonNode_Array(); //array.AddArrayValue("(addr)" + address);//from //sb.EmitParamJson(array);//参数倒序入 //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)balanceOf"));//参数倒序入 //sb.EmitAppCall(shash); var data = sb.ToArray(); scripthash = ThinNeo.Helper.Bytes2HexString(data); } //var url = Helper.MakeRpcUrl(api, "invokescript", new MyJson.JsonNode_ValueString(script)); //string result = await Helper.HttpGet(url); byte[] postdata; var url = Helper.MakeRpcUrlPost(rpcurl, "invokescript", out postdata, new MyJson.JsonNode_ValueString(scripthash)); var result = await Helper.HttpPost(url, postdata); Console.WriteLine("得到的结果是:" + result); var continer = MyJson.Parse(result).AsDict(); if (continer.ContainsKey("result")) { var json = continer["result"].AsDict(); printByteArray(json); } }
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); } }
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 void FillRaw() { this.txraw.witnesses = new ThinNeo.Witness[keyinfos.Count]; List <KeyInfo> keys = new List <KeyInfo>(); foreach (var key in keyinfos) { keys.Add(key.Value); } //keys 這個需要排序 for (var i = 0; i < keys.Count; i++) { this.txraw.witnesses[i] = new ThinNeo.Witness(); if (keys[i].type == KeyType.Simple) { //算出vscript this.txraw.witnesses[i].VerificationScript = ThinNeo.Helper.GetScriptFromPublicKey(keys[i].pubkey); using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushBytes(keys[i].signdata[0]); this.txraw.witnesses[i].InvocationScript = sb.ToArray(); } } if (keys[i].type == KeyType.MultiSign) { //算出vscript this.txraw.witnesses[i].VerificationScript = keys[i].MultiSignKey.GetMultiContract(); List <byte[]> signs = new List <byte[]>(); foreach (var s in keys[i].signdata) { if (s != null && s.Length > 0) { signs.Add(s); } } //?這個signs 要不要倒序?试一试 using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder()) { for (var iss = 0; iss < keys[i].MultiSignKey.MKey_NeedCount; iss++) { sb.EmitPushBytes(signs[iss]); } this.txraw.witnesses[i].InvocationScript = sb.ToArray(); } } } }
public JObject publishContractForTest(string neoCliJsonRPCUrl, string avmHexstring, JObject infoJ) { string cName = (string)infoJ["cName"]; string cVersion = (string)infoJ["cVersion"]; string cAuthor = (string)infoJ["cAuthor"]; string cEmail = (string)infoJ["cEmail"]; string cDescription = (string)infoJ["cDescription"]; bool iStorage = (bool)infoJ["iStorage"]; bool iDyncall = (bool)infoJ["iDyncall"]; string inputParamsType = (string)infoJ["inputParamsType"]; string outputParamsType = (string)infoJ["outputParamsType"]; //实例化脚本构造器 ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder(); //加入合约基本信息 sb.EmitPushString(cDescription); sb.EmitPushString(cEmail); sb.EmitPushString(cAuthor); sb.EmitPushString(cVersion); sb.EmitPushString(cName); //加入是否需要私有存储区、是否需要动态合约调用信息 int need_storage = iStorage == true ? 1 : 0; int need_nep4 = iDyncall == true ? 2 : 0; sb.EmitPushNumber(need_storage | need_nep4);//二进制或操作 //加入输入输出参数类型信息 var outputType = ThinNeo.Helper.HexString2Bytes(outputParamsType); var inputType = ThinNeo.Helper.HexString2Bytes(inputParamsType); sb.EmitPushBytes(outputType); sb.EmitPushBytes(inputType); //加入合约编译后二进制码 var contractScript = ThinNeo.Helper.HexString2Bytes(avmHexstring); sb.EmitPushBytes(contractScript); sb.EmitSysCall("Neo.Contract.Create"); string scriptPublish = ThinNeo.Helper.Bytes2HexString(sb.ToArray()); //调用cli RPC 用neoVM试运行,并获得费用估算 return(invokeScript(neoCliJsonRPCUrl, scriptPublish)); }
decimal rpc_getNep5Balance(string nep5asset) { //make callscript var pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(this.privatekey); var pubkeyhash = ThinNeo.Helper.GetScriptHashFromPublicKey(pubkey); var asset = ThinNeo.Helper.HexString2Bytes(nep5asset); ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder(); sb.EmitPushBytes(pubkeyhash); sb.EmitPushNumber(1); sb.Emit(ThinNeo.VM.OpCode.PACK); sb.EmitPushString("balanceOf"); //name//totalSupply//symbol//decimals sb.EmitAppCall(asset.Reverse().ToArray()); var nep5 = Tools.CoinTool.assetNep5[nep5asset]; var symbol = ThinNeo.Helper.Bytes2HexString(sb.ToArray()); var str = WWW.MakeRpcUrl(labelRPC.Text, "invokescript", new MyJson.JsonNode_ValueString(symbol)); var resultstr = WWW.GetWithDialog(this, str); var json = MyJson.Parse(resultstr).AsDict()["result"].AsDict(); if (json["state"].AsString().Contains("HALT") == false) { throw new Exception("error state"); } var value = json["stack"].AsList()[0].AsDict(); decimal outvalue = 0; if (value["type"].AsString() == "Integer") { outvalue = decimal.Parse(value["value"].AsString()); } else { var bts = ThinNeo.Helper.HexString2Bytes(value["value"].AsString()); var bi = new System.Numerics.BigInteger(bts); outvalue = (decimal)bi; } for (var i = 0; i < nep5.decimals; i++) { outvalue /= 10; } return(outvalue); }
public byte[] GetMultiContract() { if (!(1 <= this.MKey_NeedCount && MKey_NeedCount <= MKey_Pubkeys.Count && MKey_Pubkeys.Count <= 1024)) { throw new ArgumentException(); } using (ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder()) { sb.EmitPushNumber(MKey_NeedCount); foreach (var pkey in this.MKey_Pubkeys) { sb.EmitPushBytes(pkey); } sb.EmitPushNumber(MKey_Pubkeys.Count); sb.Emit(ThinNeo.VM.OpCode.CHECKMULTISIG); return(sb.ToArray()); } }
string getInvokescript() { var shash = nnc_shash; var sb = new ThinNeo.ScriptBuilder(); sb.EmitParamJson(MyJson.Parse("[]")); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)" + decimals)); sb.EmitAppCall(shash); //sb.EmitParamJson(MyJson.Parse("[]")); //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)symbol")); //sb.EmitAppCall(shash); //sb.EmitParamJson(MyJson.Parse("[]")); //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals")); //sb.EmitAppCall(shash); //sb.EmitParamJson(MyJson.Parse("[]")); //sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply")); //sb.EmitAppCall(shash); var data = sb.ToArray(); //合约 var script = ThinNeo.Helper.Bytes2HexString(data); var str = "{\"jsonrpc\":\"2.0\",\"method\":\"invokescript\",\"id\":1,\"params\":[\"" + script + "\"]}"; WebClient wc = new WebClient(); byte[] sendData = Encoding.GetEncoding("UTF-8").GetBytes(MyJson.Parse(str).ToString()); wc.Headers.Add("Content-Type", "application/json"); byte[] recData = wc.UploadData("http://localhost:20332/", "POST", sendData); var info = Encoding.GetEncoding("UTF-8").GetString(recData); var json = MyJson.Parse(info) as MyJson.JsonNode_Object; //var stack = json.GetDictItem("result").GetDictItem("stack"); //string byte1 = stack.GetArrayItem(0).GetDictItem("value").ToString(); //byte1 = Encoding.UTF8.GetString(ThinNeo.Helper.HexString2Bytes(byte1)); return(json.ToString()); }
public JArray getAddressNep5Asset(string address, string nep5Hash) { string script = null; using (var sb = new ThinNeo.ScriptBuilder()) { ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep5Hash); MyJson.JsonNode_Array JAParams = new MyJson.JsonNode_Array(); JAParams.Add(new MyJson.JsonNode_ValueString("(address)" + address)); sb.EmitParamJson(JAParams); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)balanceOf")); sb.EmitAppCall(shash); sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals")); sb.EmitAppCall(shash); var data = sb.ToArray(); script = ThinNeo.Helper.Bytes2HexString(data); } var res = Rpc.invokescript(this.neoCliJsonRPCUrl, script).Result; var arr = res.GetDictItem("stack").AsList().ToArray(); var valueString = arr[0].AsDict()["value"].AsString(); var decimalString = arr[1].AsDict()["value"].AsString(); int decimals = int.Parse(decimalString); //-----------精度 //string findStr = "{{assetid:'{0}'}}"; //findStr = string.Format(findStr, nep5Hash); //JArray utxoArr=mh.GetData(Block_mongodbConnStr, Block_mongodbDatabase, "NEP5asset", findStr); //int decimals=(int)((JObject)utxoArr[0])["decimals"]; decimal value = decimal.Parse(Number.getNumStrFromHexStr(valueString, decimals)); return(new JArray(new JObject() { { "value", value } })); }
static byte[] createNep5FindScript(string _assetid) { var asset = ThinNeo.Helper.HexString2Bytes(_assetid); ThinNeo.ScriptBuilder sb = new ThinNeo.ScriptBuilder(); sb.EmitPushNumber(0); sb.Emit(ThinNeo.VM.OpCode.PACK); sb.EmitPushString("name"); //name//totalSupply//symbol//decimals sb.EmitAppCall(asset.Reverse().ToArray()); sb.EmitPushNumber(0); sb.Emit(ThinNeo.VM.OpCode.PACK); sb.EmitPushString("symbol"); //name//totalSupply//symbol//decimals sb.EmitAppCall(asset.Reverse().ToArray()); sb.EmitPushNumber(0); sb.Emit(ThinNeo.VM.OpCode.PACK); sb.EmitPushString("decimals"); //name//totalSupply//symbol//decimals sb.EmitAppCall(asset.Reverse().ToArray()); return(sb.ToArray()); }
async public Task Demo() { string nnc = "0x3fccdb91c9bb66ef2446010796feb6ca4ed96b05".Replace("0x", ""); string script = null; using (var sb = new ThinNeo.ScriptBuilder()) { sb.EmitParamJson(new MyJson.JsonNode_Array()); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)name")); //参数倒序入 ThinNeo.Hash160 shash = new ThinNeo.Hash160(nnc); sb.EmitAppCall(shash); //nep5脚本 sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)symbol")); sb.EmitAppCall(shash); sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)decimals")); sb.EmitAppCall(shash); sb.EmitParamJson(new MyJson.JsonNode_Array()); sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)totalSupply")); sb.EmitAppCall(shash); var data = sb.ToArray(); script = ThinNeo.Helper.Bytes2HexString(data); } //var url = Helper.MakeRpcUrl(api, "invokescript", new MyJson.JsonNode_ValueString(script)); //string result = await Helper.HttpGet(url); byte[] postdata; var url = Helper.MakeRpcUrlPost(api, "invokescript", out postdata, new MyJson.JsonNode_ValueString(script)); var result = await Helper.HttpPost(url, postdata); Console.WriteLine("得到的结果是:" + result); }
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"); } }
async public Task Demo() { byte[] prikey = ThinNeo.Helper.GetPrivateKeyFromWIF(testwif); byte[] pubkey = ThinNeo.Helper.GetPublicKeyFromPrivateKey(prikey); string address = ThinNeo.Helper.GetAddressFromPublicKey(pubkey); byte[] scripthash = ThinNeo.Helper.GetPublicKeyHashFromAddress(address); Console.WriteLine("address=" + address); {//查balance string 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)balanceOf")); //参数倒序入 ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep55); sb.EmitAppCall(shash); //nep5脚本 var data = sb.ToArray(); script = ThinNeo.Helper.Bytes2HexString(data); } //var url = Helper.MakeRpcUrl(api, "invokescript", new MyJson.JsonNode_ValueString(script)); //string result = await Helper.HttpGet(url); byte[] postdata; var url = Helper.MakeRpcUrlPost(api, "invokescript", out postdata, new MyJson.JsonNode_ValueString(script)); var result = await Helper.HttpPost(url, postdata); Console.WriteLine("得到的结果是:" + result); var json = MyJson.Parse(result).AsDict(); if (json.ContainsKey("result")) { var resultv = json["result"].AsList()[0].AsDict()["stack"].AsList()[0].AsDict(); var rtype = resultv["type"].AsString(); var rvalue = resultv["value"].AsString(); Console.WriteLine("type=" + rtype + " value=" + rvalue); var n = new System.Numerics.BigInteger(ThinNeo.Helper.HexString2Bytes(rvalue)); Console.WriteLine("value dec=" + n.ToString()); } } if (lastNep5Tran != null) { string script = null; using (var sb = new ThinNeo.ScriptBuilder()) { var array = new MyJson.JsonNode_Array(); array.AddArrayValue("(hex256)" + lastNep5Tran.ToString()); sb.EmitParamJson(array); //参数倒序入 sb.EmitParamJson(new MyJson.JsonNode_ValueString("(str)getTXInfo")); //参数倒序入 ThinNeo.Hash160 shash = new ThinNeo.Hash160(nep55); sb.EmitAppCall(shash); //nep5脚本 var data = sb.ToArray(); script = ThinNeo.Helper.Bytes2HexString(data); } byte[] postdata; var url = Helper.MakeRpcUrlPost(api, "invokescript", out postdata, new MyJson.JsonNode_ValueString(script)); var result = await Helper.HttpPost(url, postdata); Console.WriteLine("得到的结果是:" + result); } }
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); }