Example #1
0
        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));
        }
Example #2
0
        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());
            }
        }