ChainLink V1 백서 번역
체인 링크는 외부 데이터를 불러올 때 해당 데이터의 출처를 한 Src로 한정하는 것이 아니라 여러 Src로 둔다. 이 방식으로 한 Src에서 잘못된 정보를 제공하더라도 이를 처리할 수 있다.
분산시스템으로 네트워크를 구현한다. 그렇다면 당연히 악성 노드가 있을 수 있다. 여기서 말하는 악성노드는 고의적이든 고의적이지 않든 잘못된 정보를 제공하는 노드를 말한다. 이러한 노드를 체인링크는 어떻게 처리했을까?
체인링크에서는 CHAINLINK-SC(체인링크에서 onchain 부분을 칭하는 말, 엄밀히 따지면 더 복잡하지만 이해를 위해 이정도로 이해하고 넘어갈 수 있음)라는 시스템을 도입했다. CHAINLINK-SC에서는 A=Agg(A1, A2,...,An)을 계산해 여러 응답들을 집계하고 결과를 도출하여 USER-SC(체인링크를 호출한 외부의 컨트랙트)에 반환한다. (Agg는 값을 도출하는 임의의 함수이다.)
이 방법은 n이 작을 때 효과적이며 다음과 같은 이점이 있다.
이 간단한 과정에는 한 가지 기술적인 문제가 있다. freeloading이다.
한 치팅 oracle Oz는 다른 oracle Oi의 Ai를 보고 카피할 수 있다. 이러면 Oz는 데이터를 찾는 비용을 절약한다. 이를 freeloading이라고 한다.
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는 비동기로 운영된다.
컨트랙트에서 이루어지는 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문제는 여전히 해결될 필요가 있다.
체인링크 시스템은 threshold signatures를 포함하는 간단한 프로토콜을 제안했다. 오라클에서 결정된 set이 주어지면, A를 계산하기 위해 고전적인 BFT 합의 알고리즘을 사용을 고려할 수 있다. 그러나 고전적인 BFT 프로토콜은 예를 들어 블록체인에서 모든 노드가 동일한 블록을 저장하는 것 처럼 프로토콜 호출이 끝날 때 모든 정직한 노드가 동일한 값을 저장하도록 하는 것을 목표로 한다. 오라클환경에서는 목표가 약간 다르다. CHAINLINK-SC와 USER-SC가 합의프로토콜에 참여하지 않고 여러 오라클로부터 답변을 받을 필요 없이 종합 답변 A=Agg(A1,A2,…,An)을 얻을 수 있도록 하고 싶다. 게다가 freeloading문제는 여전히 해결되지 않았다.
ChainLink 시스템은 threshold signatures를 포함하는 간단한 프로토콜의 사용을 제안한다. 이러한 서명은 다수의 서명 체계를 사용하여 실현될 수 있지만 특히 Schnorr signatures을 사용하여 구현하는 것이 간단하다. 이 접근법에서 오라클은 a (t,n)-threshold manner의 O1, O2, …, On간에 공유되는 집합적 공개 키 pk와 해당 프라이빗키 sk를 갖는다. 이러한 공유는 모든 노드 Oi가 고유한 개인/공용 키 쌍(ski, pki)을 가지고 있음을 의미한다.
이 설정의 주요 기능은 동일한 값 A의 부분 서명을 임의의 토크 집합 에 걸쳐 집계하여 답변 A에 유효한 집합 서명 Σ = Sigsk[A]를 생성할 수 있다는 것이다. 그러나 값에 유효한 서명을 생성할 수 있는 t−1개의 오라클 집합은 없다. 따라서 단일 서명 Σ은 적어도 토크의 부분 서명을 암시적으로 구현한다.
임계값 서명은 Σ가 개별 노드의 t개의 유효한 독립 서명 집합으로 명시적으로 구성되도록 함으로써 순진하게 실현될 수 있다. 임계값 서명은 이 순진한 접근 방식과 유사한 보안 속성을 가집니다. 그러나 체인 성능을 크게 개선할 수 있습니다. 그들은 Σ 검증의 크기와 비용을 t배로 줄인다.
이 설정을 사용하면 t개의 부분 서명이 Σ의 계산을 가능하게 할 때까지 Oracle은 부분 서명을 생성하고 broadcast할 수 있다. 그러나 다시, freeloading 문제가 발생한다. 따라서 우리는 오라클이 다른 오라클에서 Ai를 속이고 복사하는 대신 지정된 소스에서 데이터를 진정으로 얻도록 보장해야 한다. 체인링크의 솔루션에는 다음과 같은 금융 메커니즘이 포함된다: PROVIDER(스마트 계약으로 실현 가능)는 부분적인 서명에 대해 원본 데이터를 제공한 오라클에만 보상을 지급한다.
분산된 환경에서 어떤 오라클이 지불 자격을 갖는지 결정하는 것은 까다로운 것으로 밝혀졌다. 오라클은 오프체인과 상호 통신할 수 있으며 더 이상 응답을 수신하는 단일 권한 있는 엔티티(CHINLINK-SC)가 없으므로 참여 오라클 중에서 자격 있는 수취인을 직접 식별할 수 없다. 따라서 PROVIDER는 오라클 자체로부터 잘못된 행동의 증거를 얻어야 하며, 그 중 일부는 신뢰할 수 없을 수 있다. 우리는 PROVIDER가 freeloading 오라클에게는 지불하지 않도록 ChainLink 솔루션에 합의와 같은 메커니즘을 사용할 것을 제안한다.
우리가 ChainLink에 대해 제안하는 오프체인 집계 시스템은 첨부 A에서 찾을 수 있다. 그것은 f < n/3 oracle에 의한 freeloading에 대한 저항을 제공하는 임계값 서명을 기반으로 하는 분산 프로토콜을 사용한다. 우리는 freeloading에 대한 저항이 흥미로운 새로운 기술적 문제라고 생각한다.
좋은 글이네용 퍼가용~