public void getNEP5Asset(MySqlConnection conn, UInt160 Contract) { try { ScriptBuilder sb = new ScriptBuilder(); sb.EmitAppCall(Contract, "totalSupply"); sb.EmitAppCall(Contract, "name"); sb.EmitAppCall(Contract, "symbol"); sb.EmitAppCall(Contract, "decimals"); Blockchain blockchain = ZoroChainSystem.Singleton.GetBlockchain(ChainHash);; ApplicationEngine engine = ApplicationEngine.Run(sb.ToArray(), blockchain, testMode: true); if (engine.State.HasFlag(VMState.FAULT)) { return; } JArray jStack = new JArray(engine.ResultStack.Select(p => p.ToParameter().ToJson())); string totalSupply = new BigInteger(SpiderHelper.HexString2Bytes(jStack[0]["value"].ToString())).ToString(); string name = Encoding.UTF8.GetString(SpiderHelper.HexString2Bytes(jStack[1]["value"].ToString())); string symbol = Encoding.UTF8.GetString(SpiderHelper.HexString2Bytes(jStack[2]["value"].ToString())); string decimals = BigInteger.Parse(jStack[3]["value"].ToString()).ToString(); List <string> slist = new List <string>(); slist.Add(Contract.ToString()); slist.Add(totalSupply); slist.Add(name); slist.Add(symbol); slist.Add(decimals); //Dictionary<string, string> dictionary = new Dictionary<string, string>(); //dictionary.Add("assetid", Contract.ToString()); //bool exist = MysqlConn.CheckExist(DataTableName, dictionary); //if (!exist) //这里有个bug,我们的bcp会因为转账而增长 { MysqlConn.ExecuteDataInsert(conn, DataTableName, slist); } LogConfig.Log($"SaveNEP5Asset {ChainHash} {Contract}", LogConfig.LogLevel.Info, ChainHash.ToString()); } catch (Exception e) { LogConfig.Log($"error occured when call invokescript, chainhash:{ChainHash}, nep5contract:{Contract.ToString()}, reason:{e.Message}", LogConfig.LogLevel.Error); throw e; } }
public void getNativeNEP5Asset(MySqlConnection conn, UInt160 Contract) { try { ScriptBuilder sb = new ScriptBuilder(); sb.EmitSysCall("Zoro.NativeNEP5.Call", "TotalSupply", Contract); sb.EmitSysCall("Zoro.NativeNEP5.Call", "Name", Contract); sb.EmitSysCall("Zoro.NativeNEP5.Call", "Symbol", Contract); sb.EmitSysCall("Zoro.NativeNEP5.Call", "Decimals", Contract); IO.Json.JObject jObject; Blockchain blockchain = ZoroChainSystem.Singleton.GetBlockchain(ChainHash);; ApplicationEngine engine = ApplicationEngine.Run(sb.ToArray(), blockchain, testMode: true); if (engine.State.HasFlag(VMState.FAULT)) { return; } JArray jStack = new JArray(engine.ResultStack.Select(p => p.ToParameter().ToJson())); string totalSupply = jStack[0]["type"].AsString() == "ByteArray" ? new BigInteger(SpiderHelper.HexString2Bytes(jStack[0]["value"].AsString())).ToString() : jStack[0]["value"].AsString(); string name = jStack[1]["type"].AsString() == "ByteArray" ? Encoding.UTF8.GetString(SpiderHelper.HexString2Bytes(jStack[1]["value"].AsString())) : jStack[1]["value"].AsString(); string symbol = jStack[2]["type"].AsString() == "ByteArray" ? Encoding.UTF8.GetString(SpiderHelper.HexString2Bytes(jStack[2]["value"].AsString())) : jStack[2]["value"].AsString(); string decimals = jStack[3]["type"].AsString() == "ByteArray" ? BigInteger.Parse(jStack[3]["value"].AsString()).ToString() : jStack[3]["value"].AsString(); //BCT没有限制,可以随意增发 if (symbol == "BCT") { totalSupply = "0"; } List <string> slist = new List <string>(); slist.Add(Contract.ToString()); slist.Add(totalSupply); slist.Add(name); slist.Add(symbol); slist.Add(decimals); //这里有个bug,我们的bcp会因为转账而增长 { MysqlConn.ExecuteDataInsert(conn, DataTableName, slist); } LogConfig.Log($"SaveNEP5Asset {ChainHash} {Contract}", LogConfig.LogLevel.Info, ChainHash.ToString()); } catch (Exception e) { LogConfig.Log($"error occured when call invokescript, chainhash:{ChainHash}, nep5contract:{Contract.ToString()}, reason:{e.Message}", LogConfig.LogLevel.Error); throw e; } }
public void Save(MySqlConnection conn, JObject jToken) { JObject executions = null; try { if (jToken != null) { executions = jToken["executions"]; } } catch (Exception e) { } //try //{ // if (!TryGetDB(ChainHash, out DB db)) return; // if (db.IsDisposed) return; // UInt256 hash = UInt256.Parse(SpiderHelper.getString(jToken["txid"].ToString())); // if (!db.TryGet(ReadOptions.Default, hash.ToArray(), out Slice value)) // throw new RpcException(-100, "Unknown transaction"); // result = JObject.Parse(value.ToString()); // if (result != null) // executions = result["executions"]; //} //catch (Exception e) //{ // LogConfig.Log($"error occured when call getapplicationlog, chain:{ChainHash} height:{blockHeight}, reason:{e.Message}", LogConfig.LogLevel.Error); // //throw e; //} if (jToken != null && executions != null) { foreach (var execution in executions as JArray) { List <string> slist = new List <string>(); slist.Add(SpiderHelper.getString(jToken["txid"].ToString())); slist.Add(SpiderHelper.getString(execution["vmstate"].ToString())); slist.Add(SpiderHelper.getString(execution["gas_consumed"].ToString())); slist.Add(SpiderHelper.getString(execution["stack"].ToString())); slist.Add(SpiderHelper.getString(execution["notifications"].ToString().Replace(@"[/n/r]", ""))); Dictionary <string, string> where = new Dictionary <string, string>(); where.Add("txid", SpiderHelper.getString(jToken["txid"].ToString())); MysqlConn.Delete(conn, DataTableName, where); MysqlConn.ExecuteDataInsert(conn, DataTableName, slist); LogConfig.Log($"SaveNotify {ChainHash} {jToken["txid"]}", LogConfig.LogLevel.Info, ChainHash.ToString()); if (execution["vmstate"].ToString().Contains("FAULT")) { return; } JObject notifications = execution["notifications"]; foreach (JObject notify in notifications as JArray) { JArray values = notify["state"]["value"] as JArray; if (values[0]["type"].ToString() == "ByteArray") { string transfer = Encoding.UTF8.GetString(SpiderHelper.HexString2Bytes(SpiderHelper.getString(values[0]["value"].ToString()))); string contract = SpiderHelper.getString(notify["contract"].ToString()); if (transfer == "transfer") { JObject nep5 = new JObject(); nep5["assetid"] = contract; nep5Asset.Save(conn, nep5); //存储Nep5Transfer内容 JObject tx = new JObject(); tx["txid"] = SpiderHelper.getString(jToken["txid"].ToString()); tx["n"] = 0; tx["asset"] = contract; if (SpiderHelper.getString(values[1]["value"].ToString()) == "") { tx["from"] = ""; } else { tx["from"] = UInt160.Parse(SpiderHelper.getString(values[1]["value"].ToString())).ToAddress(); } tx["to"] = UInt160.Parse(SpiderHelper.getString(values[2]["value"].ToString())).ToAddress(); if (SpiderHelper.getString(values[3]["type"].ToString()) == "ByteArray") { tx["value"] = new BigInteger(SpiderHelper.HexString2Bytes(SpiderHelper.getString(values[3]["value"].ToString()))).ToString(); } else { tx["value"] = BigInteger.Parse(SpiderHelper.getString(values[3]["value"].ToString()), NumberStyles.AllowHexSpecifier).ToString(); } JObject j = new JObject(); j["address"] = SpiderHelper.getString(tx["to"].ToString()); j["txid"] = SpiderHelper.getString(tx["txid"].ToString()); address.Save(conn, j); addressAsset.Save(conn, SpiderHelper.getString(tx["to"].ToString()), contract, ""); address_tx.Save(conn, j); nep5Transfer.Save(conn, tx); } } } } } }