示例#1
0
        public void TestGasInjector_OutOfGasFails()
        {
            SmartContractCompilationResult compilationResult = SmartContractCompiler.CompileFile("SmartContracts/OutOfGasTest.cs");

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            var callData = new MethodCall("UseAllGas");

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes);

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            IContractInvocationResult result = contract.Invoke(callData);

            Assert.False(result.IsSuccess);
            Assert.Equal((Gas)0, this.gasMeter.GasAvailable);
            Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed);
            Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed);
        }
        public void TestGasInjector_ContractMethodWithRecursion_GasInjectionSucceeds()
        {
            ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/Recursion.cs");

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            var callData = new MethodCall(nameof(Recursion.DoRecursion));

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            assembly.Value.SetObserver(new Observer(this.gasMeter, new MemoryMeter(ReflectionVirtualMachine.MemoryUnitLimit)));

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            IContractInvocationResult result = contract.Invoke(callData);

            Assert.True(result.IsSuccess);
            Assert.True(this.gasMeter.GasConsumed > 0);
        }
 public Result Handle(StudentInviteCommand command)
 {
     command.Student.AddInvite(new Data.Entities.Invite(command.Student.Id, command.Token, false, command.Student.Email));
     _context.Students.Update(command.Student);
     _context.SaveChanges();
     return(Result.Ok());
 }
示例#4
0
        public void TestGasInjector_OutOfGasFails()
        {
            ContractCompilationResult compilationResult = ContractCompiler.CompileFile("SmartContracts/OutOfGasTest.cs");

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            var callData = new MethodCall("UseAllGas");

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            // Because our contract contains an infinite loop, we want to kill our test after
            // some amount of time without achieving a result. 3 seconds is an arbitrarily high enough timeout
            // for the method body to have finished execution while minimising the amount of time we spend
            // running tests
            // If you're running with the debugger on this will obviously be a source of failures
            IContractInvocationResult result = TimeoutHelper.RunCodeWithTimeout(5, () => contract.Invoke(callData));

            Assert.False(result.IsSuccess);
            Assert.Equal((RuntimeObserver.Gas) 0, this.gasMeter.GasAvailable);
            Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed);
            Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed);
        }
        public void SmartContracts_GasInjector_SingleParamConstructorGasInjectedSuccess()
        {
            ContractCompilationResult compilationResult =
                ContractCompiler.Compile(TestSingleConstructorSource);

            Assert.True(compilationResult.Success);
            byte[] originalAssemblyBytes = compilationResult.Compilation;

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            IContractInvocationResult result = contract.InvokeConstructor(null);

            // TODO: Un-hard-code this.
            // Constructor: 15
            // Property setter: 12
            // Storage: 150
            // "string newString = this.Owner + 1;": 36
            Assert.Equal((Gas)213, this.gasMeter.GasConsumed);
        }
示例#6
0
            public Result Handle(AddUnitCommand command)
            {
                var unit = Unit.CreateTimeUnit(command.Name);

                _context.Units.Add(unit);
                _context.SaveChanges();
                return(Result.Ok());
            }
示例#7
0
            public Result Handle(TeacherRegistrationCommand command)
            {
                var registration = new TeacherRegistration(command.Token, false, command.Email);

                _context.Registrations.Add(registration);
                _context.SaveChanges();
                return(Result.Ok(value: registration.Id));
            }
            public Result Handle(AddExerciseCommand command)
            {
                var exercise = new Exercise(command.Name, command.UnitId, command.Comment);

                _context.Exercises.Add(exercise);
                _context.SaveChanges();
                return(Result.Ok());
            }
示例#9
0
            public Result Handle(AddClassCommand command)
            {
                var schoolClass = new SchoolClass(command.Name);

                _context.Classes.Add(schoolClass);
                _context.SaveChanges();
                return(Result.Ok());
            }
示例#10
0
            public Result Handle(UserRegisteredCommand command)
            {
                var student = command.Student;

                student.MarkInviteUsed();
                _context.Students.Update(command.Student);
                _context.SaveChanges();
                return(Result.Ok());
            }
示例#11
0
            public Result Handle(EditAppUserCommand command)
            {
                var user = command.User;

                command.User.HideResults = command.HideResults;
                _context.Persons.Update(user);
                _context.SaveChanges();
                return(Result.Ok());
            }
示例#12
0
        public void ContractAssemblyLoaderIsForwardCompatibleWithSmartContractAndStandardsUpdates()
        {
            // Create the byte code of a contract that contains new data types that are not (normally) supported by the current node.
            ContractCompilationResult result = ContractCompiler.Compile(this.testContract);

            byte[] bytes = result.Compilation;

            // Test that the node is able to load the futuristic contract.
            ContractAssemblyLoader loader = new ContractAssemblyLoader();

            CSharpFunctionalExtensions.Result <IContractAssembly> result2 = loader.Load(new ContractByteCode(bytes));
            IContractAssembly assembly = result2.Value;

            Assert.Equal("FruitVendor", assembly.Assembly.GetTypes().First().Name);
        }
示例#13
0
        private IContract GetContractAfterRewrite(string filename)
        {
            ContractCompilationResult compilationResult = ContractCompiler.CompileFile(filename);

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            return(Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null));
        }
            public CSharpFunctionalExtensions.Result Handle(EditAddStudentCommand command)
            {
                var student = _context.Students.Find(command.Id);

                if (student == null)
                {
                    student = new Data.Entities.Student();
                    _context.Students.Add(student);
                    _context.SaveChanges();
                }

                if (!string.IsNullOrWhiteSpace(command.StudentCardNumber))
                {
                    student.StudentCardNumber = command.StudentCardNumber;
                }

                if (command.Gender.HasValue)
                {
                    student.Gender = command.Gender.Value;
                }

                if (!string.IsNullOrWhiteSpace(command.Email))
                {
                    student.Email = command.Email;
                }

                if (!string.IsNullOrWhiteSpace(command.Name))
                {
                    student.Name = command.Name;
                }

                if (command.SchoolClassId.HasValue)
                {
                    student.SchoolClassId = command.SchoolClassId.Value;
                }

                if (command.ShouldResultsBeHidden.HasValue)
                {
                    student.HiddenResults = command.ShouldResultsBeHidden.Value;
                }

                _context.Students.Update(student);
                _context.SaveChanges();
                return(Result.Ok());
            }
        public void TestGasInjector_NestedType_GasInjectionSucceeds()
        {
            ContractCompilationResult compilationResult = ContractCompiler.Compile(@"
using System;
using Stratis.SmartContracts;

public class Test : SmartContract
{
    public Test(ISmartContractState state): base(state) {
        var other = new Other.NestedOther();
        other.Loop();
    }
}

public static class Other
{
    public struct NestedOther {
        public void Loop() { while(true) {}}
    }
}
");

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            assembly.Value.SetObserver(new Observer(this.gasMeter, new MemoryMeter(ReflectionVirtualMachine.MemoryUnitLimit)));

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            IContractInvocationResult result = contract.InvokeConstructor(null);

            Assert.False(result.IsSuccess);
            Assert.Equal(this.gasMeter.GasLimit, this.gasMeter.GasConsumed);
        }
示例#16
0
        public void SmartContracts_GasInjector_MultipleParamConstructorGasInjectedSuccess()
        {
            ContractCompilationResult compilationResult =
                ContractCompiler.Compile(TestMultipleConstructorSource);

            Assert.True(compilationResult.Success);
            byte[] originalAssemblyBytes = compilationResult.Compilation;

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            IContractInvocationResult result = contract.InvokeConstructor(new[] { "Test Owner" });

            // Number here shouldn't be hardcoded - note this is really only to let us know of consensus failure
            Assert.Equal((RuntimeObserver.Gas) 328, this.gasMeter.GasConsumed);
        }
示例#17
0
        public void TestGasInjector()
        {
            SmartContractCompilationResult compilationResult = SmartContractCompiler.Compile(TestSource);

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            var resolver = new DefaultAssemblyResolver();

            resolver.AddSearchDirectory(AppContext.BaseDirectory);
            int aimGasAmount;

            using (ModuleDefinition moduleDefinition = ModuleDefinition.ReadModule(
                       new MemoryStream(originalAssemblyBytes),
                       new ReaderParameters {
                AssemblyResolver = resolver
            }))
            {
                TypeDefinition   contractType = moduleDefinition.GetType(ContractName);
                MethodDefinition testMethod   = contractType.Methods.FirstOrDefault(x => x.Name == MethodName);
                aimGasAmount =
                    testMethod?.Body?.Instructions?
                    .Count ?? 10000000;
            }

            var callData = new MethodCall("TestMethod", new object[] { 1 });

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes);

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            IContractInvocationResult result = contract.Invoke(callData);

            Assert.Equal((ulong)aimGasAmount, this.state.GasMeter.GasConsumed);
        }
        public void TestGasInjector()
        {
            ContractCompilationResult compilationResult = ContractCompiler.Compile(TestSource);

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            var resolver = new DefaultAssemblyResolver();

            resolver.AddSearchDirectory(AppContext.BaseDirectory);

            using (ModuleDefinition moduleDefinition = ModuleDefinition.ReadModule(
                       new MemoryStream(originalAssemblyBytes),
                       new ReaderParameters {
                AssemblyResolver = resolver
            }))
            {
                TypeDefinition   contractType = moduleDefinition.GetType(ContractName);
                MethodDefinition testMethod   = contractType.Methods.FirstOrDefault(x => x.Name == MethodName);
            }

            var callData = new MethodCall("TestMethod", new object[] { 1 });

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assembly = this.assemblyLoader.Load(module.ToByteCode());

            assembly.Value.SetObserver(new Observer(this.gasMeter, new MemoryMeter(ReflectionVirtualMachine.MemoryUnitLimit)));

            IContract contract = Contract.CreateUninitialized(assembly.Value.GetType(module.ContractType.Name), this.state, null);

            IContractInvocationResult result = contract.Invoke(callData);

            // Number here shouldn't be hardcoded - note this is really only to let us know of consensus failure
            Assert.Equal(22uL, this.gasMeter.GasConsumed);
        }
        public void Separate_Threads_Have_Different_Observer_Instances()
        {
            // Create a contract assembly.
            ContractCompilationResult compilationResult = ContractCompiler.Compile(TestSource);

            Assert.True(compilationResult.Success);

            byte[] originalAssemblyBytes = compilationResult.Compilation;

            IContractModuleDefinition module = this.moduleReader.Read(originalAssemblyBytes).Value;

            module.Rewrite(this.rewriter);

            CSharpFunctionalExtensions.Result <IContractAssembly> assemblyLoadResult = this.assemblyLoader.Load(module.ToByteCode());

            IContractAssembly assembly = assemblyLoadResult.Value;

            var threadCount = 10;

            var observers = new Observer[threadCount];

            var countdown = new CountdownEvent(threadCount);

            var threads = new Thread[threadCount];

            for (var i = 0; i < threadCount; i++)
            {
                // Create a fake observer with a counter.
                var observer = new Observer(new GasMeter((Gas)1000000), new MemoryMeter(1000000));

                observers[i] = observer;

                // Set a different observer on each thread.
                // Invoke the same method on each thread.
                Thread newThread = new Thread(() =>
                {
                    assembly.SetObserver(observer);

                    Assert.Same(observer, assembly.GetObserver());
                    var callData       = new MethodCall("TestMethod", new object[] { 1 });
                    IContract contract = Contract.CreateUninitialized(assembly.GetType(module.ContractType.Name), this.state, null);

                    IContractInvocationResult result = contract.Invoke(callData);

                    countdown.Signal();
                });

                newThread.Name = i.ToString();
                threads[i]     = newThread;
            }

            // Start the threads on a separate loop to ensure all time is spent on processing.
            foreach (Thread thread in threads)
            {
                thread.Start();
            }

            countdown.Wait();

            foreach (Observer observer in observers)
            {
                Assert.Equal(observers[0].GasMeter.GasConsumed, observer.GasMeter.GasConsumed);
                Assert.Equal(observers[0].MemoryMeter.MemoryConsumed, observer.MemoryMeter.MemoryConsumed);
            }
        }