토큰화

토큰화는 물리적 또는 디지털 자산이 토큰으로 표현되는 프로세스로, 블록체인에서 전송, 추적 및 저장할 수 있습니다.

자산을 토큰으로 표현함으로써 블록체인 원장을 사용하여 자산의 상태와 소유권을 설정하고, 표준 블록체인 플랫폼 기능을 사용하여 자산 소유권을 이전할 수 있습니다.

Blockchain App Builder에는 토큰화 지원이 포함되어 있습니다. 토큰 클래스 및 메소드가 자동으로 생성되고 개발자가 토큰에 대한 복잡한 비즈니스 논리를 만들 수 있도록 추가 토큰 메소드가 제공됩니다. 자동으로 생성된 프로젝트에는 토큰 수명 주기 클래스 및 함수, CRUD 메소드 및 추가 토큰 SDK 메소드가 포함되며 인수 자동 검증, 마셜링/마셜링 해제 및 투명한 지속성 기능을 지원합니다. 이러한 제어기 방법을 사용하여 토큰을 초기화하고, 액세스를 제어하고, 계정을 설정하고, 역할을 관리하고, 토큰의 수명 주기를 관리할 수 있습니다.

다음 다이어그램은 토큰 API 및 토큰 SDK를 포함하여 Blockchain App Builder에서 구현하는 토큰 아키텍처를 보여줍니다.토큰 아키텍처 다이어그램

자동 생성된 토큰 API
Blockchain App Builder는 토큰 및 토큰 수명 주기를 지원하는 메소드를 자동으로 생성합니다. 이러한 방법을 사용하여 추가 코딩 없이 토큰을 초기화하고, 역할 및 계정을 관리하고, 기타 토큰 수명 주기 작업을 완료할 수 있습니다.
토큰 SDK
토큰 SDK에는 토큰 애플리케이션에 대한 복잡한 비즈니스 논리를 개발하는 데 도움이 되는 방법이 포함되어 있습니다.
MVCC(Multiversion Concurrency Control) 최적화
토큰 체인 코드에 대한 MVCC 최적화는 전송, 민트, 레코딩 및 보류 작업에 대한 오류를 줄일 수 있습니다.

토큰 및 계정/잔액 모델

Blockchain App Builder는 실행 가능한 토큰과 실행 불가능한 토큰을 지원합니다.

대체 가능한 토큰에는 교환 가능한 값이 있습니다. 대체 가능한 토큰의 수량은 동일한 토큰 클래스의 다른 동일한 수량과 동일한 값을 가집니다. 불가능한 토큰은 고유합니다. 토큰은 전체 또는 소수일 수도 있습니다. 소수점 토큰은 지정된 소수점 자릿수에 따라 더 작은 부분으로 세분화할 수 있습니다.

토큰은 동작으로도 설명될 수 있습니다. 대체 가능한 토큰에 대해 지원되는 동작은 mintable, transferable, divisible, holdable, burnableroles(minter, burnerholder)입니다. 불가능한 토큰에 대해 지원되는 동작은 mintable, transferable, singleton, indivisible, burnableroles(minterburner)입니다.

토큰화 기능은 계정/잔액 모델을 사용하여 토큰화된 자산을 계정의 잔액으로 나타냅니다. 계정은 예금 및 이체 및 기타 시/도 전환이 계정의 잔액에 영향을 주는 일반적인 은행 계정과 유사합니다. 트랜잭션 금액이 적합하도록 모든 계정의 잔액이 전역적으로 추적됩니다. 보류 중인 잔액(유용 토큰의 경우) 및 트랜잭션 내역도 추적됩니다.

토큰을 소유하거나 토큰 관련 작업을 완료하는 모든 사용자는 네트워크에 계정이 있어야 합니다. 모든 계정은 고유 ID(account_id)로 식별됩니다. 계정 ID는 인스턴스 소유자의 사용자 이름 또는 전자메일 ID(user_id) 또는 인스턴스에 로그인한 사용자를 현재 네트워크 조직에 있는 사용자의 멤버쉽 서비스 제공자 ID(org_id)와 결합하여 생성됩니다. 계정 생성을 위한 즉시 사용 가능한 방법이 제공됩니다. 계정 ID에는 조직 ID가 포함되어 있으므로 여러 조직에서 사용자를 지원할 수 있습니다.

토큰 표준

Blockchain App Builder는 토큰 분류법 프레임워크, ERC-721 표준 및 ERC-1155 표준의 표준 및 분류를 확장하여 토큰의 해부학 및 동작을 정의합니다.

ERC-1155는 NFT(fungible tokens) 및 NFT(non-fungible tokens)를 모두 지원하는 표준입니다. ERC-721은 NFT에 대한 표준입니다. 토큰 분류법 프레임워크는 토큰 분류법 이니셔티브에 의해 개발되었습니다. 자세한 내용은 토큰 분류법 프레임워크를 참조하십시오.

다음 표에서는 Blockchain App Builder에서 지원하는 토큰 유형에 대해 설명합니다.
표준 지원되는 토큰 유형
토큰 분류 프레임워크
  • 분수 균류 토큰
에르크-721
  • 전체적인 non-fungible 토큰
에르크-1155
  • 전체 곰팡이 토큰
  • 분수 균류 토큰
  • 전체적인 non-fungible 토큰
  • 소수점 비fungible 토큰

토큰화 플로우

Blockchain App Builder는 입력 사양 파일 구문을 확장하여 토큰화를 지원하므로 CLI 또는 Visual Studio Code를 사용하여 다른 프로젝트를 생성하는 것과 동일한 방식으로 토큰별 프로젝트를 생성합니다.

Blockchain App Builder로 프로젝트를 생성하는 방법에 대한 자세한 내용은 입력 사양 파일을 참조하십시오.

토큰 워크플로우 다이어그램
일반적인 토큰화 플로우는 다음 기본 단계를 따릅니다.
  • 사용할 토큰 표준을 결정합니다.
  • 지정할 토큰 동작(mintable, transferable, divisible, indivisible, singleton, holdable, burnableroles)을 결정합니다.
  • 입력 사양 파일에서 토큰 자산 및 해당 속성을 정의합니다.
  • 입력 사양 파일에서 체인 코드 프로젝트를 스캐폴드합니다. 그러면 토큰 자산 정의 및 해당 등록 정보가 포함된 모델과 토큰의 동작 및 메소드가 포함된 컨트롤러를 포함하여 스캐폴드된 프로젝트가 생성됩니다.
  • 체인코드 프로젝트를 배치하고 테스트합니다.
토큰 기반 프로젝트를 배포한 후 토큰 생성 및 수명 주기 작업 완료를 위한 일반적인 플로우는 다음 단계를 따릅니다.
  • 토큰 체인 코드가 배치됩니다. 초기화 메소드로 전달된 목록의 사용자는 체인 코드의 Token Admin 사용자가 됩니다.
  • 토큰화된 자산이 초기화되어 토큰의 특정 인스턴스에 대한 고유 식별자인 token_id를 생성합니다.
  • 토큰을 소유하거나 토큰 관련 작업을 완료할 모든 사용자에 대해 계정을 만들어야 합니다.
  • 토큰에 대해 roles 동작이 지정된 경우 사용자에게 롤을 지정해야 토큰 관련 작업을 완료할 수 있습니다.
  • 그런 다음 토큰 자산에 대해 지정된 동작에 따라 토큰 수명 주기 메소드를 사용할 수 있습니다. 예를 들어, 계정에 대한 토큰을 민트하는 메소드를 호출할 수 있습니다.

액세스 제어

토큰화 지원에는 역할 기반 제어 메커니즘과 소유권 기반 제어 메커니즘을 모두 지원하는 액세스 제어 기능이 포함됩니다.

사용자는 롤 기반 제어를 사용하여 Token Admin 또는 Token Minter와 같은 연관된 롤을 가진 특정 메소드를 호출할 수 있습니다. 소유권 기반 제어를 사용하면 사용자가 소유하지 않은 자산에 액세스하지 못하도록 제한할 수 있습니다. 소유권 기반 액세스 제어를 사용하면 자산을 소유한 사용자(예: Token Owner 또는 Account Owner)가 특정 메소드를 호출할 수 있습니다. 메소드에 대한 액세스 제어에 대한 자세한 내용은 다음 항목에 설명된 메소드에 대한 개별 항목을 참조하십시오.
역할 기반 액세스 제어는 다음 페르소나를 지원합니다.
토큰 관리
Token Admin 사용자는 토큰 체인 코드가 배포될 때 지정할 수 있습니다. Token Admin 사용자 정보는 상태 데이터베이스에 저장됩니다. Token Admin 사용자는 다른 사용자에 대해 Token Admin 권한을 부여하고 제거할 수 있습니다. Token Admin 사용자는 자신의 Token Admin 권한을 제거할 수 없습니다. Token Admin 사용자는 모든 사용자에게 Org Admin, 광부, 버너 또는 공증 역할을 지정할 수 있습니다.
조직 관리
확장된 토큰 분류법 프레임워크 메소드는 Org Admin 역할을 지원합니다. Token Admin 사용자는 모든 사용자에게 Org Admin 롤을 지정할 수 있습니다. Org Admin 사용자는 조직 내에서만 관리 권한을 가집니다. 계정을 만들거나 계정 잔액을 볼 수 있지만 조직의 사용자에 대해서만 볼 수 있습니다. Org Admin 광부, 버너 또는 공증인 역할이 있는 사용자는 해당 역할을 조직의 다른 사용자에게 지정할 수 있습니다.
토큰 마이너
minter 역할이 지정된 사용자는 Token Minter이며 토큰을 민트할 수 있습니다.
토큰 버너
버너 역할이 지정된 사용자는 Token Burner이며 토큰을 레코딩할 수 있습니다.
토큰 공증
공증인 역할이 지정된 사용자는 Token Notary입니다. Token Notary는 지급인과 수취인 간 거래에서 제3자의 역할을 합니다. Token Notary는 지불인에서 수취인으로의 토큰 이전 완료를 트리거하거나 대신 지불인 계정에 토큰을 반환할 수 있습니다.
저장소 관리자
저장소 롤이 지정된 사용자는 Vault Manager입니다. Vault Manager는 잠긴 NFT를 잠금 해제할 수 있습니다. 볼트 역할은 확장된 ERC-721 및 ERC-1155 표준에만 적용됩니다. 사용자에게 저장소 역할을 지정하는 것은 NFT 잠금을 위한 전제 조건입니다. 체인코드당 한 명의 사용자에게만 저장소 역할을 지정할 수 있습니다.
토큰 감사자
Digital Assets Edition 전용: 확장된 토큰 분류법 프레임워크 메소드는 Token Auditor 역할을 지원합니다. 이 역할은 Token Admin 역할과 비슷하지만 읽기 전용입니다.
조직 감사자
Digital Assets Edition 전용: 확장된 토큰 분류법 프레임워크 메소드는 Org Auditor 역할을 지원합니다. 이 역할은 Org Admin 역할과 비슷하지만 읽기 전용입니다.
소유권 기반 액세스 제어는 다음 페르소나를 지원합니다.
계정 소유자
계정이 있는 모든 사용자는 Account Owner입니다.
토큰 소유자
현재 융통성 없는 토큰을 소유한 사용자는 해당 토큰의 Token Owner입니다.

역할 기반 액세스 제어 및 소유권 기반 액세스 제어도 일부 방법으로 결합됩니다. 예를 들어, 역할 기반 액세스 제어를 사용하면 minter 역할을 가진 사용자가 토큰을 만들 수 있습니다. 소유권 기반 액세스 제어를 사용하면 융통성 없는 토큰 소유자가 토큰의 사용자정의 속성을 수정할 수 있지만 토큰 메타데이터는 수정할 수 없습니다. minter 역할을 가진 사용자가 NFT(정지할 수 없는 토큰)를 만들면 NFT의 소유자가 됩니다. 해당 NFT의 소유자는 사용자정의 속성을 수정할 수 있습니다(아트 수집 토큰의 경우 토큰 가격은 사용자정의 속성임). 토큰 생성자가 NFT를 다른 사용자에게 전송한 후 두번째 사용자는 소유자가 되고 토큰을 생성한 사용자는 더 이상 토큰의 소유자가 아닙니다. 소유권 기반 접근 제어로 인해 이제 새 소유자가 사용자정의 속성 값을 업데이트할 수 있지만 이전 소유자는 더 이상 업데이트할 수 없습니다. 롤 기반 액세스 제어로 인해 이전 소유자는 여전히 NFT를 조율할 수 있지만 새 사용자는 이를 수행할 수 없습니다.

자체 액세스 제어 기능을 작성하거나 액세스 제어를 비활성화할 수도 있습니다. 액세스를 제어하는 자동으로 생성된 코드는 다음 예에 나와 있습니다.

TypeScript:
await this.Ctx.<Token Standard>Auth.checkAuthorization(...)
이동:
auth, err := t.Ctx.<Token Standard>Auth.CheckAuthorization(...)

주:

자동으로 생성된 액세스 제어 함수를 제거하려면 TypeScript 또는 Go 프로젝트에서 이전 코드 행을 제거합니다.

MVCC 최적화

Hyperledger Fabric 데이터베이스는 다중 버전 동시성 제어(MVCC)를 사용하여 이중 지출 및 데이터 불일치를 방지합니다.

동일한 상태가 업데이트되면 새 버전의 레코드가 이전 버전을 덮어씁니다. 블록에서 동일한 키를 업데이트하는 동시 요청이 있는 경우 MVCC_READ_CONFLICT 오류가 생성될 수 있습니다.

전송, 민트, 레코딩 및 보류 작업에 대한 MVCC 오류를 줄이려면 토큰 체인 코드에 대해 MVCC 최적화를 사용으로 설정할 수 있습니다. 이 최적화는 Oracle Blockchain Platform에서만 작동합니다. 기본적으로 최적화는 비활성화되어 있습니다. 최적화를 사용으로 설정하려면 적용 가능한 다음 단계를 완료하십시오.

  • CLI: ochain init 명령을 사용하여 부울 -m 또는 --enable_mvcc_optimization 매개변수를 지정합니다. 기본적으로 이 매개변수는 false로 설정됩니다. 최적화를 사용으로 설정하려면 ochain init 명령줄에 -m true를 추가합니다.
  • Visual Studio 코드: 체인 코드를 생성할 때 체인 코드 생성 창에서 MVCC 최적화 사용을 선택합니다.

이전 버전의 Blockchain App Builder에서 생성된 체인 코드로 최적화를 사용하려면 다음 단계를 완료하십시오.

  1. 최신 버전의 Blockchain App Builder를 설치한 후 Upgrading Chaincode Projects in the CLIUpgrading Chaincode Projects in Visual Studio Code에 설명된 대로 체인코드를 업그레이드하십시오.
  2. 체인 코드의 루트 폴더에서 .ochain.json 파일을 편집하여 enableMvccOptimizationtrue로 설정합니다.
  3. 최적화를 추가하고 체인 코드의 루트 폴더에 두 개의 새 폴더(statedbtokens)를 생성하는 체인 코드를 동기화합니다. 동기화에 대한 자세한 내용은 생성된 소스 코드와 사양 파일 변경 동기화생성된 소스 코드와 사양 파일 변경 동기화를 참조하십시오.

MVCC_READ_CONFLICT 오류를 해결하는 다른 방법에는 이 오류가 생성될 때 클라이언트 응용 프로그램 재시도 요청이 있거나, 대기열을 사용하여 동시 요청을 블록체인 네트워크로 전송하기 전에 캡처하는 방법이 포함됩니다. 자세한 내용은 Hyperledger Fabric 설명서의 Read-Write set semantics를 참조하십시오.

주:

MVCC 최적화는 Oracle Blockchain Platform 및 Hyperledger Fabric 피어를 모두 포함하는 하이브리드 네트워크 또는 로컬 Hyperledger Fabric 네트워크에서 테스트할 때 작동하지 않습니다. 하이브리드 네트워크에서 MVCC 최적화를 사용으로 설정하지 마십시오. 이로 인해 피어 간에 불일치가 발생할 수 있습니다.