Mejoras en el marco de taxonomía de token

La versión mejorada de Blockchain App Builder incluye una nueva funcionalidad relacionada con el estándar ampliado de Token Taxonomy Framework.

Límites diarios de transacción

Puede restringir el número de transacciones que una cuenta puede completar diariamente, así como el número de tokens sobre los que se puede actuar. Los parámetros de entrada max_daily_amount y max_daily_transactions del método createAccount controlan este comportamiento. Estos parámetros son opcionales.

Puede lograr un mayor rendimiento si no define los límites de transacción diarios para una cuenta.

createAccount (TypeScript)
@Validator(yup.string(), yup.string(), yup.string(), yup.object().nullable())

public async createAccount(org_id: string, user_id: string, token_type: string, daily_limits: DailyLimits) {
await this.Ctx.Auth.checkAuthorization("ACCOUNT.createAccount", "TOKEN", { org_id });
return await this.Ctx.Account.createAccount(org_id, user_id, token_type, daily_limits);
}
Parámetros Adicionales:
  • daily_limits: JSON: objeto que especifica la cantidad máxima de tokens que se pueden utilizar en transacciones diarias (max_daily_amount) y el número máximo de transacciones que se pueden completar diariamente (max_daily_transactions), como se muestra en el siguiente ejemplo.
    {
         "max_daily_amount": 100000
         "max_daily_transactions": 10000
     }
CreateAccount (Go)
func (t *Controller) CreateAccount(org_id string, user_id string, token_type string, daily_limits ...account.AccountDailyLimits) (interface{}, error) {
auth, err := t.Ctx.Auth.CheckAuthorization("Account.CreateAccount", "TOKEN", map[string]string{"org_id": org_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}
return t.Ctx.Account.CreateAccount(org_id, user_id, token_type, daily_limits...)
}
Parámetros Adicionales:
  • daily_limits: JSON: objeto JSON que incluye un parámetro MaxDailyAmount (la cantidad máxima de tokens que se pueden utilizar en transacciones diarias) y un parámetro MaxDailyTransactions (el número máximo de transacciones que se pueden completar diariamente), como se muestra en el siguiente ejemplo.
    {
         "MaxDailyAmount": 100000
         "MaxDailyTransactions": 10000
     }
Devuelve:
  • Si se realiza correctamente, se crea un objeto JSON de la cuenta. El parámetro BapAccountVersion se define en el objeto de cuenta para uso interno.
Ejemplo de Valor de Devolución:
{ 
   "AssetType":"oaccount",
   "AccountId":"oaccount~a73085a385bc96c4a45aa2dff032e7dede82c0664dee5f396b7c5854eeafd4bd",
   "BapAccountVersion": 0,
   "UserId":"user1",
   "OrgId":"Org1MSP",
   "AccountType":"fungible",
   "TokenId":"",
   "TokenName":"",
   "Balance":0,
   "BalanceOnHold":0
}

Requisitos de aprobación para la menta y la quema

Puede configurar aprobaciones para acuñar y grabar tokens, de modo que los usuarios con el rol de mínimo o máximo responsable de grabación deben enviar una solicitud a un aprobador, en lugar de acuñar o grabar tokens directamente. Los aprobadores pueden aceptar o rechazar solicitudes para acuñar o grabar tokens. Para activar las aprobaciones de acuñación y grabación, utilice los parámetros mint_approval_required y burn_approval_required. A continuación, también debe especificar valores para mint_approver_role_name y burn_approval_role_name, como se muestra en el siguiente ejemplo.

behavior: # Token behaviors
          - divisible: 
                decimal: 2  
          - mintable: 
                max_mint_quantity: 1000 
                mint_approval_required: true
          - transferable
          - burnable 
                burn_approval_required: true
          - holdable 
          - roles: 
                minter_role_name: minter
                notary_role_name: notary
                mint_approver_role_name: minter_notary
                burn_approver_role_name: burner_notary
Los siguientes métodos admiten solicitar, aceptar y rechazar aprobaciones para acuñar y grabar tokens.

TypeScript Métodos de Aprobación de Minting y Burning

requestMint
Este método puede ser llamado por un minter para enviar una solicitud al notario minter para crear una cantidad especificada de tokens.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.date(), yup.object().nullable())
public async requestMint( token_id: string, operation_id: string, notary_org_id: string, notary_user_id: string, quantity: number, time_to_expiration: Date, info_details?: InfoDetails) {

const token_asset = await this.getTokenObject(token_id);
const notary_account_id = await this.Ctx.Account.generateAccountId(token_id, notary_org_id, notary_user_id);
return await this.Ctx.Token.hold(operation_id, null, notary_account_id, quantity, time_to_expiration, token_asset, HoldOperationType.MINT, info_details);

}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • operation_id: string: ID de operación único que representa la solicitud de moneda.
  • notary_org_id: string: ID del proveedor de servicios de membresía (MSP) del notario que procesará la solicitud.
  • notary_user_id: string: nombre de usuario o ID de correo electrónico del notario que procesará la solicitud.
  • quantity: number: cantidad de tokens que acuñar.
  • time_to_expiration: tiempo después del cual caduca la solicitud de acuñación y ya no es válida.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) has successfully submitted request to mint 100 tokens",
}
approveMint
Este método puede ser llamado por un notario de minter para aprobar una solicitud de acuñación.
@Validator(yup.string(), yup.string())
public async approveMint(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.executeHold(operation_id, token_asset);
}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • operation_id: string: ID de operación único que representa la solicitud de moneda.
Ejemplo de Valor de Devolución:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
rejectMint
Este método puede ser llamado por un notario de minter para rechazar una solicitud de acuñación.
@Validator(yup.string(), yup.string())
public async rejectMint(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.releaseHold(operation_id, token_asset);
}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • operation_id: string: ID de operación único que representa la solicitud de moneda.
Ejemplo de Valor de Devolución:
{
 msg: "Successfully rejected mint request with Operation Id 'operation1' to mint 100 tokens of token id token"
}
requestBurn
Este método puede ser llamado por un quemador para enviar una solicitud al notario del quemador para destruir una cantidad especificada de tokens.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.date(), yup.object().nullable())

public async requestBurn( token_id: string, operation_id: string, notary_org_id: string, notary_user_id: string, quantity: number, time_to_expiration: Date, info_details?: InfoDetails ) {

const token_asset = await this.getTokenObject(token_id);
const notary_account_id = await this.Ctx.Account.generateAccountId(token_id, notary_org_id, notary_user_id);
return await this.Ctx.Token.hold(operation_id, null, notary_account_id, quantity, time_to_expiration, token_asset, HoldOperationType.BURN, null, description);
}
Parámetros:
  • token_id: string: ID del token que se va a grabar.
  • operation_id: string: ID de operación único que representa la solicitud de grabación.
  • notary_org_id: string: ID del proveedor de servicios de membresía (MSP) del notario quemador que procesará la solicitud.
  • notary_user_id: string: nombre de usuario o ID de correo electrónico del notario quemador que procesará la solicitud.
  • quantity: number: cantidad de tokens que se van a grabar.
  • time_to_expiration: tiempo después del cual caduca la solicitud de grabación y ya no es válida.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) has successfully submitted request to mint 100 tokens",
}
approveBurn
Este método puede ser llamado por un notario quemador para aprobar una solicitud de grabación.
@Validator(yup.string(), yup.string())
public async approveBurn(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.executeHold(operation_id, token_asset);
}
Parámetros:
  • token_id: string: ID del token que se va a grabar.
  • operation_id: string: ID de operación único que representa la solicitud de grabación.
Ejemplo de Valor de Devolución:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
rejectBurn
Este método puede ser llamado por un notario quemador para rechazar una solicitud de combustión.
@Validator(yup.string(), yup.string())
public async rejectBurn(token_id: string, operation_id: string) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.releaseHold(operation_id, token_asset);
}
Parámetros:
  • token_id: string: ID del token que se va a grabar.
  • operation_id: string: ID de operación único que representa la solicitud de grabación.
Ejemplo de Valor de Devolución:
{
 msg: "Successfully rejected burn request with Operation Id 'operation1' to burn 100 tokens of token id token",
}

Métodos Go para aprobación de menta y quema

RequestMint
Este método puede ser llamado por un minter para enviar una solicitud al notario minter para crear una cantidad especificada de tokens.
func (t *Controller) RequestMint(token_id string, operation_id string, notary_org_id string, notary_user_id string, quantity float64, timeToExpiration string, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
notary_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, notary_org_id, notary_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting notary account id from org_id: %s and user_id: %s with token_id: %s, error %s ", notary_org_id, notary_user_id, token_id, err.Error())
 }
return t.Ctx.Token.Hold(operation_id, "", notary_account_id, quantity, timeToExpiration, tokenAssetValue.Interface(), constants.HoldMint, info_details...)
}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • operation_id: string: ID de operación único que representa la solicitud de moneda.
  • notary_org_id: string: ID del proveedor de servicios de membresía (MSP) del notario que procesará la solicitud.
  • notary_user_id: string: nombre de usuario o ID de correo electrónico del notario que procesará la solicitud.
  • quantity: number: cantidad de tokens que acuñar.
  • TimeToExpiration: tiempo después del cual caduca la solicitud de acuñación y ya no es válida.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "Category" : "category input",
         "Description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin) has successfully submitted request to mint 100 tokens",
}
ApproveMint
Este método puede ser llamado por un notario de minter para aprobar una solicitud de acuñación.
func (t *Controller) ApproveMint(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ExecuteHold(operation_id, tokenAssetValue.Interface())
}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • operation_id: string: ID de operación único que representa la solicitud de moneda.
Ejemplo de Valor de Devolución:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin)"
}
RejectMint
Este método puede ser llamado por un notario de minter para rechazar una solicitud de acuñación.
func (t *Controller) RejectMint(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ReleaseHold(operation_id, tokenAssetValue.Interface())
}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • operation_id: string: ID de operación único que representa la solicitud de moneda.
Ejemplo de Valor de Devolución:
{
 msg: "Successfully rejected mint request with Operation Id 'operation1' to mint 100 tokens of token id token"
}
RequestBurn
Este método puede ser llamado por un quemador para enviar una solicitud al notario del quemador para destruir una cantidad especificada de tokens.
func (t *Controller) RequestBurn(token_id string, operation_id string, notary_org_id string, notary_user_id string, quantity float64, timeToExpiration string, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
notary_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, notary_org_id, notary_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting notary account id from org_id: %s and user_id: %s with token_id: %s, error %s ", notary_org_id, notary_user_id, token_id, err.Error())
 }
return t.Ctx.Token.Hold(operation_id, "", notary_account_id, quantity, timeToExpiration, tokenAssetValue.Interface(), constants.HoldBurn, info_details...)
}
Parámetros:
  • token_id: string: ID del token que se va a grabar.
  • operation_id: string: ID de operación único que representa la solicitud de grabación.
  • notary_org_id: string: ID del proveedor de servicios de membresía (MSP) del notario quemador que procesará la solicitud.
  • notary_user_id: string: nombre de usuario o ID de correo electrónico del notario quemador que procesará la solicitud.
  • quantity: number: cantidad de tokens que se van a grabar.
  • time_to_expiration: tiempo después del cual caduca la solicitud de grabación y ya no es válida.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin) has successfully submitted request to mint 100 tokens",
}
ApproveBurn
Este método puede ser llamado por un notario quemador para aprobar una solicitud de grabación.
func (t *Controller) ApproveBurn(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ExecuteHold(operation_id, tokenAssetValue.Interface())
}
Parámetros:
  • token_id: string: ID del token que se va a grabar.
  • operation_id: string: ID de operación único que representa la solicitud de grabación.
Ejemplo de Valor de Devolución:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (org_id: Org1MSP, user_id: admin)"
}
RejectBurn
Este método puede ser llamado por un notario quemador para rechazar una solicitud de combustión.
func (t *Controller) RejectBurn(token_id string, operation_id string) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
return t.Ctx.Token.ReleaseHold(operation_id, tokenAssetValue.Interface())
}
Parámetros:
  • token_id: string: ID del token que se va a grabar.
  • operation_id: string: ID de operación único que representa la solicitud de grabación.
Ejemplo de Valor de Devolución:
{
 msg: "Successfully rejected burn request with Operation Id 'operation1' to burn 100 tokens of token id token",
}

Recuperación del historial de transacciones de la base de datos de historial enriquecida

Puede sincronizar los datos con la base de datos de historial enriquecida y, a continuación, recuperar los datos mediante llamadas a la API de código de cadenas. El siguiente método, que se muestra en TypeScript y en Go, recupera el historial de transacciones de la base de datos de historial enriquecida. Para poder utilizar estos métodos, debe ejecutar Oracle Autonomous Database con Oracle REST Data Services (ORDS) y OAuth activados, como se describe en Oracle Database View Definitions for Wholesale CBDC.
getAccountTransactionHistoryWithFiltersFromRichHistDB (TypeScript)
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string(), yup.object().nullable())
public async getAccountTransactionHistoryWithFiltersFromRichHistDB(token_id: string, org_id: string, user_id: string, custom_endpoint: string, bearer_token: string, filters?: Filters) {
const account_id = await this.Ctx.Account.generateAccountId(token_id, org_id, user_id);
await this.Ctx.Auth.checkAuthorization("ACCOUNT.getAccountTransactionHistoryWithFilters", "TOKEN", { account_id });
return await this.Ctx.Account.getAccountTrxHistoryWithFiltersFromRichHistDB(account_id, org_id, user_id.toLowerCase(), custom_endpoint, bearer_token, filters);
}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • org_id: string: ID del proveedor de servicios de afiliación (MSP) del usuario en la organización actual.
  • user_id: string: nombre de usuario o ID de correo electrónico del usuario.
  • custom_endpoint: punto final del servicio RESTful de la base de datos de historial enriquecido.
  • bearer_token: token de autorización de acceso para el punto final de servicio RESTful.
  • filters: string: parámetro opcional. Si está vacío, se devuelven todos los registros. La propiedad PageSize determina el número de registros que se devolverán. Si PageSize es 0, el tamaño de página por defecto es 20. La propiedad Bookmark determina el índice inicial de los registros que se devolverán. Para obtener más información, consulte la documentación de Hyperledger Fabric. Las propiedades StartTime y EndTime se deben especificar en formato RFC-3339.
GetAccountTransactionHistoryWithFiltersFromRichHistDB (Go)
func (t *Controller) GetAccountTransactionHistoryWithFiltersFromRichHistDB(token_id string, org_id string, user_id string, custom_endPoint string, bearer_token string, filters ...account.AccountHistoryFilters) (interface{}, error) {
account_id, err := t.Ctx.Account.GenerateAccountId(token_id, org_id, user_id)
if err != nil {
return nil, err
}
auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAccountTransactionHistoryWithFilters", "TOKEN", map[string]string{"account_id": account_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}
// sample format of filter: []string{"3", "", "2022-01-16T15:16:36+00:00", "2022-01-17T15:16:36+00:00"}
transactionArray, err := t.Ctx.Account.GetAccountTransactionHistoryWithFiltersFromRichHistDB(account_id, org_id, user_id, custom_endPoint, bearer_token, filters...)
return transactionArray, err
}
Parámetros:
  • token_id: string: ID del token que se va a acuñar.
  • org_id: string: ID del proveedor de servicios de afiliación (MSP) del usuario en la organización actual.
  • user_id: string: nombre de usuario o ID de correo electrónico del usuario.
  • custom_endpoint: punto final del servicio RESTful de la base de datos de historial enriquecido.
  • bearer_token: token de autorización de acceso para el punto final de servicio RESTful.
  • filters: string: parámetro opcional. Si está vacío, se devuelven todos los registros. La propiedad PageSize determina el número de registros que se devolverán. Si PageSize es 0, el tamaño de página por defecto es 20. La propiedad Bookmark determina el índice inicial de los registros que se devolverán. Para obtener más información, consulte la documentación de Hyperledger Fabric. Las propiedades StartTime y EndTime se deben especificar en formato RFC-3339.

Atributos de categoría y descripción en objetos de transacción

  • Los atributos de categoría y descripción se deben incluir en los métodos transferTokens, holdTokens, issueTokens, requestMint, requestBurn, burnTokens y rejectBurn del archivo de controlador. Los métodos SDK correspondientes también deben incluir atributos de categoría y descripción.
  • La entrada de atributo de categoría y descripción tiene el formato de un objeto JSON denominado info_details, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
  • El campo info_details es opcional. Solo puede transferir una categoría o solo una descripción según sea necesario.
  • Los métodos GET relacionados con cualquier transacción para transferTokens, holdTokens, executeHold, releaseHold, requestMint, approveMint, rejectMint, requestBurn, approveBurn y rejectBurn deben incluir atributos de categoría y descripción en la respuesta de carga útil si están presentes.
  • El campo de categoría tiene un límite de 20 caracteres y el campo de descripción tiene un límite de 250 caracteres.

TypeScript Métodos con Entradas Modificadas

Los siguientes métodos admiten atributos opcionales de categoría y descripción cuando usa la versión mejorada de Blockchain App Builder.

transferTokens
Este método transfiere tokens del emisor de llamada a una cuenta especificada.
@Validator(yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.object().nullable())
public async transferTokens(token_id: string, to_org_id: string, to_user_id: string, quantity: number, info_details?: InfoDetails) {
const token_asset = await this.getTokenObject(token_id);
const to_account_id = await this.Ctx.Account.generateAccountId(token_id, to_org_id, to_user_id);
return await this.Ctx.Token.transfer(to_account_id, quantity, token_asset, info_details);
}
Parámetros:
  • token_id: string: ID del token.
  • to_org_id: string: ID del proveedor de servicios de membresía (MSP) del receptor (beneficiario) de la organización actual.
  • to_user_id: string: nombre de usuario o ID de correo electrónico del destinatario.
  • quantity: number: número de tokens que transferir.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
 msg: "Successfully transferred 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) to account id: oaccount~7yuijg39b4e1e4136dd86a806020c97a930909325340481b8fdhjklliugbv699 (Org-Id: Org1MSP, User-Id: user)",
}
holdTokens
Este método crea una retención en nombre del propietario de los tokens con la cuenta to_account_id.
@Validator(yup.string(), yup.string(), yup.string(), yup.string(), yup.string(), yup.string(), yup.number().positive(), yup.date(), yup.object().nullable())
  public async holdTokens( token_id: string, operation_id: string, to_org_id: string, to_user_id: string, notary_org_id: string, notary_user_id: string, quantity: number, time_to_expiration: Date, info_details?: InfoDetails) {
    const token_asset = await this.getTokenObject(token_id);
    const to_account_id = await this.Ctx.Account.generateAccountId(token_id, to_org_id, to_user_id);
    const notary_account_id = await this.Ctx.Account.generateAccountId(token_id, notary_org_id, notary_user_id);
    return await this.Ctx.Token.hold(operation_id, to_account_id, notary_account_id, quantity, time_to_expiration, token_asset, HoldOperationType.TRANSFER, info_details);
  }
Parámetros:
  • token_id: string: ID del token.
  • operation_id: string: ID único para identificar la operación de retención. Normalmente, la aplicación cliente transfiere este ID.
  • to_org_id: string: ID del proveedor de servicios de membresía (MSP) del receptor en la organización actual.
  • to_user_id: string: nombre de usuario o ID de correo electrónico del destinatario.
  • notary_org_id: string: ID del proveedor de servicios de membresía (MSP) del notario en la organización actual.
  • notary_user_id: string: nombre de usuario o ID de correo electrónico del notario.
  • quantity: number: número de tokens que se van a retener.
  • time_to_expiration: hora a la que caduca la retención. Especifique 0 para una retención permanente. De lo contrario, utilice el formato RFC-3339. Por ejemplo, 2021-06-02T12:46:06Z.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) is successfully holding 100 tokens",
}
issueTokens
Este método acuña tokens, que luego son propiedad del emisor de llamada del método.
@Validator(yup.string(), yup.number().positive(), yup.object().nullable())
public async issueTokens(token_id: string, quantity: number, info_details?: InfoDetails) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.mint(quantity, token_asset, info_details);
}
Parámetros:
  • token_id: string: ID del token.
  • quantity: número de tokens que acuñar.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
burnTokens
Este método desactiva o graba tokens de la cuenta del emisor de llamada de transacción.
@Validator(yup.string(), yup.number().positive(), yup.object().nullable())

public async burnTokens(token_id: string, quantity: number, info_details?: InfoDetails) {
const token_asset = await this.getTokenObject(token_id);
return await this.Ctx.Token.burn(quantity, token_asset, info_details);
}
Parámetros:
  • token_id: string: ID del token.
  • quantity: número de tokens que se van a grabar.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}

Ir a métodos con entradas modificadas

Los siguientes métodos admiten atributos opcionales de categoría y descripción cuando usa la versión mejorada de Blockchain App Builder.

TransferTokens
Este método transfiere tokens del emisor de llamada a una cuenta especificada.
func (t *Controller) TransferTokens(token_id string, to_org_id string, to_user_id string, quantity float64, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
to_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, to_org_id, to_user_id)
if err != nil {
return nil, err
 }
return t.Ctx.Token.Transfer(to_account_id, quantity, tokenAssetValue.Interface(), info_details...)
}
Parámetros:
  • token_id: string: ID del token.
  • to_org_id: string: ID del proveedor de servicios de membresía (MSP) del receptor (beneficiario) de la organización actual.
  • to_user_id: string: nombre de usuario o ID de correo electrónico del destinatario.
  • quantity: number: número de tokens que transferir.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
 msg: "Successfully transferred 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) to account id: oaccount~7yuijg39b4e1e4136dd86a806020c97a930909325340481b8fdhjklliugbv699 (Org-Id: Org1MSP, User-Id: user)",
}
HoldTokens
Este método crea una retención en nombre del propietario de los tokens con la cuenta to_account_id.
func (t *Controller) HoldTokens(token_id string, operation_id string, to_org_id string, to_user_id string, notary_org_id string, notary_user_id string, quantity float64, timeToExpiration string, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
}
notary_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, notary_org_id, notary_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting notary account id from org_id: %s and user_id: %s with token_id: %s, error %s ", notary_org_id, notary_user_id, token_id, err.Error())
}
to_account_id, err := t.Ctx.Account.GenerateAccountId(token_id, to_org_id, to_user_id)
if err != nil {
return nil, fmt.Errorf("error in getting to_account id from org_id: %s and user_id: %s with token_id: %s, error %s ", to_org_id, to_user_id, token_id, err.Error())
 }
return t.Ctx.Token.Hold(operation_id, to_account_id, notary_account_id, quantity, timeToExpiration, tokenAssetValue.Interface(), constants.HoldTransfer, info_details...)
}
Parámetros:
  • token_id: string: ID del token.
  • operation_id: string: ID único para identificar la operación de retención. Normalmente, la aplicación cliente transfiere este ID.
  • to_org_id: string: ID del proveedor de servicios de membresía (MSP) del receptor en la organización actual.
  • to_user_id: string: nombre de usuario o ID de correo electrónico del destinatario.
  • notary_org_id: string: ID del proveedor de servicios de membresía (MSP) del notario en la organización actual.
  • notary_user_id: string: nombre de usuario o ID de correo electrónico del notario.
  • quantity: number: número de tokens que se van a retener.
  • time_to_expiration: hora a la que caduca la retención. Especifique 0 para una retención permanente. De lo contrario, utilice el formato RFC-3339. Por ejemplo, 2021-06-02T12:46:06Z.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"AccountId oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin) is successfully holding 100 tokens",
}
IssueTokens
Este método acuña tokens, que luego son propiedad del emisor de llamada del método.
func (t *Controller) IssueTokens(token_id string, quantity float64, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
 }
return t.Ctx.Token.Mint(quantity, tokenAssetValue.Interface(), info_details...)
}
Parámetros:
  • token_id: string: ID del token.
  • quantity: número de tokens que acuñar.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"Successfully minted 100 tokens to Account Id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}
BurnTokens
Este método desactiva o graba tokens de la cuenta del emisor de llamada de transacción.
func (t *Controller) BurnTokens(token_id string, quantity float64, info_details ...token.InfoDetails) (interface{}, error) {
tokenAssetValue, err := t.getTokenObject(token_id)
if err != nil {
return nil, err
 }
return t.Ctx.Token.Burn(quantity, tokenAssetValue.Interface(), info_details...)
}
Parámetros:
  • token_id: string: ID del token.
  • quantity: número de tokens que se van a grabar.
  • info_details: JSON: objeto que especifica la categoría (category) y la descripción (description) de la solicitud, como se muestra en el siguiente ejemplo.
    {
         "category" : "category input",
         "description" : "description input"
    }
Ejemplo de Valor de Devolución:
{
msg:
"Successfully burned 100 tokens from account id: oaccount~95be539b4e1e4136dd86a806020c97a930909325340481b8fd88d339874fa699 (Org-Id: Org1MSP, User-Id: admin)"
}

TypeScript Métodos con salidas modificadas

Los siguientes métodos devuelven los ID de usuario y organización relevantes cuando se utiliza la versión mejorada de Blockchain App Builder.

getAccountTransactionHistory
Este método devuelve una matriz de detalles de historial de transacciones de cuenta para un usuario y un token especificados.
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string())
public async getAccountTransactionHistory(token_id: string, org_id: string, user_id: string) {
const account_id = await this.Ctx.Account.generateAccountId(token_id, org_id, user_id);
await this.Ctx.Auth.checkAuthorization("ACCOUNT.getAccountTransactionHistory", "TOKEN", { account_id });
return await this.Ctx.Account.getAccountTransactionHistory(account_id, org_id, user_id.toLowerCase());
}
Parámetros:
  • token_id: string: ID del token.
  • org_id: string: ID del proveedor de servicios de afiliación (MSP) del usuario en la organización actual.
  • user_id: string: nombre de usuario o ID de correo electrónico del usuario.
Ejemplo de valor devuelto:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]
getAccountTransactionHistoryWithFilters
Este método devuelve una matriz filtrada de detalles de historial de transacciones de cuenta para un usuario y un token especificados.
@GetMethod()
@Validator(yup.string(), yup.string(), yup.string(), yup.object().nullable())
public async getAccountTransactionHistoryWithFilters(token_id: string, org_id: string, user_id: string, filters?: Filters) {
const account_id = await this.Ctx.Account.generateAccountId(token_id, org_id, user_id);
await this.Ctx.Auth.checkAuthorization("ACCOUNT.getAccountTransactionHistoryWithFilters", "TOKEN", { account_id });
return await this.Ctx.Account.getAccountTransactionHistoryWithFilters(account_id, org_id, user_id.toLowerCase(), filters);
}
Parámetros:
  • token_id: string: ID del token.
  • org_id: string: ID del proveedor de servicios de afiliación (MSP) del usuario en la organización actual.
  • user_id: string: nombre de usuario o ID de correo electrónico del usuario.
  • filters: string: parámetro opcional. Si está vacío, se devuelven todos los registros. La propiedad PageSize determina el número de registros que se van a devolver. Si PageSize es 0, el tamaño de página por defecto es 20. La propiedad Bookmark determina el índice inicial de los registros que se devolverán. Para obtener más información, consulte la documentación de Hyperledger Fabric. Las propiedades StartTime y EndTime se deben especificar en formato RFC-3339.
Ejemplo de valor devuelto:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]

Métodos Go con salidas modificadas

Los siguientes métodos devuelven los ID de usuario y organización relevantes cuando se utiliza la versión mejorada de Blockchain App Builder.

GetAccountTransactionHistory
Este método devuelve una matriz de detalles de historial de transacciones de cuenta para un usuario y un token especificados.
func (t *Controller) GetAccountTransactionHistory(token_id string, org_id string, user_id string) (interface{}, error) {
account_id, err := t.Ctx.Account.GenerateAccountId(token_id, org_id, user_id)
if err != nil {
return nil, err
}
auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAccountTransactionHistory", "TOKEN", map[string]string{"account_id": account_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}



transactionArray, err := t.Ctx.Account.GetAccountTransactionHistory(account_id, org_id, user_id)
return transactionArray, err
}
Parámetros:
  • token_id: string: ID del token.
  • org_id: string: ID del proveedor de servicios de afiliación (MSP) del usuario en la organización actual.
  • user_id: string: nombre de usuario o ID de correo electrónico del usuario.
Ejemplo de valor devuelto:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]
GetAccountTransactionHistoryWithFilters
Este método devuelve una matriz filtrada de detalles de historial de transacciones de cuenta para un usuario y un token especificados.
func (t *Controller) GetAccountTransactionHistoryWithFilters(token_id string, filters ...account.AccountHistoryFilters) (interface{}, error) {
org_id, err := t.Ctx.Model.GetTransientMapKeyAsString(constants.OrgIdCC)
if err != nil {
return nil, err
}
user_id, err := t.Ctx.Model.GetTransientMapKeyAsString(constants.UserIdCC)
if err != nil {
return nil, err
}
account_id, err := t.Ctx.Account.GenerateAccountId(token_id, org_id, user_id)
if err != nil {
return nil, err
}
auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAccountTransactionHistoryWithFilters", "TOKEN", map[string]string{"account_id": account_id})
if err != nil && !auth {
return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
}



// sample format of filter: []string{"3", "", "2022-01-16T15:16:36+00:00", "2022-01-17T15:16:36+00:00"}
transactionArray, err := t.Ctx.Account.GetReconciledTransactionHistory(account_id, org_id, user_id, filters...)
return transactionArray, err
}
Parámetros:
  • token_id: string: ID del token.
  • org_id: string: ID del proveedor de servicios de afiliación (MSP) del usuario en la organización actual.
  • user_id: string: nombre de usuario o ID de correo electrónico del usuario.
  • filters: string: parámetro opcional. Si está vacío, se devuelven todos los registros. La propiedad PageSize determina el número de registros que se van a devolver. Si PageSize es 0, el tamaño de página por defecto es 20. La propiedad Bookmark determina el índice inicial de los registros que se devolverán. Para obtener más información, consulte la documentación de Hyperledger Fabric. Las propiedades StartTime y EndTime se deben especificar en formato RFC-3339.
Ejemplo de valor devuelto:
[
            {
                "transaction_id": "otransaction~64c5a4830949eae1424600f3d4a438c6f603a7c3ea31a68e374b899803999e22",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:37:28.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REJECT_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~a4537ef34a955b023b7c205b9abf06a6c79e4fdd761fb24f41b8eb34126b66c0",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:32.000Z",
                "balance": 550,
                "onhold_balance": 10,
                "token_id": "USD",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "APPROVE_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~6237a759422bd9fb112742e8cd7e6450df5a74a32236d9b1005571afed8904a4",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:36:18.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            },
            {
                "transaction_id": "otransaction~06b35071415d74aa1a7c18449149c937d886cae76a832c44cf8d98e84586e76e",
                "transacted_amount": 10,
                "timestamp": "2024-12-11T13:35:46.000Z",
                "balance": 540,
                "onhold_balance": 10,
                "token_id": "USD",
                "category": "category value",
                "description": "description value",
                "transacted_account": "oaccount~9d9806fa92aa0c4fdb34eaffac6e830181b5d47e64fbce752195e83024125ca0",
                "transaction_type": "REQUEST_MINT",
                "transacted_org_id": "CB",
                "transacted_user_id'": "creator_user_cb"
            }
 ]