블록체인/HYPERLEDGER FABRIC

HYPERLEDGER FABRIC- Developing Applications - Application design elements - Contract names

펭귀니 :) 2020. 9. 2. 15:51

독자 : Architects, application and smart contract developers, administrators

 

체인코드는 Hyperledger Fabric 블록체인 네트워크에 코드를 배포하기 위한 일반적인 컨테이너입니다.

하나 이상의 관련 smart contract는 체인코드내에 정의됩니다.

모든 smart contract는 체인코드내에서 고유하게 식별가능한 이름을 가지고 있습니다.

application은 contract name을 사용하여 인스턴스화된 체인코드내에서 특정 smart contract에 액세스합니다.

 

이번 주제에서는 아래의 것들을 다룹니다.

 

Chaincode (How a chaincode contains multiple smart contracts)

Developing Application 주제에서 Fabric SDK는 Fabric 네트워크와 상호작용하는 방법의 낮은 수준의 세부사항보다 application과 smart contract 개발자가 그들의 비즈니스 문제에 집중하는 것을 도우는 높은 레벨의 프로그래밍 추상화를 제공합니다.

 

smart contract는 높은 수준의 프로그래밍 추상화의 한 예이며, 체인코드 컨테이너안에서 smart contract를 정의할 수 있습니다.

체인코드가 설치되고 인스턴스화될 때, 그 안의 모든 smart contract는 해당 채널에서 사용할 수 있습니다.

체인코드 내에서 여러 스마트 계약은 정의될 수 있습니다. 각각은 체인코드내에서 그들의 이름으로 고유하게 식별됩니다.

 

위의 다이어그램에서 체인코드 A는 세개의 스마트 계약을 가지고 있는 반면 체인코트 B는 4개의 스마트 계약을 가지고 있습니다.

체인코드 이름이 특정 스마트 계약을 완전히 검증하는데 어떻게 사용되는지 확인하세요.

 

원장 구조는 배포된 스마트 계약 집합에 의해 정의됩니다.

이는 원장이 네트워크(PaperNet내의 기업 어음 같은)에 관련된 비즈니스 객체에 대한 사실을 포함하고 있고, 이러한 비즈니스 객체는 스마트 계약 내에 정의된 트랜잭션 기능에 의해 그들의 라이프사이클(issue, buy, redeem)을 통해 이동되기 때문입니다.

 

대부분의 경우 체인코드는 하나의 스마트 계약만 정의되어 있습니다.

하지만, 단일 체인코드에서 관련된 스마트 계약을 함께 유지하는게 합리적일 수 있습니다.

예를 들어, 다른 통화로 표시된 기업 어음은 EuroPaperContract, DollarPaperContract, YenPaperContract를 가지고 있으며, 그들이 배포된 채널안에서 서로 동기화 상태로 유지해야 할 수도 있다.

 

Name (How to assign a smart contract name)

체인코드내의 각 스마트 계약은 그들의 계약 이름으로 고유하게 식별됩니다.

class가 생성될 때 스마트 계약은 명시적으로 그 이름을 할당하거나 contract class는 암시적으로 기본 이름을 할당할 수 있습니다.

 

papercontract.js 체인코드 파일을 조사헤봅시다.

class CommercialPaperContract extends Contract {

    constructor() {
        // Unique name when multiple contracts per chaincode file
        super('org.papernet.commercialpaper');
    }

CommercialPaperContract 생성자는 contract name을 org.papernet.commercialpaper로 지정한 것을 확인하세요.

그 결과 papercontract 체인코드내에서 이 스마트 계약은 contarct name인 org.papernet.commercialpaper과 연결됩니다.

 

만약 명시적 계약 이름이 지정되지 않았다면, 클래스 이름으로 기본 이름이 지정됩니다.

우리의 예에서는 기본 계약 이름은 CommercialPaperContract입니다.

 

이름을 신중하게 선택하세요.

각 스마트 계약이 꼭 고유한 이름을 가져야하는 것은 아닙니다. 잘 선택된 이름은 빛을 발합니다.

특히 DNS스타일 네이밍 컨벤션을 사용하는 것은 명확하고 의미있는 이름을 구성하는데 도움이 됩니다.

org.papernet.commercialpaper은 PaperNet 네트워크가 표준 기업 어음 스마트 계약을 정의했음을 전달합니다.

 

주어진 체인코드에서 Contract name은 동일한 이름을 가진 다양한 스마트 계약 트랜잭션 기능의 차이를 분명히 보여주는데 도움이 됩니다.

이것은 스마트 계약들이 밀접한 관련이 있을 때 발생합니다. 그들의 트랜잭션 이름은 같은 경향이 있습니다.

트랜잭션은 채널안에서 체인코드와 스마트 계약 이름의 조합에 의해 고유하게 정의됨을 알 수 있습니다.

 

계약 이름은 체인코드 파일안에서 유니크해야합니다.

일부 코드 에디터는 배포하기 전에 동일한 클래스 이름이 여러개 정의되어 있는 것을 감지합니다.

동일한 계약 이름을 가진 여러 클래스가 명시적으로 또는 암시적으로 지정된 경우 체인코드는 에러를 반환할 것입니다.

 

Application (How to use a smart contract from an application)

체인코드가 peer에 설치되고 채널에 인스턴스화 되면, 그 안에 있는 스마트 계약은 application에 액세스할 수 있습니다.

const network = await gateway.getNetwork(`papernet`);

const contract = await network.getContract('papercontract', 'org.papernet.commercialpaper');

const issueResponse = await contract.submitTransaction('issue', 'MagnetoCorp', '00001', '2020-05-31', '2020-11-30', '5000000');

application이 contract.getContract() 함수로 스마트 계약에 액세스하는 방법을 확인하세요.

papercontract 체인코드 이름 org.papernet.commercialpaper은 contract.submitTransaction() API로 기업 어음을 발행하기 위해 트랜잭션을 제출하는데 사용할 수 있는 contract 참조를 반환합니다.

 

Default contract (The default smart contract)

체인코드에 정의된 첫번째 스마트 계약은 기본 스마트 계약(default smart contract)이라고 합니다.

하나의 체인코드는 대개 하나의 스마트 계약이 정의되어 있기 때문에 default는 도움이 됩니다.

default는 application이 지정된 계약 이름 없이 트랜잭션에 직접 접근할 수 있게 합니다.

default smart contract는 체인코드에 정의된 첫번째 contract입니다.

 

이 다이어그램에서 CommercialPaperContract는 default smart contract입니다.

비록 우리는 두 개의 스마트 계약을 가지고 있지만, default smart contract는 우리의 이전 예제를 더 쉽게 작성할 수 있습니다.

const network = await gateway.getNetwork(`papernet`);

const contract = await network.getContract('papercontract');

const issueResponse = await contract.submitTransaction('issue', 'MagnetoCorp', '00001', '2020-05-31', '2020-11-30', '5000000');

papercontract의 default smart contract는 CommercialPaperContract이고 그것은 issue 트랜잭션을 가지고 있기 때문에 작동합니다.

BondContractissue 트랜잭션은 명시적으로 취급해야만 호출할 수 있다는 점에 유의해야합니다.

마찬가지로, cancel 트랜잭션은 고유할지라도, BondContract는 default smart contract가 아니기 때문에 그것은 명시적으로 호출해야합니다.

 

대부분의 경우, 체인코드는 단일 스마트 계약만 포함하므로, 체인코드 이름을 신중하게 지으면 개발자가 체인코드를 개념적으로 생각할 필요성을 줄일 수 있습니다.

예제 코드에서  papercontract는 스마트 계약처럼 느껴집니다.

 

요약하면, 계약 이름은 주어진 체인코드에서 개별적인 스마트 계약을 식별하기 위한 단순한 매커니즘입니다.

계약 이름은 application이 특정 스마트 계약을 쉽게 찾아 이를 사용하여 원장에 접근할 수 있게 합니다.

 

 

출처 ]

hyperledger-fabric.readthedocs.io/en/release-1.4/developapps/contractname.html#