ERC-721에 대한 비계 Go NFT 프로젝트

Blockchain App Builder는 NFT 사양 파일에서 입력을 가져와 완전한 기능을 갖춘 비계 체인 코드 프로젝트를 생성합니다.

프로젝트는 CRUD 및 비CRUD 메서드를 포함한 NFT 라이프사이클 클래스 및 함수를 자동으로 생성합니다. 인수 검증, 마셜링/마셜링 해제 및 투명한 지속성 기능은 모두 자동으로 지원됩니다.

비계 프로젝트 및 NFT와 직접 관련되지 않은 방법에 대한 자세한 내용은 비계 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"`
	Symbol        string `json:"Symbol" final:"ART"`
	TokenStandard string `json:"TokenStandard" final:"erc721+"`
	TokenType     string `json:"TokenType" final:"nonfungible" validate:"regexp=^nonfungible$"`
	TokenUnit     string `json:"TokenUnit" final:"whole" validate:"regexp=^whole$"`

	Behavior []string `json:"Behavior" final:"[\"indivisible\",\"singleton\",\"mintable\",\"transferable\",\"burnable\",\"roles\"]"`

	Roles map[string]interface{} `json:"Roles" final:"{\"minter_role_name\":\"minter\"}"`

	Mintable map[string]interface{} `json:"Mintable" final:"{\"Max_mint_quantity\":20000}"`

	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" 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 Controller struct {
    Ctx trxcontext.TrxContext
}

클래스, 함수 또는 파일을 원하는 만큼 만들 수 있지만 주 컨트롤러 클래스 내에 정의된 메소드만 호출할 수 있습니다. 다른 방법은 숨겨져 있습니다.

토큰 SDK 메소드를 사용하여 비즈니스 애플리케이션에 대한 사용자정의 메소드를 작성할 수 있습니다.

자동으로 생성된 NFT 메소드

Blockchain App Builder는 NFT 및 NFT 라이프 사이클을 지원하는 방법을 자동으로 생성합니다. 이러한 방법을 사용하여 추가 코딩 없이 NFT를 초기화하고 역할 및 계정을 관리하며 기타 NFT 수명 주기 작업을 완료할 수 있습니다.

Blockchain App Builder는 NFT 및 NFT 라이프 사이클을 지원하는 방법을 자동으로 생성합니다. 이러한 방법을 사용하여 추가 코딩 없이 NFT를 초기화하고 역할 및 계정을 관리하며 기타 NFT 수명 주기 작업을 완료할 수 있습니다. 컨트롤러 메소드를 호출하려면 공용이어야 합니다. 공용 메소드 이름은 대문자로 시작합니다. 소문자로 시작하는 메소드 이름은 전용입니다.

액세스 제어 관리 방법

AddTokenAdmin
이 메소드는 사용자를 체인 코드의 Token Admin로 추가합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) AddTokenAdmin(orgId string, userId string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ADMIN.AddAdmin", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Admin.AddAdmin(orgId, userId)
}
매개변수:
  • orgId string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 체인 코드의 Token Admin로 추가된 사용자의 세부정보를 포함하는 메시지입니다.
반환 값 예제:
{"msg":"Successfully added Admin (OrgId: Org1MSP, UserId: user1)"}
RemoveTokenAdmin
이 메소드는 사용자를 체인 코드의 Token Admin로 제거합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다. 이 방법을 사용하여 자신을 Token Admin로 제거할 수 없습니다.
func (t *Controller) RemoveTokenAdmin(orgId string, userId string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ADMIN.RemoveAdmin", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Admin.RemoveAdmin(orgId, userId)
}
매개변수:
  • orgId string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 체인 코드의 Token Admin로 제거된 사용자의 세부정보를 포함하는 메시지입니다.
반환 값 예제:
{"msg":"Successfully removed Admin (OrgId Org1MSP UserId user1)"}
IsTokenAdmin
이 메소드는 함수 호출자가 Token Admin인 경우 부울 값 true를 반환하고, 그렇지 않은 경우 false를 반환합니다. Token Admin는 블록체인 네트워크의 다른 사용자에 대해 이 기능을 호출할 수 있습니다. 다른 사용자는 자신의 계정에서만 이 메소드를 호출할 수 있습니다.
func (t *Controller) IsTokenAdmin(orgId string, userId string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ADMIN.IsTokenAdmin", "TOKEN", map[string]string{"orgId": orgId, "userId": userId})
      if err != nil || !auth {
            return false, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Auth.IsUserTokenAdmin(orgId, userId)
}
매개변수:
  • orgId string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 호출자가 Token Admin인 경우 이 메소드는 true를 반환하고, 그렇지 않은 경우 false를 반환합니다.
반환 값 예제:
{"result":true}
GetAllTokenAdmins
이 메소드는 체인 코드의 Token Admin인 모든 사용자 목록을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) GetAllTokenAdmins() (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ADMIN.GetAllAdmins", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Admin.GetAllAdminUsers()
}
매개변수:
  • 없음
반환값:
  • 성공 시 OrgIdUserId 객체를 포함하는 JSON 관리자 목록입니다.
반환 값 예제:
{
    "admins": [
        {
            "OrgId":"Org1MSP",
            "UserId":"admin"
        }
    ]
}

토큰 구성 관리 방법

Init
이 메소드는 체인 코드를 인스턴스화할 때 호출됩니다. 모든 Token AdminadminList 매개변수의 UserIdOrgId 정보로 식별됩니다. UserId는 인스턴스 소유자 또는 인스턴스에 로그인한 사용자의 사용자 이름 또는 전자메일 ID입니다. OrgId는 현재 네트워크 조직에 있는 사용자의 MSP(멤버쉽 서비스 제공자) ID입니다. adminList 매개변수는 체인코드를 처음 배포할 때 필수입니다. 체인코드를 업그레이드하는 경우 빈 목록([])을 전달합니다. adminList 매개변수의 다른 정보는 업그레이드 중 무시됩니다.
func (t *Controller) Init(adminList []erc721Admin.ERC721TokenAdminAsset) (interface{}, error) {
      list, err := t.Ctx.ERC721Admin.InitAdmin(adminList)
      if err != nil {
            return nil, fmt.Errorf("initialising admin list failed %s", err.Error())
      }
      <Token Name> := <Token Class>{}
      _, err = t.Ctx.ERC721Token.SaveClassInfo(&<Token Name>)
      if err != nil {
            return nil, err
      }
      _, err = t.Ctx.ERC721Token.SaveDeleteTransactionInfo()
      if err != nil {
            fmt.Println("error: ", err)
      }
      return list, nil
}
매개변수:
  • adminList array - 토큰 관리자 목록을 지정하는 {OrgId, UserId} 정보의 배열입니다. adminList 배열은 필수 매개변수입니다.
GetAllTokens
이 메소드는 상태 데이터베이스에 저장된 모든 토큰 자산을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다. 이 방법은 Berkeley DB SQL 서식 있는 쿼리를 사용하며 원격 Oracle Blockchain Platform 네트워크에 연결된 경우에만 호출할 수 있습니다.
func (t *Controller) GetAllTokens() (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetAllTokens", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Token.GetAllTokens()
}
매개변수:
  • 없음
반환값:
  • JSON 형식의 모든 토큰 자산 목록입니다.
반환 값 예제:
[
    {
        "key": "monalisa",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:01:42Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 0,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "token Description",
            "TokenId": "monalisa",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
    },
    {
        "key": "monalisa2",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:04:44Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 100,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "",
            "TokenId": "monalisa1",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
        }
    }
]
GetAllTokensByUser
이 메소드는 지정된 사용자가 소유한 모든 토큰 자산을 반환합니다. 이 방법은 Berkeley DB SQL 서식 있는 쿼리를 사용하며 원격 Oracle Blockchain Platform 네트워크에 연결된 경우에만 호출할 수 있습니다. 이 메소드는 체인 코드의 Token Admin 또는 계정 소유자에 의해서만 호출될 수 있습니다.
func (t *Controller) GetAllTokensByUser(orgId string, userId string) (interface{}, error) {
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetAllTokensByUser", "TOKEN", map[string]string{"accountId": accountId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
    return t.Ctx.ERC721Token.GetAllTokensByUser(accountId)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • JSON 형식의 토큰 자산 목록입니다.
반환 값 예제:
[
    {
        "key": "monalisa",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:01:42Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 0,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "token Description",
            "TokenId": "monalisa",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
    },
    {
        "key": "monalisa2",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:04:44Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 100,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "",
            "TokenId": "monalisa1",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
        }
    }
]
GetTokenById
이 메소드는 토큰이 상태 데이터베이스에 있는 경우 토큰 객체를 반환합니다. 이 메소드는 체인 코드 또는 토큰 소유자의 Token Admin에 의해서만 호출될 수 있습니다.
func (t *Controller) GetTokenById(tokenId string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.Get", "TOKEN", map[string]string{"tokenId": tokenId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      tokenAsset, err := t.getTokenObject(tokenId)
      if err != nil {
            return nil, err
      }
      return tokenAsset.Interface(), nil
}
매개변수:
  • tokenId: string - 가져올 토큰의 ID입니다.
반환값:
  • JSON 형식의 토큰 자산입니다.
반환 값 예제:
{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "CreationDate": "2022-04-06T00:35:42Z",
    "Mintable": {
        "Max_mint_quantity": 20000
    },
    "NftBasePrice": 200,
    "Owner": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter"
    },
    "Symbol": "PNT",
    "TokenDesc": "Token Description",
    "TokenId": "monalisa",
    "TokenMetadata": {
        "Description": "Mona Lisa Painting",
        "Image": "monalisa.jpeg",
        "PainterName": "Leonardo_da_Vinci",
        "PaintingName": "Mona_Lisa"
    },
    "TokenName": "paintingnft",
    "TokenStandard": "erc721+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
    "TransferredBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "TransferredDate": "2022-04-06T00:51:56Z"
}
GetTokenHistory
이 메소드는 지정된 토큰 ID에 대한 내역을 반환합니다. 이 메소드는 원격 Oracle Blockchain Platform 네트워크에 접속된 경우에만 호출할 수 있습니다. 누구나 이 메소드를 호출할 수 있습니다.
func (t *Controller) GetTokenHistory(tokenId string) (interface{}, error) {
      /*
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetTokenHistory", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      */
      return t.Ctx.ERC721Token.History(tokenId)
}
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환 값 예제:
[
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T19:22:52z",
        "TxId": "6b7989be322956164a8d1cd7bf2a7187d59eba73ce756e6bf946ab48b349bbc0",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "CreationDate": "2022-04-06T19:22:23z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 100,
            "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "token Description",
            "TokenId": "monalisa",
            "TokenMetadata": {
               "Description": "Mona Lisa Painting",
               "Image": "monalisa.jpeg",
               "PainterName": "Leonardo_da_Vinci",
               "PaintingName": "Mona_Lisa"
            },
           "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg""
        }
    },
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T19:22:23z",
        "TxId": "e61bcb3cb61c8920f7e6d8f0d19726c7c88d876e0ad6cfb052cfb92d49985c3f",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "CreationDate": "2022-04-06T19:22:23z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 100,
            "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "",
            ""TokenId": "monalisa",
            "TokenMetadata": {
                "Description": "Mona Lisa Painting",
                "Image": "monalisa.jpeg",
                "PainterName": "Leonardo_da_Vinci",
                "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"
        }
    }
]
getTokenObject
지정된 토큰 ID에 대한 토큰 인스턴스를 반환하는 유틸리티 메소드입니다. 이 메소드는 토큰 객체를 인출하기 위해 자동으로 생성된 많은 메소드에서 사용됩니다. 사용자정의 메소드에서 필요에 따라 이 메소드를 호출할 수 있습니다. 토큰화된 자산 또는 클래스를 생성할 때 올바른 토큰 객체를 반환하도록 스위치 케이스를 해당하는 Token 클래스로 업데이트하십시오. Blockchain App Builder의 ochain sync 명령은 토큰화된 자산이 사양 파일에 생성될 때 스위치 케이스를 자동으로 생성합니다. 이 메소드는 전용(private)이므로 직접 호출할 수 없으며 다른 메소드에서만 호출할 수 있습니다.
func (t *Controller) getTokenObject(tokenId string) (reflect.Value, error) {
      if tokenId == "" {
            return reflect.Value{}, fmt.Errorf("error in retrieving token, token_id cannot be empty")
      }
      tokenAsset, err := t.Ctx.ERC721Token.Get(tokenId)
      if err != nil {
            return reflect.Value{}, fmt.Errorf("no token exists with id %s %s", tokenId, err.Error())
      }
      tokenName := tokenAsset.(map[string]interface{})["TokenName"].(string)
      switch tokenName {
      case "<Token Name>":
            var asset <Token Class>
            _, err := t.Ctx.ERC721Token.Get(tokenId, &asset)
            if err != nil {
                  return reflect.Value{}, err
            }
            return reflect.ValueOf(&asset), nil
      default:
            return reflect.Value{}, fmt.Errorf("no token exists with token name %s", tokenName)
      }
}
매개변수:
  • tokenId: string - 토큰의 ID입니다.
OwnerOf
이 메소드는 지정된 토큰 ID의 소유자의 계정 ID를 반환합니다. 누구나 이 메소드를 호출할 수 있습니다.
func (t *Controller) Ownerof(tokenId string) (interface{}, error) {
      return t.Ctx.ERC721Token.OwnerOf(tokenId)
}
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환값:
  • 소유자 계정 ID의 JSON 객체입니다.
반환 값 예제:
{"Owner": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba"}
Name
이 메소드는 토큰 클래스의 이름을 반환합니다. 누구나 이 메소드를 호출할 수 있습니다.
func (t *Controller) Name() (interface{}, error) {
      return t.Ctx.ERC721Token.Name()
}
매개변수:
  • 없음
반환값:
  • 토큰 이름의 JSON 객체입니다.
반환 값 예제:
{"TokenName": "paintingnft"}
Symbol
이 메소드는 토큰 클래스의 기호를 반환합니다. 누구나 이 메소드를 호출할 수 있습니다.
func (t *Controller) Symbol() (interface{}, error) {
      return t.Ctx.ERC721Token.Symbol()
}
매개변수:
  • 없음
반환값:
  • 토큰 기호의 JSON 객체입니다.
반환 값 예제:
{"Symbol": "PNT"}
TokenURI
이 메소드는 지정된 토큰의 URI를 반환합니다. 누구나 이 메소드를 호출할 수 있습니다.
func (t *Controller) TokenURI(tokenId string) (interface{}, error) {
      return t.Ctx.ERC721Token.TokenURI(tokenId)
}
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환값:
  • 성공 시 토큰 URI의 JSON 객체입니다.
반환 값 예제:
{"TokenURI": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"}
TotalSupply
이 메소드는 총 연동된 토큰 수를 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) TotalSupply() (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.TotalSupply", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Token.TotalSupply()
}
매개변수:
  • 없음
반환값:
  • 성공 시 토큰 수의 JSON 객체입니다.
반환 값 예제:
{"TotalSupply": 3}
TotalNetSupply
이 메소드는 총 연동 토큰 수에서 연소된 토큰 수를 뺀 값을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) TotalNetSupply() (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.TotalNetSupply", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Token.GetTotalMintedTokens()
}
매개변수:
  • 없음
반환값:
  • 성공 시 토큰 수의 JSON 객체입니다.
반환 값 예제:
{"TotalNetSupply": 2}

계정 관리 방법

CreateAccount
이 메소드는 지정된 사용자 및 토큰에 대한 계정을 생성합니다. 언제든지 토큰을 보유할 모든 사용자에 대해 계정을 만들어야 합니다. 계정은 사용자가 보유한 NFT 수를 추적합니다. 토큰 관련 작업을 완료하려면 네트워크에 계정이 있어야 합니다. 사용자당 하나의 NFT 계정만 생성할 수 있습니다.

계정 ID는 영숫자 문자 집합으로, 앞에 oaccount~이 붙고 그 뒤에 현재 네트워크 조직에 있는 사용자의 멤버쉽 서비스 제공자 ID(OrgId)에 대한 SHA-256 해시, 인스턴스 소유자 또는 인스턴스에 로그인한 사용자의 사용자 이름 또는 전자 메일 ID(UserId) 및 상수 문자열 nft가 붙습니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.

func (t *Controller) CreateAccount(orgId string, userId string, tokenType string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.CreateAccount", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Account.CreateAccount(orgId, userId, tokenType)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • tokenType: string - 지원되는 토큰 유형은 nonfungible뿐입니다.
반환값:
  • 성공 시 생성된 계정의 JSON 객체입니다.
반환 값 예제:
{
    "AssetType": "oaccount",
    "BapAccountVersion" : 0,
    "AccountId": "oaccount~a0a60d54ba9e2ff349737d292ea10ebd9cc8f1991c11443c19d20aea299a9507",
    "UserId": "admin",
    "OrgId": "Org1MSP",
    "TokenType": "nonfungible",
    "NoOfNfts": 0
}
BalanceOf
이 메소드는 지정된 사용자가 보유한 총 NFT 수를 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정 소유자에 의해서만 호출될 수 있습니다.
func (t *Controller) BalanceOf(orgId string, userId string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.BalanceOf", "TOKEN", map[string]string{"orgId": orgId, "userId": userId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil{
            return nil,err
      }
      return t.Ctx.ERC721Account.BalanceOf(accountId)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 현재 NFT 수의 JSON 객체입니다.
반환 값 예제:
{"totalNfts": 0}
GetAllAccounts
이 메소드는 모든 계정 목록을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다. 이 방법은 Berkeley DB SQL 서식 있는 쿼리를 사용하며 원격 Oracle Blockchain Platform 네트워크에 연결된 경우에만 호출할 수 있습니다.
func (t *Controller) GetAllAccounts() (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.GetAllAccounts", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Account.GetAllAccounts()
}
매개변수:
  • 없음
반환값:
  • 성공 시 모든 계정의 JSON 배열입니다.
반환 값 예제:
[
    {
        "key": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
        "valueJson": {
            "AccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "AssetType": "oaccount",
            "BapAccountVersion" : 0,
            "NoOfNfts": 5,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user1"
        }
    },
    {
        "key": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
        "valueJson": {
            "AccountId": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
            "AssetType": "oaccount",
            "BapAccountVersion" : 0,
            "NoOfNfts": 0,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user_minter"
        }
    },
    {
        "key": "oaccount~5541fb520058d83664b844e7a55fe98d574ddeda765d0e795d4779e9ccc271ce",
        "valueJson": {
            "AccountId": "oaccount~5541fb520058d83664b844e7a55fe98d574ddeda765d0e795d4779e9ccc271ce",
            "AssetType": "oaccount",
            "BapAccountVersion" : 0,
            "NoOfNfts": 0,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user_burner"
        }
    }
]
GetAccountByUser
이 메소드는 지정된 사용자에 대한 계정 세부 정보를 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정의 Account Owner로만 호출할 수 있습니다.
func (t *Controller) GetAccountByUser(orgId string, userId string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.GetAccountByUser", "TOKEN", map[string]string{"orgId": orgId, "userId": userId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Account.GetAccountWithStatusByUser(orgId, userId)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 다음 속성을 포함하는 JSON 계정 객체:
  • AccountId - 사용자 계정의 ID입니다.
  • UserId - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • OrgId - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • TokenType - 계정이 보유하는 토큰의 유형입니다.
  • NoOfNfts - 계정이 보유한 총 NFT 수입니다.
  • BapAccountVersion - 내부용 계정 객체 매개변수입니다.
  • Status - 사용자 계정의 현재 상태입니다.
반환 값 예제:
{
  "AccountId": "oaccount~cc301bee057f14236a97d434909ec1084970921b008f6baab09c2a0f5f419a9a",
  "AssetType": "oaccount",
  "BapAccountVersion": 0,
  "NoOfNfts": 0,
  "OrgId": "appdev",
  "Status": "active",
  "TokenType": "nonfungible",
  "UserId": "idcqa"
}
GetUserByAccountId
이 메소드는 지정된 계정의 사용자 세부 정보를 반환합니다. 이 방법은 모든 사용자가 호출할 수 있습니다.
func (t *Controller) GetUserByAccountId(accountId string) (interface{}, error) {
      return t.Ctx.ERC721Account.GetUserByAccountById(accountId)
}
매개변수:
  • accountId: string - 계정의 ID입니다.
반환값:
  • 성공 시 사용자 세부정보의 JSON 객체(OrgIdUserId)입니다.
반환 값 예제:
{
    "OrgId": "Org1MSP",
    "UserId": "admin"
}
GetAccountHistory
이 메소드는 지정된 사용자에 대한 계정 기록을 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정 소유자에 의해서만 호출될 수 있습니다.
func (t *Controller) GetAccountHistory(orgId string, userId string) (interface{}, error) {
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.History", "TOKEN", map[string]string{"accountId": accountId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Account.History(accountId)
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 객체 목록입니다.
반환 값 예제:
[
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T08:16:53Z",
        "TxId": "750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7",
        "Value": {
            "AccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "AssetType": "oaccount",
            "BapAccountVersion" : 1,
            "NoOfNfts": 1,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user1"
        }
    },
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T08:15:19Z",
        "TxId": "49eb84c42d452e5ba0028d8ebb4190454cf9013a11c0bad3e96594af452d4982",
        "Value": {
            "AccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "AssetType": "oaccount",
            "BapAccountVersion" : 0,
            "NoOfNfts": 0,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user1"
        }
    }
]

역할 관리 방법

AddRole
이 메소드는 지정된 사용자에게 역할을 추가합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) AddRole(role string, orgId string, userId string) (interface{}, error) {
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.AddRoleMember", "TOKEN", map[string]string{"accountId": accountId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Token.AddRoleMember(role, accountId)
}
매개변수:
  • userRole: string - 지정된 사용자에 추가할 역할의 이름입니다. mintableburnable 동작은 사양 파일의 minter_role_nameburner_role_name 속성에 해당합니다.
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 사용자 세부정보가 포함된 메시지입니다.
반환 값 예제:
{"msg": "Successfully added role minter to oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (orgId : Org1MSP, userId : admin)"}
RemoveRole
이 메소드는 지정된 유저로부터 롤을 제거합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) RemoveRole(userRole string, orgId string, userId string) (interface{}, error) {
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.RemoveRoleMember", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Token.RemoveRoleMember(userRole, accountId)
}
매개변수:
  • userRole: string - 지정된 사용자로부터 제거할 롤의 이름입니다. mintableburnable 동작은 사양 파일의 minter_role_nameburner_role_name 속성에 해당합니다.
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 사용자 세부정보가 포함된 메시지입니다.
반환 값 예제:
{"msg": "successfully removed memberId oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (orgId : Org1MSP, userId : admin) from role minter"}
GetAccountsByRole
이 메소드는 지정된 롤에 대한 모든 계정 ID 목록을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) GetAccountsByRole(userRole string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ROLE.GetAccountsByRole", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Role.GetAccountsByRole(userRole)
}
매개변수:
  • userRole: string - 검색할 롤의 이름입니다.
반환값:
  • 성공 시 JSON 계정 ID 배열입니다.
반환 값 예제:
{
    "accounts": [
        "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d"
    ]
}
GetUsersByRole
이 메소드는 지정된 롤에 대한 모든 사용자 목록을 반환합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) GetUsersByRole(userRole string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ROLE.GetUsersByRole", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Role.GetUsersByRole(userRole)
}
매개변수:
  • userRole: string - 검색할 롤의 이름입니다.
반환값:
  • 성공 시 사용자 객체의 JSON 배열(orgIduserId)입니다.
반환 값 예제:
{
    "Users": [
        {
            "OrgId": "Org1MSP",
            "UserId": "admin"
        }
    ]
}
IsInRole
이 메소드는 사용자에게 지정된 롤이 있는지 여부를 나타내는 부울 값을 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정의 Account Owner로만 호출할 수 있습니다.
func (t *Controller) IsInRole(orgId string, userId string, role string) (interface{}, error) {
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.IsInRole", "TOKEN", map[string]string{"accountId": accountId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      result, err := t.Ctx.ERC721Token.IsInRole(role, accountId)
      if err != nil {
            return nil, fmt.Errorf("error in IsInRole %s", err.Error())
      }
      response := make(map[string]interface{})
      response["result"] = result
      return response, nil
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • userRole: string - 검색할 롤의 이름입니다.
반환값:
  • 성공 시 부울 결과의 JSON 문자열입니다.
반환 값 예제:
{"result":"true"}

트랜잭션 내역 관리 방법

GetAccountTransactionHistory
이 메소드는 지정된 사용자에 대한 계정 트랜잭션 기록을 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정 소유자가 호출할 수 있습니다.
func (t *Controller) GetAccountTransactionHistory(orgId string, userId string) (interface{}, error) {
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.GetAccountTransactionHistory", "TOKEN", map[string]string{"accountId": accountId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }

      transactionArray, err := t.Ctx.ERC721Account.GetAccountTransactionHistory(accountId)
      return transactionArray, err
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 객체 목록입니다.
반환 값 예제:
[
     {
        "Timestamp": "2022-04-06T08:31:39Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
        "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
        "TransactionType": "DEBIT"
    }
    {
        "Timestamp": "2022-04-06T08:16:53Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
        "TransactionId": "otransaction~750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7",
        "TransactionType": "MINT"
    }
]
GetAccountTransactionHistoryWithFilters
이 메소드는 PageSize, Bookmark, StartTimeEndTime로 필터링된 지정된 사용자에 대한 계정 트랜잭션 내역을 반환합니다. 이 메소드는 원격 Oracle Blockchain Platform 네트워크에 접속된 경우에만 호출할 수 있습니다. 이 메소드는 체인 코드의 Token Admin 또는 계정 소유자에 의해서만 호출될 수 있습니다.
func (t *Controller) GetAccountTransactionHistoryWithFilters(orgId string, userId string, filters ...erc721Account.AccountHistoryFilters) (interface{}, error) {
      accountId, err := t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)
      if err != nil {
            return nil, err
      }
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.GetAccountTransactionHistoryWithFilters", "TOKEN", map[string]string{"accountId": accountId})
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }

      transactionArray, err := t.Ctx.ERC721Account.GetAccountTransactionHistoryWithFilters(accountId, filters...)
      return transactionArray, err
}
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • filters: string - 선택적 매개변수입니다. 비어 있으면 모든 레코드가 반환됩니다. PageSize 속성은 반환할 레코드 수를 결정합니다. PageSize가 0이면 기본 페이지 크기는 20입니다. Bookmark 속성은 반환할 레코드의 시작 인덱스를 결정합니다. 자세한 내용은 Hyperledger Fabric 설명서를 참조하십시오. StartTimeEndTime 속성은 RFC-3339 형식으로 지정해야 합니다.
반환값:
  • 성공 시 객체 목록입니다.
반환 값 예제:
[
     {
        "Timestamp": "2022-04-06T08:31:39Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
        "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
        "TransactionType": "DEBIT"
    }
    {
        "Timestamp": "2022-04-06T08:16:53Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
        "TransactionId": "otransaction~750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7",
        "TransactionType": "MINT"
    }
]
GetTransactionById
이 메소드는 지정된 트랜잭션 ID에 대한 트랜잭션 기록을 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정 소유자에 의해서만 호출될 수 있습니다.
func (t *Controller) GetTransactionById(transactionId string) (interface{}, error) {
      return t.Ctx.ERC721Transaction.GetTransactionById(transactionId)
}
매개변수:
  • transactionId: string - 트랜잭션 자산의 ID입니다.
반환값:
  • 성공 시 객체 목록입니다.
반환 값 예제:
{
    "History": [
        {
            "IsDelete": "false",
            "Timestamp": "2022-04-06T08:31:39Z",
            "TxId": "5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
            "Value": {
                "AssetType": "otransaction",
                "Data": "",
                "FromAccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
                "Timestamp": "2022-04-06T08:31:39Z",
                "ToAccountId": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
                "TokenId": "monalisa",
                "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
                "TransactionType": "TRANSFER",
                "TriggeredByAccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1"
            }
        }
    ],
    "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7"
}
DeleteHistoricalTransactions
이 메소드는 상태 데이터베이스에서 지정된 시간 기록보다 오래된 트랜잭션을 삭제합니다. 이 메소드는 체인 코드의 Token Admin로만 호출할 수 있습니다.
func (t *Controller) DeleteHistoricalTransactions(timestamp string) (interface{}, error) {
      auth, err := t.Ctx.ERC721Auth.CheckAuthorization("ERC721TRANSACTION.DeleteHistoricalTransactions", "TOKEN")
      if err != nil && !auth {
            return nil, fmt.Errorf("error in authorizing the caller %s", err.Error())
      }
      return t.Ctx.ERC721Transaction.DeleteHistoricalTransactions(timestamp)
}
매개변수:
  • timestamp: Date - 시간 기록입니다. 시간 기록 이전의 모든 트랜잭션이 삭제됩니다.
반환값:
  • 성공 시 객체 목록입니다.
반환 값 예제:
{
    "Transactions": [
        "otransaction~750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7"
    ],
    "msg": "Successfuly deleted transaction older than date:2022-04-06T08:17:53Z"
}

토큰 동작 관리 방법 - 민트 가능한 동작

Create<Token Name>Token
이 메소드는 NFT를 생성(분)합니다. 자산 및 연관된 속성이 상태 데이터베이스에 저장됩니다. 이 트랜잭션의 호출자에게 토큰 계정이 있어야 합니다. 이 트랜잭션의 호출자가 NFT의 소유자가 됩니다. 토큰 사양 파일에 behaviors에 대한 roles 섹션과 roles에 대한 minter_role_name 속성이 포함된 경우 트랜잭션 호출자에게 minter 롤이 있어야 합니다. 그렇지 않으면 모든 호출자가 NFT를 민트할 수 있습니다.
func (t *Controller) Create<Token Name>Token(tokenAsset <Token Class>) (interface{}, error) {
      return t.Ctx.ERC721Token.CreateToken(&tokenAsset)
}
매개변수:
  • tokenAsset: <Token Class> - 민트할 토큰 자산입니다. 토큰 자산의 속성에 대한 자세한 내용은 입력 사양 파일을 참조하십시오.
반환값:
  • 성공 시 다음 속성을 포함하는 JSON 토큰 자산 객체:
  • Behavior - 모든 토큰 동작에 대한 설명입니다.
  • CreatedBy - 토큰을 민트하기 위해 트랜잭션을 호출한 사용자의 계정 ID입니다.
  • CreationDate - 트랜잭션의 시간 기록입니다.
  • IsBurned - tokenId로 식별된 NFT가 레코딩되는지 여부를 나타내는 부울 값입니다.
  • Mintable - 민트 가능한 동작의 속성에 대한 설명입니다. max_mint_quantity 속성은 생성할 수 있는 이 토큰 클래스의 최대 NFT 수를 지정합니다.
  • Owner - 토큰의 현재 소유자의 계정 ID입니다. 연동 프로세스 중 이 메소드의 호출자가 토큰의 소유자가 됩니다.
  • Symbol - 토큰의 기호입니다.
  • TokenDesc - 토큰에 대한 설명입니다.
  • TokenMetadata - 토큰을 설명하는 JSON 정보입니다.
  • TokenName - 토큰의 이름입니다.
  • TokenStandard - 토큰의 표준입니다.
  • TokenType - 이 계정이 보유한 토큰의 유형입니다.
  • TokenUnit - 토큰의 단위입니다.
  • TokenUri - 토큰의 URI입니다.
반환 값 예제:
{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",        
    "CreationDate": "2022-04-06T08:16:53Z",
    "IsBurned": false,
     "Mintable": {
        "Max_mint_quantity": 20000
    },
    "NftBasePrice": 100,
    "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter"
    },
    "Symbol": "PNT",
    "TokenDesc": "token Description",
    "TokenId": "monalisa",
    "TokenMetadata": {
        "Description": "Mona Lisa Painting",
        "Image": "monalisa.jpeg",
        "PainterName": "Leonardo_da_Vinci",
        "PaintingName": "Mona_Lisa"
    },
    "TokenName": "paintingnft",
    "TokenStandard": "erc721+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"
}
Update<Token Name>Token
이 메소드는 토큰 속성을 업데이트합니다. 이 메소드는 토큰의 소유자 또는 생성자인 사용자만 호출할 수 있습니다. 토큰 자산이 생성된 후에는 토큰 소유자만 토큰 사용자정의 속성을 업데이트할 수 있습니다. 사용자가 토큰 소유자이자 토큰 생성자인 경우 TokenDesc 속성도 업데이트할 수 있습니다. 토큰 메타데이터를 업데이트할 수 없습니다. 특정 등록 정보만 업데이트하려는 경우에도 이 메소드에 모든 토큰 등록 정보를 전달해야 합니다.
func (t *Controller) Update<Token Name>Token(tokenAsset <Token Class>) (interface{}, error) {
      return t.Ctx.ERC721Token.UpdateToken(&tokenAsset)
}
매개변수:
  • tokenAsset: <Token Class> - 업데이트할 토큰 자산입니다. 토큰 자산의 속성에 대한 자세한 내용은 입력 사양 파일을 참조하십시오.
반환값:
  • 성공 시 업데이트된 JSON 토큰 자산 객체입니다.
반환 값 예제:
{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",      
    "CreationDate": "2022-04-06T08:16:53Z",
    "IsBurned": false,    
    "Mintable": {
        "Max_mint_quantity": 20000
    },
    "NftBasePrice": 200,
    "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter"
    },
    "Symbol": "PNT",
    "TokenDesc": "Token Description",
    "TokenId": "monalisa",
    "TokenMetadata": {
        "Description": "Mona Lisa Painting",
        "Image": "monalisa.jpeg",
        "PainterName": "Leonardo_da_Vinci",
        "PaintingName": "Mona_Lisa"
    },
    "TokenName": "paintingnft",
    "TokenStandard": "erc721+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
}

토큰 동작 관리 방법 - 전송 가능한 동작

SafeTransferFrom
이 메소드는 호출자에서 다른 계정으로 지정된 NFT의 소유권을 이전합니다. 이 메소드는 다음 검증을 포함합니다.
  • 토큰이 존재하며 레코딩되지 않습니다.
  • 발신자 계정과 수령인 계정이 있으며 동일한 계정이 아닙니다.
  • 발신자 계정은 토큰을 소유합니다.
  • 함수의 호출자가 발신자입니다.
func (t *Controller) SafeTransferFrom(fromOrgId string, fromUserId string, toOrgId string, toUserId string, tokenId string, data ...string) (interface{}, error) {
      tokenAssetValue, err := t.getTokenObject(tokenId)
      if err != nil {
            return nil, err
      }
      fromAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(fromOrgId, fromUserId)
      if err != nil {
            return nil, err
      }
      toAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(toOrgId, toUserId)
      if err != nil {
            return nil, err
      }
      return t.Ctx.ERC721Token.SafeTransferFrom(fromAccountId, toAccountId, tokenAssetValue.Interface(), data...)
}
매개변수:
  • fromOrgId: string - 현재 조직에 있는 발신자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • fromUserId: string - 발신자의 사용자 이름 또는 전자메일 ID입니다.
  • toOrgId: string - 현재 조직에 있는 수신자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • toUserId: string - 수신자의 사용자 이름 또는 전자메일 ID입니다.
  • tokenId: string - 전송할 토큰의 ID입니다.
  • data: string - 트랜잭션 레코드에 저장할 선택적 추가 정보입니다.
반환값:
  • 성공 시 발신자 및 수신자 계정 세부정보가 포함된 메시지입니다.
반환 값 예제:
{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin) to Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1)"}
TransferFrom
이 방법은 지정된 NFT의 소유권을 발신자 계정에서 수신자 계정으로 이전합니다. 호출자는 정확한 파라미터를 전달해야 합니다. 이 메소드는 토큰 소유자뿐만 아니라 모든 사용자가 호출할 수 있습니다. 이 메소드는 다음 검증을 포함합니다.
  • 토큰이 존재하며 레코딩되지 않습니다.
  • 발신자 계정과 수령인 계정이 있으며 동일한 계정이 아닙니다.
  • 발신자 계정은 토큰을 소유합니다.
func (t *Controller) TransferFrom(fromOrgId string, fromUserId string, toOrgId string, toUserId string, tokenId string) (interface{}, error) {
      tokenAssetValue, err := t.getTokenObject(tokenId)
      if err != nil {
            return nil, err
      }
      fromAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(fromOrgId, fromUserId)
      if err != nil {
            return nil, err
      }
      toAccountId, err := t.Ctx.ERC721Account.GenerateAccountId(toOrgId, toUserId)
      if err != nil {
            return nil, err
      }
      return t.Ctx.ERC721Token.TransferFrom(fromAccountId, toAccountId, tokenAssetValue.Interface())
}
매개변수:
  • fromOrgId: string - 현재 조직에 있는 발신자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • fromUserId: string - 발신자의 사용자 이름 또는 전자메일 ID입니다.
  • toOrgId: string - 현재 조직에 있는 수신자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • toUserId: string - 수신자의 사용자 이름 또는 전자메일 ID입니다.
  • tokenId: string - 전송할 토큰의 ID입니다.
반환값:
  • 성공 시 발신자 및 수신자 계정 세부정보가 포함된 메시지입니다.
반환 값 예제:
{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin) to Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1)"}

토큰 동작 관리 방법 - 굽기 가능한 동작

Burn
이 메소드는 호출자 계정에서 지정된 NFT를 비활성화하거나 레코딩합니다. 이 메서드의 호출자에 계정이 있어야 합니다.The caller of this method must have an account. 토큰 사양 파일에 burnable 동작이 포함되어 있지 않으면 토큰을 구울 수 없습니다. 사양 파일의 roles 섹션에 burner_role_name 속성이 지정되지 않은 경우 토큰 소유자가 토큰을 구울 수 있습니다. burner_role_name 등록 정보가 roles 섹션에 지정된 경우 토큰의 채굴자(생성자)이기도 한 버너 역할을 지정한 사용자가 토큰을 레코딩할 수 있습니다.
func (t *Controller) Burn(tokenId string) (interface{}, error) {
      tokenAssetValue, err := t.getTokenObject(tokenId)
      if err != nil {
            return nil, err
      }
      return t.Ctx.ERC721Token.Burn(tokenAssetValue.Interface())
}
매개변수:
  • tokenId: string - 구울 토큰의 ID입니다.
반환값:
  • 성공 시 계정 세부정보가 포함된 메시지입니다.
반환 값 예제:
{"msg": "Successfully burned NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin"}
BurnNFT
이 메소드는 호출자 계정에서 지정된 NFT를 비활성화하거나 레코딩하고 토큰 객체 및 토큰 내역을 반환합니다. 이 메서드의 호출자에 계정이 있어야 합니다.The caller of this method must have an account. 토큰 사양 파일에 burnable 동작이 포함되어 있지 않으면 토큰을 구울 수 없습니다. 사양 파일의 roles 섹션에 burner_role_name 속성이 지정되지 않은 경우 토큰 소유자가 토큰을 구울 수 있습니다. burner_role_name 속성이 roles 섹션에 지정된 경우 토큰의 채굴자(생성자) 또는 소유자인 버너 역할을 지정한 사용자가 토큰을 레코딩할 수 있습니다.
func (t *Controller) BurnNFT(tokenId string) (interface{}, error) {
      tokenAsset, err := t.Ctx.ERC721Token.Get(tokenId)
      if err != nil {
            return nil, err
      }
      tokenHistory, err := t.Ctx.ERC721Token.History(tokenId)
      if err != nil {
            return nil, err
      }
      token := tokenAsset.(map[string]interface{})
      if token[constants.IsBurned] == true {
            return nil, fmt.Errorf("token with tokenId %s is already burned", tokenId)
      }
      token[constants.TokenId], err = strconv.Atoi(token[constants.TokenId].(string))
      if err != nil {
            return nil, fmt.Errorf("tokenId is expected to be integer but found %s", tokenId)
      }
      tokenHistoryBytes, err := json.Marshal(tokenHistory)
      if err != nil {
            return nil, err
      }
      var tokenHistoryAsRawJson json.RawMessage
      err = json.Unmarshal(tokenHistoryBytes, &tokenHistoryAsRawJson)
      if err != nil {
            return nil, err
      }
      token[constants.TokenHistory] = string(tokenHistoryAsRawJson)
      token[constants.IsBurned] = true
      _, err = t.Burn(tokenId)
      if err != nil {
            return nil, err
      }
      return token, nil
}
매개변수:
  • tokenId: string - 구울 토큰의 ID입니다.
반환값:
  • 성공 시 토큰 내역 정보를 포함하는 토큰 객체입니다.
반환 값 예제:
{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "CreationDate": "2023-08-22T13:19:33+05:30",
    "IsBurned": true,
    "Mintable": {
        "Max_mint_quantity": 20000
    },
    "On_sale_flag": false,
    "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "Price": 120,
    "Roles": {
        "minter_role_name": "minter"
    },
    "Symbol": "ART",
    "TokenDesc": "",
    "TokenHistory": "[{\"IsDelete\":\"false\",\"Timestamp\":\"2023-08-22T13:19:33+05:30\",\"TxId\":\"0219099bcaaecd5f76f7f08d719384fd5ed34103a55bd8d3754eca0bfc691594\",\"Value\":{\"AssetType\":\"otoken\",\"Behavior\":[\"indivisible\",\"singleton\",\"mintable\",\"transferable\",\"burnable\",\"roles\"],\"CreatedBy\":\"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d\",\"CreationDate\":\"2023-08-22T13:19:33+05:30\",\"IsBurned\":false,\"Mintable\":{\"Max_mint_quantity\":20000},\"On_sale_flag\":false,\"Owner\":\"oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d\",\"Price\":120,\"Roles\":{\"minter_role_name\":\"minter\"},\"Symbol\":\"ART\",\"TokenDesc\":\"\",\"TokenId\":\"1\",\"TokenMetadata\":{\"Description\":\"\",\"Image\":\"\",\"Painter_name\":\"\",\"Painting_name\":\"\"},\"TokenName\":\"artcollection\",\"TokenStandard\":\"erc721+\",\"TokenType\":\"nonfungible\",\"TokenUnit\":\"whole\",\"TokenUri\":\"example.com\"}}]",
    "TokenId": 1,
    "TokenMetadata": {
        "Description": "",
        "Image": "",
        "Painter_name": "",
        "Painting_name": ""
    },
    "TokenName": "artcollection",
    "TokenStandard": "erc721+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "example.com"
}

사용자정의 방법

토큰 SDK 메소드를 사용하여 비즈니스 애플리케이션에 대한 사용자정의 메소드를 작성할 수 있습니다.

다음 예에서는 사용자정의 메소드에서 토큰 SDK 메소드를 사용하는 방법을 보여줍니다. Sell 메소드가 호출되면 지정된 가격에 판매할 토큰이 게시됩니다.

func (t *Controller) Sell(tokenId string, sellingPrice int) (interface{}, error) {
	var tokenAsset ArtCollection
	_, err := t.Ctx.ERC721Token.Get(tokenId, &tokenAsset)
    if err != nil {
       return nil, err
	}

 /**  * price is a custom asset
      attribute to set the price of a non-fungible token in the
      marketplace  */
	tokenAsset.Price = sellingPrice
 /**  * on_sale_flag is a
      custom asset attribute that maintains non-fungible token selling status in the
      marketplace  */
	tokenAsset.On_sale_flag = true

	_, err = t.Ctx.ERC721Token.UpdateToken(tokenAsset)
    if err != nil {
		return nil, err
	}
	
	msg := fmt.Sprintf("Token ID : %s has been posted for selling in the marketplace", tokenId)
	return msg, nil
}

NFT SDK 메소드

액세스 제어 관리 방법

NFT SDK는 액세스 제어 기능을 제공합니다. 일부 메소드는 토큰의 Token Admin 또는 Account Owner에 의해서만 호출될 수 있습니다. 이 기능을 사용하면 의도한 사용자만 작업을 수행할 수 있습니다. 무단 액세스로 인해 오류가 발생합니다. 액세스 제어 기능을 사용하려면 ../lib/auth 모듈에서 Authorization 클래스를 임포트합니다.
import { ERC721Authorization } from '../lib/erc721-auth';
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
     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"}
      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"}

      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
Ctx.ERC721Auth.CheckAuthorization(funcName string, args []string) (bool, error)
매개변수:
  • funcName: string - oChainUtil.go 파일에 설명된 대로 수신기와 메소드 사이의 맵 값입니다.
  • ...args - args[0]'TOKEN' 상수를 사용하고 args[1]accountId 매개변수를 사용하여 AccountOwner에 대한 액세스 제어 검사를 추가하는 변수 인수입니다. MultipleAccountOwner에 대한 액세스 제어 검사를 추가하기 위해 args[1]orgId 매개변수를 사용하고 args[2]userId 매개변수를 사용합니다. TokenOwner에 대한 액세스 제어 검사를 추가하려면 args[1]tokenId 매개변수를 사용합니다.
반환값:
  • 부울 응답 및 필요한 경우 오류입니다.
예를 들면 다음과 같습니다.
t.Ctx.ERC721Auth.CheckAuthorization(<parameters>)

Admin 액세스

t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.GetAllTokens", "TOKEN")

AccountOwner 액세스

t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.History", "TOKEN", accountId)

MultipleAccountOwner 액세스

t.Ctx.ERC721Auth.CheckAuthorization("ERC721ACCOUNT.BalanceOf", "TOKEN", orgId, userId)

TokenOwner 액세스

t.Ctx.ERC721Auth.CheckAuthorization("ERC721TOKEN.Get", "TOKEN", tokenId)
IsUserTokenAdmin
이 메소드는 함수 호출자가 Token Admin인 경우 부울 값이 true인 맵을 반환합니다. 그렇지 않으면 메소드가 false를 반환합니다.
Ctx.ERC721Auth.IsUserTokenAdmin(orgId string, userId string)  (interface{}, error)
매개변수:
  • orgId - 현재 네트워크 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 부울 응답입니다.
예제:

t.Ctx.ERC721Auth.IsUserTokenAdmin(orgId, userId)

{"result":true}
AddAdmin
이 메소드는 사용자를 토큰 체인 코드의 Token Admin로 추가합니다.
Ctx.ERC721Admin.AddAdmin(orgId string, userId string) (interface{}, error)
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 토큰 체인 코드의 Token Admin로 추가된 사용자에 대한 세부정보를 나열하는 메시지입니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Admin.AddAdmin(orgId, userId)

{"msg":"Successfully added Admin (OrgId: Org1MSP, UserId: user1)"}
RemoveAdmin
이 메소드는 토큰 체인 코드의 Token Admin인 사용자를 제거합니다.
Ctx.ERC721Admin.RemoveAdmin(orgId string, userId string) (interface{}, error)
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 토큰 체인 코드의 Token Admin로 제거된 사용자에 대한 세부정보를 나열하는 메시지입니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Admin.RemoveAdmin(orgId, userId)

{"msg":"Successfuly removed Admin (OrgId Org1MSP UserId user1)"}
GetAllAdmins
이 메소드는 모든 Token Admin 사용자 목록을 반환합니다.
Ctx.ERC721Admin.GetAllAdmins() (Admin[], error) 
매개변수:
  • 없음
반환값:
  • 성공 시 모든 Token Admin 사용자 목록이 표시됩니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Admin.GetAllAdmins()

{
    "admins": [
        {
            "OrgId":"Org1MSP",
            "UserId":"admin"
        }
    ]
}
GetAllAdminUsers
이 메소드는 모든 Token Admin 사용자 목록을 반환합니다.
Ctx.ERC721Admin.GetAllAdminUsers() (interface{}, error) 
매개변수:
  • 없음
반환값:
  • 성공 시 map[string]interface{} 형식의 모든 Token Admin 사용자 목록이 표시됩니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Admin.GetAllAdminUsers()

{
    "admins": [
        {
            "OrgId":"Org1MSP",
            "UserId":"admin"
        }
    ]
}

토큰 구성 관리 방법

CreateToken
이 메소드는 토큰을 생성하고 해당 속성을 상태 데이터베이스에 저장합니다. 이 메소드는 minter 롤을 가진 사용자만 호출할 수 있습니다.
Ctx.ERC721Token.CreateToken(args ...interface{})
매개변수:
  • 변수 인수. 여기서 args[0]는 필수 유형의 토큰 struct에 대한 참조를 포함합니다.
반환값:
  • 성공 시 토큰 세부정보가 포함된 interface[]입니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.CreateToken(&tokenAsset)

{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",        
    "CreationDate": "2022-04-06T08:16:53Z",
    "IsBurned": false,
     "Mintable": {
        "Max_mint_quantity": 20000
    },
    "NftBasePrice": 100,
    "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter"
    },
    "Symbol": "PNT",
    "TokenDesc": "token Description",
    "TokenId": "monalisa",
    "TokenMetadata": {
        "Description": "Mona Lisa Painting",
        "Image": "monalisa.jpeg",
        "PainterName": "Leonardo_da_Vinci",
        "PaintingName": "Mona_Lisa"
    },
    "TokenName": "paintingnft",
    "TokenStandard": "erc721+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"
}
GetTokenUri
이 메소드는 지정된 토큰에 대한 토큰 URI를 반환합니다.
Ctx.ERC721Token.GetTokenURI(tokenId string) (interface{}, error)
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환값:
  • 성공 시 문자열 데이터 유형에 새 토큰 URI의 맵을 반환합니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.GetTokenURI(tokenId)

{"TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"}
TokenUri
이 메소드는 지정된 토큰에 대한 토큰 URI를 반환합니다.
Ctx.ERC721Token.TokenURI(tokenId string) (interface{}, error)
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환값:
  • 성공 시 문자열 데이터 유형에 새 토큰 URI의 맵을 반환합니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
반환 값 예제:

t.Ctx.ERC721Token.TokenURI(tokenId)

{"TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg"}
Symbol
이 메소드는 토큰 클래스의 기호를 반환합니다.
Ctx.ERC721Token.Symbol() (interface{}, error)
매개변수:
  • 없음
반환값:
  • 성공 시 문자열 데이터 유형의 기호 맵입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.Symbol()

{"Symbol": "PNT"}
Name
이 메소드는 토큰 클래스의 이름을 반환합니다.
Ctx.ERC721Token.Name() (interface{}, error)
매개변수:
  • 없음
반환값:
  • 성공 시 문자열 데이터 유형의 토큰 이름 맵입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.Name()

{"TokenName": "paintingnft"}
OwnerOf
이 메소드는 지정된 토큰의 소유자의 계정 ID를 반환합니다.
Ctx.ERC721Token.OwnerOf(tokenId string) (interface{}, error)
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환값:
  • 성공 시 문자열 데이터 유형에 있는 소유자의 계정 ID 맵입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.OwnerOf(tokenId)

{"Owner": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba"}
TotalSupply
이 메소드는 총 연동된 NFT 수를 반환합니다.
Ctx.ERC721Token.TotalSupply() (map[string]interface{}, error)
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환값:
  • 성공 시 숫자 데이터 유형의 토큰 총 공급에 대한 맵입니다. 오류 발생 시 오류 메시지가 있는 거부입니다.
예제:

t.Ctx.ERC721Token.TotalSupply();

{"TotalSupply": 3}
GetAllTokens
이 메소드는 상태 데이터베이스에 저장된 모든 토큰 자산을 반환합니다. 이 방법은 Berkeley DB SQL 서식 있는 쿼리를 사용하며 원격 Oracle Blockchain Platform 네트워크에 연결된 경우에만 호출할 수 있습니다.
Ctx.ERC721Token.GetAllTokens()  (interface{}, error)
매개변수:
  • 없음
반환값:
  • 성공 시 모든 토큰 자산의 맵입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.GetAllTokens()

[
    {
        "key": "monalisa",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintab
 
le",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:01:42Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 0,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "token Description",
            "TokenId": "monalisa",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
    },
    {
        "key": "monalisa2",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:04:44Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 100,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "",
            "TokenId": "monalisa1",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
        }
    }
]
GetAllTokensByUser
이 메소드는 지정된 계정 ID가 소유한 모든 토큰을 반환합니다. 이 방법은 Berkeley DB SQL 서식 있는 쿼리를 사용하며 원격 Oracle Blockchain Platform 네트워크에 연결된 경우에만 호출할 수 있습니다.
Ctx.ERC721Token.GetAllTokensByUser(accountId string) (interface{}, error)
매개변수:
  • accountId: string - 계정의 ID입니다.
반환값:
  • 성공 시 지정된 계정에 대한 토큰 자산 맵입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.GetAllTokensByUser(accountId)

[
    {
        "key": "monalisa",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:01:42Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 0,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "token Description",
            "TokenId": "monalisa",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
    },
    {
        "key": "monalisa2",
        "valueJson": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "CreationDate": "2022-04-10T11:04:44Z",
            "IsBurned": false,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 100,
            "Owner": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "",
            "TokenId": "monalisa1",
            "TokenMetadata": {
                 "Description": "Mona Lisa Painting",
                 "Image": "monalisa.jpeg",
                 "PainterName": "Leonardo_da_Vinci",
                 "PaintingName": "Mona_Lisa"
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
        }
        }
    }
]
Get
이 메소드는 지정된 토큰 객체가 상태 데이터베이스에 있는 경우 해당 객체를 반환합니다.
Ctx.Get(Id string, result ...interface{}) (interface{}, error)
매개변수:
  • tokenId: string - 토큰의 ID입니다.
  • result - 변수 인수입니다. 여기서 첫번째 인수 result[0]는 메소드를 성공적으로 호출한 후 토큰 데이터를 포함할 올바른 유형의 빈 Token 객체에 대한 참조입니다.
반환값:
  • 성공 시 토큰 자산 데이터가 있는 맵입니다. 또한 result[0]가 전달되면 데이터가 result[0]에 지정됩니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.Get(tokenId, &asset)

{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "CreationDate": "2022-04-06T00:35:42z",
    "Mintable": {
        "Max_mint_quantity": 20000
    },
    "NftBasePrice": 200,
    "Owner": "oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba",
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter"
    },
    "Symbol": "PNT",
    "TokenDesc": "Token Description",
    "TokenId": "monalisa",
    "TokenMetadata": {
        "Description": "Mona Lisa Painting",
        "Image": "monalisa.jpeg",
        "PainterName": "Leonardo_da_Vinci",
        "PaintingName": "Mona_Lisa"
    },
    "TokenName": "paintingnft",
    "TokenStandard": "erc721+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
    "TransferredBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "TransferredDate": "2022-04-06T00:51:56z"
}
UpdateToken
이 메소드는 토큰 속성을 업데이트합니다. 이 메소드는 토큰의 소유자 또는 생성자만 호출할 수 있습니다. 토큰 자산이 생성된 후에는 토큰 소유자만 토큰 사용자정의 속성을 업데이트할 수 있습니다. 사용자가 토큰 소유자이자 토큰 생성자인 경우 TokenDesc 속성도 업데이트할 수 있습니다. 토큰 메타데이터를 업데이트할 수 없습니다. 특정 등록 정보만 업데이트하려는 경우에도 이 메소드에 모든 토큰 등록 정보를 전달해야 합니다.
Ctx.ERC721Token.UpdateToken(asset interface{}) (interface{}, error)
매개변수:
  • 필수 유형의 토큰 구조 데이터에 대한 참조입니다.
반환값:
  • 성공 시 토큰 세부정보가 포함된 약속 메시지입니다. 오류 발생 시 오류 메시지가 있는 거부입니다.
예제:

t.Ctx.ERC721Token.UpdateToken(&asset)

{
    "AssetType": "otoken",
    "Behavior": [
        "indivisible",
        "singleton",
        "mintable",
        "transferable",
        "burnable",
        "roles"
    ],
    "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",     
    "CreationDate": "2022-04-06T08:16:53Z",
    "IsBurned": false,   
    "Mintable": {
        "Max_mint_quantity": 20000
    },
    "NftBasePrice": 200,
    "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "Roles": {
        "burner_role_name": "burner",
        "minter_role_name": "minter"
    },
    "Symbol": "PNT",
    "TokenDesc": "Token Description",
    "TokenId": "monalisa",
    "TokenMetadata": {
        "Description": "Mona Lisa Painting",
        "Image": "monalisa.jpeg",
        "PainterName": "Leonardo_da_Vinci",
        "PaintingName": "Mona_Lisa"
    },
    "TokenName": "paintingnft",
    "TokenStandard": "erc721+",
    "TokenType": "nonfungible",
    "TokenUnit": "whole",
    "TokenUri": "https://bafybeid6pmpp62bongoip5iy2skosvyxh3gr7r2e35x3ctvawjco6ddmsq\\ .ipfs.infura-ipfs.io/?filename=MonaLisa.jpeg",
}
History
이 메소드는 지정된 토큰에 대한 내역을 반환합니다.
Ctx.ERC721Token.History(tokenId: string)  (interface{}, error)
매개변수:
  • tokenId: string - 토큰의 ID입니다.
반환값:
  • 성공 시 맵 배열입니다. 오류 발생 시 오류 메시지가 있는 거부입니다.
예제:

t.Ctx.ERC721Token.History(tokenId)

[
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T11:34:06z",
        "TxId": "3184eac8738c73ef45501fe23c9e14517892e04e4eb03ec9be834b89c29ea17b",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "BurnedBy": null,
            "BurnedDate": null,
            "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "CreationDate": "2022-04-06T11:33:40+05:30",
            "IsBurned": null,
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 0,
            "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "",
            "TokenId": "t1",
            "TokenMetadata": {
                "Description": "",
                "Image": "",
                "PainterName": "",
                "PaintingName": ""
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": "",
            "TransferredBy": null,
            "TransferredDate": null
        }
    },
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T11:33:40z",
        "TxId": "d37dba907a849c308b2a38d47cf8a68cdcb4e3d93fa74050774379fccfcd43be",
        "Value": {
            "AssetType": "otoken",
            "Behavior": [
                "indivisible",
                "singleton",
                "mintable",
                "transferable",
                "burnable",
                "roles"
            ],
            "CreatedBy": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "CreationDate": "2022-04-06T11:33:40+05:30",
            "Mintable": {
                "Max_mint_quantity": 20000
            },
            "NftBasePrice": 0,
            "Owner": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
            "Roles": {
                "burner_role_name": "burner",
                "minter_role_name": "minter"
            },
            "Symbol": "PNT",
            "TokenDesc": "",
            "TokenId": "t1",
            "TokenMetadata": {
                "Description": "",
                "Image": "",
                "PainterName": "",
                "PaintingName": ""
            },
            "TokenName": "paintingnft",
            "TokenStandard": "erc721+",
            "TokenType": "nonfungible",
            "TokenUnit": "whole",
            "TokenUri": ""
        }
    }
]
GetNewCtx
이 메소드는 새 TrxContext 객체를 반환합니다. trxcontext 구조체는 모든 SDK 라이브러리에 대한 참조를 보유합니다. 이 객체만 사용하여 sdk 메소드에 액세스합니다. trxcontext 객체는 동시 트랜잭션이 실행 중일 때 SDK 라이브러리에서 트랜잭션 스텁의 상호 배타성을 유지 관리합니다.
GetNewCtx(stub shim.ChaincodeStubInterface) TrxContext
매개변수:
  • stub - 트랜잭션 스텁입니다.
반환값:
  • trxcontext 구조체.
예제:

trxcontext.GetNewCtx(stub)

trxcontext object.

계정 관리 방법

GenerateAccountId
이 메소드는 멤버쉽 서비스 제공자 ID(orgId)와 사용자 이름 또는 전자메일 ID(userId)를 연결한 다음 SHA-256 해시를 생성하여 구성된 계정 ID를 반환합니다.
Ctx.ERC721Account.GenerateAccountId(orgId string, userId string) (string, error)
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 생성된 계정 ID입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Account.GenerateAccountId(orgId, userId)

oaccount~a0a60d54ba9e2ff349737d292ea10ebd9cc8f1991c11443c19d20aea299a9507
CreateAccount
이 방법은 지정된 사용자의 계정을 만듭니다. 언제든지 토큰을 보유할 모든 사용자에 대해 계정을 만들어야 합니다. 계정은 사용자가 보유한 NFT 수를 추적합니다. 토큰 관련 작업을 완료하려면 네트워크에 계정이 있어야 합니다. 사용자당 하나의 NFT 계정만 생성할 수 있습니다.

계정 ID는 영숫자 문자 집합으로, 앞에 oaccount~이 붙고 그 뒤에 현재 네트워크 조직에 있는 사용자의 멤버쉽 서비스 제공자 ID(org_id)에 대한 SHA-256 해시, 인스턴스 소유자 또는 인스턴스에 로그인한 사용자의 사용자 이름 또는 전자 메일 ID(userId) 및 상수 문자열 nft가 붙습니다.

Ctx.ERC721Account.CreateAccount(orgId string, userId string, tokenType string) (ERC721Account, error)
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • tokenType: string - 지원되는 토큰 유형은 nonfungible뿐입니다.
반환값:
  • 성공 시 새 계정 객체입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체
예제:

t.Ctx.ERC721Account.CreateAccount(orgId, userId, tokenType)

{
    "AssetType": "oaccount",
    "AccountId": "oaccount~a0a60d54ba9e2ff349737d292ea10ebd9cc8f1991c11443c19d20aea299a9507",
    "UserId": "admin",
    "BapAccountVersion" : 0,
    "OrgId": "Org1MSP",
    "TokenType": "nonfungible",
    "NoOfNfts": 0
}
GetAllAccounts
이 메소드는 모든 계정 목록을 반환합니다. 이 방법은 Berkeley DB SQL 서식 있는 쿼리를 사용하며 원격 Oracle Blockchain Platform 네트워크에 연결된 경우에만 호출할 수 있습니다.
Ctx.ERC721Account.GetAllAccounts() (interface{}, error)
매개변수:
  • 없음
반환값:
  • 모든 계정의 JSON 배열입니다.
예제:

t.Ctx.ERC721Account.GetAllAccounts()

[
    {
        "key": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
        "valueJson": {
            "AccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "BapAccountVersion" : 0,
            "AssetType": "oaccount",
            "NoOfNfts": 5,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user1"
        }
    },
    {
        "key": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
        "valueJson": {
            "AccountId": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
            "AssetType": "oaccount",
            "BapAccountVersion" : 0,
            "NoOfNfts": 0,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user_minter"
        }
    },
    {
        "key": "oaccount~5541fb520058d83664b844e7a55fe98d574ddeda765d0e795d4779e9ccc271ce",
        "valueJson": {
            "AccountId": "oaccount~5541fb520058d83664b844e7a55fe98d574ddeda765d0e795d4779e9ccc271ce",
            "AssetType": "oaccount",
            "BapAccountVersion" : 0,
            "NoOfNfts": 0,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user_burner"
        }
    }
]
History
이 메소드는 지정된 계정에 대한 계정 내역 세부정보의 배열을 반환합니다.
Ctx.ERC721Account.History(accountId string) (interface{}, error)
매개변수:
  • accountId: string - 계정의 ID입니다.
반환값:
  • 성공 시 지정된 계정에 대한 계정 내역 세부정보를 포함하는 map[string]interface{} 배열입니다. 계정 데이터는 맵의 value 키 아래에 표시됩니다. 오류 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Account.History(accountId)

[
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T08:16:53Z",
        "TxId": "750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7",
        "Value": {
            "AccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "AssetType": "oaccount",
            "BapAccountVersion" : 1,
            "NoOfNfts": 1,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user1"
        }
    },
    {
        "IsDelete": "false",
        "Timestamp": "2022-04-06T08:15:19Z",
        "TxId": "49eb84c42d452e5ba0028d8ebb4190454cf9013a11c0bad3e96594af452d4982",
        "Value": {
            "AccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
            "AssetType": "oaccount",
            "NoOfNfts": 0,
            "BapAccountVersion" : 0,
            "OrgId": "apPart",
            "TokenType": "nonfungible",
            "UserId": "user1"
        }
    }
]
GetUserByAccountId
이 메소드는 지정된 계정에 대한 사용자 세부정보를 반환합니다.
Ctx.ERC721Account.GetUserByAccountId(accountId string) (interface{}, error)
매개변수:
  • accountId: string - 계정의 ID입니다.
반환값:
  • 성공 시 다음 속성에 사용자 세부정보를 포함하는 JSON 객체:
    • OrgId - 현재 네트워크 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
    • UserId - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Account.GetUserByAccountById(accountId)

{
    "OrgId": "Org1MSP",
    "UserId": "admin"
}
GetAccountWithStatusByUser
이 메소드는 계정 상태를 포함하여 지정된 사용자에 대한 계정 세부 정보를 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정의 Account Owner로만 호출할 수 있습니다.
Ctx.ERC721Account.GetAccountWithStatusByUser(orgId, userId) (interface{}, error)
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 다음 속성을 포함하는 JSON 계정 객체:
  • AccountId - 사용자 계정의 ID입니다.
  • UserId - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • OrgId - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • TokenType - 계정이 보유하는 토큰의 유형입니다.
  • NoOfNfts - 계정이 보유한 총 NFT 수입니다.
  • BapAccountVersion - 내부용 계정 객체 매개변수입니다.
  • Status - 사용자 계정의 현재 상태입니다.
  • 오류 시 오류 메시지가 포함된 nil이 아닌 객체입니다.
예제:
{
  "AccountId": "oaccount~cc301bee057f14236a97d434909ec1084970921b008f6baab09c2a0f5f419a9a",
  "AssetType": "oaccount",
  "BapAccountVersion": 0,
  "NoOfNfts": 0,
  "OrgId": "appdev",
  "Status": "active",
  "TokenType": "nonfungible",
  "UserId": "idcqa"
}
GetAccountByUser
이 메소드는 지정된 사용자에 대한 계정 세부 정보를 반환합니다. 이 메소드는 체인 코드의 Token Admin 또는 계정의 Account Owner로만 호출할 수 있습니다.
Ctx.ERC721Account.GetAccountByUser(orgId, userId) (ERC721Account, error)
매개변수:
  • orgId: string - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • userId: string - 사용자의 사용자 이름 또는 전자메일 ID입니다.
반환값:
  • 성공 시 다음 속성을 포함하는 JSON 계정 객체:
  • AccountId - 사용자 계정의 ID입니다.
  • UserId - 사용자의 사용자 이름 또는 전자메일 ID입니다.
  • OrgId - 현재 조직에 있는 사용자의 멤버쉽 서비스 제공자(MSP) ID입니다.
  • TokenType - 계정이 보유하는 토큰의 유형입니다.
  • NoOfNfts - 계정이 보유한 총 NFT 수입니다.
  • 오류 시 오류 메시지가 포함된 nil이 아닌 객체입니다.
예제:
{
    "AssetType": "oaccount",
    "AccountId": "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d",
    "BapAccountVersion" : 0,
    "UserId": "admin",
    "OrgId": "Org1MSP",
    "TokenType": "nonfungible",
    "NoOfNfts": 0
}
BalanceOf
이 메소드는 지정된 사용자가 보유한 총 NFT 수를 반환합니다.
Ctx.ERC721Account.BalanceOf(accountId string) (interface{}, error)
매개변수:
  • accountId: string - 사용자의 계정 ID입니다.
반환값:
  • 성공 시 메시지와 총 NFT 수가 포함된 인터페이스입니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Account.BalanceOf(accountId)

{"TotalNfts": 0}

역할 관리 방법

AddRoleMember
이 메소드는 지정된 사용자에게 역할을 추가합니다.
Ctx.ERC721Token.AddRoleMember(role string, accountId string) (interface{}, error)
매개변수:
  • role: string - 지정된 사용자에 추가할 롤의 이름입니다. mintableburnable 동작은 사양 파일의 minter_role_nameburner_role_name 속성에 해당합니다.
  • accountId: number - 작업할 계정 ID입니다.
반환값:
  • 성공 시 성공 메시지가 있는 맵입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.AddRoleMember(userRole, accountId)

{"msg": "Successfully added role minter to oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (orgId : Org1MSP, userId : admin)"}
RemoveRoleMember
이 메소드는 지정된 사용자 및 토큰에서 롤을 제거합니다. 계정 ID는 연결된 멤버쉽 서비스 제공자 ID(orgId)의 SHA-256 해시와 사용자 이름 또는 전자메일 ID(userId)를 생성하여 구성됩니다.
Ctx.Token.RemoveRoleMember(role string, accountId string) (interface{}, error)
매개변수:
  • role: string - 지정된 사용자로부터 제거할 롤의 이름입니다. mintableburnable 동작은 사양 파일의 minter_role_nameburner_role_name 속성에 해당합니다.
  • accountId: number - 작업할 계정 ID입니다.
반환값:
  • 성공 시 성공 메시지가 있는 맵입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.RemoveRoleMember(userRole, accountId)

{"msg": "successfully removed memberId oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (orgId : Org1MSP, userId : admin) from role minter"}
IsInRole
이 메소드는 사용자 및 토큰에 지정된 롤이 있는지 여부를 나타내는 부울 값을 반환합니다. 계정 ID는 연결된 멤버쉽 서비스 제공자 ID(orgId)의 SHA-256 해시와 사용자 이름 또는 전자메일 ID(userId)를 생성하여 구성됩니다.
Ctx.ERC721Token.IsInRole(role string, accountId string) (bool, error)
매개변수:
  • role: string - 지정된 사용자를 확인할 역할의 이름입니다. mintableburnable 동작은 사양 파일의 minter_role_nameburner_role_name 속성에 해당합니다.
  • accountId: number - 작업할 계정 ID입니다.
반환값:
  • 성공 시 지정된 계정 ID에 대한 역할이 있는 경우 true인 부울 값, 그렇지 않은 경우 false입니다. 오류 시 오류 메시지를 포함하는 nil이 아닌 객체
예제:

t.Ctx.ERC721Token.IsInRole(userRole, accountId)

{"result": false}
GetAccountsByRole
이 메소드는 지정된 롤에 대한 모든 계정 ID 목록을 반환합니다.
Ctx.ERC721Role.GetAccountsByRole(roleName string) (interface{}, error)
매개변수:
  • roleName: string - 검색할 롤의 이름입니다.
반환값:
  • 성공 시 JSON 계정 ID 배열입니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Role.GetAccountsByRole(userRole)

{
    "accounts": [
        "oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d"
    ]
}
GetUsersByRole
이 메소드는 지정된 롤에 대한 모든 사용자 목록을 반환합니다.
Ctx.ERC721Role.GetUsersByRole(roleName string) (interface{}, error)
매개변수:
  • roleName: string - 검색할 롤의 이름입니다.
반환값:
  • 성공 시 사용자 객체의 JSON 배열입니다. 각 객체는 사용자 ID 및 조직 ID를 포함합니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Role.GetUsersByRole(userRole)

{
    "Users": [
        {
            "OrgId": "Org1MSP",
            "UserId": "admin"
        }
    ]
}

트랜잭션 내역 관리 방법

GetAccountTransactionHistory
이 메소드는 지정된 계정에 대한 트랜잭션 내역 세부정보의 배열을 반환합니다.
Ctx.ERC721Account.GetAccountTransactionHistory(accountId string) (interface{}, error)
매개변수:
  • accountId: string - 계정의 ID입니다.
반환값:
  • 성공 시 JSON 형식의 계정 트랜잭션 객체 배열:
    • TransactionId - 트랜잭션의 ID입니다.
    • TransactedAccount - 트랜잭션이 발생한 계정입니다.
    • TransactionType - 트랜잭션 유형입니다.
    • Timestamp - 트랜잭션의 시간입니다.
    • 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Account.GetAccountTransactionHistory(accountId)

[
     {
        "Timestamp": "2022-04-06T08:31:39Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
        "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
        "TransactionType": "DEBIT"
    }
    {
        "Timestamp": "2022-04-06T08:16:53Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
        "TransactionId": "otransaction~750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7",
        "TransactionType": "MINT"
    }
]
GetAccountTransactionHistoryWithFilters
이 메소드는 PageSize, Bookmark, startTimeendTime로 필터링된 지정된 사용자에 대한 계정 트랜잭션 내역을 반환합니다. 이 메소드는 원격 Oracle Blockchain Platform 네트워크에 접속된 경우에만 호출할 수 있습니다.
Ctx.ERC721Account.GetAccountTransactionHistoryWithFilters(accountId string, filters ...erc721Account.AccountHistoryFilters)
매개변수:
  • accountId: string - 계정의 ID입니다.
  • filters: string - 선택적 매개변수입니다. 비어 있으면 모든 레코드가 반환됩니다. PageSize 속성은 반환할 레코드 수를 결정합니다. PageSize가 0이면 기본 페이지 크기는 20입니다. Bookmark 속성은 반환할 레코드의 시작 인덱스를 결정합니다. 자세한 내용은 Hyperledger Fabric 설명서를 참조하십시오. StartTimeEndTime 속성은 RFC-3339 형식으로 지정해야 합니다.
반환값:
  • 성공 시 JSON 형식의 계정 트랜잭션 객체 배열:
    • TransactionId - 트랜잭션의 ID입니다.
    • TransactedAccount - 트랜잭션이 발생한 계정입니다.
    • TransactionType - 트랜잭션 유형입니다.
    • Timestamp - 트랜잭션의 시간입니다.
    • 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Account.GetAccountTransactionHistoryWithFilters(accountId, filters...)

[
     {
        "Timestamp": "2022-04-06T08:31:39Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
        "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
        "TransactionType": "DEBIT"
    }
    {
        "Timestamp": "2022-04-06T08:16:53Z",
        "TokenId": "monalisa",
        "TransactedAccount": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
        "TransactionId": "otransaction~750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7",
        "TransactionType": "MINT"
    }
]
GetTransactionById
이 메소드는 Transaction 자산의 내역을 반환합니다.
Ctx.ERC721Transaction.GetTransactionById(trxId string) (interface{}, error)
매개변수:
  • trxId: string - 트랜잭션 자산의 ID입니다.
반환값:
  • 성공 시 트랜잭션 자산의 맵 배열입니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Transaction.GetTransactionById(transactionId)

{
    "History": [
        {
            "IsDelete": "false",
            "Timestamp": "2022-04-06T08:31:39Z",
            "TxId": "5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
            "Value": {
                "AssetType": "otransaction",
                "Data": "",
                "FromAccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1",
                "Timestamp": "2022-04-06T08:31:39Z",
                "ToAccountId": "oaccount~0829f0996744ca9dc8b4e9165a7a8f5db3fdffdc46c96b94f5d625041502cec4",
                "TokenId": "monalisa",
                "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7",
                "TransactionType": "TRANSFER",
                "TriggeredByAccountId": "oaccount~543c2258e351c3e7a40ea59b81e62154d38fbfc9d1b5b79f30ac5e08e7d0dfd1"
            }
        }
    ],
    "TransactionId": "otransaction~5a353e02e657c2c8fddce41dd4e7260025fe7beef634ca3351fc366a440e8ac7"
}
DeleteHistoricalTransactions
이 메소드는 상태 데이터베이스에서 지정된 날짜보다 오래된 트랜잭션을 삭제합니다.
func (t *Controller) DeleteHistoricalTransactions(referenceTime string) (interface{}, error)
매개변수:
  • referenceTime: string - 지정된 시간보다 오래된 트랜잭션이 삭제됩니다.
반환값:
  • 성공 시 삭제된 트랜잭션 ID의 배열 및 성공 메시지입니다. 오류 발생 시 오류 메시지가 포함된 nil이 아닌 오류 객체입니다.
예제:

t.Ctx.ERC721Transaction.DeleteHistoricalTransactions(timestamp)

{
    "Transactions": [
        "otransaction~750f68538451847f57948f7d5261dcb81570cd9e429f928a4cb7bfa76392ecf7"
    ],
    "msg": "Successfuly deleted transaction older than date:2022-04-06T08:17:53Z"
}

토큰 동작 관리 - 민트 가능한 동작

GetMaxMintQuantity
이 메소드는 토큰의 최대 민트 가능 수량을 반환합니다. max_mint_quantity 동작이 사양 파일에 구성되지 않은 경우 기본값은 0이며 토큰 수를 무제한으로 지정할 수 있습니다.
Ctx.ERC721Token.GetMaxMintQuantity(id string) (float64, error)
매개변수:
  • ID - 작동할 토큰의 ID입니다.
반환값:
  • 성공 시 숫자 데이터 유형의 최대 연동 가능 토큰 수량입니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.GetMaxMintQuantity(tokenId);

20000
GetTotalMintedTokens
이 메소드는 지정된 토큰에 대해 시스템에서 사용 가능한 총 순 토큰 수를 반환합니다. 사용 가능한 토큰의 순 수는 총 연동 토큰 수에서 연소된 토큰 수를 뺀 값입니다.
Ctx.ERC721Token.GetTotalMintedTokens() (map[string]interface{}, error)
매개변수:
  • 없음
반환값:
  • 성공 시 총 연동된 토큰의 맵(숫자 데이터 유형) 및 성공 메시지입니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.GetTotalMintedTokens()

{"TotalNetSupply": 5}

토큰 동작 관리 - 전송 가능한 동작

SafeTransferFrom
이 메소드는 호출자에서 다른 계정으로 지정된 NFT의 소유권을 이전합니다. 이 메소드는 다음 검증을 포함합니다.
  • 토큰이 존재하며 레코딩되지 않습니다.
  • 발신자 계정과 수령인 계정이 있으며 동일한 계정이 아닙니다.
  • 발신자 계정은 토큰을 소유합니다.
  • 함수의 호출자가 발신자입니다.
Ctx.ERC721Token.SafeTransferFrom(fromAccountId string, toAccountId string, tokenAsset interface{}, data ...string) (interface{}, error)
매개변수:
  • fromAccountId: string - 현재 조직에 있는 발신자의 계정 ID입니다.
  • toAccountId: string - 현재 조직에 있는 수신자의 계정 ID입니다.
  • tokenAsset - 작업할 토큰 자산에 대한 참조입니다.
  • data: string - 트랜잭션에 저장할 선택적 추가 정보입니다.
반환값:
  • 성공 시 계정 세부정보가 포함된 성공 메시지가 있는 약속입니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.SafeTransferFrom(fromAccountId, toAccountId, tokenAssetValue.Interface(), data...)

{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin) to Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1"}
TransferFrom
이 방법은 지정된 NFT의 소유권을 발신자 계정에서 수신자 계정으로 이전합니다. 호출자는 정확한 파라미터를 전달해야 합니다. 이 메소드는 토큰 소유자뿐만 아니라 모든 사용자가 호출할 수 있습니다. 이 메소드는 다음 검증을 포함합니다.
  • 토큰이 존재하며 레코딩되지 않습니다.
  • 발신자 계정과 수령인 계정이 있으며 동일한 계정이 아닙니다.
  • 발신자 계정은 토큰을 소유합니다.
Ctx.ERC721Token.TransferFrom(fromAccountId string, toAccountId string, tokenAsset interface{}) (interface{}, error)
매개변수:
  • fromAccountId: string - 현재 조직에 있는 발신자의 계정 ID입니다.
  • toAccountId: string - 현재 조직에 있는 수신자의 계정 ID입니다.
  • tokenAsset - 작업할 토큰 자산에 대한 참조입니다.
반환값:
  • 성공 시 계정 세부정보가 포함된 성공 메시지가 있는 약속입니다. 계정 ID의 접두어는 oaccount~입니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
\예제:

t.Ctx.ERC721Token.TransferFrom(fromAccountId, toAccountId, tokenAssetValue.Interface())

{"msg": "Successfully transferred NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin) to Account-Id: oaccount~ec32cff8635a056f3dda3da70b1d6090d61f66c6a170c4a95fd008181f729dba (Org-Id: Org1MSP, User-Id: user1"}

토큰 동작 관리 - 굽기 가능 동작

Burn
이 메소드는 호출자 계정에서 지정된 NFT를 비활성화하거나 레코딩합니다. 이 메서드의 호출자에 계정이 있어야 합니다.The caller of this method must have an account. 토큰 사양 파일에 burnable 동작이 포함되어 있지 않으면 토큰을 구울 수 없습니다. 사양 파일의 roles 섹션에 burner_role_name 속성이 지정되지 않은 경우 토큰 소유자가 토큰을 구울 수 있습니다. burner_role_name 등록 정보가 roles 섹션에 지정된 경우 토큰의 채굴자(생성자)이기도 한 버너 역할을 지정한 사용자가 토큰을 레코딩할 수 있습니다. burn 메소드는 ERC721Token 패키지의 일부이며, Ctx 구조체의 수신자를 통해 액세스합니다.
Ctx.Token.Burn(tokenAsset interface{}) (interface{}, error)
매개변수:
  • tokenAsset - 작업할 토큰 자산에 대한 참조입니다.
반환값:
  • 성공 시 계정 세부정보가 포함된 성공 메시지가 있는 약속입니다. 오류 시 오류 메시지가 있는 nil이 아닌 객체입니다.
예제:

t.Ctx.ERC721Token.Burn(tokenAssetValue.Interface())

{"msg": "Successfully burned NFT token: 'monalisa' from Account-Id: oaccount~42e89f4c72dfde9502814876423c6da630d466e87436dd1aae201d347ad1288d (Org-Id: Org1MSP, User-Id: admin"}