Saltar al contenido

Evaluación de scripts Plutus

Esta página describe cómo EvaluateContext evalúa scripts Plutus V1 a V4 con datos del ledger, presupuestos de ejecución y contextos de evaluación.

Cada método EvaluateContext recibe los datos del ledger del script junto con el presupuesto de ejecución y el contexto de evaluación. El método también acepta un context.Context de Go que puede detener la evaluación.

Versión del scriptArgumentos de datosForma del método
Plutus V1datum, redeemer, scriptContextEvaluateContext(ctx, datum, redeemer, scriptContext, budget, evalContext)
Plutus V2datum, redeemer, scriptContextEvaluateContext(ctx, datum, redeemer, scriptContext, budget, evalContext)
Plutus V3scriptContextEvaluateContext(ctx, scriptContext, budget, evalContext)
Plutus V4scriptContextEvaluateContext(ctx, scriptContext, budget, evalContext)

Plutus V1 y V2 aplican los argumentos datum, redeemer y scriptContext en ese orden. Plutus V3 y V4 reciben scriptContext; el contexto contiene los datos que requieren esas versiones del script.

El llamador proporciona budget y evalContext para cada versión. El evaluador aplica el budget que recibe, incluido un presupuesto de cero.

EvaluateContext pasa los valores datum, redeemer y scriptContext del estado del ledger como argumentos de ejecución. El evaluador mantiene esos valores separados del término del programa UPLC, por lo que sus nodos de datos Plutus no aumentan el recuento estructural de nodos del programa UPLC.

Este comportamiento permite que el evaluador procese contextos con datums inline muy grandes sin que los propios datos del ledger provoquen un error por el límite de nodos estructurales. La cobertura de regresión de V3 incluye un contexto del ledger con más de 1,000,000 nodos de PlutusData.

El evaluador trata como argumentos de confianza únicamente los valores de datos finitos que recibe mediante los argumentos de EvaluateContext. El evaluador aún decodifica y valida el programa UPLC, y los límites estructurales siguen aplicándose a ese programa. Este comportamiento no hace ilimitados los datos del ledger ni elimina la aplicación del presupuesto de ejecución.

Antes de pasar cada árbol de argumentos de confianza a EvaluateContext, el llamador debe validarlo. EvaluateContext reenvía esos árboles a RunContextWithTrustedDataArguments, cuya validación omite deliberadamente los árboles reenviados. Por ello, el llamador debe garantizar desde el origen que cada árbol sea finito, contenga datos Plutus válidos y sea acíclico.

El evaluador rechaza los términos de script malformados o desconocidos que construye el código del llamador y devuelve un error en lugar de evaluarlos. El llamador debe corregir el término antes de volver a intentarlo después de ese error.