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ónAdmin
haya sido establecida la primera vez, los cambios subsecuentes requerirán autorización de la actual direcciónAdmin
. - 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ónAdmin
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 deAdmin
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
.
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.
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
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í.