Modelo de cuentas en Solana

En Solana, todos los datos se almacenan en lo que se conoce como "cuentas". La forma en que se organizan los datos en Solana se asemeja a una base de datos clave-valor, donde cada entrada en la base de datos es llamada "cuenta".

AccountsAccounts

Puntos clave #

  • Las cuentas pueden almacenar hasta 10MB de datos, que pueden consistir en el código ejecutable del programa o estado del programa.

  • Las cuentas requieren un depósito de renta en SOL, proporcional a la cantidad de datos almacenados, que es completamente reembolsable cuando se cierra la cuenta.

  • Cada cuenta tiene un programa "propietario" (owner). Solo el programa dueño de la cuenta puede modificar sus datos o deducir su balance de lamports. Sin embargo, cualquiera puede aumentar el balance.

  • Los programas (contratos inteligentes) son cuentas sin estado que almacenan código ejecutable.

  • Las cuentas de datos son creadas por programas para almacenar y administrar el estado del programa.

  • Los programas nativos son programas integrados con el tiempo de ejecución de Solana.

  • Las cuentas Sysvar son cuentas especiales que almacenan el estado del clúster en la red.

Cuenta #

Cada cuenta es identificable por su dirección única, representada como 32 bytes en el formato de una Ed25519 PublicKey. La dirección pública es el identificador único de la cuenta.

Account AddressAccount Address

Esta relación entre la cuenta y su dirección puede ser pensada como un par clave-valor, donde la dirección sirve como la clave para localizar los datos correspondientes a la cuenta en la cadena de bloques.

AccountInfo #

Las cuentas tienen un tamaño máximo de 10MB (10 Mega Bytes) y los datos almacenados en cada cuenta en Solana tienen la siguiente estructura conocida como AccountInfo.

AccountInfoAccountInfo

El AccountInfo para cada cuenta incluye los siguientes campos:

  • data: Un arreglo de bytes que almacena el estado de una cuenta. Si la cuenta es un programa (contrato inteligente), esto almacena el código ejecutable del programa. Este campo es a menudo denominado "account data".
  • executable: Un indicador booleano que indica si la cuenta es un programa.
  • lamports: Una representación numérica del balance de la cuenta en lamports, la unidad más pequeña de SOL (1 SOL = 1 mil millones de lamports).
  • owner: Especifica la clave pública (ID del programa) del programa propietario de la cuenta.

Como parte fundamental del modelo de cuentas de Solana, cada cuenta de Solana tiene un "owner" designado, específicamente un programa. Solo el programa designado como propietario de una cuenta puede modificar los datos almacenados en ella o deducir el balance en lamports. Es importante tener en cuenta que aunque solo el propietario puede deducir el balance, cualquiera puede aumentar el balance.

Info

Para almacenar datos en la cadena de bloques, una cierta cantidad de SOL debe ser transferida a una cuenta. La cantidad transferida es proporcional al tamaño de los datos almacenados en la cuenta. Este concepto se denomina comúnmente como “renta” (rent). Sin embargo, puedes pensar en la "renta" como un "depósito" porque los tokens SOL asignados a una cuenta se pueden recuperar en su totalidad cuando se cierra.

Programas nativos #

Solana contiene un pequeño puñado de programas nativos que son parte de la implementación de los validadores y proporcionan varias funcionalidades principales para la red. You can find the full list of native programs here.

Al desarrollar programas personalizados en Solana, comúnmente se interactúa con dos programas nativos, el programa del sistema y el BPF Loader.

Programa del Sistema #

Por defecto, todas las cuentas nuevas pertenecen al programa del sistema. El Programa del Sistema realiza varias tareas clave como:

  • Creación de cuentas nuevas: El programa del sistema es el único que puede crear cuentas nuevas.
  • Asignación de espacio: Establece la capacidad de bytes para el campo de data de cada cuenta.
  • Asignar propietario a una cuenta: Una vez que el programa del sistema crea una cuenta, puede reasignar al propietario designado a una cuenta diferente. Así es como los programas personalizados asumen la propiedad de cuentas creadas por el programa del sistema.

En Solana, una "billetera" es simplemente una cuenta que es propiedad del programa del sistema. El balance en lamports de la billetera es la cantidad de SOL que posee la cuenta.

System AccountSystem Account

Info

Las únicas cuentas que pueden pagar por las tasas de transacción son las cuentas propiedad del programa del sistema.

Programa BPF Loader #

El BPF Loader es el programa designado como el "propietario" de todos los demás programas en la red, excluyendo programas nativos. Es responsable de desplegar, actualizar y ejecutar programas personalizados.

Cuentas Sysvar #

Las cuentas Sysvar son cuentas especiales ubicadas en direcciones predefinidas que proporcionan acceso a los datos del estado del clúster. Estas cuentas se actualizan dinámicamente con datos sobre el clúster de la red. You can find the full list of Sysvar Accounts here.

Programas personalizados #

En Solana, los "contratos inteligentes" son referidos como programas. Un programa es una cuenta que contiene un código ejecutable y el valor del indicador "executable" es equivalente a true.

Para una explicación más detallada del proceso de despliegue del programa, consulte la página Desplegando Programas de esta documentación.

Cuenta de un programa #

Cuando los nuevos programas son desplegados en Solana, técnicamente se crean tres cuentas separadas:

  • Cuenta de un programa: La cuenta principal que representa un programa en la cadena de bloques. Esta cuenta almacena la dirección a una cuenta de datos ejecutables (que almacena el código del programa compilado) y la autoridad de actualización del programa (dirección autorizada para realizar cambios en el programa).
  • Cuenta de datos ejecutables de un programa: Una cuenta que contiene el código ejecutable en bytes del programa.
  • Cuenta de Buffer: Una cuenta temporal que almacena código en bytes mientras un programa está siendo desplegado o actualizado activamente. Una vez completado el proceso, los datos se transfieren a la cuenta de datos ejecutables del programa y se cierra la cuenta de buffer.

Por ejemplo, aquí hay enlaces al Explorador de Solana para la cuenta del programa Token Extensions y su correspondiente cuenta de datos ejecutables del programa.

Program and Executable Data AccountsProgram and Executable Data Accounts

Por simplicidad, usted puede pensar en la "Cuenta de un Programa" como el propio programa.

Program AccountProgram Account

Info

La dirección de la "Cuenta del programa" se denomina comúnmente "ID del programa", que se utiliza para invocar el programa.

Cuenta de datos #

Los programas en Solana son "sin estado", lo que significa que las cuentas de programas solo contienen el código ejecutable en bytes del programa. Para almacenar y modificar datos adicionales, deben crearse cuentas nuevas. Estas cuentas se denominan comúnmente "cuentas de datos".

Las cuentas de datos pueden almacenar cualquier dato arbitrario definido en el código del programa propietario.

Data AccountData Account

Tenga en cuenta que sólo el programa del sistema puede crear cuentas nuevas. Una vez que el programa del sistema crea una cuenta, puede transferir la propiedad de la cuenta a otro programa.

En otras palabras, crear una cuenta de datos para un programa personalizado requiere dos pasos:

  1. Invocar el programa del sistema para crear una cuenta, que luego transfiere la propiedad a un programa personalizado
  2. Invocar el programa personalizado, que ahora es propietario de la cuenta, para inicializar los datos de la cuenta tal y como se definen en el código del programa

Este proceso de creación de cuentas de datos a menudo se abstrae como un único paso, pero es útil comprender el proceso subyacente.