탈중앙화를 구현하는 방법
1. 출처의 탈중앙화
체인 링크는 외부 데이터를 불러올 때 해당 데이터의 출처를 한 Src로 한정하는 것이 아니라 여러 Src로 둔다. 이 방식으로 한 Src에서 잘못된 정보를 제공하더라도 이를 처리할 수 있다.
2. 노드의 탈중앙화
분산시스템으로 네트워크를 구현한다. 그렇다면 당연히 악성 노드가 있을 수 있다. 여기서 말하는 악성노드는 고의적이든 고의적이지 않든 잘못된 정보를 제공하는 노드를 말한다. 이러한 노드를 체인링크는 어떻게 처리했을까?
1) In-contract aggregation
- CHAINLINK-SC : 체인링크에서 onchain 부분을 칭하는 말
- CHAINLINK-SC에서는 A = Agg(A1, A2,...,An)을 계산해 여러 응답들을 집계하고 결과를 도출하여 USER-SC(체인링크를 호출한 외부의 컨트랙트)에 반환한다. (Agg는 값을 도출하는 임의의 함수이다.)
- 이 방법은 n이 작을 때 효과적이며 다음과 같은 이점이 있다.
- Conceptual Simplicty : 노드들이 분산되어있음에도 불구하고 CHAINLINK-SC라는 하나의 컨트랙트가 계산을 실행한다.
- Trustworthiness : CHAINLINK-SC는 onchain에서 실행되므로 신뢰할 수 있다.
- Flexibility : CHAINLINK-SC는 Agg함수의 구현법에 따라 유연한 값을 도출할 수 있습니다. 예를 들면 평균값, 중앙값, 최빈값 등을 구할 수 있습니다.
이 간단한 과정에는 한 가지 기술적인 문제가 있다.
- freeloading : 한 치팅 oracle Oz는 다른 oracle Oi의 Ai를 보고 카피할 수 있다. 이러면 Oz는 데이터를 찾는 비용을 절약한다.
freeloading은 데이터 출처의 다양성을 손상시키고 oracle node가 빨리 답할 의욕을 상실시킨다. orecle node는 먼저 답하지 않고 기다렸다가 다른 oracle의 데이터를 보고 참조하면 되기 때문이다.
체인링크는 이를 commit / reveal을 통해 해결했다.
- 첫번째 라운드에서 oracle들은 CHAINLINK-SC로 그들의 응답을 암호화한 commit을 보낸다. 그리고 CHAINLINK-SC는 충분한 양의 commit을 받으면 reveal을 위한 두번째 라운드를 시작한다.
두번째 라운드에서는 commit을 해제하는 reveal이 진행된다. 해제되면 이는 freeloading할 수 있게 노출된다. 이 과정은 모든 commit을 받은 후에 진행되기때문에 freeloading이 이루어질 수 없다.
- 3f+1 nodes로부터 값을 보증하는 알고리즘
- USER-SC로부터 Req를 받을때까지 기다린다.
- sid <-$ SID
- Broadcast(requst, sid)
- 분산된 노드로부터 2f+1개의 메시지로 구성된 set C를 기다린다.(commit, ci = Commitri(Ai), sid)
- Broadcast(commit, sid)
- 분산된 검증 decommitments들 f+1개로 구성된 set D를 기다린다. (decommit, (ri,Ai,sid)
- USER-SC에 (Answer, A, sid)를 반환한다.
온체인에서는 블록 넘버를 활용해 동기식 프로토콜을 설계할 수 있다. 하지만 ChainLink에서 오라클 노드들은 응답 시간이 오래걸릴 수도 있는 소스에서 데이터를 얻고 이더리움에서 가스 가격이 서로 다르기 때문에 응답 시간이 노드마다 달라질 수 있다. 그렇기때문에 ChainLink는 비동기로 운영된다.
2) Off-chain aggregation
- 컨트랙트에서 이루어지는 aggregation에는 크리티컬한 문제가 있다. 가격이다. 온체인에서 O(n)이라는 오라클 메시지를 전송하고 처리하는 과정은 가스비가 사용된다. Permissioned blockchain에서는 괜찮지만 이더리움같은 Permissionless blockchain에서는 메시지가 커지면 가스비가 기하급수적으로 커질 수 있다.
- 이러한 가격효율을 좋게 하는 방법은 aggregation과정을 오프체인에서 수행하고 싱글 메시지를 CHAINLINK-SC에 전송하는 것이다. 체인링크는 이러한 방식을 적용해였고 _of-chain aggregation_이라고 부른다.
- 잠재적인 결함 노드와 합의값인 A를 추출하는 문제는 합의알고리즘과 비슷한 문제다. 오라클에서 미리 결정된 set이 들어오면 classical BFT를 사용하여 A를 계산한다. 하지만 Classical BFT 프로토콜은 프로토콜이 호출된 후 모든 정직한 노드가 같은 값을 확정하기 위해서 나왔다.
- 예를 들면 블록체인에서 모든 노드는 같은 새 블럭을 저장한다. 체인링크의 오라클에서는 목표가 살짝 다르다. 체인링크는 CHAINLINK-SC가 합의 프로토콜에 참여하지 않고 여러 오라클 노드에서 답을 받지 않고 A=Agg(A1, A2,...,An)을 계산하는 것을 포함한다. freeloading문제는 여전히 해결될 필요가 있다.