Esempio n. 1
0
        private static void ValidateContract(string fileName, IConsole console, string[] parameters, ValidationServiceResult validationServiceResult)
        {
            byte[] compilation;
            IContractModuleDefinition moduleDefinition;

            BuildModuleDefinition(console, validationServiceResult, out compilation, out moduleDefinition);

            console.WriteLine($"Validating file {fileName}...");

            Assembly smartContract = Assembly.Load(compilation);

            var serializer = new MethodParameterSerializer();

            object[] methodParameters = null;
            if (parameters.Length != 0)
            {
                methodParameters = serializer.Deserialize(parameters);
            }

            validationServiceResult.ConstructorExists = Contract.ConstructorExists(smartContract.ExportedTypes.FirstOrDefault(), methodParameters);

            if (!validationServiceResult.ConstructorExists)
            {
                console.WriteLine("Smart contract construction failed.");
                console.WriteLine("No constructor exists with the provided parameters.");
            }

            validationServiceResult.DeterminismValidationResult = new SctDeterminismValidator().Validate(moduleDefinition);
            validationServiceResult.FormatValidationResult      = new SmartContractFormatValidator().Validate(moduleDefinition.ModuleDefinition);
            if (!validationServiceResult.DeterminismValidationResult.IsValid || !validationServiceResult.FormatValidationResult.IsValid)
            {
                console.WriteLine("Smart Contract failed validation. Run validate [FILE] for more info.");
            }

            console.WriteLine();
        }
Esempio n. 2
0
        private static void ValidateContract(string fileName, IConsole console, string[] parameters, ValidationServiceResult validationServiceResult)
        {
            byte[] compilation;
            SmartContractDecompilation decompilation;

            BuildModuleDefinition(console, validationServiceResult, out compilation, out decompilation);

            console.WriteLine($"Validating file {fileName}...");

            Assembly smartContract = Assembly.Load(compilation);

            var serializer = new MethodParameterSerializer();

            object[] methodParameters = null;
            if (parameters.Length != 0)
            {
                var methodParametersRaw = new MethodParameterSerializer().ToRaw(parameters);
                methodParameters = serializer.ToObjects(methodParametersRaw);
            }

            validationServiceResult.LifeCycleResult = SmartContractConstructor.Construct(smartContract.ExportedTypes.FirstOrDefault(), new ValidatorSmartContractState(), methodParameters);
            if (!validationServiceResult.LifeCycleResult.Success)
            {
                console.WriteLine("Smart contract construction failed.");
                console.WriteLine("If the smart contract is constructed with parameters, please ensure they are provided.");
            }

            validationServiceResult.DeterminismValidationResult = new SctDeterminismValidator().Validate(decompilation);
            validationServiceResult.FormatValidationResult      = new SmartContractFormatValidator().Validate(decompilation);
            if (!validationServiceResult.DeterminismValidationResult.IsValid || !validationServiceResult.FormatValidationResult.IsValid)
            {
                console.WriteLine("Smart Contract failed validation. Run validate [FILE] for more info.");
            }

            console.WriteLine();
        }
Esempio n. 3
0
        public void SmartContract_CanSerialize_OP_CREATECONTRACT_WithMethodParameters()
        {
            byte[] contractExecutionCode = Encoding.UTF8.GetBytes(
                @"
                using System;
                using Stratis.SmartContracts;
                [References]

                public class Test : SmartContract
                { 
                    public void TestMethod(int orders, bool canOrder)
                    {
                        [CodeToExecute]
                    }
                }"
                );

            string[] methodParameters = new string[]
            {
                string.Format("{0}#{1}", (int)MethodParameterDataType.Short, 12),
                string.Format("{0}#{1}", (int)MethodParameterDataType.Bool, true),
                string.Format("{0}#{1}", (int)MethodParameterDataType.String, "te|s|t"),
                string.Format("{0}#{1}", (int)MethodParameterDataType.String, "te#st"),
                string.Format("{0}#{1}", (int)MethodParameterDataType.String, "#4#te#st#"),
                string.Format("{0}#{1}", (int)MethodParameterDataType.Char, '#'),
            };

            var serializer = CallDataSerializer.Default;

            var methodParamSerializer = new MethodParameterSerializer();

            var contractTxData = new ContractTxData(1, 1, (Gas)5000, contractExecutionCode, methodParamSerializer.Deserialize(methodParameters));

            var callDataResult = serializer.Deserialize(serializer.Serialize(contractTxData));
            var callData       = callDataResult.Value;

            Assert.True(callDataResult.IsSuccess);
            Assert.Equal(contractTxData.VmVersion, callData.VmVersion);
            Assert.Equal(contractTxData.OpCodeType, callData.OpCodeType);
            Assert.Equal(contractTxData.ContractExecutionCode, callData.ContractExecutionCode);
            Assert.Equal(6, callData.MethodParameters.Length);

            Assert.NotNull(callData.MethodParameters[0]);
            Assert.Equal(12, callData.MethodParameters[0]);

            Assert.NotNull(callData.MethodParameters[1]);
            Assert.True((bool)callData.MethodParameters[1]);

            Assert.NotNull(callData.MethodParameters[2]);
            Assert.Equal("te|s|t", callData.MethodParameters[2]);

            Assert.NotNull(callData.MethodParameters[3]);
            Assert.Equal("te#st", callData.MethodParameters[3]);

            Assert.NotNull(callData.MethodParameters[4]);
            Assert.Equal("#4#te#st#", callData.MethodParameters[4]);

            Assert.NotNull(callData.MethodParameters[5]);
            Assert.Equal("#", callData.MethodParameters[5]);

            Assert.Equal(contractTxData.GasPrice, callData.GasPrice);
            Assert.Equal(contractTxData.GasLimit, callData.GasLimit);
        }
Esempio n. 4
0
        public void SmartContract_CanSerialize_OP_CALLCONTRACT_WithMethodParameters()
        {
            string[] methodParameters = new string[]
            {
                string.Format("{0}#{1}", (int)MethodParameterDataType.Bool, true),
                string.Format("{0}#{1}", (int)MethodParameterDataType.Byte, (byte)1),
                string.Format("{0}#{1}", (int)MethodParameterDataType.ByteArray, BitConverter.ToString(Encoding.UTF8.GetBytes("test"))),
                string.Format("{0}#{1}", (int)MethodParameterDataType.Char, 's'),
                string.Format("{0}#{1}", (int)MethodParameterDataType.SByte, -45),
                string.Format("{0}#{1}", (int)MethodParameterDataType.Short, 7),
                string.Format("{0}#{1}", (int)MethodParameterDataType.String, "test"),
                string.Format("{0}#{1}", (int)MethodParameterDataType.UInt, 36),
                string.Format("{0}#{1}", (int)MethodParameterDataType.UInt160, new uint160(new byte[20] {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
                })),
                string.Format("{0}#{1}", (int)MethodParameterDataType.ULong, 29),
                string.Format("{0}#{1}", (int)MethodParameterDataType.Address, new Address("0x95D34980095380851902ccd9A1Fb4C813C2cb639")),
                string.Format("{0}#{1}", (int)MethodParameterDataType.Address, new Address("mxKorCkWmtrPoekfWiMzERJPhaT13nnkMy"))
            };

            var serializer = CallDataSerializer.Default;

            var methodParamSerializer = new MethodParameterSerializer();

            var contractTxData = new ContractTxData(1, 1, (Gas)5000, 100, "Execute", methodParamSerializer.Deserialize(methodParameters));
            var callDataResult = serializer.Deserialize(serializer.Serialize(contractTxData));
            var callData       = callDataResult.Value;

            Assert.True(callDataResult.IsSuccess);

            Assert.NotNull(callData.MethodParameters[0]);
            Assert.Equal(true, callData.MethodParameters[0]);

            Assert.NotNull(callData.MethodParameters[1]);
            Assert.Equal((byte)1, callData.MethodParameters[1]);

            Assert.NotNull(callData.MethodParameters[2]);
            Assert.Equal(BitConverter.ToString(Encoding.UTF8.GetBytes("test")), callData.MethodParameters[2]);

            Assert.NotNull(callData.MethodParameters[3]);
            Assert.Equal("s", callData.MethodParameters[3]);

            Assert.NotNull(callData.MethodParameters[4]);
            Assert.Equal((sbyte)-45, callData.MethodParameters[4]);

            Assert.NotNull(callData.MethodParameters[5]);
            Assert.Equal((int)7, callData.MethodParameters[5]);

            Assert.NotNull(callData.MethodParameters[6]);
            Assert.Equal("test", callData.MethodParameters[6]);

            Assert.NotNull(callData.MethodParameters[7]);
            Assert.Equal((uint)36, callData.MethodParameters[7]);

            Assert.NotNull(callData.MethodParameters[8]);
            Assert.Equal(new uint160(new byte[20] {
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            }), callData.MethodParameters[8]);

            Assert.NotNull(callData.MethodParameters[9]);
            Assert.Equal((ulong)29, callData.MethodParameters[9]);

            Assert.NotNull(callData.MethodParameters[10]);
            Assert.Equal(new Address("0x95D34980095380851902ccd9A1Fb4C813C2cb639"), callData.MethodParameters[10]);

            Assert.NotNull(callData.MethodParameters[11]);
            Assert.Equal(new Address("mxKorCkWmtrPoekfWiMzERJPhaT13nnkMy"), callData.MethodParameters[11]);
        }