ERC-1155 的脚手架 Go 令牌项目
Blockchain App Builder 从您的令牌规范文件中获取输入,并生成一个功能完备的链码项目。
该项目自动生成令牌生命周期类和函数,包括 CRUD 和非 CRUD 方法。自动支持参数验证、编集/解编集以及透明的持久性功能。
有关与令牌不直接相关的基架项目和方法的信息,请参见 Scaffolded Go Chaincode Project 。
型号
透明持久性功能(或简化的 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
- 此方法在批处理操作中创建 (mint) 多个标记。此方法仅创建可替换令牌或小数非可替换令牌。
对于可变令牌,如果 minter 角色在规范文件中定义,则具有 minter 角色的任何用户都可以调用此方法。如果没有,任何用户都可以使用此方法来创建标记。如果该属性是在创建或更新令牌时指定的,则不能超过令牌的
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 方法
访问控制管理的方法
-
IsUserTokenAdmin
- 如果指定用户为
Token Admin
,则此方法返回布尔值true
,否则返回false
。该方法只能由令牌链代码的Token Admin
调用。 -
AddAdmin
- 此方法将用户添加为令牌链代码的
Token Admin
。该方法只能由令牌链代码的Token Admin
调用。 -
RemoveAdmin
- 此方法将用户删除为令牌链代码的
Token Admin
。该方法只能由令牌链代码的Token Admin
调用。您无法将自己删除为Token Admin
。 -
GetAllAdminUsers
- 此方法返回所有
Token Admin
用户的列表。 -
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
标记配置管理的方法
-
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
- 此方法在批处理操作中创建 (mint) 多个标记。此方法仅创建可替换令牌或小数非可替换令牌。
对于可变令牌,如果 minter 角色在规范文件中定义,则具有 minter 角色的任何用户都可以调用此方法。如果没有,任何用户都可以使用此方法来创建标记。如果该属性是在创建或更新令牌时指定的,则不能超过令牌的
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(整体或小数)之间交换。此方法只能由账户所有者调用。
令牌行为管理的方法 - 可燃行为