feat: sandboxing via VM2

This commit is contained in:
ppedziwiatr
2022-03-17 00:11:07 +01:00
committed by Piotr Pędziwiatr
parent 0815796b32
commit fa6276bba3
23 changed files with 354 additions and 53 deletions

View File

@@ -1,5 +1,5 @@
import Arweave from 'arweave';
import { ContractDefinition, ExecutorFactory, HandlerApi } from '@smartweave/core';
import { ContractDefinition, EvaluationOptions, ExecutorFactory, HandlerApi } from '@smartweave/core';
import { SwCache } from '@smartweave/cache';
import { LoggerFactory } from '@smartweave/logging';
import { SmartWeaveGlobal } from '@smartweave/legacy';
@@ -16,8 +16,11 @@ export class CacheableExecutorFactory<Api> implements ExecutorFactory<Api> {
private readonly cache: SwCache<string, Api>
) {}
async create<State>(contractDefinition: ContractDefinition<State>): Promise<Api> {
return await this.baseImplementation.create(contractDefinition);
async create<State>(
contractDefinition: ContractDefinition<State>,
evaluationOptions: EvaluationOptions
): Promise<Api> {
return await this.baseImplementation.create(contractDefinition, evaluationOptions);
// warn: do not cache on the contractDefinition.srcTxId. This might look like a good optimisation
// (as many contracts share the same source code), but unfortunately this is causing issues

View File

@@ -1,4 +1,4 @@
import { ContractDefinition, ExecutorFactory } from '@smartweave/core';
import { ContractDefinition, EvaluationOptions, ExecutorFactory } from '@smartweave/core';
/**
* An ExecutorFactory that allows to substitute original contract's source code.
@@ -14,7 +14,10 @@ export class DebuggableExecutorFactory<Api> implements ExecutorFactory<Api> {
private readonly sourceCode: { [key: string]: string }
) {}
async create<State>(contractDefinition: ContractDefinition<State>): Promise<Api> {
async create<State>(
contractDefinition: ContractDefinition<State>,
evaluationOptions: EvaluationOptions
): Promise<Api> {
if (Object.prototype.hasOwnProperty.call(this.sourceCode, contractDefinition.txId)) {
contractDefinition = {
...contractDefinition,
@@ -22,6 +25,6 @@ export class DebuggableExecutorFactory<Api> implements ExecutorFactory<Api> {
};
}
return await this.baseImplementation.create(contractDefinition);
return await this.baseImplementation.create(contractDefinition, evaluationOptions);
}
}

View File

@@ -71,7 +71,10 @@ export class Evolve implements ExecutionContextModifier {
// but forcing different sourceTxId...
this.logger.info('Evolving to: ', evolvedSrcTxId);
const newContractDefinition = await this.definitionLoader.load<State>(contractTxId, evolvedSrcTxId);
const newHandler = (await this.executorFactory.create<State>(newContractDefinition)) as HandlerApi<State>;
const newHandler = (await this.executorFactory.create<State>(
newContractDefinition,
executionContext.evaluationOptions
)) as HandlerApi<State>;
//FIXME: side-effect...
executionContext.contractDefinition = newContractDefinition;