예제 #1
0
        private static dynamic CreateLogger()
        {
            var types             = TranslatorAssembly.GetTypes();
            var loggerLevelType   = ContractAssembly.GetTypes().First(t => t.Name == "LoggerLevel");
            var loggerLevelValue  = Enum.ToObject(loggerLevelType, 10);
            var consoleLoggerType = types.First(t => t.FullName == "Bridge.Translator.Logging.ConsoleLoggerWriter");
            var fileLoggerType    = types.First(t => t.FullName == "Bridge.Translator.Logging.FileLoggerWriter");

            var type = types.First(t => t.FullName == "Bridge.Translator.Logging.Logger");

            return(System.Activator.CreateInstance(type, null, false, loggerLevelValue, true, System.Activator.CreateInstance(consoleLoggerType), System.Activator.CreateInstance(fileLoggerType)));
        }
예제 #2
0
        private static bool TryReadReferencesPathFromConfig(string folder, dynamic bridgeOptions)
        {
            var type  = ContractAssembly.GetTypes().First(t => t.Name == "ConfigHelper`1");
            var gtype = type.MakeGenericType(TranslatorAssembly.GetTypes().First(t => t.Name == "AssemblyInfo"));

            dynamic helper = System.Activator.CreateInstance(gtype, CreateLogger());
            var     info   = helper.ReadConfig("bridge.json", true, folder, bridgeOptions.ProjectProperties.Configuration);

            if (info != null && !string.IsNullOrWhiteSpace(info.ReferencesPath))
            {
                bridgeOptions.Lib = Path.Combine(Path.IsPathRooted(info.ReferencesPath) ? info.ReferencesPath : Path.Combine(folder, info.ReferencesPath), new DirectoryInfo(folder).Name + ".dll");

                return(true);
            }

            return(false);
        }
예제 #3
0
        public void Only_Map_Deployed_Type_Single_Contract_Success()
        {
            string code = @"
using Stratis.SmartContracts;
public class PrimitiveParams : SmartContract
{
    public PrimitiveParams(ISmartContractState state): base(state) {}
    public void SomeMethod(string i) {}
}
";
            var    compilationResult = ContractCompiler.Compile(code);

            var assembly = Assembly.Load(compilationResult.Compilation);

            var contractAssembly = new ContractAssembly(assembly);

            var mapper = new ContractSchemaFactory();

            IDictionary <string, OpenApiSchema> mapped = mapper.Map(contractAssembly);

            Assert.Equal(1, mapped.Count);
            Assert.True(mapped.ContainsKey("SomeMethod"));
        }
예제 #4
0
        public void VM_ExecuteContract_CachedAssembly_WithExistingObserver()
        {
            ContractCompilationResult compilationResult = ContractCompiler.Compile(
                @"
using System;
using Stratis.SmartContracts;

public class Contract : SmartContract
{
    public Contract(ISmartContractState state) : base(state) {}

    public void Test() {}
}
");

            Assert.True(compilationResult.Success);

            byte[] contractExecutionCode = compilationResult.Compilation;
            byte[] codeHash = HashHelper.Keccak256(contractExecutionCode);

            byte[] rewrittenCode;

            // Rewrite the assembly to have an observer.
            using (IContractModuleDefinition moduleDefinition = this.context.ModuleDefinitionReader.Read(contractExecutionCode).Value)
            {
                var rewriter = new ObserverInstanceRewriter();

                moduleDefinition.Rewrite(rewriter);

                rewrittenCode = moduleDefinition.ToByteCode().Value;
            }

            var contractAssembly = new ContractAssembly(Assembly.Load(rewrittenCode));

            // Cache the assembly.
            this.context.ContractCache.Store(new uint256(codeHash), new CachedAssemblyPackage(contractAssembly));

            // Set an observer on the cached rewritten assembly.
            var initialObserver = new Observer(new GasMeter((Gas)(this.gasMeter.GasAvailable + 1000)), new MemoryMeter(100_000));

            Assert.True(contractAssembly.SetObserver(initialObserver));

            var callData = new MethodCall("Test");

            // Run the execution with an empty gas meter, which means it should fail if the correct observer is used.
            var emptyGasMeter = new GasMeter((Gas)0);

            var executionContext = new ExecutionContext(new Observer(emptyGasMeter, new MemoryMeter(100_000)));

            VmExecutionResult result = this.vm.ExecuteMethod(this.contractState,
                                                             executionContext,
                                                             callData,
                                                             contractExecutionCode,
                                                             "Contract");

            CachedAssemblyPackage cachedAssembly = this.context.ContractCache.Retrieve(new uint256(codeHash));

            // Check that it's still cached.
            Assert.NotNull(cachedAssembly);

            // Check that the observer has been reset to the original.
            Assert.Same(initialObserver, cachedAssembly.Assembly.GetObserver());
            Assert.False(result.IsSuccess);
            Assert.Equal(VmExecutionErrorKind.OutOfGas, result.Error.ErrorKind);
        }
예제 #5
0
 private static Type GetEmitterException()
 {
     return(ContractAssembly.GetTypes().First(t => t.Name == "EmitterException"));
 }
예제 #6
0
        private static dynamic CreateProjectProperties()
        {
            var type = ContractAssembly.GetTypes().First(t => t.Name == "ProjectProperties");

            return(System.Activator.CreateInstance(type));
        }