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(); }
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(); }
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); }
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]); }