스마트 계약 생성 및 배포

스마트 계약을 생성하려면 다음 이미지의 개체 모델에 표시된 대로 블록체인에서 저장 및 관리할 개체를 정의해야 합니다.


다음은 oracle-blockchain-cms-entity.png에 대한 설명입니다.
oracle-blockchain-cms-entity.png 그림에 대한 설명

이 모든 엔티티 및 해당 관계, 엔티티를 관리하고 상호 작용하는 데 필요한 모든 논리 및 블록체인 원장에 지속하는 데 필요한 모든 논리는 스마트 계약에 정의되어 있습니다.

폴더는 NFT 토큰으로 표시되므로 NFT로 개발 및 초기화됩니다. 다른 종속 개체(문서 및 속성)는 표준 개체이며 폴더의 하위 개체이므로 초기화할 필요 없이 표준 개체로 개발됩니다.

스마트 계약이 생성되면 우리가 만든 Blockchain Network에 설치하고 배포합니다.

스마트 계약 생성

Oracle Blockchain App Builder를 구성한 후에는 사양 파일을 생성할 수 있습니다. 사양 파일은 다음 코드에 표시된 간단한 YAML 파일로 생성할 수 있습니다.

주:

GitHub에서 이 파일을 다운로드할 수도 있습니다. YAML 파일 다운로드.
#
# Token asset to manage the complete lifecycle of a non-fungible token representing a folder to hold docuements. 
# This specification file will generate an Smartcontract project with a non-fungible token for the folders to be maintained by the users.
#
assets:
    - name: folderNFT
      type: token
      symbol: eDocs
      standard: erc721+
      anatomy: 
        type: nonfungible
        unit: whole
      behavior:
        - indivisible
        - singleton
        - mintable:
        - transferable
        - burnable
        - roles:
            minter_role_name: minter
      properties:
          - name: folderHASH
            type: string
          - name: documents
            type: document[]
      metadata:
          - name: folderID
            type: string
            mandatory: true
            id: true
          - name: folderType
            type: string
            mandatory: true
      methods:
        crud: [create, getById, update, delete]
        others: [getHistoryById, getByRange]
    - name: document
      properties:
        - name: docName
          type: string
          mandatory: true
          id: true
        - name: docURL
          type: string
          mandatory: true
        - name: docHASH
          type: string
          mandatory: true
        - name: docType
          type: string
          mandatory: true
        - name: docProperties
          type: docProperty[]
      methods:
        crud: [create, getById, update, delete]
        others: [getHistoryById, getByRange]
    - name: docProperty
      type: embedded
      properties:
          - name: propName
            type: string
            mandatory: true
          - name: propValue
            type: string
            mandatory: true
      methods:
        crud: [create, getById, update, delete]
        others: [getHistoryById, getByRange]
customMethods:
    - executeQuery
    - "attachDocument(tokenId: string, docName: string, docURL: string, docHASH: string, docType: string, docProps: string[], docVals: string[])" # Attach a document to an existing folder. 
    - "retrieveDocuments(tokenId: string)" # Retrieve Documents of an folder. 
    - "transferFolder(tokenId: string, fromOrgId: string, fromUserId: string, toOrgId: string, toUserId: string)" # Transfer the folder among participants. 
    - "updateFolderHASH(tokenId: string, newHash: string)" # Update HASH folder 
    - "getFolderHASH(tokenId: string)" # Check HASH folder 

이 사양 파일에서 정의된 첫번째 엔티티(folderNFT)에서 NFT 토큰 표현에 대한 모든 섹션과 속성을 볼 수 있습니다. 파일에 정의된 섹션의 개요:

  • 자산: 다른 자산(표준 엔티티, FT, NFT)이 정의된 위치에 배치합니다. 각 자산 내에서 우리는 대표 자산의 종류에 따라 달라질 수있는 다른 섹션을 구별 할 수 있습니다. NFT 및 FT의 경우 다음과 같은 여러 하위 섹션이 있습니다.
    • 유형/기호/표준: 이 토큰이 ERC-721 표준을 기반으로 하도록 지정하고 고유한 기호 식별자를 제공합니다.
    • 해부학: NFT를 지정하고 더 작은 분수로 세분화할지 여부를 지정합니다. 요즘은 "전체"가 NFT 토큰에 대한 유일한 옵션입니다.
    • 동작: 토큰을 연동할 수 있는지 여부를 정의합니다. 이 경우 연동 가능한 토큰의 최대 수는 얼마입니까? 여기서 당신은 또한 그것이 분할 할 수없는 토큰이라고 명시해야합니다, 만약 각 클래스에 대한 싱글톤, 전송 가능, 그리고 그것의 삭제와 유사한 화상 (하지만 사라지지 않습니다, 그래서 여전히 거기에 있지만 전혀 사용할 수 없습니다). 또한 이 절에서는 토큰 동작을 특정 역할로 제한할 수 있습니다.
    • 메타데이터: 토큰 생성 중 설정해야 하며 나중에 변경할 수 없는 일종의 등록 정보를 정의합니다. 따라서 해당 값은 토큰의 전체 수명 동안 변경 불가능한 상태로 유지됩니다.
    • 등록 정보: 폴더를 구성하는 문서 배열과 같이 토큰 수명 동안 달라질 수 있는 토큰의 표준 속성을 정의합니다.
  • customMethods: 사용자정의 메소드 목록을 정의해야 하는 위치입니다. 이러한 방법의 경우 Oracle Blockchain App Builder는 구현 없이 메소드의 서명만 생성합니다. 이러한 메소드의 구현은 개발자가 구현할 수 있는 유일한 코드입니다.

다음 링크는 비즈니스 요구에 따라 모든 종류의 개체(NFT, FT 또는 표준 개체)를 구성하는 방법에 대해 설명합니다.

사양 파일이 생성되면 다음 단계에 따라 Oracle Blockchain App Builder에서 프로젝트의 스캐폴드를 생성하도록 지정할 수 있습니다.

  1. 사양 파일이 Oracle Blockchain App Builder 외부에서 생성된 경우 Oracle Blockchain App Builder로 사양 파일을 임포트해야 합니다. 사양 프레임 옆에 있는 줄임표를 누르고 팝업에서 사양 임포트를 누릅니다.
  2. 사양 파일을 선택하고 사양 임포트를 누릅니다.
  3. 임포트된 사양 파일을 기반으로 새 체인코드 프로젝트를 생성할 수 있으려면 CHAINCODES 프레임의 오른쪽 상단 모서리에 있는 + 아이콘을 누릅니다. 체인코드 생성 마법사가 열립니다.
  4. 체인 코드 생성 마법사에서 다음 세부정보를 지정해야 합니다.
    • 이름: 프로젝트의 이름입니다.
    • 언어: 프로젝트의 스캐폴드를 생성하는 언어입니다. Typescript와 GoLang 중 하나만 선택할 수 있습니다. 이 솔루션 플레이북의 Typescript를 사용하여 사용자 정의 방법을 구현할 때는 Typescript를 선택하는 것이 좋습니다.
    • 사양: 이전 단계에서 방금 생성한 사양 파일을 선택합니다.
    • 위치/도메인: 선택한 언어에 따라 Typescript 언어 또는 GoLang 언어의 도메인에 대해 프로젝트가 배치될 위치를 정의하라는 메시지가 표시됩니다.
    모든 세부 정보가 올바르면 마법사에 녹색 메시지가 표시됩니다. 그렇지 않은 경우 프로젝트의 스캐폴드를 만드는 동안 생성된 출력을 확인합니다.
  5. CHAINCODES 섹션에 새로 생성된 프로젝트가 표시됩니다. 프로젝트를 누르고 소스 코드가 생성된 프로젝트 내의 src 폴더로 이동합니다.
    • src/controller 폴더 안에는 엔티티를 관리하는 모든 자동 생성된 메소드와 함께 스마트 계약을 나타내는 기본 클래스가 표시됩니다.
    • src/model 폴더 안에 NFT 엔티티를 나타내는 클래스가 표시됩니다.
  6. src/controller 폴더로 이동하여 컨트롤러 클래스를 선택하면 Oracle Blockchain App Builder에서 자동으로 생성되는 모든 코드가 표시되고 파일 끝으로 이동하면 사용자 정의 메소드의 모든 서명이 구현되지 않고 표시됩니다.
  7. 이 시점에서 사용자정의 메소드의 구현을 생성해야 합니다. 간소화를 위해 GitHub에서 제공되는 CMS_customMethods.ts 파일에서 해당 메소드에 대한 모든 구현 코드를 제공했습니다. Oracle Blockchain App Builder에서 자동 생성된 서명만 참조된 파일의 콘텐츠로 대체하면 됩니다.
사용자 정의 메소드 앞에 있는 Controller 클래스에는 NFT 토큰의 수명 주기를 관리하기 위한 모든 자동 생성 코드가 포함됩니다. 다음 이미지는 이러한 방법으로 다루는 여러 영역을 보여줍니다.

oracle-blockchain-nft-token-oracle.zip

이제 체인코드를 사용할 준비가 되었으므로 Test Your Chaincode on a Local Hyperledger Fabric Network의 지침에 따라 로컬에서 체인코드를 배포하고 테스트할 수 있습니다.

스마트 계약 배포

체인코드를 로컬에서 테스트했으면 다음을 수행하여 이전에 Oracle Blockchain Service Console을 사용하여 생성한 실제 네트워크에 해당 체인코드를 배포합니다.

  • chaincode 프로젝트를 패키지화합니다.
  • 단일 인스턴스(설립자)에 체인코드 패키지 설치 및 배포
다음 절에서는 배치를 실행하는 세부 단계에 대해 설명합니다.
  1. 체인 코드 프로젝트에서 배치 가능한 패키지를 생성합니다. Visual Studio에서 체인코드 프로젝트 이름 위에 있는 오른쪽 단추를 누르고 팝업 메뉴에서 패키지 옵션을 선택한 다음 체인코드 패키지 파일을 저장할 디렉토리를 선택합니다.
  2. Oracle Blockchain Service Console에 액세스하여 설립자 인스턴스에 체인코드 패키지를 설치하고 배포합니다.
  3. 체인 코드 탭으로 이동하고 새 체인 코드 배포를 누릅니다.
  4. 고급 배치 옵션을 선택합니다.
  5. 체인 코드 패키지를 설립자 인스턴스에 설치할 모든 값을 설정하고 다음을 누릅니다.
    • 패키지 레이블: 다른 기존 채널에 설치된 패키지를 식별하는 데 유용한 이름을 제공합니다. 여러 채널에 배포된 동일한 스마트 계약의 버전을 두 개 이상 사용할 수 있으므로 다음과 같이 패키지 레이블 이름을 설정하는 것이 좋습니다.
      <smartContractName>_<channel>_<version>
      
    • 체인코드 언어: 체인코드를 개발한 언어를 기반으로 여러 언어 중에서 선택합니다.
    • 대상 피어: 체인코드 패키지를 설치할 피어를 선택합니다.
    • 패키지화된 체인코드임: zip 파일을 업로드하는 경우 이 체크박스를 선택 취소된 상태로 둡니다. tar.gz 파일의 확인란을 선택합니다.
    • 체인코드 소스: 체인코드 파일 업로드를 누르고 체인코드 zip 파일을 선택합니다.
  6. 설치가 성공하면 성공 메시지가 표시됩니다. 다음 단계는 선택한 채널에 체인 코드를 배포하는 것입니다. 따라서 배포 단계와 관련된 모든 값을 설정하고 다음을 눌러야 합니다.
    • 채널: 스마트 계약을 배포할 채널을 선택합니다.
    • 체인코드 이름: 스마트 계약이 채널에 배포될 이름을 설정합니다.
    • 버전: 이 배치에 번호를 지정합니다. 이 배치는 이전에 설치된 패키지와 일치합니다. 이렇게 하면 설치된 패키지와 다른 채널에 배포된 체인코드를 상관시킬 수 있습니다.
    • 초기 필요: 사용자 트랜잭션을 허용하기 전에 체인 코드의 init 메소드를 호출해야 하는 경우 이 체크박스를 선택합니다.
    • 보증 정책: 배치 중 보증 정책을 지정합니다. 이 솔루션 플레이북 예에서는 보증 정책을 사용하지 않습니다.
    • 전용 데이터 수집: 필요한 경우 전용 데이터 수집을 설정합니다. 이 솔루션 플레이북 예에서는 개인 데이터 수집을 설정하지 않습니다.
배치가 성공하면 설치 및 배치를 닫은 후에 패키지가 인스턴스의 두 피어에 어떻게 설치되었는지 확인하고 채널 중 하나에서 인스턴스화되어야 합니다.

스마트 계약 초기화

FT 및 NFT 토큰을 처리할 때는 비즈니스 방법을 실행하기 전에 실행할 관리 작업 세트가 있습니다. Oracle Blockchain을 사용하면 모든 관리 작업을 간단한 REST 호출로 실행할 수 있으며 스마트 계약을 초기화하는 데 필요한 작업을 상당히 줄일 수 있습니다.

주:

다음 단계 중 하나를 실행하기 전에 스마트 계약 방법에 대한 접근 권한이 부여된 사용자에 대한 REST 프록시로 enrollmentIDs를 생성해야 합니다. 등록은 REST API를 호출하는 사용자 이름과 REST 프록시 노드에서 등록 생성 항목에 설명된 대로 토큰이 지정될 블록체인에 의해 내부적으로 관리되는 계정 간의 매핑입니다.

다음 Postman 모음을 사용하여 스마트 계약을 쉽게 초기화할 수 있습니다. Postman 모음 다운로드

이 Postman 모음의 AdminSteps 폴더에는 스마트 계약 초기화를 위해 실행할 세 가지 요청 호출이 있습니다.

Postman 컬렉션을 사용할 준비가 되었지만 사용자 환경에 맞게 구성해야 하는 변수 집합(암호, URL 등)이 있습니다. 이러한 변수는 Postman 컬렉션의 변수 탭에서 설정됩니다. 다음 표에서는 정의한 모든 변수를 보여 주며 사용자 환경에 맞게 조정해야 합니다.

변수 이름 변수 값
bc_founder_provider_url https://org1-w....
bc_timeout 60000
bc_nft_founder_userid1 cmsleg001
bc_nft_founder_userid1_pwd 비밀번호
bc_nft_founder_userid2 cmsfin001
bc_nft_founder_userid2_pwd 비밀번호
bc_nft_founder_userid3 cmsrsk001
bc_nft_founder_userid4_pwd 비밀번호
bc_channel_name 쐐기풀
bc_chaincode_name WEDOCMS

블록체인 서비스 콘솔에서 REST API에 접근할 수 있는 엔드포인트를 찾습니다.

  1. OCI 콘솔을 통해 블록체인 서비스 콘솔에 액세스합니다.
  2. 노드 탭으로 이동합니다. 이 인스턴스를 구성하는 모든 노드가 표시되며, restproxy 노드에서는 경로 열에 끝점 URL이 표시됩니다.
    등록은 네트워크 레벨이 아닌 인스턴스 레벨에서 생성되므로 설립자 인스턴스의 restproxy URL을 통해서만 사용자에 대한 등록을 사용할 수 있으므로 새 인스턴스가 네트워크에 가입하면 됩니다. 새 사용자가 네트워크에 액세스할 수 있는 경우 해당 사용자가 적절한 테넌시에 존재해야 하며 해당 사용자에 대한 등록도 해당 인스턴스의 restproxy에 생성되어야 합니다.
Postman 컬렉션이 제대로 구성되면 스마트 계약 초기화를 진행할 수 있습니다. NFT 스마트 계약의 초기화는 FT 스마트 계약의 초기화보다 훨씬 간단합니다. 다음 세 단계를 실행하면 됩니다.
  1. 스마트 계약 초기화(관리 사용자 계정 시작).
  2. NFT 토큰을 소유할 수 있는 사용자를 위한 지갑을 생성합니다.
  3. 해당 권한을 가져야 하는 유저에 대해 최소 롤을 지정합니다.
다음 API REST 호출은 제공된 Postman 모음에서 AdminSteps 폴더로의 호출에 해당합니다.
  1. 관리 작업을 실행할 수 있는 사용자 계정을 나타내는 체인 코드(Step-0: Init Admin User Account)를 초기화합니다. init 메소드의 인수를 올바르게 설정해야 합니다(args: Scaped array of user_ids with their org_ids).
    
    {
        "chaincode": "{{bc_nft_chaincode_name}}",
        "args": [
            "init",
            "[{\"orgId\":\"org1\",\"userId\":\"cmsleg001\"},{\"orgId\":\"org1\",\"userId\":\"cmsfin001\"},{\"orgId\":\"org1\",\"userId\":\"cmsrsk001\"}]"
        ],
        "timeout": {{bc_timeout}},
        "isInit": true,
        "sync": true
    }
    
  2. 물리적 자산을 나타내는 NFT 자산의 관리인이 될 수 있는 모든 사용자에 대한 사용자 계정을 만듭니다. 이 작업은 Step-1: Create account Postman 요청을 실행하여 수행할 수 있습니다. 사용 사례의 세부 사항에는 네트워크에 속한 동일한 단일 조직과 관련된 세 명의 사용자만 있습니다. 이 호출은 계정을 만들 사용자 수만큼 실행해야 합니다. 이 경우 세 번씩 다음 매개변수를 사용합니다.
    • "createAccount", "org1", "cmsleg001", "nonfungible"
    • "createAccount", "org1", "cmsfin001", "nonfungible"
    • "createAccount", "org1", "cmsrsk001", "nonfungible"
    
    {
        "chaincode": "{{bc_nft_chaincode_name}}", //Smartcontract name
        "args": [
            "createAccount", "org1","cmsleg001","nonfungible" //Method, OrgID, UserID, fungible for FT / nonfungible for NFT
        ],
        "timeout": 60000,
        "sync": true
    }
    
  3. 토큰을 민트할 수 있는 사용자를 설정합니다. 이 경우 토큰 민트는 새 문서 세트를 보유할 새 폴더를 생성하므로 세 명의 기존 사용자(cmsleg001, cmsfin001 또는 cmsrsk001) 중 이러한 작업을 실행할 수 있는 사용자를 결정할 수 있으며, 해당 사용자에 대해 Postman 모음의 Step-2: AddRole 요청을 실행할 수 있습니다.
    
    {
        "chaincode": "{{bc_nft_chaincode_name}}", //Smartcontract name
        "args": [
            "addRole", //Method name
            "minter","org1","cmsleg001" //Role, OrgId, UserID
            ],
        "timeout": 60000,
        "sync": true
    }