2016-09-09 3 views
0

"정확히 무슨 일이 일어 났나?"하이퍼 리더 체인 코드 "register"vs "deploy"

"등록"체인 코드의 경우 체인 노드 작성자가 다른 노드가 네트워크에서 체인 코드를 찾고 해당 로컬에 소스를 다운로드하고 도커 이미지를 빌드하기 전에 체인 코드를 ValidationPeer에 등록해야합니다. 이후에 동일한 체인 코드가 여러 번 배포되면 어떻게됩니까? 이전 상태를 덮어 쓰시겠습니까?

참조 : "배포"체인 코드가 네트워크의 모든 노드에 거래의 형태로 원장에게 제출하고 배포되는 동안 What happened exactly on chaincode deploy and invoke , query, in Hyperledger?

. 각 노드는이 체인 코드가 포함 된 새 Docker 컨테이너를 만듭니다. 컨테이너가 시작되고 Init 메소드가 실행됩니다.

"쿼리"중 - 체인 코드는 현재 상태를 읽고 사용자에게 다시 보냅니다. 이 트랜잭션은 블록 체인에 저장되지 않습니다.

"호출"중 - 체인 코드는 원장의 변수 상태를 수정할 수 있습니다. 각 "Invoke"트랜잭션은 원장의 "블록"에 추가됩니다.

답변

3

체인 코드 수준에서 "등록"기능을 보지 못했습니다. 우리가 핵심 API 방법 "등록자"에 대해 말하고있는 가정을 할 수 있습니다.

"등록자"는 유효성 확인 또는 비 검증을 통해 네트워크에 로그인하는 데 사용됩니다. 로그인하기 위해서는 저자가 EnrolmentID와 EnrolmentPassword를 제공하여 신원을 확인해야합니다. ID와 비밀번호가 맞으면이 특정 작성자를 위해 새로운 등록 및 트랜잭션 인증서가 생성됩니다.

이 순간부터 작성자는 네트워크에 체인 코드를 배포 할 수 있습니다. "배포"요청은 피어 중 하나에게 전송됩니다. 이 피어는 "path to chaincode", "init arguments", "chaincode source code"에 대한 정보로 "트랜잭션"을 생성합니다. 그러면 피어는 다음과 같은이 트랜잭션의 해시 코드를 계산합니다.

a13c53fe822da398aaca7af59f064ae6f85c1d048fcb2ed77c3cacc137964a424deba679390df8d156e49c5fff7cdfc9fecec373a3cddd17e46ca9404096a52d 

이 해시는 나중에 chaincode 이름으로 사용됩니다.

VP는 네트워크의 다른 모든 VP와 열린 연결을 유지하고 모든 VP에 트랜잭션을 브로드 캐스팅 할 수 있습니다 (자세한 내용은 컨센서스 설명 참조).
모든 피어는 배포 된 체인 코드에 필요한 로컬 도커 이미지를 만들기 위해 트랜잭션의 정보를 사용합니다. 새 도커 컨테이너를 시작하고 Init 메서드를 실행합니다.

동일한 체인 코드를 다시 배포하려고 시도하면 Fabric은 해당 이름의 체인 코드가 이미 배포되어 있고 초기화를 건너 뜁니다.

배포 요청 (경로, 인수, 체인 코드의 기호)을 변경하면 피어가 다른 해시를 생성하고 새 체인 코드를 배포합니다 (이전 버전은 영향을받지 않음).

+0

덕분에 당신은, 세르게이, 레지스터 , 나는 실제로하여 hyperledger의 문서에서 다음을 말하는 겁니다 엔/최신/설정/chaincode - 설치/ 시작 및 시작하고 검증 피어와 chaincode 등록 할 chaincode 실행 다음 chaincode 명령 등록 : CORE_CHAINCODE_ID_NAME = mycc CORE_PEER_ADDRESS = 0.0.0.0 : 7051 ./chaincode_example02 을 체인 코드 콘솔은 "수신 된 REGISTERED, 호출 준비 완료"라는 메시지를 표시합니다. 이는 체인 코드가 요청을 수신 할 준비가되었음을 나타냅니다. –

+0

이 예제는 Fabric을 개발 모드에서 실행하는 방법을 설명합니다 (-peer-chaincodedev). 이 모드에서는 임의의 이름을 사용하여 체인 코드를 실행할 수 있습니다. 체인 코드는 로컬 환경에서 프로세스로 실행됩니다 (도커 컨테이너 없음). 개발자는 빠른 속도로 작동하고 체인 코드에서 디버그 메시지에 액세스 할 수 있기 때문에 디버깅 용도로이 모드를 사용할 수 있습니다. –

0

기술적 REGISTER가

Chaincode이 상호 작용에 배포, 호출, 쿼리 방법/API를 제공하는 배포 트랜잭션의 일부입니다. 키 코드 배포에 관해 이야기 할 때 실제로는 체인 코드에서 Deploy 메서드를 호출하는 최종 사용자 (또는 응용 프로그램)에 대해 이야기하고 있습니다.

피어는 배포 트랜잭션을 처리하고 Docker 컨테이너에서 체인 코드를 시작하지만 트랜잭션 처리는 여기에서 끝나지 않습니다. 체인 코드 컨테이너에는 심층이 있으며, 이후 실제 피어와 통신합니다. 심 계층과 피어 간의 이러한 통신은 ChaincodeMessage에 의해 관리됩니다.

enum Type { 
    UNDEFINED = 0; 
    REGISTER = 1; 
    REGISTERED = 2; 
    INIT = 3; 
    READY = 4; 
    TRANSACTION = 5; 
    COMPLETED = 6; 
    ERROR = 7; 
    GET_STATE = 8; 
    PUT_STATE = 9; 
    DEL_STATE = 10; 
    INVOKE_CHAINCODE = 11; 
    INVOKE_QUERY = 12; 
    RESPONSE = 13; 
    QUERY = 14; 
    QUERY_COMPLETED = 15; 
    QUERY_ERROR = 16; 
    RANGE_QUERY_STATE = 17; 
} 

지금 소스 http://hyperledger-fabric.readthedocs.io/en/latest/protocol-spec/#33-chaincode에서 인용 :이 선언에 의해 정의 된 ChaincodeMessage (들)의 다른 종류가 있습니다

Upon deploy (chaincode container is started), the shim layer sends a one 
time REGISTER message to the validating peer with the payload containing the 
ChaincodeID. The validating peer responds with REGISTERED or ERROR on 
success or failure respectively. The shim closes the connection and exits if 
it receives an ERROR. 

은 그러므로 당신이

10:08:38.450 [shim] DEBU : Registering.. sending REGISTER 
10:08:39.901 [shim] DEBU : []Received message REGISTERED from shim 
10:08:39.965 [shim] DEBU : []Handling ChaincodeMessage of type: REGISTERED(state:created) 
10:08:40.037 [shim] DEBU : Received REGISTERED, ready for invocations 

를 얻을 수는 당신의 chaincode 후 실제로 쿼리 및 호출을받을 준비가되었습니다. .......... http://hyperledger-fabric.readthedocs.io/ :