O Livro Branco do NEAR

저자 Alex Skidanov and Illia Polosukhin · 2019

샤딩 기본 사항

샤딩에 대한 가장 간단한 접근 방식부터 시작해 보겠습니다. 이 접근 방식에서는 대신 하나의 blockchain을 실행하면 여러 개를 실행하고 각각의 blockchain을 호출합니다. "샤드". 각 샤드에는 자체 validator 세트가 있습니다. 여기와 아래에서 우리는 거래를 확인하는 참가자를 지칭하는 일반적인 용어 "validator" 작업 증명과 같은 채굴이나 투표 기반을 통해 블록을 생성합니다. 1이 섹션은 이전에 https://near.ai/shard1.에 게시되었습니다. 이전에 읽으셨다면, 다음 섹션으로 건너뛰세요.

기구. 지금은 샤드가 서로 통신하지 않는다고 가정해 보겠습니다. 기타. 이 디자인은 간단하지만 샤딩의 몇 가지 초기 주요 과제를 설명하는 데 충분합니다. 1.1 검증인 파티셔닝 및 비콘 체인 시스템이 10개의 샤드로 구성되어 있다고 가정해 보겠습니다. 첫 번째 과제는 각각의 샤드에 자체 validator이 있으므로 각 샤드는 이제 샤드보다 10배 덜 안전합니다. 전체 체인. 따라서 X validators가 포함된 비샤딩 체인이 하드포크를 결정하면 샤딩된 체인으로 X validators를 10개의 샤드로 분할합니다. 이제 각 샤드는 X/10 validators만 있고, 샤드 하나를 손상시키려면 손상만 필요합니다. 총 validator 수의 5.1%(51% / 10)(그림 1 참조), 그림 1: validator을 여러 샤드로 분할 두 번째 요점은 누가 각 샤드에 대해 validator을 선택합니까? validator의 5.1%를 통제하는 것은 validator의 5.1%가 모두 손상되는 경우에만 해를 끼칩니다. 같은 샤드에 있습니다. validators가 검증할 샤드를 선택할 수 없는 경우 에서 validator의 5.1%를 제어하는 참가자는 모든 것을 얻을 가능성이 거의 없습니다. validator이(가) 동일한 샤드에 저장되어 손상 가능성이 크게 감소합니다. 시스템. 오늘날 거의 모든 샤딩 디자인은 무작위성의 소스에 의존합니다. validators를 샤드에 할당합니다. blockchain의 무작위성 자체는 매우 어려운 주제이며 이 문서의 범위를 벗어납니다. 지금은 우리가 사용할 수 있는 임의성의 소스입니다. 우리는 validator의 과제를 다음에서 다룰 것입니다. 자세한 내용은 섹션 2.1에서 확인하세요. 무작위성과 validator 할당 모두 계산이 필요하지 않습니다. 특정 샤드에만 적용됩니다. 해당 계산을 위해 기존의 거의 모든 디자인에는 작업 수행을 담당하는 별도의 blockchain이 있습니다. 전체 네트워크의 유지 관리에 필요합니다. 무작위로 생성하는 것 외에도번호를 지정하고 샤드에 validator을 할당하는 경우 이러한 작업은 종종 샤드에서 업데이트를 수신하고 스냅샷을 찍고 처리하는 것을 포함합니다. 지분 증명 시스템의 지분 및 삭감, 그리고 그 경우 샤드의 균형을 재조정합니다. 기능이 지원됩니다. 이러한 체인을 Ethereum에서는 릴레이 체인(Beacon Chain)이라고 합니다. PolkaDot의 체인, Cosmos의 Cosmos 허브. 이 문서 전체에서 우리는 이러한 체인을 비콘 체인(Beacon chain)이라고 부를 것입니다. 비콘 체인의 존재는 우리에게 다음 흥미로운 주제인 2차 샤딩. 1.2 2차 샤딩 샤딩은 종종 숫자에 따라 무한정 확장되는 솔루션으로 광고됩니다. 네트워크 운영에 참여하는 노드의 수입니다. 이론적으로는 가능하지만 이러한 샤딩 솔루션, 비콘 개념이 있는 모든 솔루션을 설계합니다. 체인에는 무한한 확장성이 없습니다. 이유를 이해하려면 Beacon을 참고하세요. 체인은 validators 할당과 같은 일부 장부 계산을 수행해야 합니다. 개수에 비례하는 샤드 또는 샤드 체인 블록의 스냅샷 생성 시스템의 샤드 수. 비콘 체인 자체는 단일 blockchain이므로 그것을 운영하는 노드의 계산 능력에 의해 제한된 계산, 샤드의 수는 당연히 제한되어 있습니다. 그러나 샤딩된 네트워크의 구조는 곱셈을 제공합니다. 노드 개선에 영향을 미칩니다. 임의의 경우를 고려하십시오. 네트워크의 노드 효율성이 향상되어 다음을 허용합니다. 거래 처리 시간이 더 빨라집니다. 비콘체인의 노드를 포함하여 네트워크를 운영하는 노드의 경우, 4배 더 빨라지면 각 샤드는 4배 더 많은 작업을 처리할 수 있습니다. 비콘 체인은 4배 더 많은 샤드를 유지할 수 있게 됩니다. 시스템 전체의 처리량은 4 × 4 = 16배로 증가합니다. 따라서 2차 샤딩이라는 이름이 붙었습니다. 샤드 개수를 정확하게 측정하기는 어렵습니다. 현재는 실행 가능하지만 가까운 미래에는 처리량이 증가할 가능성이 낮습니다. blockchain 사용자의 요구 사항은 2차 샤딩의 한계를 넘어설 것입니다. 이러한 대량의 샤드를 안전하게 운영하는 데 필요한 엄청난 수의 노드 모든 노드를 운영하는 노드 수보다 훨씬 더 많을 가능성이 높습니다. blockchain이 오늘 결합되었습니다. 1.3 상태 샤딩 지금까지 우리는 정확히 무엇이 분리되어 있지 않은지 잘 정의하지 못했습니다. 네트워크가 샤드로 분할될 때. 특히 blockchain의 노드 세 가지 중요한 작업을 수행합니다. 1) 트랜잭션을 처리할 뿐만 아니라 또한 2) 검증된 트랜잭션과 완료된 블록을 다른 노드에 전달하고 3) 전체 네트워크 원장의 상태와 기록을 저장합니다. 이 세 가지 각각 작업은 네트워크를 운영하는 노드에 점점 더 많은 요구 사항을 부과합니다.1. 거래를 처리하려면 더 많은 컴퓨팅 성능이 필요합니다. 처리되는 거래 수가 증가합니다. 2. 트랜잭션 및 블록을 중계해야 할 필요성으로 인해 중계되는 트랜잭션 수가 증가함에 따라 더 많은 네트워크 대역폭이 필요합니다. 3. 데이터를 저장해야 하는 필요성은 상태가 성장함에 따라 더 많은 저장 공간을 필요로 합니다. 중요한 것은 처리 능력 및 네트워크와 달리 트랜잭션 속도(처리된 트랜잭션 수)가 증가하더라도 스토리지 요구 사항이 증가한다는 것입니다. 초당)은 일정하게 유지됩니다. 위 목록에서 스토리지 요구 사항은 다음과 같을 수 있습니다. 시간이 지남에 따라 증가하는 유일한 것이기 때문에 가장 시급한 것입니다. 초당 트랜잭션 수가 변하지 않더라도 실제로는 오늘날 가장 시급한 요구 사항은 컴퓨팅 성능입니다. 전체 상태 Ethereum 이 글을 쓰는 시점에서 100GB는 대부분의 노드에서 쉽게 관리할 수 있습니다. 하지만 Ethereum이(가) 처리할 수 있는 거래 수는 약 20건입니다. 많은 실제 사용 사례에 필요한 것보다 크기가 작습니다. Zilliqa는 처리는 샤딩하지만 저장은 하지 않는 가장 잘 알려진 프로젝트입니다. 처리의 샤딩은 각 노드가 전체 정보를 갖기 때문에 문제가 더 쉽습니다. 상태, 즉 계약은 다른 계약을 자유롭게 호출하고 모든 데이터를 읽을 수 있음을 의미합니다. blockchain에서. 업데이트를 확인하려면 신중한 엔지니어링이 필요합니다. 상태의 동일한 부분을 업데이트하는 여러 샤드에서 충돌이 발생하지 않습니다. 에서 그런 점에서 질리카는 상대적으로 단순한 접근 방식을 취하고 있습니다2. 처리를 샤딩하지 않고 스토리지를 샤딩하는 것이 제안되었지만 매우 드물다. 따라서 실제로 스토리지 샤딩, 즉 상태 샤딩은 거의 항상 처리의 샤딩과 네트워크의 샤딩을 의미합니다. 실제로 상태 샤딩에서 각 샤드의 노드는 자신의 노드를 구축합니다. 로컬 부분에만 영향을 미치는 트랜잭션이 포함된 blockchain을 소유합니다. 해당 샤드에 할당된 전역 상태입니다. 따라서 validators는 샤드는 전역 상태의 로컬 부분만 저장하고 실행만 하면 됩니다. 그리고 그 자체로는 국가의 일부에 영향을 미치는 거래만을 중계합니다. 이 파티션은 모든 컴퓨팅 성능, 스토리지 및 네트워크 대역폭이 줄어들지만 데이터 가용성 및 교차 샤드 트랜잭션에 대해서는 아래에서 모두 다루겠습니다. 1.4 교차 샤드 트랜잭션 지금까지 설명한 샤딩 모델은 그다지 유용하지 않습니다. 샤드는 서로 통신할 수 없으며 여러 개보다 나을 것이 없습니다. 독립적인 blockchains. 오늘날에도 샤딩을 사용할 수 없는 경우에는 다양한 blockchain 사이의 상호 운용성에 대한 엄청난 수요. 지금은 각 참가자가 정확히 하나의 샤드에 계정을 갖는 간단한 결제 거래만 고려해 보겠습니다. 다른 곳에서 돈을 이체하고 싶다면 2그들의 접근 방식에 대한 분석은 여기에서 확인할 수 있습니다: https://medium.com/nearprotocol/ 8f9efae0ce3b동일한 샤드 내에서 한 계정에서 다른 계정으로 거래가 처리될 수 있습니다. 전적으로 해당 샤드의 validator에 의해 이루어집니다. 그러나 샤드에 상주하는 앨리스가

1은 샤드 #2에 거주하는 Bob에게 돈을 보내고 싶어하지만 validators도 마찬가지입니다.

샤드 #1(Bob의 계정에 크레딧을 제공할 수 없음)이나 validator의 샤드 샤드 #2(Alice의 계좌에서 인출할 수 없음)는 전체를 처리할 수 있습니다. 거래. 교차 샤드 트랜잭션에는 두 가지 접근 방식이 있습니다. • 동기식: 교차 샤드 트랜잭션을 실행해야 할 때마다 관련된 상태 전환을 포함하는 여러 샤드의 블록 트랜잭션은 모두 동시에 생성되며 여러 샤드의 validators가 이러한 트랜잭션을 실행하기 위해 협력합니다.3 • 비동기식: 여러 샤드에 영향을 미치는 크로스 샤드 트랜잭션 해당 샤드에서 비동기식으로 실행되며 "크레딧" 샤드가 실행됩니다. "Debit" 샤드가 해당 부분을 실행했다는 충분한 증거가 있으면 절반입니다. 이 접근 방식은 다음과 같은 이유로 더 널리 사용되는 경향이 있습니다. 단순성과 조정 용이성. 이 시스템은 현재 Cosmos, Ethereum Serenity, Near, Kadena 등에서 제안되었습니다. 이것에 문제가 있다 접근 방식은 블록이 독립적으로 생성되면 여러 블록 중 하나가 고아가 될 가능성이 0이 아니라는 것입니다. 거래가 부분적으로만 적용되었습니다. 두 가지를 묘사하는 그림 2를 고려하십시오. 포크와 교차 샤드 트랜잭션이 발생한 샤드 이에 따라 블록 A와 X'에 기록되었습니다. 체인이 A-B인 경우 V'-X'-Y'-Z'는 결국 해당 샤드에서 정식이 됩니다. 거래가 완전히 마무리되었습니다. A'-B'-C'-D' 및 V-X가 표준이 되면, 그러면 거래가 완전히 포기되며 이는 허용됩니다. 하지만 만약에, 예를 들어 A-B와 V-X가 정규화되면 트랜잭션의 한 부분이 마무리되고 다른 부분은 폐기되어 원자성 오류가 발생합니다. 우리 두 번째 부분에서는 포크 선택 규칙 및 합의에 대한 변경 사항을 다룰 때 제안된 프로토콜에서 이 문제가 어떻게 해결되는지 다룰 것입니다. 샤딩된 프로토콜을 위해 제안된 알고리즘. 체인 간 통신은 샤딩된 blockchain 외부에서 유용합니다. 너무. 체인 간의 상호 운용성은 많은 프로젝트에서 해결해야 할 복잡한 문제입니다. 해결하려고 노력하고 있습니다. 샤딩된 blockchains에서는 문제가 다소 더 쉽습니다. 블록 구조와 합의는 샤드 전반에 걸쳐 동일하며 조정에 사용할 수 있는 비콘 체인이 있습니다. 그러나 샤딩된 blockchain에서는 모든 샤드 체인은 동일하지만 글로벌 blockchain 생태계에는 다양한 대상 사용 사례, 분산화를 갖춘 다양한 blockchain이 많이 있습니다. 그리고 개인정보 보호를 보장합니다. 일련의 체인이 서로 다른 속성을 가지지만 시스템을 구축하는 것 충분히 유사한 합의 및 블록 구조를 사용하고 공통 비콘 체인을 보유하면 3The 가장 상세한 제안 알려진 에 는 작가 의 이 문서 이다 병합 블록, 설명 여기: https://ethresear.ch/t/ 병합 블록 및 동기 교차 샤드 상태 실행/1240그림 2: 비동기식 크로스 샤드 트랜잭션 작동하는 상호 운용성 하위 시스템. 이러한 시스템에는 validator 회전 기능이 없을 가능성이 높으므로 보안을 보장하기 위해 몇 가지 추가 조치를 취해야 합니다. 둘 다 Cosmos 및 PolkaDot은 사실상 그러한 시스템입니다4 1.5 악의적인 행위 이 섹션에서는 악의적인 validators를 유발할 수 있는 적대적인 행동을 검토합니다. 샤드가 손상되면 실행하세요. 우리는 고전적인 접근 방식을 검토할 것입니다 섹션 2.1에서 샤드 손상을 방지합니다. 1.5.1 악성 포크 일련의 악의적인 validator이 포크 생성을 시도할 수 있습니다. 그렇지 않다는 점 참고하세요 기본 합의가 BFT인지 아닌지가 중요합니다. 충분한 수를 손상시킵니다. validators를 사용하면 항상 포크를 생성할 수 있습니다. 전체 네트워크의 50% 이상이 손상될 가능성보다 단일 샤드의 50% 이상이 손상될 가능성이 훨씬 더 높습니다(우리는 섹션 2.1에서 이러한 확률에 대해 더 자세히 알아보세요. 섹션 1.4에서 논의한 바와 같이, 교차 샤드 트랜잭션에는 여러 샤드의 특정 상태 변경이 포함됩니다. 그러한 상태 변경을 적용하는 샤드의 해당 블록은 다음과 같아야 합니다. 모두 마무리되거나(즉, 해당하는 선택된 체인에 나타남) 샤드) 또는 모두 고아가 됩니다(즉, 해당 샤드의 선택한 체인에 표시되지 않음). 일반적으로 샤드가 손상될 가능성이 높기 때문에 4Cosmos: https://forum.cosmos.network/에서 Zaki Manian이 쓴 이 글을 참조하세요. t/polkadot-vs-cosmos/1397/2 및 이 문서의 첫 번째 작성자가 작성한 트윗 폭풍: 자세한 비교는 https://twitter.com/AlexSkidanov/status/1129511266660126720 둘 중

무시할 수 없는 수준이 아니므로 샤드 validator 사이에서 비잔틴 합의가 이루어지거나 많은 블록이 비잔틴 합의에 도달하더라도 포크가 발생하지 않을 것이라고 가정할 수 없습니다. 상태 변경으로 블록 상단에 생성됩니다. 이 문제에는 여러 가지 해결 방법이 있으며 가장 일반적인 해결 방법은 가끔 발생합니다. 최신 샤드 체인 블록을 비콘 체인에 교차 연결합니다. 포크 그런 다음 샤드 체인의 선택 규칙은 항상 체인을 선호하도록 변경됩니다. 교차 연결되었으며, 해당 블록에 대해서만 샤드별 포크 선택 규칙을 적용합니다. 마지막 교차 링크 이후 게시되었습니다. 1.5.2 잘못된 블록 승인 validator 세트가 상태 전환 기능을 잘못 적용하는 블록을 생성하려고 시도할 수 있습니다. 예를 들어 Alice가 있는 상태에서 시작하면 10개의 token이 있고 Bob은 0개의 token이 있는 경우 블록에는 다음과 같은 트랜잭션이 포함될 수 있습니다. Alice가 Bob에게 10개의 token을 보내지만 결국 Alice가 다음과 같은 상태가 됩니다. 그림 3에 표시된 대로 0 tokens이고 Bob은 1000 tokens를 갖습니다. 그림 3: 유효하지 않은 블록의 예 샤딩되지 않은 전통적인 blockchain에서는 이러한 공격이 불가능합니다. 네트워크 참가자는 모든 블록을 검증하고, 이를 가진 블록은 유효하지 않은 상태 전환은 다른 블록 생산자 모두에 의해 거부됩니다. 블록을 생성하지 않는 네트워크 참여자. 악의적이더라도 validators는 이러한 유효하지 않은 블록 위에 블록을 계속해서 생성합니다. 정직한 validators는 올바른 체인을 구축하여 잘못된 체인을 갖게 됩니다. 블록이 길어도 문제가 되지 않습니다. blockchain는 어떤 목적으로든 모든 블록을 검증하고 모든 블록을 삭제합니다. 유효하지 않은 블록 위에 구축됩니다. 그림 4에는 5개의 validator이 있으며 그 중 3개는 악성입니다. 그들은 유효하지 않은 블록 A'를 생성한 다음 그 위에 계속해서 새 블록을 구축했습니다. 그것의. 두 명의 정직한 validator가 A'를 유효하지 않은 것으로 폐기하고 그 위에 구축하고 있었습니다.그림 4: 샤딩되지 않은 blockchain에서 잘못된 블록을 생성하려고 시도했습니다. 그들에게 알려진 마지막 유효한 블록을 삭제하여 포크를 생성합니다. 수가 적기 때문에 validators 정직한 포크에서는 체인이 더 짧습니다. 그러나 클래식 비샤딩 blockchain에서는 어떤 목적으로든 blockchain을 사용하는 모든 참가자가 수신한 모든 블록의 유효성을 검사하고 상태를 다시 계산하는 일을 담당합니다. 따라서 blockchain에 관심이 있는 사람은 누구나 A'를 관찰할 것입니다. 유효하지 않으므로 B', C' 및 D'도 즉시 폐기합니다. 체인 A-B는 현재 가장 긴 유효한 체인입니다. 그러나 샤딩된 blockchain에서는 참가자가 모든 샤드의 모든 트랜잭션을 확인할 수 없으므로 이를 확인할 수 있는 방법이 필요합니다. blockchain의 샤드 기록 중 유효하지 않은 블록이 포함되지 않았습니다. 포크와 달리 비콘 체인에 대한 교차 연결은 충분한 솔루션이 아닙니다. 비콘 체인에는 검증할 수 있는 능력이 없기 때문입니다. 블록. 해당 샤드에 충분한 수의 validator이 있는지만 확인할 수 있습니다. 블록에 서명했습니다(그리고 그 정확성이 입증되었습니다). 아래 섹션 2.2에서 이 문제에 대한 해결책을 논의하겠습니다.

Noções básicas de fragmentação

Vamos começar com a abordagem mais simples de fragmentação. Nesta abordagem, em vez de executando um blockchain, executaremos vários e chamaremos cada um desses blockchain de “fragmento”. Cada fragmento terá seu próprio conjunto de validators. Aqui e abaixo usamos um termo genérico “validator” para se referir aos participantes que verificam transações e produzir blocos, seja por mineração, como em Prova de Trabalho, ou por meio de votação 1Esta seção foi publicada anteriormente em https://near.ai/shard1. Se você leu antes, pule para a próxima seção.

mecanismo. Por enquanto, vamos supor que os fragmentos nunca se comuniquem entre si outro. Este design, embora simples, é suficiente para delinear alguns grandes desafios iniciais na fragmentação. 1.1 Particionamento de validador e cadeias de beacon Digamos que o sistema compreenda 10 fragmentos. O primeiro desafio é que com cada shard tendo seus próprios validators, cada shard agora é 10 vezes menos seguro que o cadeia inteira. Portanto, se uma cadeia não fragmentada com X validators decidir fazer um hard fork em uma cadeia de fragmentos e divide X validators em 10 fragmentos, cada fragmento agora tem apenas X/10 validators, e corromper um fragmento requer apenas corromper 5,1% (51%/10) do número total de validators (ver figura 1), Figura 1: Dividindo os validators entre fragmentos o que nos leva ao segundo ponto: quem escolhe validators para cada fragmento? Controlar 5,1% de validators só será prejudicial se todos esses 5,1% de validators estão no mesmo fragmento. Se validators não puderem escolher qual fragmento eles validarão em, é altamente improvável que um participante que controle 5,1% dos validators obtenha todos seus validators no mesmo fragmento, reduzindo fortemente sua capacidade de comprometer o sistema. Quase todos os designs de sharding hoje dependem de alguma fonte de aleatoriedade para atribua validators aos fragmentos. A aleatoriedade em blockchain por si só é um tópico muito desafiador e está fora do escopo deste documento. Por enquanto vamos supor que haja alguma fonte de aleatoriedade que possamos usar. Abordaremos a tarefa de validator em mais detalhes na seção 2.1. Tanto a aleatoriedade quanto a atribuição validator requerem computação que não é específico para qualquer fragmento em particular. Para esse cálculo, praticamente todos os existentes projetos têm um blockchain separado encarregado de executar operações necessário para a manutenção de toda a rede. Além de gerar aleatoriamentenúmeros e atribuindo validators aos fragmentos, essas operações geralmente também incluem receber atualizações de fragmentos e tirar instantâneos deles, processar apostas e cortes em sistemas de prova de aposta e rebalanceamento de fragmentos quando isso recurso é suportado. Essa cadeia é chamada de cadeia Beacon em Ethereum, uma cadeia de relé cadeia em PolkaDot e o Hub Cosmos em Cosmos. Ao longo deste documento nos referiremos a essa cadeia como cadeia Beacon. A existência da cadeia Beacon nos leva ao próximo tópico interessante, o fragmentação quadrática. 1.2 Fragmentação quadrática A fragmentação é frequentemente anunciada como uma solução que se adapta infinitamente ao número de nós participantes da operação da rede. Embora seja em teoria possível projetar tal solução de sharding, qualquer solução que tenha o conceito de Beacon cadeia não tem escalabilidade infinita. Para entender o porquê, observe que o Beacon chain precisa fazer alguns cálculos contábeis, como atribuir validators a fragmentos, ou instantâneos de blocos de cadeia de fragmentos, que são proporcionais ao número de fragmentos no sistema. Como a própria cadeia Beacon é um único blockchain, com computação limitada pelas capacidades computacionais dos nós que a operam, o número de fragmentos é naturalmente limitado. No entanto, a estrutura de uma rede fragmentada confere um efeito multiplicativo afetará quaisquer melhorias em seus nós. Considere o caso em que um arbitrário melhoria é feita na eficiência dos nós da rede, o que permitirá proporcionando tempos de processamento de transações mais rápidos. Se os nós que operam a rede, incluindo os nós da cadeia Beacon, se tornar quatro vezes mais rápido, então cada fragmento será capaz de processar quatro vezes mais transações, e a cadeia Beacon será capaz de manter 4 vezes mais fragmentos. A taxa de transferência em todo o sistema aumentará pelo fator de 4 × 4 = 16 — daí o nome fragmentação quadrática. É difícil fornecer uma medida precisa de quantos fragmentos estão viável hoje, mas é improvável que num futuro próximo o rendimento as necessidades dos usuários blockchain superarão as limitações da fragmentação quadrática. O grande número de nós necessários para operar tal volume de fragmentos com segurança é provavelmente ordens de magnitude maior do que o número de nós operando em todos os blockchains combinados hoje. 1.3 Fragmentação de estado Até agora não definimos muito bem o que exatamente é e o que não é separado quando uma rede é dividida em fragmentos. Especificamente, nós no blockchain realizam três tarefas importantes: eles não apenas 1) processam transações, eles também 2) retransmitir transações validadas e blocos concluídos para outros nós e 3) armazenar o estado e o histórico de todo o livro-razão da rede. Cada um desses três tarefas impõe uma exigência crescente aos nós que operam a rede:1. A necessidade de processar transações requer mais poder computacional com o aumento do número de transações processadas; 2. A necessidade de retransmitir transações e blocos requer mais largura de banda de rede com o aumento do número de transações retransmitidas; 3. A necessidade de armazenar dados exige mais armazenamento à medida que o estado cresce. É importante ressaltar que, diferentemente do poder de processamento e da rede, a necessidade de armazenamento aumenta mesmo que a taxa de transação (número de transações processadas por segundo) permanece constante. Da lista acima pode parecer que o requisito de armazenamento seria o mais urgente, pois é o único que vem aumentando ao longo do tempo mesmo que o número de transações por segundo não mude, mas na prática o requisito mais urgente hoje é o poder de computação. Todo o estado de Ethereum no momento em que este livro foi escrito tinha 100 GB, facilmente gerenciável pela maioria dos nós. Mas o número de transações que Ethereum pode processar é cerca de 20, ordens de magnitude menor do que o necessário para muitos casos de uso prático. Zilliqa é o projeto mais conhecido que fragmenta o processamento, mas não o armazenamento. A fragmentação do processamento é um problema mais fácil porque cada nó possui todo o estado, o que significa que os contratos podem invocar livremente outros contratos e ler quaisquer dados do blockchain. É necessária alguma engenharia cuidadosa para garantir atualizações de vários fragmentos atualizando as mesmas partes do estado não entram em conflito. Em nestes aspectos, Zilliqa está a adoptar uma abordagem relativamente simplista2. Embora tenha sido proposta a fragmentação do armazenamento sem a fragmentação do processamento, é extremamente incomum. Assim, na prática, a fragmentação de armazenamento, ou fragmentação de estado, quase sempre implica fragmentação de processamento e fragmentação de rede. Praticamente, no State Sharding, os nós em cada shard estão construindo seus próprio blockchain que contém transações que afetam apenas a parte local do estado global atribuído a esse fragmento. Portanto, os validators no o fragmento só precisa armazenar sua parte local do estado global e apenas executar, e, como tal, apenas retransmitem transações que afetam a sua parte do Estado. Isto partição reduz linearmente o requisito de todo o poder de computação, armazenamento e largura de banda da rede, mas introduz novos problemas, como disponibilidade de dados e transações entre fragmentos, ambas abordadas abaixo. 1.4 Transações entre fragmentos O modelo de fragmentação que descrevemos até agora não é muito útil, porque se fragmentos não podem se comunicar entre si, eles não são melhores do que vários blockchains independentes. Ainda hoje, quando a fragmentação não está disponível, há uma enorme demanda por interoperabilidade entre vários blockchains. Por enquanto, vamos considerar apenas transações de pagamento simples, onde cada participante possui conta em exatamente um fragmento. Se alguém deseja transferir dinheiro de 2Nossa análise de sua abordagem pode ser encontrada aqui: https://medium.com/nearprotocol/ 8f9efa0ce3buma conta para outra dentro do mesmo fragmento, a transação pode ser processada inteiramente pelos validators naquele fragmento. Se, no entanto, Alice que reside no fragmento

1 deseja enviar dinheiro para Bob, que reside no fragmento #2, nem validators

no fragmento nº 1 (eles não poderão creditar a conta de Bob) nem os validators em o fragmento nº 2 (eles não poderão debitar a conta de Alice) pode processar todo o transação. Existem duas famílias de abordagens para transações entre fragmentos: • Síncrono: sempre que uma transação entre fragmentos precisa ser executada, os blocos em vários fragmentos que contêm transição de estado relacionada ao a transação é produzida ao mesmo tempo, e os validators de vários fragmentos colaboram na execução de tais transações.3 • Assíncrona: uma transação entre fragmentos que afeta vários fragmentos é executado nesses fragmentos de forma assíncrona, o fragmento “Crédito” em execução sua metade assim que tiver evidências suficientes de que o fragmento “Débito” executou sua parte. Esta abordagem tende a ser mais prevalente devido à sua simplicidade e facilidade de coordenação. Este sistema é hoje proposto em Cosmos, Ethereum Serenity, Near, Kadena e outros. Um problema com isso abordagem reside no fato de que, se os blocos forem produzidos independentemente, há uma chance diferente de zero de que um dos vários blocos fique órfão, tornando assim a transação foi aplicada apenas parcialmente. Considere a figura 2 que representa dois fragmentos que encontraram uma bifurcação e uma transação entre fragmentos que foi registrado nos blocos A e X’ correspondentemente. Se as cadeias A-B e V'-X'-Y'-Z' acabam sendo canônicos nos fragmentos correspondentes, o a transação está totalmente finalizada. Se A'-B'-C'-D' e V-X se tornarem canônicos, então a transação é totalmente abandonada, o que é aceitável. Mas se, por Por exemplo, A-B e V-X tornam-se canônicos, então uma parte da transação é finalizada e a outra é abandonada, criando uma falha de atomicidade. Nós abordará como esse problema é abordado nos protocolos propostos na segunda parte, ao cobrir mudanças nas regras de escolha bifurcada e no consenso algoritmos propostos para protocolos fragmentados. Observe que a comunicação entre cadeias é útil fora de blockchains fragmentados também. A interoperabilidade entre cadeias é um problema complexo que muitos projetos estão tentando resolver. Em blockchains fragmentados, o problema é um pouco mais fácil, pois a estrutura do bloco e o consenso são os mesmos entre os fragmentos e há uma cadeia de beacons que pode ser usada para coordenação. Em um blockchain fragmentado, no entanto, todas as cadeias de fragmentos são iguais, enquanto no ecossistema global blockchains existe existem muitos blockchains diferentes, com diferentes casos de uso alvo, descentralização e garantias de privacidade. Construir um sistema no qual um conjunto de cadeias tem propriedades diferentes, mas usar consenso e estrutura de bloco suficientemente semelhantes e ter uma cadeia de beacon comum poderia permitir um ecossistema de blockchains heterogêneos que têm um 3O mais detalhado proposta conhecido para o autores de isso documento é Mesclar Blocos, descrito aqui: https://ethresear.ch/t/ merge-blocks-and-synchronous-cross-shard-state-execution/1240Figura 2: Transações assíncronas entre fragmentos subsistema de interoperabilidade funcional. É improvável que tal sistema apresente rotação validator, portanto, algumas medidas extras precisam ser tomadas para garantir a segurança. Ambos Cosmos e PolkaDot são efetivamente esses sistemas4 1,5 Comportamento malicioso Nesta seção, revisaremos qual comportamento adversário pode validators maliciosos exercício se conseguirem corromper um fragmento. Revisaremos abordagens clássicas para evitar a corrupção de fragmentos na seção 2.1. 1.5.1 Garfos maliciosos Um conjunto de validators maliciosos pode tentar criar uma bifurcação. Observe que isso não importa se o consenso subjacente é BFT ou não, corrompendo um número suficiente de validators sempre possibilitará a criação de um fork. É significativamente mais provável que mais de 50% de um único fragmento seja corrompido do que mais de 50% de toda a rede seja corrompida (vamos aprofunde-se nessas probabilidades na seção 2.1). Conforme discutido na seção 1.4, transações entre fragmentos envolvem certas mudanças de estado em vários fragmentos e os blocos correspondentes em tais fragmentos que aplicam tais mudanças de estado devem ser todos finalizados (ou seja, aparecer nas cadeias selecionadas em seus correspondentes fragmentos), ou todos serão órfãos (ou seja, não aparecerão nas cadeias selecionadas em seus fragmentos correspondentes). Como geralmente a probabilidade de os fragmentos serem corrompidos 4Consulte este artigo de Zaki Manian de Cosmos: https://forum.cosmos.network/ t/polkadot-vs-cosmos/1397/2 e esta tempestade de tweets do primeiro autor deste documento: https://twitter.com/AlexSkidanov/status/1129511266660126720 para uma comparação detalhada dos dois

não é insignificante, não podemos presumir que as bifurcações não acontecerão mesmo se um consenso bizantino for alcançado entre os fragmentos validators, ou se muitos blocos forem produzido no topo do bloco com a mudança de estado. Este problema tem múltiplas soluções, sendo a mais comum a ocasional ligação cruzada do bloco de cadeia de shard mais recente à cadeia de beacon. O garfo a regra de escolha nas cadeias de fragmentos é então alterada para sempre preferir a cadeia que é reticulado e aplica apenas a regra de escolha de bifurcação específica do shard para blocos que foram publicados desde a última ligação cruzada. 1.5.2 Aprovando blocos inválidos Um conjunto de validators pode tentar criar um bloco que aplique a função de transição de estado incorretamente. Por exemplo, começando com um estado em que Alice tem 10 tokens e Bob tem 0 tokens, o bloco pode conter uma transação que envia 10 tokens de Alice para Bob, mas termina com um estado em que Alice tem 0 tokens e Bob tem 1000 tokens, conforme mostrado na figura 3. Figura 3: Um exemplo de bloco inválido Em um blockchain clássico não fragmentado, tal ataque não é possível, uma vez que todos o participante da rede valida todos os blocos, e o bloco com tal uma transição de estado inválida será rejeitada por ambos os outros produtores de blocos, e os participantes da rede que não criam blocos. Mesmo que o malicioso validators continuam criando blocos em cima de um bloco inválido mais rápido do que validators honestos constroem a cadeia correta, tendo assim a cadeia com o inválido bloco sendo mais longo, não importa, pois cada participante que estiver usando o blockchain para qualquer finalidade valida todos os blocos e descarta todos os blocos construído em cima do bloco inválido. Na figura 4 existem cinco validators, três dos quais são maliciosos. Eles criou um bloco A’ inválido e continuou construindo novos blocos no topo disso. Dois validators honestos descartaram A’ como inválido e estavam construindo em cimaFigura 4: Tentativa de criar um bloco inválido em um blockchain não fragmentado do último bloco válido conhecido por eles, criando uma bifurcação. Como há menos validators na bifurcação honesta, sua cadeia é mais curta. No entanto, no blockchain clássico não fragmentado, todo participante que usa blockchain para qualquer finalidade é responsável por validar todos os blocos que recebe e recalcular o estado. Assim, qualquer pessoa que tenha algum interesse no blockchain observaria que A’ é inválido e, portanto, também descarta imediatamente B', C' e D', como tal, tomando o cadeia AB como a cadeia válida mais longa atual. Em um blockchain fragmentado, entretanto, nenhum participante pode validar todas as transações em todos os fragmentos, então eles precisam ter alguma forma de confirmar que em nenhum ponto na história de qualquer fragmento de blockchain nenhum bloco inválido foi incluído. Observe que, diferentemente dos forks, a ligação cruzada com a cadeia Beacon não é uma solução suficiente, uma vez que a cadeia Beacon não tem a capacidade de validar a cadeia Beacon. blocos. Ele só pode validar que há um número suficiente de validators naquele fragmento assinou o bloco (e como tal atestou a sua veracidade). Discutiremos soluções para este problema na seção 2.2 abaixo.

상태 유효성 및 데이터 가용성

샤딩된 blockchains의 핵심 아이디어는 대부분의 참가자가 네트워크를 사용하면 모든 샤드의 블록을 확인할 수 없습니다. 이처럼, 언제든지 모든 참가자는 일반적으로 사용할 수 없는 특정 샤드와 상호 작용해야 합니다. 샤드의 전체 기록을 다운로드하고 검증합니다. 그러나 샤딩의 파티셔닝 측면은 상당한 잠재력을 불러일으킵니다. 문제: 특정 기록의 전체 기록을 다운로드하고 검증하지 않고 샤드 참가자는 반드시 상태가 무엇인지 확신할 수 없습니다. 5하위 섹션 2.5.3을 제외하고 이 섹션은 이전에 https://near.ai/에 게시되었습니다. 샤드2. 이전에 읽으셨다면 다음 섹션으로 건너뛰세요.

그들이 상호 작용하는 것은 유효한 블록 시퀀스의 결과이며 그러한 시퀀스는 of block은 실제로 샤드의 정식 체인입니다. 그렇지 않은 문제 샤딩되지 않은 blockchain에 존재합니다. 먼저 제안된 이 문제에 대한 간단한 해결책을 제시하겠습니다. 여러 프로토콜을 사용하여 이 솔루션이 어떻게 중단될 수 있는지 분석하고 이를 해결하기 위한 시도가 이루어졌습니다. 2.1 검증인 교체 상태 타당성에 대한 순진한 해결책은 그림 5에 나와 있습니다. 전체 시스템에는 수천 개의 validator이 있으며 그 중 20% 이하가 악의적이거나 다른 방식으로 실패합니다(예: 온라인으로 블록을 생성합니다). 그런 다음 200개의 validator을 샘플링하면 확률은 1개 이상의 실용적인 목적으로 3개의 실패는 0으로 가정될 수 있습니다. 그림 5: 샘플링 validators 1 3은 중요한 기준점이다. 합의 프로토콜 계열이 있습니다. BFT 합의 프로토콜은 1보다 적은 기간 동안 이를 보장합니다. 3개 참가자가 충돌하거나 규정을 위반하는 방식으로 행동하여 실패합니다. 프로토콜을 통해 합의에 도달할 것입니다. 정직한 validator 백분율을 가정하여 현재 세트가 샤드의 validators는 우리에게 일부 블록을 제공하며 순진한 솔루션은 가정합니다. 블록이 유효하고 validators가 믿었던 것을 기반으로 구축되었습니다. 검증을 시작할 때 해당 샤드에 대한 정식 체인입니다. validators 이전 validator 세트에서 표준 체인을 배웠습니다. 캐노니컬 체인의 선두인 블록 위에 구축된 가정 그 전에. 유도에 의해 전체 체인이 유효하며 validators 세트가 없기 때문에 어느 시점에서든 포크가 생성되면 순진한 솔루션은 현재의 체인은 샤드의 유일한 체인입니다. 시각화는 그림 6을 참조하세요.

그림 6: BFT 합의를 통해 확정된 각 블록의 blockchain validators가 다음과 같을 수 있다고 가정하면 이 간단한 솔루션은 작동하지 않습니다. 이는 적응적으로 손상되었으며 이는 불합리한 가정이 아닙니다6. 적응적으로 1000개의 샤드가 있는 시스템에서 단일 샤드를 손상시키는 것이 훨씬 저렴합니다. 전체 시스템을 손상시키는 것보다. 따라서 프로토콜의 보안은 샤드 수에 따라 선형적으로 감소합니다. 타당성에 대한 확신을 갖기 위해 블록을 생성하려면 역사상 어느 시점에서든 시스템의 샤드가 없음을 알아야 합니다. validator의 대다수가 공모하고 있습니다. 적응형 적과 함께라면 우리는 더 이상 그런 확신. 섹션 1.5에서 논의한 것처럼 validators의 공모는 행사할 수 있습니다. 두 가지 기본적인 악의적 행동: 포크 생성 및 유효하지 않은 블록 생성. 악의적인 포크는 일반적으로 기존보다 훨씬 더 높은 보안을 갖도록 설계된 비콘 체인에 블록을 교차 연결하여 처리할 수 있습니다. 샤드 체인. 그러나 유효하지 않은 블록을 생성하는 것은 훨씬 더 많은 것입니다. 해결해야 할 어려운 문제. 2.2 상태 유효성 샤드 #1이 손상되고 악의적인 행위자가 생성하는 그림 7을 생각해 보세요. 유효하지 않은 블록 B. 이 블록 B에서 1000 tokens가 씬에서 생성되었다고 가정합니다. 앨리스 계정으로 방송됩니다. 그런 다음 악의적인 행위자는 유효한 블록 C를 생성합니다( C의 트랜잭션이 올바르게 적용되었음을 감지) B 위에서 난독화 유효하지 않은 블록 B를 삭제하고 샤드 #2에 대한 교차 샤드 트랜잭션을 시작합니다. 1000 token을 Bob의 계좌로 이체합니다. 지금부터 부적절하게 생성된 token은 샤드 #2의 완전히 유효한 blockchain에 상주합니다. 이 문제를 해결하기 위한 몇 가지 간단한 접근 방식은 다음과 같습니다. 6읽기 이 기사 에 대한 세부사항 에 어떻게 적응형 부패 할 수 있다 있다 운반 밖으로: https://medium.com/nearprotocol/d859adb464c8. 에 대한 더 세부사항 에 적응형 부패, 읽다 https://github.com/ethereum/wiki/wiki/Sharding-FAQ# 우리가 운영하고 있는 보안 모델은 무엇입니까?그림 7: 유효하지 않은 블록이 있는 체인의 교차 샤드 트랜잭션 1. 샤드 #2의 validators에 대해 트랜잭션이 발생한 블록을 검증합니다. 시작됩니다. 위의 예에서도 블록 C 때문에 작동하지 않습니다. 완전히 유효한 것 같습니다. 2. 샤드 #2의 validators에서 트랜잭션이 시작되는 블록 이전에 있는 다수의 블록을 검증합니다. 당연히, 수신 샤드에 의해 검증된 블록 수 N validators는 잘못된 블록 위에 N+1개의 유효한 블록을 생성할 수 있습니다. 생산. 이 문제를 해결하기 위한 유망한 아이디어는 샤드를 배열하는 것입니다. 각 샤드가 여러 다른 샤드에 연결된 무방향 그래프 인접한 샤드 간의 교차 샤드 트랜잭션만 허용합니다. Vlad Zamfir의 샤딩은 기본적으로 작동하며7, Kadena의 샤딩에서도 비슷한 아이디어가 사용됩니다. 체인웹 [1]). 샤드 간 교차 샤드 트랜잭션이 필요한 경우 이웃이 아닌 경우 이러한 트랜잭션은 여러 샤드를 통해 라우팅됩니다. 이 디자인에서는 각 샤드의 validator는 샤드의 모든 블록을 모두 검증해야 합니다. 모든 인접 샤드의 모든 블록도 마찬가지입니다. 아래 그림을 고려하십시오 샤드 10개, 각 샤드에는 4개의 이웃이 있고 더 많은 샤드가 필요한 샤드는 2개 없습니다. 그림 8에 표시된 교차 샤드 통신의 경우 홉이 2개 이상입니다. 샤드 #2는 자체 blockchain뿐만 아니라 blockchain도 검증합니다. 샤드 #1을 포함한 모든 이웃. 따라서 샤드 #1의 악의적인 행위자가 유효하지 않은 블록 B를 생성하려고 시도한 다음 그 위에 블록 C를 구축하려고 합니다. 교차 샤드 트랜잭션을 시작하면 이러한 교차 샤드 트랜잭션은 진행되지 않습니다. 샤드 #2가 샤드 #1의 전체 기록을 검증했기 때문에 유효하지 않은 블록 B를 식별하게 됩니다. 7여기에서 디자인에 대해 자세히 알아보세요: https://medium.com/nearprotocol/37e538177ed9

그림 8: 체인웹과 같은 시스템에서 잘못된 교차 샤드 트랜잭션이 발생합니다. 감지되다 단일 샤드를 손상시키는 것은 더 이상 실행 가능한 공격이 아니지만 소수의 샤드가 문제로 남아 있습니다. 그림 9에서는 두 샤드 모두를 손상시키는 적

1과 샤드 #2는 샤드 #3에 대한 교차 샤드 트랜잭션을 성공적으로 실행합니다.

유효하지 않은 블록 B의 자금으로: 그림 9: 체인웹과 같은 시스템에서 잘못된 교차 샤드 트랜잭션이 발생합니다. 감지되지 않음 샤드 #3은 샤드 #2의 모든 블록을 검증하지만 샤드 #1에서는 그렇지 않습니다. 악성 블록을 탐지할 방법이 없습니다. 상태 타당성을 적절하게 해결하는 데에는 두 가지 주요 방향이 있습니다.

및 계산의 암호화 증명. 2.3 어부 첫 번째 접근 방식의 기본 아이디어는 다음과 같습니다. 어떤 목적으로든 체인 간에 통신됩니다(예: 비콘 체인 또는 교차 샤드 트랜잭션)에는 일정 기간이 있습니다. 정직한 validator은 블록이 유효하지 않다는 증거를 제공할 수 있습니다. 거기 블록이 다음과 같다는 매우 간결한 증거를 가능하게 하는 다양한 구성입니다. 유효하지 않으므로 수신 노드의 통신 오버헤드가 훨씬 작습니다. 전체 블록을 받는 것보다 적어도 하나의 정직한 validator이 있는 한 이 접근 방식을 사용합니다. 샤드, 시스템은 안전합니다. 그림 10: 어부 이는 오늘날 제안된 프로토콜 중에서 (문제가 존재하지 않는 척하는 것 외에도) 지배적인 접근 방식입니다. 그러나 이 접근 방식에는 두 가지가 있습니다. 주요 단점: 1. 정직한 validator을 위해서는 도전 기간이 충분히 길어야 합니다. 블록이 생성되었음을 인식하고, 다운로드하고, 완전히 검증하고, 준비하는 것 블록이 유효하지 않은 경우 챌린지입니다. 그러한 기간을 도입하면 샤드 간 트랜잭션 속도가 현저히 느려집니다. 2. 챌린지 프로토콜의 존재로 인해 새로운 공격 벡터가 생성됩니다. 악성 노드가 유효하지 않은 챌린지로 스팸을 보낼 때. 확실한 해결책 이 문제는 도전자가 일정량의 token을 입금하도록 하는 것입니다. 챌린지가 유효한 경우 반환됩니다. 이는 부분적인 해결책일 뿐이므로 공격자가 시스템에 스팸을 보내는 것은 여전히 ​​유익할 수 있습니다. 예금) 유효하지 않은 도전과 함께, 예를 들어 유효한 것을 방지하기 위해정직한 validator의 도전을 통과하세요. 이러한 공격은 애도 공격이라고합니다. 후자의 지점을 우회하는 방법은 섹션 3.7.2를 참조하세요. 2.4 간결한 비대화형 지식 논증 다중 샤드 손상에 대한 두 번째 해결책은 특정 계산(예: 일련의 거래에서 블록을 계산하는 것처럼)이 올바르게 수행되었습니다. 이러한 구조가 존재합니다. zk-SNARK, zk-STARK 및 기타 몇 가지 일부는 오늘날 개인 결제를 위해 blockchain 프로토콜에서 적극적으로 사용됩니다. 가장 주목할만한 것은 ZCash입니다. 이러한 기본 요소의 주요 문제점은 다음과 같습니다. 계산 속도가 매우 느립니다. 예: zk-SNARK를 사용하는 Coda 프로토콜 특히 blockchain의 모든 블록이 유효하다는 것을 증명하기 위해 증거를 만드는 데 거래당 30초가 걸릴 수 있다는 인터뷰 (이 숫자는 아마도 지금쯤에는 더 작을 것입니다). 흥미롭게도, 신뢰할 수 있는 당사자가 증명을 계산할 필요가 없습니다. 증명은 그것이 만들어진 계산의 타당성을 증명할 뿐만 아니라 증명 자체의 타당성. 따라서 그러한 증명의 계산은 분할될 수 있습니다. 것보다 중복성이 훨씬 적은 참가자 집합 중에서 신뢰할 수 없는 계산을 수행하는 데 필요합니다. 참가자에게도 허용됩니다. zk-SNARK를 계산하여 비용을 줄이지 않고 특수 하드웨어에서 실행하는 사람 시스템의 분산화. 성능 외에도 zk-SNARK의 과제는 다음과 같습니다. 1. 덜 연구되고 덜 테스트된 암호화 기본 요소에 대한 의존성 2. "독성 폐기물" — zk-SNARK는 그룹이 신뢰하는 설정에 의존합니다. 의 사람들이 일부 계산을 수행한 다음 중간 결과를 버립니다. 해당 계산의 값. 절차의 모든 참가자가 공모하는 경우 중간 값을 유지하면 가짜 증거가 생성될 수 있습니다. 3. 시스템 설계에 추가 복잡성이 도입되었습니다. 4. zk-SNARK는 가능한 계산의 하위 집합에 대해서만 작동하므로 프로토콜은 Turing-complete smart contract 언어로는 사용할 수 없습니다 SNARK는 체인의 유효성을 증명합니다. 2.5 데이터 가용성 우리가 다룰 두 번째 문제는 데이터 가용성입니다. 일반적으로 노드 특정 blockchain을 운영하는 것은 두 그룹으로 구분됩니다: 전체 노드, 모든 전체 블록을 다운로드하고 모든 거래를 검증하는 것, 그리고 Light 블록 헤더만 다운로드하고 부분에 Merkle 증명을 사용하는 노드 그림 11에서 볼 수 있듯이 그들이 관심을 갖고 있는 상태와 트랜잭션에 대해 설명합니다.

그림 11: 머클 트리 이제 대다수의 전체 노드가 공모하면 유효하거나 유효한 블록을 생성할 수 있습니다. 유효하지 않으며 hash을 라이트 노드로 보내지만 전체 내용을 공개하지 마십시오. 블록의. 그들이 그것으로부터 이익을 얻을 수 있는 방법은 다양합니다. 예를 들어, 그림 12를 살펴보세요. 그림 12: 데이터 가용성 문제 세 가지 블록이 있습니다. 이전 블록 A는 정직한 validators에 의해 생성되었습니다. 현재 B에는 validators가 공모하고 있습니다. 그리고 다음 C도 생산될 것이다. 정직한 validators(blockchain는 오른쪽 하단에 표시되어 있습니다). 당신은 상인입니다. 현재 블록(B)의 validators가 수신된 블록입니다. 이전 validators의 A는 귀하가 돈을 받는 블록을 계산했습니다.상태에 대한 Merkle 증명과 함께 해당 블록의 헤더를 보냈습니다. 당신은 돈이 있습니다 (또는 돈을 보내는 유효한 거래에 대한 머클 증명 당신에게). 거래가 완료되었음을 확신하고 서비스를 제공합니다. 그러나 validators는 블록 B의 전체 내용을 절대 배포하지 않습니다. 누구나. 따라서 블록 C의 정직한 validators는 블록을 검색할 수 없으며, 강제로 시스템을 정지시키거나 A 위에 구축해야 하므로 돈 상인. 동일한 시나리오를 샤딩에 적용할 때 전체 및 샤딩의 정의는 다음과 같습니다. 라이트 노드는 일반적으로 샤드별로 적용됩니다. 각 샤드의 validators는 매 다운로드마다 해당 샤드를 차단하고 해당 샤드의 모든 트랜잭션을 검증하지만 다른 스냅샷 샤드 체인 상태를 포함하는 시스템의 노드 비콘 체인의 경우 헤더만 다운로드하세요. 따라서 샤드의 validator은 다음과 같습니다. 해당 샤드의 노드를 사실상 가득 채우는 반면, 시스템의 다른 참가자는 비콘 체인을 포함하여 라이트 노드로 작동합니다. 위에서 논의한 어부 접근 방식의 경우 정직한 validators 비콘 체인에 교차 연결된 블록을 다운로드할 수 있어야 합니다. 악의적인 validators가 유효하지 않은 블록의 헤더를 교차 연결하거나 이를 사용하여 교차 샤드 트랜잭션을 시작하지만 블록을 배포하지는 않습니다. validators는 도전 과제를 만들 방법이 없습니다. 우리는 이 문제를 보완하는 세 가지 접근 방식을 다룰 것입니다. 서로. 2.5.1 양육권 증명 해결해야 할 가장 시급한 문제는 블록이 한 번만 사용 가능한지 여부입니다. 출판되었습니다. 제안된 아이디어 중 하나는 회전하는 소위 공증인을 갖는 것입니다. 유일한 작업이 다운로드인 validator보다 더 자주 샤드 사이에 다운로드할 수 있었다는 사실을 차단하고 증명합니다. 그들은 수 있습니다 전체 상태를 다운로드할 필요가 없기 때문에 더 자주 회전됩니다. 자주 회전할 수 없는 validator과 달리 샤드의 그림과 같이 샤드가 회전할 때마다 샤드의 상태를 다운로드해야 합니다. 13. 이 순진한 접근 방식의 문제점은 나중에 증명하는 것이 불가능하다는 것입니다. 공증인이 블록을 다운로드했는지 여부에 따라 공증인은 없이 블록을 다운로드할 수 있었다는 것을 항상 증명하도록 선택할 수 있습니다. 그것을 되찾으려고도 합니다. 이에 대한 한 가지 해결책은 공증인이 다음을 제공하는 것입니다. 어떤 증거를 확보하거나 블록이 다운로드되었습니다. 그러한 솔루션 중 하나가 여기에서 논의됩니다: https://ethresear.ch/t/ 1비트 집합 친화적 보관 채권/2236. 2.5.2 삭제 코드 특정 라이트 노드가 블록의 hash을 수신하면 노드의 라이트 노드를 늘리기 위해 블록이 사용 가능하다는 확신이 있으면 몇 가지 무작위 다운로드를 시도할 수 있습니다. 블록 조각. 이것은 완전한 해결책이 아닙니다. 왜냐하면 라이트 노드가 그렇지 않으면 악의적인 블록 생산자가 선택할 수 있는 전체 블록을 집합적으로 다운로드합니다.

그림 13: 유효성 검사기는 상태를 다운로드해야 하므로 회전할 수 없습니다. 자주 라이트 노드에 의해 다운로드되지 않은 블록 부분을 보류하기 위해, 따라서 여전히 블록을 사용할 수 없게 됩니다. 한 가지 해결책은 삭제 코드라는 구성을 사용하여 이를 가능하게 하는 것입니다. 그림과 같이 블록의 일부만 사용할 수 있는 경우에도 전체 블록을 복구하려면 그림 14에서. 그림 14: Merkle tree 삭제 코딩된 데이터 위에 구축됨 Polkadot 및 Ethereum Serenity는 모두 이 아이디어를 바탕으로 디자인했습니다. 라이트 노드가 블록을 사용할 수 있다고 합리적으로 확신할 수 있는 방법을 제공합니다. Ethereum Serenity 접근 방식은 [2]에 자세한 설명이 있습니다.2.5.3 데이터 가용성에 대한 Polkadot의 접근 방식 Polkadot에서는 대부분의 샤드 솔루션과 마찬가지로 각 샤드(파라체인이라고 함)가 비콘 체인(릴레이 체인이라고 함)에 해당 블록의 스냅샷을 찍습니다. 2f + 1이 있다고 가정해 보세요. 릴레이 체인의 validators. 파라체인 블록의 블록 생산자는 콜레이터, 일단 파라체인 블록이 생성되면 모든 f 부분이 충분하도록 2f +1 부분으로 구성된 블록의 삭제 코딩 버전을 계산합니다. 블록을 재구성합니다. 그런 다음 각 validator에 하나의 부품을 배포합니다. 릴레이 체인. 특정 릴레이 체인 validator은 릴레이 체인에만 서명합니다. 스냅샷된 각 파라체인 블록에 해당 부분이 있는 경우 블록을 차단합니다. 그러한 릴레이 체인 블록. 따라서 릴레이 체인 블록에 2f + 1의 서명이 있는 경우 validators, 그리고 그 중 f개 이상이 프로토콜을 위반하지 않는 한, 각각은 파라체인 블록은 validators에서 부품을 가져와서 재구성할 수 있습니다. 프로토콜을 따르는 것입니다. 그림 15를 참조하십시오. 그림 15: Polkadot의 데이터 가용성 2.5.4 장기적인 데이터 가용성 위에서 논의한 모든 접근 방식은 블록이 다음과 같다는 사실만 입증합니다. 전혀 게시되지 않았으며 현재 사용할 수 있습니다. 블록은 나중에 사용할 수 없게 될 수 있습니다. 다양한 이유: 노드가 오프라인 상태가 됨, 노드가 의도적으로 기록을 삭제함 데이터 및 기타. 이 문제를 해결하기 위해 언급할 가치가 있는 백서는 Polyshard [3]입니다. 여러 개의 블록이 있더라도 샤드 전체에서 블록을 사용할 수 있도록 삭제 코드를 사용합니다. 샤드는 데이터를 완전히 잃습니다. 불행하게도 그들의 특정 접근 방식에는 다음이 필요합니다. 모든 샤드는 다른 모든 샤드에서 블록을 다운로드해야 합니다. 비싸다. 장기적인 가용성은 문제만큼 시급하지 않습니다. 참가자가 없기 때문입니다. 시스템의 모든 체인을 검증할 수 있을 것으로 예상됩니다.

샤딩된 프로토콜의 보안은 다음과 같이 설계되어야 합니다. 일부 샤드의 일부 오래된 블록이 손상되더라도 시스템은 안전합니다. 전혀 사용할 수 없습니다.

Validade estadual e disponibilidade de dados

A ideia central em blockchains fragmentados é que a maioria dos participantes operando ou usar a rede não pode validar blocos em todos os shards. Como tal, sempre que qualquer participante precisa interagir com um fragmento específico, eles geralmente não podem baixe e valide todo o histórico do shard. O aspecto de particionamento do sharding, no entanto, levanta um potencial significativo problema: sem baixar e validar todo o histórico de um determinado fragmento, o participante não pode necessariamente ter certeza de que o estado com o qual 5Esta seção, exceto a subseção 2.5.3, foi publicada anteriormente em https://near.ai/ fragmento2. Se você leu antes, pule para a próxima seção.

eles interagem é o resultado de alguma sequência válida de blocos e que tal sequência de blocos é de fato a cadeia canônica no fragmento. Um problema que não existe em um blockchain não fragmentado. Apresentaremos primeiro uma solução simples para este problema que foi proposta por muitos protocolos e depois analisar como essa solução pode falhar e o que foram feitas tentativas para resolvê-lo. 2.1 Rotação de validadores A solução ingênua para a validade do estado é mostrada na figura 5: digamos que assumimos que todo o sistema possui da ordem de milhares de validators, dos quais não mais do que 20% são maliciosos ou irão falhar de outra forma (como por não serem online para produzir um bloco). Então, se amostrarmos 200 validators, a probabilidade de mais de 1 3 a falha para fins práticos pode ser assumida como zero. Figura 5: Amostragem de validators 1 3 é um limite importante. Existe uma família de protocolos de consenso, chamada BFT protocolos de consenso, que garantem que por menos de 1 3 de participantes falham, seja por bater ou por agir de alguma forma que viole o protocolo, o consenso será alcançado. Com esta suposição de porcentagem honesta de validator, se o conjunto atual de validators em um fragmento nos fornece algum bloqueio, a solução ingênua assume que o bloco é válido e que é construído sobre o que os validators acreditam ser a cadeia canônica desse fragmento quando eles começaram a validar. Os validators aprendeu a cadeia canônica do conjunto anterior de validators, que pelo mesmo suposição construída no topo do bloco que era o topo da cadeia canônica antes disso. Por indução, toda a cadeia é válida e, como nenhum conjunto de validators em qualquer ponto produziu garfos, a solução ingênua também é certa de que o atual chain é a única cadeia no fragmento. Veja a figura 6 para uma visualização.

Figura 6: Um blockchain com cada bloco finalizado via consenso BFT Esta solução simples não funciona se assumirmos que os validators podem ser corrompido adaptativamente, o que não é uma suposição irracional6. Adaptativamente corromper um único fragmento em um sistema com 1.000 fragmentos é significativamente mais barato do que corromper todo o sistema. Portanto, a segurança do protocolo diminui linearmente com o número de shards. Para ter certeza da validade um bloco, devemos saber que em qualquer momento da história nenhum fragmento do sistema foi a maioria dos validators conspirando; com adversários adaptativos, não temos mais tanta certeza. Como discutimos na seção 1.5, validators coniventes podem exercer dois comportamentos maliciosos básicos: criar bifurcações e produzir blocos inválidos. Forks maliciosos podem ser resolvidos por blocos interligados à cadeia Beacon, que geralmente é projetada para ter segurança significativamente maior do que as cadeias de fragmentos. Produzir blocos inválidos, no entanto, é uma tarefa significativamente mais problema desafiador para resolver. 2.2 Validade do Estado Considere a figura 7 na qual o fragmento nº 1 está corrompido e um agente malicioso produz bloco inválido B. Suponha que neste bloco B 1000 tokens foram cunhados ir ao ar por conta de Alice. O ator malicioso então produz o bloco C válido (em um sentido de que as transações em C são aplicadas corretamente) em cima de B, ofuscando o bloco inválido B e inicia uma transação entre fragmentos para o fragmento #2 que transfere esses 1.000 tokens para a conta de Bob. A partir deste momento o indevidamente tokens criados residem em um blockchain completamente válido no fragmento #2. Algumas abordagens simples para resolver esse problema são: 6Leia isso artigo para detalhes ligado como adaptativo corrupção pode ser carregado fora: https://medium.com/nearprotocol/d859adb464c8. Para mais detalhes ligado adaptativo corrupção, leia https://github.com/ethereum/wiki/wiki/Sharding-FAQ# quais são os modelos de segurança sob os quais estamos operandoFigura 7: Uma transação entre fragmentos de uma cadeia que possui um bloco inválido 1. Para validators do Shard #2 para validar o bloco do qual a transação é iniciado. Isso não funcionará nem no exemplo acima, pois o bloco C parece ser completamente válido. 2. Para validators no Shard #2 para validar um grande número de blocos anteriores ao bloco a partir do qual a transação é iniciada. Naturalmente, por qualquer número de blocos N validados pelo fragmento receptor do malicioso validators podem criar N+1 blocos válidos em cima do bloco inválido que eles produzido. Uma ideia promissora para resolver esse problema seria organizar os fragmentos em um gráfico não direcionado em que cada fragmento está conectado a vários outros fragmentos, e permitir apenas transações entre fragmentos vizinhos (por exemplo, é assim que A fragmentação de Vlad Zamfir funciona essencialmente7, e uma ideia semelhante é usada na fragmentação de Kadena. Chainweb [1]). Se uma transação entre fragmentos for necessária entre fragmentos que são não vizinhos, tal transação é roteada através de vários fragmentos. Neste projeto espera-se que um validator em cada fragmento valide todos os blocos em seu fragmento bem como todos os blocos em todos os fragmentos vizinhos. Considere uma figura abaixo com 10 fragmentos, cada um com quatro vizinhos, e não há dois fragmentos que exijam mais mais de dois saltos para uma comunicação entre fragmentos mostrada na figura 8. O fragmento nº 2 não está apenas validando seu próprio blockchain, mas também blockchains de todos os vizinhos, incluindo o Shard #1. Então, se um ator malicioso no Shard #1 está tentando criar um bloco B inválido e, em seguida, construir o bloco C sobre ele e iniciar uma transação entre fragmentos, tal transação entre fragmentos não ocorrerá desde o Shard #2 terá validado toda a história do Shard #1 que fará com que ele identifique o bloco B inválido. 7Leia mais sobre o design aqui: https://medium.com/nearprotocol/37e538177ed9

Figura 8: Uma transação cruzada inválida em um sistema tipo chainweb que irá ser detectado Embora corromper um único fragmento não seja mais um ataque viável, corromper um poucos fragmentos continuam sendo um problema. Na figura 9, um adversário corrompendo ambos os Shard

1 e Shard #2 executam com sucesso uma transação entre fragmentos para o Shard #3

com fundos de um bloco B inválido: Figura 9: Uma transação cruzada inválida em um sistema tipo chainweb que irá não ser detectado O Shard #3 valida todos os blocos no Shard #2, mas não no Shard #1, e não tem como detectar o bloco malicioso. Existem duas direções principais para resolver adequadamente a validade do estado: os pescadores

e provas criptográficas de computação. 2.3 Pescador A ideia por trás da primeira abordagem é a seguinte: sempre que um cabeçalho de bloco é comunicado entre cadeias para qualquer finalidade (como ligação cruzada com o cadeia de beacon ou uma transação entre fragmentos), há um período de tempo durante qual qualquer validator honesto pode fornecer uma prova de que o bloqueio é inválido. Lá são diversas construções que permitem provas muito sucintas de que os blocos são inválido, então a sobrecarga de comunicação para os nós receptores é bem menor do que receber um bloco completo. Com esta abordagem, enquanto houver pelo menos um validator honesto no fragmento, o sistema é seguro. Figura 10: Pescador Esta é a abordagem dominante (além de fingir que o problema não existe) entre os protocolos propostos hoje. Esta abordagem, no entanto, tem duas principais desvantagens: 1. O período de desafio precisa ser suficientemente longo para o honesto validator reconhecer que um bloco foi produzido, baixá-lo, verificá-lo completamente e preparar o desafio se o bloco for inválido. A introdução de tal período seria retardar significativamente as transações entre fragmentos. 2. A existência do protocolo de desafio cria um novo vetor de ataques quando nós maliciosos enviam spam com desafios inválidos. Uma solução óbvia para este problema é fazer com que os desafiantes depositem alguma quantia de tokens que são retornados se o desafio for válido. Esta é apenas uma solução parcial, pois ainda pode ser benéfico para o adversário enviar spam ao sistema (e queimar os depósitos) com desafios inválidos, por exemplo, para evitar o válidodesafio de um validator honesto de passar. Esses ataques são chamados ataques de luto. Consulte a seção 3.7.2 para saber como contornar o último ponto. 2.4 Argumentos de conhecimento sucintos e não interativos A segunda solução para a corrupção de múltiplos fragmentos é usar algum tipo de construção criptográfica que permita provar que um determinado cálculo (como como calcular um bloco de um conjunto de transações) foi realizado corretamente. Tais construções existem, por ex. zk-SNARKs, zk-STARKs e alguns outros, e alguns são usados ativamente em protocolos blockchain hoje para pagamentos privados, mais notavelmente ZCash. O principal problema com tais primitivas é que elas são notoriamente lentos para calcular. Por exemplo Protocolo Coda, que usa zk-SNARKs especificamente para provar que todos os blocos em blockchain são válidos, dito em um das entrevistas que pode levar 30 segundos por transação para criar uma prova (este número provavelmente é menor agora). Curiosamente, uma prova não precisa ser computada por uma parte confiável, uma vez que a prova não apenas atesta a validade do cálculo para o qual foi construída, mas também a validade da própria prova. Assim, o cálculo de tais provas pode ser dividido entre um conjunto de participantes com significativamente menos redundância do que seria necessário para realizar alguma computação sem confiança. Também permite aos participantes que computam zk-SNARKs para rodar em hardware especial sem reduzir o descentralização do sistema. Os desafios dos zk-SNARKs, além do desempenho, são: 1. Dependência de primitivas criptográficas menos pesquisadas e testadas ao longo do tempo; 2. “Resíduos tóxicos” – zk-SNARKs dependem de uma configuração confiável na qual um grupo de pessoas realiza alguns cálculos e depois descarta o intermediário valores desse cálculo. Se todos os participantes do procedimento conspirarem e manter os valores intermediários, podem ser criadas provas falsas; 3. Complexidade extra introduzida no design do sistema; 4. zk-SNARKs funcionam apenas para um subconjunto de cálculos possíveis, portanto, um protocolo com uma linguagem Turing-completa smart contract não seria capaz de usar SNARKs para provar a validade da cadeia. 2,5 Disponibilidade de dados O segundo problema que abordaremos é a disponibilidade de dados. Geralmente nós operando um determinado blockchain são separados em dois grupos: Full Nodes, aqueles que baixam cada bloco completo e validam cada transação, e Light Nós, aqueles que baixam apenas cabeçalhos de bloco e usam provas Merkle para peças do estado e das transações nas quais estão interessados, conforme mostrado na figura 11.

Figura 11: Árvore Merkel Agora, se a maioria dos nós completos conspirar, eles podem produzir um bloco, válido ou inválido e envia seu hash para os nós leves, mas nunca divulga o conteúdo completo do bloco. Existem várias maneiras pelas quais eles podem se beneficiar disso. Por exemplo, considere a figura 12: Figura 12: Problema de disponibilidade de dados Existem três blocos: o anterior, A, é produzido por validators honestos; o atual, B, tem validators conspirando; e o próximo, C, também será produzido por validators honestos (o blockchain está representado no canto inferior direito). Você é um comerciante. Os validators do bloco atual (B) receberam o bloco A dos validators anteriores, calculou um bloco no qual você recebe dinheiro,e enviei a você um cabeçalho desse bloco com uma prova Merkle do estado em que você tem dinheiro (ou uma prova Merkle de uma transação válida que envia o dinheiro para você). Confiante de que a transação foi finalizada, você fornece o serviço. Porém, os validators nunca distribuem o conteúdo completo do bloco B para qualquer um. Como tal, os validators honestos do bloco C não podem recuperar o bloco e são forçados a paralisar o sistema ou a construir em cima de A, privando você como comerciante de dinheiro. Quando aplicamos o mesmo cenário à fragmentação, as definições de completo e nó leve geralmente se aplica por fragmento: validators em cada download de fragmento a cada bloquear nesse fragmento e validar todas as transações nesse fragmento, mas outros nós no sistema, incluindo aqueles que capturam o estado das cadeias de fragmentos no cadeia de beacon, baixe apenas os cabeçalhos. Assim, os validators no fragmento são nós efetivamente completos para esse fragmento, enquanto outros participantes do sistema, incluindo a cadeia de beacon, operam como nós leves. Para que a abordagem do pescador que discutimos acima funcione, validators honestos precisa ser capaz de baixar blocos que estão interligados à cadeia de beacon. Se validators maliciosos vinculassem um cabeçalho de um bloco inválido (ou o usassem para iniciar uma transação entre fragmentos), mas nunca distribuiu o bloco, o honesto validators não têm como criar um desafio. Abordaremos três abordagens para resolver este problema que complementam um ao outro. 2.5.1 Provas de Custódia O problema mais imediato a ser resolvido é se um bloco estará disponível uma vez está publicado. Uma ideia proposta é ter os chamados Notários que façam rodízio entre fragmentos com mais frequência do que validators cuja única tarefa é baixar um bloquear e atestar que eles conseguiram baixá-lo. Eles podem ser girados com mais frequência porque não precisam baixar o estado inteiro do fragmento, ao contrário dos validators que não podem ser girados com frequência, pois devem baixar o estado do shard cada vez que eles giram, conforme mostrado na figura 13. O problema com esta abordagem ingénua é que é impossível provar mais tarde se o Tabelião conseguiu ou não fazer o download do bloco, então um Tabelião podem optar por sempre atestar que conseguiram baixar o bloco sem mesmo tentando recuperá-lo. Uma solução para isto é os Notários fornecerem alguma evidência ou apostar alguma quantidade de tokens atestando que o bloco foi baixado. Uma dessas soluções é discutida aqui: https://ethresear.ch/t/ Títulos de custódia compatíveis com agregação de 1 bit/2236. 2.5.2 Códigos de apagamento Quando um determinado nó light recebe um hash de um bloco, para aumentar a capacidade do nó confiança de que o bloco está disponível, ele pode tentar baixar alguns blocos aleatórios. pedaços do bloco. Esta não é uma solução completa, pois a menos que os nós de luz baixar coletivamente o bloco inteiro que os produtores de blocos maliciosos podem escolher

Figura 13: Os validadores precisam baixar o estado e, portanto, não podem ser girados frequentemente reter as partes do bloco que não foram baixadas por nenhum light node, assim ainda tornando o bloco indisponível. Uma solução é usar uma construção chamada Erasure Codes para tornar possível para recuperar o bloco completo mesmo que apenas uma parte do bloco esteja disponível, conforme mostrado na figura 14. Figura 14: Merkle tree criado com base em dados codificados para eliminação Tanto Polkadot quanto Ethereum Serenity têm designs em torno dessa ideia de que fornecer uma maneira para que os nós leves tenham confiança razoável de que os blocos estão disponíveis. A abordagem Ethereum Serenity tem uma descrição detalhada em [2].2.5.3 Abordagem de Polkadot para disponibilidade de dados Em Polkadot, como na maioria das soluções fragmentadas, cada fragmento (chamado parachain) captura seus blocos na cadeia de beacon (chamada cadeia de retransmissão). Digamos que existem 2f + 1 validators na cadeia de retransmissão. Os produtores de blocos de parachain, chamados agrupadores, uma vez que o bloco parachain é produzido, calcule uma versão codificada para apagamento do bloco que consiste em 2f +1 partes, de modo que quaisquer f partes sejam suficientes para reconstruir o bloco. Eles então distribuem uma parte para cada validator no cadeia de relé. Uma cadeia de retransmissão específica validator só assinaria em uma cadeia de retransmissão bloco se eles tiverem sua parte para cada bloco parachain que é capturado para tal bloco de cadeia de relé. Assim, se um bloco de cadeia de relés tiver assinaturas de 2f + 1 validators, e enquanto não mais do que f deles violarem o protocolo, cada o bloco parachain pode ser reconstruído buscando as partes dos validators que seguem o protocolo. Veja a figura 15. Figura 15: Disponibilidade de dados de Polkadot 2.5.4 Disponibilidade de dados a longo prazo Observe que todas as abordagens discutidas acima apenas atestam o fato de que um bloco foi publicado e está disponível agora. Os blocos podem ficar indisponíveis posteriormente por vários motivos: nós ficando off-line, nós apagando intencionalmente o histórico dados e outros. Um whitepaper que vale a pena mencionar que aborda esse problema é o Polyshard [3], que usa códigos de apagamento para disponibilizar blocos em fragmentos, mesmo que vários os fragmentos perdem completamente seus dados. Infelizmente, a sua abordagem específica exige todos os shards para baixar blocos de todos os outros shards, o que é proibitivamente caro. A disponibilidade a longo prazo não é uma questão tão premente: uma vez que nenhum participante espera-se que o sistema seja capaz de validar todas as cadeias em todos os

fragmentos, a segurança do protocolo fragmentado precisa ser projetada de tal forma maneira que o sistema é seguro, mesmo que alguns blocos antigos em alguns fragmentos se tornem completamente indisponível.

Nightshade

3.1 샤드 체인에서 샤드 청크로 샤드체인과 비콘체인을 이용한 샤딩 모델은 매우 강력하지만 특정 복잡성이 있습니다. 특히 포크 선택 규칙을 실행해야 합니다. 각 체인에서 별도로 샤드 체인과 비콘의 포크 선택 규칙 체인은 다르게 구축하고 별도로 테스트해야 합니다. Nightshade에서 우리는 시스템을 단일 blockchain로 모델링합니다. 블록은 논리적으로 모든 샤드에 대한 모든 트랜잭션을 포함하고 모든 샤드의 전체 상태. 그러나 물리적으로 참가자 중 누구도 다운로드하지 않습니다. 전체 상태 또는 전체 논리 블록. 대신, 네트워크의 각 참가자는 트랜잭션을 검증하는 샤드에 해당하는 상태를 유지하며, 블록의 모든 트랜잭션 목록은 물리적으로 분할됩니다. 청크, 샤드당 하나의 청크. 이상적인 조건에서 각 블록은 샤드당 정확히 하나의 청크를 포함합니다. 이는 샤드 체인이 있는 모델과 대략적으로 일치합니다. 샤드 체인은 비콘 체인과 동일한 속도로 블록을 생성합니다. 그러나, 네트워크 지연으로 인해 일부 청크가 누락될 수 있으므로 실제로는 각 블록이 샤드당 1개 또는 0개의 청크를 포함합니다. 방법에 대한 자세한 내용은 섹션 3.3을 참조하세요. 블록이 생산됩니다. 그림 16: 왼쪽에 샤드 체인이 있고 하나의 체인에 샤드 체인이 있는 모델 블록은 오른쪽의 덩어리로 분할됩니다.

3.2 합의 오늘날 blockchains의 합의에 대한 두 가지 지배적인 접근 방식은 가장 긴(또는 가장 무거운) 체인, 가장 많은 작업이나 스테이크가 있는 체인 이를 구축하는 데 사용된 것은 정식으로 간주되며 BFT, 각 블록에 대해 validator 세트는 BFT 합의에 도달합니다. 최근 제안된 프로토콜에서는 후자가 더 지배적인 접근 방식입니다. 즉각적인 최종성을 제공하는 반면 가장 긴 체인에서는 더 많은 블록이 필요하기 때문입니다. 최종성을 보장하기 위해 블록 위에 구축됩니다. 종종 의미 있는 일을 위해 보안상 충분한 수의 블록을 구축하는 데 걸리는 시간은 시간 순서. 각 블록에서 BFT 합의를 사용하면 다음과 같은 단점도 있습니다. 1. BFT 합의에는 상당한 양의 의사소통이 필요합니다. 동안 최근의 발전으로 선형적인 시간 내에 합의에 도달할 수 있게 되었습니다. 참가자 수(예: [4] 참조)에서는 여전히 블록당 오버헤드가 눈에 띕니다. 2. 모든 네트워크 참여자가 BFT에 참여하는 것은 불가능합니다. 블록당 합의에 도달하므로 일반적으로 무작위로 샘플링된 참가자 하위 집합만 합의에 도달합니다. 무작위로 추출된 세트는 원칙적으로 다음과 같습니다. 적응적으로 손상되고 이론적으로는 포크가 생성될 수 있습니다. 시스템 그러한 이벤트에 대비하려면 모델링이 필요하므로 여전히 BFT 합의 외에 포크 선택 규칙이 있거나 폐쇄되도록 설계되었습니다. 이런 경우에는 다운됩니다. 다음과 같은 일부 디자인을 언급할 가치가 있습니다. Algorand [5], 적응형 손상 가능성을 크게 줄입니다. 3. 가장 중요한 것은 다음과 같은 경우 시스템이 정지된다는 것입니다. 전체 참가자 중 3명 이상이 오프라인. 따라서 일시적인 네트워크 결함이나 네트워크 분할로 인해 시스템이 완전히 정지될 수 있습니다. 이상적으로 시스템은 계속해서 작동할 수 있어야 합니다. 참가자 중 최소 절반이 온라인 상태인 한(가장 무거운 체인 기반 프로토콜은 참가자의 절반 미만이 온라인 상태인 경우에도 계속 작동하지만 이 속성의 바람직성은 더 논쟁의 여지가 있습니다. 커뮤니티 내에서). 사용된 합의가 일종의 가장 무거운 하이브리드 모델 체인이지만 일부 블록은 BFT 최종성 가젯을 사용하여 주기적으로 마무리되며 두 모델의 장점을 모두 유지합니다. 이러한 BFT 최종 가젯은 Casper FFG [6]는 Ethereum 2.0 8, Casper CBC에서 사용됩니다(https://vitalik. 참조). ca/general/2018/12/05/cbc_casper.html) 및 GRANDPA(https:// Medium.com/polkadot-network/d08a24a021b5) Polkadot에서 사용됩니다. Nightshade는 가장 무거운 체인 합의를 사용합니다. 특히 블록일 때 생산자는 블록을 생성하고(섹션 3.3 참조) 다음에서 서명을 수집할 수 있습니다. 다른 블록 생산자와 이전 블록을 증명하는 validators. 섹션을 참조하세요 이렇게 많은 수의 서명이 어떻게 집계되는지 자세히 알아보려면 3.8을 참조하세요. 무게 8Casper에 대한 심층적인 개요는 Justin Drake와의 화이트보드 세션도 참조하세요. FFG 및 이것이 GHOST의 가장 무거운 체인 합의와 통합되는 방법은 다음과 같습니다: https://www. youtube.com/watch?v=S262StTwkmo블록의 서명은 다음과 같은 서명을 가진 모든 서명자의 누적 지분입니다. 블록에 포함됩니다. 체인의 무게는 블록 무게의 합입니다. 가장 무거운 체인 합의 위에 우리는 다음을 사용하는 최종 장치를 사용합니다. 블록을 마무리하기 위한 증명입니다. 시스템의 복잡성을 줄이기 위해, 우리는 포크 선택 규칙에 어떤 식으로든 영향을 주지 않는 최종 장치를 사용합니다. 대신 추가 슬래싱 조건만 도입합니다. 최종 가젯으로 마무리된 경우 매우 큰 비율이 아니면 포크는 불가능합니다. 전체 지분 중 삭감됩니다. Casper CBC는 그러한 최종 장치이며 우리는 현재 Casper CBC를 염두에 두고 모델을 만들고 있습니다. 우리는 또한 TxFlow라는 별도의 BFT 프로토콜을 개발하고 있습니다. 당시 이 문서를 작성하면 Casper 대신 TxFlow가 사용될지 확실하지 않습니다. CBC. 그러나 우리는 최종 가젯의 선택이 나머지 설계와 대체로 직교한다는 점에 주목합니다. 3.3 블록 생산 Nightshade에는 블록 생산자와 validator라는 두 가지 역할이 있습니다. 언제든지 시스템에 w개의 블록 생산자가 포함되어 있고, 우리 모델에서는 w = 100이며, wv validators, 우리 모델에서는 v = 100, wv = 10, 000입니다. 시스템은 지분 증명입니다. 이는 블록 생산자와 validator 모두 내부에 일정 수의 내부 정보가 있음을 의미합니다. 통화("tokens"라고 함)는 해당 통화를 훨씬 초과하는 기간 동안 잠겨 있습니다. 체인을 구축하고 검증하는 임무를 수행하는 데 소요되는 시간입니다. 모든 지분 증명 시스템과 마찬가지로, 모든 w 블록 생산자가 아니라 모든 wv validator은 시행할 수 없기 때문에 다른 엔터티입니다. 각각 그러나 w 블록 생산자와 wv validators는 별도의 스테이크. 시스템에는 n개의 샤드가 포함되어 있으며 모델에서는 n = 1000입니다. 에서 언급했듯이 섹션 3.1, Nightshade에는 샤드 체인이 없습니다. 대신 모든 블록 생산자와 validator가 단일 blockchain를 구축하고 있습니다. 메인 체인. 메인체인의 상태는 n개의 샤드로 분할되며, 각 블록은 producer 및 validator은 언제든지 로컬에 하위 집합만 다운로드했습니다. 샤드의 일부 하위 집합에 해당하는 상태이며, 처리 및 주의 해당 부분에 영향을 미치는 거래를 검증합니다. 블록 생산자가 되기 위해 네트워크 참가자는 일부 대규모 잠금을 설정합니다. tokens(스테이크)의 양. 네트워크의 유지 관리는 시대별로 이루어집니다. 여기서 에포크는 일 단위의 기간입니다. 참가자 특정 시대가 시작될 때 가장 큰 지분을 가진 블록은 다음과 같습니다. 그 시대의 생산자. 각 블록 생산자는 sw 샤드에 할당됩니다(예: sw = 40, 즉 샤드당 sww/n = 4명의 블록 생산자가 됩니다. 블록 생산자는 에포크 이전에 할당된 샤드의 상태를 다운로드합니다. 시작되고 에포크 전반에 걸쳐 해당 샤드에 영향을 미치는 트랜잭션을 수집합니다. 그리고 이를 국가에 적용합니다. 메인 체인의 각 블록 b와 모든 샤드 s에 대해 다음 중 하나가 있습니다. b 관련 부분을 생산할 책임이 있는 블록 생산자를 s에게 할당했습니다. 샤드에. 샤드 s와 관련된 b 부분을 청크라고 하며 다음을 포함합니다. b에 포함될 샤드에 대한 트랜잭션 목록과 머클결과 상태의 루트. b는 궁극적으로 매우 작은 헤더만 포함하게 됩니다. 청크, 즉 적용된 모든 트랜잭션의 머클 루트(섹션 참조) 정확한 세부 사항은 3.7.1 참조) 및 최종 상태의 머클 루트입니다. 문서의 나머지 부분에서 우리는 종종 블록 생산자를 언급합니다. 특정 샤드에 대해 특정 시간에 청크를 생성하는 역할을 담당합니다. 청크 프로듀서로서. 청크 생산자는 항상 블록 생산자 중 하나입니다. 블록 생산자와 청크 생산자는 각 블록을 다음과 같이 회전합니다. 정해진 일정으로. 블록 생산자는 주문을 받고 반복적으로 생산을 합니다. 그 순서대로 블록을 쌓으세요. 예: 블록 생산자가 100명이면 첫 번째 블록은 생산자는 블록 1, 101, 201 등을 생산할 책임이 있으며, 두 번째는 2, 102, 202 등 생산 담당). 청크 생산은 블록 생산과 달리 유지 관리가 필요하므로 상태를 유지하며, 각 샤드에 대해 sww/n 블록 생산자만이 상태를 유지합니다. 샤드별로 해당 sww/n 블록 생산자만 순환하여 생성합니다. 덩어리. 예: 위의 상수와 4명의 블록 생산자가 할당되어 있습니다. 각 샤드, 각 블록 생산자는 4개의 블록마다 한 번씩 청크를 생성합니다. 3.4 데이터 가용성 보장 데이터 가용성을 보장하기 위해 우리는 Polkadot과 유사한 접근 방식을 사용합니다. 섹션 2.5.3에 설명되어 있습니다. 블록 생산자가 청크를 생성하면 다음을 생성합니다. 최적의 (w, ⌊w/6 + 1⌋) 블록 코드를 사용하여 삭제 코딩된 버전 덩어리. 그런 다음 삭제 코딩된 청크의 한 조각을 보냅니다(우리는 이러한 조각을 호출합니다). 청크 부분 또는 부분)을 각 블록 생산자에게 전달합니다. 우리는 나뭇잎과 같은 모든 부분을 포함하는 머클 트리를 계산합니다. 각 청크의 헤더에는 해당 트리의 머클 루트가 포함됩니다. 부품은 onepart 메시지를 통해 validators로 전송됩니다. 그런 메시지 하나하나 청크 헤더, 부분의 서수 및 부분 내용을 포함합니다. 는 메시지에는 해당 블록을 생성한 블록 생산자의 서명도 포함되어 있습니다. 해당 부분이 헤더에 해당함을 증명하기 위한 청크와 머클 경로 그리고 적절한 블록 생산자에 의해 생산됩니다. 블록 생산자가 메인 체인 블록을 받으면 먼저 블록 생성 여부를 확인합니다. 블록에 포함된 각 청크에 대해 하나의 메시지를 가집니다. 그렇지 않으면 블록 누락된 onepart 메시지가 검색될 때까지 처리되지 않습니다. 모든 onepart 메시지가 수신되면 블록 생산자는 피어로부터 남은 부분을 가져와 그들이 보유하고 있는 청크를 재구성합니다. 상태. 블록 생산자는 메인 체인 블록을 처리하지 않습니다. 블록에 포함된 청크에는 해당 onepart 메시지가 없거나 상태를 유지하는 하나 이상의 샤드에 대해 사용할 수 없는 경우 전체 청크를 재구성합니다. 특정 청크를 사용하려면 블록의 ⌊w/6⌋+1이면 충분합니다. 생산자는 자신의 역할을 갖고 이를 제공합니다. 따라서, 그 수만큼은 악의적인 행위자는 블록이 절반 이상인 체인이 없는 ⌊w/3⌋을 초과하지 않습니다. 그것을 만드는 생산자는 사용할 수 없는 청크를 가질 수 있습니다.그림 17: 각 블록에는 샤드당 1개 또는 0개의 청크가 포함되어 있으며, 각 청크는 삭제 코딩되어 있습니다. 삭제 코딩된 청크의 각 부분은 지정된 위치로 전송됩니다. 특별한 onepart 메시지를 통한 블록 생산자 3.4.1 게으른 블록 생산자 다루기 블록 생산자가 한 부분 메시지가 누락된 블록을 가지고 있는 경우, 블록이 체인에 연결되면 계속 서명하기로 선택할 수 있습니다. 블록 생산자에 대한 보상을 극대화할 것입니다. 블록에 대한 위험이 없습니다 왜냐하면 블록 프로듀서가 블록 프로듀서를 갖고 있지 않았다는 것을 나중에 증명하는 것이 불가능하기 때문입니다. 한 부분 메시지. 이 문제를 해결하기 위해 청크를 생성할 때 각 청크 생산자를 만듭니다. 향후 인코딩된 청크의 각 부분에 대해 색상(빨간색 또는 파란색)을 선택하고 저장합니다. 인코딩되기 전 청크에 할당된 색상의 비트마스크입니다. 각 부분 메시지에는 부품에 할당된 색상이 포함되며, 색상은 다음과 같은 경우에 사용됩니다. 인코딩된 부분의 머클 루트를 계산합니다. 청크 생산자가 이탈하는 경우 머클 루트는 그렇지 않기 때문에 프로토콜에서 쉽게 증명할 수 있습니다. onepart 메시지에 해당하거나, onepart 메시지의 색상에 해당합니다. 머클 루트에 해당하는 것은 청크의 마스크와 일치하지 않습니다. 블록 생산자가 블록에 서명하면 모든 블록의 비트마스크가 포함됩니다. 블록에 포함된 청크에 대해 받은 빨간색 부분입니다. 게시 잘못된 비트마스크는 슬래시 가능한 동작입니다. 블록 생산자가 메시지를 받지 못한 경우 메시지를 한 부분으로만 읽어도 메시지의 색상을 알 수 없습니다. 따라서 맹목적으로 서명을 시도하면 베임을 당할 확률이 50%입니다. 블록. 3.5 상태 전이 신청 청크 생산자는 청크에 포함할 트랜잭션만 선택하지만 청크를 생성할 때 상태 전환을 적용하지 마십시오. 이에 따라,

청크 헤더에는 이전의 머켈화된 상태의 머클 루트가 포함되어 있습니다. 청크의 트랜잭션이 적용됩니다. 트랜잭션은 청크를 포함하는 전체 블록에만 적용됩니다. 처리됩니다. 참가자는 다음의 경우에만 블록을 처리합니다. 1. 이전 블록이 수신되어 처리되었습니다. 2. 각 청크에 대해 참가자는 자신이 가지고 있는 상태를 유지하지 않습니다. onepart 메시지를 보았습니다. 3. 각 청크에 대해 참가자는 상태를 유지합니다. 전체 덩어리. 블록이 처리되면 참가자가 사용하는 각 샤드에 대해 상태를 유지하고 트랜잭션을 적용하고 새로운 상태를 계산합니다. 거래가 적용된 후부터 생산 준비가 완료됩니다. 다음 블록의 청크(샤드에 할당된 경우) 새로운 머켈화된 상태의 머클 루트. 3.6 교차 샤드 거래 및 영수증 트랜잭션이 둘 이상의 샤드에 영향을 미쳐야 하는 경우 연속적으로 수행되어야 합니다. 각 샤드에서 개별적으로 실행됩니다. 전체 트랜잭션이 첫 번째 샤드로 전송됩니다. 영향을 받고 트랜잭션이 해당 샤드의 청크에 포함되면 청크가 블록에 포함된 후 적용되면 소위 영수증이 생성됩니다. 트랜잭션이 필요한 다음 샤드로 라우팅됩니다. 처형되다. 추가 단계가 필요한 경우 영수증 거래 실행 새로운 영수증 거래 등을 생성합니다. 3.6.1 영수증 거래 수명 영수증 거래는 해당 거래가 발생한 블록 바로 다음 블록에 적용하는 것이 바람직하다. 영수증 거래는 블록 생산자가 이전 블록을 수신하고 적용한 후에 생성됨 원래 샤드를 유지하고 샤드가 생성될 때까지 알려져야 합니다. 다음 블록의 청크는 대상의 블록 생산자가 생성합니다. 파편. 따라서 영수증은 소스 샤드에서 샤드에 전달되어야 합니다. 두 이벤트 사이의 짧은 시간 내에 대상 샤드를 생성합니다. A를 영수증 r을 생성하는 트랜잭션 t를 포함하는 마지막으로 생성된 블록이라고 가정합니다. B를 다음으로 생성된 블록(즉, A를 갖는 블록)이라고 가정합니다. 이전 블록)에 r을 포함하려고 합니다. t가 샤드 a와 r에 있도록 하세요. 샤드에서 b. 그림 18에도 표시된 영수증의 수명은 다음과 같습니다. 영수증을 생성하고 보관합니다. 샤드의 청크 생산자 CPA a는 블록 A를 수신하고, 트랜잭션 t를 적용하고 영수증 r을 생성합니다. CPA 그런 다음 생성된 모든 영수증을 색인이 생성된 내부 영구 저장소에 저장합니다. 소스 샤드 ID로영수증을 배포합니다. CPA가 청크를 생성할 준비가 되면 블록 B에 대한 샤드 a, 샤드 a에 대한 블록 A의 트랜잭션을 적용하여 생성된 모든 영수증을 가져와 shrad에 대한 청크에 포함했습니다. 블록 B의 a. 해당 청크가 생성되면 cpa는 삭제 코딩된 삭제 코드를 생성합니다. 버전 및 해당하는 모든 onepart 메시지. cpa는 어떤 블록 생산자가 샤드의 전체 상태를 유지하는지 알고 있습니다. 특정 블록 생산자의 경우 bp cpa에는 블록 A의 거래를 적용하여 발생한 영수증이 포함됩니다. bp가 대상으로 관심을 갖는 샤드 중 하나를 포함하는 샤드 a의 경우 블록 B의 샤드 A에 대한 청크를 배포할 때 onepart 메시지에서 (onepart 메시지에 포함된 영수증을 보여주는 그림 17 참조) 영수증을 받고 있습니다. 참가자(블록 생산자와 validator 모두)는 단일 메시지를 받을 때까지 블록을 처리하지 않는다는 점을 기억하십시오. 블록에 포함된 각 청크에 대해. 따라서 특정 참가자가 블록 B를 적용할 때쯤에는 블록 B에 해당하는 모든 단일 부분 메시지를 갖게 됩니다. B에 청크가 있으므로 샤드가 있는 모든 수신 영수증을 갖게 됩니다. 참가자는 목적지로 상태를 유지합니다. 신청할 때 특정 샤드에 대한 상태 전환, 참가자는 두 가지 영수증을 모두 적용합니다. 그들은 onepart 메시지의 샤드를 위해 수집한 것뿐만 아니라 모든 청크 자체에 포함된 트랜잭션입니다. 그림 18: 영수증 거래의 수명 3.6.2 너무 많은 영수증 처리 특정 샤드를 대상으로 하는 영수증의 수가 특정 블록이 너무 커서 처리할 수 없습니다. 예를 들어 그림 19를 살펴보겠습니다. 각 샤드의 각 거래는 샤드 1을 대상으로 하는 영수증을 생성합니다. 다음 블록까지 샤드 1이 처리해야 하는 영수증 수는 다음과 같습니다. 처리하는 동안 모든 샤드가 결합되어 처리하는 부하와 비슷합니다. 이전 블록.

그림 19: 모든 영수증이 동일한 샤드를 대상으로 하는 경우 샤드는 그것을 처리할 수 있는 능력 이를 해결하기 위해 우리는 QuarkChain 9에서 사용된 것과 유사한 기술을 사용합니다. 구체적으로, 각 샤드에 대해 마지막 블록 B와 해당 샤드 내의 마지막 샤드 영수증이 적용된 블록이 기록됩니다. 새로운 샤드가 생성되면 생성되면 B에 남아있는 샤드부터 순서대로 영수증이 적용되며, 그런 다음 새 청크가 가득 찰 때까지 B를 따르는 블록에서. 정상 이하 부하가 균형 잡힌 상황에서는 일반적으로 모든 영수증이 발생합니다. 적용됩니다(따라서 마지막 블록의 마지막 샤드가 기록됩니다). 각 청크), 하지만 로드가 균형을 이루지 못하는 경우, 그리고 특정 샤드는 불균형적으로 많은 영수증을 받습니다. 이 기술을 사용하면 샤드는 다음과 같은 일을 할 수 있습니다. 포함된 거래 수 제한을 준수하면서 처리됩니다. 이러한 불균형 부하가 오랫동안 지속되면 지연이 발생합니다. 영수증 생성 전까지 신청은 무한정 늘어날 수 있습니다. 하나 이 문제를 해결하는 방법은 다음을 대상으로 하는 영수증을 생성하는 모든 거래를 삭제하는 것입니다. 일부 상수(예: 1 에포크)를 초과하는 처리 지연이 있는 샤드. 그림 20을 살펴보세요. 블록 B에서는 샤드 4가 모든 영수증을 처리할 수 없습니다. 따라서 블록 A의 최대 샤드 3에서 발생한 영수증만 처리합니다. 그것을 기록합니다. 블록 C에는 블록 B의 샤드 5까지의 영수증이 포함됩니다. 그런 다음 블록 D에서 샤드가 따라잡아 나머지 영수증을 모두 처리합니다. 블록 B와 블록 C의 모든 영수증. 3.7 청크 검증 특정 샤드에 대해 생성된 청크(또는 샤드 체인이 있는 모델에서 특정 샤드 체인에 대해 생성된 샤드 블록)는 오직 9여기에서 QuarkChain의 화이트보드 에피소드를 확인하세요: https://www.youtube.com/watch? v=opEtG6NM4x4, 여기에서는 교차 샤드 트랜잭션에 대한 접근 방식이 논의됩니다. 것들그림 20: 지연된 영수증 처리 상태를 유지하는 참가자. 그들은 블록 생산자가 될 수 있습니다, validators, 또는 상태를 다운로드하고 샤드를 검증한 외부 증인일 수도 있습니다. 자산을 저장하는 곳입니다. 이 문서에서는 대부분의 참가자가 저장할 수 없다고 가정합니다. 샤드의 상당 부분에 대한 상태입니다. 언급할 가치는 있지만, 다음과 같은 가정으로 설계된 샤딩된 blockchain이 있습니다. 대부분의 참가자는 대부분의 상태를 저장하고 검증할 수 있는 능력을 가지고 있습니다. QuarkChain과 같은 샤드. 참가자 중 극히 일부만이 샤드를 검증할 수 있는 상태를 갖고 있기 때문에 청크를 갖고 있는 참가자만 적응적으로 손상시킬 수 있습니다. 상태를 확인하고 잘못된 상태 전환을 적용합니다. 몇 번씩 validator을 샘플링하는 다중 샤딩 설계가 제안되었습니다. 일, 그리고 하루 이내에 2/3 이상인 샤드 체인의 모든 블록 해당 샤드에 할당된 validator의 서명이 즉시 고려됩니다. 최종. 이러한 접근 방식을 사용하면 적응력이 뛰어난 공격자는 2n/3+1만 부패시키면 됩니다. 샤드 체인의 validator 중 잘못된 상태 전환을 적용합니다. 해내기 어려울 가능성이 높지만 대중에게 충분한 보안 수준은 아닙니다. blockchain. 섹션 2.3에서 설명한 것처럼 일반적인 접근 방식은 상태가 있는 모든 참가자에 대해 블록이 생성된 후 특정 시간을 허용하는 것입니다. 그 타당성에 도전하는 것은 블록 생산자, validator 또는 외부 관찰자입니다. 이러한 참가자를 어부(Fishermen)라고 합니다. 낚시꾼이 할 수 있는 일 유효하지 않은 블록에 대해 이의를 제기하려면 해당 블록을 사용할 수 있는지 확인해야 합니다. 그들. Nightshade의 데이터 가용성은 섹션 3.4에서 논의됩니다. Nightshade에서는 블록이 생성되면 해당 청크가 검증되지 않습니다. 실제 청크 생산자가 아닌 사람. 특히, 블록 프로듀서는 블록이 당연히 대부분의 샤드에 대한 상태를 갖고 있지 않다고 제안했습니다.청크의 유효성을 검사할 수 없습니다. 다음 블록이 생성되면 여러 블록 생산자와 validator의 증명(섹션 3.2 참조)이 포함됩니다. 하지만 대부분의 블록 생산자와 validator은 상태를 유지하지 않기 때문에 대부분의 샤드에서도 유효하지 않은 청크가 하나만 있는 블록은 증명의 절반 이상을 수집하고 계속해서 가장 무거운 상태를 유지하게 됩니다. 체인. 이 문제를 해결하기 위해 우리는 다음 상태를 유지하는 모든 참가자를 허용합니다. 생성된 유효하지 않은 청크에 대해 온체인으로 챌린지를 제출하는 샤드 파편. 3.7.1 상태 타당성 문제 참가자가 특정 청크가 유효하지 않음을 감지하면 해당 청크가 유효하지 않다는 증거를 제공해야 합니다. 대부분의 네트워크 참여자는 유효하지 않은 청크가 존재하는 샤드에 대한 상태를 유지하지 않기 때문에 생성되면 증거에는 블록이 다음과 같은지 확인하는 데 충분한 정보가 있어야 합니다. 상태가 없으면 유효하지 않습니다. 우리는 단일 트랜잭션이 처리하는 상태량(바이트)의 한계 Ls를 설정합니다. 누적적으로 읽거나 쓸 수 있습니다. Ls 이상에 영향을 미치는 모든 거래 상태는 유효하지 않은 것으로 간주됩니다. 섹션 3.5에서 청크가 특정 블록 B에는 적용할 트랜잭션만 포함되어 있지만 새로운 상태 루트. 블록 B의 청크에 포함된 상태 루트가 상태입니다. 그러한 트랜잭션을 적용하기 전에는 루트이지만 다음에서 트랜잭션을 적용한 후에는 블록 이전의 동일한 샤드의 마지막 청크 B. 악의적인 행위자 잘못된 상태 전환을 적용하려고 하면 잘못된 상태 루트가 포함됩니다. 적용 결과로 발생한 상태 루트에 해당하지 않는 블록 B에서 이전 청크의 트랜잭션. 청크 생산자가 청크에 포함하는 정보를 확장합니다. 모든 트랜잭션을 적용한 후 상태를 포함하는 대신 각 연속 트랜잭션 집합을 적용한 후 상태 루트를 포함합니다. 상태의 Ls 바이트를 집합적으로 읽고 씁니다. 이 정보를 통해 상태 전환이 잘못 적용되는 문제를 만드는 어부 첫 번째 유효하지 않은 상태 루트를 찾고 Ls 바이트만 포함하면 충분합니다. 마지막 상태 루트(이는 유효한) 및 머클 증명이 포함된 현재 상태 루트입니다. 그러면 어떤 참가자라도 세그먼트의 트랜잭션을 검증하고 청크가 다음과 같은지 확인할 수 있습니다. 유효하지 않습니다. 마찬가지로, 청크 생산자가 다음을 읽는 트랜잭션을 포함하려고 시도한 경우 Ls 바이트 이상의 상태를 작성합니다. 이 문제의 경우 다음을 포함하는 것으로 충분합니다. 머클 증명과 접촉하는 첫 번째 L 바이트는 다음과 같이 충분합니다. 트랜잭션을 적용하고 시도가 있는 순간이 있는지 확인합니다. Ls 바이트를 초과하는 콘텐츠를 읽거나 씁니다.

3.7.2 어부와 빠른 샤드 간 거래 섹션 2.3에서 설명한 것처럼 샤드 청크(또는 샤드)가 샤드 체인이 있는 모델의 블록)은 유효하지 않으며 문제가 발생할 수 있습니다. 기간 동안 이는 최종성에 부정적인 영향을 미쳐 샤드 간 통신에 부정적인 영향을 미칩니다. 에서 특히, 샤드 간 거래의 대상 샤드는 확실할 수 없습니다. 원래 샤드 청크 또는 블록은 챌린지 기간이 끝날 때까지 최종입니다. (그림 21 참조) 그림 21: 영수증을 적용하기 전에 챌린지 기간을 기다리는 중 교차 샤드 트랜잭션을 수행하는 방식으로 이를 해결하는 방법 Instantenious는 대상 샤드가 챌린지 기간을 기다리지 않는 것입니다. 소스 샤드 트랜잭션이 게시된 후 영수증 트랜잭션을 적용합니다. 즉시, 그러나 소스와 함께 대상 샤드를 롤백합니다. 나중에 원래 청크나 블록이 유효하지 않은 것으로 밝혀지면 샤딩합니다(그림 참조). 22). 이는 샤드가 사용되는 Nightshade 디자인에 매우 자연스럽게 적용됩니다. 체인은 독립적이지 않지만 대신 샤드 청크가 모두 게시됩니다. 동일한 메인 체인 블록에 함께 있습니다. 유효하지 않은 청크가 발견되면 해당 청크가 포함된 전체 블록은 유효하지 않은 것으로 간주되며, 그 위에 구축된 모든 블록은 그것의 꼭대기. 그림 23을 참조하십시오. 위의 두 접근 방식 모두 챌린지가 다음과 같다고 가정하여 원자성을 제공합니다. 기간은 충분히 길다. 정상적인 상황에서 빠른 크로스샤드 트랜잭션을 제공하는 것이 불편함을 능가하기 때문에 우리는 후자의 접근 방식을 사용합니다. 다음 중 하나의 잘못된 상태 전환으로 인해 대상 샤드 롤백 이는 극히 드문 이벤트입니다. 3.7.3 validator 숨기기 문제가 존재하면 이미 다음과 같은 가능성이 크게 감소합니다. 잘못된 상태 전환 포스트로 청크를 마무리하기 때문에 적응형 손상그림 22: 영수증 즉시 적용 및 대상 롤백 소스 체인에 유효하지 않은 블록이 있는 경우 체인 그림 23: Nightshade의 어부 도전 적응형 적이 모든 참가자를 부패시키는 데 필요한 도전 기간 모든 validator을 포함하여 샤드의 상태를 유지합니다. 그러한 사건의 가능성을 추정하는 것은 매우 복잡합니다. 샤딩된 blockchain은 그러한 공격이 시도될 만큼 오랫동안 활성화되었습니다. 우리는 확률이 극히 낮지만 여전히 충분하다고 주장합니다. 수백만 건의 트랜잭션을 실행할 것으로 예상되는 시스템에 비해 규모가 크고 세계적인 금융 운영을 운영합니다. 이러한 믿음에는 두 가지 주요 이유가 있습니다. 1. 대부분의 지분 증명 체인과 채굴자의 validator

작업 증명 체인은 주로 재정적 측면에서 인센티브를 받습니다. 만약에 적응형 적군은 예상 수익보다 더 많은 돈을 제공합니다. 정직하게 운영하면 많은 validator이 발생할 것으로 예상하는 것이 합리적입니다. 그 제안을 받아들일 것이다. 2. 많은 기업이 지분 증명 체인을 전문적으로 검증합니다. 어떤 체인에서든 지분의 상당 부분이 그러한 단체로부터. 그러한 개체의 수는 한 기업에 비해 충분히 적습니다. 적응력이 뛰어난 적은 그들 대부분을 개인적으로 알아가고 그들의 부패 성향을 잘 이해하고 있습니다. 우리는 어떤 validator이 어떤 샤드에 할당되어 있는지 숨김으로써 적응형 손상 가능성을 줄이는 데 한 단계 더 나아갔습니다. 아이디어는 Algorand [5]이 validator을 숨기는 방식과 원격으로 유사합니다. Algorand에서와 같이 validator이 숨겨져 있더라도 주의하는 것이 중요합니다. 또는 아래 설명된 것처럼 적응형 손상은 이론상으로는 여전히 가능합니다. 동안 적응형 적수는 생성하거나 검증할 참가자를 알지 못합니다. 블록이나 덩어리, 참가자 스스로는 자신이 수행할 것임을 알고 있습니다. 그러한 작업을 수행하고 이에 대한 암호화 증거를 가지고 있습니다. 따라서 상대방은 다음과 같이 할 수 있다. 부패하려는 의도를 알리고 이를 제공할 참가자에게 비용을 지불합니다. 그러한 암호화 증명. 그러나 우리는 적이 그렇지 않기 때문에 손상시키려는 샤드에 할당된 validator을 알고 있으면 특정 샤드를 손상시키려는 의도를 다른 사람에게 알리는 것 외에는 다른 선택이 없습니다. 전체 커뮤니티. 그 시점에서는 정직한 사람이라면 누구에게나 경제적으로 이익이 됩니다. 참가자는 샤드를 검증하는 전체 노드를 가동합니다. 해당 샤드에 유효하지 않은 블록이 나타날 가능성이 있습니다. 챌린지를 만들고 관련 보상을 받으세요. 특정 샤드에 할당된 validator을 공개하지 않기 위해 우리는 다음(그림 24 참조): VRF를 사용하여 과제를 얻습니다. 각 시대가 시작될 때마다 validator은 VRF를 사용하여 validator이 할당된 샤드의 비트마스크를 가져옵니다. 각 validator의 비트마스크에는 Sw 비트가 있습니다(정의는 섹션 3.3 참조). SW의). 그런 다음 validator는 해당 샤드의 상태를 가져오고 수신된 각 블록에 대해 해당 에포크 동안 해당 청크의 유효성을 검사합니다. validator이 할당된 샤드에. 청크 대신 블록에 서명하세요. 샤드 할당이 숨겨져 있으므로 validator은 청크에 서명할 수 없습니다. 대신 항상 전체에 서명합니다. 따라서 어떤 샤드가 검증되었는지 공개하지 않습니다. 특히 validator이 블록을 수신하고 모든 청크를 검증할 때 메시지를 생성하거나 이는 validator이 할당된 모든 샤드의 모든 청크가 유효함(해당 샤드가 무엇인지 어떤 방식으로든 표시하지 않음) 또는 다음과 같은 메시지 청크가 유효하지 않은 경우 유효하지 않은 상태 전환에 대한 증거가 포함됩니다. 참조 이러한 메시지가 어떻게 집계되는지에 대한 자세한 내용은 섹션 3.8을, 섹션 3.7.4를 참조하세요. validators가 메시지에 편승하는 것을 방지하는 방법에 대한 세부정보 보상 및 처벌 방법에 대한 자세한 내용은 기타 validator 및 섹션 3.7.5를 참조하세요. validators는 잘못된 상태 전환 문제가 실제로 발생해야 성공한다는 것입니다.그림 24: Nightshade에 validator을 숨기기 3.7.4 커밋-공개 validators의 일반적인 문제 중 하나는 validator이 상태 다운로드와 실제로 청크 및 블록 유효성 검사를 건너뛸 수 있다는 것입니다. 네트워크를 관찰하고 다른 validator이 제출한 내용을 확인하고 반복하세요. 메시지. 이러한 전략을 따르는 validator은 추가 기능을 제공하지 않습니다. 네트워크 보안을 강화하지만 보상을 수집합니다. 이 문제에 대한 일반적인 해결책은 각 validator이 증거를 제공하는 것입니다. 예를 들어 고유한 추적을 제공하여 실제로 블록의 유효성을 검사했습니다. 상태 전이를 적용하는 방법이 있지만 그러한 증명은 비용을 상당히 증가시킵니다. 검증의. 그림 25: 커밋-공개

대신 우리는 검증 결과에 대해 validators의 첫 번째 커밋을 만듭니다(둘 중 하나). 청크의 유효성을 증명하는 메시지 또는 유효하지 않은 청크의 증거 상태 전환), 일정 기간 동안 기다렸다가 그림 25와 같이 실제 검증 결과를 공개합니다. 커밋 기간은 상태 전환과 교차하지 않습니다. 공개 기간이므로 게으른 validator은 정직한 validator을 흉내낼 수 없습니다. 더욱이, 부정직한 validator이 다음을 증명하는 메시지를 약속한 경우 할당된 청크의 유효성을 확인하고 적어도 하나의 청크가 유효하지 않은 경우 청크가 유효하지 않은 것으로 나타났습니다. validator은 슬래싱을 피할 수 없습니다. 섹션 3.7.5에서 볼 수 있듯이 이러한 상황에서 슬래시를 당하지 않는 유일한 방법은 잘못된 상태 전환에 대한 증거가 포함된 메시지를 제시하는 것입니다. 커밋과 일치합니다. 3.7.5 문제 처리 위에서 설명한 대로 validator이 유효하지 않은 청크가 있는 블록을 수신하면, 먼저 유효하지 않은 상태 전환에 대한 증거를 준비한 다음(섹션 3.7.1 참조) 그러한 증명을 수행하고(3.7.4 참조) 일정 기간이 지나면 도전 과제를 공개합니다. 공개된 챌린지가 블록에 포함되면 다음과 같은 일이 발생합니다. 1. 해당 블록을 포함하는 블록에서 발생한 모든 상태 전환 공개된 챌린지가 포함된 블록까지 유효하지 않은 청크를 얻습니다. 무효화되었습니다. 공개된 챌린지를 포함하는 블록 이전의 상태 포함된 블록 이전의 상태와 동일한 것으로 간주됩니다. 유효하지 않은 청크. 2. 특정 기간 내에 각 validator은 자신의 비트마스크를 공개해야 합니다. 그들이 검증한 샤드 중. 비트마스크는 VRF를 통해 생성되므로, 상태 전환이 잘못된 샤드에 할당되었습니다. 공개를 피할 수 없습니다. 비트마스크를 공개하지 못하는 모든 validator 샤드에 할당된 것으로 가정됩니다. 3. 해당 기간이 지나면 샤드에 할당된 것으로 확인된 각 validator, 해당 블록에 대한 일부 검증 결과를 커밋했습니다. 유효하지 않은 청크이며 유효하지 않은 상태 전환의 증거를 공개하지 않았습니다. 커밋에 해당하는 내용은 슬래시됩니다. 4. 각 validator은 새로운 샤드 할당을 받고 새로운 시대가 예약됩니다. 모든 validator가 다운로드하기에 충분한 시간이 지난 후에 시작하려면 상태는 그림 26과 같습니다. validators가 할당된 샤드를 공개하는 순간부터 참고하세요. 새로운 시대가 시작될 때까지 시스템의 보안은 샤드 할당이 공개되었습니다. 네트워크 참여자는 이를 유지해야 합니다. 해당 기간 동안 네트워크를 사용할 때 주의하세요. 3.8 서명 집계 수백 개의 샤드가 있는 시스템이 안전하게 작동하려면 다음을 수행해야 합니다. 10,000개 이상의 validator 주문. 섹션 3.7에서 논의한 것처럼 우리는 각각을 원합니다.그림 26: 과제 처리 validator 평균적으로 특정 메시지와 서명에 대한 커밋을 게시합니다. 블록당 한 번. 커밋 메시지가 동일하더라도 BLS 서명과 이를 검증하는 것은 엄청나게 비용이 많이 들었습니다. 하지만 당연히 커밋 및 공개 메시지는 validator에서 동일하지 않습니다. 따라서 그러한 메시지와 서명을 통합할 수 있는 방법이 필요합니다. 나중에 빠르게 검증할 수 있는 방법입니다. 우리가 사용하는 구체적인 접근 방식은 다음과 같습니다. 블록 생산자에 합류하는 검증인. 블록 생산자는 알려져 있습니다. 에포크가 시작되기 얼마 전에 다운로드할 시간이 필요하기 때문입니다. 에포크가 시작되기 전의 상태이며, validator과 달리 블록 생산자는 숨겨져 있지 않습니다. 각 블록 생산자는 v validator 슬롯을 갖습니다. 검증인이 제출 블록 생산자에게 v 중 하나로 포함되도록 오프체인 제안 validators. 블록 생산자가 validator을 포함하려는 경우 validator의 초기 오프체인 요청을 포함하는 트랜잭션, 그리고 validator을 블록 생산자에 참여시키는 블록 생산자의 서명입니다. 블록 생산자에게 할당된 validator이 반드시 필요한 것은 아닙니다. 블록 생산자가 청크를 생성하는 것과 동일한 샤드를 검증합니다. 만약 validator은 여러 블록 생산자에 합류하기 위해 적용되었으며, 첫 번째 블록 생산자가 성공할 것입니다. 블록 생산자는 커밋을 수집합니다. 블록 생산자는 validator에서 지속적으로 커밋 및 공개 메시지를 수집합니다. 이러한 메시지가 일정 개수 누적되면 블록 생산자는 머클을 계산합니다. 이러한 메시지의 트리를 만들고 각 validator에 머클 루트와 그들의 메시지에 대한 머클 경로. validator는 경로의 유효성을 검사하고 로그인합니다. 머클 루트. 그런 다음 블록 생산자는 BLS 서명을 블록에 축적합니다. validators의 머클 루트이며 머클 루트와 누적된 서명. 블록 생산자는 또한 해당 블록의 유효성에 서명합니다. 저렴한 ECDSA 서명을 사용하는 다중 서명. 다중 서명이 되지 않는 경우 제출된 머클 루트 또는 참여하는 validator의 비트마스크와 일치하면 슬래시 가능한 동작입니다. 체인을 동기화할 때 참가자는 validators의 모든 BLS 서명을 검증하도록 선택할 수 있습니다(validators 공개 키 집계가 포함되므로 매우 비쌉니다).블록 생산자의 ECDMA 서명을 사용하고 다음 사실에 의존합니다. 블록 프로듀서는 도전을 받고 삭감되지 않았습니다. 온체인 트랜잭션과 머클 증명을 사용하여 문제를 해결합니다. 그것 validators의 메시지가 없으면 공개할 가치가 없다는 점을 알 수 있습니다. 잘못된 상태 전환이 감지되었습니다. 실제 내용이 포함된 메시지만 유효하지 않은 상태 전환에 대한 증거가 공개되어야 하며, 그러한 메시지에 대해서만 이전 커밋과 일치하는지 표시해야 합니다. 메시지는 다음과 같습니다. 두 가지 목적으로 공개됩니다. 1. 실제로 체인의 롤백을 시작하기 전 순간으로 잘못된 상태 전환(섹션 3.7.5 참조). 2. validator이(가) 유효성을 증명하려고 시도하지 않았음을 증명하기 위해 잘못된 청크. 두 경우 모두 다음 두 가지 문제를 해결해야 합니다. 1. 실제 커밋은 체인에 포함되지 않았고 머클 루트만 포함되었습니다. 다른 메시지와 함께 집계된 커밋입니다. validator에서는 다음을 사용해야 합니다. 블록 생산자가 제공한 머클 경로와 원래 커밋 그들이 도전에 전념했음을 증명하십시오. 2. 잘못된 샤드에 할당된 모든 validator이(가) 가능합니다. 상태 전환은 손상된 블록 생산자에게 할당됩니다. 그들을 검열하고 있습니다. 이 문제를 해결하기 위해 우리는 그들이 공개 내용을 제출하도록 허용합니다. 온체인에서 일반 트랜잭션으로 처리하고 집계를 우회합니다. 후자는 유효하지 않은 상태 전환 증명에만 허용됩니다. 극히 드물기 때문에 블록에 스팸을 보내서는 안 됩니다. 해결해야 할 마지막 문제는 블록 생산자가 다음을 수행할 수 있다는 것입니다. 메시지 집계에 참여하지 않거나 특정 validator을 의도적으로 검열하지 않도록 선택하세요. 블록을 만들어 경제적으로 불리하게 만듭니다. 생산자 보상은 할당된 validator 수에 비례합니다. 우리 또한 시대 사이의 블록 생산자는 대체로 교차하기 때문에(이후 항상 가장 높은 지분을 가진 참가자 중 최고입니다.) validators는 대부분 동일한 블록 생산자와 협력하여 위험을 줄입니다. 과거에 그들을 검열했던 블록 생산자에게 배정되는 것입니다. 3.9 스냅샷 체인 메인체인의 블록은 매우 빈번하게 생성되기 때문에 다운로드가 전체 기록은 매우 빠르게 비용이 높아질 수 있습니다. 게다가 매 순간부터 블록에는 다수의 참가자의 BLS 서명이 포함되어 있으므로 서명을 확인하기 위한 공개 키의 집합이 엄청나게 커질 수 있습니다. 비싸기도 하고. 마지막으로, 가까운 미래에는 Ethereum 1.0이 1로 남을 가능성이 높기 때문입니다. 가장 많이 사용되는 blockchain 중 자산을 전송하는 의미 있는 방법이 있습니다.

Ethereum에 가까운 것이 요구 사항이며 오늘 BLS 서명을 확인하여 Ethereum 측의 근거리 차단 유효성은 불가능합니다. Nightshade 메인 체인의 각 블록은 선택적으로 Schnorr를 포함할 수 있습니다. 그러한 Schnorr를 포함하는 마지막 블록의 헤더에 다중 서명 다중 서명. 우리는 이러한 블록을 스냅샷 블록이라고 부릅니다. 가장 첫 번째 블록은 모든 에포크는 스냅샷 블록이어야 합니다. 이런 다중서명 작업을 하면서, 블록 생산자는 validators의 BLS 서명도 축적해야 합니다. 마지막 스냅샷 블록에서 설명된 것과 동일한 방식으로 집계합니다. 섹션 3.8. 블록 생산자 세트는 시대 전반에 걸쳐 일정하므로 유효성을 검사합니다. 각 에포크의 첫 번째 스냅샷 블록만 있으면 충분합니다. 많은 비율의 블록 생산자와 validator이 공모하고 생성되었다는 점을 지적합니다. 포크. 에포크의 첫 번째 블록에는 다음을 계산하기에 충분한 정보가 포함되어야 합니다. 해당 시대의 블록 생산자와 validator. 스냅샷만 포함된 메인체인의 서브체인을 호출합니다. 스냅샷 체인을 차단합니다. Schnorr 다중 서명을 생성하는 것은 대화형 프로세스이지만, 아무리 비효율적이라도 프로세스를 가끔씩만 수행하면 됩니다. 성공할 것이다. Schnorr 다중 서명은 Ethereum에서 쉽게 검증할 수 있습니다. 따라서 blockchain 교차 수행의 안전한 방법을 위한 중요한 기본 요소를 제공합니다. 의사소통. Near 체인과 동기화하려면 모든 스냅샷만 다운로드하면 됩니다. 차단하고 Schnorr 서명이 올바른지 확인한 다음(선택적으로 validators의 개별 BLS 서명도 확인) 동기화만 수행합니다. 마지막 스냅샷 블록의 메인 체인 블록.

Nightshade

3.1 De cadeias de fragmentos a pedaços de fragmentos O modelo de sharding com shard chains e beacon chain é muito poderoso, mas tem certas complexidades. Em particular, a regra de escolha do fork precisa ser executada em cada cadeia separadamente, a regra de escolha do fork nas cadeias de fragmentos e no beacon a corrente deve ser construída de forma diferente e testada separadamente. No Nightshade modelamos o sistema como um único blockchain, no qual cada bloco contém logicamente todas as transações para todos os fragmentos e altera o estado completo de todos os fragmentos. Fisicamente, no entanto, nenhum participante baixa o estado completo ou o bloco lógico completo. Em vez disso, cada participante da rede apenas mantém o estado que corresponde aos fragmentos para os quais eles validam as transações, e a lista de todas as transações no bloco é dividida em físicas pedaços, um pedaço por fragmento. Sob condições ideais, cada bloco contém exatamente um pedaço por fragmento por bloco, que corresponde aproximadamente ao modelo com cadeias de fragmentos em que o shard chains produzem blocos com a mesma velocidade que a beacon chain. No entanto, devido a atrasos na rede, alguns pedaços podem estar faltando, então, na prática, cada bloco contém um ou zero pedaços por fragmento. Consulte a seção 3.3 para obter detalhes sobre como blocos são produzidos. Figura 16: Um modelo com cadeias de fragmentos à esquerda e com uma cadeia tendo blocos divididos em pedaços à direita

3.2 Consenso As duas abordagens dominantes para o consenso nos blockchains hoje são as cadeia mais longa (ou mais pesada), na qual a cadeia que tem mais trabalho ou participação usado para construí-lo é considerado canônico, e BFT, em que para cada bloco alguns conjunto de validators alcança um consenso BFT. Nos protocolos propostos recentemente, esta última é uma abordagem mais dominante, uma vez que fornece finalidade imediata, enquanto na cadeia mais longa mais blocos precisam a ser construído no topo do bloco para garantir a finalidade. Muitas vezes por um significado segurança o tempo que leva para que um número suficiente de blocos seja construído leva em conta ordem de horas. Usar o consenso BFT em cada bloco também tem desvantagens, como: 1. O consenso BFT envolve uma quantidade considerável de comunicação. Enquanto avanços recentes permitem que o consenso seja alcançado em tempo linear em número de participantes (ver, por exemplo, [4]), ainda é perceptível uma sobrecarga por bloco; 2. É inviável que todos os participantes da rede participem do BFT consenso por bloco, portanto, geralmente apenas um subconjunto de participantes amostrados aleatoriamente chega ao consenso. Um conjunto amostrado aleatoriamente pode ser, em princípio, corrompido adaptativamente e, em teoria, uma bifurcação pode ser criada. O sistema ou precisa ser modelado para estar pronto para tal evento e, portanto, ainda ter uma regra de escolha de bifurcação além do consenso BFT ou ser projetado para fechar cair em tal evento. Vale ressaltar que alguns projetos, como Algorand [5], reduzem significativamente a probabilidade de corrupção adaptativa. 3. Mais importante ainda, o sistema para se 1 3 ou mais de todos os participantes são off-line. Assim, qualquer falha temporária na rede ou divisão da rede pode paralisar completamente o sistema. Idealmente, o sistema deve ser capaz de continuar a operar enquanto pelo menos metade dos participantes estiver online (mais pesado protocolos baseados em cadeia continuam operando mesmo que menos da metade dos participantes estejam online, mas a conveniência desta propriedade é mais discutível dentro da comunidade). Um modelo híbrido em que o consenso utilizado é algum tipo de consenso mais pesado cadeia, mas alguns blocos são finalizados periodicamente usando um gadget de finalização BFT mantendo as vantagens de ambos os modelos. Esses BFT gadgets de finalidade são Casper FFG [6] usado em Ethereum 2.0 8, Casper CBC (ver https://vitalik. ca/general/2018/12/05/cbc_casper.html) e GRANDPA (consulte https:// Medium.com/polkadot-network/d08a24a021b5) usado em Polkadot. Nightshade usa o consenso da cadeia mais pesada. Especificamente quando um bloco produtor produz um bloco (ver seção 3.3), ele pode coletar assinaturas de outros produtores de bloco e validators atestando o bloco anterior. Veja a seção 3.8 para obter detalhes sobre como um número tão grande de assinaturas é agregado. O peso 8 Veja também a sessão do quadro branco com Justin Drake para uma visão geral detalhada de Casper FFG e como ele está integrado ao consenso da cadeia mais pesada do GHOST aqui: https://www. youtube.com/watch?v=S262StTwkmode um bloco é então a aposta cumulativa de todos os signatários cujas assinaturas são incluído no bloco. O peso de uma corrente é a soma dos pesos dos blocos. No topo do consenso da cadeia mais pesada, usamos um gadget de finalidade que usa os atestados para finalizar os blocos. Para reduzir a complexidade do sistema, usamos um gadget de finalidade que não influencia de forma alguma a regra de escolha do fork, e, em vez disso, apenas introduz condições de corte extras, de modo que, uma vez que um bloco seja finalizado pelo gadget de finalidade, um fork é impossível, a menos que uma porcentagem muito grande da aposta total é reduzida. Casper CBC é um gadget de finalidade, e nós atualmente modelo com Casper CBC em mente. Também trabalhamos em um protocolo BFT separado chamado TxFlow. Na hora de ao escrever este documento, não está claro se o TxFlow será usado em vez do Casper CBC. Notamos, no entanto, que a escolha do dispositivo final é em grande parte ortogonal ao resto do design. 3.3 Produção de blocos No Nightshade existem duas funções: produtores de blocos e validators. Em qualquer ponto em que o sistema contém w produtores de blocos, w = 100 em nossos modelos e wv validators, em nosso modelo v = 100, wv = 10.000. O sistema é Prova de Participação, o que significa que tanto os produtores de blocos quanto os validators têm algum número de recursos internos moeda (referida como ”tokens”) bloqueada por um período de tempo muito superior ao tempo que gastam no desempenho de suas funções de construção e validação da cadeia. Tal como acontece com todos os sistemas de Prova de Participação, nem todos os produtores de blocos w e nem todos os wv validators são entidades diferentes, uma vez que isso não pode ser aplicado. Cada dos produtores de bloco w e dos wv validators, no entanto, têm um separado aposta. O sistema contém n fragmentos, n = 1000 em nosso modelo. Como mencionado em seção 3.1, no Nightshade não há shard chains, em vez disso, todos os produtores de blocos e validators estão construindo um único blockchain, que chamamos de cadeia principal. O estado da cadeia principal é dividido em n fragmentos, e cada bloco produtor e validator a qualquer momento apenas baixaram localmente um subconjunto de o estado que corresponde a algum subconjunto dos fragmentos, e apenas processar e validar transações que afetam essas partes do estado. Para se tornar um produtor de blocos, um participante da rede bloqueia alguns grandes quantidade de tokens (uma aposta). A manutenção da rede é feita em épocas, onde uma época é um período de tempo da ordem de dias. Os participantes com as maiores apostas no início de uma época específica são o bloco produtores daquela época. Cada produtor de bloco é atribuído a fragmentos sw (digamos sw = 40, o que tornaria sww/n = 4 produtores de blocos por fragmento). O bloco o produtor baixa o estado do fragmento ao qual foi atribuído antes da época começa e, ao longo da época, coleta transações que afetam esse fragmento, e os aplica ao estado. Para cada bloco b na cadeia principal, e para cada fragmento s, há um dos atribuiu produtores de blocos a s, que é responsável por produzir a parte de b relacionada para o fragmento. A parte de b relacionada ao shard s é chamada de chunk e contém o lista das transações do shard a serem incluídas em b, bem como o merkleraiz do estado resultante. b acabará por conter apenas um cabeçalho muito pequeno de o pedaço, ou seja, a raiz merkle de todas as transações aplicadas (veja a seção 3.7.1 para detalhes exatos) e a raiz Merkle do estado final. Ao longo do restante do documento, frequentemente nos referimos ao produtor do bloco que é responsável por produzir um pedaço em um determinado momento para um determinado fragmento como produtor de pedaços. O produtor de pedaços é sempre um dos produtores de blocos. Os produtores de blocos e os produtores de pedaços giram cada bloco de acordo a um horário fixo. Os produtores de blocos têm um pedido e produzem repetidamente blocos nessa ordem. Por exemplo se houver 100 produtores de blocos, o primeiro bloco produtores é responsável pela produção dos blocos 1, 101, 201 etc, o segundo é responsável pela produção de 2, 102, 202 etc). Como a produção de pedaços, ao contrário da produção de blocos, exige a manutenção o estado, e para cada fragmento apenas os produtores de blocos sww/n mantêm o estado por fragmento, correspondentemente apenas os produtores de blocos sww/n giram para criar pedaços. Por exemplo com as constantes acima com quatro produtores de blocos atribuídos a cada fragmento, cada produtor de bloco criará pedaços uma vez a cada quatro blocos. 3.4 Garantindo a disponibilidade dos dados Para garantir a disponibilidade dos dados, usamos uma abordagem semelhante à de Polkadot descrito na seção 2.5.3. Depois que um produtor de bloco produz um pedaço, ele cria uma versão codificada para eliminação com um código de bloco ideal (w, ⌊w/6 + 1⌋) do pedaço. Eles então enviam um pedaço do pedaço codificado para eliminação (chamamos esses pedaços partes de pedaços, ou apenas partes) para cada produtor de bloco. Calculamos uma árvore Merkle que contém todas as partes como as folhas e as o cabeçalho de cada pedaço contém a raiz merkle dessa árvore. As peças são enviadas para validators por meio de mensagens onepart. Cada uma dessas mensagens contém o cabeçalho do bloco, o ordinal da parte e o conteúdo da parte. O mensagem também contém a assinatura do produtor do bloco que produziu o chunk e o caminho merkle para provar que a parte corresponde ao cabeçalho e é produzido pelo produtor de bloco adequado. Uma vez que um produtor de bloco recebe um bloco da cadeia principal, ele primeiro verifica se ele tenha mensagens únicas para cada pedaço incluído no bloco. Caso contrário, o bloco não é processado até que as mensagens onepart ausentes sejam recuperadas. Uma vez recebidas todas as mensagens onepart, o produtor do bloco busca o partes restantes dos pares e reconstrói os pedaços para os quais eles mantêm o estado. O produtor do bloco não processa um bloco da cadeia principal se por pelo menos um pedaço incluído no bloco eles não têm a mensagem onepart correspondente, ou se pelo menos um shard para o qual eles mantêm o estado eles não podem reconstruir todo o pedaço. Para que um determinado pedaço esteja disponível basta que ⌊w/6⌋+1 do bloco os produtores têm suas partes e as servem. Assim, enquanto o número de atores maliciosos não excedem ⌊w/3⌋nenhuma cadeia que tenha mais da metade do bloco os produtores que o constroem podem ter pedaços indisponíveis.Figura 17: Cada bloco contém um ou zero pedaços por fragmento, e cada pedaço é codificado para eliminação. Cada parte do pedaço codificado para eliminação é enviada para um determinado produtor de bloco através de uma mensagem especial onepart 3.4.1 Lidando com produtores de blocos preguiçosos Se um produtor de bloco tiver um bloco para o qual falta uma mensagem onepart, ele pode optar por ainda assiná-lo, porque se o bloco acabar sendo encadeado, maximizará a recompensa para o produtor do bloco. Não há risco para o bloqueio produtor, uma vez que é impossível provar posteriormente que o produtor do bloco não tinha a mensagem de uma parte. Para resolver isso, tornamos cada pedaço produtor ao criar o pedaço para escolha uma cor (vermelho ou azul) para cada parte do futuro bloco codificado e armazene a máscara de bits da cor atribuída no pedaço antes de ser codificada. Cada parte mensagem então contém a cor atribuída à peça, e a cor é usada quando calcular a raiz merkle das partes codificadas. Se o produtor do pedaço se desviar do protocolo, isso pode ser facilmente comprovado, já que a raiz merkle não correspondem a mensagens de uma parte ou às cores nas mensagens de uma parte que corresponder à raiz merkle não corresponderá à máscara no pedaço. Quando um produtor de bloco assina um bloco, ele inclui uma máscara de bits de todos os peças vermelhas que receberam pelos pedaços incluídos no bloco. Publicando um máscara de bits incorreta é um comportamento que pode ser cortado. Se um produtor de bloco não tiver recebido um mensagem única, eles não têm como saber a cor da mensagem e portanto, têm 50% de chance de serem cortados se tentarem assinar cegamente o bloco. 3.5 Pedido de transição de estado Os produtores de pedaços escolhem apenas quais transações incluir no pedaço, mas não aplique a transição de estado quando produzirem um pedaço. Correspondentemente,

o cabeçalho do bloco contém a raiz merkle do estado merkelizado de antes as transações no bloco são aplicadas. As transações só são aplicadas quando um bloco completo que inclui o pedaço é processado. Um participante só processa um bloco se 1. O bloco anterior foi recebido e processado; 2. Para cada pedaço, o participante não mantém o estado, pois possui vi a mensagem única; 3. Para cada pedaço, o participante mantém o estado, pois tem o pedaço inteiro. Depois que o bloco estiver sendo processado, para cada fragmento para o qual o participante mantém o estado, eles aplicam as transações e calculam o novo estado a partir da aplicação das transações, após o que elas estarão prontas para produzir os pedaços para o próximo bloco, se eles forem atribuídos a qualquer shard, uma vez que eles têm a raiz merkle do novo estado merkelizado. 3.6 Transações e recebimentos entre fragmentos Se uma transação precisar afetar mais de um fragmento, ela precisará ser consecutivamente executado em cada fragmento separadamente. A transação completa é enviada para o primeiro fragmento afetado, e uma vez que a transação é incluída no pedaço para tal fragmento, e é aplicado depois que o pedaço é incluído em um bloco, ele gera um chamado recibo transação, que é roteada para o próximo shard no qual a transação precisa ser executado. Se forem necessárias mais etapas, a execução da transação de recebimento gera uma nova transação de recebimento e assim por diante. 3.6.1 Vida útil da transação de recebimento É desejável que a transação de recebimento seja aplicada no bloco imediatamente seguinte ao bloco em que foi gerada. A transação de recebimento é apenas gerado após o bloco anterior ter sido recebido e aplicado pelos produtores do bloco que mantêm o fragmento de origem e precisa ser conhecido no momento em que o pedaço para o próximo bloco é produzido pelos produtores de bloco do destino fragmento. Assim, o recebimento deve ser comunicado do fragmento de origem ao fragmento de destino no curto período entre esses dois eventos. Seja A o último bloco produzido que contém uma transação t que gera um recibo r. Seja B o próximo bloco produzido (ou seja, um bloco que tem A como seu bloco anterior) que queremos conter r. Seja t no fragmento a e r no fragmento b. O tempo de vida do recibo, também representado na figura 18, é o seguinte: Produzir e armazenar os recibos. O CPA do produtor de pedaços para shard a recebe o bloco A, aplica a transação t e gera o recibo r. cpa em seguida, armazena todos esses recibos produzidos em seu armazenamento interno persistente indexado pelo ID do fragmento de origem.Distribuindo as receitas. Quando o cpa estiver pronto para produzir o pedaço para fragmento a para o bloco B, eles buscam todos os recibos gerados pela aplicação das transações do bloco A para o fragmento a e os incluem no bloco do fragmento a no bloco B. Uma vez gerado esse pedaço, cpa produz seu apagamento codificado versão e todas as mensagens onepart correspondentes. cpa sabe quais produtores de blocos mantêm o estado completo para quais fragmentos. Para um determinado produtor de blocos bp cpa inclui os recebimentos resultantes da aplicação de transações do bloco A para o fragmento a que possui qualquer um dos fragmentos com os quais bp se preocupa como destino na mensagem onepart quando eles distribuíram o pedaço para o fragmento A no bloco B (veja a figura 17, que mostra os recibos incluídos na mensagem onepart). Recebendo os recibos. Lembre-se de que os participantes (produtores de bloco e validators) não processam blocos até que tenham mensagens de uma parte para cada pedaço incluído no bloco. Assim, no momento em que qualquer participante em particular aplica o bloco B, ele possui todas as mensagens de uma parte que correspondem a pedaços em B e, portanto, eles têm todas as receitas recebidas que possuem os fragmentos o participante mantém o estado como destino. Ao aplicar o transição de estado para um fragmento específico, o participante aplica ambos os recibos que eles coletaram para o fragmento nas mensagens únicas, bem como todos as transações incluídas no próprio pedaço. Figura 18: A vida útil de uma transação de recebimento 3.6.2 Lidando com muitos recibos É possível que o número de recibos direcionados a um fragmento específico em um determinado bloco é muito grande para ser processado. Por exemplo, considere a figura 19, em em que cada transação em cada fragmento gera um recibo direcionado ao fragmento 1. No próximo bloco, o número de recibos que o fragmento 1 precisa processar é comparável à carga que todos os fragmentos combinados processaram durante o manuseio o bloco anterior.

Figura 19: Se todos os recibos forem direcionados ao mesmo fragmento, o fragmento poderá não ter a capacidade de processá-los Para resolver isso usamos uma técnica semelhante à usada no QuarkChain 9. Especificamente, para cada fragmento, o último bloco B e o último fragmento s dentro desse é registrado o bloco a partir do qual os recebimentos foram aplicados. Quando o novo fragmento for criado, os recibos são aplicados em ordem primeiro a partir dos fragmentos restantes em B, e depois nos blocos que seguem B, até que o novo pedaço esteja cheio. Sob normal circunstâncias com uma carga equilibrada, geralmente resultará em todos os recebimentos sendo aplicado (e assim o último fragmento do último bloco será gravado para cada pedaço), mas durante momentos em que a carga não está equilibrada e um determinado shard recebe muitas receitas desproporcionalmente, esta técnica permite que eles ser processado respeitando os limites do número de transações incluídas. Observe que se tal carga desequilibrada permanecer por muito tempo, o atraso de a criação de recibos até que a aplicação possa continuar crescendo indefinidamente. Um maneira de resolver isso é descartar qualquer transação que crie um recibo direcionado a um fragmento que possui um atraso de processamento que excede alguma constante (por exemplo, uma época). Considere a figura 20. No bloco B, o fragmento 4 não pode processar todos os recibos, portanto, ele processa apenas a origem de recibos de até o fragmento 3 no bloco A, e registra isso. No bloco C estão incluídos os recibos até o fragmento 5 do bloco B, e então, no bloco D, o fragmento alcança, processando todos os recibos restantes em bloco B e todas as receitas do bloco C. 3.7 Validação de pedaços Um pedaço produzido para um shard específico (ou um bloco de shard produzido para uma cadeia de shard específica no modelo com cadeias de shard) só pode ser validado pelo 9Veja o episódio do quadro branco com QuarkChain aqui: https://www.youtube.com/watch? v=opEtG6NM4x4, em que a abordagem para transações entre fragmentos é discutida, entre outros coisasFigura 20: Processamento de recibos atrasado participantes que mantêm o estado. Eles podem ser produtores de blocos, validators, ou apenas testemunhas externas que baixaram o estado e validaram o fragmento em quais eles armazenam ativos. Neste documento assumimos que a maioria dos participantes não consegue armazenar o estado para uma grande fração dos fragmentos. Vale ressaltar, porém, que existem blockchains fragmentados que são projetados com a suposição de que a maioria dos participantes tem capacidade de armazenar o estado e validar a maioria dos os fragmentos, como QuarkChain. Como apenas uma fração dos participantes tem estado para validar o fragmento pedaços, é possível corromper adaptativamente apenas os participantes que têm o estado e aplicar uma transição de estado inválida. Vários designs de fragmentação foram propostos para amostrar validators a cada poucos dias e dentro de um dia qualquer bloco na cadeia de fragmentos que tenha mais de 2/3 de assinaturas dos validators atribuídos a tal fragmento é imediatamente considerada final. Com tal abordagem, um adversário adaptativo só precisa corromper 2n/3+1 dos validators em uma cadeia de fragmentos para aplicar uma transição de estado inválida, que, embora seja provavelmente difícil de conseguir, não é um nível de segurança suficiente para um público blockchain. Conforme discutido na seção 2.3, a abordagem comum é permitir uma certa janela de tempo após a criação de um bloco para qualquer participante que tenha estado (seja é um produtor de bloco, um validator ou um observador externo) para desafiar sua validade. Esses participantes são chamados de Pescadores. Para que um pescador possa desafiar um bloco inválido, deve-se garantir que tal bloco esteja disponível para eles. A disponibilidade de dados no Nightshade é discutida na seção 3.4. No Nightshade, uma vez produzido um bloco, os pedaços não foram validados pelo qualquer um, exceto o próprio produtor do pedaço. Em particular, o produtor de blocos que sugeriu que o bloco naturalmente não tinha o estado para a maioria dos fragmentos, enão foi capaz de validar os pedaços. Quando o próximo bloco é produzido, ele contém atestados (ver seção 3.2) de múltiplos produtores de blocos e validators, mas como a maioria dos produtores de blocos e validators não mantêm o estado também para a maioria dos shards, um bloco com apenas um pedaço inválido coletará significativamente mais da metade dos atestados e continuará sendo o bloco mais pesado. cadeia. Para resolver esse problema, permitimos que qualquer participante que mantenha o estado de um fragmento para enviar um desafio na cadeia para qualquer pedaço inválido produzido naquele fragmento. 3.7.1 Desafio de validade do estado Depois que um participante detecta que um determinado pedaço é inválido, ele precisa fornecer uma prova de que o pedaço é inválido. Como a maioria dos participantes da rede não mantém o estado do fragmento no qual o pedaço inválido está produzido, a prova precisa ter informações suficientes para confirmar que o bloco é inválido sem ter o estado. Definimos um limite Ls da quantidade de estado (em bytes) que uma única transação pode ler ou escrever cumulativamente. Qualquer transação que toque mais de Ls estado é considerado inválido. Lembre-se da seção 3.5 que o pedaço em um determinado bloco B contém apenas as transações a serem aplicadas, mas não a nova raiz do estado. A raiz de estado incluída no pedaço do bloco B é o estado root antes de aplicar tais transações, mas depois de aplicar as transações de o último pedaço no mesmo fragmento antes do bloco B. Um ator malicioso que deseja aplicar uma transição de estado inválida incluiria uma raiz de estado incorreta no bloco B que não corresponde à raiz de estado resultante da aplicação as transações no bloco anterior. Estendemos as informações que um produtor de pedaços inclui no pedaço. Em vez de incluir apenas o estado depois de aplicar todas as transações, inclui uma raiz de estado após aplicar cada conjunto contíguo de transações que ler e escrever coletivamente Ls bytes de estado. Com essas informações para pescador criar o desafio de que uma transição de estado seja aplicada incorretamente, é suficiente para encontrar a primeira raiz de estado inválida e incluir apenas Ls bytes de estado que são afetados pelas transações entre a última raiz de estado (que foi válido) e a raiz do estado atual com as provas Merkle. Então qualquer participante pode validar as transações no segmento e confirmar que o pedaço está inválido. Da mesma forma, se o produtor do bloco tentasse incluir transações que leem e escrever mais de Ls bytes de estado, para o desafio basta incluir os primeiros Ls bytes que ele toca com as provas merkle, o que será suficiente para aplicar as transações e confirmar que há um momento em que uma tentativa de é feita a leitura ou gravação de conteúdo além de Ls bytes.

3.7.2 Pescadores e transações rápidas entre fragmentos Conforme discutido na seção 2.3, uma vez que assumimos que os pedaços de fragmento (ou fragmentos blocos no modelo com cadeias de fragmentos) podem ser inválidos e apresentar um desafio período, isso afeta negativamente a finalidade e, portanto, a comunicação entre fragmentos. Em em particular, o fragmento de destino de qualquer transação entre fragmentos não pode ser certo o fragmento ou bloco de origem é final até que o período de desafio termine (ver figura 21). Figura 21: Aguardando o período de desafio antes de aplicar um recibo A maneira de lidar com isso de uma forma que torne as transações entre fragmentos Instantâneo é para o fragmento de destino não esperar pelo período do desafio após a transação do fragmento de origem ser publicada e aplicar a transação de recebimento imediatamente, mas depois reverta o fragmento de destino junto com o fragmento de origem fragmento se posteriormente o pedaço ou bloco de origem for considerado inválido (veja a figura 22). Isso se aplica muito naturalmente ao design do Nightshade, no qual o fragmento as cadeias não são independentes, mas em vez disso, os fragmentos são todos publicados juntos no mesmo bloco da cadeia principal. Se algum pedaço for considerado inválido, o bloco inteiro com esse pedaço é considerado inválido e todos os blocos construídos nele topo disso. Veja a figura 23. Ambas as abordagens acima fornecem atomicidade, assumindo que o desafio período é suficientemente longo. Usamos a última abordagem, uma vez que fornecer transações cruzadas rápidas em circunstâncias normais supera a inconveniência de o fragmento de destino sendo revertido devido a uma transição de estado inválida em um dos os fragmentos de origem, o que é um evento extremamente raro. 3.7.3 Escondendo validators A existência dos desafios já reduz significativamente a probabilidade de corrupção adaptativa, já que para finalizar um pedaço com uma transição de estado inválida posteFigura 22: Aplicando recibos imediatamente e revertendo o destino cadeia se a cadeia de origem tiver um bloco inválido Figura 23: Desafio do pescador em Nightshade o período de desafio que o adversário adaptativo precisa para corromper todos os participantes que mantêm o estado do fragmento, incluindo todos os validators. Estimar a probabilidade de tal evento é extremamente complexo, uma vez que não sharded blockchain está ativo há tempo suficiente para que qualquer ataque desse tipo seja tentado. Argumentamos que a probabilidade, embora extremamente baixa, ainda é suficientemente grande para um sistema que deverá executar milhões de transações e executar operações financeiras em todo o mundo. Existem duas razões principais para esta crença: 1. A maioria dos validators das redes de Prova de Participação e mineradores do

As cadeias de prova de trabalho são incentivadas principalmente pela vantagem financeira. Se um adversário adaptativo oferece-lhes mais dinheiro do que o retorno esperado de operar honestamente, é razoável esperar que muitos validators aceitará a oferta. 2. Muitas entidades validam cadeias de Prova de Participação profissionalmente e espera-se que uma grande percentagem da participação em qualquer cadeia seja de tais entidades. O número de tais entidades é suficientemente pequeno para uma adversário adaptativo para conhecer a maioria deles pessoalmente e ter uma boa compreensão de sua inclinação para serem corrompidos. Damos um passo adiante na redução da probabilidade de corrupção adaptativa, ocultando quais validators estão atribuídos a qual fragmento. A ideia é remotamente semelhante à maneira como Algorand [5] esconde validators. É fundamental observar que mesmo que os validators estejam ocultos, como em Algorand ou conforme descrito abaixo, a corrupção adaptativa ainda é, em teoria, possível. Enquanto o adversário adaptativo não conhece os participantes que irão criar ou validar um bloco ou pedaço, os próprios participantes sabem que irão realizar tal tarefa e ter uma prova criptográfica disso. Assim, o adversário pode transmitir sua intenção de corromper e pagar a qualquer participante que forneça tal prova criptográfica. Notamos, no entanto, que como o adversário não conhecem os validators atribuídos ao fragmento que desejam corromper, eles não têm outra escolha a não ser transmitir sua intenção de corromper um fragmento específico para toda a comunidade. Nesse ponto, é economicamente benéfico para qualquer pessoa honesta. participante para criar um nó completo que valide esse fragmento, já que há um alto chance de um bloco inválido aparecer naquele fragmento, o que é uma oportunidade para crie um desafio e receba a recompensa associada. Para não revelar os validators atribuídos a um fragmento específico, fazemos o seguinte (ver figura 24): Usando VRF para obter a tarefa. No início de cada época cada validator usa um VRF para obter uma máscara de bits dos fragmentos aos quais validator está atribuído. A máscara de bits de cada validator terá bits Sw (veja seção 3.3 para a definição de Sw). O validator então busca o estado dos fragmentos correspondentes e durante a época para cada bloco recebido valida os pedaços que correspondem aos fragmentos aos quais validator está atribuído. Assine em blocos em vez de pedaços. Como a atribuição de fragmentos está oculta, validator não pode assinar fragmentos. Em vez disso, ele sempre assina por completo bloco, não revelando assim quais fragmentos ele valida. Especificamente, quando validator recebe um bloco e valida todos os pedaços, ele cria uma mensagem que atesta que todos os pedaços em todos os fragmentos aos quais validator está atribuído são válido (sem indicar de forma alguma quais são esses fragmentos) ou uma mensagem que contém uma prova de uma transição de estado inválida se algum pedaço for inválido. Veja o seção 3.8 para detalhes sobre como essas mensagens são agregadas, seção 3.7.4 para os detalhes sobre como evitar que validators pegue carona em mensagens de outros validators e seção 3.7.5 para detalhes sobre como recompensar e punir validators caso um desafio de transição de estado inválido bem-sucedido realmente aconteça.Figura 24: Escondendo os validators no Nightshade 3.7.4 Comprometer-Revelar Um dos problemas comuns com validators é que um validator pode pular o download do estado e realmente validar os pedaços e blocos e, em vez disso, observe a rede, veja o que os outros validators enviam e repita seus mensagens. Um validator que segue tal estratégia não fornece nenhum extra segurança para a rede, mas coleta recompensas. Uma solução comum para este problema é cada validator fornecer uma prova que eles realmente validaram o bloco, por exemplo, fornecendo um rastreamento exclusivo de aplicar a transição de estado, mas tais provas aumentam significativamente o custo de validação. Figura 25: Confirmar-revelar

Em vez disso, fazemos com que os validators primeiro se comprometam com o resultado da validação (seja a mensagem que atesta a validade dos pedaços, ou a prova de um inválido transição de estado), aguarde um determinado período, e só então revele o resultado real da validação, conforme mostrado na figura 25. O período de commit não se cruza com o período de revelação e, portanto, um validator preguiçoso não pode copiar validators honestos. Além disso, se um validator desonesto se comprometeu com uma mensagem que atesta a validade dos pedaços atribuídos, e pelo menos um pedaço era inválido, uma vez que é mostrado que o pedaço é inválido, o validator não pode evitar a redução, pois, como mostramos na seção 3.7.5, a única maneira de não ser cortado em tal situação é apresentar uma mensagem que contenha uma prova da transição de estado inválida que corresponde ao commit. 3.7.5 Lidando com desafios Conforme discutido acima, uma vez que um validator recebe um bloco com um pedaço inválido, eles primeiro preparam uma prova da transição de estado inválida (ver seção 3.7.1), depois comprometa-se com tal prova (ver 3.7.4) e, após algum período, revele o desafio. Uma vez que o desafio revelado é incluído em um bloco, acontece o seguinte: 1. Todas as transições de estado que aconteceram no bloco que contém o pedaço inválido até que o bloco no qual o desafio revelado está incluído seja obtido anulado. O estado antes do bloco que inclui o desafio revelado é considerado o mesmo que o estado antes do bloco que continha o pedaço inválido. 2. Dentro de um determinado período de tempo cada validator deve revelar sua bitmask dos fragmentos que eles validam. Como a máscara de bits é criada através de um VRF, se eles foram atribuídos ao fragmento que tinha a transição de estado inválida, eles não pode evitar revelá-lo. Qualquer validator que não revele a máscara de bits é considerado atribuído ao fragmento. 3. Cada validator que após esse período for atribuído ao shard, que se comprometeu com algum resultado de validação para o bloco que contém o pedaço inválido e que não revelou a prova de transição de estado inválida que corresponde ao seu commit é cortado. 4. Cada validator recebe uma nova atribuição de fragmentos e uma nova época é agendada para começar depois de algum tempo suficiente para que todos os validators baixem o estado, conforme mostrado na figura 26. Observe que a partir do momento em que os validators revelam os fragmentos aos quais são atribuídos até que a nova época comece, a segurança do sistema é reduzida, uma vez que o a atribuição de fragmentos é revelada. Os participantes da rede precisam mantê-la em mente ao usar a rede durante esse período. 3.8 Agregação de Assinatura Para que um sistema com centenas de fragmentos opere com segurança, queremos ter no ordem de 10.000 ou mais validators. Conforme discutido na seção 3.7, queremos que cadaFigura 26: Lidando com o desafio validator para publicar um commit para uma determinada mensagem e uma assinatura em média uma vez por bloco. Mesmo que as mensagens de commit fossem as mesmas, agregar tal A assinatura BLS e sua validação teriam sido proibitivamente caras. Mas naturalmente, as mensagens de confirmação e revelação não são as mesmas em validators, e, portanto, precisamos de alguma forma de agregar essas mensagens e as assinaturas em um maneira que permite uma validação rápida posteriormente. A abordagem específica que usamos é a seguinte: Validadores juntando-se aos produtores de blocos. Os produtores de blocos são conhecidos algum tempo antes do início da época, pois eles precisam de algum tempo para baixar o estado antes do início da época e, ao contrário dos validators, os produtores de blocos são não escondido. Cada produtor de bloco possui v validator slots. Validadores enviam propostas fora da cadeia aos produtores de blocos para serem incluídos como um de seus v validators. Se um produtor de bloco desejar incluir um validator, ele enviará um transação que contém a solicitação inicial fora da cadeia do validator e o assinatura do produtor do bloco que faz com que validator se junte ao produtor do bloco. Observe que os validators atribuídos aos produtores de blocos não necessariamente valide os mesmos fragmentos para os quais o produtor do bloco produz pedaços. Se um validator aplicado para ingressar em vários produtores de blocos, apenas a transação de o primeiro produtor de bloco terá sucesso. Os produtores de blocos coletam commits. O produtor do bloco coleta constantemente as mensagens de commit e revelação dos validators. Uma vez que um certo número dessas mensagens é acumulado, o produtor do bloco calcula um Merkle árvore dessas mensagens e envia para cada validator a raiz merkle e o merkle caminho para sua mensagem. O validator valida o caminho e faz login a raiz de merkle. O produtor do bloco então acumula uma assinatura BLS no raiz merkle de validators e publica apenas a raiz merkle e o assinatura acumulada. O produtor do bloco também assina a validade do multiassinatura usando uma assinatura ECDSA barata. Se a assinatura múltipla não corresponder à raiz merkle enviada ou à máscara de bits dos validators participantes, é um comportamento que pode ser cortado. Ao sincronizar a cadeia, um participante pode optar por validar todas as assinaturas BLS dos validators (o que é extremamente caro, pois envolve a agregação de chaves públicas de validators), ou apenasas assinaturas ECDMA dos produtores de blocos e contam com o fato de que o o produtor do bloco não foi desafiado e cortado. Usando transações on-chain e provas Merkle para desafios. Isso pode-se notar que não há valor em revelar mensagens de validators se não transição de estado inválida foi detectada. Somente as mensagens que contêm o real provas de transição de estado inválida precisam ser reveladas, e apenas para tais mensagens é preciso mostrar que eles correspondem ao commit anterior. A mensagem precisa ser revelado para dois propósitos: 1. Para realmente iniciar a reversão da cadeia para o momento anterior ao transição de estado inválida (ver seção 3.7.5). 2. Para provar que o validator não tentou atestar a validade do pedaço inválido. Em ambos os casos, precisamos abordar duas questões: 1. O commit real não foi incluído na cadeia, apenas a raiz merkle do commit agregado com outras mensagens. O validator precisa usar o caminho merkle fornecido pelo produtor do bloco e seu compromisso original com provar que eles se comprometeram com o desafio. 2. É possível que todos os validators atribuídos ao fragmento com o inválido transição de estado foi atribuída a produtores de blocos corrompidos que estão censurando-os. Para contornar isso, permitimos que eles enviem suas revelações como uma transação regular on-chain e ignorar a agregação. Este último só é permitido para as provas de transição de estado inválida, que são extremamente raro e, portanto, não deve resultar em spam nos blocos. A questão final que precisa ser abordada é que os produtores de blocos podem optar por não participar da agregação de mensagens ou censurar intencionalmente determinados validators. Tornamo-lo economicamente desvantajoso, ao tornar o bloco recompensa do produtor proporcional ao número de validators atribuídos a eles. Nós observe também que, uma vez que os produtores de blocos entre épocas se cruzam amplamente (já que são sempre os principais participantes com a aposta mais alta), os validators podem em grande parte, limitar-se a trabalhar com os mesmos produtores de blocos e, assim, reduzir o risco de serem atribuídos a um produtor de blocos que os censurou no passado. 3.9 Cadeia de instantâneos Como os blocos da cadeia principal são produzidos com muita frequência, o download o histórico completo pode ficar caro muito rapidamente. Além disso, uma vez que cada bloco contém uma assinatura BLS de um grande número de participantes, apenas a agregação das chaves públicas para verificar a assinatura pode se tornar proibitiva caro também. Finalmente, uma vez que em qualquer futuro previsível Ethereum 1.0 provavelmente permanecerá um dos blockchains mais usados, tendo uma maneira significativa de transferir ativos de

Perto de Ethereum é um requisito, e hoje verificar assinaturas BLS para garantir A validade de quase blocos no lado de Ethereum não é possível. Cada bloco na cadeia principal do Nightshade pode conter opcionalmente um Schnorr multiassinatura no cabeçalho do último bloco que incluía tal Schnorr multiassinatura. Chamamos esses blocos de blocos instantâneos. O primeiro bloco de cada época deve ser um bloco de instantâneo. Enquanto trabalhava em tal assinatura múltipla, os produtores de blocos também devem acumular as assinaturas BLS dos validators no último bloco de instantâneo e agregue-os da mesma maneira descrita em seção 3.8. Como o conjunto de produtores de blocos é constante ao longo da época, validando apenas os primeiros blocos de instantâneos em cada época são suficientes, assumindo que em nenhum momento apontam que uma grande porcentagem de produtores de blocos e validators conspiraram e criaram um garfo. O primeiro bloco da época deve conter informações suficientes para calcular os produtores de blocos e validators para a época. Chamamos a subcadeia da cadeia principal que contém apenas o instantâneo bloqueia uma cadeia de instantâneos. Criar uma multiassinatura Schnorr é um processo interativo, mas como só precisa executá-lo com pouca frequência, qualquer processo, não importa quão ineficiente, será suficiente. As multiassinaturas Schnorr podem ser facilmente validadas em Ethereum, fornecendo assim primitivas cruciais para uma maneira segura de realizar cross-blockchain comunicação. Para sincronizar com a cadeia Near, basta baixar todos os instantâneos blocos e confirme se as assinaturas Schnorr estão corretas (opcionalmente também verificando as assinaturas BLS individuais dos validators) e, em seguida, apenas sincronizando blocos da cadeia principal do último bloco de snapshot.

결론

이 문서에서 우리는 샤딩된 blockchain을 구축하는 방법과 기존 접근 방식의 두 가지 주요 문제, 즉 상태 타당성을 다루었습니다. 및 데이터 가용성. 그런 다음 샤딩 디자인인 Nightshade를 선보였습니다. NEAR 프로토콜에 힘을 실어줍니다. 디자인 작업이 진행 중입니다. 의견, 질문 또는 피드백이 있는 경우 이 문서에서 https://near.chat.로 이동하세요.

Conclusão

Neste documento discutimos abordagens para construir blockchains fragmentados e cobriu dois grandes desafios com as abordagens existentes, nomeadamente a validade do estado e disponibilidade de dados. Em seguida, apresentamos o Nightshade, um design de fragmentação que poderes NEAR Protocolo. O design está em andamento, se você tiver comentários, perguntas ou feedback neste documento, vá para https://near.chat.