티스토리 뷰

반응형

하이퍼레저 패브릭 체인코드를 실행하다가 에러가 발생했다.

 

ERROR 2022-09-14 17:40:42[Channel.java - logCompletion] [Channel:5520] 
- Future completed exceptionally: sendTransaction
java.lang.IllegalArgumentException: The proposal responses have 2 inconsistent groups with 1 that are invalid. 
Expected all to be consistent and none to be invalid.
	at org.hyperledger.fabric.sdk.Channel.doSendTransaction(Channel.java:5554)
	at org.hyperledger.fabric.sdk.Channel.sendTransaction(Channel.java:5513)
	at org.hyperledger.fabric.sdk.Channel.sendTransaction(Channel.java:5216)
	at org.hyperledger.fabric.sdk.Channel.sendTransaction(Channel.java:5001)
	at org.hyperledger.fabric.sdk.Channel.sendTransaction(Channel.java:4989)

 

에러 코드는 위와 같으며 내용을 읽어보면 대략 [제안한 응답이 2개의 그룹에서 1개만큼 유효하지(일치하지) 않는다]고 한다. 본인이 테스트하는 환경은 2개의 피어를 설정했고 2개의 CouchDB를 세팅해놨었다.

 

 

이 에러 원인은 상당히 광범위한 문제로써 다음과 같은 이유가 있을 수 있다. 

  • 서로 다른 피어들이 서로 다른 상태(state)를 가지고 있어서 거래가 서로 다른 시간에 생성되는 이유
  • 서로 다른 피어들이 서로 다른 상태(state)를 가지고 있어서 Read/Write가 서로 다른 기능으로 작동되는 이유
  • 서로 다른 피어들이 서로 다른 상태(state)를 가지고 있어서 Read/Write가 서로 다른 응답으로 리턴되는 이유

 

결국 이 문제는 현재 당신의 하이퍼레저 패브릭 블록체인이 요청한 데이터로 동일한 수행 결과를 내지 못하는 비결정적(non-deterministic)인 상태를 가지고있기 때문이다. 이 말을 이해하기 위해선 하이퍼레저 패브릭의 개념에 대해서 알아야한다.


하이퍼레저 패브릭은 분산원장이란 핵심적인 특징이 있다. 이 분산원장은 현재 상태를 나타내는 World state와 원장의 생성 시점부터 현재까지의 이력을 저장하는 블록체인 두 가지로 나뉜다. World State는 분산원장의 현재 값을 나타내고 있으며 데이터베이스 형태로써 제출한 체인 코드 트랜잭션들이 쌓여있다. 각 트랜잭션이 원장에 저장될때 key-value 저장 방식을 사용하는 LevelDB와 Json 형태의 CouchDB 중 하나를 선택해서 데이터베이스를 구축할 수 있다. 이 데이터베이스에 저장되는 데이터는 합의 과정에 의해 블록체인에 기록되며, 절대로 수정할 수 없다(non-deterministic). World state는 블록체인에 기록되기 전 데이터의 기록, 수정, 읽기가 빈번하게 발생하며 각 피어들은 트랜잭션을 저장하기 전에 World state의 상태와 버전 값을 비교하는 작업을 수행한다. 여기서 각 피어들이 World state 상태가 다르다고 판단하면 요청한 거래를 수행하지 못한다.

즉, World state를 구성하고 있는 데이터베이스들이 서로 다른 경우 트랜잭션 저장을 수행할 수 없어 정상적인 응답을 할 수 없다.


해결방법

원인은 결국 2개의 피어(노드)에서 존재하는 LevelDB 또는 CouchDB들이 일치하지 않기에 발생하는 현상이다. 

1. LevelDB 또는 CouchDB에서 기록, 수정, 삭제로 인해 데이터와 필드가 서로 달라진 것이 있는지 비교해보고 데이터를 일치시킬 것.
2. 각 데이터가 모두 일치한다면, 체인코드에서 거래가 승인될 수 없는 잘못된 요청 데이터를 보내는 것일 수도 있음. 요청하는 파라미터가 올바른지 확인해보고 파라미터 값을 다르게 넣어 체인코드를 실행해 볼 것.

 

본인의 경우에는 각 CouchDB에서 데이터가 달라서 발생하는 에러였다. CouchDB 한쪽에서만 삭제를 일으킨걸 까먹고, 이후에 체인코드를 조회하려니 당연히 서로 다른 조회 데이터를 참조하니 에러가 날 수 밖에.. 블록체인은 데이터를 쌓는 순간 건드리면 안 되는 것인데, 초보적인 실수를 했다..

반응형
댓글
공지사항