feat: sandboxing via VM2
This commit is contained in:
committed by
Piotr Pędziwiatr
parent
0815796b32
commit
fa6276bba3
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user