CodeChain test helper

 

코드박스

좀 더 많은 분야에 블록체인이 활용됨에 따라 블록체인에 대한 보안 위협도 증가하고 있습니다. 코드체인은 이러한 보안 공격에 대응하기 위해 integration test로 다양한 시나리오를 구현하여 대비합니다.

코드체인의 integration test에서는 test helper 라이브러리를 사용합니다. test helper는 integration test 작성을 도와주는 헬퍼 라이브러리로 코드체인의 네트워크 레이어를 구현하고 있어 코드체인 노드처럼 동작합니다. 이를 통해 정상적인 노드라면 보낼 수 없는 악의적인 통신에 대한 테스트를 진행할 수 있습니다.

코드체인 네트워크는 크게 3개의 레이어로 구성되어 있습니다.

우선 코드체인은 다른 노드와 연결되면 통신에 사용할 세션을 만듭니다. 만들어진 세션은 이후 주고받는 메시지들을 암호화하는 데 사용됩니다. 이 과정은 UDP protocol을 사용하며 한 번 만들어진 세션은 해당 노드와 연결이 끊겨도 유지되다가 다시 연결이 형성되면 재사용됩니다. 세션이 만들어지면 TCP connection 형성을 통해 P2P layer가 만들어집니다. 이때 주고받는 메시지가 세션을 통해 암호화됩니다.

여기까지 되었다면 이제 코드체인 노드와 유효한 통신을 할 수 있게 된 것입니다. 코드체인에서는 필요한 네트워크 서비스를 비동기적으로 실행하기 위해 extension의 형태로 등록할 수 있는데 block sync, parcel sync, snapshot sync 등이 여기에 해당합니다. Block sync의 경우 피어 간에 블록을 동기화하기 위해, parcel sync의 경우 parcel이 노드로 들어오면 이를 피어들에 전파하기 위해 그리고 snapshot sync는 노드 간에 state를 동기화하기 위해 많은 메시지를 주고받아야 합니다. 이런 extension들의 메시지가 P2P layer의 메시지에 담기게 되고 이 메시지가 세션을 통해 암호화되어 다른 peer들에게 전송됩니다.

test helper는 특정 노드와 세션을 만든 후, TCP connection을 형성하는 데까지 자동화되어있어 extension 메시지를 쉽게 보낼 수 있게 해줍니다. 기존 integration test의 경우 node를 띄운 후 RPC 콜을 통해 피어 간의 메시지를 보냈는데 이 방법을 통해서는 정상적인 노드에서 보낼 수 있는 메시지들 밖에 보낼 수가 없습니다. 하지만 test helper를 사용하면 extension message의 데이터를 임의로 조작할 수 있습니다. 예를 들면 block을 mining 성공했을 때, 전파하는 메시지에서 block의 번호를 수정하는 것입니다. 그러면 이 메시지를 피어가 받았을 때 제대로 검사할 수 있는지 테스트할 수 있습니다.

코드를 통해 좀 더 자세히 살펴보겠습니다.

Make TestHelper class

target이 되는 node에 대한 정보를 넣어서 TestHelper 클래스를 만듭니다. 그리고 establish()를 하면 session layer와 P2P layer가 구성됩니다

Load block headers data

그리고 제네시스 블록의 헤더와 다음 블록이 될 수 있는 블록 헤더 데이터를 불러옵니다. 블록 1에 해당하는 헤더 데이터의 경우 정상적인 경우에는 번호가 1로 되어 있겠지만 테스트를 위해 2로 바꿔줍니다.

Send an invalid block header

헤더 데이터를 불러왔으면 불러온 헤더를 코드체인 노드로 보냅니다. 만약 이 헤더들이 유효하다고 판단되면 헤더에 대한 바디요청이 올 것이고 유효하지 않다면 앞서 보낸 헤더 메시지는 무시됩니다.

이처럼 test helper는 유저입장에서 곧 바로 extension 메시지를 보낼 수 있게 해줌으로써 정상적인 노드에서 보낼 수 없는 메시지 전송을 가능하게 해줍니다. 코드체인에서는 이를 이용하여 위에서 예로 든 단순히 유효하지 않은 block을 보내는 시나리오 외에도 피어 간의 통신에서 일어날 수 있는 다양한 상황에 대한 테스트가 integration test에 등록되어 있습니다.(https://github.com/CodeChain-io/codechain/blob/master/test/src/integration/onChainBlock.test.ts). 코드체인의 integration test의 다음 마일스톤은 좀 더 다양한 시나리오의 악의적인 피어 메시지에 대비책입니다. 업데이트 내용 추후에 공유하겠습니다!

Check out the source code at our github repo. If you would like to chat with the CodeChain developers’ community, join our gitter channel.

기업문화 엿볼 때, 더팀스

로그인

/