Sealevel – Procesamiento paralelo de miles de contratos inteligentes

Comprenda 1 de las 8 tecnologías clave que hacen de Solana la cadena de bloques más eficiente del mundo

Solana es la cadena de bloques sin permiso más eficiente del mundo. En las iteraciones actuales de Solana Testnet, una red de 200 nodos físicamente distintos admite un rendimiento sostenido de más de 50,000 transacciones por segundo cuando se ejecuta con GPU. Lograrlo como tal requiere la implementación de varias optimizaciones y nuevas tecnologías, y el resultado es un avance en la capacidad de la red que señala una nueva fase en el desarrollo de blockchain.

Hay 8 innovaciones clave que hacen posible la red Solana:

En esta publicación de blog, exploraremos El nivel del mar, El tiempo de ejecución de los contratos inteligentes paralelos de Solana. Antes de comenzar, una cosa a tener en cuenta es que los tiempos de ejecución basados ​​en WASM de EVM y EOS son de un solo subproceso. Eso significa que un contrato a la vez modifica el estado de blockchain. Lo que hemos construido en Solana es un tiempo de ejecución que puede procesar decenas de miles de contratos en paralelo, utilizando tantos núcleos como estén disponibles para el Validador.

La razón por la cual Solana puede procesar transacciones en paralelo es que las transacciones de Solana describen todos los estados que una transacción leerá o escribirá durante la ejecución. Esto no solo permite que las transacciones no superpuestas se ejecuten simultáneamente, sino que también las transacciones que solo leen el mismo estado se ejecutan simultáneamente.

Cloudbreak, nuestra base de datos de cuentas, es un mapeo de claves públicas a cuentas. Las cuentas mantienen saldos y datos, donde los datos son un vector de bytes. Las cuentas tienen un campo de "propietario". El propietario es la clave pública del programa que rige las transiciones de estado de la cuenta. Los programas son de código y no tienen estado. Se basan en el vector de datos en las cuentas que se les asignan para las transiciones de estado.

Los programas solo pueden cambiar los datos de las cuentas que poseen. Los programas solo pueden debitar las cuentas que poseen. Cualquier programa puede acreditar cualquier cuenta. Cualquier programa puede leer cualquier cuenta.

Por defecto, todas las cuentas comienzan como propiedad del Programa del sistema.

El Programa del sistema es el único programa que puede asignar la propiedad de la cuenta. El Programa del sistema es el único programa que puede asignar datos con inicialización cero. La asignación de la propiedad de la cuenta solo puede ocurrir una vez en la vida de una cuenta.

El programa cargador carga un programa definido por el usuario. El programa cargador puede marcar los datos en las cuentas como ejecutables. El usuario realiza las siguientes transacciones para cargar un programa personalizado:

Cree una nueva clave pública. Transfiera monedas a la clave. Indique el Programa del sistema para asignar memoria. Indique el Programa del sistema para asignar la cuenta al Loader. Cargue el código de bytes en la memoria en pedazos. Indique el programa Loader para marcar la memoria como ejecutable.

En este punto, el cargador verifica el código de bytes, y la cuenta en la que se carga el código de bytes se puede usar como un programa ejecutable. Las cuentas nuevas se pueden marcar como propiedad del programa definido por el usuario.

La idea clave aquí es que los programas son código, y dentro de nuestro almacén de valores clave, existe un subconjunto de claves que el programa y solo ese programa tiene acceso de escritura.

Las transacciones especifican un vector de instrucciones. Cada instrucción contiene el programa, la instrucción del programa y una lista de cuentas que la transacción desea leer y escribir. Esta interfaz está inspirada en las interfaces de bajo nivel del sistema operativo para dispositivos:

tamaño_t

readv(int d, const struct iovec * iov, int iovcnt);

struct iovec {

char * iov_base; / * Dirección base. * /

size_t iov_len; /* Longitud. * /

};

Las interfaces como readv o writev le dicen al kernel con anticipación toda la memoria que el usuario desea leer o escribir. Esto permite que el sistema operativo obtenga previamente, prepare el dispositivo y ejecute la operación simultáneamente si el dispositivo lo permite.

En Solana, cada instrucción le dice a la VM qué cuentas quiere leer y escribir con anticipación. Esta es la raíz de nuestras optimizaciones para la VM.

Ordene millones de transacciones pendientes. Programe todas las transacciones no superpuestas en paralelo.

Además, podemos aprovechar la forma en que se diseñan los equipos de CPU y GPU.

Las instrucciones SIMD permiten que una sola pieza de código se ejecute en múltiples flujos de datos. Esto significa que Sealevel puede ejecutar una optimización adicional, que es exclusiva del diseño de Solana:

Ordene todas las instrucciones por ID de programa. Ejecute el mismo programa en todas las cuentas simultáneamente.

Para tener una idea de por qué esta es una optimización tan poderosa, eche un vistazo a la Guía para desarrolladores de CUDA:

“La arquitectura CUDA se basa en una matriz escalable de multiprocesadores de transmisión (SM) multiproceso. Cuando un programa CUDA en la CPU del host invoca una cuadrícula del núcleo, los bloques de la cuadrícula se enumeran y distribuyen a multiprocesadores con capacidad de ejecución disponible ".

Una GPU Nvidia moderna tiene 4000 núcleos CUDA, pero alrededor de 50 multiprocesadores. Si bien un multiprocesador puede ejecutar solo una instrucción de programa a la vez, puede ejecutar esa instrucción en más de 80 entradas diferentes en paralelo. Por lo tanto, si las transacciones entrantes que Sealvel carga todas invocan las mismas instrucciones del programa, como CryptoKitties :: BreedCats, Solana puede ejecutar todas las transacciones simultáneamente en todos los núcleos CUDA disponibles.

No hay almuerzo gratis en el rendimiento, por lo que para que las optimizaciones SIMD sean factibles, las instrucciones ejecutadas deben contener un pequeño número de ramas y todas deben tomar la misma rama. El multiprocesador está vinculado por la ruta de ejecución más lenta que tomará el lote. Incluso con esta consideración, el procesamiento paralelo a través de Sealevel presenta un desarrollo fundamental en la forma en que funcionan las redes blockchain en comparación con los tiempos de ejecución de un solo subproceso, lo que permite un rendimiento y una usabilidad excepcionalmente altos.

La implementación de Selanavel de Solana, junto con innovaciones como Prueba de Historia, Prueba de Replicación y Gulf Stream se combinan para crear la cadena de bloques más eficiente del mundo. El testnet de Solana está en vivo hoy. Puedes verlo en https://testnet.solana.com. Para fines de costo, solo estamos ejecutando un puñado de nodos. Sin embargo, lo hemos expandido en muchas instancias a más de 200 nodos físicamente distintos (no en hardware compartido) en 23 centros de datos en AWS, GCE y Azure para realizar evaluaciones comparativas.

El tiempo de ejecución está funcionando hoy, y los desarrolladores pueden implementar código en el testnow ahora. Los desarrolladores pueden construir contratos inteligentes en C hoy, y estamos trabajando agresivamente en la cadena de herramientas Rust. Rust será el lenguaje principal para el desarrollo de contratos inteligentes de Solana. La cadena de herramientas Rust está disponible públicamente como parte del SDK de Solana Javascript, y estamos iterando aún más sobre el Kit de desarrollo de software.

Solana pronto lanzará una versión beta pública de validadores de incentivo para ejecutar nodos a través del Tour de SOL, análogo al Juego de apuestas de Cosmos, que desafía al público en general a probar los límites de la red de Solana mientras gana tokens por hacerlo.