Ejemplo n.º 1
0
        public void TestGetValidators2()
        {
            var snapshot = Blockchain.Singleton.GetSnapshot();
            var result   = NativeContract.NEO.GetValidators(snapshot);

            result[0].ToArray().ToHexString().Should().Be("03b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c");
            result[1].ToArray().ToHexString().Should().Be("02df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e895093");
            result[2].ToArray().ToHexString().Should().Be("03b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a");
            result[3].ToArray().ToHexString().Should().Be("02ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba554");
            result[4].ToArray().ToHexString().Should().Be("024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d");
            result[5].ToArray().ToHexString().Should().Be("02aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e");
            result[6].ToArray().ToHexString().Should().Be("02486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a70");

            StorageKey           key   = CreateStorageKey(15);
            ValidatorsCountState state = new ValidatorsCountState();

            for (int i = 0; i < 100; i++)
            {
                state.Votes[i] = new BigInteger(i + 1);
            }
            snapshot.Storages.Add(key, new StorageItem()
            {
                Value = state.ToByteArray()
            });
            NativeContract.NEO.GetValidators(snapshot).ToArray().Length.Should().Be(7);
        }
Ejemplo n.º 2
0
        public void TestValidatorsCountState_FromByteArray()
        {
            ValidatorsCountState input = new ValidatorsCountState {
                Votes = new BigInteger[] { new BigInteger(1000) }
            };
            ValidatorsCountState output = ValidatorsCountState.FromByteArray(input.ToByteArray());

            output.Should().BeEquivalentTo(input);
        }
Ejemplo n.º 3
0
        private StackItem Vote(ApplicationEngine engine, VMArray args)
        {
            UInt160 account = new UInt160(args[0].GetByteArray());

            ECPoint[] pubkeys = ((VMArray)args[1]).Select(p => p.GetByteArray().AsSerializable <ECPoint>()).ToArray();
            if (!InteropService.CheckWitness(engine, account))
            {
                return(false);
            }
            StorageKey key_account = CreateAccountKey(account);

            if (engine.Snapshot.Storages.TryGet(key_account) is null)
            {
                return(false);
            }
            StorageItem  storage_account = engine.Snapshot.Storages.GetAndChange(key_account);
            AccountState state_account   = new AccountState(storage_account.Value);

            foreach (ECPoint pubkey in state_account.Votes)
            {
                StorageItem    storage_validator = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_Validator, pubkey.ToArray()));
                ValidatorState state_validator   = ValidatorState.FromByteArray(storage_validator.Value);
                state_validator.Votes  -= state_account.Balance;
                storage_validator.Value = state_validator.ToByteArray();
            }
            pubkeys = pubkeys.Distinct().Where(p => engine.Snapshot.Storages.TryGet(CreateStorageKey(Prefix_Validator, p.ToArray())) != null).ToArray();
            if (pubkeys.Length != state_account.Votes.Length)
            {
                StorageItem storage_count = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_ValidatorsCount), () => new StorageItem
                {
                    Value = new ValidatorsCountState().ToByteArray()
                });
                ValidatorsCountState state_count = ValidatorsCountState.FromByteArray(storage_count.Value);
                if (state_account.Votes.Length > 0)
                {
                    state_count.Votes[state_account.Votes.Length - 1] -= state_account.Balance;
                }
                if (pubkeys.Length > 0)
                {
                    state_count.Votes[pubkeys.Length - 1] += state_account.Balance;
                }
                storage_count.Value = state_count.ToByteArray();
            }
            state_account.Votes   = pubkeys;
            storage_account.Value = state_account.ToByteArray();
            foreach (ECPoint pubkey in state_account.Votes)
            {
                StorageItem    storage_validator = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_Validator, pubkey.ToArray()));
                ValidatorState state_validator   = ValidatorState.FromByteArray(storage_validator.Value);
                state_validator.Votes  += state_account.Balance;
                storage_validator.Value = state_validator.ToByteArray();
            }
            return(true);
        }
Ejemplo n.º 4
0
        internal (bool State, bool Result) Transfer4TesingOnBalanceChanging(BigInteger amount, bool addVotes)
        {
            var snapshot = Blockchain.Singleton.GetSnapshot();

            snapshot.PersistingBlock = Blockchain.GenesisBlock;
            var           engine = new ApplicationEngine(TriggerType.Application, Blockchain.GenesisBlock, snapshot, 0, true);
            ScriptBuilder sb     = new ScriptBuilder();
            var           tmp    = engine.ScriptContainer.GetScriptHashesForVerifying(engine.Snapshot);
            UInt160       from   = engine.ScriptContainer.GetScriptHashesForVerifying(engine.Snapshot)[0];

            if (addVotes)
            {
                snapshot.Storages.Add(CreateStorageKey(20, from.ToArray()), new StorageItem
                {
                    Value = new AccountState()
                    {
                        Votes   = new ECPoint[] { ECCurve.Secp256r1.G },
                        Balance = new BigInteger(1000)
                    }.ToByteArray()
                });
                snapshot.Storages.Add(NativeContract.NEO.CreateStorageKey(33, ECCurve.Secp256r1.G), new StorageItem
                {
                    Value = new ValidatorState().ToByteArray()
                });

                ValidatorsCountState state = new ValidatorsCountState();
                for (int i = 0; i < 100; i++)
                {
                    state.Votes[i] = new BigInteger(i + 1);
                }
                snapshot.Storages.Add(CreateStorageKey(15), new StorageItem()
                {
                    Value = state.ToByteArray()
                });
            }
            else
            {
                snapshot.Storages.Add(CreateStorageKey(20, from.ToArray()), new StorageItem
                {
                    Value = new AccountState()
                    {
                        Balance = new BigInteger(1000)
                    }.ToByteArray()
                });
            }

            sb.EmitAppCall(NativeContract.NEO.Hash, "transfer", from, UInt160.Zero, amount);
            engine.LoadScript(sb.ToArray());
            engine.Execute();
            var result = engine.ResultStack.Peek();

            result.GetType().Should().Be(typeof(VM.Types.Boolean));
            return(true, result.ToBoolean());
        }
Ejemplo n.º 5
0
        protected override void OnBalanceChanging(ApplicationEngine engine, UInt160 account, AccountState state, BigInteger amount)
        {
            DistributeGas(engine, account, state);
            if (amount.IsZero)
            {
                return;
            }
            if (state.Votes.Length == 0)
            {
                return;
            }
            foreach (ECPoint pubkey in state.Votes)
            {
                StorageItem    storage_validator = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_Validator, pubkey.ToArray()));
                ValidatorState state_validator   = ValidatorState.FromByteArray(storage_validator.Value);
                state_validator.Votes  += amount;
                storage_validator.Value = state_validator.ToByteArray();
            }
            StorageItem          storage_count = engine.Snapshot.Storages.GetAndChange(CreateStorageKey(Prefix_ValidatorsCount));
            ValidatorsCountState state_count   = ValidatorsCountState.FromByteArray(storage_count.Value);

            state_count.Votes[state.Votes.Length - 1] += amount;
            storage_count.Value = state_count.ToByteArray();
        }
Ejemplo n.º 6
0
        public ECPoint[] GetValidators(Snapshot snapshot)
        {
            StorageItem storage_count = snapshot.Storages.TryGet(CreateStorageKey(Prefix_ValidatorsCount));

            if (storage_count is null)
            {
                return(Blockchain.StandbyValidators);
            }
            ValidatorsCountState state_count = ValidatorsCountState.FromByteArray(storage_count.Value);
            int count = (int)state_count.Votes.Select((p, i) => new
            {
                Count = i,
                Votes = p
            }).Where(p => p.Votes.Sign > 0).ToArray().WeightedFilter(0.25, 0.75, p => p.Votes, (p, w) => new
            {
                p.Count,
                Weight = w
            }).WeightedAverage(p => p.Count, p => p.Weight);

            count = Math.Max(count, Blockchain.StandbyValidators.Length);
            HashSet <ECPoint> sv = new HashSet <ECPoint>(Blockchain.StandbyValidators);

            return(GetRegisteredValidators(snapshot).Where(p => (p.Votes.Sign > 0) || sv.Contains(p.PublicKey)).OrderByDescending(p => p.Votes).ThenBy(p => p.PublicKey).Select(p => p.PublicKey).Take(count).OrderBy(p => p).ToArray());
        }