public bool IsWitness(Address address) { if (address == this.Chain.Address /*|| address == this.Address*/) { return(false); } if (address == this.EntryAddress) { return(true); } if (address.IsSystem) { var contextAddress = SmartContract.GetAddressForName(this.CurrentContext.Name); return(contextAddress == address); } if (address.IsInterop) { return(false); } if (this.Transaction == null) { return(false); } if (address.IsUser && Nexus.HasGenesis && this.Nexus.HasAddressScript(changeSet, address)) { return(InvokeTriggerOnAccount(address, AccountTrigger.OnWitness, address)); } return(this.Transaction.IsSignedBy(address)); }
public VMObject CallContext(string contextName, string methodName, params object[] args) { var previousContext = CurrentContext; var previousCaller = this.EntryAddress; var context = LoadContext(contextName); Expect(context != null, "could not call context: " + contextName); for (int i = args.Length - 1; i >= 0; i--) { var obj = VMObject.FromObject(args[i]); this.Stack.Push(obj); } this.Stack.Push(VMObject.FromObject(methodName)); BigInteger savedGas = this.UsedGas; this.EntryAddress = SmartContract.GetAddressForName(CurrentContext.Name); CurrentContext = context; var temp = context.Execute(this.CurrentFrame, this.Stack); Expect(temp == ExecutionState.Halt, "expected call success"); CurrentContext = previousContext; this.EntryAddress = previousCaller; if (contextName == Nexus.BombContractName) { this.UsedGas = savedGas; } if (this.Stack.Count > 0) { var result = this.Stack.Pop(); return(result); } else { return(new VMObject()); } }