ERC-1155 的脚手架 Go 代币项目
Blockchain App Builder 从您的令牌规范文件中获取输入,并生成一个功能齐全的支架链代码项目。
该项目自动生成令牌生命周期类和函数,包括 CRUD 和非 CRUD 方法。自动支持参数验证、编集/解编集和透明持久性功能。
有关基架项目和与令牌没有直接关系的方法的信息,请参见 Scaffolded Go Chaincode Project 。
型号
透明持久性功能(Transparent Persistence Capability,简称 ORM)捕获在 OchainModel
类中。以下模型显示了一个完全不可替代的标记。
package model
type ArtCollection struct {
AssetType string `json:"AssetType" final:"otoken"`
TokenId string `json:"TokenId" id:"true" mandatory:"true" validate:"regexp=^[A-Za-z0-9][A-Za-z0-9_-]*$,max=16"`
TokenName string `json:"TokenName" final:"artcollection"`
TokenDesc string `json:"TokenDesc" validate:"max=256"`
TokenStandard string `json:"TokenStandard" final:"erc1155+"`
TokenType string `json:"TokenType" final:"nonfungible" validate:"regexp=^nonfungible$"`
TokenUnit string `json:"TokenUnit" final:"whole" validate:"regexp=^whole$"`
Mintable map[string]interface{} `json:"Mintable" final:"{\"Max_mint_quantity\":20000}"`
Behaviors []string `json:"Behaviors" final:"[\"indivisible\",\"singleton\",\"mintable\",\"transferable\",\"burnable\",\"roles\"]"`
Roles map[string]interface{} `json:"Roles" final:"{\"minter_role_name\":\"minter\"}"`
Owner string `json:"Owner,omitempty" validate:"string"`
CreatedBy string `json:"CreatedBy,omitempty" validate:"string"`
TransferredBy string `json:"TransferredBy,omitempty" validate:"string"`
CreationDate string `json:"CreationDate,omitempty" validate:"string"`
TransferredDate string `json:"TransferredDate,omitempty" validate:"string"`
IsBurned bool `json:"IsBurned" validate:"bool"`
BurnedBy string `json:"BurnedBy,omitempty" validate:"string"`
BurnedDate string `json:"BurnedDate,omitempty" validate:"string"`
TokenUri string `json:"TokenUri" mandatory:"true" validate:"string,max=2000"`
TokenMetadata ArtCollectionMetadata `json:"TokenMetadata"`
Price int `json:"Price" validate:"int"`
On_sale_flag bool `json:"On_sale_flag" validate:"bool"`
}
type ArtCollectionMetadata struct {
Painting_name string `json:"Painting_name" validate:"string"`
Description string `json:"Description" validate:"string"`
Image string `json:"Image" validate:"string"`
Painter_name string `json:"Painter_name" validate:"string"`
}
type Loyalty struct {
AssetType string `json:"AssetType" final:"otoken"`
TokenId string `json:"TokenId" id:"true" mandatory:"true" validate:"regexp=^[A-Za-z0-9][A-Za-z0-9_-]*$,max=16"`
TokenName string `json:"TokenName" final:"loyalty"`
TokenDesc string `json:"TokenDesc" validate:"max=256"`
TokenStandard string `json:"TokenStandard" final:"erc1155+"`
TokenType string `json:"TokenType" final:"fungible" validate:"regexp=^fungible$"`
TokenUnit string `json:"TokenUnit" final:"fractional" validate:"regexp=^fractional$"`
Mintable map[string]interface{} `json:"Mintable" final:"{\"Max_mint_quantity\":10000}"`
Divisible map[string]interface{} `json:"Divisible" final:"{\"Decimal\":2}"`
Behaviors []string `json:"Behaviors" final:"[\"divisible\",\"mintable\",\"transferable\",\"burnable\",\"roles\"]"`
Roles map[string]interface{} `json:"Roles" final:"{\"minter_role_name\":\"minter\"}"`
Currency_name string `json:"Currency_name" validate:"string"`
Token_to_currency_ratio int `json:"Token_to_currency_ratio" validate:"int"`
Metadata interface{} `json:"Metadata,omitempty"`
}
以下模型显示了一个小数不可替代的标记。type RealEstateProperty struct {
AssetType string `json:"AssetType" final:"otoken"`
TokenId string `json:"TokenId" id:"true" mandatory:"true" validate:"regexp=^[A-Za-z0-9][A-Za-z0-9_-]*$,max=16"`
TokenName string `json:"TokenName" final:"realestateproperty"`
TokenDesc string `json:"TokenDesc" validate:"max=256"`
TokenStandard string `json:"TokenStandard" final:"erc1155+"`
TokenType string `json:"TokenType" final:"nonfungible" validate:"regexp=^nonfungible$"`
TokenUnit string `json:"TokenUnit" final:"fractional" validate:"regexp=^fractional$"`
Mintable map[string]interface{} `json:"Mintable" final:"{\"Max_mint_quantity\":0}"`
Behaviors []string `json:"Behaviors" final:"[\"divisible\",\"mintable\",\"transferable\",\"roles\"]"`
Divisible map[string]interface{} `json:"Divisible" final:"{\"Decimal\":0}"`
Roles map[string]interface{} `json:"Roles" final:"{\"minter_role_name\":\"minter\"}"`
CreatedBy string `json:"CreatedBy,omitempty" validate:"string"`
CreationDate string `json:"CreationDate,omitempty" validate:"string"`
IsBurned bool `json:"IsBurned" validate:"bool"`
TokenUri string `json:"TokenUri" mandatory:"true" validate:"string,max=2000"`
Quantity float64 `json:"Quantity,omitempty"`
TokenMetadata RealEstatePropertyMetadata `json:"TokenMetadata"`
PropertySellingPrice int `json:"PropertySellingPrice" validate:"int"`
PropertyRentingPrice int `json:"PropertyRentingPrice" validate:"int"`
}
type RealEstatePropertyMetadata struct {
PropertyType string `json:"PropertyType" validate:"string"`
PropertyName string `json:"PropertyName" validate:"string"`
PropertyAddress string `json:"PropertyAddress" validate:"string"`
PropertyImage string `json:"PropertyImage" validate:"string"`
}
控制器
只有一个主控制器。
type Controller struct {
Ctx trxcontext.TrxContext
}
可以创建任意数量的类、函数或文件,但只能调用在主控制器类中定义的那些方法。其他方法将被隐藏。
您可以使用令牌 SDK 方法为业务应用程序编写定制方法。
自动生成的标记方法
Blockchain App Builder 自动生成支持令牌和令牌生命周期的方法。您可以使用这些方法初始化令牌、管理角色和账户以及完成其他令牌生命周期任务,而无需进行任何其他编码。控制器方法必须是公共的才能调用。公共方法名称以大写字符开头。以小写字符开头的方法名称是专用的。
访问控制管理的方法
-
IsTokenAdmin
- 如果函数的调用方为
Token Admin
,则此方法返回布尔值true
,否则返回false
。此方法只能由链代码的Token Admin
调用。 -
AddTokenAdmin
- 此方法将用户添加为链代码的
Token Admin
。此方法只能由链代码的Token Admin
调用。 -
RemoveTokenAdmin
- 此方法将删除用户作为链代码的
Token Admin
。此方法只能由链代码的Token Admin
调用。您无法将自己作为Token Admin
删除。 -
GetAllTokenAdmins
- 此方法返回作为链代码
Token Admin
的所有用户的列表。此方法只能由链代码的Token Admin
调用。
标记配置管理的方法
-
Init
- 实例化链代码时将调用此方法。每个
Token Admin
都由adminList
参数中的userId
和orgId
信息标识。userId
是实例所有者或登录到实例的用户的用户名或电子邮件 ID。orgId
是当前网络组织中用户的成员服务提供者 (membership service provider,MSP) ID。首次部署链代码时,adminList
参数是必需的。如果要升级链代码,请传递空列表 ([]
)。如果您是最初部署链代码的用户,则还可以在升级链代码时在adminList
参数中指定新管理员。升级期间将忽略adminList
参数中的任何其他信息。 -
Create<Token Name>Token
- 此方法创建令牌。定义的每个标记都有自己的创建方法。对于可替换令牌,此方法只能由链代码的
Token Admin
调用。对于不可替代的标记,如果在规范文件中定义了 minter 角色,则具有 minter 角色的任何用户都可以调用此方法来创建 NFT。如果未定义 minter 角色,则任何用户都可以使用此方法创建 (mint) NFT。调用此方法的用户将成为 NFT 的所有者。 -
Update<Token Name>Token
- 此方法更新令牌。定义的每个令牌都有自己的更新方法。无法更新令牌元数据或不可替代令牌的令牌 URI。对于可替换令牌,此方法只能由链代码的
Token Admin
调用。对于不可替代的令牌,此方法只能由令牌所有者调用。 -
GetTokenHistory
- 此方法返回指定标记 ID 的历史记录。任何人都可以调用此方法。
-
GetAllTokens
- 此方法返回在状态数据库中保存的所有标记资产。此方法只能由链代码的
Token Admin
调用。此方法使用 Berkeley DB SQL 富查询,并且只能在连接到远程 Oracle Blockchain Platform 网络时调用。 -
GetTokenById
- 如果标记存在于状态数据库中,则此方法返回标记对象。对于小数 NFT,也会返回所有者列表。此方法只能由链代码的
Token Admin
或令牌所有者调用。 -
GetAllTokensByUser
- 此方法返回指定用户拥有的所有令牌资产。此方法使用 Berkeley DB SQL 富查询,并且只能在连接到远程 Oracle Blockchain Platform 网络时调用。此方法只能由链代码的
Token Admin
或帐户所有者调用。 -
OwnerOf
- 此方法返回指定令牌 ID 所有者的帐户 ID、组织 ID 和用户 ID。任何人都可以调用此方法。
-
URI
- 此方法返回指定令牌的 URI。任何人都可以调用此方法。
-
Name
- 此方法返回令牌类的名称。任何人都可以调用此方法。
-
TotalSupply
- 此方法返回铸造标记的总数。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。此方法只能由链代码的
Token Admin
调用。 -
TotalNetSupply
- 此方法返回铸造令牌的总数减去刻录令牌的数量。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。此方法只能由链代码的
Token Admin
调用。 -
GetTokensByName
- 此方法返回指定令牌名称的所有令牌资产。此方法使用 Berkeley DB SQL 富查询,并且只能在连接到远程 Oracle Blockchain Platform 网络时调用。此方法只能由链代码的
Token Admin
调用。 -
GetTokenDecimal
- 此方法返回指定标记的小数位数。此方法只能由链代码的
Token Admin
调用。
账户管理方法
-
CreateAccount
- 此方法为指定用户创建帐户,并为可替换或不可替换的令牌创建关联的令牌帐户。必须为在任何时刻具有令牌的任何用户创建帐户。用户帐户跟踪 NFT 帐户和用户具有的可替换令牌帐户。用户必须在网络中具有帐户才能完成与令牌相关的操作。此方法只能由链代码的
Token Admin
调用。用户帐户具有唯一 ID,该 ID 由
orgId
参数和userId
参数的 SHA-256 散列组成。用户可以具有多个具有唯一账户 ID 的可替换令牌账户。可替换令牌帐户 ID 由
orgId
参数的 SHA-256 散列、userId
参数、用波浪号 (~
) 分隔的常量字符串ft
和表示正在创建的用波浪号 (~
) 分隔的可替换帐户索引的计数器编号组成。一个用户只能有一个不可替代的令牌帐户。不可替换的令牌帐户 ID 是唯一的,由
orgId
参数的 SHA-256 散列、userId
参数以及用波浪号 (~
) 分隔的常量字符串nft
组成。用户拥有的所有不可替换令牌(无论是整体还是小数)都链接到此账户。用户帐户 ID 以
ouaccount~
开头。标记账户 ID 以oaccount~
开头。 -
CreateUserAccount
- 此方法为指定的用户创建帐户。必须为在任何时刻具有令牌的任何用户创建帐户。用户帐户跟踪 NFT 帐户和用户具有的可替换令牌帐户。用户必须在网络中具有帐户才能完成与令牌相关的操作。
帐户 ID 是
orgId
参数和userId
参数的 SHA-256 散列。此方法只能由链代码的Token Admin
调用。 -
CreateTokenAccount
- 此方法创建可替换或不可替换的令牌帐户以与用户帐户关联。
用户可以具有多个具有唯一账户 ID 的可替换令牌账户。可替换令牌帐户 ID 由
orgId
参数的 SHA-256 散列、userId
参数、用波浪号 (~
) 分隔的常量字符串ft
和表示正在创建的用波浪号 (~
) 分隔的可替换帐户索引的计数器编号组成。一个用户只能有一个不可替代的令牌帐户。不可替换的令牌帐户 ID 是唯一的,由
orgId
参数的 SHA-256 散列、userId
参数以及用波浪号 (~
) 分隔的常量字符串nft
组成。用户拥有的所有不可替换令牌(无论是整体还是小数)都链接到此账户。此方法只能由链代码的
Token Admin
调用。 -
AssociateFungibleTokenAccount
- 此方法将用户的可替换令牌帐户与特定可替换令牌关联。
此方法只能由链代码的
Token Admin
调用。 -
GetAccountHistory
- 此方法返回指定令牌帐户的历史记录。这是异步方法。此方法只能由链代码的
Token Admin
或帐户所有者调用。 -
GetAccount
- 此方法返回指定用户的令牌帐户详细信息。此方法只能由链代码的
Token Admin
或帐户的Account Owner
调用。 -
GetAllAccounts
- 此方法返回所有用户帐户的详细信息。此方法只能由链代码的
Token Admin
调用。 -
GetAccountDetailsByUser
- 此方法返回指定用户的帐户摘要以及与用户关联的可替换和不可替换令牌的详细信息。此方法只能由链代码的
Token Admin
或帐户的Account Owner
调用。 -
GetUserByAccountId
- 此方法返回指定帐户 ID 的用户详细信息。所有用户都可以调用此方法。
角色管理的方法
-
AddRole
- 此方法向指定用户和令牌添加角色。此方法只能由链代码的
Token Admin
调用。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。指定的用户必须具有与可替换令牌关联的令牌帐户,或者具有 NFT 角色的不可替换令牌帐户。指定的角色必须存在于令牌的规范文件中。 -
IsInRole
- 此方法返回布尔值以指示用户是否具有指定的角色。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。此方法只能由链代码的
Token Admin
或帐户的Account Owner
调用。指定的用户必须具有与可替换令牌关联的令牌帐户,或者具有 NFT 角色的不可替换令牌帐户。指定的角色必须存在于令牌的规范文件中。 -
RemoveRole
- 此方法将从指定用户和令牌中删除角色。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。此方法只能由链代码的
Token Admin
调用。指定的用户必须具有与可替换令牌关联的令牌帐户,或者具有 NFT 角色的不可替换令牌帐户。指定的角色必须存在于令牌的规范文件中。 -
GetAccountsByRole
- 此方法返回指定角色和令牌的所有帐户 ID 的列表。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。此方法只能由链代码的
Token Admin
调用。 -
GetUsersByRole
- 此方法返回指定角色和令牌的所有用户的列表。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。此方法只能由链代码的
Token Admin
调用。
事务处理历史记录管理方法
-
GetAccountTransactionHistory
- 此方法返回账户事务处理历史记录。此方法只能由链代码的
Token Admin
或帐户所有者调用。对于不可替代的令牌,只能在连接到远程 Oracle Blockchain Platform 网络时调用此方法。 -
GetTransactionById
- 此方法返回指定事务处理 ID 的事务处理详细信息。任何人都可以调用此方法。
-
DeleteHistoricalTransactions
- 此方法从状态数据库删除指定时间戳之前的事务处理。此方法只能由链代码的
Token Admin
调用。
标记行为管理的方法 - 可最小化行为
-
MintBatch
- 此方法在批处理操作中创建(铸造)多个标记。此方法仅创建可替换令牌或小数不可替换令牌。
对于可替换令牌,如果在规范文件中定义了 minter 角色,则具有 minter 角色的任何用户都可以调用此方法。如果没有,任何用户都可以使用此方法来创建标记。如果创建或更新令牌时指定了该属性,则 mint 不能超过令牌的
max_mint_quantity
属性。对于不可替代的标记,如果在规范文件中定义了 minter 角色,则具有 minter 角色的任何用户都可以调用此方法。如果没有,任何用户都可以使用此方法来创建标记。此外,调用方还必须是令牌的创建者。可以铸造的小数不可替代标记的数量没有上限。
无法使用此方法铸造整个不可替代的标记。
标记行为管理的方法 - 可传输行为
-
BatchTransferFrom
- 此方法完成一个批处理操作,该操作将令牌 ID 列表中指定的令牌从一个用户传输到另一个用户。
对于 NFT,由于方法转移 NFT 的所有权,因此 NFT 的发件人必须拥有令牌。
对于小数 NFT,如果用户(包括令牌的创建者)传输他们拥有的所有股份,那么他们就会失去对令牌的所有权。如果将令牌的任何共享资源传输给用户,该用户将自动成为小数 NFT 的所有者之一。
此方法不验证方法的调用方是否为指定的发送方。所有用户都可以调用此方法。
-
SafeBatchTransferFrom
- 此方法完成一个批处理操作,该操作将令牌 ID 列表中指定的令牌从一个用户传输到另一个用户。
对于 NFT,由于方法转移 NFT 的所有权,因此 NFT 的发件人必须拥有令牌。
对于小数 NFT,如果用户(包括令牌的创建者)传输他们拥有的所有股份,那么他们就会失去对令牌的所有权。如果将令牌的任何共享资源传输给用户,该用户将自动成为小数 NFT 的所有者之一。
方法的调用方必须是指定的发送方。所有用户都可以调用此方法。
-
BalanceOfBatch
- 此方法完成获取令牌帐户余额的批处理操作。帐户详细信息在组织 ID、用户 ID 和令牌 ID 的三个单独列表中指定。此方法只能由链代码的
Token Admin
或客户所有者调用。账户所有者只能查看他们拥有的账户的余额详细信息。 -
ExchangeToken
- 此方法在指定帐户之间交换令牌。此方法仅支持在 NFT 和可替换令牌或可替换令牌与 NFT 之间进行交换。此方法只能由帐户所有者调用。
标记行为管理的方法 - 可刻录行为
SDK 方法
访问控制管理的方法
-
CheckAuthorization
- 使用此方法可将访问控制检查添加到操作。这是一个异步函数。大多数自动生成的方法都包括访问控制。某些令牌方法只能由令牌的
ERC721Admin
或Account Owner
或具有多个帐户的用户通过MultipleAccountOwner
运行。CheckAuthorization
方法是erc721Auth
类的一部分,可通过Ctx
对象访问该类。访问控制映射在oChainUtil.go
文件中进行了介绍,如以下文本所示。可以通过编辑oChainUtil.go
文件来修改访问控制。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 var erc721ad ERC721AdminAccess var erc721t ERC721TokenAccess var erc721r ERC721RoleAccess var erc721a ERC721AccountAccess var erc721as ERC721AccountStatusAccess var erc721trx ERC721TransactionAccess var erc1155ad ERC1155AdminAccess var erc1155t ERC1155TokenAccess var erc1155a ERC1155AccountAccess var erc1155as ERC1155AccountStatusAccess var erc1155trx ERC1155TransactionAccess var erc1155role ERC1155RoleAccess 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"} erc721ad.AddAdmin = []string{"Admin"} erc721ad.GetAllAdmins = []string{"Admin"} erc721ad.IsTokenAdmin = []string{"Admin"} erc721ad.RemoveAdmin = []string{"Admin"} erc721trx.DeleteHistoricalTransactions = []string{"Admin"} erc721t.Save = []string{"Admin"} erc721t.GetAllTokens = []string{"Admin"} erc721t.Update = []string{"Admin"} erc721t.GetTokensByName = []string{"Admin"} erc721t.AddRoleMember = []string{"Admin"} erc721t.RemoveRoleMember = []string{"Admin"} erc721t.IsInRole = []string{"Admin", "AccountOwner"} erc721t.Get = []string{"Admin", "TokenOwner"} erc721t.GetAllTokensByUser = []string{"Admin", "AccountOwner"} erc721t.TotalSupply = []string{"Admin"} erc721t.TotalNetSupply = []string{"Admin"} erc721t.History = []string{"Admin"} erc721a.CreateAccount = []string{"Admin"} erc721a.CreateUserAccount = []string{"Admin"} erc721a.CreateTokenAccount = []string{"Admin"} erc721a.AssociateFungibleTokenToAccount = []string{"Admin", "AccountOwner"} erc721a.GetAllAccounts = []string{"Admin"} erc721a.History = []string{"Admin", "AccountOwner"} erc721a.GetAccountTransactionHistory = []string{"Admin", "AccountOwner"} erc721a.GetAccountTransactionHistoryWithFilters = []string{"Admin", "AccountOwner"} erc721a.GetAccountByUser = []string{"Admin", "MultipleAccountOwner"} erc721a.BalanceOf = []string{"Admin", "MultipleAccountOwner"} erc721as.Get = []string{"Admin", "AccountOwner"} erc721as.ActivateAccount = []string{"Admin"} erc721as.SuspendAccount = []string{"Admin"} erc721as.DeleteAccount = []string{"Admin"} erc721r.GetAccountsByRole = []string{"Admin"} erc721r.GetUsersByRole = []string{"Admin"} erc1155ad.AddAdmin = []string{"Admin"} erc1155ad.GetAllAdmins = []string{"Admin"} erc1155ad.IsUserTokenAdmin = []string{"Admin"} erc1155ad.RemoveAdmin = []string{"Admin"} erc1155t.AddRoleMember = []string{"Admin"} erc1155t.IsInRole = []string{"Admin"} erc1155t.GetAllTokens = []string{"Admin"} erc1155t.GetAllTokensByUser = []string{"Admin", "AccountOwner"} erc1155t.Get = []string{"Admin", "TokenOwner"} erc1155t.RemoveRoleMember = []string{"Admin"} erc1155t.TotalNetSupply = []string{"Admin"} erc1155t.TotalSupply = []string{"Admin"} erc1155t.GetTokenDecimal = []string{"Admin"} erc1155t.GetTokensByName = []string{"Admin"} erc1155t.GetTotalMintedTokens = []string{"Admin"} erc1155t.GetNetTokens = []string{"Admin"} erc1155t.Save = []string{"Admin"} erc1155t.Update = []string{"Admin"} erc1155trx.DeleteHistoricalTransactions = []string{"Admin"} erc1155role.GetAccountsByRole = []string{"Admin"} erc1155role.GetUsersByRole = []string{"Admin"} erc1155a.AssociateFungibleTokenToAccount = []string{"Admin", "AccountOwner"} erc1155a.BalanceOfBatch = []string{"Admin"} erc1155a.CreateAccount = []string{"Admin"} erc1155a.CreateTokenAccount = []string{"Admin"} erc1155a.CreateUserAccount = []string{"Admin"} erc1155a.GetAccountTransactionHistory = []string{"Admin", "AccountOwner"} erc1155a.GetAccountTransactionHistoryWithFilters = []string{"Admin", "AccountOwner"} erc1155a.GetAccountsByUser = []string{"Admin", "AccountOwner"} erc1155a.GetAccount = []string{"Admin", "AccountOwner"} erc1155a.History = []string{"Admin", "AccountOwner"} erc1155a.GetAllAccounts = []string{"Admin"} erc1155a.ExchangeToken = []string{"AccountOwner"} erc1155a.GetAccountDetailsByUser = []string{"Admin", "AccountOwner"} erc1155as.Get = []string{"Admin", "AccountOwner"} erc1155as.ActivateAccount = []string{"Admin"} erc1155as.SuspendAccount = []string{"Admin"} erc1155as.DeleteAccount = []string{"Admin"} var accessMap TokenAccessControl accessMap.Token = t accessMap.Account = a accessMap.AccountStatus = as accessMap.Hold = h accessMap.Role = r accessMap.Admin = ad accessMap.Auth = auth accessMap.TokenConversion = tc accessMap.ERC721ADMIN = erc721ad accessMap.ERC721TOKEN = erc721t accessMap.ERC721ACCOUNT = erc721a accessMap.ERC721AccountStatus = erc721as accessMap.ERC721ROLE = erc721r accessMap.ERC721TRANSACTION = erc721trx accessMap.ERC1155Account = erc1155a accessMap.ERC1155AccountStatus = erc1155as accessMap.ERC1155Admin = erc1155ad accessMap.ERC1155Token = erc1155t accessMap.ERC1155Transaction = erc1155trx accessMap.ERC1155Role = erc1155role
-
IsUserTokenAdmin
- 如果指定的用户为
Token Admin
,则此方法返回布尔值true
,否则返回false
。该方法只能由令牌链代码的Token Admin
调用。 -
AddAdmin
- 此方法将用户添加为令牌链代码的
Token Admin
。该方法只能由令牌链代码的Token Admin
调用。 -
RemoveAdmin
- 此方法将删除用户作为标记链代码的
Token Admin
。该方法只能由令牌链代码的Token Admin
调用。您无法将自己作为Token Admin
删除。 -
GetAllAdminUsers
- 此方法返回所有
Token Admin
用户的列表。
标记配置管理的方法
-
Save
- 此方法创建令牌。定义的每个标记都有自己的创建方法。对于不可替代的标记,如果在规范文件中定义了 minter 角色,则具有 minter 角色的任何用户都可以调用此方法来创建 NFT。否则,任何用户都可以使用此方法创建 (mint) NFT。调用此方法的用户将成为 NFT(整数或小数)的所有者。
-
Update
- 此方法更新令牌。无法更新令牌元数据或不可替代令牌的令牌 URI。
-
History (Token)
- 此方法返回指定标记 ID 的历史记录。
-
GetAllTokens
- 此方法返回在状态数据库中保存的所有标记资产。此方法只能由链代码的
Token Admin
调用。此方法使用 Berkeley DB SQL 富查询,并且只能在连接到远程 Oracle Blockchain Platform 网络时调用。 -
Get (Token)
- 如果标记存在于状态数据库中,则此方法返回标记对象。此方法只能由链代码的
Token Admin
或令牌所有者调用。对于小数 NFT,也会返回所有者列表。 -
GetAllTokensByUser
- 此方法返回指定用户拥有的所有令牌资产。此方法使用 Berkeley DB SQL 富查询,并且只能在连接到远程 Oracle Blockchain Platform 网络时调用。
-
OwnerOf
- 此方法返回指定令牌 ID 所有者的帐户 ID、组织 ID 和用户 ID。
-
TokenURI
- 此方法返回指定令牌的 URI。任何人都可以调用此方法。
-
Name
- 此方法返回令牌类的名称。任何人都可以调用此方法。
-
TotalSupply
- 此方法返回铸造标记的总数。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。
-
TotalNetSupply
- 此方法返回铸造令牌的总数减去刻录令牌的数量。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。
-
GetTokensByName
- 此方法返回指定令牌名称的所有令牌资产。此方法使用 Berkeley DB SQL 富查询,并且只能在连接到远程 Oracle Blockchain Platform 网络时调用。
-
GetDecimals
- 此方法返回指定标记的小数位数。如果没有为标记指定可整除行为,则返回零小数位的默认值。
账户管理方法
-
CreateAccount
- 此方法为指定用户创建帐户,并为可替换或不可替换的令牌创建关联的令牌帐户。必须为在任何时刻具有令牌的任何用户创建帐户。用户帐户跟踪 NFT 帐户和用户具有的可替换令牌帐户。用户必须在网络中具有帐户才能完成与令牌相关的操作。此方法只能由链代码的
Token Admin
调用。用户帐户具有唯一 ID,该 ID 由
orgId
参数和userId
参数的 SHA-256 散列组成。用户可以具有多个具有唯一账户 ID 的可替换令牌账户。可替换令牌帐户 ID 由
orgId
参数的 SHA-256 散列、userId
参数、用波浪号 (~
) 分隔的常量字符串ft
和表示正在创建的用波浪号 (~
) 分隔的可替换帐户索引的计数器编号组成。一个用户只能有一个不可替代的令牌帐户。不可替换的令牌帐户 ID 是唯一的,由
orgId
参数的 SHA-256 散列、userId
参数以及用波浪号 (~
) 分隔的常量字符串nft
组成。用户拥有的所有不可替代的令牌(无论是整数还是小数)都链接到此单个不可替代的令牌帐户。 -
CreateUserAccount
- 此方法为指定的用户创建帐户。必须为在任何时刻具有令牌的任何用户创建帐户。用户帐户跟踪 NFT 帐户和用户具有的可替换令牌帐户。用户必须在网络中具有帐户才能完成与令牌相关的操作。
帐户 ID 是
orgId
参数和userId
参数的 SHA-256 散列。此方法只能由链代码的Token Admin
调用。 -
CreateTokenAccount
- 此方法创建可替换或不可替换的令牌帐户以与用户帐户关联。
用户可以具有多个具有唯一账户 ID 的可替换令牌账户。可替换令牌帐户 ID 由
orgId
参数的 SHA-256 散列、userId
参数、用波浪号 (~
) 分隔的常量字符串ft
和表示正在创建的用波浪号 (~
) 分隔的可替换帐户索引的计数器编号组成。一个用户只能有一个不可替代的令牌帐户。不可替换的令牌帐户 ID 是唯一的,由
orgId
参数的 SHA-256 散列、userId
参数以及用波浪号 (~
) 分隔的常量字符串nft
组成。用户拥有的所有不可替代的令牌(无论是整数还是小数)都链接到此单个不可替代的令牌帐户。此方法只能由链代码的
Token Admin
调用。 -
AssociateTokenToToken
- 此方法将用户的可替换令牌帐户与特定可替换令牌关联。
-
GetAccountHistory
- 此方法返回指定令牌帐户的历史记录。
-
GetAccountWithStatus
- 此方法返回指定用户的令牌帐户详细信息,包括帐户状态。此方法只能由链代码的
Token Admin
或帐户的Account Owner
调用。 -
GetAccount
- 此方法返回指定用户的令牌帐户详细信息。此方法只能由链代码的
Token Admin
或帐户的Account Owner
调用。 -
GetAllAccounts
- 此方法返回所有用户帐户的详细信息。
-
GetAccountDetailsByUser
- 此方法返回指定用户的帐户摘要以及与用户关联的可替换和不可替换令牌的详细信息。
-
GetUserByAccountId
- 此方法返回指定帐户 ID 的用户详细信息。
角色管理的方法
-
AddRoleMember
- 此方法向指定用户和令牌添加角色。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。
-
IsInRole
- 此方法返回布尔值以指示用户是否具有指定的角色。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。
-
RemoveRoleMember
- 此方法将从指定用户和令牌中删除角色。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。
-
GetAccountsByRole
- 此方法返回指定角色和令牌的所有帐户 ID 的列表。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。
-
GetUsersByRole
- 此方法返回指定角色和令牌的所有用户的列表。可替换令牌由令牌 ID 指定。不可替代的令牌由令牌名称指定。
事务处理历史记录管理方法
-
GetAccountTransactionHistory
- 此方法返回账户事务处理历史记录。此方法只能由链代码的
Token Admin
或帐户所有者调用。对于不可替代的令牌,只能在连接到远程 Oracle Blockchain Platform 网络时调用此方法。 -
GetTransactionById
- 此方法返回指定事务处理 ID 的事务处理详细信息。
-
DeleteHistoricalTransactions
- 此方法从状态数据库删除指定时间戳之前的事务处理。
标记行为管理的方法 - 可最小化行为
-
MintBatch
- 此方法在批处理操作中创建(铸造)多个标记。此方法仅创建可替换令牌或小数不可替换令牌。
对于可替换令牌,如果在规范文件中定义了 minter 角色,则具有 minter 角色的任何用户都可以调用此方法。如果没有,任何用户都可以使用此方法来创建标记。如果创建或更新令牌时指定了该属性,则 mint 不能超过令牌的
max_mint_quantity
属性。对于不可替代的标记,如果在规范文件中定义了 minter 角色,则具有 minter 角色的任何用户都可以调用此方法。如果没有,任何用户都可以使用此方法来创建标记。此外,调用方还必须是令牌的创建者。可以铸造的小数不可替代标记的数量没有上限。
无法使用此方法铸造整个不可替代的标记。
标记行为管理的方法 - 可传输行为
-
BatchTransferFrom
- 此方法完成一个批处理操作,该操作将令牌 ID 列表中指定的令牌从一个用户传输到另一个用户。
对于 NFT,由于方法转移 NFT 的所有权,因此 NFT 的发件人必须拥有令牌。
对于小数 NFT,如果用户(包括令牌的创建者)传输他们拥有的所有股份,那么他们就会失去对令牌的所有权。如果将令牌的任何共享资源传输给用户,该用户将自动成为小数 NFT 的所有者之一。
此方法不验证方法的调用方是否为指定的发送方。
-
SafeBatchTransferFrom
- 此方法完成一个批处理操作,该操作将令牌 ID 列表中指定的令牌从一个用户传输到另一个用户。
对于 NFT,由于方法转移 NFT 的所有权,因此 NFT 的发件人必须拥有令牌。
对于小数 NFT,如果用户(包括令牌的创建者)传输他们拥有的所有股份,那么他们就会失去对令牌的所有权。如果将令牌的任何共享资源传输给用户,该用户将自动成为小数 NFT 的所有者之一。
方法的调用方必须是指定的发送方。
-
BalanceOfBatch
- 此方法完成获取令牌帐户余额的批处理操作。帐户详细信息在组织 ID、用户 ID 和令牌 ID 的三个单独列表中指定。此方法只能由链代码的
Token Admin
或客户所有者调用。账户所有者只能查看他们拥有的账户的余额详细信息。 -
ExchangeToken
- 此方法在指定帐户之间交换令牌。此方法仅支持在 NFT(全或小数)与可替换令牌或可替换令牌与 NFT(全或小数)之间进行交换。此方法只能由帐户所有者调用。
标记行为管理的方法 - 可刻录行为