public void Initialize(Dictionary<string, object> appInfo, Dictionary<string, object> entryPointInformation) { try { VmcExecuteAddIn.entryPointInfo = entryPointInformation; object obj1; VmcExecuteAddIn.entryPointInfo.TryGetValue("Title", out obj1); VmcExecuteAddIn.ExecutionTitle = obj1 as string; object obj2; if (!VmcExecuteAddIn.entryPointInfo.TryGetValue("ImageUrl", out obj2)) VmcExecuteAddIn.entryPointInfo.TryGetValue("ThumbnailUrl", out obj2); VmcExecuteAddIn.ExecutionImageUrl = obj2 as string; object obj3; if (!VmcExecuteAddIn.entryPointInfo.TryGetValue("Context", out obj3)) throw new InvalidOperationException("Context not found."); this.executionInfo = (ExecutionInfo)new XmlSerializer(typeof(ExecutionInfo)).Deserialize((TextReader)new StringReader(((string)obj3).Trim())); if (this.executionInfo == null) throw new FormatException("Could not interpret context."); bool flag1 = !string.IsNullOrEmpty(this.executionInfo.FileName); bool flag2 = this.executionInfo.Media != null && this.executionInfo.Media.Count > 0; if (!flag1 && !flag2 && !this.executionInfo.Page.HasValue) throw new InvalidOperationException("No file name, page or media specified."); if (!flag1) return; this.executionInfo.FileName = System.Environment.ExpandEnvironmentVariables(this.executionInfo.FileName); object obj4; if (!this.executionInfo.RequiresDirectX && VmcExecuteAddIn.entryPointInfo.TryGetValue("CapabilitiesRequired", out obj4)) this.executionInfo.RequiresDirectX = ((string)obj4).IndexOf("directx", StringComparison.InvariantCultureIgnoreCase) != -1; VmcExecuteAddIn.globalHook = new GlobalHook(); VmcExecuteAddIn.ExecutionEngine = new ExecutionEngine(this.executionInfo, VmcExecuteAddIn.globalHook); VmcExecuteAddIn.ExecutionEngine.ExecutionFinished += (EventHandler)delegate { Application.DeferredInvoke(new DeferredHandler(this.ExecutionFinishedHandler)); }; VmcExecuteAddIn.ExecutionEngine.ExecutionError += (EventHandler<Advent.VmcExecute.ErrorEventArgs>)((sender, args) => Application.DeferredInvoke(new DeferredHandler(this.ExecutionErrorHandler), (object)args)); if (string.IsNullOrEmpty(VmcExecuteAddIn.ExecutionTitle)) VmcExecuteAddIn.ExecutionTitle = Path.GetFileNameWithoutExtension(this.executionInfo.FileName); VmcExecuteAddIn.messagePump = new Thread((ThreadStart)(() => { try { if (VmcExecuteAddIn.ExecutionEngine.RequiresKeyboardHook) VmcExecuteAddIn.globalHook.Start(false, true); System.Windows.Threading.Dispatcher.Run(); } catch (ThreadAbortException) { } })); VmcExecuteAddIn.messagePump.SetApartmentState(ApartmentState.STA); VmcExecuteAddIn.messagePump.IsBackground = true; VmcExecuteAddIn.messagePump.Start(); } catch (Exception ex) { VmcExecuteAddIn.LogError(ex.ToString()); throw; } }
internal ExecutionContext(ExecutionEngine engine, byte[] script, int rvcount) { this.Script = script; this.RVCount = rvcount; this.OpReader = new BinaryReader(new MemoryStream(script, false)); }
private bool Asset_Create(ExecutionEngine engine) { if (Trigger != TriggerType.Application) { return(false); } InvocationTransaction tx = (InvocationTransaction)engine.ScriptContainer; AssetType asset_type = (AssetType)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); if (!Enum.IsDefined(typeof(AssetType), asset_type) || asset_type == AssetType.CreditFlag || asset_type == AssetType.DutyFlag || asset_type == AssetType.GoverningToken || asset_type == AssetType.UtilityToken) { return(false); } if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 1024) { return(false); } string name = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); Fixed8 amount = new Fixed8((long)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger()); if (amount == Fixed8.Zero || amount < -Fixed8.Satoshi) { return(false); } if (asset_type == AssetType.Invoice && amount != -Fixed8.Satoshi) { return(false); } byte precision = (byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); if (precision > 8) { return(false); } if (asset_type == AssetType.Share && precision != 0) { return(false); } if (amount != -Fixed8.Satoshi && amount.GetData() % (long)Math.Pow(10, 8 - precision) != 0) { return(false); } ECPoint owner = ECPoint.DecodePoint(engine.CurrentContext.EvaluationStack.Pop().GetByteArray(), ECCurve.Secp256r1); if (owner.IsInfinity) { return(false); } if (!CheckWitness(engine, owner)) { return(false); } UInt160 admin = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); UInt160 issuer = new UInt160(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); AssetState asset = Snapshot.Assets.GetOrAdd(tx.Hash, () => new AssetState { AssetId = tx.Hash, AssetType = asset_type, Name = name, Amount = amount, Available = Fixed8.Zero, Precision = precision, Fee = Fixed8.Zero, FeeAddress = new UInt160(), Owner = owner, Admin = admin, Issuer = issuer, Expiration = Snapshot.Height + 1 + 2000000, IsFrozen = false }); engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(asset)); return(true); }
protected virtual bool Blockchain_GetValidators(ExecutionEngine engine) { ECPoint[] validators = Blockchain.Default.GetValidators(); engine.EvaluationStack.Push(validators.Select(p => (StackItem)p.EncodePoint(true)).ToArray()); return(true); }
public static bool GetAssetId(ExecutionEngine engine) { //TransactionOutput // returns byte[] throw new NotImplementedException(); }
private bool Contract_Create(ExecutionEngine engine) { byte[] script = engine.EvaluationStack.Pop().GetByteArray(); if (script.Length > 1024 * 1024) { return(false); } ContractParameterType[] parameter_list = engine.EvaluationStack.Pop().GetByteArray().Select(p => (ContractParameterType)p).ToArray(); if (parameter_list.Length > 252) { return(false); } ContractParameterType return_type = (ContractParameterType)(byte)engine.EvaluationStack.Pop().GetBigInteger(); bool need_storage = engine.EvaluationStack.Pop().GetBoolean(); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string name = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string version = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string author = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string email = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); if (engine.EvaluationStack.Peek().GetByteArray().Length > 65536) { return(false); } string description = Encoding.UTF8.GetString(engine.EvaluationStack.Pop().GetByteArray()); UInt160 hash = script.ToScriptHash(); ContractState contract = contracts.TryGet(hash); if (contract == null) { contract = new ContractState { Script = script, ParameterList = parameter_list, ReturnType = return_type, HasStorage = need_storage, Name = name, CodeVersion = version, Author = author, Email = email, Description = description }; contracts.Add(hash, contract); contracts_created.Add(hash, new UInt160(engine.CurrentContext.ScriptHash)); } engine.EvaluationStack.Push(StackItem.FromInterface(contract)); return(true); }
/// <summary> /// Constructor /// </summary> /// <param name="engine">Engine</param> /// <param name="data">Data</param> internal ByteArrayStackItem(ExecutionEngine engine, byte[] data) : base(engine, data) { NativeEngine = engine; _handle = this.CreateNativeItem(); }
public static bool GetContract(ExecutionEngine engine) { //byte[] script_hash //returns Contract throw new NotImplementedException(); }
public static bool GetUsage(ExecutionEngine engine) { // TransactionAttribute // returns byte throw new NotImplementedException(); }
public static void VoidAssertCall(bool value) { ExecutionEngine.Assert(value == true); }
public static int AssertCall(bool value) { ExecutionEngine.Assert(value == true, "ERROR"); return(5); }
public static bool CheckWitness(ExecutionEngine engine) { byte[] hashOrPubkey = engine.EvaluationStack.Pop().GetByteArray(); bool result; string matchType; var emulator = engine.GetEmulator(); if (hashOrPubkey.Length == 20) // script hash { matchType = "Script Hash"; if (invokerKeys != null) { result = invokerKeys.signatureHash.ToArray().ByteMatch(hashOrPubkey); } else { result = false; } } else if (hashOrPubkey.Length == 33) // public key { matchType = "Public Key"; if (invokerKeys != null) { result = invokerKeys.CompressedPublicKey.ByteMatch(hashOrPubkey); } else { result = false; } } else { matchType = "Unknown"; result = false; } if (emulator.checkWitnessMode != CheckWitnessMode.Default) { if (emulator.checkWitnessMode == CheckWitnessMode.AlwaysFalse) { result = false; } else if (emulator.checkWitnessMode == CheckWitnessMode.AlwaysTrue) { result = true; } matchType += " / Forced"; } DoLog($"Checking Witness [{matchType}]: {hashOrPubkey.ByteToHex()} => {result}"); engine.EvaluationStack.Push(new VM.Types.Boolean(result)); return(true); }
static void Main(string[] pargs) { var api = new RemoteRPCNode(10332, "<cron node url>", CronNodesKind.CRON_GLOBAL); { Console.WriteLine("amount " + new BigInteger("00943577".HexToBytes())); Console.WriteLine("to " + new UInt160("fc3f33cb3e2d79f82fadef5f407ac1576d304bc1".HexToBytes()).ToAddress()); Console.WriteLine("from " + new UInt160("a30cadcc858aa4b89d9db098ef154c5e1ab74464".HexToBytes()).ToAddress()); return; } { var snap_data = File.ReadAllLines("souls_snap.csv"); var snap = Snapshot.Import(snap_data); var avm_script = File.ReadAllBytes(@"D:\code\Crypto\PhantasmaNeo\PhantasmaContract\bin\Debug\PhantasmaContract.avm"); var soul_token = api.GetToken("SOUL"); var lines = new List <string>(); uint ico_war_time = 1527465600; uint ico_start_time = 1527379200; Console.WriteLine("Block,Stage,Tx Hash,Address,Action,NEO sent,NEO refund"); snap.Execute(api, soul_token.ScriptHash, vm => { var storage = vm.GetStorage(soul_token); var block = vm.currentBlock; int stage = (block.Timestamp < ico_war_time) ? ((block.Timestamp < ico_start_time) ? 0 : 1) : 2; //var bytes = storage.Get("totalSupply"); //var n = new BigInteger(bytes); foreach (var tx in block.transactions) { UInt160 src = null; /*foreach (var input in tx.inputs) * { * var input_tx = snap.GetTransaction(input.prevHash); * if (input_tx == null) * { * input_tx = api.GetTransaction(input.prevHash); * } * var output = input_tx.outputs[input.prevIndex]; * src = output.scriptHash; * } * * if (src == null) * { * continue; * }*/ decimal neo_sent = 0; foreach (var output in tx.outputs) { if (output.scriptHash == soul_token.ScriptHash) { neo_sent += output.value; } } var src_address = src != null ? src.ToAddress(): "???"; if (tx.Hash.ToString() == "0xc39fb2304f721382a40142ed8af9d4470850f39fabeef9bb8bad892a6b63f4d6") { src_address += ""; } if (tx.type == TransactionType.ContractTransaction) { decimal refund = 0; foreach (var output in tx.outputs) { if (output.scriptHash == soul_token.ScriptHash) { refund += output.value; } } Console.WriteLine($"Block #{block.Height},{stage},{tx.Hash},{src_address},contract,{neo_sent},{refund}"); } else { var notifications = vm.GetNotifications(tx); if (notifications != null) { foreach (var entry in notifications) { decimal refund = 0; if (entry.Name == "refund") { var bytes = (byte[])entry.Args[1]; var n = new BigInteger(bytes); refund = (decimal)(n / 100000000); } Console.WriteLine($"Block #{block.Height},{stage},{entry.Hash},{src_address},{entry.Name},{neo_sent},{refund}"); } } } } }); return; } uint roundBlock = 2320640; uint startBlock = 2313827; uint endBlock = 2320681; { var snap = new Snapshot(api.GetToken("SOUL"), startBlock, endBlock); var export = snap.Export(); File.WriteAllLines("souls_snap.csv", export.ToArray()); return; } //startBlock = roundBlock; var soul_hash = LuxUtils.ReverseHex("ed07cffad18f1308db51920d99a2af60ac66a7b3").HexToBytes(); var soul_hash_int = new UInt160(soul_hash); var startT = Environment.TickCount; uint maxblock = 0; var blockCount = api.GetBlockHeight(); var soul_balances = new Dictionary <UInt160, BigInteger>(); var bought = new Dictionary <UInt160, decimal>(); BigInteger max_supply = 91136510; // total token amount BigInteger team_supply = 14500000; // team token amount BigInteger advisor_supply = 5500000; // advisor token amount BigInteger platform_supply = 15000000; // company token amount BigInteger presale_supply = 43503435; // presale token amount BigInteger total_supply = team_supply + advisor_supply + presale_supply + platform_supply; var whitelist = new HashSet <UInt160>(); var maybe = new HashSet <UInt160>(); var sure = new HashSet <UInt160>(); var expected = new Dictionary <UInt160, decimal>(); var txlist = new List <string>(); for (uint height = startBlock; height <= endBlock; height++) { var block = api.GetBlock(height); //Console.WriteLine(height + " " + block.Timestamp.ToString()); foreach (var tx in block.transactions) { if (tx.type == TransactionType.ContractTransaction) { foreach (var output in tx.outputs) { if (output.scriptHash == soul_hash_int) { /*foreach (var input in tx.inputs) * { * var input_tx = api.GetTransaction(input.prevHash); * var outp = input_tx.outputs[input.prevIndex]; * var sender = outp.scriptHash; * Console.WriteLine($"refund,{tx.Hash},{sender.ToAddress()},{output.value}"); * break; * }*/ } } continue; } if (tx.type != TransactionType.InvocationTransaction) { continue; } List <AVMInstruction> ops; try { ops = CronTools.Disassemble(tx.script); } catch { continue; } if (tx.Hash.ToString() == "0xcf530159dc7fa7d0ea38ca210b479b04da20039b3b6639cf4c06bf528d415339") { tx.gas += 0; } for (int i = 0; i < ops.Count; i++) { var op = ops[i]; if (op.opcode == OpCode.APPCALL && op.data.SequenceEqual(soul_hash)) { var engine = new ExecutionEngine(null); engine.LoadScript(tx.script); engine.Execute(null); var operation = engine.CurrentContext.EvaluationStack.Peek().GetString(); var args = ((IEnumerable <StackItem>)engine.CurrentContext.EvaluationStack.Peek(1)).ToList(); var witnesses = new HashSet <UInt160>(); foreach (var input in tx.inputs) { var input_tx = api.GetTransaction(input.prevHash); witnesses.Add(input_tx.outputs[input.prevIndex].scriptHash); } switch (operation) { case "mintTokens": { decimal neo_amount = 0; foreach (var output in tx.outputs) { if (output.scriptHash == soul_hash_int) { neo_amount += output.value; } } var sender = witnesses.First(); var cur_bought = bought.ContainsKey(sender) ? bought[sender] : 0; decimal refund = 0; if (block.Height >= roundBlock) { maybe.Add(sender); expected[sender] = neo_amount * 273; } if (!whitelist.Contains(sender)) { refund = neo_amount; neo_amount = 0; } else if (cur_bought + neo_amount > 10) { var temp = neo_amount; neo_amount = 10 - cur_bought; refund = temp - neo_amount; } if (neo_amount > 0) { BigInteger souls = (int)neo_amount * 273; /*if (souls + total_supply > max_supply) * { * souls = max_supply - total_supply; * }*/ total_supply += souls * 2; if (soul_balances.ContainsKey(sender)) { soul_balances[sender] += new BigInteger((long)(souls * 100000000)); } else { soul_balances[sender] = new BigInteger((long)(souls * 100000000)); } Console.WriteLine(block.Height + "," + tx.Hash + ",mint," + soul_hash_int.ToAddress() + "," + sender.ToAddress() + "," + souls); cur_bought += neo_amount; bought[sender] = cur_bought; } else if (refund > 0) { Console.WriteLine(block.Height + "," + tx.Hash + ",refund," + soul_hash_int.ToAddress() + "," + sender.ToAddress() + "," + refund); } break; } case "whitelistAddFree": { foreach (var addr in args) { var hash = new UInt160(addr.GetByteArray()); whitelist.Add(hash); } break; } case "whitelistAddFilled": { foreach (var addr in args) { var hash = new UInt160(addr.GetByteArray()); whitelist.Add(hash); bought[hash] = 2730; } break; } case "whitelistAddCap": { decimal cap = 0; int index = 0; foreach (var addr in args) { if (index == 0) { var amount = addr.GetBigInteger(); cap = (decimal)(amount / 100000000); } else { var hash = new UInt160(addr.GetByteArray()); whitelist.Add(hash); bought[hash] = cap; } index++; } break; } case "chainSwap": { throw new Exception("Exploit found"); break; } case "deploy": { soul_balances[new UInt160("Abyd4BcStNksGLmfdHtyyPbS1xzhceDKLs".AddressToScriptHash())] = new BigInteger((long)6316538 * (long)100000000); soul_balances[new UInt160("ARWHJefSbhayC2gurKkpjMHm5ReaJZLLJ3".AddressToScriptHash())] = new BigInteger((long)43503435 * (long)100000000); soul_balances[new UInt160("AQFQmVQi9VReLhym1tF3UfPk4EG3VKbAwN".AddressToScriptHash())] = new BigInteger((long)15000000 * (long)100000000); break; } case "transfer": { if (args.Count == 3) { var from = new UInt160(args[0].GetByteArray()); if (!witnesses.Contains(from)) { //throw new Exception("Invalid"); } if (maybe.Contains(from)) { sure.Add(from); } var to = new UInt160(args[1].GetByteArray()); var value = args[2].GetBigInteger(); var from_addr = from.ToAddress(); var to_addr = to.ToAddress(); /*if (from == watch) * { * Console.WriteLine("WATCH " + tx.Hash); * } * if (to == watch) * { * Console.WriteLine("WATCH " + tx.Hash); * }*/ decimal amount = (long)value; int places = 8; while (places > 0) { amount *= 0.1m; places--; } Console.WriteLine(block.Height + "," + tx.Hash + ",transfer," + from.ToAddress() + "," + to.ToAddress() + "," + amount); } break; } } } } } } /*var lines = new List<string>(); * foreach (var entry in soul_balances) * { * var k = (long)entry.Value; * if (k == 0) * { * continue; * } * var val = (decimal)k / 100000000m; * lines.Add(entry.Key.ToAddress() + "," + val); * } * File.WriteAllLines("sale_soul.csv", lines.ToArray());*/ var token = api.GetToken("SOUL"); foreach (var entry in maybe) { var addr = entry.ToAddress(); var balance = token.BalanceOf(addr); if (balance >= expected[entry]) { sure.Add(entry); } } foreach (var entry in sure) { maybe.Remove(entry); Console.WriteLine(entry.ToAddress() + "," + expected[entry]); if (expected[entry] > 50 * 273) { throw new Exception("AAAAAAAAA"); } } foreach (var entry in maybe) { Console.WriteLine(entry.ToAddress() + ",0"); } decimal total = 0; foreach (var entry in sure) { total += expected[entry]; } Console.WriteLine("TOTAL " + total); var endT = Environment.TickCount; var delta = (endT - startT) / 1000; Console.WriteLine("Finished in " + delta + " seconds, loaded " + maxblock + " blocks"); Console.ReadLine(); return; /* Console.WriteLine(tkk.BalanceOf("AYxnCZePKhrijk2TQymYYUqm74nuwCftwq")); * //var token = api.GetToken("SOUL"); * //var keys = KeyPair.FromWIF("KxnjzXUvK9BLojMrWVJF7jjdbHs37aXvHyFog4rARGNrAQ7LFjLP"); * * var token = api.GetToken("OBT"); * var keys = KeyPair.FromWIF("L5YiR4AdUibLeFf48W3P5P36aBTWANcDu6oQNkvpaQrrHreg4RZC"); * * var balance = token.BalanceOf(keys); * Console.WriteLine(balance); * * var transfers = new Dictionary<string, decimal>(); * transfers["AHXWzaYCNYBYvhSypfi2XpAiWz2cCXrDJr"] = 16.7m; * transfers["AHxXMh9cPjE3cYrA9DhWNSBY2hC3a62PcH"] = 16.7m; * transfers["AHY7SidKpLuNj881Mc4Vjsj1Y4jBbX5EPS"] = 16.7m; * * var txx = token.Transfer(keys, transfers); * Console.WriteLine(txx.Hash);*/ /* * uint startBlock = 2298101; * uint endblock = 2313169; * * var soul_hash = LuxUtils.ReverseHex("4b4f63919b9ecfd2483f0c72ff46ed31b5bbb7a4").HexToBytes(); * var soul_hash_int = new UInt160(soul_hash); * * * var startT = Environment.TickCount; * * uint maxblock = 0; * * var blockCount = api.GetBlockHeight(); * * var soul_balances = new Dictionary<UInt160, BigInteger>(); * var bought = new Dictionary<UInt160, decimal>(); * * BigInteger max_supply = 91136510; // total token amount * BigInteger team_supply = 14500000; // team token amount * BigInteger advisor_supply = 5500000; // advisor token amount * BigInteger platform_supply = 15000000; // company token amount * BigInteger presale_supply = 43503435; // presale token amount * * BigInteger total_supply = team_supply + advisor_supply + presale_supply + platform_supply; * * var watch = new UInt160( "AQkiyWfwxMT31epRRxWXbR7wvZJH944jqh".AddressToScriptHash()); * * for (uint height = startBlock; height<=endblock; height++) * { * var block = api.GetBlock(height); * * //Console.WriteLine(height + " " + block.Timestamp.ToString()); * * foreach (var tx in block.transactions) * { * if (tx.type != TransactionType.InvocationTransaction) * { * continue; * } * * List<AVMInstruction> ops; * try * { * ops = NeoTools.Disassemble(tx.script); * } * catch * { * continue; * } * * if (tx.Hash.ToString()== "0xcf530159dc7fa7d0ea38ca210b479b04da20039b3b6639cf4c06bf528d415339") * { * tx.gas += 0; * } * * for (int i = 0; i < ops.Count; i++) * { * var op = ops[i]; * * if (op.opcode == OpCode.APPCALL && op.data.SequenceEqual(soul_hash)) * { * var engine = new ExecutionEngine(null); * engine.LoadScript(tx.script); * engine.Execute(null); * * var operation = engine.EvaluationStack.Peek().GetString(); * * var witnesses = new HashSet<UInt160>(); * foreach (var input in tx.inputs) * { * var input_tx = api.GetTransaction(input.prevHash); * witnesses.Add(input_tx.outputs[input.prevIndex].scriptHash); * } * * switch (operation) * { * case "mintTokens": * { * decimal neo_amount = 0; * * if (block.Timestamp.ToTimestamp() < 1526947200) * { * break; * } * * if (block.Height> 2298690) * { * break; * } * * foreach (var output in tx.outputs) * { * if (output.scriptHash == soul_hash_int) * { * neo_amount += output.value; * } * } * * var sender = witnesses.First(); * var cur_bought = bought.ContainsKey(sender) ? bought[sender] : 0; * * if (cur_bought + neo_amount > 10) * { * neo_amount = 10 - cur_bought; * } * * foreach (var wit in witnesses) * { * if (wit == watch) * { * Console.WriteLine("WATCH " + tx.Hash); * break; * } * } * * if (neo_amount > 0) * { * BigInteger souls = (int)neo_amount * 273; * //if (souls + total_supply > max_supply) * //{ * // souls = max_supply - total_supply; * //} * * total_supply += souls * 2; * * if (soul_balances.ContainsKey(sender)) * { * soul_balances[sender] += new BigInteger((long)(souls * 100000000)); * } * else * { * soul_balances[sender] = new BigInteger((long)(souls * 100000000)); * } * * Console.WriteLine(tx.Hash + ",mint," + soul_hash_int.ToAddress() + "," + sender.ToAddress() + "," + souls); * cur_bought += neo_amount; * bought[sender] = cur_bought; * } * * break; * } * * case "chainSwap": * { * throw new Exception("Exploit found"); * break; * } * * case "transfer": * { * var args = (Neo.Lux.VM.Types.Array)engine.EvaluationStack.Peek(1); * * if (args.Count == 3) * { * var from = new UInt160(args[0].GetByteArray()); * * if (!witnesses.Contains(from)) * { * //throw new Exception("Invalid"); * } * * var to = new UInt160(args[1].GetByteArray()); * var value = args[2].GetBigInteger(); * * var from_addr = from.ToAddress(); * var to_addr = to.ToAddress(); * * if (from == watch) * { * Console.WriteLine("WATCH " + tx.Hash); * } * if (to == watch) * { * Console.WriteLine("WATCH " + tx.Hash); * } * * if (from_addr == "AdkLubeJgL3PCKc1Xv6CEv9PrzB4c5AKNk") * { * value += 0; * } * * if (soul_balances.ContainsKey(from)) * { * var src_balance = soul_balances[from]; * * if (src_balance >= value) * { * src_balance -= value; * soul_balances[from] = src_balance; * * if (soul_balances.ContainsKey(to)) * { * soul_balances[to] += value; * } * else * { * soul_balances[to] = value; * } * } * } * else * { * throw new Exception("Invalid balance"); * } * * decimal amount = (long)value; * int places = 8; * while (places > 0) * { * amount *= 0.1m; * places--; * } * * Console.WriteLine(tx.Hash + ",transfer," + from.ToAddress() + "," + to.ToAddress() + "," + amount); * } * * break; * } * } * * } * * } * } * } * * var lines = new List<string>(); * foreach(var entry in soul_balances) * { * var k = (long)entry.Value; * if (k == 0) * { * continue; * } * var val = (decimal)k / 100000000m; * lines.Add(entry.Key.ToAddress() + "," + val); * } * File.WriteAllLines("soul_snapshop.csv", lines.ToArray()); * * var endT = Environment.TickCount; * var delta = (endT - startT) / 1000; * Console.WriteLine("Finished in " + delta + " seconds, loaded "+maxblock+" blocks"); * * Console.ReadLine(); */ }
public static Storage GetStorage(this ExecutionEngine engine) { var emulator = engine.GetEmulator(); return(emulator.GetStorage()); }
public static Blockchain GetBlockchain(this ExecutionEngine engine) { var emulator = engine.GetEmulator(); return(emulator.blockchain); }
public static bool GetAsset(ExecutionEngine engine) { //byte[] asset_id // returns Asset throw new NotImplementedException(); }
/// <summary> /// Execute this test /// </summary> /// <param name="ut">Test</param> public void ExecuteTest(VMUT ut) { foreach (var test in ut.Tests) { // Interop service IInteropService service = new InteropService(); // Message provider IScriptContainer scriptContainer = null; if (test.Message != null) { scriptContainer = new MessageProvider(test.Message); } // Script table ScriptTable scriptTable = null; if (test.ScriptTable != null) { scriptTable = new ScriptTable(); foreach (var script in test.ScriptTable) { scriptTable.Add(script.Script); } } // Create engine using (var engine = new ExecutionEngine(scriptContainer, Crypto.Default, scriptTable, service)) { Debugger debugger = new Debugger(engine); engine.LoadScript(test.Script); // Execute Steps if (test.Steps != null) { foreach (var step in test.Steps) { // Actions if (step.Actions != null) { foreach (var run in step.Actions) { switch (run) { case VMUTActionType.Execute: debugger.Execute(); break; case VMUTActionType.StepInto: debugger.StepInto(); break; case VMUTActionType.StepOut: debugger.StepOut(); break; case VMUTActionType.StepOver: debugger.StepOver(); break; } } } // Review results var add = string.IsNullOrEmpty(step.Name) ? "" : "-" + step.Name; AssertResult(engine, step.Result, $"{ut.Category}-{ut.Name}-{test.Name}{add}: "); } } } } }
public TestOperator(TestModel model, ExecutionEngine engine) : base(engine) { this.logic = runtime => runtime.Resolve(engine.Create <string>(model.Nested)); }
/// <summary> /// 获得该智能合约的脚本容器(最开始的触发者) /// </summary> /// <param name="engine">当前执行引擎</param> /// <returns>执行成功返回true</returns> protected bool ExecutionEngine_GetScriptContainer(ExecutionEngine engine) { engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(engine.ScriptContainer)); return(true); }
/// <summary> /// Constructor /// </summary> /// <param name="engine">Engine</param> /// <param name="handle">Handle</param> /// <param name="value">Raw value</param> internal ByteArrayStackItem(ExecutionEngine engine, IntPtr handle, byte[] value) : base(engine, value) { NativeEngine = engine; _handle = handle; }
/// <summary> /// 获得该智能合约的入口点(合约调用链的起点)的脚本哈希 /// </summary> /// <param name="engine">当前执行引擎</param> /// <returns>执行成功返回true</returns> protected bool ExecutionEngine_GetEntryScriptHash(ExecutionEngine engine) { engine.CurrentContext.EvaluationStack.Push(engine.EntryContext.ScriptHash); return(true); }
public static bool GetValue(ExecutionEngine engine) { //TransactionOutput // returns long throw new NotImplementedException(); }
/// <summary> /// 获得运行该智能合约的平台 /// </summary> /// <param name="engine">当前执行引擎</param> /// <returns>执行成功返回true</returns> protected bool Runtime_Platform(ExecutionEngine engine) { engine.CurrentContext.EvaluationStack.Push(Encoding.ASCII.GetBytes("NEO")); return(true); }
protected bool CheckWitness(ExecutionEngine engine, ECPoint pubkey) { return(CheckWitness(engine, Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash())); }
/// <summary> /// 获得该智能合约的触发条件(应用合约 or 鉴权合约) /// </summary> /// <param name="engine">当前执行引擎</param> /// <returns>执行成功返回true</returns> protected bool Runtime_GetTrigger(ExecutionEngine engine) { engine.CurrentContext.EvaluationStack.Push((int)Trigger); return(true); }
private bool Blockchain_GetValidators(ExecutionEngine engine) { ECPoint[] validators = Snapshot.GetValidators(); engine.CurrentContext.EvaluationStack.Push(validators.Select(p => (StackItem)p.EncodePoint(true)).ToArray()); return(true); }
/// <summary> /// 获得当前区块高度 /// </summary> /// <param name="engine">当前执行引擎</param> /// <returns>执行成功则返回true</returns> protected bool Blockchain_GetHeight(ExecutionEngine engine) { engine.CurrentContext.EvaluationStack.Push(Snapshot.Height); return(true); }
private bool Contract_Migrate(ExecutionEngine engine) { if (Trigger != TriggerType.Application) { return(false); } byte[] script = engine.CurrentContext.EvaluationStack.Pop().GetByteArray(); if (script.Length > 1024 * 1024) { return(false); } ContractParameterType[] parameter_list = engine.CurrentContext.EvaluationStack.Pop().GetByteArray().Select(p => (ContractParameterType)p).ToArray(); if (parameter_list.Length > 252) { return(false); } ContractParameterType return_type = (ContractParameterType)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); ContractPropertyState contract_properties = (ContractPropertyState)(byte)engine.CurrentContext.EvaluationStack.Pop().GetBigInteger(); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string name = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string version = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string author = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 252) { return(false); } string email = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); if (engine.CurrentContext.EvaluationStack.Peek().GetByteArray().Length > 65536) { return(false); } string description = Encoding.UTF8.GetString(engine.CurrentContext.EvaluationStack.Pop().GetByteArray()); UInt160 hash = script.ToScriptHash(); ContractState contract = Snapshot.Contracts.TryGet(hash); if (contract == null) { contract = new ContractState { Script = script, ParameterList = parameter_list, ReturnType = return_type, ContractProperties = contract_properties, Name = name, CodeVersion = version, Author = author, Email = email, Description = description }; Snapshot.Contracts.Add(hash, contract); ContractsCreated.Add(hash, new UInt160(engine.CurrentContext.ScriptHash)); if (contract.HasStorage) { foreach (var pair in Snapshot.Storages.Find(engine.CurrentContext.ScriptHash).ToArray()) { Snapshot.Storages.Add(new StorageKey { ScriptHash = hash, Key = pair.Key.Key }, new StorageItem { Value = pair.Value.Value }); } } } engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(contract)); return(Contract_Destroy(engine)); }
public static bool GetTransaction(ExecutionEngine engine) { //byte[] hash //returns Transaction throw new NotImplementedException(); }
public static bool GetValidators(ExecutionEngine engine) { //returns byte[][] throw new NotImplementedException(); }
public static Account GetAccount(this ExecutionEngine engine) { var emulator = engine.GetEmulator(); return(emulator.currentAccount); }