Esempio n. 1
0
        public bool IsWitness(Address address)
        {
            if (address.IsInterop)
            {
                return(false);
            }

            if (address == Address.Null)
            {
                return(false);
            }

            if (address == this.Chain.Address /*|| address == this.Address*/)
            {
                return(false);
            }

            if (address == this.EntryAddress)
            {
                return(true);
            }

            using (var m = new ProfileMarker("validatedWitnesses.Contains"))
                if (validatedWitnesses.Contains(address))
                {
                    return(true);
                }

            if (address.IsSystem)
            {
                var org = Nexus.GetOrganizationByAddress(RootStorage, address);
                if (org != null)
                {
                    this.ConsumeGas(10000);
                    var result = org.IsWitness(Transaction);

                    if (result)
                    {
                        validatedWitnesses.Add(address);
                    }

                    return(result);
                }
                else
                {
                    return(address == CurrentContext.Address);
                }
            }

            if (this.Transaction == null)
            {
                return(false);
            }

            bool accountResult;

            if (address.IsUser && Nexus.HasGenesis && OptimizedHasAddressScript(RootStorage, address))
            {
                using (var m = new ProfileMarker("InvokeTriggerOnAccount"))
                    accountResult = InvokeTriggerOnAccount(address, AccountTrigger.OnWitness, address);
            }
            else
            {
                using (var m = new ProfileMarker("Transaction.IsSignedBy"))
                    accountResult = this.Transaction.IsSignedBy(address);
            }

            if (accountResult)
            {
                validatedWitnesses.Add(address);
            }

            return(accountResult);
        }