Progetto Go con impalcatura per struttura tassonomia token

Blockchain App Builder prende l'input dal file di specifica del token e genera un progetto di codice concatenato impalcato completamente funzionale.

Il progetto genera automaticamente classi e funzioni del ciclo di vita dei token, inclusi i metodi CRUD e non CRUD. La convalida degli argomenti, il marshalling/unmarshalling e la capacità di persistenza trasparente sono tutti supportati automaticamente.

Per informazioni sul progetto e sui metodi scaffolded non direttamente correlati ai token, vedere Scaffolded Go Chaincode Project.

Modello

La funzionalità di persistenza trasparente o ORM semplificato viene acquisita nella classe OchainModel.

package src
type Digicur struct {
    AssetType               string                 `json:"AssetType" final:"otoken"`
    Token_id                string                 `json:"Token_id" id:"true" mandatory:"true" validate:"regexp=^[A-Za-z0-9][A-Za-z0-9_-]*$,max=16"`
    Token_name              string                 `json:"Token_name" final:"digicur"`
    Token_desc              string                 `json:"Token_desc" validate:"max=256"`
    Token_type              string                 `json:"Token_type" final:"fungible" validate:"regexp=^fungible$"`
    Behavior                []string               `json:"Behavior" final:"[\"divisible\",\"mintable\",\"transferable\",\"burnable\",\"holdable\",\"roles\"]"`
    Roles                   map[string]interface{} `json:"Roles" final:"{\"minter_role_name\":\"minter\",\"burner_role_name\":\"burner\",\"notary_role_name\":\"notary\"}"`
    Mintable                map[string]interface{} `json:"Mintable" final:"{\"Max_mint_quantity\":20000}"`
    Divisible               map[string]interface{} `json:"Divisible" final:"{\"Decimal\":1}"`
    Token_to_currency_ratio int                    `json:"Token_to_currency_ratio" validate:"int"`
    Currency_representation string                 `json:"Currency_representation" validate:"string"`
    Metadata                interface{}            `json:"Metadata,omitempty"`
}

Controllore

C'è un solo controller principale.

type Controller struct {
    Ctx trxcontext.TrxContext
}

È possibile creare un numero qualsiasi di classi, funzioni o file, ma è possibile richiamare solo i metodi definiti all'interno della classe controller principale. Gli altri metodi sono nascosti.

È possibile utilizzare i metodi SDK token per scrivere metodi personalizzati per l'applicazione business.

Se si utilizza più di un metodo SDK token in un metodo personalizzato, non utilizzare metodi che influiranno sulle stesse coppie chiave-valore nel database di stato.

In alternativa, utilizzare il metodo BulkTransferTokens per eseguire il trasferimento a più account dal conto del chiamante, come mostrato nel seguente frammento di codice.

BulkTransferTokens(token_id string, flow: []map[string]interface{})

Nota

Se si utilizza più di un metodo SDK token in un metodo personalizzato che potrebbe influire sulle stesse coppie chiave-valore nel database di stato, abilitare l'ottimizzazione MVCC per i codici concatenati token. Per ulteriori informazioni, vedere Ottimizzazione MVCC.

Metodi token generati automaticamente

Blockchain App Builder genera automaticamente metodi per supportare i token e i cicli di vita dei token. È possibile utilizzare questi metodi per inizializzare i token, gestire ruoli e account e completare altri task del ciclo di vita dei token senza alcuna codifica aggiuntiva. I metodi del controller devono essere pubblici per poter essere richiamati. I nomi dei metodi pubblici iniziano con un carattere maiuscolo. I nomi dei metodi che iniziano con un carattere minuscolo sono privati.

Metodi per la gestione del controllo dell'accesso

AddTokenAdmin
Questo metodo aggiunge un utente come Token Admin del codice concatenato. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato.
func (t *Controller) AddTokenAdmin(org_id string, user_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Admin.AddAdmin", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Admin.AddTokenAdmin(org_id, user_id)
}
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio che include i dettagli dell'utente aggiunto come Token Admin del codice concatenato.
Esempio di valore restituito:
{
    "msg": "Successfully added Token Admin (Org_Id: Org1MSP, User_Id: user1)"
}
RemoveTokenAdmin
Questo metodo rimuove un utente come Token Admin del codice concatenato. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato.
func (t *Controller) RemoveTokenAdmin(org_id string, user_id string) (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Admin.RemoveAdmin", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.Admin.RemoveAdmin(org_id, user_id)
}
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio che include i dettagli dell'utente rimosso come Token Admin del codice concatenato.
Esempio di valore restituito:
{"msg":"Successfuly removed Admin (Org_Id Org1MSP User_Id user1)"}
IsTokenAdmin
Questo metodo restituisce il valore booleano true se il chiamante della funzione è un valore Token Admin, altrimenti restituisce false. Un Token Admin o Org Admin può chiamare questa funzione su qualsiasi altro utente della rete blockchain. Altri utenti possono chiamare questo metodo solo sui propri account.
func (t *Controller) IsTokenAdmin(org_id string, user_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Admin.IsTokenAdmin", "TOKEN", map[string]string{"org_id": org_id, "user_id": user_id})
      if err != nil || !auth {
            return false, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Auth.IsUserTokenAdmin(org_id, user_id)
}
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • Il metodo restituisce true se il chiamante è un Token Admin, altrimenti restituisce false.
Esempio di valore restituito:
{"result":false}
GetAllTokenAdmins
Questo metodo restituisce un elenco di tutti gli utenti che sono un Token Admin del codice concatenato. Questo metodo può essere chiamato solo dal Token Admin o Org Admin del codice concatenato.
func (t *Controller) GetAllTokenAdmins() (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Admin.GetAllAdmins", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.Admin.GetAllAdmins()
}
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, una lista JSON di amministratori che include oggetti OrgId e UserId.
Esempio di valore restituito:
{"admins":[{"OrgId":"Org1MSP","UserId":"admin"},{"OrgId":"Org1MSP","UserId":"user2"}]}
AddOrgAdmin
Questo metodo aggiunge un utente come Org Admin dell'organizzazione. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata.
func (t *Controller) AddOrgAdmin(org_id string, user_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Admin.AddOrgAdmin", "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.Admin.AddOrgAdmin(org_id, user_id)
}
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio che include i dettagli dell'utente aggiunto come Org Admin dell'organizzazione.
Esempio di valore restituito:
{
    "msg": "Successfully added Org Admin (Org_Id: Org1MSP, User_Id: orgAdmin)"
}
RemoveOrgAdmin
Questo metodo rimuove un utente come Org Admin di un'organizzazione. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata.
func (t *Controller) RemoveOrgAdmin(org_id string, user_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Admin.RemoveOrgAdmin", "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.Admin.RemoveOrgAdmin(org_id, user_id)
}
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio che include i dettagli dell'utente rimosso come Org Admin dell'organizzazione.
Esempio di valore restituito:
{
    "msg": "Successfully removed Org Admin (Org_Id Org1MSP User_Id orgAdmin)"
}
GetOrgAdmins
Questo metodo restituisce un elenco di tutti gli utenti che sono un Org Admin di un'organizzazione. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da qualsiasi Org Admin.
func (t *Controller) GetOrgAdmins() (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Admin.GetOrgAdmins", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Admin.GetAllOrgAdmins()
}
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, una lista JSON che include oggetti OrgId e UserId.
Esempio di valore restituito:
{
    "admins": [
        {
            "OrgId": "Org1MSP",
            "UserId": "orgadmin"
        },
        {
            "OrgId": "Org1MSP",
            "UserId": "orgadmin1"
        },
        {
            "OrgId": "Org1MSP",
            "UserId": "orgadmin2"
        }
    ]
}

Metodi per la gestione della configurazione dei token

Init
Questo metodo viene chiamato quando viene distribuito il codice concatenato. Ogni Token Admin è identificato dalle informazioni user_id e org_id nel parametro adminList obbligatorio. user_id è il nome utente o l'ID di posta elettronica del proprietario dell'istanza o dell'utente che ha eseguito il login all'istanza. org_id è l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione di rete corrente.
Qualsiasi utente Token Admin può aggiungere e rimuovere altri utenti Token Admin chiamando i metodi AddTokenAdmin e RemoveTokenAdmin.
func (t *Controller) Init(adminList []admin.TokenAdminAsset) (interface{}, error) {
    list, err := t.Ctx.Admin.InitAdmin(adminList)
    if err != nil {
        return nil, fmt.Errorf("initializing admin list failed %s", err.Error())
    }
    return list, nil
}
Parametri:
  • adminList array: un array di informazioni {user_id, org_id} che specifica la lista degli amministratori di token. L'array adminList è un parametro obbligatorio.
Esempio di parametro, Mac OSX e CLI Linux:
'[{"user_id":"userid", "org_id":"OrgMSPId"}]'
Esempio di parametro, CLI di Microsoft Windows:
"[{\"user_id\":\"userid\", \"org_id\":\"OrgMSPId\"}]"
Esempio di parametro: console di Oracle Blockchain Platform:
["[{\"user_id\":\"userid\", \"org_id\":\"OrgMSPId\"}]"]
Initialize<Token Name>Token
Questo metodo crea un token e inizializza le proprietà del token. L'asset e le relative proprietà vengono salvati nel database di stato. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato.
func (t *Controller) InitializeDigicurToken(asset Digicur) (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.Save", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    return t.Ctx.Token.Save(&asset)
}
Parametri:
  • asset <Token Class>: l'asset token viene passato come parametro a questo metodo. Le proprietà dell'asset token sono descritte nel file modello.
Restituisce:
  • In caso di operazione riuscita, una rappresentazione JSON dell'asset token creato.
Esempio di valore restituito:
{
    "AssetType": "otoken",
    "Token_id": "digiCurr101",
    "Token_name": "digicur",
    "Token_desc": "",
    "Token_type": "fungible",
    "Behavior": ["divisible", "mintable", "transferable", "burnable", "roles"],
    "Roles": {
        "minter_role_name": "minter"
    },
    "Mintable": {
        "Max_mint_quantity": 1000
    },
    "Divisible": {
        "Decimal": 2
    },
    "Currency_name": "",
    "Token_to_currency_ratio": 1
}
Update<Token Name>Token
Questo metodo aggiorna le proprietà del token. Dopo aver creato un asset token, è possibile aggiornare solo la proprietà token_desc e le proprietà personalizzate. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato.
func (t *Controller) UpdateDigicurToken(asset Digicur) (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.Update", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    return t.Ctx.Token.Update(&asset)
}
Parametri:
  • asset <Token Class>: l'asset token viene passato come parametro a questo metodo. Le proprietà dell'asset token sono descritte nel file modello.
Restituisce:
  • In caso di operazione riuscita, una rappresentazione JSON aggiornata dell'asset token.
Esempio di valore restituito:
{
    "AssetType": "otoken",
    "Token_id": "digiCurr101",
    "Token_name": "digicur",
    "Token_desc": "Digital Currency equiv of dollar",
    "Token_type": "fungible",
    "Behavior": ["divisible", "mintable", "transferable", "burnable", "roles"],
    "Roles": {
        "minter_role_name": "minter"
    },
    "Mintable": {
        "Max_mint_quantity": 1000
    },
    "Divisible": {
        "Decimal": 2
    },
    "Currency_name": "",
    "Token_to_currency_ratio": 1
}
GetTokenDecimals
Questo metodo restituisce il numero di posizioni decimali configurate per un token frazionario. Se il comportamento divisible non è stato specificato per il token, il valore predefinito è 0. Questo metodo può essere chiamato solo da un Token Admin o Org Admin del codice concatenato.
func (t *Controller) GetTokenDecimals(token_id string) (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.GetTokenDecimals", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    tokenDecimal, err := t.Ctx.Token.GetTokenDecimals(token_id)
    if err != nil {
        return nil, fmt.Errorf("Error in GetTokenDecimals %s", err.Error())
    }
    response := make(map[string]interface{})
    response["msg"] = fmt.Sprintf("Token Id: %s has %d decimal places.", token_id, tokenDecimal)
    return response, nil
}
Parametri:
  • token_id string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, una stringa JSON che mostra il numero di posizioni decimali del token.
Esempio di valore restituito:
{"msg":"Token Id: digiCurr101 has 1 decimal places."}
GetTokenById
Questo metodo restituisce un oggetto token se è presente nel database di stato. Questo metodo può essere chiamato solo da un Token Admin o Org Admin del codice concatenato.
func (t *Controller) GetTokenById(token_id string) (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.Get", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    tokenAsset, err := t.getTokenObject(token_id)
    if err != nil {
        return nil, err
    }
    return tokenAsset.Interface(), err
}
Parametri:
  • token_id string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON che rappresenta l'asset token.
Esempio di valore restituito:
{
    "AssetType": "otoken",
    "Token_id": "digiCurr101",
    "Token_name": "digicur",
    "Token_desc": "Digital Currency equiv of dollar",
    "Token_type": "fungible",
    "Behavior": [
        "divisible",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "Roles": {
        "minter_role_name": "minter"
    },
    "Mintable": {
        "Max_mint_quantity": 1000
    },
    "Divisible": {
        "Decimal": 2
    },
    "Currency_name": "",
    "Token_to_currency_ratio": 1
}
GetTokenHistory
Questo metodo restituisce la cronologia del token per l'ID token specificato. Qualsiasi utente può chiamare questo metodo.
func (t *Controller) GetTokenHistory(token_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Token.GetTokenHistory", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Token.History(token_id)
}
Parametri:
  • tokenId: string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON che rappresenta la cronologia dei token.
Esempio di valore restituito:
[
    {
        "IsDelete": "false",
        "Timestamp": "2023-09-01T16:46:33Z",
        "TxId": "12333b8a4f63aa9b3a34072efcbd7df546c6d1e7d82a7a9596e899383656d6f7",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "Currency_name1": "",
            "Divisible": {
                "Decimal": 2
            },
            "Mintable": {
                "Max_mint_quantity": 1000
            },
            "Roles": {
                "minter_role_name": "minter"
            },
            "Token_desc": "updated description",
            "Token_id": "token",
            "Token_name": "fiatmoneytok",
            "Token_to_currency_ratio": 0,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    },
    {
        "IsDelete": "false",
        "Timestamp": "2023-09-01T16:04:25Z",
        "TxId": "99702e2dad7554a5ee4716a0d01d3e394cbce39bea8bade265d8911f30ebad0b",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "Currency_name1": "",
            "Divisible": {
                "Decimal": 2
            },
            "Mintable": {
                "Max_mint_quantity": 1000
            },
            "Roles": {
                "minter_role_name": "minter"
            },
            "Token_desc": "",
            "Token_id": "token",
            "Token_name": "fiatmoneytok",
            "Token_to_currency_ratio": 0,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    }
]
GetAllTokens
Questo metodo restituisce tutti i token memorizzati nel database di stato. Questo metodo può essere chiamato solo da un Token Admin o Org Admin del codice concatenato.
func (t *Controller) GetAllTokens() (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.GetAllTokens", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.Token.GetAllTokens()
}
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON che rappresenta tutti gli asset token.
Esempio di valore restituito:
"payload": [
    {
        "key": "t1",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "holdable",
                "burnable",
                "roles"
            ],
            "Currency_name": "Currency_name value",
            "Divisible": {
                "Decimal": 8
            },
            "Mintable": {
                "Max_mint_quantity": 10000
            },
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter",
                "notary_role_name": "notary"
            },
            "Token_desc": "Token_desc value",
            "Token_id": "t1",
            "Token_name": "obptok",
            "Token_to_currency_ratio": 2,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    }
]
GetTokensByName
Questo metodo restituisce tutti gli oggetti token con un nome specificato. Questo metodo può essere chiamato solo da un Token Admin o Org Admin del codice concatenato. Questo metodo utilizza query rich SQL di Berkeley DB e può essere richiamato solo quando si è connessi alla rete remota di Oracle Blockchain Platform.
func (t *Controller) GetTokensByName(token_name string) (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.GetTokensByName", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.Token.GetTokensByName(token_name)
}
Parametri:
  • token_name string: il nome dei token da recuperare. Il nome corrisponde alla proprietà Token_name nel file di specifica. Il valore è il nome della classe del token.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON di tutti gli asset token che corrispondono al nome.
Esempio di valore restituito:
"payload": [
    {
        "key": "t1",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "holdable",
                "burnable",
                "roles"
            ],
            "Currency_name": "Currency_name value",
            "Divisible": {
                "Decimal": 8
            },
            "Mintable": {
                "Max_mint_quantity": 10000
            },
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter",
                "notary_role_name": "notary"
            },
            "Token_desc": "Token_desc value",
            "Token_id": "t1",
            "Token_name": "obptok",
            "Token_to_currency_ratio": 999,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    },
    {
        "key": "obp2",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "holdable",
                "burnable",
                "roles"
            ],
            "Currency_name": "",
            "Divisible": {
                "Decimal": 8
            },
            "Mintable": {
                "Max_mint_quantity": 10000
            },
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter",
                "notary_role_name": "notary"
            },
            "Token_desc": "",
            "Token_id": "obp2",
            "Token_name": "obptok",
            "Token_to_currency_ratio": 0,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    }
]

Metodi per la gestione degli account

CreateAccount
Questo metodo crea un account per un utente e un token specificati. È necessario creare un account per qualsiasi utente che avrà token in qualsiasi momento. I conti tengono traccia dei saldi, dei saldi bloccati e della cronologia delle transazioni. Un ID account è un set alfanumerico di caratteri, preceduto dal prefisso oaccount~<token asset name>~ e seguito da un hash del nome utente o dell'ID di posta elettronica (user_id) del proprietario dell'istanza o dell'utente che ha eseguito il login all'istanza, l'ID del provider di servizi di appartenenza (org_id) dell'utente nell'organizzazione di rete corrente. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata.
unc (t *Controller) CreateAccount(org_id string, user_id string, token_type string) (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)
}
Parametri:
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id: string: il nome utente o l'ID di posta elettronica dell'utente.
  • token_type: string: il tipo del token, che deve essere fungible.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON dell'account creato. Il parametro BapAccountVersion viene definito nell'oggetto conto per uso interno.
Esempio di valore restituito:
{ 
   "AssetType":"oaccount",
   "AccountId":"oaccount~a73085a385bc96c4a45aa2dff032e7dede82c0664dee5f396b7c5854eeafd4bd",
   "BapAccountVersion": 0,
   "UserId":"user1",
   "OrgId":"Org1MSP",
   "AccountType":"fungible",
   "TokenId":"",
   "TokenName":"",
   "Balance":0,
   "BalanceOnHold":0
}
AssociateTokenToAccount
Questo metodo associa un token fungibile a un account. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione pertinente.
func (t *Controller) AssociateTokenToAccount(account_id string, token_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Account.AssociateToken", "TOKEN", map[string]string{"account_id": account_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Account.AssociateToken(account_id, token_id)
}
Parametri:
  • account_id string: l'ID del conto.
  • token_id string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON dell'account aggiornato. Il parametro BapAccountVersion viene definito nell'oggetto conto per uso interno.
Esempio di valore restituito:
{ 
"AssetType":"oaccount", 
"AccountId":"oaccount~abc74791148b761352b98df58035601b6f5480448ac2b4a3a7eb54bdbebf48eb", 
"BapAccountVersion": 0,
"UserId":"admin", 
"OrgId":"Org1MSP", 
"AccountType":"fungible", 
"TokenId":"token1", 
"TokenName":"loyaltok", 
"Balance":0, 
"BalanceOnHold":0 
}
GetAccount
Questo metodo restituisce i dettagli dell'account per un utente e un token specificati. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal AccountOwner dell'account.
func (t *Controller) GetAccount(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.GetAccount", "TOKEN", map[string]string{"account_id": account_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Account.GetAccountWithStatus(account_id)
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un oggetto account JSON che include le proprietà riportate di seguito.
  • AccountId: l'ID dell'account utente.
  • UserId: il nome utente o l'ID e-mail dell'utente.
  • OrgId: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • TokenId: l'ID del token.
  • Balance: il saldo corrente del conto.
  • BalanceOnHold: il saldo corrente bloccato del conto.
  • BapAccountVersion: parametro dell'oggetto conto per uso interno.
  • Status: lo stato corrente dell'account utente.
Esempio di valore restituito:
{
  "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
  "AssetType": "oaccount",
  "Balance": 95,
  "BalanceOnHold": 0,
  "BapAccountVersion": 8,
  "OrgId": "appdev",
  "Status": "active",
  "TokenId": "obp1",
  "TokenName": "obptok",
  "TokenType": "fungible",
  "UserId": "idcqa"
}
GetAccountHistory
Questo metodo restituisce i dettagli della cronologia dell'account per un utente e un token specificati. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato o dall'AccountOwner dell'account.
func (t *Controller) GetAccountHistory(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.History", "TOKEN", map[string]string{"account_id": account_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Account.History(account_id)
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un array di oggetti account JSON che include le proprietà riportate di seguito.
  • TxId: l'ID della transazione restituito dal libro contabile.
  • Timestamp: l'ora della transazione.
  • IsDelete: valore booleano che indica se il record viene eliminato.
  • Value: stringa JSON dell'oggetto account. Il parametro BapAccountVersion viene definito nell'oggetto conto per uso interno.
Esempio di valore restituito:
[
  {
      "IsDelete": "false",
      "Timestamp": "2023-08-28T19:31:15Z",
      "TxId": "adde470a63860ec1013bd5c5987e8a506a48942a91b0f39fc8e561374042bd27",
      "Value": {
          "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
          "AssetType": "oaccount",
          "Balance": 100,
          "BalanceOnHold": 0,
          "BapAccountVersion": 1,
          "OrgId": "Org1MSP",
          "TokenId": "t1",
          "TokenName": "obptok",
          "TokenType": "fungible",
          "UserId": "idcqa"
      }
  },
  {
      "IsDelete": "false",
      "Timestamp": "2023-08-28T19:30:23Z",
      "TxId": "8fbeda2ba60ba175091faae5ae369247775f2cba45c4d6d1ead6f0b05be84743",
      "Value": {
          "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
          "AssetType": "oaccount",
          "Balance": 0,
          "BalanceOnHold": 0,
          "BapAccountVersion": 0,
          "OrgId": "Org1MSP",
          "TokenId": "t1",
          "TokenName": "obptok",
          "TokenType": "fungible",
          "UserId": "idcqa"
      }
  },
  {
      "IsDelete": "false",
      "Timestamp": "2023-08-28T19:29:54Z",
      "TxId": "19bb296ae71709e91b097ba5d9ebd7f7522095880382fbf5913334a46a6026aa",
      "Value": {
          "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
          "AssetType": "oaccount",
          "Balance": 0,
          "BalanceOnHold": 0,
          "BapAccountVersion": 0,
          "OrgId": "Org1MSP",
          "TokenId": "",
          "TokenName": "",
          "TokenType": "fungible",
          "UserId": "idcqa"
      }
  }
]
GetAccountOnHoldBalance
Questo metodo restituisce il saldo in sospeso corrente per un conto e un token specificati. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal AccountOwner dell'account.
func (t *Controller) GetAccountOnHoldBalance(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.GetAccountOnHoldBalance", "TOKEN", map[string]string{"account_id": account_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      response, err := t.Ctx.Account.GetAccountOnHoldBalance(account_id)
      return response, err
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, una rappresentazione JSON del saldo in sospeso corrente.
Esempio di valore restituito:
{
    "holding_balance": 0,
    "msg": "Total Holding Balance of Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id: Org1MSP, user_id: user1) is 0"
}
GetAllAccounts
Questo metodo restituisce un elenco di tutti i conti. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato. Questo metodo utilizza query rich SQL di Berkeley DB e può essere richiamato solo quando si è connessi alla rete remota di Oracle Blockchain Platform.
func (t *Controller) GetAllAccounts() (interface{}, error) {
    auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAllAccounts", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller  %s", err.Error())
    }
    return t.Ctx.Account.GetAllAccounts()
}
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, un array JSON di tutti gli account.
Esempio di valore restituito:
[
    {
        "key": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
        "valueJson": {
            "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
            "AssetType": "oaccount",
            "Balance": 100,
            "BalanceOnHold": 0,
            "BapAccountVersion": 1,
            "OrgId": "appdev",
            "TokenId": "t1",
            "TokenName": "obptok",
            "TokenType": "fungible",
            "UserId": "idcqa"
        }
    }
]
GetUserByAccountId
Questo metodo restituisce i dettagli utente (org_id e user_id) per un account specificato. Questo metodo può essere chiamato da qualsiasi utente del codice concatenato.
func (t *Controller) GetUserByAccountId(account_id string) (interface{}, error) {
    return t.Ctx.Account.GetUserByAccountById(account_id)
}
Parametri:
  • account_id string: l'ID del conto.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON dei dettagli utente (org_id, token_id e user_id).
Esempio di valore restituito:
{"org_id":"Org1MSP","token_id":"digiCurr101","user_id":"user1"}
GetAccountBalance
Questo metodo restituisce il saldo corrente per un conto e un token specificati. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal AccountOwner dell'account.
func (t *Controller) GetAccountBalance(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.GetAccountBalance", "TOKEN", map[string]string{"account_id": account_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      response, err := t.Ctx.Account.GetAccountBalance(account_id)
      return response, err
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, una rappresentazione JSON del saldo del conto corrente.
Esempio di valore restituito:
{"msg":"Current Balance of oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f is 0","user_balance":0}
GetAllOrgAccounts
Questo metodo restituisce un elenco di tutti i conti token appartenenti a un'organizzazione specificata. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata.
func (t *Controller) GetAllOrgAccounts(org_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAllOrgAccounts", "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.GetAllOrgAccounts(org_id)
}
Parametri:
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'organizzazione.
Restituisce:
  • In caso di operazione riuscita, un elenco di tutti gli account per l'organizzazione specificata.
Esempio di valore restituito:
[
    {
        "key": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
        "valueJson": {
            "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
            "AssetType": "oaccount",
            "Balance": 0,
            "BalanceOnHold": 0,
            "BapAccountVersion": 0,
            "OrgId": "appdev",
            "TokenId": "token",
            "TokenName": "fiatmoneytok",
            "TokenType": "fungible",
            "UserId": "idcqa"
        }
    },
    {
        "key": "oaccount~9c650574af9025a6106c8d12a801b079eda9ae2e3399fc2fbd5bd683d738a850",
        "valueJson": {
            "AccountId": "oaccount~9c650574af9025a6106c8d12a801b079eda9ae2e3399fc2fbd5bd683d738a850",
            "AssetType": "oaccount",
            "Balance": 0,
            "BalanceOnHold": 0,
            "BapAccountVersion": 0,
            "OrgId": "appdev",
            "TokenId": "token",
            "TokenName": "fiatmoneytok",
            "TokenType": "fungible",
            "UserId": "example_minter"
        }
    }
]

Metodi per la gestione dei ruoli

AddRole
Questo metodo aggiunge un ruolo a un utente e a un token specificati. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata che dispone anche del ruolo specificato.
func (t *Controller) AddRole(token_id string, user_role 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
      }
      tokenAssetValue, err := t.getTokenObject(token_id)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.Auth.CheckAuthorization("Token.AddRoleMember", "TOKEN", map[string]string{"org_id": org_id, "token_id": token_id, "role": user_role})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Token.AddRoleMember(user_role, account_id, tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
  • user_role string: il nome del ruolo da aggiungere all'utente specificato. I comportamenti mintable e burnable corrispondono alle proprietà minter_role_name e burner_role_name del file di specifica. Analogamente, il ruolo notary corrisponde alla proprietà notary_role_name del file di specifica.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio con i dettagli dell'account.
Esempio di valore restituito:
 {"msg":"Successfully added role minter to oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1)"}
RemoveRole
Questo metodo rimuove un ruolo da un utente e un token specificati. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata che dispone anche del ruolo specificato.
func (t *Controller) RemoveRole(token_id string, user_role 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
      }
      tokenAssetValue, err := t.getTokenObject(token_id)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.Auth.CheckAuthorization("Token.RemoveRoleMember", "TOKEN", map[string]string{"org_id": org_id, "token_id": token_id, "role": user_role})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Token.RemoveRoleMember(user_role, account_id, tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
  • user_role string: il nome del ruolo da rimuovere dall'utente specificato. I comportamenti mintable e burnable corrispondono alle proprietà minter_role_name e burner_role_name del file di specifica. Analogamente, il ruolo notary corrisponde alla proprietà notary_role_name del file di specifica.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio con i dettagli dell'account.
Esempio di valore restituito:
{"msg":"successfully removed member_id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1) from role minter"}
GetAccountsByRole
Questo metodo restituisce un elenco di tutti gli ID account per un ruolo e un token specificati. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato.
func (t *Controller) GetAccountsByRole(token_id string, user_role string) (interface{}, error) {
    auth, err:= t.Ctx.Auth.CheckAuthorization("Role.GetAccountsByRole", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    return t.Ctx.Role.GetAccountsByRole(token_id, user_role)
}
Parametri:
  • token_id string: l'ID del token.
  • user_role string: il nome del ruolo da cercare.
Restituisce:
  • In caso di operazione riuscita, un array JSON di ID account.
Esempio di valore restituito:
{
    "accounts": [
        "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4"
    ]
}
GetAccountsByUser
Questo metodo restituisce un elenco di tutti gli ID account per un ID organizzazione e un ID utente specificati. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal Account Owner specificato nei parametri.
func (t *Controller) GetAccountsByUser(org_id string, user_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetAccountsByUser", "TOKEN", map[string]string{"org_id": org_id, "user_id": user_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Account.GetAccountsByUser(org_id, user_id)
}
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un array JSON di ID account.
Esempio di valore restituito:
{
    "accounts": [
        "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4"
    ]
}
GetUsersByRole
Questo metodo restituisce una lista di tutti gli utenti per un ruolo e un token specificati. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o dal Account Owner specificato nei parametri.
func (t *Controller) GetUsersByRole(token_id string, user_role string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Role.GetUsersByRole", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Role.GetUsersByRole(token_id, user_role)
}
Parametri:
  • token_id string: l'ID del token.
  • user_role string: il nome del ruolo da cercare.
Restituisce:
  • In caso di operazione riuscita, un array JSON degli oggetti utente (org_id e user_id).
Esempio di valore restituito:
{"Users":[{"org_id":"Org1MSP","token_id":"digiCurr101","user_id":"user1"}]}
IsInRole
Questo metodo restituisce un valore booleano per indicare se un utente e un token hanno un ruolo specificato. Questo metodo può essere richiamato solo dal Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal AccountOwner del conto.
func (t *Controller) IsInRole(token_id string, org_id string, user_id string, user_role string) (interface{}, error) {
      tokenAssetValue, err := t.getTokenObject(token_id)
      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("Token.IsInRole", "TOKEN", map[string]string{"account_id": account_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      result, err := t.Ctx.Token.IsInRole(user_role, account_id, tokenAssetValue.Interface())
      if err != nil {
            return nil, fmt.Errorf("error in IsInRole %s", err.Error())
      }
      response := make(map[string]interface{})
      response["result"] = result
      return response, nil
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
  • user_role string: il nome del ruolo da cercare.
Restituisce:
  • In caso di operazione riuscita, una stringa JSON del risultato booleano.
Esempio di valore restituito:
{"result":false}
GetOrgUsersByRole
Questo metodo restituisce informazioni su tutti gli utenti che hanno un ruolo specificato in un'organizzazione specificata. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata.
func (t *Controller) GetOrgUsersByRole(token_id string, user_role string, org_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Role.GetOrgUsersByRole", "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.Role.GetOrgUsersByRole(token_id, user_role, org_id)
}
Parametri:
  • token_id: string: l'ID del token.
  • role: string: il nome del ruolo da controllare.
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'organizzazione.
Restituisce:
  • In caso di operazione riuscita, un elenco di tutti gli utenti con il ruolo specificato nell'organizzazione specificata.
Esempio di valore restituito:
{
    "Users": [
        {
            "org_id": "Org1MSP",
            "token_id": "token",
            "user_id": "admin"
        },
        {
            "org_id": "Org1MSP",
            "token_id": "token",
            "user_id": "orgAdmin"
        }
    ]
}
GetOrgAccountsByRole
Questo metodo restituisce informazioni su tutti i conti con un ruolo specificato in un'organizzazione specificata. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato o da un Org Admin dell'organizzazione specificata.
func (t *Controller) GetOrgAccountsByRole(token_id string, user_role string, org_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Role.GetOrgAccountsByRole", "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.Role.GetOrgAccountsByRole(token_id, user_role, org_id)
}
Parametri:
  • token_id: string: l'ID del token.
  • role: string: il nome del ruolo da controllare.
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'organizzazione.
Restituisce:
  • In caso di operazione riuscita, un elenco di tutti gli account con il ruolo specificato nell'organizzazione specificata.
Esempio di valore restituito:
{
    "accounts": [
        "oaccount~abc74791148b761352b98df58035601b6f5480448ac2b4a3a7eb54bdbebf48eb",
         "oaccount~9c650574af9025a6106c8d12a801b079eda9ae2e3399fc2fbd5bd683d738a850"
    ]
}

Metodi per la gestione della cronologia delle transazioni

GetAccountTransactionHistory
Questo metodo restituisce un array di dettagli della cronologia delle transazioni conto per un utente e un token specificati. Questo metodo può essere richiamato solo dal Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal AccountOwner del conto.
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
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un array di oggetti transazione account JSON che include le proprietà riportate di seguito.
  • balance: il saldo del conto.
  • holding_id: l'ID di un conto di deposito.
  • onhold_balance: il saldo bloccato.
  • timestamp: l'ora della transazione.
  • token_id: l'ID del token.
  • transacted_account - Il conto con cui ha avuto luogo la transazione.
  • transacted_amount: l'importo della transazione.
  • transaction_id: l'ID della transazione.
  • transaction_type: il tipo di transazione.
Esempio di valore restituito:
[{
    "balance": 199,
    "onhold_balance": 0,
    "timestamp": "2021-08-16T17:42:32.905+05:30",
    "token_id": "digiCurr101",
    "transacted_account": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
    "transacted_amount": 1,
    "transaction_id": "otransaction~c8a9fa001aba6e0d8391b034655889df47eb5103713840b999a4ab41f5e57b38",
    "transaction_type": "DEBIT"
}, {
    "balance": 200,
    "onhold_balance": 0,
    "timestamp": "2021-08-16T17:41:59.262+05:30",
    "token_id": "digiCurr101",
    "transacted_account": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
    "transacted_amount": 100,
    "transaction_id": "otransaction~65a0bf8ae8108baa7495fbab91c205651c055e9f480f6808753287173026aa69",
    "transaction_type": "MINT"
}]
GetAccountTransactionHistoryWithFilters
Questo metodo restituisce un array di dettagli della cronologia delle transazioni conto per un utente e un token specificati. Questo metodo può essere richiamato solo dal Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal AccountOwner del conto. Questo metodo può essere richiamato solo quando è connesso alla rete remota di Oracle Blockchain Platform.
func (t *Controller) GetAccountTransactionHistoryWithFilters(token_id string, org_id string, user_id 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.GetAccountTransactionHistoryWithFilters(account_id, org_id, user_id, filters...)
      return transactionArray, err
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
  • filters: string: parametro facoltativo. Se vuoto, vengono restituiti tutti i record. La proprietà PageSize determina il numero di record da restituire. Se PageSize è 0, la dimensione predefinita della pagina è 20. La proprietà Bookmark determina l'indice iniziale dei record da restituire. Per ulteriori informazioni, vedere la documentazione di Hyperledger Fabric. Le proprietà StartTime e EndTime devono essere specificate in formato RFC-3339.
Esempio:

ochain invoke GetAccountTransactionHistoryWithFilters 'token1' 'appbuilder12' 'user_minter' '{"PageSize":10,"Bookmark":"1","StartTime":"2022-01-25T17:41:42Z","EndTime":"2022-01-25T17:59:10Z"}'

[
  {
    "transaction_id": "otransaction~3f9c306b0ef6994885939c1a6eb5f063b06617ecb932d4a043f323ba53d55f9f",
    "transacted_amount": 200,
    "timestamp": "2022-02-15T18:27:13.000Z",
    "token_id": "token1",
    "transacted_account": "oaccount~obptok~26e046c8ba8b98da2cdabb78113d67200581ea3d4eea5aa324
1abd3598e05d05",
    "transaction_type": "DEBIT",
    "balance": 9200,
    "onhold_balance": 0
  },
  {
    "transaction_id": "otransaction~f1d37c3abd5c85c0a399f246d8eb68257c49ab4fe4cdfd3501908583c51c421e",
    "transacted_amount": 200,
    "timestamp": "2022-02-15T18:27:02.000Z",
    "token_id": "token1",
    "transaction_type": "BULKTRANSFER",
    "number_of_sub_transactions": 2,
    "balance": 9600,
    "onhold_balance": 0
  },
  {
    "transaction_id": "otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b",
    "transacted_amount": 200,
    "timestamp": "2022-02-15T18:26:57.000Z",
    "token_id": "token1",
    "transaction_type": "BULKTRANSFER",
    "number_of_sub_transactions": 2,
    "balance": 9800,
    "onhold_balance": 0
  },
  {
    "transaction_id": "otransaction~07331a1f7be99d6750973674a783da9ec9ca17df23747cdf52d388865d93f9a",
    "transacted_amount": 10000,
    "timestamp": "2022-02-15T18:26:30.000Z",
    "token_id": "token1",
    "transacted_account": "oaccount~obptok~88b62f329f20fffc6fc9231cb51019a5e9550c78b657123d140897
62397d2b55",
    "transaction_type": "MINT",
    "balance": 10000,
    "onhold_balance": 0
  }
]
GetSubTransactionsById
Questo metodo restituisce un array di dettagli della cronologia delle transazioni secondarie per una transazione specificata.
func (t *Controller) GetSubTransactionsById(transaction_id string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetSubTransactionsById", "TOKEN", map[string]string{"transaction_id": transaction_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Account.GetSubTransactionsById(transaction_id)
}
Parametri:
  • transaction_id string: l'ID della transazione.
Esempio:

ochain invoke GetAccountSubTransactionHistory 'otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b'

[
  {
    "transaction_id": "otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b~c4ca4238a0b923820dcc509a6f75849b",
    "transacted_amount": 100,
    "timestamp": "2022-02-15T18:26:57.000Z",
    "token_id": "token1",
    "transacted_account": "oaccount~obptok~6600eb38d365552b76f41d4186acece104f31eae331a440f963e6fa75b62ff21",
    "transaction_type": "DEBIT",
    "balance": 9900,
    "onhold_balance": 0
  },
  {
    "transaction_id": "otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b~c81e728d9d4c2f636f067f89cc14862c",
    "transacted_amount": 100,
    "timestamp": "2022-02-15T18:26:57.000Z",
    "token_id": "token1",
    "transacted_account": "oaccount~obptok~26e046c8ba8b98da2cdabb78113d67200581ea3d4eea5aa3241abd3598e05d05",
    "transaction_type": "DEBIT",
    "balance": 9800,
    "onhold_balance": 0
  }
]
GetSubTransactionsByIdWithFilters
Questo metodo restituisce un array di dettagli della cronologia delle transazioni secondarie per una transazione specificata.
func (t *Controller) GetSubTransactionsByIdWithFilters(transaction_id string, filters ...account.SubTransactionFilters) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Account.GetSubTransactionsByIdWithFilters", "TOKEN", map[string]string{"transaction_id": transaction_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Account.GetSubTransactionsByIdWithFilters(transaction_id, filters...)
}
Parametri:
  • transaction_id string: l'ID della transazione.
  • filters: string: parametro facoltativo. Se vuoto, vengono restituiti tutti i record. La proprietà PageSize determina il numero di record da restituire. Se PageSize è 0, la dimensione predefinita della pagina è 20. La proprietà Bookmark determina l'indice iniziale dei record da restituire. Per ulteriori informazioni, vedere la documentazione di Hyperledger Fabric. Le proprietà StartTime e EndTime devono essere specificate in formato RFC-3339.
Esempio:

ochain invoke GetAccountSubTransactionHistoryWithFilters 'otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b' '{"PageSize":10,"Bookmark":"1"}'

[
{
"transaction_id": "otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b~c4ca4238a0b923820dcc509a6f75849b",
"transacted_amount": 100,
"timestamp": "2022-02-15T18:26:57.000Z",
"token_id": "token1",
"transacted_account": "oaccount~obptok~6600eb38d365552b76f41d4186acece104f31eae331a440f963e6fa75b62ff21",
"transaction_type": "DEBIT",
"balance": 9900,
"onhold_balance": 0
},
{
"transaction_id": "otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b~c81e728d9d4c2f636f067f89cc14862c",
"transacted_amount": 100,
"timestamp": "2022-02-15T18:26:57.000Z",
"token_id": "token1",
"transacted_account": "oaccount~obptok~26e046c8ba8b98da2cdabb78113d67200581ea3d4eea5aa3241abd3598e05d05",
"transaction_type": "DEBIT",
"balance": 9800,
"onhold_balance": 0
}
]
GetTransactionById
Questo metodo restituisce la cronologia di un asset Transaction.
func (t *Controller) GetTransactionById(transaction_id string) (interface{}, error) {
    return t.Ctx.Transaction.GetTransactionById(transaction_id)
}
Parametri:
  • transaction_id string: l'ID del cespite transazione.
Restituisce:
  • In caso di operazione riuscita, un array JSON della cronologia della transazione.
Esempio di valore restituito:
{
    "history": [
        {
            "IsDelete": "false",
            "Timestamp": "2021-08-16 20:19:05.028 +0530 IST",
            "TxId": "67042154a6853011d111b13f73943f06d2a6ae3cfb9a84cb104482c359eb2220",
            "Value": {
                "Amount": 3,
                "AssetType": "otransaction",
                "FromAccountId": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
                "HoldingId": "ohold~digicur~digiCurr101~op2",
                "NumberOfSubTransactions": 0,
                "Timestamp": "2021-08-16T20:19:05+05:30",
                "ToAccountId": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
                "TokenId": "digiCurr101",
                "TransactionId": "otransaction~67042154a6853011d111b13f73943f06d2a6ae3cfb9a84cb104482c359eb2220",
                "TransactionType": "RELEASEHOLD"
            }
        }
    ],
    "transaction_id": "otransaction~67042154a6853011d111b13f73943f06d2a6ae3cfb9a84cb104482c359eb2220"
}
DeleteHistoricalTransactions
Questo metodo elimina le transazioni meno recenti dal database di stato.
func (t *Controller) DeleteHistoricalTransactions(timestamp string) (interface{}, error) {
      auth, err := t.Ctx.Auth.CheckAuthorization("Transaction.DeleteHistoricalTransactions", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Transaction.DeleteHistoricalTransactions(timestamp)
}
Parametri:
  • timestamp string: indicatore orario che indica quando eliminare le transazioni. I cespiti transazione più vecchi dell'ora specificata verranno eliminati.

Metodi per la gestione del comportamento dei token - Funzionamento minimo

IssueTokens
Questo metodo coniuga i token, che sono quindi di proprietà del chiamante del metodo. Il chiamante deve avere un account e il ruolo di minter. Il numero di token che possono essere coniati è limitato dalla proprietà max_mint_quantity del comportamento mintable nel file di specifica. Se la proprietà max_mint_quantity non viene specificata, è possibile creare un numero illimitato di token. La quantità deve essere compresa nei valori decimali specificati dal parametro decimal del comportamento divisible nel file di specifica. Questo metodo può essere chiamato solo dal AccountOwner dell'account con il ruolo di minter.
func (t *Controller) IssueTokens(token_id string, quantity float64) (interface{}, error) {
    tokenAssetValue, err := t.getTokenObject(token_id)
    if err != nil {
        return nil, err
    }
    return t.Ctx.Token.Mint(quantity, tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
  • quantity float64: il numero di token da coniare.
Restituisce:
  • In caso di operazione riuscita, un messaggio con i dettagli dell'account.
Esempio di valore restituito:
{"msg":"Successfully minted 100 tokens to account oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1)"}
GetTotalMintedTokens
Questo metodo restituisce il numero totale di token coniati per un token specificato. Questo metodo può essere chiamato solo da un Token Admin o Org Admin del codice concatenato.
func (t *Controller) GetTotalMintedTokens(token_id string) (interface{}, error) {
    tokenAssetValue, err := t.getTokenObject(token_id)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.GetTotalMintedTokens", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    return t.Ctx.Token.GetTotalMintedTokens(tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, una stringa JSON che indica il numero totale di token.
Esempio di valore restituito:
{"msg":"total minted amount for token with id digiCurr101 is 1000","quantity":1000}
GetNetTokens
Questo metodo restituisce il numero netto totale di token disponibili nel sistema per un token specificato. Il totale del token netto è la quantità di token rimanenti dopo la masterizzazione dei token. In forma di equazione token netti = totale token coniati - totale token bruciati. Se non vengono bruciati token, il numero di token netti è uguale al totale dei token coniati. Questo metodo può essere chiamato solo da un Token Admin o Org Admin del codice concatenato.
func (t *Controller) GetNetTokens(token_id string) (interface{}, error) {
    tokenAssetValue, err := t.getTokenObject(token_id)
    if err != nil {
        return nil, err
    }
    auth, err := t.Ctx.Auth.CheckAuthorization("Token.GetNetTokens", "TOKEN")
    if err != nil && !auth {
        return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
    }
    return t.Ctx.Token.GetNetTokens(tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, una stringa JSON che indica il numero netto di token.
Esempio di valore restituito:
{"msg":"net minted amount for token with id digiCurr101 is 1000","quantity":1000}

Metodi per la gestione del comportamento dei token - Funzionamento trasferibile

TransferTokens
Questo metodo trasferisce i token dal chiamante a un account specificato. Il chiamante del metodo deve avere un account. La quantità deve essere compresa nei valori decimali specificati dal parametro decimal del comportamento divisible nel file di specifica. Questo metodo può essere chiamato solo dal AccountOwner dell'account.
func (t *Controller) TransferTokens(token_id string, to_org_id string, to_user_id string, quantity float64) (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())
}
Parametri:
  • token_id string: l'ID del token.
  • to_org_id string: l'ID del provider di servizi di appartenenza (MSP) del destinatario nell'organizzazione corrente.
  • to_user_id string: il nome utente o l'ID e-mail del destinatario.
  • quantity float64: il numero di token da trasferire.
Restituisce:
  • In caso di operazione riuscita, un messaggio con i dettagli per entrambi gli account.
Esempio di valore restituito:
{"msg":"successfully transferred 1 tokens from account oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1) to account oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df (org_id : Org1MSP, user_id : admin)"}
BulkTransferTokens
Questo metodo viene utilizzato per eseguire il trasferimento di massa dei token dall'account chiamante agli account specificati nell'oggetto flow. Le quantità devono essere comprese nei valori decimali specificati dal parametro decimal del comportamento divisible nel chiamante della specifica file.The di questo metodo devono avere un account già creato. Questo metodo può essere chiamato solo dal AccountOwner dell'account.
func (t *Controller) BulkTransferTokens(token_id string, flow[]map[string]interface{}) (interface{}, error) {
    tokenAssetValue, err := t.getTokenObject(token_id)
    if err != nil {
        return nil, err
    }
    return t.Ctx.Token.BulkTransfer(flow, tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
  • flow[]map[string]interface{}: un array di oggetti JSON che specifica i dettagli e le quantità del ricevente.
    • to_org_id string: l'ID del provider di servizi di appartenenza (MSP) del destinatario nell'organizzazione corrente.
    • to_user_id string: il nome utente o l'ID e-mail del destinatario.
    • quantity float64: il numero di token da trasferire.
    Ad esempio:
    [{
    	"to_org_id": "Org1MSP",
    	"to_user_id": "user1",
    	"quantity": 10
    }, {
    	"to_org_id": "Org1MSP",
    	"to_user_id": "user2",
    	"quantity": 10
    }]
Restituisce:
  • Messaggio che indica il successo.
Esempio di valore restituito:
{
    "from_account_id": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
    "msg": "Successfully transferred 2 tokens from Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (Org-Id: Org1MSP, User-Id: user1)",
    "sub_transactions": [
        {
            "amount": 1,
            "to_account_id": "oaccount~digicur~38848e87296d67c8a90918f78cf55f9c9baab2cdc8c928535471aaa1210c706e"
        },
        {
            "amount": 1,
            "to_account_id": "oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df"
        }
    ]
}

Metodi per la gestione del comportamento dei token - Funzionamento bloccabile

HoldTokens
Questo metodo crea un blocco per conto del proprietario dei token con l'account to_account_id. È specificato un conto notarile, che è responsabile del completamento o del rilascio del blocco. Quando viene creato il blocco, il saldo del token specificato dal responsabile pagamento viene bloccato. Impossibile trasferire un saldo bloccato finché il blocco non viene completato o rilasciato. Il chiamante di questo metodo deve avere un account già creato. Questo metodo può essere chiamato solo dal AccountOwner dell'account.
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) (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())
}
Parametri:
  • token_id string: l'ID del token.
  • operation_id string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
  • to_org_id string: l'ID del provider di servizi di appartenenza (MSP) del destinatario nell'organizzazione corrente.
  • to_user_id string: il nome utente o l'ID e-mail del destinatario.
  • notary_org_id string - ID del fornitore di servizi di appartenenza (MSP) del notaio nell'organizzazione corrente.
  • notary_user_id string - Il nome utente o l'ID e-mail del notaio.
  • quantity float64: il numero di token da mettere in attesa.
  • time_to_expiration: l'ora di scadenza del blocco. Specificare 0 per un blocco permanente. In caso contrario, utilizzare il formato RFC-3339. Ad esempio, 2021-06-02T12:46:06Z.
Restituisce:
  • In caso di operazione riuscita, un messaggio con l'account del chiamante e i dettagli del blocco.
Esempio di valore restituito:
{"msg":"AccountId oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1) is successfully holding 2 tokens"}
ExecuteHoldTokens
Questo metodo completa un blocco su un token. Una quantità di token precedentemente detenuta da un proprietario di token viene trasferita a un ricevente. Se il valore quantity è inferiore al valore di blocco effettivo, l'importo rimanente sarà nuovamente disponibile per il proprietario originale dei token. Questo metodo può essere richiamato solo dall'ID AccountOwner con il ruolo notary. Il blocco può essere completato solo dal notaio.
func (t *Controller) ExecuteHoldTokens(token_id string, operation_id string, quantity float64) (interface{} error) {
    tokenAssetValue, err := t.getTokenObject(token_id)
    if err != nil {
        return nil, err
    }
    return t.Ctx.Token.ExecuteHold(operation_id, quantity, tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
  • operation_id string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
  • quantity float64: il numero di token bloccati da trasferire.
Restituisce:
  • In caso di operazione riuscita, un messaggio con l'ID account del chiamante e la quantità della transazione.
Esempio di valore restituito:
{"msg":"Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1) has successfully executed '1' tokens(digiCurr101) from the hold with Operation Id 'op1'"}
ReleaseHoldTokens
Questo metodo rilascia un blocco sui token. Il trasferimento non è completato e tutti i token detenuti sono nuovamente disponibili per il proprietario originale. Questo metodo può essere richiamato dall'ID Account Owner con il ruolo notary entro il limite di tempo specificato oppure dal responsabile pagamento, dal beneficiario o dal notaio dopo il limite di tempo specificato.
func (t *Controller) ReleaseHoldTokens(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())
}
Parametri:
  • token_id string: l'ID del token.
  • operation_id string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
Restituisce:
  • In caso di operazione riuscita, viene visualizzato un messaggio che indica che il blocco è stato rilasciato.
Esempio di valore restituito:
{"msg":"Successfully released '3' tokens from Operation Id 'op2' to Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1)"}
GetOnHoldIds
Questo metodo restituisce un elenco di tutti gli ID di blocco per un conto specificato. Questo metodo può essere richiamato dal Token Admin del codice concatenato, da un Org Admin dell'organizzazione specificata o dal Account Owner del conto.
func (t *Controller) GetOnHoldIds(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.GetOnHoldIds", "TOKEN", map[string]string{"account_id": account_id})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.Account.GetOnHoldIDs(account_id)
}
Parametri:
  • token_id string: l'ID del token.
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, una lista JSON di ID possesso. Un ID di blocco è una concatenazione del tipo di asset ohold, del nome del token, dell'ID token e dell'ID operazione.
Esempio di valore restituito:
{"holding_ids":["ohold~loyaltok123~t1~op1"],"msg":"Holding Ids are: [ohold~loyaltok123~t1~op1]"}
GetOnHoldDetailsWithOperationId
Questo metodo restituisce i dettagli della transazione in sospeso per un ID operazione e un token specificati. Questo metodo può essere richiamato da chiunque.
func (t *Controller) GetOnHoldDetailsWithOperationId(token_id string, operation_id string) (interface{} error) {
    return t.Ctx.Hold.GetOnHoldDetailsWithOperationId(token_id, operation_id)
}
Parametri:
  • token_id string: l'ID del token.
  • operation_id string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
Restituisce:
  • In caso di operazione riuscita, un oggetto di blocco JSON che include le seguenti proprietà:
  • HoldingId: l'ID della partecipazione della transazione.
  • OperationId: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
  • FromAccountId: l'ID account del proprietario corrente dei token bloccati.
  • ToAccountId: l'ID account del destinatario.
  • NotaryAccountId - ID del conto del notaio.
  • TokenId: l'ID del token salvato.
  • Quantity: la quantità di token in sospeso per l'ID dell'azienda.
  • TimeToExpiration: la durata fino alla scadenza del blocco.
Esempio di valore restituito:
{
    "AssetType": "ohold",
    "HoldingId": "ohold~digicur~digiCurr101~op1",
    "OperationId": "op1",
    "TokenName": "digicur",
    "FromAccountId": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
    "ToAccountId": "oaccount~digicur~38848e87296d67c8a90918f78cf55f9c9baab2cdc8c928535471aaa1210c706e",
    "NotaryAccountId": "oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df",
    "TokenId": "digiCurr101",
    "Quantity": 2,
    "TimeToExpiration": "0"
}
GetOnHoldBalanceWithOperationId
Questo metodo restituisce il saldo bloccato per un ID operazione e un token specificati. Questo metodo può essere richiamato da chiunque.
func (t *Controller) GetOnHoldBalanceWithOperationId(token_id string, operation_id string) (interface{} error) {
    return t.Ctx.Hold.GetOnHoldBalanceWithOperationId(token_id, operation_id)
}
Parametri:
  • token_id string: l'ID del token.
  • operation_id string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
Restituisce:
  • In caso di operazione riuscita, una stringa JSON che indica il saldo in sospeso.
Esempio di valore restituito:
{
	"holding_balance": 10,
	"msg": "Current Holding Balance of OperationId opr_121 for token digiCurr101 is : 10"
}

Metodi per la gestione del comportamento dei token - Funzionamento attivabile

BurnTokens
Questo metodo disattiva o brucia i token dal conto del chiamante della transazione. Il chiamante di questo metodo deve avere un account e il ruolo di masterizzatore. La quantità deve essere compresa nei valori decimali specificati dal parametro decimal del comportamento divisible nel file di specifica. Questo metodo può essere chiamato dal Account Owner dell'account con il ruolo di masterizzatore.
func (t *Controller) BurnTokens(token_id string, quantity float64) (interface{} error) {
    tokenAssetValue, err := t.getTokenObject(token_id)
    if err != nil {
        return nil, err
    }
    return t.Ctx.Token.Burn(quantity, tokenAssetValue.Interface())
}
Parametri:
  • token_id string: l'ID del token.
  • quantity float64: il numero di token da masterizzare.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita con la quantità di token bruciati e l'ID account.
Esempio di valore restituito:
{"msg":"Successfully burned 1 tokens from account id: oaccount~digicur~38848e87296d67c8a90918f78cf55f9c9baab2cdc8c928535471aaa1210c706e (org_id : Org1MSP, user_id : user2)"}

Metodi personalizzati

È possibile utilizzare i metodi SDK token per scrivere metodi personalizzati per l'applicazione business.

Assicurarsi di tenere traccia del valore restituito quando si utilizzano i metodi SDK token. Inoltre, per evitare la doppia spesa, non combinare più funzioni asincrone che operano sulle stesse coppie chiave-valore nel database di stato. In alternativa, utilizzare il metodo BulkTransferTokens per eseguire più trasferimenti in un unico metodo.

L'esempio riportato di seguito mostra come utilizzare i metodi SDK token nei metodi personalizzati. Quando viene chiamato il metodo BuyTicket, trasferisce 20 token dal conto del chiamante al conto del venditore e restituisce il messaggio di transazione del trasferimento.

func (t *Controller) BuyTicket(TokenId string, SellerOrgId string, SellerUserId string) (interface{}, error){
	token, err := t.Ctx.Token.Get(TokenId)
	if err != nil {
		return nil, err
	}
	
	/**
	* The following method t.Ctx.Account.GenerateAccountId(TokenId, SellerOrgId, SellerUserId) generates account id of the seller
	*/
	sellerAccountId, err := t.Ctx.Account.GenerateAccountId(TokenId, SellerOrgId, SellerUserId)
    if err != nil {
		return nil, err
	}   

	/**
	* The following method t.Ctx.Token.Transfer(sellerAccountId, 20, token) transfers the quantity 20 from caller's
	* account & to seller's account.
	*/
    transaction, err := t.Ctx.Token.Transfer(sellerAccountId, 20, token)
    if err != nil {
		return nil, err
	}
    return transaction, nil
}

Metodi SDK token

Metodi per la gestione del controllo dell'accesso

L'SDK token fornisce una funzione di controllo dell'accesso. Alcuni metodi possono essere chiamati solo da un Token Admin, Org Admin o AccountOwner del token. È possibile utilizzare questa funzione per garantire che le operazioni vengano eseguite solo dagli utenti previsti. Qualsiasi accesso non autorizzato genera un errore. Per utilizzare la funzione di controllo dell'accesso, importare la classe Authorization dal modulo ../lib/auth.
import { Authorization } from '../lib/auth';
AddAdmin
Questo metodo aggiunge un utente come Token Admin del codice concatenato del token.
Ctx.AddAdmin(org_id string, user_id string) (interface{}, error)
Parametri:
  • user_id: il nome utente o l'ID di posta elettronica dell'utente.
  • org_id: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione di rete corrente.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita e i dettagli per l'utente Token Admin aggiunto. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{"msg":"Successfully added Admin (Org_Id: Org1MSP, User_Id: user2)"}
RemoveAdmin
Questo metodo rimuove un utente come Token Admin del codice concatenato del token.
Ctx.RemoveAdmin(org_id string, user_id string) (interface{}, error)
Parametri:
  • user_id: il nome utente o l'ID di posta elettronica dell'utente.
  • org_id: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione di rete corrente.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita e i dettagli per l'utente Token Admin rimosso. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{"msg":"Successfuly removed Admin (Org_Id Org1MSP User_Id user1)"}
GetAllAdmins
Questo metodo restituisce una lista di tutti gli utenti che sono Token Admin del codice concatenato del token.
Ctx.GetAllAdmins() (interface{}, error)
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, una lista di tutti gli utenti che sono un Token Admin del codice concatenato token. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
[{"OrgId":"Org1MSP","UserId":"admin"},{"OrgId":"Org1MSP","UserId":"user1"}]
GetAllAdminUsers
Questo metodo restituisce una lista di tutti gli utenti che sono Token Admin del codice concatenato del token.
Ctx.Admin.GetAllAdminUsers() (interface{}, error) 
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, una lista di tutti gli utenti che sono un Token Admin del codice concatenato token nel form map[string]interface{}. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{"admins":[{"OrgId":"Org1MSP","UserId":"admin"},{"OrgId":"Org1MSP","UserId":"user1"}]}
CheckAuthorization
Utilizzare questo metodo per aggiungere il controllo dell'accesso al codice concatenato. Molti dei metodi token generati automaticamente utilizzano il controllo dell'accesso. Il mapping tra il ricevitore SDK e i metodi che dispongono del controllo dell'accesso viene descritto nel file oChainUtil.go. Per utilizzare il proprio controllo dell'accesso o per disabilitare il controllo dell'accesso, rimuovere il codice di controllo dell'accesso dai metodi e dai metodi personalizzati generati automaticamente dal controller.
var t TokenAccess
      var r RoleAccess
      var a AccountAccess
      var as AccountStatusAccess
      var h HoldAccess
      var ad AdminAccess
      var trx TransactionAccess
      var tc TokenConversionAccess
      var auth AuthAccess

      auth.IsTokenAdmin = []string{"Admin", "MultipleAccountOwner"}

      trx.DeleteHistoricalTransactions = []string{"Admin"}
      ad.AddAdmin = []string{"Admin"}
      ad.RemoveAdmin = []string{"Admin"}
      ad.GetAllAdmins = []string{"Admin", "OrgAdmin"}
      ad.AddOrgAdmin = []string{"Admin", "OrgAdminOrgIdCheck"}
      ad.RemoveOrgAdmin = []string{"Admin", "OrgAdminOrgIdCheck"}
      ad.GetOrgAdmins = []string{"Admin", "OrgAdmin"}
      ad.IsTokenAdmin = []string{"Admin", "MultipleAccountOwner", "OrgAdmin"}
      t.Save = []string{"Admin"}
      t.GetAllTokens = []string{"Admin", "OrgAdmin"}
      t.Update = []string{"Admin"}
      t.GetTokenDecimals = []string{"Admin", "OrgAdmin"}
      t.GetTokensByName = []string{"Admin", "OrgAdmin"}
      t.AddRoleMember = []string{"Admin", "OrgAdminRoleCheck"}
      t.RemoveRoleMember = []string{"Admin", "OrgAdminRoleCheck"}
      t.IsInRole = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      t.GetTotalMintedTokens = []string{"Admin", "OrgAdmin"}
      t.GetNetTokens = []string{"Admin", "OrgAdmin"}
      t.Get = []string{"Admin", "OrgAdmin"}
      t.GetTokenHistory = []string{"Admin", "OrgAdmin"}
      a.CreateAccount = []string{"Admin", "OrgAdminOrgIdCheck"}
      a.AssociateToken = []string{"Admin", "OrgAdminAccountIdCheck"}
      a.GetAllAccounts = []string{"Admin"}
      a.GetAllOrgAccounts = []string{"Admin", "OrgAdminOrgIdCheck"}
      a.GetAccount = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      a.History = []string{"Admin", "AccountOwner"}
      a.GetAccountTransactionHistory = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      a.GetAccountTransactionHistoryWithFilters = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      a.GetSubTransactionsById = []string{"Admin", "TransactionInvoker"}
      a.GetSubTransactionsByIdWithFilters = []string{"Admin", "TransactionInvoker"}
      a.GetAccountBalance = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      a.GetAccountOnHoldBalance = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      a.GetOnHoldIds = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      a.GetAccountsByUser = []string{"Admin", "OrgAdminOrgIdCheck", "MultipleAccountOwner"}

      as.Get = []string{"Admin", "OrgAdminAccountIdCheck", "AccountOwner"}
      as.ActivateAccount = []string{"Admin", "OrgAdminOrgIdCheck"}
      as.SuspendAccount = []string{"Admin", "OrgAdminOrgIdCheck"}
      as.DeleteAccount = []string{"Admin", "OrgAdminOrgIdCheck"}

      r.GetAccountsByRole = []string{"Admin"}
      r.GetUsersByRole = []string{"Admin"}
      r.GetOrgAccountsByRole = []string{"Admin", "OrgAdminOrgIdCheck"}
      r.GetOrgUsersByRole = []string{"Admin", "OrgAdminOrgIdCheck"}

      tc.InitializeExchangePoolUser = []string{"Admin"}
      tc.AddConversionRate = []string{"Admin"}
      tc.UpdateConversionRate = []string{"Admin"}
      tc.GetConversionRate = []string{"Admin", "OrgAdmin", "AnyAccountOwner"}
      tc.GetConversionRateHistory = []string{"Admin", "OrgAdmin", "AnyAccountOwner"}
      tc.TokenConversion = []string{"Admin", "AnyAccountOwner"}
      tc.GetExchangePoolUser = []string{"Admin"}
Ctx.Auth.CheckAuthorization(classFuncName string, args ...string) (bool, error)
Parametri:
  • classFuncName string: il valore della mappa tra i ricevitori e i metodi, come descritto nel file oChainUtil.go.
  • args: un argomento di variabile in cui args[0] è la costante TOKEN e args[1] è l'argomento account_id, se necessario.
Restituisce:
  • Una risposta booleana e un messaggio di errore in caso di errore.
IsUserTokenAdmin
Questo metodo restituisce il valore booleano true se il chiamante della funzione è un valore Token Admin. In caso contrario il metodo restituisce false.
Ctx.Auth.IsUserTokenAdmin()  (bool, error)
Parametri:
  • user_id: il nome utente o l'ID di posta elettronica dell'utente.
  • org_id: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione di rete corrente.
Restituisce:
  • Una risposta booleana e un messaggio di errore in caso di errore.
Esempio di valore restituito:
{"result":false}
AddOrgAdmin
Questo metodo aggiunge un utente come Org Admin dell'organizzazione.
Ctx.Admin.AddOrgAdmin(org_id, user_id) (interface{}, error)
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio che include i dettagli dell'utente aggiunto come Org Admin dell'organizzazione.
Esempio di valore restituito:
{
    "msg": "Successfully added Org Admin (Org_Id: Org1MSP, User_Id: orgAdmin)"
}
RemoveOrgAdmin
Questo metodo rimuove un utente come Org Admin di un'organizzazione.
Ctx.Admin.RemoveOrgAdmin(org_id, user_id) (interface{}, error)
Parametri:
  • org_id string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un messaggio che include i dettagli dell'utente rimosso come Org Admin dell'organizzazione.
Esempio di valore restituito:
{
    "msg": "Successfully removed Org Admin (Org_Id Org1MSP User_Id orgAdmin)"
}
GetOrgAdmins
Questo metodo restituisce un elenco di tutti gli utenti che sono un Org Admin di un'organizzazione.
Ctx.Admin.GetAllOrgAdmins() (interface{}, error)
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, una lista JSON che include oggetti OrgId e UserId.
Esempio di valore restituito:
{
    "admins": [
        {
            "OrgId": "Org1MSP",
            "UserId": "orgadmin"
        },
        {
            "OrgId": "Org1MSP",
            "UserId": "orgadmin1"
        },
        {
            "OrgId": "Org1MSP",
            "UserId": "orgadmin2"
        }
    ]
}

Metodi per la gestione della configurazione dei token

GetTokenDecimals
Questo metodo restituisce il numero di posizioni decimali disponibili per un token frazionario. Se il comportamento di divisible non viene specificato, il valore predefinito è 0.
Ctx.Token.GetTokenDecimals(token_id string) (int, error)
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, le posizioni decimali del token nel tipo di dati numerico. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
1
GetAllTokens
Questo metodo restituisce tutti gli asset token salvati nel database di stato. Questo metodo utilizza query rich SQL di Berkeley DB e può essere richiamato solo quando si è connessi alla rete remota di Oracle Blockchain Platform.
Ctx.Token.GetAllTokens()  (interface{}, error)
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, un array di una mappa di tutti gli asset token. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
"payload": [
    {
        "key": "t1",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "holdable",
                "burnable",
                "roles"
            ],
            "Currency_name": "Currency_name value",
            "Divisible": {
                "Decimal": 8
            },
            "Mintable": {
                "Max_mint_quantity": 10000
            },
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter",
                "notary_role_name": "notary"
            },
            "Token_desc": "Token_desc value",
            "Token_id": "t1",
            "Token_name": "obptok",
            "Token_to_currency_ratio": 999,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    }
]
GetTokensByName
Questo metodo restituisce tutti gli asset token con il nome specificato. Questo metodo utilizza query rich SQL di Berkeley DB e può essere richiamato solo quando si è connessi alla rete remota di Oracle Blockchain Platform.
Ctx.Token.GetTokensByName(token_name string) (interface{}, error)
Parametri:
  • token_name string: il nome del token, che corrisponde alla proprietà Token_name del modello. Il valore è il nome della classe del token.
Restituisce:
  • Restituisce un array di una mappa di tutti gli asset token del nome specificato.
Esempio di valore restituito:
"payload": [
    {
        "key": "t1",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "holdable",
                "burnable",
                "roles"
            ],
            "Currency_name": "Currency_name value",
            "Divisible": {
                "Decimal": 8
            },
            "Mintable": {
                "Max_mint_quantity": 10000
            },
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter",
                "notary_role_name": "notary"
            },
            "Token_desc": "Token_desc value",
            "Token_id": "t1",
            "Token_name": "obptok",
            "Token_to_currency_ratio": 999,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    },
    {
        "key": "obp2",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "holdable",
                "burnable",
                "roles"
            ],
            "Currency_name": "",
            "Divisible": {
                "Decimal": 8
            },
            "Mintable": {
                "Max_mint_quantity": 10000
            },
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter",
                "notary_role_name": "notary"
            },
            "Token_desc": "",
            "Token_id": "obp2",
            "Token_name": "obptok",
            "Token_to_currency_ratio": 0,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    }
]
Get
Questo metodo restituisce un oggetto token se è presente nel database di stato. Questo metodo può essere chiamato solo da un Token Admin del codice concatenato del token.
Ctx.Get(Id string, result ...interface{}) (interface{}, error)
Parametri:
  • token_id: string: l'ID del token da restituire.
  • result: un argomento di variabile in cui il primo argomento result[0] è un riferimento a un oggetto Token vuoto del tipo richiesto.
Restituisce:
  • In caso di operazione riuscita, una mappa con i dati dell'asset token. L'argomento della variabile result[0] contiene i dati del token. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "AssetType": "otoken",
    "Token_id": "digiCurr101",
    "Token_name": "digicur",
    "Token_desc": "Digital Currency equiv of dollar",
    "Token_type": "fungible",
    "Behavior": ["divisible", "mintable", "transferable", "burnable", "holdable", "roles"],
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter",
        "notary_role_name": "notary"
    },
    "Mintable": {
        "Max_mint_quantity": 20000
    },
    "Divisible": {
        "Decimal": 1
    },
    "Token_to_currency_ratio": 1,
    "Currency_representation": "DOLLAR"
}
IsTokenType
Questo metodo verifica se esiste un asset token per un ID token specificato.
Ctx.Model.IsTokenType(token_id: string) error
Parametri:
  • token_id: string: l'ID del token da controllare.
Restituisce:
  • Se esiste un asset token con l'ID specificato, viene restituito un errore nullo. In caso contrario, un oggetto di errore diverso da zero contenente un messaggio di errore.
Esempio di valore restituito:
nil
Save
Questo metodo crea un token e ne salva le proprietà nel database di stato.
Ctx.Token.Save(args ...interface{}) (interface{}, error)
Parametri:
  • token_id: string: l'ID del token da restituire.
  • args: argomento di variabile in cui il primo argomento args[0] è un riferimento ai dati del token struct del tipo richiesto da aggiungere al libro contabile.
Restituisce:
  • In caso di operazione riuscita, un oggetto interface{} con i dettagli sul token salvato nel database di stato. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "AssetType": "otoken",
    "Token_id": "digiCurr101",
    "Token_name": "digicur",
    "Token_desc": "",
    "Token_type": "fungible",
    "Behavior": ["divisible", "mintable", "transferable", "burnable", "roles"],
    "Roles": {
        "minter_role_name": "minter"
    },
    "Mintable": {
        "Max_mint_quantity": 1000
    },
    "Divisible": {
        "Decimal": 2
    },
    "Currency_name": "",
    "Token_to_currency_ratio": 1
}
Update
Questo metodo aggiorna le proprietà del token. Dopo aver creato un asset token, è possibile aggiornare solo il valore token_desc e le relative proprietà personalizzate.
Ctx.Token.Update(args ...interface{}) (interface{}, error)
Parametri:
  • Cespite contenente un riferimento ai dati del token struct di tipo obbligatorio da aggiornare nel libro contabile.
Restituisce:
  • In caso di operazione riuscita, un messaggio di promessa con i dettagli del token. In caso di errore, un rifiuto con un messaggio di errore.
Esempio di valore restituito:
{
    "AssetType": "otoken",
    "Token_id": "digiCurr101",
    "Token_name": "digicur",
    "Token_desc": "Digital Currency equiv of dollar",
    "Token_type": "fungible",
    "Behavior": ["divisible", "mintable", "transferable", "burnable", "roles"],
    "Roles": {
        "minter_role_name": "minter"
    },
    "Mintable": {
        "Max_mint_quantity": 1000
    },
    "Divisible": {
        "Decimal": 2
    },
    "Currency_name": "",
    "Token_to_currency_ratio": 1
}
GetByRange
Questo metodo chiama internamente il metodo fabric getStateByRange. Anche se dal libro contabile viene restituito un cespite con l'ID specificato, questo metodo lo inserisce nel tipo di cespite chiamante.
Ctx.Token.GetByRange(startId string, endId string, asset ...interface{}) ([]map[string]interface{}, error)
Parametri:
  • startId: string: la chiave iniziale dell'intervallo. Questa chiave è inclusa nell'intervallo.
  • endId: string: la chiave finale dell'intervallo. Questa chiave è esclusa dall'intervallo.
  • asset[0]: una slice vuota del token del tipo richiesto. Se il metodo viene eseguito correttamente, questo contiene il risultato richiesto.
Restituisce:
  • In caso di operazione riuscita, una porzione di mappe contenente i dettagli dell'asset token per i token in cui il valore token_id si trova nell'intervallo specificato. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
[{
    "Key": "oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
    "Record": {
        "AccountId": "oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
        "AssetType": "oaccount",
        "Balance": 99,
        "BalanceOnHold": 1,
        "BapAccountVersion": 0,
        "OrgId": "Org1MSP",
        "TokenId": "t1",
        "TokenName": "loyaltok123",
        "UserId": "u1"
    }
}, {
    "Key": "oaccount~loyaltok123~ac30c5ca924a2c7def61acf596d91e0cca70bc8cd233179df4efb2791b56336b",
    "Record": {
        "AccountId": "oaccount~loyaltok123~ac30c5ca924a2c7def61acf596d91e0cca70bc8cd233179df4efb2791b56336b",
        "AssetType": "oaccount",
        "Balance": 0,
        "BalanceOnHold": 0,
        "BapAccountVersion": 0,
        "OrgId": "Org1MSP",
        "TokenId": "t1",
        "TokenName": "loyaltok123",
        "UserId": "u2"
    }
}, {
    "Key": "oaccount~loyaltok123~aef96c40d99e09ef17f9bdda7038e8fbe829a327bae2b4d8d9fcf752190f3ff0",
    "Record": {
        "AccountId": "oaccount~loyaltok123~aef96c40d99e09ef17f9bdda7038e8fbe829a327bae2b4d8d9fcf752190f3ff0",
        "AssetType": "oaccount",
        "Balance": 0,
        "BapAccountVersion": 0,
        "BalanceOnHold": 0,
        "OrgId": "Org1MSP",
        "TokenId": "t1",
        "TokenName": "loyaltok123",
        "UserId": "admin"
    }
}, {
    "Key": "oadmin~Org1MSP~admin",
    "Record": {
        "AssetType": "oadmin",
        "Key": "oadmin~Org1MSP~admin",
        "OrgId": "Org1MSP",
        "UserId": "admin"
    }
}, {
    "Key": "ohold~loyaltok123~t1~op1",
    "Record": {
        "AssetType": "ohold",
        "FromAccountId": "oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
        "HoldingId": "ohold~loyaltok123~t1~op1",
        "NotaryAccountId": "oaccount~loyaltok123~ac30c5ca924a2c7def61acf596d91e0cca70bc8cd233179df4efb2791b56336b",
        "OperationId": "op1",
        "Quantity": 1,
        "TimeToExpiration": "0",
        "ToAccountId": "oaccount~loyaltok123~aef96c40d99e09ef17f9bdda7038e8fbe829a327bae2b4d8d9fcf752190f3ff0",
        "TokenId": "t1",
        "TokenName": "loyaltok123"
    }
}, {
    "Key": "ometadata~loyaltok123~t1",
    "Record": {
        "AssetType": "ometadata",
        "Metadata_id": "ometadata~loyaltok123~t1",
        "Token_id": "t1",
        "Token_name": "loyaltok123",
        "Total_minted_amount": 100,
        "Total_supply": 100
    }
}, {
    "Key": "orole~t1~minter~oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
    "Record": {
        "AccountID": "oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
        "AssetType": "orole",
        "Key": "orole~t1~minter~oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
        "RoleName": "minter",
        "TokenId": "t1"
    }
}, {
    "Key": "otransaction~4a774f6493f6521cab9eda96822cb3bb4103c0738ee2dbb9a193b868ace36fa5",
    "Record": {
        "Amount": 100,
        "AssetType": "otransaction",
        "FromAccountId": "",
        "HoldingId": "",
        "NumberOfSubTransactions": 0,
        "Timestamp": "2021-08-25T23:04:42+05:30",
        "ToAccountId": "oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
        "TokenId": "t1",
        "TransactionId": "otransaction~4a774f6493f6521cab9eda96822cb3bb4103c0738ee2dbb9a193b868ace36fa5",
        "TransactionType": "MINT"
    }
}, {
    "Key": "otransaction~69f3cefbcb64b73f01a0eadff87169f456873ccebe61ca8da3eef3f465f0c129",
    "Record": {
        "Amount": 1,
        "AssetType": "otransaction",
        "FromAccountId": "oaccount~loyaltok123~a4bd3d8abfb1708198971311df77bb527233bcf9121ff95b0526bc056c4b8974",
        "HoldingId": "ohold~loyaltok123~t1~op1",
        "NumberOfSubTransactions": 0,
        "Timestamp": "2021-08-25T23:06:13+05:30",
        "ToAccountId": "oaccount~loyaltok123~aef96c40d99e09ef17f9bdda7038e8fbe829a327bae2b4d8d9fcf752190f3ff0",
        "TokenId": "t1",
        "TransactionId": "otransaction~69f3cefbcb64b73f01a0eadff87169f456873ccebe61ca8da3eef3f465f0c129",
        "TransactionType": "ONHOLD"
    }
}, {
    "Key": "t1",
    "Record": {
        "AssetType": "otoken",
        "Behavior": ["divisible", "mintable", "transferable", "burnable", "holdable", "roles"],
        "Currency_Name": "a",
        "Divisible": {
            "Decimal": 2
        },
        "Effective_From_Date": "2020-09-09T00:00:00Z",
        "Mintable": {
            "Max_mint_quantity": 10000
        },
        "Roles": {
            "minter_role_name": "minter"
        },
        "Token_To_Currency_Ratio": 1,
        "Token_desc": "",
        "Token_id": "t1",
        "Token_name": "loyaltok123",
        "Token_type": "fungible"
    }
}]
History
Questo metodo restituisce la cronologia del token per l'ID token specificato.
Ctx.Token.History(tokenId string) (interface{}, error)
Parametri:
  • tokenId: string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, un array JSON che rappresenta la cronologia dei token.
Esempio di valore restituito:
[
    {
        "IsDelete": "false",
        "Timestamp": "2023-09-01T16:46:33Z",
        "TxId": "12333b8a4f63aa9b3a34072efcbd7df546c6d1e7d82a7a9596e899383656d6f7",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "Currency_name1": "",
            "Divisible": {
                "Decimal": 2
            },
            "Mintable": {
                "Max_mint_quantity": 1000
            },
            "Roles": {
                "minter_role_name": "minter"
            },
            "Token_desc": "updated description",
            "Token_id": "token",
            "Token_name": "fiatmoneytok",
            "Token_to_currency_ratio": 0,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    },
    {
        "IsDelete": "false",
        "Timestamp": "2023-09-01T16:04:25Z",
        "TxId": "99702e2dad7554a5ee4716a0d01d3e394cbce39bea8bade265d8911f30ebad0b",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "divisible",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "Currency_name1": "",
            "Divisible": {
                "Decimal": 2
            },
            "Mintable": {
                "Max_mint_quantity": 1000
            },
            "Roles": {
                "minter_role_name": "minter"
            },
            "Token_desc": "",
            "Token_id": "token",
            "Token_name": "fiatmoneytok",
            "Token_to_currency_ratio": 0,
            "Token_type": "fungible",
            "Token_unit": "fractional"
        }
    }
]

Metodi per la gestione degli account

GenerateAccountId
Questo metodo restituisce un ID account, che è un set alfanumerico di caratteri, preceduto da oaccount~<token asset name>~ e seguito da un hash del nome utente o dell'ID e-mail (user_id) del proprietario dell'istanza o dell'utente che ha eseguito il login all'istanza, dell'ID provider di servizi di appartenenza (org_id) dell'utente nell'organizzazione di rete corrente e dell'ID token univoco (token_id).
Ctx.Account.GenerateAccountId(token_id string, org_id string, user_id string) (string, error)
Parametri:
  • token_id: string: l'ID del token.
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id: string: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, l'ID account generato. In caso di errore, un rifiuto con un messaggio di errore.
Esempio di valore restituito:
oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f
CreateAccount
Questo metodo crea un account per un utente e un token specificati. Ogni utente che ha token in qualsiasi momento deve avere un account. I conti tengono traccia del saldo, del saldo in sospeso e della cronologia delle transazioni di un utente. Un ID account è un set alfanumerico di caratteri, preceduto dal prefisso oaccount~<token asset name>~ e seguito da un hash del nome utente o dell'ID di posta elettronica (user_id) del proprietario dell'istanza o dell'utente che ha eseguito il login all'istanza, l'ID del provider di servizi di appartenenza (org_id) dell'utente nell'organizzazione di rete corrente. Questo metodo può essere richiamato solo dal Token Admin del codice concatenato.
t.Ctx.Account.CreateAccount(org_id string, user_id string, token_type string)
Parametri:
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione corrente.
  • user_id: string: il nome utente o l'ID di posta elettronica dell'utente.
  • token_type: string: il tipo del token, che deve essere fungible.
Restituisce:
  • In caso di operazione riuscita, l'oggetto cliente creato. In caso di errore, un rifiuto con un messaggio di errore.
Esempio di valore restituito:
{
 "AssetType":"oaccount",
"AccountId":"oaccount~a73085a385bc96c4a45aa2dff032e7dede82c0664dee5f396b7c5854eeafd4bd",
   "UserId":"user1",
   "OrgId":"Org1MSP",
   "BapAccountVersion": 0,
   "AccountType":"fungible",
   "TokenId":"",
   "TokenName":"",
   "Balance":0,
   "BalanceOnHold":0
}
AssociateToken
Questo metodo associa un token fungibile a un account. Questo metodo può essere richiamato solo da un Token Admin del codice concatenato.
t.Ctx.Account.AssociateToken(account_id, token_id)
Parametri:
  • account_id string: l'ID del conto.
  • token_id string: l'ID del token.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON dell'account aggiornato.
Esempio di valore restituito:
{ 
"AssetType":"oaccount", 
"AccountId":"oaccount~abc74791148b761352b98df58035601b6f5480448ac2b4a3a7eb54bdbebf48eb", 
"BapAccountVersion": 0,
"UserId":"admin", 
"OrgId":"Org1MSP", 
"AccountType":"fungible", 
"TokenId":"token1", 
"TokenName":"loyaltok", 
"Balance":0, 
"BalanceOnHold":0 
}
GetAccountWithStatus
Questo metodo restituisce i dettagli del conto per un conto specificato, incluso lo stato del conto.
Ctx.Account.GetAccountWithStatus(account_id string) (interface{}, error)
Parametri:
  • account_id: string: l'ID del conto.
Restituisce:
  • In caso di operazione riuscita, i dettagli dell'account richiesto. In caso di errore, un rifiuto con un messaggio di errore.
Esempio di valore restituito:
{
  "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
  "AssetType": "oaccount",
  "Balance": 95,
  "BalanceOnHold": 0,
  "BapAccountVersion": 8,
  "OrgId": "appdev",
  "Status": "active",
  "TokenId": "obp1",
  "TokenName": "obptok",
  "TokenType": "fungible",
  "UserId": "idcqa"
}
GetAccount
Questo metodo restituisce i dettagli del conto per un conto specificato.
Ctx.Account.GetAccount(account_id string) (Account, error)
Parametri:
  • account_id: string: l'ID del conto.
Restituisce:
  • In caso di operazione riuscita, i dettagli dell'account richiesto. In caso di errore, un rifiuto con un messaggio di errore.
Esempio di valore restituito:
{
    "AssetType": "oaccount",
    "BapAccountVersion": 0,
    "AccountId": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
    "UserId": "user1",
    "OrgId": "Org1MSP",
    "TokenId": "digiCurr101",
    "TokenName": "digicur",
    "Balance": 0,
    "BalanceOnHold": 0
}
GetAccountHistory
Questo metodo restituisce un array dei dettagli della cronologia dell'account per un account specificato.
Ctx.Account.History(account_id string) ([]interface{}, error)
Parametri:
  • account_id: string: l'ID del conto.
Restituisce:
  • In caso di operazione riuscita, un array map[string]interface{} contenente i dettagli della cronologia dell'account. I dati dell'account vengono visualizzati sotto la chiave Value nella mappa. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore. Il valore restituito è lo stesso del metodo "GetAccountHistory".
Esempio di valore restituito:
[
  {
      "IsDelete": "false",
      "Timestamp": "2023-08-28T19:31:15Z",
      "TxId": "adde470a63860ec1013bd5c5987e8a506a48942a91b0f39fc8e561374042bd27",
      "Value": {
          "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
          "AssetType": "oaccount",
          "Balance": 100,
          "BalanceOnHold": 0,
          "BapAccountVersion": 1,
          "OrgId": "Org1MSP",
          "TokenId": "t1",
          "TokenName": "obptok",
          "TokenType": "fungible",
          "UserId": "idcqa"
      }
  },
  {
      "IsDelete": "false",
      "Timestamp": "2023-08-28T19:30:23Z",
      "TxId": "8fbeda2ba60ba175091faae5ae369247775f2cba45c4d6d1ead6f0b05be84743",
      "Value": {
          "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
          "AssetType": "oaccount",
          "Balance": 0,
          "BalanceOnHold": 0,
          "BapAccountVersion": 0,
          "OrgId": "Org1MSP",
          "TokenId": "t1",
          "TokenName": "obptok",
          "TokenType": "fungible",
          "UserId": "idcqa"
      }
  },
  {
      "IsDelete": "false",
      "Timestamp": "2023-08-28T19:29:54Z",
      "TxId": "19bb296ae71709e91b097ba5d9ebd7f7522095880382fbf5913334a46a6026aa",
      "Value": {
          "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
          "AssetType": "oaccount",
          "Balance": 0,
          "BalanceOnHold": 0,
          "BapAccountVersion": 0,
          "OrgId": "Org1MSP",
          "TokenId": "",
          "TokenName": "",
          "TokenType": "fungible",
          "UserId": "idcqa"
      }
  }
]
GetAccountOnHoldBalance
Questo metodo restituisce il saldo in sospeso per un conto specificato.
Ctx.Account.getAccountOnHoldBalance(account_id: string)
Parametri:
  • account_id: string: l'ID del conto.
Restituisce:
  • In caso di operazione riuscita, un oggetto promessa con il saldo in sospeso corrente e un messaggio di operazione riuscita. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
   "holding_balance":0,
   "msg":"Total Holding Balance of Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id: Org1MSP, user_id: user1) is 0"
}
GetAllAccounts
Questo metodo restituisce un elenco di tutti i conti. Questo metodo utilizza query rich SQL di Berkeley DB e può essere richiamato solo quando si è connessi alla rete remota di Oracle Blockchain Platform.
Ctx.func (t *Controller) GetAllAccounts() (interface{}, error)
Parametri:
  • nessuno
Restituisce:
  • In caso di operazione riuscita, un array JSON in cui sono elencati tutti gli account.
Esempio di valore restituito:
"payload": [
    {
        "key": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
        "valueJson": {
            "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
            "AssetType": "oaccount",
            "Balance": 100,
            "BalanceOnHold": 0,
            "BapAccountVersion": 1,
            "OrgId": "appdev",
            "TokenId": "t1",
            "TokenName": "obptok",
            "TokenType": "fungible",
            "UserId": "idcqa"
        }
    }
]
GetUserByAccountId
Questo metodo restituisce i dettagli utente per un account specificato.
Ctx.Account.GetUserByAccountById(account_id string) (interface{}, error)
Parametri:
  • account_id: string: l'ID del conto.
Restituisce:
  • In caso di operazione riuscita, una promessa con un oggetto JSON che include tre proprietà:
    • user_id: il nome utente o l'ID di posta elettronica dell'utente.
    • org_id: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione di rete corrente.
    • token_id: l'ID del token.
  • In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
   "org_id":"Org1MSP",
   "token_id":"digiCurr101",
   "user_id":"user1"
}
GetAccountBalance
Questo metodo restituisce il saldo del conto per un conto specificato.
Ctx.GetAccountBalance(token_id string, org_id string, user_id string) (interface{}, error)
Parametri:
  • account_id: string: l'ID del conto.
Restituisce:
  • In caso di operazione riuscita, un'interfaccia con una stringa di messaggio e il saldo corrente. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "msg": "Current Balance of +p2uaMTsU9D74l9XpHQ2c55ic/2gbO4NZITC4Zq4P8E= is: 200",
    "user_balance": 200
}
GetAllOrgAccounts
Questo metodo restituisce un elenco di tutti i conti token appartenenti a un'organizzazione specificata.
Ctx.Account.GetAllOrgAccounts(org_id string) (interface{}, error)
Parametri:
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'organizzazione.
Restituisce:
  • In caso di operazione riuscita, un elenco di tutti gli account per l'organizzazione specificata.
Esempio di valore restituito:
[
    {
        "key": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
        "valueJson": {
            "AccountId": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
            "AssetType": "oaccount",
            "Balance": 0,
            "BalanceOnHold": 0,
            "BapAccountVersion": 0,
            "OrgId": "appdev",
            "TokenId": "token",
            "TokenName": "fiatmoneytok",
            "TokenType": "fungible",
            "UserId": "idcqa"
        }
    },
    {
        "key": "oaccount~9c650574af9025a6106c8d12a801b079eda9ae2e3399fc2fbd5bd683d738a850",
        "valueJson": {
            "AccountId": "oaccount~9c650574af9025a6106c8d12a801b079eda9ae2e3399fc2fbd5bd683d738a850",
            "AssetType": "oaccount",
            "Balance": 0,
            "BalanceOnHold": 0,
            "BapAccountVersion": 0,
            "OrgId": "appdev",
            "TokenId": "token",
            "TokenName": "fiatmoneytok",
            "TokenType": "fungible",
            "UserId": "example_minter"
        }
    }
]

Metodi per la gestione dei ruoli

AddRoleMember
Questo metodo aggiunge un ruolo a un utente e a un token specificati.
Ctx.Token.AddRoleMember(role string, account_id string, tokenAsset interface{}) (interface{}, error)
Parametri:
  • role: string: il nome del ruolo da aggiungere all'utente specificato. I comportamenti mintable e burnable corrispondono alle proprietà minter_role_name e burner_role_name del file di specifica. Analogamente, il ruolo notary corrisponde alla proprietà notary_role_name del file di specifica.
  • account_id: number: l'ID account a cui aggiungere il ruolo.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, restituisce una mappa con un messaggio di operazione riuscita che indica l'aggiunta del ruolo all'account. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
   "msg":"Successfully added role minter to oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1)"
}
RemoveRoleMember
Questo metodo rimuove un ruolo da un utente e un token specificati.
Ctx.Token.RemoveRoleMember(role string, account_id string, tokenAsset interface{}) (interface{}, error)
Parametri:
  • role: string: il nome del ruolo da rimuovere all'utente specificato. I comportamenti mintable e burnable corrispondono alle proprietà minter_role_name e burner_role_name del file di specifica. Analogamente, il ruolo notary corrisponde alla proprietà notary_role_name del file di specifica.
  • account_id: number: l'ID account da cui rimuovere il ruolo.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, viene restituita una mappa con un messaggio di operazione riuscita che indica la rimozione del ruolo dall'account. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
  "msg":"successfully removed member_id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1) from role minter"
}
GetAccountsByRole
Questo metodo restituisce un elenco di tutti gli account per un ruolo e un token specificati.
Ctx.Role.GetAccountsByRole(token_id string, user_role string) (interface{}, error)
Parametri:
  • token_id: string: l'ID del token.
  • role: string: il nome del ruolo da cercare.
Restituisce:
  • In caso di operazione riuscita, un array JSON di ID account. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{"accounts":["oaccount~obptok~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f"]}
GetUsersByRole
Questo metodo restituisce una lista di tutti gli utenti per un ruolo e un token specificati.
Ctx.Role.GetUsersByRole(token_id string, user_role string) (interface{}, error)
Parametri:
  • token_id: string: l'ID del token.
  • role: string: il nome del ruolo da cercare.
Restituisce:
  • In caso di operazione riuscita, un array JSON di oggetti utente. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "Users": [
        {
            "token_id":"digiCurr101",
            "user_id": "user1",
            "org_id": "Org1MSP"
        }
    ]
}
IsInRole
Questo metodo indica se un utente e un token hanno un ruolo specificato.
Ctx.Token.IsInRole(role string, account_id string, tokenAsset interface{}) (bool, error)
Parametri:
  • role: string: il nome del ruolo da controllare.
  • account_id: number: l'ID account da controllare.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, viene restituita una mappa con un messaggio di operazione riuscita che indica la rimozione del ruolo dall'account. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "result": false
}
RoleCheck
Questo metodo verifica se l'ID account fornito è membro di un ruolo qualsiasi.
Ctx.Token.RoleCheck(account_id string, tokenAsset interface{}) (bool, error)
Parametri:
  • account_id: string: l'ID account da controllare.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • Se l'account specificato dispone di un ruolo, viene visualizzato un messaggio di operazione riuscita e il valore booleano true. In caso contrario, il valore booleano false. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{ result: true }
GetOrgUsersByRole
Questo metodo restituisce informazioni su tutti gli utenti che hanno un ruolo specificato in un'organizzazione specificata.
Ctx.Role.GetOrgUsersByRole(token_id string, user_role string, org_id string) (interface{}, error)
Parametri:
  • token_id: string: l'ID del token.
  • role: string: il nome del ruolo da controllare.
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'organizzazione.
Restituisce:
  • In caso di operazione riuscita, un elenco di tutti gli utenti con il ruolo specificato nell'organizzazione specificata.
Esempio di valore restituito:
{
    "Users": [
        {
            "org_id": "Org1MSP",
            "token_id": "token",
            "user_id": "admin"
        },
        {
            "org_id": "Org1MSP",
            "token_id": "token",
            "user_id": "orgAdmin"
        }
    ]
}
GetOrgAccountsByRole
Questo metodo restituisce informazioni su tutti i conti con un ruolo specificato in un'organizzazione specificata.
Ctx.Role.GetOrgAccountsByRole(token_id string, user_role string, org_id string) (interface{}, error)
Parametri:
  • token_id: string: l'ID del token.
  • role: string: il nome del ruolo da controllare.
  • org_id: string: l'ID del provider di servizi di appartenenza (MSP) dell'organizzazione.
Restituisce:
  • In caso di operazione riuscita, un elenco di tutti gli account con il ruolo specificato nell'organizzazione specificata.
Esempio di valore restituito:
{
    "accounts": [
        "oaccount~abc74791148b761352b98df58035601b6f5480448ac2b4a3a7eb54bdbebf48eb",
         "oaccount~9c650574af9025a6106c8d12a801b079eda9ae2e3399fc2fbd5bd683d738a850"
    ]
}

Metodi per la gestione della cronologia delle transazioni

GetAccountTransactionHistory
Questo metodo restituisce un array dei dettagli della cronologia delle transazioni per un conto specificato.
Ctx.Account.GetAccountTransactionHistory(account_id string) (interface{}, error)
Parametri:
  • account_id: string: l'ID del conto.
Restituisce:
  • Il valore restituito è lo stesso del metodo "GetAccountTransactionHistory".
  • In caso di operazione riuscita, un array di oggetti transazione account JSON.
  • In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
[
  {
      "NumberOfSubTransactions": 2,
      "balance": 160,
      "onhold_balance": 0,
      "timestamp": "2023-09-06T06:51:48Z",
      "token_id": "t1",
      "transacted_amount": 20,
      "transaction_id": "otransaction~bd3e8d7d0bcdbed0469a2fccfe95f7ebbeb1987d8385bccf5c84bf80251e748c",
      "transaction_type": "BULKTRANSFER"
  },
  {
      "balance": 180,
      "onhold_balance": 0,
      "timestamp": "2023-09-06T06:47:14Z",
      "token_id": "t1",
      "transacted_account": "oaccount~692a7465c01e36b694cb8ae86e6c6584240aa1f865fde54f95f32429eadd4097",
      "transacted_amount": 10,
      "transaction_id": "otransaction~250996f1df6a36a1b647f522efcaaf48fd70452d711c247fc4cd475b8e752b08",
      "transaction_type": "DEBIT"
  },
  {
      "balance": 190,
      "onhold_balance": 0,
      "timestamp": "2023-09-06T06:47:08Z",
      "token_id": "t1",
      "transacted_account": "oaccount~bb5a0b57d895327c8a8cd1f267310cbf3ae542bc854fab8188b5083a969d72fb",
      "transacted_amount": 10,
      "transaction_id": "otransaction~664325a25ae6b19b23693c66f83811184e0a78fabb49122359a2dbf209f32976",
      "transaction_type": "DEBIT"
  },
  {
      "balance": 200,
      "onhold_balance": 0,
      "timestamp": "2023-09-06T06:46:46Z",
      "token_id": "t1",
      "transacted_account": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
      "transacted_amount": 100,
      "transaction_id": "otransaction~7f49564b1eb61d4c8be0ef61cd5e635b533ca533907944e4ec500f390237fd6b",
      "transaction_type": "MINT"
  },
  {
      "balance": 100,
      "onhold_balance": 0,
      "timestamp": "2023-08-28T19:31:15Z",
      "token_id": "t1",
      "transacted_account": "oaccount~2de8db6b91964f8c9009136831126d3cfa94e1d00c4285c1ea3e6d1f36479ed4",
      "transacted_amount": 100,
      "transaction_id": "otransaction~adde470a63860ec1013bd5c5987e8a506a48942a91b0f39fc8e561374042bd27",
      "transaction_type": "MINT"
  }
]
GetAccountTransactionHistoryWithFilters
Questo metodo restituisce un array dei dettagli della cronologia delle transazioni per una transazione specificata. Questo metodo può essere richiamato solo quando è connesso alla rete remota di Oracle Blockchain Platform.
t.Ctx.Account.GetAccountTransactionHistoryWithFilters (transaction_id: string, filters?: SubTransactionFilters)
Parametri:
  • Transaction_id: string: l'ID della transazione.
  • filters: string: parametro facoltativo. Se vuoto, vengono restituiti tutti i record. La proprietà PageSize determina il numero di record da restituire. Se PageSize è 0, la dimensione predefinita della pagina è 20. La proprietà Bookmark determina l'indice iniziale dei record da restituire. Per ulteriori informazioni, vedere la documentazione di Hyperledger Fabric. Le proprietà StartTime e EndTime devono essere specificate in formato RFC-3339.
Esempio:

ochain invoke GetAccountTransactionHistoryWithFilters 'token1' 'appbuilder12' 'user_minter' '{"PageSize":10,"Bookmark":"1","StartTime":"2022-01-25T17:41:42Z","EndTime":"2022-01-25T17:59:10Z"}'

[
    {
        "balance": 90,
        "onhold_balance": 0,
        "timestamp": "2022-04-20T19:43:36Z",
        "token_id": "tokenId",
        "transacted_account": "oaccount~7a4d67118e623a876b77c67e76b819269a8d4a509aece5d2263fb274a9beb3b8",
        "transacted_amount": 5,
        "transaction_id": "otransaction~dd9986d3686e52264935558e42026fbf8a9af48b06a3256a58b453f5ada4e636",
        "transaction_type": "DEBIT"
    },
    {
        "balance": 95,
        "onhold_balance": 0,
        "timestamp": "2022-04-20T19:43:22Z",
        "token_id": "tokenId",
        "transacted_account": "oaccount~0642308fc4c514c257ebf04326c63f990e2531bfd59d0b952056094da61e04ab",
        "transacted_amount": 5,
        "transaction_id": "otransaction~5e53424de3d691cf6b2a55ea3dc478c555d8784111c11847e594194d6c2e7755",
        "transaction_type": "DEBIT"
    },
    {
        "balance": 100,
        "onhold_balance": 0,
        "timestamp": "2022-04-20T19:42:54Z",
        "token_id": "tokenId",
        "transacted_account": "oaccount~b63935592a702d30bedb87ae97b9b1ba7d0f346716adc4f5a4192220bf410d4e",
        "transacted_amount": 100,
        "transaction_id": "otransaction~94c467825ce9f66cc69958d38b169022a69eebc66b75b7d6e0b0585af2c3c228",
        "transaction_type": "MINT"
    }
]
GetSubTransactionsById
Questo metodo restituisce un array dei dettagli della cronologia delle transazioni per una transazione specificata.
t.Ctx.Account.GetSubTransactionsById(transaction_id string)
Parametri:
  • transaction_id: string: l'ID della transazione.
Esempio:

ochain invoke GetSubTransactionsById 'otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b'

[
    {
        "balance": 80,
        "onhold_balance": 0,
        "timestamp": "2022-04-21T05:02:33Z",
        "token_id": "tokenId",
        "transacted_account": "oaccount~7a4d67118e623a876b77c67e76b819269a8d4a509aece5d2263fb274a9beb3b8",
        "transacted_amount": 5,
        "transaction_id": "otransaction~33de5d63058d5e9abc011bc850878dfb7ac3080495729aed345c45b2f21735fa~c81e728d9d4c2f636f067f89cc14862c",
        "transaction_type": "DEBIT"
    },
    {
        "balance": 85,
        "onhold_balance": 0,
        "timestamp": "2022-04-21T05:02:33Z",
        "token_id": "tokenId",
        "transacted_account": "oaccount~0642308fc4c514c257ebf04326c63f990e2531bfd59d0b952056094da61e04ab",
        "transacted_amount": 5,
        "transaction_id": "otransaction~33de5d63058d5e9abc011bc850878dfb7ac3080495729aed345c45b2f21735fa~c4ca4238a0b923820dcc509a6f75849b",
        "transaction_type": "DEBIT"
    }
]
GetSubTransactionsByIdWithFilters
Questo metodo restituisce un array dei dettagli della cronologia delle transazioni per una transazione specificata.
t.Ctx.Account.GetSubTransactionsByIdWithFilters(transaction_id string, filters ...SubTransactionFilters)
Parametri:
  • transaction_id: string: l'ID della transazione.
  • filters: string: parametro facoltativo. Se vuoto, vengono restituiti tutti i record. La proprietà PageSize determina il numero di record da restituire. Se PageSize è 0, la dimensione predefinita della pagina è 20. La proprietà Bookmark determina l'indice iniziale dei record da restituire. Per ulteriori informazioni, vedere la documentazione di Hyperledger Fabric. Le proprietà StartTime e EndTime devono essere specificate in formato RFC-3339.
Esempio:

ochain invoke GetSubTransactionsByIdWithFilters 'otransaction~21972b4d206bd52ea77924efb259c67217edb23b4386580d1bee696f6f864b9b' '{"PageSize":10,"Bookmark":"1"}'

[
    {
        "balance": 80,
        "onhold_balance": 0,
        "timestamp": "2022-04-21T05:02:33Z",
        "token_id": "tokenId",
        "transacted_account": "oaccount~7a4d67118e623a876b77c67e76b819269a8d4a509aece5d2263fb274a9beb3b8",
        "transacted_amount": 5,
        "transaction_id": "otransaction~33de5d63058d5e9abc011bc850878dfb7ac3080495729aed345c45b2f21735fa~c81e728d9d4c2f636f067f89cc14862c",
        "transaction_type": "DEBIT"
    },
    {
        "balance": 85,
        "onhold_balance": 0,
        "timestamp": "2022-04-21T05:02:33Z",
        "token_id": "tokenId",
        "transacted_account": "oaccount~0642308fc4c514c257ebf04326c63f990e2531bfd59d0b952056094da61e04ab",
        "transacted_amount": 5,
        "transaction_id": "otransaction~33de5d63058d5e9abc011bc850878dfb7ac3080495729aed345c45b2f21735fa~c4ca4238a0b923820dcc509a6f75849b",
        "transaction_type": "DEBIT"
    }
]
GetTransactionById
Questo metodo restituisce la cronologia di un asset Transaction.
t.Ctx.Transaction.GetTransactionById(transaction_id string)
Parametri:
  • transaction_id string: l'ID del cespite transazione.
Esempio di valore restituito:
{
    "history": [
        {
            "IsDelete": "false",
            "Timestamp": "2021-08-16 20:19:05.028 +0530 IST",
            "TxId": "67042154a6853011d111b13f73943f06d2a6ae3cfb9a84cb104482c359eb2220",
            "Value": {
                "Amount": 3,
                "AssetType": "otransaction",
                "FromAccountId": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
                "HoldingId": "ohold~digicur~digiCurr101~op2",
                "NumberOfSubTransactions": 0,
                "Timestamp": "2021-08-16T20:19:05+05:30",
                "ToAccountId": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
                "TokenId": "digiCurr101",
                "TransactionId": "otransaction~67042154a6853011d111b13f73943f06d2a6ae3cfb9a84cb104482c359eb2220",
                "TransactionType": "RELEASEHOLD"
            }
        }
    ],
    "transaction_id": "otransaction~67042154a6853011d111b13f73943f06d2a6ae3cfb9a84cb104482c359eb2220"
}
DeleteHistoricalTransactions
Questo metodo elimina le transazioni meno recenti dal database di stato.
func (t *Controller) DeleteHistoricalTransactions(timestamp string) (interface{}, error)
Parametri:
  • time_to_expiration: Date: indicatore orario che indica quando eliminare le transazioni. I cespiti transazione più vecchi dell'ora specificata verranno eliminati.
Esempio di valore restituito:
"payload": {
    "msg": "Successfuly deleted transaction older than date:2021-08-18T05:43:30Z",
    "transactions": [
        "otransaction~57d81f681aa215bb73d6c017d16be8b283d3fcb50051c85891a97d1d407fc342"
    ]
}

Metodi per la gestione del comportamento dei token - Funzionamento minimo

Mint
Questo metodo coniuga i token, che sono quindi di proprietà del chiamante del metodo. Il chiamante deve avere un account e il ruolo di minter. Il numero di token che possono essere coniati è limitato dalla proprietà max_mint_quantity del comportamento mintable nel file di specifica. Se la proprietà max_mint_quantity non viene specificata, è possibile creare un numero illimitato di token. La quantità deve essere compresa nei valori decimali specificati dal parametro decimal del comportamento divisible nel file di specifica. Questo metodo può essere chiamato solo dal AccountOwner dell'account con il ruolo di minter.
Ctx.Token.Mint(quantity float64, tokenAsset interface{}) (interface{}, error)
Parametri:
  • quantity: number: il numero di token da coniare.
  • tokenAsset: il riferimento all'asset token da coniare.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
  "msg":"Successfully minted 1000 tokens to Account Id: oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df (Org-Id: Org1MSP, User-Id: admin)"
}
GetTotalMintedTokens
Questo metodo restituisce il numero totale di token coniati.
Ctx.Token.GetTotalMintedTokens(tokenAsset interface{}) (map[string]interface{}, error)
Parametri:
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita e una mappa dei token con coni totali nel tipo di dati numerico. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{"msg":"total minted amount for token with id digiCurr101 is 0","quantity":0}
GetNetTokens
Questo metodo restituisce la quantità netta di token disponibili nel sistema per un token specificato. I token netti sono la quantità di token rimanenti dopo la masterizzazione dei token. In forma di equazione: token netti = token totali coniati - token totali bruciati. Se non vengono bruciati token, il numero di token netti è uguale al totale dei token coniati.
Ctx.Token.GetNetTokens(tokenAsset interface{}) (map[string]interface{}, error)
Parametri:
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita e una mappa della quantità netta di token nel tipo di dati numero. In caso di errore, viene visualizzato un messaggio di errore.
Esempio di valore restituito:
{"msg":"net minted amount for token with id digiCurr101 is 0","quantity":0}
GetMaxMintQuantity
Questo metodo restituisce la quantità minima massima per un token. Se il comportamento max_mint_quantity non viene specificato, il valore predefinito è 0, che consente la coniatura di un numero qualsiasi di token.
Ctx.Token.GetMaxMintQuantity(token_id string) (float64, error)
Parametri:
  • token_id: string: l'ID del token da controllare.
Restituisce:
  • In caso di operazione riuscita, la quantità minima massima del token nel tipo di dati numerico. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
20000

Metodi per la gestione del comportamento dei token - Funzionamento trasferibile

Transfer
Questo metodo trasferisce i token dal chiamante a un account specificato. Il chiamante del metodo deve avere un account. La quantità deve essere compresa nei valori decimali specificati dal parametro decimal del comportamento divisible nel file di specifica. Questo metodo può essere chiamato solo dal AccountOwner dell'account.
Ctx.Token.Transfer(to_account_id string, quantity float64, tokenAsset interface{}) (interface{}, error)
Parametri:
  • to_account_id: string: l'ID account per la ricezione dei token.
  • quantity: number: il numero totale di token da trasferire.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore. Il valore restituito è lo stesso del metodo "TransferTokens".
Esempio di valore restituito:
{     "msg":"Successfully transferred 50 tokens from account id: oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df (Org-Id: Org1MSP,  User-Id: admin) to account id: oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (Org-Id: Org1MSP, User-Id: user1)"
}
BulkTransfer
Questo metodo viene utilizzato per eseguire il trasferimento di massa dei token dall'account chiamante agli account specificati nell'oggetto flow. Il chiamante di questo metodo deve avere un account già creato.
Ctx.Token.BulkTransfer(flow []map[string]interface{}, tokenAsset interface{}) (interface{}, error)
Parametri:
  • flow: object[]: un array di oggetti JSON che specifica i dettagli e la quantità del ricevente. La quantità di trasferimento deve essere compresa nei valori decimali specificati dal parametro decimal del comportamento divisible nel file di specifica. Ad esempio:
    [{
    	"to_org_id": "Org1MSP",
    	"to_user_id": "user1",
    	"quantity": 10
    }, {
    	"to_org_id": "Org1MSP",
    	"to_user_id": "user2",
    	"quantity": 10
    }]
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita che include il numero di token trasferiti. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "from_account_id": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
    "msg": "Successfully transferred 2 tokens from Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (Org-Id: Org1MSP, User-Id: user1)",
    "sub_transactions": [
        {
            "amount": 1,
            "to_account_id": "oaccount~digicur~38848e87296d67c8a90918f78cf55f9c9baab2cdc8c928535471aaa1210c706e"
        },
        {
            "amount": 1,
            "to_account_id": "oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df"
        }
    ]
}

Metodi per la gestione del comportamento dei token - Funzionamento bloccabile

Hold
Questo metodo crea un blocco per conto del proprietario dei token con l'account to_account_id. È specificato un conto notarile, che è responsabile del completamento o del rilascio del blocco. Quando viene creato il blocco, il saldo del token specificato dal responsabile pagamento viene bloccato. Impossibile trasferire un saldo bloccato finché il blocco non viene completato o rilasciato. Il chiamante di questo metodo deve avere un account già creato.
Ctx.Token.Hold(operation_id string, to_account_id string, notary_account_id string, quantity float64, TimeToExpiration string, tokenAsset)) (interface{}, error)
Parametri:
  • operation_id: string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
  • to_account_id: string: l'ID dell'account per la ricezione dei token.
  • notary__account_id: string - L'ID del conto notarile.
  • quantity: number: il numero totale di token da mettere in attesa.
  • time_to_expiration: date: la durata fino alla scadenza del blocco. Specificare 0 per un blocco permanente. In caso contrario, utilizzare il formato RFC-3339. Ad esempio, 2021-06-02T12.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
 "msg": "account id: oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df (org_id : Org1MSP, user_id : user1) is successfully holding 10 tokens",
}
ExecuteHold
Questo metodo completa un blocco sui token, trasferendo al ricevente la quantità specificata di token precedentemente bloccati. Se il valore quantity è inferiore al valore di blocco effettivo, l'importo rimanente sarà nuovamente disponibile per il proprietario originale dei token. Questo metodo può essere richiamato solo dall'ID AccountOwner con il ruolo notary.
Ctx.Token.ExecuteHold(operation_id string, quantity float64, tokenAsset interface{}) (interface{}, error)
Parametri:
  • operation_id: string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
  • quantity: number: il numero totale di token da mettere in attesa.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{"msg":"Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1) has successfully executed '1' tokens(digiCurr101) from the hold with Operation Id 'op1'"}
ReleaseHold
Questo metodo rilascia un blocco sui token. Il trasferimento non è completato e tutti i token detenuti sono nuovamente disponibili per il proprietario originale. Questo metodo può essere richiamato dall'ID Account Owner con il ruolo notary entro il limite di tempo specificato oppure dal responsabile pagamento, dal beneficiario o dal notaio dopo il limite di tempo specificato.
Ctx.Token.ReleaseHold(operation_id string, tokenAsset interface{}) (interface{}, error)
Parametri:
  • operation_id: string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{"msg":"Successfully released '3' tokens from Operation Id 'op2' to Account Id oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f (org_id : Org1MSP, user_id : user1)"}
GetOnHoldIds
Questo metodo restituisce un elenco di tutti gli ID di blocco per un utente e un token specificati.
Ctx.Account.GetOnHoldIDs(account_id string) (map[string]interface{}, error)
Parametri:
  • token_id: l'ID del token.
  • org_id: l'ID del provider di servizi di appartenenza (MSP) dell'utente nell'organizzazione di rete corrente.
  • user_id: il nome utente o l'ID di posta elettronica dell'utente.
Restituisce:
  • In caso di operazione riuscita, un oggetto JSON con la lista di ID di blocco. Un ID di blocco è costituito dalla concatenazione del tipo di asset (ohold), del nome token, dell'ID token e dell'ID operazione.
Esempio di valore restituito:
{"holding_ids":["ohold~loyaltok123~t1~op1"],"msg":"Holding Ids are: [ohold~loyaltok123~t1~op1]"}
GetOnHoldDetailsWithOperationID
Questo metodo restituisce i dettagli della transazione in sospeso per un ID operazione e un token specificati.
Ctx.Hold.GetOnHoldDetailsWithOperationID(token_id string, operation_id string) (Hold, error)
Parametri:
  • token_id: string: l'ID del token.
  • operation_id: string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
Restituisce:
  • Il valore restituito è lo stesso del metodo "GetOnHoldDetailsWithOperationId".
  • In caso di operazione riuscita, un oggetto promessa che include i dettagli della transazione in sospeso per l'ID operazione e il token specificati. L'oggetto di blocco include le seguenti proprietà:
    • holding_id: l'ID della partecipazione della transazione.
    • operation_id: string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
    • from_account_id: l'ID account del proprietario corrente dei token bloccati.
    • to_account_id: l'ID account del destinatario.
    • notary_account_id - ID del conto del notaio.
    • token_id: string: l'ID del token salvato.
    • quantity: la quantità di token in sospeso per l'ID dell'azienda.
    • time_to_expiration: la durata fino alla scadenza del blocco.
  • In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "AssetType": "ohold",
    "HoldingId": "ohold~digicur~digiCurr101~op1",
    "OperationId": "op1",
    "TokenName": "digicur",
    "FromAccountId": "oaccount~digicur~b4f45440aa2a7942db64443d047027e9d714d62cba5c3d546d64f368642f622f",
    "ToAccountId": "oaccount~digicur~38848e87296d67c8a90918f78cf55f9c9baab2cdc8c928535471aaa1210c706e",
    "NotaryAccountId": "oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df",
    "TokenId": "digiCurr101",
    "Quantity": 2,
    "TimeToExpiration": "0"
}
GetOnHoldBalanceWithOperationID
Questo metodo restituisce il saldo bloccato per un ID operazione e un token specificati.
Ctx.Hold.GetOnHoldBalanceWithOperationID(token_id string, operation_id string) (map[string]interface{}, error)
Parametri:
  • token_id: string: l'ID del token.
  • operation_id: string: ID univoco che identifica l'operazione di blocco. In genere questo ID viene passato dall'applicazione client.
Restituisce:
  • In caso di operazione riuscita, il saldo bloccato dell'ID operazione e del token specificati. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
    "holding_balance": 10,
    "msg": "Current Holding Balance of OperationId opr_121 for token digiCurr101 is : 10"
}

Metodi per la gestione del comportamento dei token - Funzionamento attivabile

Burn
Questo metodo disattiva o brucia i token dal conto del chiamante della transazione. Il chiamante di questo metodo deve avere un account e il ruolo di masterizzatore. La quantità deve essere compresa nei valori decimali specificati dal parametro decimal del comportamento divisible nel file di specifica.
Ctx.Token.Burn(quantity float64 , tokenAsset interface{}) (interface{}, error)
Parametri:
  • quantity: number: il numero totale di token da masterizzare.
  • tokenAsset: l'argomento tokenAsset contiene il riferimento ai dati del token su cui eseguire l'operazione.
Restituisce:
  • In caso di operazione riuscita, un messaggio di operazione riuscita. In caso di errore, un oggetto di errore non nullo contenente un messaggio di errore.
Esempio di valore restituito:
{
 "msg":"Successfully burned 10 tokens from account id: oaccount~digicur~682bb71de419602af74e3f226345ae308445ca51010737900c1d85f0376152df (Org-Id: Org1MSP, User-Id: admin)"
}