Saltar al contenido principal

Establecer una cuenta de administrador personalizada para un Contrato de Activo Stellar (SAC)

El Contrato de Activos Stellar (SAC) incluye funcionalidad para establecer una cuenta de administración personalizada en el contrato mismo. Esto puede verse como una precaución de seguridad, similar a bloquear la cuenta del emisor de un activo después de crear el suministro total de tokens. También se debe señalar que la cuenta del emisor de un activo puede tener un conjunto distinto de firmas y pesos, y estos no están relacionados con la dirección del administrador del SAC.

Consideraciones

Para utilizar eficazmente la funcionalidad de administrador del SAC, debes ser consciente de varias cosas primero:

  • Cuando un SAC se habilita inicialmente para un activo emitido, la dirección Admin en el contrato por defecto es la cuenta del emisor.
  • Una dirección Admin de un SAC puede ser una cuenta Stellar normal (G...), o puede ser una dirección de smart contract (C...). Esto abre la posibilidad de acuñar programáticamente y tomar otras acciones administrativas para un activo a través de una invocación de smart contract.
  • Cambiar una dirección de Admin de un SAC (inicialmente) requiere autorización de la cuenta emisora del activo. Después de que la dirección Admin haya sido establecida la primera vez, los cambios subsecuentes requerirán autorización de la actual dirección Admin.
  • Si la cuenta del emisor de un activo está bloqueada mientras la dirección Admin del SAC no ha sido cambiada, nunca será posible cambiar la dirección Admin del SAC.
  • Si la cuenta emisora de un activo está bloqueada después de que se haya cambiado la dirección de Admin del SAC, los tokens aún serán acuñables desde el SAC siempre que estén autorizados por la dirección de Admin actual.

Ejemplo

El siguiente ejemplo generará un nuevo activo Stellar, STAR:GCS5NEHKJALCSVJAKIORXXVS554QQV5FNDLBK33CCAH6UIRYPXYZFC34.

Habilitar el contrato SAC integrado

Primero, habilitaremos el contrato SAC usando el CLI de Stellar:

stellar contract asset deploy \
--source starIssuer --network testnet \
--asset STAR:GCS5NEHKJALCSVJAKIORXXVS554QQV5FNDLBK33CCAH6UIRYPXYZFC34
# CBVYF2KJ72BRPLVPCUL3PGWDO5RK2XP4AJDHKX7GDDBJW42L2C6VT3SF

Esto nos da la dirección SAC de CBVYF2KJ72BRPLVPCUL3PGWDO5RK2XP4AJDHKX7GDDBJW42L2C6VT3SF.

nota

Estamos usando la cuenta emisora del activo aquí para habilitar el SAC en la red Testnet, pero esto podría hacerse usando cualquier cuenta.

Verifica la dirección de Admin inicial

Ahora que tenemos el SAC desplegado en la red, podemos invocar la función admin para averiguar cuál es su dirección Admin actual:

stellar contract invoke \
--source starIssuer --network testnet \
--id CBVYF2KJ72BRPLVPCUL3PGWDO5RK2XP4AJDHKX7GDDBJW42L2C6VT3SF \
-- \
admin
# GCS5NEHKJALCSVJAKIORXXVS554QQV5FNDLBK33CCAH6UIRYPXYZFC34

No es sorprendente que esté configurada en la cuenta GCS5... del emisor. Cambiemos eso.

Establecer la dirección de Admin a una nueva cuenta G...

Podemos establecer esta dirección de Admin a cualquier cuenta que queramos. Incluyendo una cuenta que no tiene fondos en la red. Mientras puedas proporcionar una firma válida para la cuenta, lo cual tendría en cuenta cualquier multisig o pesos de firma que se hayan configurado, puedes utilizar este evento para la futura administración del activo desde dentro del contrato.

información

Asegúrate de que cualquier cuenta que estés utilizando para esta dirección Admin tenga una forma de firmar transacciones. Eso significaría que tienes una clave secreta o frase semilla para ello.

stellar contract invoke \
--source starIssuer --network testnet \
--id CBVYF2KJ72BRPLVPCUL3PGWDO5RK2XP4AJDHKX7GDDBJW42L2C6VT3SF \
-- \
set_admin --new_admin GBL3IQ6KA3I7CS7C5ABTCU7CJJA7X76SBZKTTQVJ4APW5646DXEIQKHB

Ahora, invocar la función admin del contrato devolverá esta nueva dirección GBL3..., en lugar del emisor original del activo.

stellar contract invoke \
--source starIssuer --network testnet \
--id CBVYF2KJ72BRPLVPCUL3PGWDO5RK2XP4AJDHKX7GDDBJW42L2C6VT3SF \
-- \
admin
# GBL3IQ6KA3I7CS7C5ABTCU7CJJA7X76SBZKTTQVJ4APW5646DXEIQKHB
información

Si examinas la cuenta del emisor del activo GCS5..., no verás nada diferente. Los signatarios/pesos serán exactamente los mismos. El único lugar donde se ve este cambio es dentro del SAC para este activo.

Establecer la dirección Admin en alguna dirección de contrato C...

Para esta parte del ejemplo, utilizaremos un contrato de "minter" muy simple como dirección Admin. Tiene una implementación muy simple, y solo una función principal, start_mint:

#[contractimpl]
impl Contract {
pub fn __constructor(env: Env, sac_address: Address) {
env.storage().instance().set(&symbol_short!("SAC_ADDR"), &sac_address);
}

pub fn star_mint(env: Env, to: Address, amount: i128) {
let sac_address: Address = env.storage().instance().get(&symbol_short!("SAC_ADDR")).unwrap();
let token_client = token::StellarAssetClient::new(&env, &sac_address);
token_client.mint(&to, &amount);
}
}

Este contrato se despliega, y la dirección podría ser (por ejemplo) CCOQXM7XPEUZKAFEHBXBFS3VJVWJBOU6JK5B7B3Z6VUDX3OCESD3P6TI. Ahora podemos establecer la dirección Admin del SAC en este contrato:

stellar contract invoke \
--source newStarAdmin --network testnet \
--id CBVYF2KJ72BRPLVPCUL3PGWDO5RK2XP4AJDHKX7GDDBJW42L2C6VT3SF \
-- \
set_admin --new_admin CCOQXM7XPEUZKAFEHBXBFS3VJVWJBOU6JK5B7B3Z6VUDX3OCESD3P6TI

Verificando nuestro trabajo con la función admin del SAC, veremos que nuestro contrato minter es ahora la dirección Admin:

stellar contract invoke \
--source starIssuer --network testnet \
--id CBVYF2KJ72BRPLVPCUL3PGWDO5RK2XP4AJDHKX7GDDBJW42L2C6VT3SF \
-- \
admin
# CCOQXM7XPEUZKAFEHBXBFS3VJVWJBOU6JK5B7B3Z6VUDX3OCESD3P6TI

Ahora, dado que el contrato minter es el administrador del SAC, podemos invocar su función start_mint desde cualquier cuenta que queramos. (Recordatorio: si estás utilizando una dirección G... con la función mint de un SAC, necesitará que se haya creado una trustline para el activo de antemano.)

stellar contract invoke \
--source randomStarHolder --network testnet \
--id CCOQXM7XPEUZKAFEHBXBFS3VJVWJBOU6JK5B7B3Z6VUDX3OCESD3P6TI \
-- \
star_mint --to randomStarHolder --amount 1000000000

Ahora, esta cuenta randomStarHolder tendrá un saldo de 100 STAR, y la acuñación del token fue autorizada por el contrato minter mismo.

Realizando una operación de payment desde la cuenta del emisor

Dado que no hemos bloqueado al/los firmante(s) de nuestra cuenta del emisor, todavía es completamente posible que la cuenta del emisor GCS5... cree y envíe a la red cualquier operación de payment que desee. Esto significa que los tokens aún podrían ser acuñados con una operación de payment, o quemados con una operación de clawback, o modificarse los flags de trustline, todo utilizando la cuenta original del emisor del activo. La dirección Admin del SAC y los permisos de firma de la cuenta operan y funcionan de manera independiente entre sí.

En la práctica

Un ejemplo divertido de un proyecto que utiliza una dirección de administrador personalizada en un SAC se puede encontrar en el Proyecto KALE. El emisor de KALE es GBDVX4VELCDSQ54KQJYTNHXAHFLBCA77ZY2USQBM4CSHTTV7DME7KALE, pero puedes ver que la dirección Admin para el SAC está establecida en otro contrato:

stellar contract invoke \
--source S... --network mainnet \
--id CB23WRDQWGSP6YPMY4UV5C4OW5CBTXKYN3XEATG7KJEZCXMJBYEHOUOV \
-- \
admin
# CDL74RF5BLYR2YBLCCI7F5FB6TPSCLKEJUBSD2RSVWZ4YHF3VMFAIGWA

Este contrato CDL7... es el contrato "hogar" creado para facilitar la acuñación/quema/minería del activo KALE.