NEAR Teknik Raporu
Validité de l’état et disponibilité des données
L'idée centrale des blockchain fragmentés est que la plupart des participants opérant ou l'utilisation du réseau ne peut pas valider les blocs dans tous les fragments. Ainsi, chaque fois tout participant doit interagir avec un fragment particulier qu'il ne peut généralement pas téléchargez et validez tout l’historique du fragment. L’aspect partitionnement du sharding soulève cependant un potentiel important. problème : sans télécharger et valider tout l'historique d'un particulier fragment, le participant ne peut pas nécessairement être certain que l'état avec lequel il 5Cette section, à l'exception de la sous-section 2.5.3, a été publiée précédemment à https://near.ai/ fragment2. Si vous l'avez déjà lu, passez à la section suivante.
ils interagissent est le résultat d’une séquence valide de blocs et que cette séquence de blocs est en effet la chaîne canonique du fragment. Un problème qui n'existe pas exister dans un blockchain non fragmenté. Nous présenterons dans un premier temps une solution simple à ce problème qui a été proposée par de nombreux protocoles, puis analyser comment cette solution peut échouer et ce qui des tentatives ont été faites pour y remédier. 2.1 Rotation des validateurs La solution naïve de la validité d’état est illustrée à la figure 5 : disons que nous supposons que l'ensemble du système possède de l'ordre de milliers de validator, parmi lesquels pas plus de 20 % sont malveillants ou échoueront autrement (par exemple en ne parvenant pas à être en ligne pour produire un bloc). Alors si nous échantillonnons 200 validators, la probabilité de plus de 1 3, pour des raisons pratiques, peut être considéré comme étant nul. Figure 5 : Échantillonnage de validators 1 3 est un seuil important. Il existe une famille de protocoles de consensus, appelés BFT protocoles de consensus, qui garantissent que pendant moins de 1 3 de les participants échouent, soit en s'écrasant, soit en agissant d'une manière qui viole le protocole, le consensus sera atteint. Avec cette hypothèse de pourcentage honnête de validator, si l'ensemble actuel de validators dans un fragment nous fournit un bloc, la solution naïve suppose que le bloc est valide et qu'il est construit sur ce que les validator pensaient être la chaîne canonique pour ce fragment lorsqu'ils ont commencé la validation. Les validator appris la chaîne canonique de l'ensemble précédent de validator, qui par la même hypothèse construite au sommet du bloc qui était la tête de la chaîne canonique avant ça. Par induction toute la chaîne est valide, et puisqu'aucun ensemble de validators à tout moment produit des fourches, la solution naïve est aussi certaine que le courant chain est la seule chaîne du fragment. Voir la figure 6 pour une visualisation.
Figure 6 : Un blockchain avec chaque bloc finalisé via le consensus BFT Cette solution simple ne fonctionne pas si nous supposons que les validator peuvent être corrompu de manière adaptative, ce qui n’est pas une hypothèse déraisonnable6. De manière adaptative corrompre un seul fragment dans un système comportant 1 000 fragments est beaucoup moins cher que de corrompre tout le système. Par conséquent, la sécurité du protocole diminue linéairement avec le nombre de fragments. Pour avoir la certitude de la validité de un bloc, nous devons savoir qu'à aucun moment de l'histoire aucun fragment du système n'a une majorité de validators sont de connivence ; avec des adversaires adaptatifs, nous n'avons plus une telle certitude. Comme nous l'avons vu dans la section 1.5, les validator de connivence peuvent exercer deux comportements malveillants de base : créer des forks et produire des blocs invalides. Les forks malveillants peuvent être résolus par des blocs réticulés à la chaîne Beacon qui est généralement conçue pour avoir une sécurité nettement supérieure à celle de Beacon. les chaînes d'éclats. Cependant, produire des blocs invalides est beaucoup plus compliqué. problème difficile à résoudre. 2.2 Validité de l'État Considérons la figure 7 sur laquelle le fragment n°1 est corrompu et un acteur malveillant produit bloc B invalide. Supposons que dans ce bloc B 1000 tokens aient été frappés à partir de minces diffusé sur le compte d’Alice. L'acteur malveillant produit alors un bloc C valide (dans un sens que les transactions en C sont appliquées correctement) au-dessus de B, obscurcissant le bloc B invalide et initie une transaction entre fragments vers le fragment n°2 qui transfère ces 1 000 token sur le compte de Bob. A partir de ce moment le mal Les token créés résident sur un blockchain par ailleurs entièrement valide dans le fragment n°2. Voici quelques approches simples pour résoudre ce problème : 6Lire ceci article pour détails sur comment adaptatif la corruption peut être porté dehors : https://medium.com/nearprotocol/d859adb464c8. Pour plus détails sur adaptatif la corruption, lire https://github.com/ethereum/wiki/wiki/Sharding-FAQ# quels-sont-les-modèles-de-sécurité-dans lesquels-nous-opérons-Figure 7 : Une transaction entre fragments d'une chaîne qui a un bloc invalide 1. Pour validators du Shard #2 pour valider le bloc à partir duquel la transaction est initiée. Cela ne fonctionnera pas même dans l'exemple ci-dessus, puisque le bloc C semble être tout à fait valable. 2. Pour les validator dans le fragment n°2 pour valider un grand nombre de blocs précédant le bloc à partir duquel la transaction est initiée. Naturellement, pour n'importe quel nombre de blocs N validés par le fragment récepteur du malware Les validator peuvent créer N+1 blocs valides au-dessus du bloc invalide qu'ils ont produit. Une idée prometteuse pour résoudre ce problème serait d'organiser les fragments dans un graphe non orienté dans lequel chaque fragment est connecté à plusieurs autres fragments, et autoriser uniquement les transactions entre fragments entre fragments voisins (par exemple, voici comment Le sharding de Vlad Zamfir fonctionne pour l’essentiel7, et une idée similaire est utilisée dans l’ouvrage de Kadena. Toile de chaîne [1]). Si une transaction entre fragments est nécessaire entre des fragments qui sont et non des voisins, une telle transaction est acheminée via plusieurs fragments. Dans cette conception un validator dans chaque fragment devrait valider à la fois tous les blocs de leur fragment ainsi que tous les blocs de tous les fragments voisins. Considérons une figure ci-dessous avec 10 fragments, chacun ayant quatre voisins, et pas deux fragments nécessitant plus plus de deux sauts pour une communication entre fragments illustrée à la figure 8. Le fragment n°2 valide non seulement ses propres blockchain, mais également les blockchain de tous les voisins, y compris Shard #1. Donc si un acteur malveillant sur le Shard #1 tente de créer un bloc B invalide, puis de construire le bloc C par-dessus et lancez une transaction entre fragments, une telle transaction entre fragments ne se déroulera pas puisque Shard #2 aura validé tout l'historique du Shard #1 qui le fera identifier le bloc B invalide. 7En savoir plus sur le design ici : https://medium.com/nearprotocol/37e538177ed9
Figure 8 : Une transaction entre fragments non valide dans un système de type chainweb qui être détecté Même si corrompre un seul fragment n'est plus une attaque viable, corrompre un seul fragment n'est plus une attaque viable. quelques fragments restent un problème. Sur la figure 9 un adversaire corrompt les deux Shard
1 et Shard #2 exécutent avec succès une transaction entre fragments avec Shard #3
avec des fonds provenant d'un bloc B invalide : Figure 9 : Une transaction entre fragments non valide dans un système de type chainweb qui ne pas être détecté Le fragment n°3 valide tous les blocs du fragment n°2, mais pas du fragment n°1, et n'a aucun moyen de détecter le bloc malveillant. Il existe deux directions principales pour résoudre correctement la validité d’état : les pêcheurs
et des preuves cryptographiques de calcul. 2.3 Pêcheur L'idée derrière la première approche est la suivante : chaque fois qu'un en-tête de bloc est communiqué entre les chaînes à quelque fin que ce soit (comme la réticulation avec le chaîne de balises, ou une transaction entre fragments), il y a une période de temps pendant lequel tout validator honnête peut fournir une preuve que le blocage est invalide. Là existe diverses constructions qui permettent des preuves très succinctes que les blocs sont invalide, donc la surcharge de communication pour les nœuds de réception est bien moindre que celui de recevoir un bloc complet. Avec cette approche tant qu’il y aura au moins un validator honnête dans le fragment, le système est sécurisé. Figure 10 : Pêcheur C’est l’approche dominante (en plus de prétendre que le problème n’existe pas) parmi les protocoles proposés aujourd’hui. Cette approche comporte cependant deux inconvénients majeurs : 1. La période de contestation doit être suffisamment longue pour l'honnête validator pour reconnaître qu'un bloc a été produit, le télécharger, le vérifier entièrement et préparer le défi si le bloc est invalide. L'introduction d'une telle période permettrait ralentir considérablement les transactions entre fragments. 2. L’existence du protocole de challenge crée un nouveau vecteur d’attaques lorsque des nœuds malveillants spamment avec des défis non valides. Une solution évidente à ce problème est d'obliger les challengers à déposer une certaine quantité de tokens qui sont rendus si le défi est valide. Il ne s'agit là que d'une solution partielle, car elle pourrait toujours être bénéfique pour l'adversaire de spammer le système (et de graver les dépôts) avec des défis invalides, par exemple pour empêcher ledéfi d'un honnête validator de passer à travers. Ces attaques sont appelés attaques de deuil. Voir la section 3.7.2 pour savoir comment contourner ce dernier point. 2.4 Arguments succincts et non interactifs de la connaissance La deuxième solution à la corruption de plusieurs fragments consiste à utiliser une sorte de construction cryptographique qui permet de prouver qu'un certain calcul (tel qu'un comme le calcul d'un bloc à partir d'un ensemble de transactions) a été effectué correctement. De telles constructions existent, par ex. zk-SNARK, zk-STARK et quelques autres, et certains sont aujourd'hui activement utilisés dans les protocoles blockchain pour les paiements privés, notamment ZCash. Le principal problème de ces primitives est qu’elles sont notoirement lents à calculer. Par ex. Protocole Coda, qui utilise zk-SNARK spécifiquement pour prouver que tous les blocs du blockchain sont valides, dit en un des entretiens que cela peut prendre 30 secondes par transaction pour créer une preuve (ce nombre est probablement plus petit maintenant). Il est intéressant de noter qu’une preuve n’a pas besoin d’être calculée par une partie de confiance, puisque la preuve atteste non seulement de la validité du calcul pour lequel elle est construite, mais aussi de la validité de la preuve elle-même. Ainsi, le calcul de ces preuves peut être divisé parmi un ensemble de participants avec une redondance significativement moindre qu'elle ne le serait nécessaire d'effectuer des calculs sans confiance. Il permet également aux participants qui calculent les zk-SNARK pour qu'ils fonctionnent sur du matériel spécial sans réduire le décentralisation du système. Les défis des zk-SNARK, outre les performances, sont : 1. Dépendance à des primitives cryptographiques moins recherchées et moins éprouvées ; 2. « Déchets toxiques » — les zk-SNARK dépendent d'une configuration fiable dans laquelle un groupe des personnes effectuent des calculs puis rejettent les calculs intermédiaires. valeurs de ce calcul. Si tous les participants à la procédure sont de connivence et conservez les valeurs intermédiaires, de fausses preuves peuvent être créées ; 3. Complexité supplémentaire introduite dans la conception du système ; 4. Les zk-SNARK ne fonctionnent que pour un sous-ensemble de calculs possibles, donc un protocole avec un langage smart contract Turing-complet ne serait pas en mesure d'utiliser SNARK pour prouver la validité de la chaîne. 2.5 Disponibilité des données Le deuxième problème que nous aborderons est la disponibilité des données. Généralement les nœuds exploitant un blockchain particulier sont séparés en deux groupes : les nœuds complets, ceux qui téléchargent chaque bloc complet et valident chaque transaction, et Light Les nœuds, ceux qui téléchargent uniquement les en-têtes de bloc et utilisent les preuves Merkle pour les pièces de l’État et des transactions qui les intéressent, comme le montre la figure 11.
Figure 11 : Arbre Merkle Désormais, si une majorité de nœuds complets s'entendent, ils peuvent produire un bloc, valide ou invalide, et envoie son hash aux nœuds légers, mais ne divulgue jamais le contenu complet du bloc. Ils peuvent en bénéficier de différentes manières. Par exemple, considérons la figure 12 : Figure 12 : Problème de disponibilité des données Il y a trois blocs : le précédent, A, est produit par des validator honnêtes ; le courant, B, a validators de connivence ; et le suivant, C, sera également produit par des validator honnêtes (le blockchain est représenté dans le coin inférieur droit). Vous êtes un commerçant. Les validators du bloc actuel (B) reçu A des validator précédents, calculé un bloc dans lequel vous recevez de l'argent,et vous a envoyé un en-tête de ce bloc avec une preuve Merkle de l'état dans lequel vous avez de l'argent (ou une preuve Merkle d'une transaction valide qui envoie l'argent à vous). Confiant que la transaction est finalisée, vous fournissez le service. Cependant, les validator ne distribuent jamais l'intégralité du contenu du bloc B à n'importe qui. En tant que tel, les validator honnêtes du bloc C ne peuvent pas récupérer le bloc, et sont obligés soit de bloquer le système, soit de construire au-dessus de A, vous privant en tant que marchand d'argent. Lorsque nous appliquons le même scénario au sharding, les définitions de full et le nœud léger s'applique généralement par fragment : validators dans chaque fragment téléchargé tous les bloquer ce fragment et valider chaque transaction dans ce fragment, mais d'autres nœuds du système, y compris ceux qui capturent l'état des chaînes de fragments dans le chaîne de balises, téléchargez uniquement les en-têtes. Ainsi, les validator dans la partition sont effectivement des nœuds complets pour cette partition, tandis que les autres participants du système, y compris la chaîne de balises, fonctionnent comme des nœuds lumineux. Pour que l’approche du pêcheur dont nous avons discuté ci-dessus fonctionne, des validator honnêtes doivent pouvoir télécharger des blocs qui sont réticulés à la chaîne de balises. Si des validator malveillants ont croisé l'en-tête d'un bloc invalide (ou l'ont utilisé pour lancer une transaction cross-shard), mais n'a jamais distribué le bloc, l'honnête Les validator n'ont aucun moyen de créer un défi. Nous aborderons trois approches pour résoudre ce problème qui complètent les uns les autres. 2.5.1 Preuves de garde Le problème le plus immédiat à résoudre est de savoir si un bloc est disponible une fois il est publié. Une idée proposée est d'avoir des notaires qui alternent entre les fragments plus souvent que les validator dont le seul travail est de télécharger un bloquer et attester du fait qu’ils ont pu le télécharger. Ils peuvent être tournés plus fréquemment car ils n'ont pas besoin de télécharger l'intégralité de l'état du fragment, contrairement aux validator qui ne peuvent pas être tournés fréquemment car ils doivent télécharger l'état du fragment à chaque rotation, comme indiqué sur la figure 13. Le problème de cette approche naïve est qu’il est impossible de prouver par la suite si le notaire a pu ou non télécharger le bloc, donc un notaire peuvent choisir de toujours attester qu'ils ont pu télécharger le bloc sans même en essayant de le récupérer. Une solution à ce problème est que les notaires fournissent des preuves ou de mettre en jeu une certaine quantité de tokens attestant que le bloc était téléchargé. Une de ces solutions est discutée ici : https://ethresear.ch/t/ Obligations de garde conviviales pour l'agrégation 1 bit/2236. 2.5.2 Codes d'effacement Lorsqu'un nœud léger particulier reçoit un hash d'un bloc, pour augmenter le nombre de nœuds sûr que le bloc est disponible, il peut tenter d'en télécharger quelques-uns au hasard. morceaux du bloc. Ce n'est pas une solution complète, car à moins que les nœuds légers téléchargez collectivement l'intégralité du bloc que les producteurs de blocs malveillants peuvent choisir
Figure 13 : Les validateurs doivent télécharger l'état et ne peuvent donc pas être pivotés fréquemment pour retenir les parties du bloc qui n'ont été téléchargées par aucun nœud léger, rendant ainsi toujours le bloc indisponible. Une solution consiste à utiliser une construction appelée Erasure Codes pour permettre pour récupérer le bloc complet même si seule une partie du bloc est disponible, comme indiqué sur la figure 14. Figure 14 : Merkle tree construit sur des données codées à effacement Polkadot et Ethereum Serenity ont tous deux des conceptions autour de cette idée qui fournir un moyen aux nœuds légers d'être raisonnablement sûrs que les blocs sont disponibles. L’approche Ethereum Sérénité a une description détaillée dans [2].2.5.3 L'approche de Polkadot en matière de disponibilité des données Dans Polkadot, comme dans la plupart des solutions fragmentées, chaque fragment (appelé parachain) capture ses blocs sur la chaîne de balises (appelée chaîne de relais). Disons qu'il y a 2f + 1 validators sur la chaîne de relais. Les producteurs de blocs de parachain, appelés les assembleurs, une fois le bloc parachain produit, calculent une version codée par effacement du bloc qui se compose de 2f +1 parties de telle sorte que toutes les parties f soient suffisantes pour reconstruire le bloc. Ils distribuent ensuite une part à chaque validator sur le chaîne de relais. Une chaîne de relais particulière validator ne signerait que sur une chaîne de relais bloquer s'ils ont leur part pour chaque bloc de parachain qui est instantané sur tel bloc de chaîne de relais. Ainsi, si un bloc de chaîne relais a des signatures de 2f + 1 validators, et tant que pas plus de f d'entre eux ont violé le protocole, chacun le bloc de parachain peut être reconstruit en récupérant les pièces des validators qui suivent le protocole. Voir la figure 15. Figure 15 : Disponibilité des données de Polkadot 2.5.4 Disponibilité des données à long terme Notez que toutes les approches évoquées ci-dessus attestent seulement du fait qu'un bloc a été publié et est disponible dès maintenant. Les blocs peuvent devenir indisponibles ultérieurement pour diverses raisons : nœuds mis hors ligne, nœuds effaçant intentionnellement l'historique. données, et autres. Un livre blanc digne de mention qui aborde ce problème est Polyshard [3], qui utilise des codes d'effacement pour rendre les blocs disponibles sur plusieurs fragments, même si plusieurs les fragments perdent complètement leurs données. Malheureusement, leur approche spécifique nécessite tous les fragments pour télécharger des blocs de tous les autres fragments, ce qui est prohibitif cher. La disponibilité à long terme n'est pas un problème aussi urgent : puisqu'aucun participant dans le système devrait être capable de valider toutes les chaînes dans tous les
fragments, la sécurité du protocole fragmenté doit être conçue de manière à manière dont le système est sécurisé même si certains anciens blocs de certains fragments deviennent totalement indisponible.
Durum Geçerliliği ve Veri Kullanılabilirliği
Parçalanmış blockchain'lerdeki temel fikir, çoğu katılımcının işletim veya ağı kullanmak tüm parçalardaki blokları doğrulayamaz. Bu nedenle, ne zaman olursa olsun herhangi bir katılımcının genellikle yapamadığı belirli bir parçayla etkileşime girmesi gerekir Parçanın tüm geçmişini indirin ve doğrulayın. Bununla birlikte, parçalamanın bölümleme yönü önemli bir potansiyel ortaya çıkarmaktadır. sorun: belirli bir uygulamanın tüm geçmişini indirmeden ve doğrulamadan katılımcının parçanın bulunduğu durumdan mutlaka emin olması mümkün değildir. 5Bu bölüm, alt bölüm 2.5.3 hariç, daha önce https://near.ai/ adresinde yayınlanmıştır. parça2. Daha önce okuduysanız bir sonraki bölüme geçin.
etkileşime girmeleri bazı geçerli blok dizilerinin sonucudur ve bu dizi Blok sayısı gerçekten de parçadaki kanonik zincirdir. Çözülmeyen bir sorun parçalanmamış bir blockchain içinde mevcut. Öncelikle bu soruna önerilen basit bir çözüm sunacağız. birçok protokole göre analiz edin ve ardından bu çözümün nasıl bozulabileceğini ve ne olacağını analiz edin. giderilmesine yönelik girişimlerde bulunuldu. 2.1 Doğrulayıcıların rotasyonu Durum geçerliliğine yönelik saf çözüm şekil 5'te gösterilmektedir: diyelim ki tüm sistemde binlerce validators var, bunlardan %20'den fazlası kötü niyetli değildir veya başka şekilde başarısız olacaktır (örneğin, Bir blok oluşturmak için çevrimiçi). O zaman 200 validators örnek alırsak olasılık 1'den fazla 3 pratik amaçlar açısından başarısızlığın sıfır olduğu varsayılabilir. Şekil 5: Örnekleme validators 1 3 önemli bir eşik. Bir mutabakat protokolü ailesi var. BFT fikir birliği protokolleri; bu, 1'den az olduğu sürece bunu garanti eder 3'ü Katılımcılar ya kaza yaparak ya da kuralları ihlal eden bir şekilde hareket ederek başarısız olurlar. Protokolde fikir birliğine varılacak. Bu dürüst validator yüzdelik varsayımla, eğer mevcut Saf çözüm, bir parçadaki validators'nin bize bir miktar blok sağladığını varsayar bloğun geçerli olduğunu ve validators olduğuna inanılanlar üzerine inşa edildiğini doğrulamaya başladıklarında söz konusu parçanın standart zinciri. validator'lar kanonik zinciri önceki validators kümesinden öğrendi; Kanonik zincirin başı olan bloğun üzerine inşa edilen varsayım ondan önce. Tümevarımla zincirin tamamı geçerlidir ve validators kümesi olmadığından Çatal üretilen herhangi bir noktada, naif çözüm aynı zamanda mevcut olanın da kesin olduğudur. zincir, parçadaki tek zincirdir. Görselleştirme için şekil 6'ya bakın.
Şekil 6: Her bloğun BFT fikir birliğiyle sonlandırıldığı bir blockchain validators'nin olabileceğini varsayarsak bu basit çözüm işe yaramaz. uyumsal olarak bozulmuştur ki bu mantıksız bir varsayım değildir6. Uyarlanabilir 1000 parçadan oluşan bir sistemde tek bir parçayı bozmak çok daha ucuzdur tüm sistemi bozmak yerine. Bu nedenle protokolün güvenliği, parça sayısı arttıkça doğrusal olarak azalır. Geçerliliğinden emin olmak için bir blok, tarihin herhangi bir noktasında sistemdeki hiçbir parçanın olmadığını bilmeliyiz. validator'ların çoğunluğu gizli anlaşma yapıyor; uyarlanabilir düşmanlarla artık elimizde değil öyle bir kesinlik ki. Bölüm 1.5'te tartıştığımız gibi, validators ile gizli anlaşma yapmak işe yarayabilir iki temel kötü niyetli davranış: çatallar oluşturmak ve geçersiz bloklar üretmek. Kötü niyetli çatallanmalar, blokların genel olarak diğerlerine göre önemli ölçüde daha yüksek güvenliğe sahip olacak şekilde tasarlanan Beacon zincirine çapraz bağlanmasıyla ele alınabilir. kırık zincirler. Geçersiz bloklar üretmek ise önemli ölçüde daha fazla bir sorundur. üstesinden gelinmesi zor bir sorun. 2.2 Durum Geçerliliği 1. Parçanın bozulduğu ve kötü niyetli bir aktörün ürettiği Şekil 7'yi düşünün. geçersiz blok B. Diyelim ki bu B bloğunda 1000 tokens yoktan basıldı Alice'in hesabında yayın. Kötü niyetli aktör daha sonra geçerli C bloğunu üretir (bir C'deki işlemlerin doğru bir şekilde uygulandığını hissetmek) B'nin yanı sıra kafa karıştırıcı geçersiz B bloğunu kullanır ve Parça #2'ye bir çapraz parça işlemi başlatır. bu 1000 tokens'yi Bob'un hesabına aktarır. Bu andan itibaren uygunsuz bir şekilde oluşturulan token'ler, Parça #2'deki tamamen geçerli bir blockchain üzerinde bulunuyor. Bu sorunu çözmeye yönelik bazı basit yaklaşımlar şunlardır: 6Oku bu makale için ayrıntılar üzerinde nasıl uyarlanabilir yolsuzluk yapabilir olmak taşınan dışarı: https://medium.com/nearprotocol/d859adb464c8. için daha fazla ayrıntılar üzerinde uyarlanabilir yolsuzluk, okumak https://github.com/ethereum/wiki/wiki/Sharding-FAQ# altında-çalıştığımız-güvenlik modelleri nelerdirŞekil 7: Geçersiz bloğu olan bir zincirden gelen parçalar arası işlem 1. İşlemin yapıldığı bloğu doğrulamak amacıyla validators Parça #2 için başlatılır. Bu yukarıdaki örnekte bile işe yaramayacaktır çünkü C bloğu tamamen geçerli olduğu görülmektedir. 2. İşlemin başlatıldığı bloktan önceki çok sayıda bloğu doğrulamak için Parça #2'deki validators için. Doğal olarak, kötü niyetli alıcı parça tarafından doğrulanan herhangi bir sayıda blok N validators, geçersiz bloğun üstünde N+1 geçerli blok oluşturabilir üretildi. Bu sorunu çözmek için umut verici bir fikir, parçaları bir düzende düzenlemek olacaktır. her bir parçanın diğer birkaç parçaya bağlandığı yönlendirilmemiş grafik ve yalnızca komşu parçalar arasında çapraz parça işlemlerine izin ver (ör. Vlad Zamfir'in parçalaması esasen işe yarıyor7 ve benzer fikir Kadena'nınkinde de kullanılıyor Chainweb [1]). Parçalar arasında parçalar arası bir işlem gerekiyorsa komşular değil, bu tür işlemler birden fazla parça aracılığıyla yönlendirilir. Bu tasarımda Her bir parçadaki bir validator'nin, kendi parçalarındaki tüm blokları doğrulaması bekleniyor ve ayrıca tüm komşu parçalardaki tüm bloklar. Aşağıdaki şekli düşünün 10 parçadan oluşan, her birinin dört komşusu olan ve daha fazlasını gerektiren iki parçanın olmadığı Şekil 8'de gösterilen çapraz parça iletişimi için ikiden fazla atlama. Parça #2 yalnızca kendi blockchain parçasını değil aynı zamanda blockchain parçasını da doğruluyor 1 numaralı Parça dahil tüm komşular. Yani Parça #1'de kötü niyetli bir aktör varsa geçersiz bir B bloğu oluşturmaya çalışıyor, ardından bunun üzerine C bloğunu inşa ediyor ve parçalar arası bir işlem başlatın, bu tür parçalar arası işlem gerçekleşmeyecek Parça #2'den beri Parça #1'in tüm geçmişi doğrulanmış olacak. geçersiz B bloğunu tanımlamasına neden olacaktır. 7Tasarım hakkında daha fazla bilgiyi burada bulabilirsiniz: https://medium.com/nearprotocol/37e538177ed9
Şekil 8: Chainweb benzeri sistemde geçersiz bir çapraz parça işlemi tespit edilmek Tek bir parçayı bozmak artık geçerli bir saldırı olmasa da, bir parçayı bozmak artık geçerli bir saldırı değildir. birkaç parça sorun olmaya devam ediyor. Şekil 9'da bir düşman her iki Shard'ı da bozuyor
1 ve Parça #2, Parça #3'e yönelik bir çapraz parça işlemini başarıyla yürütür
geçersiz bir B bloğundan gelen fonlarla: Şekil 9: Chainweb benzeri sistemde geçersiz bir çapraz parça işlemi tespit edilmemek Parça #3, Parça #2'deki tüm blokları doğrular ancak Parça #1'deki tüm blokları doğrular ve kötü amaçlı bloğu tespit etmenin bir yolu yoktur. Durum geçerliliğini doğru şekilde çözmenin iki ana yönü vardır: balıkçılar
ve hesaplamanın kriptografik kanıtları. 2.3 Balıkçı İlk yaklaşımın arkasındaki fikir şudur: ne zaman bir blok başlığı Herhangi bir amaç için zincirler arasında iletilir (örneğin çapraz bağlanma gibi). işaret zinciri veya parçalar arası bir işlem), bu sırada belirli bir süre vardır dürüst herhangi bir validator bloğun geçersiz olduğuna dair kanıt sağlayabilir. Orada blokların çok kısa ve öz kanıtlarını sağlayan çeşitli yapılardır. geçersiz olduğundan alıcı düğümlerin iletişim yükü çok daha küçüktür tam bir blok almaktan daha fazla. En az bir dürüst validator olduğu sürece bu yaklaşımla Shard, sistem güvenlidir. Şekil 10: Balıkçı Bu, bugün önerilen protokoller arasında (sorun yokmuş gibi davranmanın yanı sıra) baskın yaklaşımdır. Ancak bu yaklaşımın iki önemli dezavantajlar: 1. Dürüst validator için meydan okuma süresinin yeterince uzun olması gerekir Bir bloğun üretildiğini tanımak, onu indirmek, tamamen doğrulamak ve hazırlamak blok geçersizse meydan okuma. Böyle bir dönemin getirilmesi Parçalar arası işlemleri önemli ölçüde yavaşlatır. 2. Challenge protokolünün varlığı yeni bir saldırı vektörü yaratıyor Kötü niyetli düğümler geçersiz sorgulamalarla spam yaptığında. Açık bir çözüm Bu sorunun çözümü, meydan okuyanların bir miktar tokens yatırmasını sağlamaktır. meydan okuma geçerliyse iade edilir. Bu yalnızca kısmi bir çözümdür, çünkü saldırganın sisteme spam göndermesi (ve yakması) yine de faydalı olabilir. örneğin geçerli işlemleri engellemek için geçersiz sorgulamalarla yapılan para yatırma işlemleri)dürüst bir validator'dan gelen meydan okuma. Bu saldırılar Kederli Saldırılar denir. İkinci noktayı aşmanın bir yolu için bölüm 3.7.2'ye bakın. 2.4 Kısa ve Etkileşimli Olmayan Bilgi Argümanları Çoklu parça bozulmasına karşı ikinci çözüm, belirli bir hesaplamanın (örneğin, bir dizi işlemden bir bloğun hesaplanması gibi) doğru bir şekilde gerçekleştirildi. Bu tür yapılar mevcuttur; zk-SNARK'lar, zk-STARK'lar ve birkaç kişi daha, ve bazıları bugün blockchain protokollerinde özel ödemeler için aktif olarak kullanılıyor, en önemlisi ZCash. Bu tür ilkellerle ilgili temel sorun, onların hesaplamanın oldukça yavaş olduğu biliniyor. Örn. zk-SNARK'ları kullanan Coda Protokolü özellikle blockchain içindeki tüm blokların geçerli olduğunu kanıtlamak için, birinde söylendi Kanıt oluşturmanın işlem başına 30 saniye sürebileceği görüşmelerden (bu sayı muhtemelen şimdiye kadar daha küçüktür). İlginç bir şekilde, bir kanıtın güvenilir bir tarafça hesaplanmasına gerek yoktur, çünkü Kanıt yalnızca oluşturulduğu hesaplamanın geçerliliğini kanıtlamakla kalmaz, aynı zamanda kanıtın kendisinin geçerliliği. Dolayısıyla bu tür kanıtların hesaplanması bölünebilir önemli ölçüde daha az yedekliliğe sahip bir grup katılımcı arasında bazı güvenilir hesaplamalar yapmak için gereklidir. Aynı zamanda katılımcıların zk-SNARK'ları özel donanım üzerinde çalışacak şekilde hesaplayanlar sistemin ademi merkeziyetçiliği. zk-SNARK'ların performansın yanı sıra karşılaştığı zorluklar şunlardır: 1. Daha az araştırılmış ve daha az zaman içinde test edilmiş kriptografik temellere bağımlılık; 2. “Zehirli atık” — zk-SNARK'lar, bir grubun içinde bulunduğu güvenilir bir kuruluma bağlıdır İnsanların oranı bir miktar hesaplama yapıyor ve ardından ara hesaplamayı atıyor bu hesaplamanın değerleri. Prosedürün tüm katılımcıları gizli anlaşma yaparsa ve ara değerleri koruyarak sahte deliller oluşturulabilir; 3. Sistem tasarımına eklenen ekstra karmaşıklık; 4. zk-SNARK'lar yalnızca olası hesaplamaların bir alt kümesi için çalışır, dolayısıyla bir protokol Turing-complete smart contract dilini kullanamazsınız Zincirin geçerliliğini kanıtlamak için SNARK'lar. 2.5 Veri Kullanılabilirliği Değineceğimiz ikinci sorun veri kullanılabilirliğidir. Genellikle düğümler belirli bir blockchain çalıştıran iki gruba ayrılır: Tam Düğümler, her tam bloğu indiren ve her işlemi doğrulayanlar ve Light Yalnızca blok başlıklarını indiren ve parçalar için Merkle kanıtlarını kullanan düğümler Şekil 11'de gösterildiği gibi ilgilendikleri durum ve işlemler.
Şekil 11: Merkle Ağacı Artık tam düğümlerin çoğunluğu gizli anlaşma yaparsa geçerli veya geçerli bir blok üretebilirler. geçersizdir ve hash dosyasını hafif düğümlere gönderin, ancak içeriğin tamamını hiçbir zaman açıklamayın bloğun. Bundan faydalanabilecekleri çeşitli yollar vardır. Örneğin, Şekil 12'yi düşünün: Şekil 12: Veri Kullanılabilirliği sorunu Üç blok vardır: önceki A, dürüst validators tarafından üretilmiştir; mevcut B'nin validators gizli anlaşması var; ve bir sonraki C de üretilecek dürüst validators tarafından (blockchain sağ alt köşede gösterilmektedir). Sen bir tüccarsın. Geçerli bloğun (B) validator'leri alınan blok Önceki validator'lerden A, içinde para aldığınız bir blok hesapladı,ve size o bloğun başlığını, içinde bulunulan durumun Merkle kanıtıyla birlikte gönderdim. paranız var (veya parayı gönderen geçerli bir işlemin Merkle kanıtı) sana). İşlemin tamamlandığından emin olduğunuzda hizmeti sağlarsınız. Ancak validator'ler hiçbir zaman B bloğunun tam içeriğini dağıtmaz. herhangi biri. Bu nedenle, C bloğunun dürüst validator'leri bloğu geri alamaz ve ya sistemi durdurmaya zorlanırlar ya da A'nın üzerine inşa ederek sizi bir sistem olarak mahrum bırakırlar. para tüccarı. Aynı senaryoyu parçalamaya uyguladığımızda tam ve hafif düğüm genellikle parça başına uygulanır: her parça indirmesinde validators o parçada bloke edin ve o parçadaki her işlemi doğrulayın, ancak diğer parça zincirlerinin anlık görüntüsünü alan düğümler de dahil olmak üzere sistemdeki düğümler işaret zinciri, yalnızca başlıkları indirin. Böylece parçadaki validator'ler sistemdeki diğer katılımcılar bu parça için etkili bir şekilde tam düğümler oluştururken, işaret zinciri de dahil olmak üzere ışık düğümleri olarak çalışır. Yukarıda tartıştığımız balıkçı yaklaşımının işe yaraması için dürüst validators işaret zincirine çapraz bağlı blokları indirebilmeniz gerekir. Kötü niyetli validator'ler geçersiz bir bloğun başlığını çapraz bağladıysa (veya bunu kullandıysa) parçalar arası bir işlem başlatır), ancak bloğu asla dağıtmaz, dürüst validator'lerin bir meydan okuma oluşturmanın hiçbir yolu yok. Bu sorunu çözmek için birbirini tamamlayan üç yaklaşımı ele alacağız. Birbirimiz. 2.5.1 Velayet Kanıtları Çözülmesi gereken en acil sorun, bir bloğun bir kez kullanılabilir olup olmadığıdır. yayınlandı. Önerilen fikirlerden biri dönüşümlü Noterlere sahip olmaktır. tek işi bir dosya indirmek olan validator'lerden daha sık parçalar arasında engelleyin ve indirebildiklerini doğrulayın. Onlar olabilir tüm durumu indirmeleri gerekmediği için daha sık dönüşümlü olarak kullanılıyor parçanın aksine, sık sık döndürülemeyen validator'lerin aksine şekilde gösterildiği gibi her döndüklerinde parçanın durumunu indirmeleri gerekir 13. Bu naif yaklaşımın sorunu daha sonra kanıtlamanın imkansız olmasıdır. Noterin bloğu indirip indiremediğine bağlı olarak Noter bloğu indirebildiklerini her zaman onaylamayı seçebilirler. hatta onu geri almaya çalışıyorum. Bunun bir çözümü Noterlerin sağlamasıdır. bloğun olduğunu kanıtlayan bazı kanıtlar veya bir miktar tokens stake etmek indirildi. Böyle bir çözüm burada tartışılmaktadır: https://ethresear.ch/t/ 1 bitlik toplama dostu saklama tahvilleri/2236. 2.5.2 Silme Kodları Belirli bir ışık düğümü bir bloğun hash değerini aldığında, düğümün Bloğun mevcut olduğundan emin olmak için rastgele birkaç tane indirmeyi deneyebilir bloğun parçaları. Bu tam bir çözüm değil çünkü ışık düğümleri Kötü niyetli blok üreticilerinin seçebileceği bloğun tamamını toplu olarak indirin
Şekil 13: Doğrulayıcıların durumu indirmesi gerekir ve bu nedenle döndürülemez sık sık bloğun herhangi bir ışık düğümü tarafından indirilmeyen kısımlarını alıkoymak, böylece bloğu hala kullanılamaz hale getiriyoruz. Çözümlerden biri, bunu mümkün kılmak için Silme Kodları adı verilen bir yapıyı kullanmaktır. gösterildiği gibi bloğun yalnızca bir kısmı mevcut olsa bile tüm bloğu kurtarmak için Şekil 14'te. Şekil 14: Merkle tree silme kodlu veriler üzerine inşa edilmiştir Hem Polkadot hem de Ethereum Serenity'nin tasarımları bu fikir etrafında şekilleniyor: Hafif düğümlerin blokların mevcut olduğundan makul ölçüde emin olmaları için bir yol sağlar. Ethereum Serenity yaklaşımının ayrıntılı açıklaması [2]'da bulunmaktadır.2.5.3 Polkadot'nin veri kullanılabilirliğine yaklaşımı Polkadot'de, çoğu parçalı çözümde olduğu gibi, her parça (parachain olarak adlandırılır) bloklarının anlık görüntüsünü işaret zincirine (aktarma zinciri olarak adlandırılır) alır. Diyelim ki 2f + 1 var Aktarma zincirinde validators. Parachain bloklarının blok üreticileri, harmanlayıcılar, parachain bloğu üretildiğinde, herhangi bir f parçası yeterli olacak şekilde 2f +1 parçadan oluşan bloğun silme kodlu versiyonunu hesaplarlar. bloğu yeniden inşa etmek için. Daha sonra her validator'e bir parça dağıtırlar. röle zinciri. Belirli bir geçiş zinciri validator yalnızca bir geçiş zincirinde imza atar anlık görüntüsü alınan her parachain bloğu için kendi paylarına sahiplerse bloklayın böyle bir röle zinciri bloğu. Dolayısıyla, eğer bir aktarma zinciri bloğu 2f + 1'den imzalara sahipse validators ve bunlardan en fazla f tanesi protokolü ihlal etmediği sürece, her biri parachain bloğu validators'den parçalar alınarak yeniden oluşturulabilir protokolü takip edenler. Bkz. şekil 15. Şekil 15: Polkadot'nin veri kullanılabilirliği 2.5.4 Uzun vadeli veri kullanılabilirliği Yukarıda tartışılan tüm yaklaşımların yalnızca bir bloğun olduğu gerçeğini doğruladığını unutmayın. yayınlandı ve şu anda mevcut. Bloklar daha sonra kullanılamayabilir çeşitli nedenlerden dolayı: düğümlerin devre dışı kalması, düğümlerin kasıtlı olarak geçmişi silmesi veriler ve diğerleri. Bu sorunu ele alan bahsetmeye değer bir teknik inceleme Polyshard [3]'dir, birden fazla parça olsa bile blokların parçalar arasında kullanılabilir olmasını sağlamak için silme kodlarını kullanan Parçalar verilerini tamamen kaybeder. Ne yazık ki onların özel yaklaşımı şunu gerektirir: diğer tüm parçalardan blok indirmek için tüm parçalar, bu da yasaklayıcı bir şekilde pahalı. Uzun vadeli kullanılabilirlik o kadar acil bir sorun değil: hiçbir katılımcı olmadığı için Sistemin tüm zincirlerdeki tüm zincirleri doğrulayabilmesi bekleniyor.
Parçalanmış protokollerin güvenliğinin böyle bir şekilde tasarlanması gerekir. bazı parçalardaki bazı eski bloklar bozulsa bile sistemin güvenli kalmasının bir yolu tamamen kullanılamaz.
Nightshade
3.1 Des chaînes de fragments aux fragments de fragments Le modèle de partage avec des chaînes de fragments et une chaîne de balises est très puissant mais présente certaines complexités. En particulier, la règle de choix de fork doit être exécutée dans chaque chaîne séparément, la règle de choix des fourches dans les chaînes de fragments et la balise La chaîne doit être construite différemment et testée séparément. Dans Nightshade, nous modélisons le système comme un seul blockchain, dans lequel chaque Le bloc contient logiquement toutes les transactions pour tous les fragments et modifie le état complet de tous les fragments. Mais physiquement, aucun participant ne télécharge le état complet ou le bloc logique complet. Au lieu de cela, chaque participant du réseau uniquement maintient l'état qui correspond aux fragments pour lesquels ils valident les transactions, et la liste de toutes les transactions du bloc est divisée en transactions physiques morceaux, un morceau par fragment. Dans des conditions idéales, chaque bloc contient exactement un morceau par fragment et par bloc, ce qui correspond à peu près au modèle avec des chaînes de fragments dans lequel le les chaînes de fragments produisent des blocs à la même vitesse que la chaîne de balise. Cependant, en raison des retards du réseau, certains morceaux peuvent manquer, donc en pratique, chaque bloc contient un ou zéro fragment par fragment. Voir la section 3.3 pour plus de détails sur la façon des blocs sont produits. Figure 16 : Un modèle avec des chaînes d'éclats à gauche et avec une chaîne ayant blocs divisés en morceaux à droite
3.2 Consensus Les deux approches dominantes du consensus dans les blockchain aujourd'hui sont la chaîne la plus longue (ou la plus lourde), dans laquelle la chaîne qui a le plus de travail ou d'enjeux utilisé pour le construire est considéré comme canonique, et BFT, dans lequel pour chaque bloc certains un ensemble de validator parviennent à un consensus BFT. Dans les protocoles proposés récemment, cette dernière approche est plus dominante, car il fournit une finalité immédiate, alors que dans la chaîne la plus longue, davantage de blocs ont besoin à construire au sommet du bloc pour assurer la finalité. Souvent pour un but significatif sécurité, le temps nécessaire pour construire un nombre suffisant de blocs prend le temps ordre des heures. L'utilisation du consensus BFT sur chaque bloc présente également des inconvénients, tels que : 1. Le consensus BFT implique une quantité considérable de communication. Tandis que les avancées récentes permettent d’atteindre le consensus dans un temps linéaire en nombre des participants (voir par exemple [4]), la surcharge par bloc est toujours perceptible ; 2. Il n'est pas possible que tous les participants du réseau participent au BFT consensus par bloc, donc généralement seul un sous-ensemble de participants échantillonné au hasard atteint le consensus. Un ensemble échantillonné aléatoirement peut, en principe, être corrompu de manière adaptative, et un fork peut en théorie être créé. Le système l'un ou l'autre doit être modélisé pour être prêt à un tel événement, et donc toujours avoir une règle de choix de fourchette en plus du consensus BFT, ou être conçu pour fermer dans un tel événement. Il convient de mentionner que certains modèles, tels que Algorand [5], réduisent considérablement la probabilité de corruption adaptative. 3. Plus important encore, le système se bloque si 1 3 ou plus de tous les participants sont hors ligne. Ainsi, tout problème de réseau temporaire ou division du réseau peut complètement bloquer le système. Idéalement, le système doit pouvoir continuer à fonctionner tant qu’au moins la moitié des participants sont en ligne (le plus lourd les protocoles basés sur des chaînes continuent de fonctionner même si moins de la moitié des participants sont en ligne, mais l'opportunité de cette propriété est plus discutable au sein de la communauté). Un modèle hybride dans lequel le consensus utilisé est en quelque sorte le plus lourd chaîne, mais certains blocs sont périodiquement finalisés à l'aide d'un gadget de finalité BFT pour conserver les avantages des deux modèles. De tels gadgets BFT finalités sont Casper FFG [6] utilisé dans Ethereum 2.0 8, Casper CBC (voir https://vitalik. ca/general/2018/12/05/cbc_casper.html) et GRANDPA (voir https:// medium.com/polkadot-network/d08a24a021b5) utilisé dans Polkadot. Nightshade utilise le consensus de chaîne le plus lourd. Plus précisément lorsqu'un bloc producteur produit un bloc (voir section 3.3), il peut recueillir les signatures de d'autres producteurs de blocs et des validator attestant du bloc précédent. Voir la rubrique 3.8 pour plus de détails sur la manière dont un si grand nombre de signatures est regroupé. Le poids 8Voir également la séance sur tableau blanc avec Justin Drake pour un aperçu approfondi de Casper FFG, et comment il est intégré au consensus de la chaîne la plus lourde GHOST ici : https://www. youtube.com/watch?v=S262StTwkmod'un bloc est alors la mise cumulée de tous les signataires dont les signatures sont inclus dans le bloc. Le poids d'une chaîne est la somme des poids des blocs. En plus du consensus en chaîne le plus lourd, nous utilisons un gadget de finalité qui utilise les attestations pour finaliser les blocs. Pour réduire la complexité du système, nous utilisons un gadget de finalité qui n’influence en rien la règle de choix du fork, et à la place, il n'introduit que des conditions de réduction supplémentaires, telles qu'une fois qu'un bloc est finalisé par le gadget de finalité, un fork est impossible à moins qu'un très grand pourcentage de la mise totale est réduite. Casper CBC est un gadget tellement définitif, et nous modèle actuellement avec Casper CBC à l’esprit. Nous travaillons également sur un protocole BFT distinct appelé TxFlow. Au moment de en écrivant ce document, il n'est pas clair si TxFlow sera utilisé à la place de Casper Radio-Canada. On constate cependant que le choix de la finalité du gadget est largement orthogonal au reste du design. 3.3 Production de blocs Dans Nightshade, il y a deux rôles : les producteurs de blocs et les validator. À tout moment point où le système contient w producteurs de blocs, w = 100 dans nos modèles, et wv validators, dans notre modèle v = 100, wv = 10 000. Le système est une preuve de participation, ce qui signifie que les producteurs de blocs et les validator ont un certain nombre de monnaie (appelée « tokens ») verrouillée pendant une durée dépassant largement la durée le temps qu'ils passent à accomplir leurs tâches de construction et de validation de la chaîne. Comme pour tous les systèmes Proof of Stake, tous les producteurs de blocs w et non tous les wv validator sont des entités différentes, puisque cela ne peut pas être appliqué. Chacun des producteurs de blocs w et des wv validators, cependant, ont un enjeu. Le système contient n fragments, n = 1000 dans notre modèle. Comme mentionné dans section 3.1, dans Nightshade, il n'y a pas de chaînes de fragments, à la place, tous les producteurs de blocs et validator construisent un seul blockchain, que nous appelons le chaîne principale. L'état de la chaîne principale est divisé en n fragments, et chaque bloc producteur et validator à tout moment n'ont téléchargé localement qu'un sous-ensemble de l'état qui correspond à un sous-ensemble de fragments, et uniquement le processus et valider les transactions qui affectent ces parties de l’État. Pour devenir producteur de blocs, un participant du réseau verrouille de gros montant de tokens (une mise). La maintenance du réseau se fait par époques, où une époque est une période de temps de l’ordre des jours. Les participants avec les enjeux les plus importants au début d'une époque particulière sont le bloc producteurs pour cette époque. Chaque producteur de blocs est affecté à des fragments sw (par exemple sw = 40, ce qui ferait sww/n = 4 producteurs de blocs par fragment). Le bloc le producteur télécharge l'état du fragment auquel il est affecté avant l'époque commence et, tout au long de l'époque, collecte les transactions qui affectent ce fragment, et les applique à l'État. Pour chaque bloc b de la chaîne principale et pour chaque fragment s, il y a l'un des assigné des producteurs de blocs à s qui est responsable de produire la partie de b liée au tesson. La partie de b liée au fragment s est appelée un morceau et contient le liste des transactions pour le fragment à inclure dans b, ainsi que le merkleracine de l’état résultant. b ne contiendra finalement qu'un tout petit en-tête de le chunk, à savoir la racine merkle de toutes les transactions appliquées (voir section 3.7.1 pour les détails exacts), et la racine Merkle de l’état final. Dans le reste du document, nous faisons souvent référence au producteur de blocs. qui est chargé de produire un morceau à un moment donné pour un fragment particulier en tant que producteur de morceaux. Le producteur de morceaux est toujours l'un des producteurs de blocs. Les producteurs de blocs et les producteurs de morceaux font tourner chaque bloc en fonction à un horaire fixe. Les producteurs de blocs ont une commande et produisent à plusieurs reprises blocs dans cet ordre. Par ex. s'il y a 100 producteurs de blocs, le premier bloc les producteurs sont responsables de la production des blocs 1, 101, 201 etc, le second est responsable de la production 2, 102, 202 etc.). Puisque la production de morceaux, contrairement à la production de blocs, nécessite le maintien l'état, et pour chaque fragment, seuls les producteurs de blocs sww/n maintiennent l'état par fragment, en conséquence, seuls les producteurs de blocs sww/n tournent pour créer morceaux. Par ex. avec les constantes ci-dessus avec quatre producteurs de blocs affectés à chaque fragment, chaque producteur de blocs créera des morceaux une fois tous les quatre blocs. 3.4 Assurer la disponibilité des données Pour garantir la disponibilité des données, nous utilisons une approche similaire à celle de Polkadot décrit à la section 2.5.3. Une fois qu'un producteur de blocs produit un morceau, il crée une version codée par effacement avec un code de bloc optimal (w, ⌊w/6 + 1⌋) du morceau. Ils envoient ensuite un morceau du morceau codé à effacement (nous appelons ces morceaux morceaux, ou juste des pièces) à chaque producteur de blocs. Nous calculons un arbre Merkle qui contient toutes les parties comme les feuilles, et le l'en-tête de chaque morceau contient la racine merkle de cet arbre. Les pièces sont envoyées aux validator via des messages onepart. Chacun de ces messages contient l'en-tête du bloc, l'ordinal de la partie et le contenu de la partie. Le Le message contient également la signature du producteur du bloc qui a produit le chunk et le chemin merkle pour prouver que la pièce correspond à l'en-tête et est produit par le producteur de blocs approprié. Une fois qu'un producteur de blocs reçoit un bloc de chaîne principale, il vérifie d'abord s'il avoir des messages en une partie pour chaque morceau inclus dans le bloc. Sinon, le bloc n'est pas traité tant que les messages en une partie manquants n'ont pas été récupérés. Une fois tous les messages en une partie reçus, le producteur de blocs récupère le parties restantes des pairs et reconstruit les morceaux pour lesquels ils détiennent l'État. Le producteur de blocs ne traite pas un bloc de la chaîne principale si pour au moins un morceau inclus dans le bloc, ils n'ont pas le message en une partie correspondant, ou si pour au moins un fragment pour lequel ils maintiennent l'état, ils ne peuvent pas reconstruire le morceau entier. Pour qu'un morceau particulier soit disponible, il suffit que ⌊w/6⌋+1 du bloc les producteurs ont leurs pièces et les servent. Ainsi, aussi longtemps que le nombre de les acteurs malveillants ne dépassent pas ⌊w/3⌋aucune chaîne comportant plus de la moitié du bloc les producteurs qui le construisent peuvent avoir des morceaux indisponibles.Figure 17 : Chaque bloc contient un ou zéro fragment par fragment, et chaque fragment est codé par effacement. Chaque partie du morceau codé d'effacement est envoyée à un producteur de blocs via un message spécial en une seule partie 3.4.1 Faire face aux producteurs de blocs paresseux Si un producteur de blocs possède un bloc pour lequel un message en une seule partie manque, il pourrait choisir de continuer à le signer, car si le bloc finit par être en chaîne, il maximisera la récompense pour le producteur de blocs. Il n'y a aucun risque pour le blocage producteur puisqu’il est impossible de prouver par la suite que le producteur du bloc n’avait pas le message en une partie. Pour résoudre ce problème, nous faisons en sorte que chaque morceau soit producteur lors de la création du morceau. choisissez une couleur (rouge ou bleu) pour chaque partie du futur morceau encodé, et stockez le masque de bits de la couleur attribuée dans le bloc avant qu'il ne soit codé. Chaque partie Le message contient alors la couleur attribuée à la pièce, et la couleur est utilisée lorsque calculer la racine merkle des parties codées. Si le producteur de morceaux s'écarte du protocole, cela peut être facilement prouvé, puisque soit la racine merkle ne sera pas correspondent aux messages en une partie, ou aux couleurs des messages en une partie qui correspondre à la racine merkle ne correspondra pas au masque dans le morceau. Lorsqu'un producteur de blocs signe sur un bloc, il inclut un masque de bits de tous les pièces rouges qu'ils ont reçues pour les morceaux inclus dans le bloc. Publier un un masque de bits incorrect est un comportement slashable. Si un producteur de blocs n'a pas reçu de message en une seule partie, ils n'ont aucun moyen de connaître la couleur du message, et ils ont donc 50% de chances d'être sabrés s'ils tentent de signer aveuglément le bloquer. 3.5 Demande de transition d'état Les producteurs de fragments choisissent uniquement les transactions à inclure dans le fragment, mais n'appliquez pas la transition d'état lorsqu'ils produisent un morceau. En conséquence,
l'en-tête du bloc contient la racine merkle de l'état merkelisé comme avant les transactions du bloc sont appliquées. Les transactions ne sont appliquées que lorsqu'un bloc complet incluant le morceau est traité. Un participant ne traite un blocage que si 1. Le bloc précédent a été reçu et traité ; 2. Pour chaque morceau, le participant ne conserve pas l'état car il l'a vu le message en une partie ; 3. Pour chaque morceau, le participant conserve l'état car il a le morceau complet. Une fois le bloc traité, pour chaque fragment pour lequel le participant maintient l'état pendant, ils appliquent les transactions et calculent le nouvel état dès que les transactions sont appliquées, après quoi elles sont prêtes à produire les morceaux du bloc suivant, s'ils sont affectés à un fragment, car ils ont la racine merkle du nouvel État merkelisé. 3.6 Transactions et reçus entre fragments Si une transaction doit affecter plusieurs fragments, elle doit être consécutivement exécuté dans chaque fragment séparément. La transaction complète est envoyée au premier fragment affecté, et une fois que la transaction est incluse dans le bloc pour ce fragment, et est appliqué une fois que le morceau est inclus dans un bloc, il génère ce qu'on appelle un reçu transaction, qui est acheminée vers le fragment suivant dans lequel la transaction doit être exécuté. Si plusieurs étapes sont nécessaires, l'exécution de la transaction de réception génère une nouvelle transaction de réception et ainsi de suite. 3.6.1 Durée de vie de la transaction de réception Il est souhaitable que la transaction de réception soit appliquée dans le bloc qui suit immédiatement le bloc dans lequel elle a été générée. La transaction de réception est uniquement généré après que le bloc précédent a été reçu et appliqué par les producteurs de blocs qui maintiennent le fragment d'origine et doit être connu au moment où le le morceau du bloc suivant est produit par les producteurs de blocs de la destination éclat. Ainsi, le reçu doit être communiqué du fragment source au fragment de destination dans le court laps de temps entre ces deux événements. Soit A le dernier bloc produit contenant une transaction t générant un reçu r. Soit B le prochain bloc produit (c'est-à-dire un bloc qui a A comme son bloc précédent) que nous voulons contenir r. Que ce soit dans le fragment a et r dans le fragment b. La durée de vie du reçu, également représentée sur la figure 18, est la suivante : Produire et conserver les reçus. Le CPA du producteur de morceaux pour le fragment a reçoit le bloc A, applique la transaction t et génère le reçu r. cpa stocke ensuite tous ces reçus produits dans son stockage persistant interne indexé par l'identifiant du fragment source.Distribution des reçus. Une fois que cpa est prêt à produire le morceau pour fragment a pour le bloc B, ils récupèrent tous les reçus générés en appliquant les transactions du bloc A pour le fragment a et les incluent dans le fragment pour shrad a dans le bloc B. Une fois ce morceau généré, cpa produit son code d'effacement version et tous les messages onepart correspondants. cpa sait quels blocs les producteurs maintiennent l'état complet pour quels fragments. Pour un producteur de blocs particulier bp cpa inclut les recettes résultant de l'application des transactions dans le bloc A pour le fragment a qui a l'un des fragments qui intéressent bp comme destination dans le message en une partie lorsqu'ils ont distribué le morceau pour le fragment a dans le bloc B (voir la figure 17, qui montre les reçus inclus dans le message en une partie). Réception des reçus. N'oubliez pas que les participants (les producteurs de blocs et les validator) ne traitent pas les blocs tant qu'ils n'ont pas reçu de messages en une seule partie. pour chaque morceau inclus dans le bloc. Ainsi, au moment où un participant particulier applique le bloc B, il dispose de tous les messages en une seule partie qui correspondent à morceaux en B, et ils ont donc tous les reçus entrants qui contiennent les fragments le participant conserve l'état comme destination. Lors de l'application du transition d'état pour un fragment particulier, le participant applique à la fois les reçus qu'ils ont collectés pour le fragment dans les messages en une seule partie, ainsi que tous les transactions incluses dans le morceau lui-même. Figure 18 : La durée de vie d'une transaction de réception 3.6.2 Gérer trop de reçus Il est possible que le nombre de reçus ciblant une partition particulière dans un un bloc particulier est trop volumineux pour être traité. Par exemple, considérons la figure 19, dans dont chaque transaction dans chaque fragment génère un reçu qui cible le fragment 1. Au bloc suivant, le nombre de reçus que le fragment 1 doit traiter est égal à comparable à la charge que tous les fragments combinés ont traitée lors de la manipulation le bloc précédent.
Figure 19 : Si tous les reçus ciblent la même partition, celle-ci n'aura peut-être pas la capacité de les traiter Pour résoudre ce problème, nous utilisons une technique similaire à celle utilisée dans QuarkChain 9. Plus précisément, pour chaque fragment, le dernier bloc B et le dernier fragment à l'intérieur de celui-ci. le bloc à partir duquel les recettes ont été appliquées est enregistré. Lorsque le nouveau fragment est créés, les reçus sont appliqués dans l'ordre en premier à partir des fragments restants en B, puis dans les blocs qui suivent B, jusqu'à ce que le nouveau morceau soit plein. Sous la normale Dans des circonstances avec une charge équilibrée, cela donnera généralement lieu à toutes les recettes étant appliqué (et donc le dernier fragment du dernier bloc sera enregistré pour chaque morceau), mais pendant les périodes où la charge n'est pas équilibrée, et un particulier Shard reçoit un nombre disproportionné de reçus, cette technique leur permet de être traitées en respectant les limites du nombre de transactions incluses. Notez que si une telle charge déséquilibrée persiste pendant une longue période, le délai entre la création du reçu jusqu'à ce que l'application puisse continuer à croître indéfiniment. Un La meilleure façon de résoudre ce problème est d'abandonner toute transaction qui crée un reçu ciblant un fragment qui a un délai de traitement qui dépasse une certaine constante (par exemple, une époque). Considérons la figure 20. Par le bloc B, le fragment 4 ne peut pas traiter tous les reçus, il ne traite donc que l'origine des reçus jusqu'au fragment 3 dans le bloc A, et l'enregistre. Dans le bloc C, les reçus jusqu'au fragment 5 dans le bloc B sont inclus, et puis par le bloc D, le fragment rattrape son retard, traitant tous les reçus restants dans le bloc B et toutes les recettes du bloc C. 3.7 Validation des fragments Un morceau produit pour une partition particulière (ou un bloc de partitions produit pour une chaîne de partitions particulière dans le modèle avec chaînes de partitions) ne peut être validé que par le 9Voir l'épisode du tableau blanc avec QuarkChain ici : https://www.youtube.com/watch? v=opEtG6NM4x4, dans lequel l'approche des transactions entre fragments est discutée, entre autres des chosesFigure 20 : Traitement des reçus en retard participants qui maintiennent l’État. Ils peuvent être des producteurs de blocs, des validator, ou simplement des témoins externes qui ont téléchargé l'état et validé le fragment dans dans lesquels ils stockent des actifs. Dans ce document, nous supposons que la majorité des participants ne peuvent pas stocker l’État pour une grande partie des fragments. Il convient cependant de mentionner qu'il existe des blockchain fragmentés conçus avec l'hypothèse que la plupart des participants ont la capacité de stocker l'état et de valider la plupart des les fragments, tels que QuarkChain. Puisque seule une fraction des participants dispose de l’état nécessaire pour valider le fragment morceaux, il est possible de corrompre de manière adaptative uniquement les participants qui ont le état et appliquez une transition d’état non valide. Plusieurs conceptions de partitionnement ont été proposées pour échantillonner les validator à intervalles de quelques jours, et dans la journée, tout bloc de la chaîne de fragments qui contient plus de 2/3 des signatures des validator attribués à ce fragment est immédiatement prise en compte finale. Avec une telle approche, un adversaire adaptatif n’a qu’à corrompre 2n/3+1 des validators dans une chaîne de fragments pour appliquer une transition d'état non valide, ce qui, bien qu'il soit probablement difficile à réaliser, le niveau de sécurité n'est-il pas suffisant pour un public blockchain. Comme indiqué dans la section 2.3, l'approche courante consiste à accorder un certain laps de temps après la création d'un bloc pour tout participant ayant un état (que ce soit c'est un producteur de blocs, un validator ou un observateur externe) pour contester sa validité. Ces participants sont appelés pêcheurs. Pour qu'un pêcheur puisse contester un blocage invalide, il faut s'assurer qu'un tel blocage est disponible pour eux. La disponibilité des données dans Nightshade est discutée à la section 3.4. Dans Nightshade, une fois qu'un bloc est produit, les morceaux n'étaient pas validés par n'importe qui sauf le véritable producteur de morceaux. En particulier, le producteur de blocs qui a suggéré que le bloc n'avait naturellement pas l'état pour la plupart des fragments, etn'a pas pu valider les morceaux. Lorsque le bloc suivant est produit, il contient les attestations (voir section 3.2) de plusieurs producteurs de blocs et validator, mais comme la majorité des producteurs de blocs et des validator ne maintiennent pas l'état pour la plupart des fragments également, un bloc avec un seul morceau invalide collectera significativement plus de la moitié des attestations et continuera à être sur le plus lourd. chaîne. Pour résoudre ce problème, nous autorisons tout participant qui maintient l'état de un fragment pour soumettre un défi en chaîne pour tout morceau non valide produit dans ce fragment éclat. 3.7.1 Défi de validité d’état Une fois qu'un participant détecte qu'un morceau particulier n'est pas valide, il doit fournir une preuve que ce morceau est invalide. Étant donné que la majorité des participants au réseau ne conservent pas l'état du fragment dans lequel se trouve le fragment invalide, produite, la preuve doit avoir suffisamment d’informations pour confirmer que le bloc est invalide sans avoir l'état. Nous fixons une limite Ls de la quantité d'état (en octets) qu'une seule transaction peuvent cumulativement lire ou écrire. Toute transaction qui touche plus de Ls l’état est considéré comme invalide. Rappelez-vous de la section 3.5 que le morceau dans un bloc B particulier ne contient que les transactions à appliquer, mais pas la nouvelle racine d'état. La racine d'état incluse dans le bloc du bloc B est l'état racine avant d'appliquer de telles transactions, mais après avoir appliqué les transactions de le dernier morceau du même fragment avant le bloc B. Un acteur malveillant qui souhaite appliquer une transition d'état invalide inclurait une racine d'état incorrecte dans le bloc B qui ne correspond pas à la racine d’état résultant de l’application les transactions du bloc précédent. Nous étendons les informations qu'un producteur de chunk inclut dans le chunk. Au lieu d'inclure simplement l'état après avoir appliqué toutes les transactions, il inclut une racine d'état après avoir appliqué chaque ensemble contigu de transactions qui lire et écrire collectivement Ls octets d’état. Avec ces informations pour le pêcheur pour créer un défi selon lequel une transition d'état est mal appliquée est suffisant pour trouver la première racine d’état non valide, et inclure seulement Ls octets de état qui sont affectés par les transactions entre la dernière racine d’état (qui était valide) et la racine de l'état actuel avec les preuves Merkle. Alors tout participant peut valider les transactions dans le segment et confirmer que le fragment est invalide. De même, si le producteur du bloc tentait d'inclure des transactions qui lisent et écrire plus de Ls octets d'état, pour le défi il suffit d'inclure les premiers Ls octets qu'il touche avec les preuves merkle, ce qui suffira à appliquer les transactions et confirmer qu'il y a un moment où une tentative de la lecture ou l'écriture de contenu au-delà de Ls octets est effectuée.
3.7.2 Pêcheurs et transactions rapides entre fragments Comme indiqué dans la section 2.3, une fois que nous supposons que les fragments (ou fragments) blocs dans le modèle avec des chaînes de fragments) peuvent être invalides et introduire un défi période, cela affecte négativement la finalité, et donc la communication entre fragments. Dans en particulier, le fragment de destination de toute transaction entre fragments ne peut pas être certain le morceau ou le bloc de fragments d'origine est définitif jusqu'à la fin de la période de défi (voir figure 21). Figure 21 : Attendre la période de contestation avant d'appliquer un récépissé La façon de résoudre ce problème de manière à ce que les transactions entre fragments soient effectuées Il est instantané que le fragment de destination n'attende pas la période de défi après la publication de la transaction du fragment source, et appliquez la transaction de réception immédiatement, puis restaurez le fragment de destination avec la source fragment si plus tard le morceau ou le bloc d'origine s'est avéré invalide (voir la figure 22). Cela s'applique très naturellement au design Nightshade dans lequel le fragment les chaînes ne sont pas indépendantes, mais les fragments de fragments sont tous publiés ensemble dans le même bloc de chaîne principal. Si un morceau s'avère invalide, le le bloc entier avec ce morceau est considéré comme invalide, et tous les blocs construits sur en haut. Voir la figure 23. Les deux approches ci-dessus fournissent une atomicité en supposant que le défi la période est suffisamment longue. Nous utilisons cette dernière approche car la fourniture de transactions cross-shard rapides dans des circonstances normales dépasse les inconvénients de la partition de destination est annulée en raison d'une transition d'état non valide dans l'un des les fragments sources, ce qui est un événement extrêmement rare. 3.7.3 Masquage des validator L’existence de défis réduit déjà considérablement la probabilité de corruption adaptative, puisque pour finaliser un morceau avec un post de transition d'état invalideFigure 22 : Appliquer immédiatement les reçus et annuler la destination chaîne si la chaîne source avait un bloc invalide Figure 23 : Défi pêcheur à Nightshade la période de défi dont l'adversaire adaptatif a besoin pour corrompre tous les participants qui maintiennent l'état du fragment, y compris tous les validator. L'estimation de la probabilité d'un tel événement est extrêmement complexe, car aucun le fragment blockchain est actif depuis suffisamment longtemps pour qu'une telle attaque puisse être tentée. Nous affirmons que la probabilité, bien qu’extrêmement faible, est néanmoins suffisamment important pour un système censé exécuter plusieurs millions de transactions et diriger des opérations financières à l’échelle mondiale. Il y a deux raisons principales à cette croyance : 1. La plupart des validator des chaînes Proof-of-Stake et des mineurs du
Les chaînes de preuve de travail sont principalement motivées par les avantages financiers. Si un adversaire adaptatif leur offre plus d’argent que le rendement attendu de fonctionner honnêtement, il est raisonnable de s'attendre à ce que de nombreux validator acceptera l'offre. 2. De nombreuses entités effectuent la validation des chaînes de preuve de participation de manière professionnelle, et on s'attend à ce qu'un pourcentage important des parts dans n'importe quelle chaîne soit de ces entités. Le nombre de ces entités est suffisamment petit pour une adversaire adaptatif pour apprendre à connaître la plupart d'entre eux personnellement et avoir une bonne compréhension de leur penchant à la corruption. Nous allons encore plus loin en réduisant la probabilité de corruption adaptative en masquant quels validator sont attribués à quelle partition. L'idée est un peu similaire à la façon dont Algorand [5] dissimule les validator. Il est essentiel de noter que même si les validator sont cachés, comme dans Algorand ou comme décrit ci-dessous, la corruption adaptative est toujours en théorie possible. Tandis que l'adversaire adaptatif ne connaît pas les participants qui vont créer ou valider un bloc ou un morceau, les participants eux-mêmes savent qu'ils joueront une telle tâche et en avoir une preuve cryptographique. Ainsi, l'adversaire peut diffuser leur intention de corrompre et payer tout participant qui fournira une telle preuve cryptographique. Notons cependant que puisque l’adversaire ne le fait pas connaissent les validator attribués au fragment qu'ils souhaitent corrompre, ils n'ont pas d'autre choix que de diffuser leur intention de corrompre un fragment particulier à la communauté entière. À ce stade, il est économiquement bénéfique pour tout honnête participant à lancer un nœud complet qui valide ce fragment, car il y a un niveau élevé chance qu'un bloc invalide apparaisse dans ce fragment, ce qui est une opportunité de créez un défi et collectez la récompense associée. Pour ne pas révéler les validator attribués à un fragment particulier, nous le faisons ce qui suit (voir figure 24) : Utiliser VRF pour obtenir la mission. Au début de chaque époque chacun validator utilise un VRF pour obtenir un masque de bits des fragments auxquels validator est affecté. Le masque de bits de chaque validator aura des bits Sw (voir la section 3.3 pour la définition de Sw). Le validator récupère ensuite l'état des fragments correspondants, et pendant l'époque pour chaque bloc reçu valide les morceaux qui correspondent aux fragments auxquels le validator est affecté. Connectez-vous sur des blocs plutôt que sur des morceaux. Étant donné que l'affectation des fragments est masquée, le validator ne peut pas signer sur les fragments. Au lieu de cela, il signe toujours sur l'ensemble bloquer, ne révélant ainsi pas quels fragments il valide. Plus précisément, lorsque le validator reçoit un bloc et valide tous les morceaux, soit il crée un message qui atteste que tous les morceaux de toutes les partitions auxquelles le validator est attribué sont valide (sans indiquer de quelque manière que ce soit quels sont ces fragments), ou un message qui contient une preuve d'une transition d'état invalide si un morceau est invalide. Voir le section 3.8 pour plus de détails sur la façon dont ces messages sont regroupés, section 3.7.4 pour les détails sur la façon d'empêcher les validator de s'appuyer sur les messages de autres validator, et la section 3.7.5 pour plus de détails sur la façon de récompenser et de punir validators si un défi de transition d'état invalide réussi se produit réellement.Figure 24 : Dissimulation des validator dans Nightshade 3.7.4 Commit-Révéler L'un des problèmes courants avec les validator est qu'un validator peut ignorer le téléchargement de l'état et valider réellement les morceaux et les blocs, et à la place observez le réseau, voyez ce que les autres validator soumettent et répétez leur messages. Un validator qui suit une telle stratégie n'apporte aucun supplément sécurité du réseau, mais collecte des récompenses. Une solution courante à ce problème consiste pour chaque validator à fournir une preuve qu'ils ont effectivement validé le blocage, par exemple en fournissant une trace unique d'appliquer la transition d'état, mais de telles preuves augmentent considérablement le coût de validation. Figure 25 : Révélation de validation
Au lieu de cela, nous faisons en sorte que les validator s'engagent d'abord sur le résultat de la validation (soit le message qui atteste de la validité des chunks, ou la preuve d'un invalide transition d'état), attendez une certaine période, et révélez ensuite seulement le résultat réel de la validation, comme le montre la figure 25. La période de validation ne croise pas la période de validation. la période de révélation, et donc un validator paresseux ne peut pas copier des validator honnêtes. De plus, si un validator malhonnête s'engageait dans un message attestant du validité des morceaux attribués, et au moins un morceau était invalide, une fois qu'il est montré que le morceau n'est pas valide, le validator ne peut pas éviter la coupure, car, comme nous le montrons dans la section 3.7.5, le seul moyen de ne pas se faire tailler dans une telle situation est de présenter un message contenant une preuve de la transition d'état invalide qui correspond au commit. 3.7.5 Relever les défis Comme indiqué ci-dessus, une fois qu'un validator reçoit un bloc avec un morceau invalide, ils préparent d’abord une preuve de la transition d’état invalide (voir section 3.7.1), puis s'engager sur une telle preuve (voir 3.7.4), et après un certain temps révéler le défi. Une fois le défi révélé inclus dans un bloc, voici ce qui se passe : 1. Toutes les transitions d'état survenues à partir du bloc contenant le morceau invalide jusqu'à ce que le bloc dans lequel le défi révélé est inclus soit obtenu nul. L'état avant le bloc qui inclut le défi révélé est considéré comme étant le même que l'état avant le bloc qui contenait le morceau invalide. 2. Dans un certain laps de temps, chaque validator doit révéler son masque de bits des fragments qu'ils valident. Puisque le masque de bits est créé via un VRF, si ils ont été affectés au fragment qui avait la transition d'état invalide, ils ne peut éviter de le révéler. Tout validator qui ne parvient pas à révéler le masque de bits est supposé être affecté au fragment. 3. Chaque validator qui, après cette période, est affecté au fragment, qui s'est engagé sur un résultat de validation pour le bloc contenant le morceau invalide et qui n'a pas révélé la preuve d'une transition d'état invalide qui correspond à leur commit est réduit. 4. Chaque validator reçoit une nouvelle affectation de fragments et une nouvelle époque est programmée pour démarrer après un certain temps suffisant pour que tous les validator téléchargent le état, comme le montre la figure 26. Notez qu'à partir du moment où les validator révèlent les fragments qui leur sont attribués jusqu'au début de la nouvelle époque, la sécurité du système est réduite puisque le L'affectation des fragments est révélée. Les participants du réseau doivent le conserver à l'esprit lors de l'utilisation du réseau pendant cette période. 3.8 Agrégation de signatures Pour qu'un système comportant des centaines de fragments fonctionne en toute sécurité, nous souhaitons disposer d'un commande de 10 000 validator ou plus. Comme indiqué dans la section 3.7, nous voulons que chaqueFigure 26 : Relever le défi validator pour publier un commit sur un certain message et une signature en moyenne une fois par bloc. Même si les messages de validation étaient les mêmes, l'agrégation d'un tel La signature BLS et sa validation auraient été d'un coût prohibitif. Mais naturellement, les messages de validation et de révélation ne sont pas les mêmes d'un validator à l'autre, et nous avons donc besoin d'un moyen de regrouper ces messages et les signatures dans un manière qui permet une validation rapide plus tard. L’approche spécifique que nous utilisons est la suivante : Les validateurs rejoignent les producteurs de blocs. Les producteurs de blocs sont connus quelque temps avant le début de l'époque, car ils ont besoin d'un certain temps pour télécharger le état avant le début de l'époque, et contrairement aux validator, les producteurs de blocs sont pas caché. Chaque producteur de blocs dispose de v validator emplacements. Les validateurs soumettent propositions hors chaîne aux producteurs de blocs pour être inclus comme l'un de leurs v validators. Si un producteur de blocs souhaite inclure un validator, il soumet un transaction qui contient la demande initiale hors chaîne du validator et le signature du producteur de blocs qui permet au validator de rejoindre le producteur de blocs. Notez que les validator attribués aux producteurs de blocs ne correspondent pas nécessairement valider les mêmes fragments pour lesquels le producteur de blocs produit des morceaux. Si un validator a demandé à rejoindre plusieurs producteurs de blocs, seule la transaction de le premier producteur de blocs réussira. Les producteurs de blocs collectent les commits. Le producteur de blocs collecte constamment les messages de validation et de révélation des validator. Une fois qu'un certain nombre de ces messages sont accumulés, le producteur de blocs calcule un merkle arbre de ces messages, et envoie à chaque validator la racine merkle et le chemin merkle vers leur message. Le validator valide le chemin et signalise la racine de merkle. Le producteur de blocs accumule ensuite une signature BLS sur le racine merkle des validators, et publie uniquement la racine merkle et le signature accumulée. Le producteur de blocs signe également la validité du multisignature utilisant une signature ECDSA bon marché. Si la multisignature ne fonctionne pas correspond à la racine merkle soumise ou au masque de bits des validators participants, c'est un comportement slashable. Lors de la synchronisation de la chaîne, un participant peut choisir de valider toutes les signatures BLS des validator (ce qui est extrêmement coûteux car cela implique d'agréger les clés publiques de validator), ou seulementles signatures ECDMA des producteurs de blocs et s'appuient sur le fait que le Le producteur de blocs n’a pas été contesté ni réduit. Utiliser des transactions en chaîne et des preuves Merkle pour les défis. Il On peut noter qu'il n'y a aucune valeur à révéler les messages des validator si aucun Une transition d'état invalide a été détectée. Seuls les messages contenant le contenu réel les preuves de transition d'état invalide doivent être révélées, et uniquement pour de tels messages il faut montrer qu'ils correspondent au commit précédent. Le message doit être révélé à deux fins : 1. Pour lancer réellement le rollback de la chaîne au moment précédant le transition d'état invalide (voir section 3.7.5). 2. Pour prouver que le validator n'a pas tenté d'attester de la validité du morceau invalide. Dans les deux cas, nous devons résoudre deux problèmes : 1. Le commit réel n'était pas inclus dans la chaîne, seule la racine merkle du commit agrégé avec d’autres messages. Le validator doit utiliser le chemin merkle fourni par le producteur de blocs et leur engagement initial à prouver qu'ils se sont engagés à relever le défi. 2. Il est possible que tous les validator attribués au fragment avec le code invalide la transition d'état est attribuée à des producteurs de blocs corrompus qui les censurent. Pour contourner ce problème, nous leur permettons de soumettre leurs révélations comme une transaction régulière sur la chaîne et contourner l'agrégation. Cette dernière n'est autorisée que pour les preuves de transition d'état invalide, qui sont extrêmement rare, et ne devrait donc pas entraîner le spam des blocs. Le dernier problème à résoudre est que les producteurs de blocs peuvent choisissez de ne pas participer à l’agrégation de messages ou de censurer intentionnellement des validator particuliers. Nous le rendons économiquement désavantageux, en faisant en sorte que le bloc récompense du producteur proportionnelle au nombre de validator qui leur est attribué. Nous notons également que puisque les producteurs de blocs entre les époques se croisent largement (puisque c'est toujours le top avec les participants avec l'enjeu le plus élevé), les validator peuvent s'en tenir en grande partie à travailler avec les mêmes producteurs de blocs, et ainsi réduire le risque d'être assigné à un producteur de blocs qui les a censurés dans le passé. 3.9 Chaîne d'instantanés Étant donné que les blocs de la chaîne principale sont produits très fréquemment, le téléchargement l’histoire complète pourrait devenir coûteuse très rapidement. De plus, puisque chaque le bloc contient une signature BLS d'un grand nombre de participants, la seule agrégation des clés publiques pour vérifier la signature pourrait devenir prohibitive cher aussi. Enfin, puisque dans un avenir prévisible, Ethereum 1.0 restera probablement un des blockchain les plus utilisés, offrant un moyen significatif de transférer des actifs de
Près de Ethereum est une exigence, et aujourd'hui, la vérification des signatures BLS pour garantir La validité des blocs proches du côté de Ethereum n’est pas possible. Chaque bloc de la chaîne principale Nightshade peut éventuellement contenir un Schnorr multisignature sur l'en-tête du dernier bloc contenant un tel Schnorr multisignature. Nous appelons ces blocs des blocs instantanés. Le tout premier bloc de chaque époque doit être un bloc d'instantané. En travaillant sur une telle multisignature, les producteurs de blocs doivent également cumuler les signatures BLS des validator sur le dernier bloc d'instantané et agrégez-les de la même manière que décrit dans paragraphe 3.8. Puisque l’ensemble des producteurs de blocs est constant tout au long de l’époque, valider seuls les premiers blocs d’instantanés de chaque époque suffisent en supposant qu’à aucun moment point un grand pourcentage de producteurs de blocs et de validators se sont entendus et ont créé une fourchette. Le premier bloc de l’époque doit contenir des informations suffisantes pour calculer les producteurs de blocs et les validator pour l'époque. Nous appelons la sous-chaîne de la chaîne principale qui contient uniquement l'instantané bloque une chaîne d'instantanés. La création d'une multisignature Schnorr est un processus interactif, mais puisque nous il suffit de l'exécuter rarement, quel que soit le processus, aussi inefficace soit-il. suffira. Les multisignatures Schnorr peuvent être facilement validées sur Ethereum, fournissant ainsi des primitives cruciales pour un moyen sécurisé d'effectuer des cross-blockchain communications. Pour synchroniser avec la chaîne Near, il suffit de télécharger tous les instantanés bloque et confirme que les signatures Schnorr sont correctes (éventuellement en vérifiant également les signatures BLS individuelles des validator), puis en synchronisant uniquement blocs de chaîne principaux du dernier bloc d’instantané.
Nightshade
3.1 Parça zincirlerinden parça parçalara Parça zincirleri ve işaret zinciri içeren parçalama modeli çok güçlüdür ancak belirli karmaşıklıklara sahiptir. Özellikle çatal seçim kuralının uygulanması gerekiyor her zincirde ayrı ayrı, parça zincirlerinde ve işaretçide çatal seçim kuralı Zincir farklı şekilde oluşturulmalı ve ayrı olarak test edilmelidir. Nightshade'de sistemi tek bir blockchain olarak modelliyoruz; her biri blok mantıksal olarak tüm parçalar için tüm işlemleri içerir ve tüm parçaların tüm durumu. Ancak fiziksel olarak hiçbir katılımcı dosyayı indirmez. tam durum veya tam mantıksal blok. Bunun yerine, ağın her katılımcısı yalnızca İşlemleri doğruladıkları parçalara karşılık gelen durumu korur ve bloktaki tüm işlemlerin listesi fiziksel olarak bölünmüştür parçalar, parça başına bir parça. İdeal koşullar altında her blok, parça başına tam olarak bir parça içerir. kabaca parça zincirli modele karşılık gelen blok parça zincirleri işaret zinciriyle aynı hızda bloklar üretir. Ancak, ağ gecikmeleri nedeniyle bazı parçalar eksik olabilir; bu nedenle pratikte her blok parça başına bir veya sıfır parça içerir. Nasıl yapılacağına ilişkin ayrıntılar için bölüm 3.3'e bakın. bloklar üretilir. Şekil 16: Solda parça zincirleri ve tek zinciri olan bir model bloklar sağ tarafta parçalara bölünmüş
3.2 Konsensüs Bugün blockchain'lerde fikir birliğine yönelik iki baskın yaklaşım şunlardır: En fazla işe veya hisseye sahip olan zincirin en uzun (veya en ağır) zincir oluşturmak için kullanılan kurallı kabul edilir ve BFT, burada her blok için bazı validator kümesi BFT fikir birliğine ulaştı. Son zamanlarda önerilen protokollerde ikincisi daha baskın bir yaklaşımdır, anında kesinlik sağladığından, en uzun zincirde daha fazla bloğa ihtiyaç duyulurken Kesinliği sağlamak için bloğun üzerine inşa edilecek. Çoğu zaman anlamlı Yeterli sayıda bloğun inşa edilmesi için gereken süre güvenlik gerektirir. saat sırası. Her blokta BFT fikir birliğini kullanmanın aşağıdaki gibi dezavantajları da vardır: 1. BFT fikir birliği önemli miktarda iletişim gerektirir. iken Son gelişmeler sayıca doğrusal zamanda fikir birliğine varılmasına olanak tanıyor katılımcıların sayısı (bkz. örneğin [4]), blok başına hala fark edilebilir bir yüktür; 2. Tüm ağ katılımcılarının BFT'ya katılması mümkün değildir. Blok başına fikir birliğine varılır, dolayısıyla genellikle yalnızca rastgele örneklenmiş bir katılımcı alt kümesi fikir birliğine varır. Rastgele örneklenmiş bir küme prensip olarak şu şekilde olabilir: uyarlanabilir bir şekilde bozulur ve teoride bir çatal oluşturulabilir. sistem her ikisinin de böyle bir olaya hazır olmak için modellenmesi gerekiyor ve bu nedenle hala BFT fikir birliğinin yanı sıra bir çatal seçeneği kuralına sahip olmak veya kapanacak şekilde tasarlanmış olmak böyle bir olayda aşağı. Bazı tasarımların olduğunu belirtmekte fayda var. Algorand [5], uyarlamalı yolsuzluk olasılığını önemli ölçüde azaltır. 3. En önemlisi şu durumlarda sistem durur: Tüm katılımcıların 3 veya daha fazlası çevrimdışı. Bu nedenle, herhangi bir geçici ağ arızası veya ağ bölünmesi, sistemi tamamen durdurabilir. İdeal olarak sistem devam edebilmelidir katılımcıların en az yarısı çevrimiçi olduğu sürece faaliyet göstermektedir (en yoğun Zincir tabanlı protokoller, katılımcıların yarısından azı çevrimiçi olsa bile çalışmaya devam eder, ancak bu özelliğin arzu edilirliği daha tartışmalıdır topluluk içinde). Kullanılan fikir birliğinin bir tür en ağır olduğu hibrit bir model zincir, ancak bazı bloklar BFT sonlandırma aracı kullanılarak periyodik olarak sonlandırılır ve her iki modelin de avantajları korunur. Bu tür BFT nihai gadget'lar Ethereum 2.0 8'de kullanılan Casper FFG [6], Casper CBC (bkz. https://vitalik.) ca/general/2018/12/05/cbc_casper.html) ve GRANDPA (bkz. https:// Medium.com/polkadot-network/d08a24a021b5) Polkadot'de kullanıldı. Nightshade en ağır zincir konsensüsünü kullanır. Özellikle bir blok Üretici bir blok ürettiğinde (bkz. Bölüm 3.3), imza toplayabilirler. diğer blok üreticileri ve önceki bloğu doğrulayan validator'lar. Bölüme bakın Bu kadar çok sayıda imzanın nasıl toplandığıyla ilgili ayrıntılar için 3.8'e bakınız. Ağırlık 8Ayrıca Casper'a derinlemesine bir genel bakış için Justin Drake ile yapılan beyaz tahta oturumuna bakın FFG ve GHOST en ağır zincir konsensüsüne nasıl entegre edildiği burada: https://www. youtube.com/watch?v=S262StTwkmobir bloğun payı, imzaları imzalanan tüm imzalayanların kümülatif hissesidir. bloğa dahil edilmiştir. Bir zincirin ağırlığı blok ağırlıklarının toplamıdır. En ağır zincir mutabakatının yanı sıra, aşağıdakileri kullanan bir nihai gadget kullanıyoruz: blokları sonlandırmak için onaylar. Sistemin karmaşıklığını azaltmak için, Çatal seçim kuralını hiçbir şekilde etkilemeyen bir sonlandırma aracı kullanıyoruz, ve bunun yerine yalnızca ekstra eğik çizgi koşulları getirir, öyle ki bir blok bir kez Nihai gadget tarafından sonlandırıldığında, çok büyük bir yüzde olmadıkça çatallanma imkansızdır. toplam bahis miktarı kesildi. Casper CBC son derece kaliteli bir cihazdır ve biz şu anda Casper CBC'yi göz önünde bulundurarak model oluşturuyorum. Ayrıca TxFlow adı verilen ayrı bir BFT protokolü üzerinde de çalışıyoruz. O sırada Bu belgeyi yazarken Casper yerine TxFlow'un kullanılıp kullanılmayacağı belli değil CBC. Ancak son cihaz seçiminin büyük ölçüde tasarımın geri kalanına dik olduğunu belirtmeliyiz. 3.3 Blok üretimi Nightshade'de iki rol vardır: blok yapımcıları ve validator'ler. herhangi bir zamanda sistemin w blok üreticilerini içerdiği nokta, modellerimizde w = 100 ve wv validators, modelimizde v = 100, wv = 10, 000. Sistem Proof-of-Stake'tir, bu, hem blok üreticilerinin hem de validator'lerin bir takım dahili bağlantılara sahip olduğu anlamına gelir para birimi ("tokens" olarak anılır) belirtilen süreyi aşan bir süre boyunca kilitlendi zinciri oluşturma ve doğrulama görevlerini yerine getirmek için harcadıkları zaman. Tüm Proof of Stake sistemlerinde olduğu gibi, tüm w blok üreticileri ve tüm wv validator'ler farklı varlıklardır, çünkü bu uygulanamaz. Her biri Bununla birlikte, w blok üreticilerinin ve wv validator'lerin ayrı bir hisse. Sistem n parça içeriyor, modelimizde n = 1000. Bahsedildiği gibi bölüm 3.1, Nightshade'de hiçbir parça zinciri yoktur, bunun yerine tüm blok üreticileri ve validator'ler tek bir blockchain inşa ediyor, biz bunu ana zincir. Ana zincirin durumu n parçaya bölünmüştür ve her blok yapımcı ve validator her an yerel olarak yalnızca bir alt kümesini indirdi bazı parçaların alt kümesine karşılık gelen ve yalnızca işlem ve Eyaletin bu kısımlarını etkileyen işlemleri doğrulamak. Bir blok üreticisi olmak için ağın bir katılımcısı bazı büyükleri kilitler tokens miktarı (bir hisse). Ağın bakımı dönemler halinde yapılır, burada bir dönem gün sırasına göre bir zaman dilimidir. Katılımcılar Belirli bir çağın başında en büyük riske sahip olan bloklar O dönemin yapımcıları. Her blok üreticisi yazılım parçalarına atanır (örneğin sw = 40, bu da sww/n = parça başına 4 blok üreticisi anlamına gelir). Blok yapımcı, atandığı parçanın çağdan önceki durumunu indirir başlar ve dönem boyunca söz konusu parçayı etkileyen işlemleri toplar, ve bunları devlete uygular. Ana zincirdeki her b bloğu ve her parça s için aşağıdakilerden biri vardır: blok üreticilerini b ile ilgili kısmı üretmekten sorumlu olanlara atadık parçaya. b'nin parçayla ilgili kısmına yığın denir ve şunları içerir: merkle'nin yanı sıra b'ye dahil edilecek parçaya ilişkin işlemlerin listesiortaya çıkan durumun kökü. b sonuçta yalnızca çok küçük bir başlık içerecektir parça, yani uygulanan tüm işlemlerin merkle kökü (bkz. bölüm Kesin ayrıntılar için 3.7.1) ve son durumun merkle kökü. Belgenin geri kalanında sıklıkla blok üreticisinden bahsediyoruz belirli bir parça için belirli bir zamanda bir parça üretmekten sorumlu olan bir parça üreticisi olarak. Parça üreticisi her zaman blok üreticilerinden biridir. Blok üreticileri ve parça üreticileri her bloğu ona göre döndürür. sabit bir programa göre. Blok üreticilerinin siparişi var ve tekrar tekrar üretim yapıyorlar. bu sırayla bloklar. Örn. 100 blok üreticisi varsa ilk blok üreticiler 1, 101, 201 vb. blokların üretiminden sorumludur, ikincisi ise 2, 102, 202 vb. üretmekten sorumludur. Parça üretimi, blok üretiminden farklı olarak bakım gerektirdiğinden durum ve her parça için yalnızca sww/n blok üreticileri durumu korur parça başına, buna uygun olarak yalnızca sww/n blok üreticileri, oluşturmak için dönüşümlü olarak çalışır. parçalar. Örn. dört blok üreticisinin atandığı yukarıdaki sabitlerle Her parça, her blok üreticisi her dört blokta bir parça oluşturacak. 3.4 Veri kullanılabilirliğinin sağlanması Veri kullanılabilirliğini sağlamak için Polkadot yaklaşımına benzer bir yaklaşım kullanıyoruz bölüm 2.5.3'te açıklanmıştır. Bir blok üreticisi bir parça ürettiğinde, optimal (w, ⌊w/6 + 1⌋) blok koduna sahip silme kodlu versiyonu yığın. Daha sonra silme kodlu parçanın bir parçasını gönderirler (bu tür parçalar diyoruz) her blok üreticisine parça parçaları veya sadece parçalar). Yapraklar gibi tüm parçaları içeren bir merkle ağacı hesaplıyoruz ve Her parçanın başlığı bu ağacın merkle kökünü içerir. Parçalar tek parça mesajları aracılığıyla validators'ye gönderilir. Bu tür mesajların her biri öbek başlığını, parçanın sırasını ve parça içeriğini içerir. mesaj aynı zamanda blok üreticisinin imzasını da içermektedir. parçanın başlığa karşılık geldiğini kanıtlamak için parça ve merkle yolu ve uygun blok üreticisi tarafından üretilmektedir. Bir blok üreticisi bir ana zincir bloğunu aldığında ilk olarak bu bloğun olup olmadığını kontrol eder. blokta yer alan her parça için tek parçalı mesajlar bulunur. Aksi takdirde blok eksik tek parçalı mesajlar alınana kadar işlenmez. Tüm tek parçalı mesajlar alındıktan sonra blok üreticisi, akranlarından kalan parçaları alır ve tuttukları parçaları yeniden yapılandırır devlet. Blok üreticisi en az bir ana zincir bloğunu işlemez. bloğa dahil edilen parçalarda karşılık gelen tek parçalı mesaj yoktur veya durumu korudukları en az bir parça için bunu yapamazlar tüm parçayı yeniden yapılandırın. Belirli bir parçanın mevcut olması için bloğun ⌊w/6⌋+1 olması yeterlidir Üreticiler kendi paylarına sahipler ve onlara hizmet ediyorlar. Böylece sayı kadar Kötü niyetli aktörler, yarım bloktan fazla bloğu olan hiçbir zincirin ⌊w/3⌋ değerini aşmaz bunu inşa eden üreticiler kullanılamayan parçalara sahip olabilir.Şekil 17: Her blok, parça başına bir veya sıfır parça içerir ve her parça silme kodludur. Silme kodlu yığının her bir parçası belirlenmiş bir yere gönderilir. özel bir tek bölümlü mesaj aracılığıyla yapımcıyı bloke etme 3.4.1 Tembel blok üreticileriyle uğraşmak Bir blok üreticisinin tek parçalı mesajın eksik olduğu bir bloğu varsa, yine de imzalamayı seçebilir, çünkü eğer blok zincire bağlanırsa blok üreticisinin ödülünü maksimuma çıkaracak. Blok için risk yok Daha sonra blok üreticisinin sahip olmadığını kanıtlamak imkansız olduğundan üretici tek parça mesajı. Bunu ele almak için, her bir parça üreticisini, parçayı oluştururken yapıyoruz. gelecekteki kodlanmış parçanın her bir parçası için bir renk (kırmızı veya mavi) seçin ve saklayın kodlanmadan önce yığındaki atanan rengin bit maskesi. Her bir parça mesaj parçaya atanan rengi içerir ve renk şu durumlarda kullanılır: kodlanmış parçaların merkle kökünün hesaplanması. Parça üreticisi saparsa protokole göre kolayca kanıtlanabilir, çünkü merkle kökü tek parça mesajlarına veya tek parça mesajlarındaki renklere karşılık gelir merkle köküne karşılık gelen, yığındaki maskeyle eşleşmeyecektir. Bir blok üreticisi bir bloğa imza attığında, tüm blokların bit maskesini ekler. bloğa dahil edilen parçalar için aldıkları kırmızı parçalar. Bir yayınlama yanlış bit maskesi kesilebilir bir davranıştır. Bir blok üreticisi bir sertifika almamışsa tek parçalı mesaj, mesajın rengini bilmelerinin hiçbir yolu yoktur ve dolayısıyla körü körüne imza atmaya kalkışmaları halinde %50 oranında kesintiye uğrama şansları vardır. Blok. 3.5 Durum geçiş başvurusu Parça üreticileri yalnızca parçaya hangi işlemlerin dahil edileceğini seçerler ancak bir yığın ürettiklerinde durum geçişini uygulamayın. Buna bağlı olarak,
yığın başlığı, daha önce olduğu gibi merkelize durumun merkle kökünü içerir yığındaki işlemler uygulanır. İşlemler yalnızca parçayı içeren tam bir blok olduğunda uygulanır işlenir. Bir katılımcı yalnızca şu durumlarda bir bloğu işler: 1. Önceki blok alındı ve işlendi; 2. Her parça için katılımcı sahip olduğu durumu korumaz tek parça mesajını gördüm; 3. Her parça için katılımcı, sahip oldukları durumu korur. tam yığın. Blok işlendikten sonra, katılımcının her bir parça için durumu korur, işlemleri uygular ve yeni durumu hesaplarlar işlemler uygulandıktan sonra üretime hazır hale gelirler herhangi bir parçaya atanmışlarsa bir sonraki bloğun parçaları yeni merkelleşmiş durumun merkle kökü. 3.6 Parçalar arası işlemler ve makbuzlar Bir işlemin birden fazla parçayı etkilemesi gerekiyorsa bunun ardışık olarak yapılması gerekir her parçada ayrı ayrı yürütülür. İşlemin tamamı ilk parçaya gönderilir etkilendiğinde ve işlem söz konusu parçanın öbeğine dahil edildiğinde ve öbek bir bloğa dahil edildikten sonra uygulanır, sözde bir makbuz üretir işlemin yapılması gereken bir sonraki parçaya yönlendirilen işlem idam edilecek. Daha fazla adımın gerekli olması halinde, alındı işleminin yürütülmesi yeni bir giriş hareketi oluşturur ve bu şekilde devam eder. 3.6.1 Makbuz işleminin ömrü Alış işleminin oluşturulduğu bloğun hemen ardından gelen blokta uygulanması arzu edilir. Makbuz işlemi yalnızca Önceki bloğun blok üreticileri tarafından alınıp uygulanmasından sonra oluşturulan kaynak parçayı koruyan ve o zamana kadar bilinmesi gereken Bir sonraki blok için parça, hedefin blok üreticileri tarafından üretilir kırık. Bu nedenle, makbuzun kaynak parçadan alıcıya iletilmesi gerekir. Bu iki olay arasındaki kısa zaman dilimindeki hedef parça. A, r girişini üreten bir t işlemini içeren son üretilen blok olsun. B bir sonraki üretilen blok olsun (yani A'yı içeren bir blok) r'yi içermek istediğimiz önceki bloğu). a ve r parçasında olsun kırıkta b. Şekil 18'de de gösterilen faturanın kullanım ömrü aşağıdaki gibidir: Makbuzların üretilmesi ve saklanması. Parça için parça üreticisi EBM'si a, A bloğunu alır, t işlemini uygular ve r makbuzunu oluşturur. EBM daha sonra üretilen tüm makbuzları dahili kalıcı depolama biriminde indekslenmiş olarak saklar kaynak parça kimliğine göre.Makbuzların dağıtılması. EBM, parçayı üretmeye hazır olduğunda B bloğu için a parçasını, a bloğu için A bloğundaki işlemlerin uygulanmasıyla oluşturulan tüm makbuzları getirir ve bunları parça için parçaya dahil ederler. B bloğunda a. Böyle bir yığın oluşturulduktan sonra, cpa onun silme kodunu üretir sürümü ve karşılık gelen tüm onepart mesajları. EBM, hangi blok üreticilerinin hangi parçalar için tam durumu koruduğunu bilir. Belirli bir blok üreticisi için bp cpa, A bloğundaki işlemlerin uygulanmasından kaynaklanan makbuzları içerir bp'nin hedef olarak önemsediği parçalardan herhangi birine sahip olan parça a için B bloğundaki a parçası için yığını dağıttıklarında tek parçalı mesajda (tek parçalı mesaja dahil edilen makbuzları gösteren şekil 17'ye bakın). Makbuzların alınması. Katılımcıların (hem blok üreticileri hem de validator'ler) tek parçalı mesajları alana kadar blokları işlemediklerini unutmayın. blokta yer alan her parça için. Böylece, herhangi bir katılımcı B bloğunu uyguladığında, B bloğuna karşılık gelen tüm tek parçalı mesajlara sahip olur. B'deki parçalar ve dolayısıyla parçaların bulunduğu tüm gelen makbuzlara sahipler katılımcı, varış yeri olarak durumunu korur. Uygularken belirli bir parça için durum geçişi, katılımcı hem makbuzları uygular tek parçalı mesajlarda parça için topladıklarının yanı sıra tüm yığının kendisinde yer alan işlemler. Şekil 18: Bir makbuz işleminin ömrü 3.6.2 Çok fazla makbuz işlemek Belirli bir parçayı hedefleyen faturaların sayısının belirli blok işlenemeyecek kadar büyük. Örneğin, şekil 19'u düşünün, her bir parçadaki her işlem, parça 1'i hedefleyen bir makbuz oluşturur. Bir sonraki blokta, parça 1'in işlemesi gereken faturaların sayısı şu şekilde olur: taşıma sırasında tüm parçaların bir araya getirdiği yükle karşılaştırılabilir önceki blok.
Şekil 19: Tüm faturalar aynı parçayı hedefliyorsa parçanın bunları işleme kapasitesi Bu sorunu çözmek için QuarkChain 9'da kullanılana benzer bir teknik kullanıyoruz. Spesifik olarak, her bir parça için son B bloğu ve onun içindeki son parça Fişlerin uygulandığı blok kaydedilir. Yeni parça ne zaman Oluşturulduğunda, fiş ilk önce B'de kalan parçalardan başlayarak uygulanır, ve sonra yeni yığın dolana kadar B'yi takip eden bloklar halinde. Normalin altında Dengeli bir yüke sahip koşullar altında, genellikle tüm tahsilatlar sonuçlanacaktır. uygulanıyor (ve böylece son bloğun son parçası kaydedilecek) her parça), ancak yükün dengeli olmadığı zamanlarda ve belirli bir Shard orantısız bir şekilde çok sayıda makbuz alıyor, bu teknik onların dahil edilen işlem sayısındaki sınırlara uyularak işlenecektir. Böyle dengesiz bir yükün uzun süre kalması durumunda gecikmenin Başvuruya kadar fiş oluşturma süresiz olarak büyümeye devam edebilir. Bir Bunu çözmenin yolu, bir hedefi hedefleyen bir makbuz oluşturan herhangi bir işlemi iptal etmektir. Belirli bir sabiti (ör. bir dönem) aşan bir işlem gecikmesine sahip olan parça. Şekil 20'yi düşünün. B bloğuna göre 4 numaralı parça tüm girişleri işleyemez, bu nedenle yalnızca A bloğundaki 3. parçaya kadar olan makbuzları işler ve onu kaydeder. C bloğunda B bloğundaki 5. parçaya kadar olan makbuzlar dahil edilir ve daha sonra D blokta parça yakalanır ve kalan tüm faturalar işlenir. B bloğu ve C bloğundaki tüm faturalar. 3.7 Parça doğrulama Belirli bir parça için üretilen bir parça (veya parça zincirli modelde belirli bir parça zinciri için üretilen bir parça bloğu) yalnızca şu şekilde doğrulanabilir: 9QuarkChain ile beyaz tahta bölümünü buradan izleyin: https://www.youtube.com/watch? v=opEtG6NM4x4, diğerlerinin yanı sıra parçalar arası işlemlere yaklaşımın tartışıldığı şeylerŞekil 20: Gecikmeli makbuz işleme Devleti koruyan katılımcılar. Blok üreticileri olabilirler, validators, veya yalnızca durumu indiren ve parçayı doğrulayan harici tanıklar varlıkları depoluyorlar. Bu belgede katılımcıların çoğunluğunun depolama yapamadığını varsayıyoruz. parçaların büyük bir kısmı için devlet. Ancak şunu belirtmekte yarar var varsayımıyla tasarlanmış parçalanmış blockchain'lerin bulunduğunu çoğu katılımcının durumunu saklama ve çoğu şeyi doğrulama kapasitesi vardır. QuarkChain gibi parçalar. Katılımcıların yalnızca bir kısmı parçayı doğrulama durumuna sahip olduğundan Parçalar halinde, yalnızca aşağıdaki özelliklere sahip olan katılımcıları uyarlanabilir şekilde yozlaştırmak mümkündür. durumu seçin ve geçersiz bir durum geçişi uygulayın. Her birkaç örnekte validators içeren birden fazla parçalama tasarımı önerildi gün ve bir gün içinde parça zincirinde 2/3'ten fazla olan herhangi bir blok söz konusu parçaya atanan validator'lerin imzalarının sayısı hemen dikkate alınır son. Böyle bir yaklaşımla, uyum sağlayabilen bir düşmanın yalnızca 2n/3+1'i yozlaştırması yeterlidir Geçersiz bir durum geçişi uygulamak için bir parça zincirindeki validator'lerin sayısı; Bunu başarmak muhtemelen zor olsa da, kamuya açık bir güvenlik düzeyi yeterli değil blockchain. Bölüm 2.3'te tartışıldığı gibi, ortak yaklaşım, durumu olan herhangi bir katılımcı için bir blok oluşturulduktan sonra belirli bir zaman aralığına izin vermektir (ister geçerliliğine meydan okuyan bir blok üreticisi, bir validator veya harici bir gözlemci). Bu tür katılımcılara Balıkçı denir. Bir balıkçının bunu yapabilmesi için Geçersiz bir bloğa itiraz edilmesi durumunda, böyle bir bloğun erişime açık olduğundan emin olunmalıdır. onlar. Nightshade'deki veri kullanılabilirliği bölüm 3.4'te tartışılmaktadır. Nightshade'de bir blok üretildiğinde parçalar gerçek parça üreticisi dışında herkes. Özellikle blok üreticisi bloğun doğal olarak çoğu parça için duruma sahip olmadığını öne sürdü veparçaları doğrulayamadı. Bir sonraki blok üretildiğinde, birden fazla blok üreticisinin ve validator'lerin onaylarını (bkz. bölüm 3.2) içerir, ancak blok üreticilerinin ve validator'lerin çoğunluğu durumu korumadığından çoğu kırık için de yalnızca bir geçersiz parçaya sahip bir blok, doğrulamaların yarısından önemli ölçüde fazlasını toplayacak ve en ağır blokta yer almaya devam edecek zincir. Bu sorunu çözmek için, durumunu koruyan herhangi bir katılımcıya izin veriyoruz. bu şekilde üretilen herhangi bir geçersiz parça için zincir üzerinde bir meydan okuma gönderecek bir parça kırık. 3.7.1 Devlet geçerliliği sorunu Bir katılımcı belirli bir parçanın geçersiz olduğunu tespit ettiğinde parçanın geçersiz olduğuna dair bir kanıt sunması gerekir. Ağ katılımcılarının çoğunluğu geçersiz parçanın bulunduğu parçanın durumunu korumadığından üretildiğinde, kanıtın bloğun doğrulandığını doğrulamak için yeterli bilgiye sahip olması gerekir. devlet olmadan geçersiz. Tek bir işlemin gerçekleştirebileceği durum miktarının (bayt cinsinden) Ls sınırını belirliyoruz. toplu olarak okuyabilir veya yazabilir. L'den daha fazlasına dokunan herhangi bir işlem durum geçersiz kabul edilir. Bölüm 3.5'ten hatırlayın ki yığın belirli bir B bloğunda yalnızca uygulanacak işlemleri içerir, ancak yeni durum kökü. B bloğundaki yığının içerdiği durum kökü durumdur root, bu tür işlemleri uygulamadan önce, ancak işlemleri uyguladıktan sonra B bloğundan önceki aynı parçadaki son parça. Kötü niyetli bir aktör geçersiz bir durum geçişi uygulamak istemeniz, yanlış bir durum kökü içerecektir uygulamadan kaynaklanan durum köküne karşılık gelmeyen B bloğunda önceki parçadaki işlemler. Bir parça üreticisinin parçaya dahil ettiği bilgiyi genişletiyoruz. Tüm işlemleri uyguladıktan sonra sadece durumu dahil etmek yerine, her bir bitişik işlem kümesi uygulandıktan sonra bir durum kökü içerir. toplu olarak Ls durum baytını okur ve yazar. Bu bilgilerle birlikte balıkçının devlet geçişinin yanlış uygulandığına dair bir zorluk yaratması Bu türden ilk geçersiz durum kökünü bulmak yeterlidir ve yalnızca Ls baytını içerir. son durum kökü arasındaki işlemlerden etkilenen durum (ki bu geçerli) ve merkle kanıtlarıyla birlikte mevcut durum kökü. Daha sonra herhangi bir katılımcı segmentteki işlemleri doğrulayabilir ve parçanın olduğunu doğrulayabilir geçersiz. Benzer şekilde, yığın üreticisi şunu okuyan işlemleri dahil etmeye çalışırsa: ve Ls bayttan daha fazla durum yazın, zorluk için dahil etmek yeterlidir Merkle kanıtlarıyla dokunduğu ilk Ls baytı, bu da yeterli olacaktır. işlemleri uygulayın ve bir girişimde bulunulacağı bir anın olduğunu onaylayın Ls bayt ötesinde içerik okuma veya yazma işlemi yapılır.
3.7.2 Balıkçılar ve hızlı çapraz parça işlemleri Bölüm 2.3'te tartışıldığı gibi, parça parçalarının (veya parçanın) modeldeki parça zincirli bloklar) geçersiz olabilir ve zorluk yaratabilir Bu durum nihailiği ve dolayısıyla parçalar arası iletişimi olumsuz etkiler. içinde özellikle herhangi bir çapraz parça işleminin hedef parçası kesin olamaz kaynak parça parçası veya blok, meydan okuma süresi bitene kadar nihaidir (bkz. şekil 21). Şekil 21: Makbuz uygulamadan önce sorgulama süresinin beklenmesi Bunu, parçalar arası işlemleri gerçekleştirecek şekilde ele almanın yolu hedef parçanın meydan okuma süresini beklememesi anlıktır kaynak parça işlemi yayınlandıktan sonra ve alındı işlemini uygulayın hemen, ancak daha sonra hedef parçayı kaynakla birlikte geri alın daha sonra kaynak parçanın veya bloğun geçersiz olduğu tespit edilirse parça (bkz. şekil 22). Bu, parçanın bulunduğu Nightshade tasarımı için çok doğal olarak geçerlidir. zincirler bağımsız değildir ancak bunun yerine parça parçalarının tümü yayınlanır birlikte aynı ana zincir bloğunda. Herhangi bir parçanın geçersiz olduğu tespit edilirse, bu parçaya sahip bloğun tamamı geçersiz kabul edilir ve üzerine inşa edilen tüm bloklar üstüne. Bkz. şekil 23. Yukarıdaki yaklaşımların her ikisi de, sorunun şu şekilde olduğu varsayılarak atomiklik sağlar: süre yeterince uzundur. Normal koşullar altında hızlı çapraz parça işlemlerinin sağlanması, hedef parça, aşağıdakilerden birinde geçersiz bir durum geçişi nedeniyle geri alınıyor son derece nadir bir olay olan kaynak parçaları. 3.7.3 validators gizleniyor Zorlukların varlığı, halihazırda bu olasılığı önemli ölçüde azaltıyor. uyarlanabilir yolsuzluk, çünkü bir yığını geçersiz bir durum geçiş gönderisiyle sonuçlandırmak içinŞekil 22: Makbuzların anında uygulanması ve varış noktasına geri alınması kaynak zincirinde geçersiz bir blok varsa zincir Şekil 23: Nightshade'de balıkçı mücadelesi Adaptif düşmanın tüm katılımcıları yozlaştırması gereken meydan okuma dönemi tüm validator'ler dahil olmak üzere parçanın durumunu koruyan. Böyle bir olayın olasılığını tahmin etmek son derece karmaşıktır, çünkü hiçbir Sharded blockchain bu tür bir saldırının denenmesine yetecek kadar uzun süredir yayında. Olasılığın son derece düşük olmasına rağmen hala yeterince yüksek olduğunu savunuyoruz. Milyonlarca işlemi yürütmesi beklenen bir sistem için büyük ve dünya çapında finansal operasyonlar yürütmek. Bu inancın iki temel nedeni vardır: 1. Proof-of-Stake zincirlerinin ve madencilerin validator'lerinin çoğu
İş Kanıtı zincirleri öncelikle finansal yükselişle teşvik ediliyor. Eğer Adaptif bir düşman onlara beklenen getiriden daha fazla para teklif eder dürüst bir şekilde faaliyet göstermekten dolayı, birçok validators'nin olmasını beklemek makul olacaktır. teklifi kabul edecek. 2. Birçok kuruluş Proof-of-Stake zincirlerinin doğrulamasını profesyonelce yapar ve Herhangi bir zincirdeki hisselerin büyük bir yüzdesinin bu tür kuruluşlardan. Bu tür varlıkların sayısı bir dönem için yeterince azdır. çoğunu kişisel olarak tanımak ve bozulmaya olan eğilimlerini iyi anlıyorlar. Hangi validator'lerin hangi parçaya atandığını gizleyerek uyarlamalı bozulma olasılığını azaltma konusunda bir adım daha ileri gidiyoruz. Fikir şu Algorand [5]'nin validators'yi gizlemesine uzaktan benzer. validator'ler, Algorand'da olduğu gibi gizlenmiş olsa bile, şunu unutmamak önemlidir: veya aşağıda açıklandığı gibi, uyarlanabilir bozulma teoride hala mümkündür. iken uyarlanabilir rakip, oluşturacak veya doğrulayacak katılımcıları tanımıyor Bir blok ya da yığın halinde, katılımcılar performans sergileyeceklerini kendileri biliyorlar. böyle bir görev ve bunun kriptografik bir kanıtı var. Böylece düşman yolsuzluk yapma niyetlerini yayınlayacak ve bunu sağlayacak herhangi bir katılımcıya ödeme yapacaktır. böyle bir kriptografik kanıt. Ancak şunu da belirtmeliyiz ki, rakip bunu yapmadığından bozmak istedikleri parçaya atanan validator'leri biliyorlarsa, belirli bir parçayı bozma niyetlerini yayınlamaktan başka seçeneği yok tüm topluluk. Bu noktada herhangi bir dürüst için ekonomik olarak faydalıdır. katılımcının bu parçayı doğrulayan tam bir düğümü döndürmesi için yüksek bir söz konusu parçada geçersiz bir bloğun görünme olasılığı; bir meydan okuma yaratın ve ilgili ödülü toplayın. Belirli bir parçaya atanan validator'leri açığa çıkarmamak için şunu yaparız: aşağıdakiler (bkz. şekil 24): Ödevi almak için VRF'yi kullanma. Her çağın başında her validator, validator'nin atandığı parçaların bit maskesini almak için bir VRF kullanır. Her validator'nin bit maskesi Sw bitlerine sahip olacaktır (tanım için bölüm 3.3'e bakın) Sw). validator daha sonra karşılık gelen parçaların durumunu getirir ve Alınan her blok için dönem boyunca karşılık gelen parçaları doğrular validator öğesinin atandığı parçalara. Parçalar yerine bloklar üzerinde oturum açın. Parça ataması gizlendiğinden validator parçalar üzerinde oturum açamaz. Bunun yerine her zaman bütünü imzalar böylece hangi parçaları doğruladığını açığa çıkarmıyor. Özellikle, validator bir blok alıp tüm parçaları doğruladığında ya bir mesaj oluşturur bu, validator öğesinin atandığı tüm parçalardaki tüm parçaların geçerli (bu parçaların ne olduğunu hiçbir şekilde belirtmeden) veya herhangi bir parçanın geçersiz olması durumunda geçersiz durum geçişinin kanıtını içerir. Bkz. Bu tür mesajların nasıl bir araya getirildiğine ilişkin ayrıntılar için bölüm 3.8, aşağıdakiler için bölüm 3.7.4: validators adlı kişinin gelen iletileri arka arkaya almasının nasıl önleneceğine ilişkin ayrıntılar nasıl ödüllendirileceği ve cezalandırılacağıyla ilgili ayrıntılar için diğer validators ve bölüm 3.7.5'e bakın validators başarılı bir geçersiz durum geçiş sorunu gerçekten meydana gelirse.Şekil 24: Nightshade'de validator'leri gizlemek 3.7.4 Taahhüt-Açıklama validators ile ilgili yaygın sorunlardan biri, validator'nin durumu indirmeyi ve aslında parçaları ve blokları doğrulamayı atlayabilmesi ve bunun yerine Ağı gözlemleyin, diğer validator'ların neler gönderdiğini görün ve yaptıklarını tekrarlayın. mesajlar. Böyle bir stratejiyi izleyen bir validator fazladan bir şey sağlamaz ağ için güvenlik sağlar, ancak ödüller toplar. Bu soruna yönelik yaygın bir çözüm, her validator için bir kanıt sağlamaktır örneğin benzersiz bir izleme sağlayarak bloğu gerçekten doğruladıklarını devlet geçişini uygulamak, ancak bu tür kanıtlar maliyeti önemli ölçüde artırıyor doğrulama. Şekil 25: Taahhüt-açıklama
Bunun yerine validators'nin doğrulama sonucuna ilişkin ilk taahhüdünü yaparız (veya parçaların geçerliliğini doğrulayan mesaj veya geçersiz olduğunun kanıtı durum geçişi), belirli bir süre bekleyin ve ancak bundan sonra şekil 25'te gösterildiği gibi gerçek doğrulama sonucunu ortaya çıkarın. ortaya çıkma dönemidir ve bu nedenle tembel bir validator dürüst validator'leri taklit edemez. Ayrıca, dürüst olmayan bir validator şunu doğrulayan bir mesaj gönderirse: atanan parçaların geçerliliği ve en az bir parçanın geçersiz olması durumunda öbeğin geçersiz olduğu gösterildiğinde validator eğik çizgiden kaçınamaz, çünkü, Bölüm 3.7.5'te gösterdiğimiz gibi böyle bir durumda kesilmemenin tek yolu geçersiz durum geçişinin kanıtını içeren bir mesaj sunmaktır. taahhütle eşleşir. 3.7.5 Zorluklarla baş etme Yukarıda tartışıldığı gibi, validator geçersiz parçaya sahip bir blok aldığında, önce geçersiz durum geçişinin kanıtını hazırlarlar (bkz. bölüm 3.7.1), ardından böyle bir kanıtı taahhüt edin (bkz. 3.7.4) ve bir süre sonra zorluğu ortaya çıkarın. Ortaya çıkan zorluk bir bloğa dahil edildiğinde aşağıdakiler gerçekleşir: 1. Bloktan gerçekleşen tüm durum geçişleri Ortaya çıkan zorluğun dahil edildiği bloğa kadar geçersiz parça hükümsüz kılındı. Ortaya çıkan mücadeleyi içeren bloktan önceki durum içeren bloktan önceki durumla aynı olduğu kabul edilir geçersiz yığın. 2. Belirli bir süre içinde her validator kendi bit maskesini göstermelidir doğruladıkları parçalar. Bit maskesi bir VRF aracılığıyla oluşturulduğundan, geçersiz durum geçişine sahip olan parçaya atandılar, ifşa etmekten kaçınamaz. Bit maskesini ortaya çıkaramayan herhangi bir validator parçaya atandığı varsayılmaktadır. 3. Bu süre sonunda parçaya atandığı tespit edilen her validator, içeren blok için bazı doğrulama sonuçları taahhüt etti geçersiz yığın ve bu geçersiz durum geçişinin kanıtını ortaya çıkarmadı bu onların taahhütlerine karşılık gelir. 4. Her validator yeni bir parça ataması alır ve yeni bir dönem planlanır tüm validator'ların indirmesi için yeterli bir süre sonra başlamak üzere Şekil 26'da gösterildiği gibi. validator'lerin kendilerine atanan parçaları ortaya çıkardığı andan itibaren unutmayın yeni dönem başlayana kadar sistemin güvenliği azaltılmıştır. Shard'ın ataması ortaya çıktı. Ağın katılımcılarının bunu saklaması gerekir Bu dönemde ağı kullanırken aklınızda bulundurun. 3.8 İmza Toplama Yüzlerce parçaya sahip bir sistemin güvenli bir şekilde çalışabilmesi için, 10.000 veya daha fazla validators sırası. Bölüm 3.7'de tartışıldığı gibi, her birini istiyoruz.Şekil 26: Mücadeleyi ele almak validator ortalama olarak belirli bir mesaja ve imzaya yönelik bir taahhüt yayınlamak için blok başına bir kez. Taahhüt mesajları aynı olsa bile, böyle bir şeyin toplanması BLS imzası ve bunun doğrulanması son derece pahalı olurdu. Ama doğal olarak taahhüt ve açıklama mesajları validators genelinde aynı değildir, dolayısıyla bu tür mesajları ve imzaları bir araya getirmenin bir yoluna ihtiyacımız var. Daha sonra hızlı doğrulamaya izin veren bir yol. Kullandığımız özel yaklaşım şudur: Doğrulayıcılar blok üreticilerine katılıyor. Blok üreticileri biliniyor çağın başlamasından bir süre önce, çünkü indirmeleri için biraz zamana ihtiyaçları var. çağ başlamadan önceki durum ve validator'lerden farklı olarak blok üreticileri gizlenmedi. Her blok üreticisinin v validator yuvası vardır. Doğrulayıcılar gönderir Blok üreticilerine v'lerinden biri olarak dahil edilmeleri için zincir dışı teklifler validators. Bir blok üreticisi validator eklemek isterse, validator'den gelen ilk zincir dışı talebi içeren işlem ve validator öğesinin blok üreticisine katılmasını sağlayan blok üreticisinin imzası. Blok üreticilerine atanan validator'lerin zorunlu olarak atanmadığını unutmayın. Blok üreticisinin parçalar ürettiği aynı parçaları doğrulayın. eğer bir Birden fazla blok üreticisini birleştirmek için validator uygulandı, yalnızca işlem ilk blok üreticisi başarılı olacaktır. Blok üreticileri taahhütleri toplar. Blok üreticisi sürekli olarak validators'den taahhüt ve açıklama mesajlarını toplar. Bu tür mesajların belirli bir sayısı toplandığında, blok üreticisi bir merkle hesaplar. bu mesajların ağacını oluşturur ve her validator'e merkle kökünü ve mesajlarına giden merkle yolu. validator yolu doğrular ve imzalar merkle kökü. Blok üreticisi daha sonra blok üzerinde bir BLS imzası biriktirir. validators'den merkle kökü ve yalnızca merkle kökü ve birikmiş imza Blok üreticisi aynı zamanda sözleşmenin geçerliliğini de imzalar. Ucuz bir ECDSA imzası kullanarak çoklu imza. Çoklu imza çalışmıyorsa gönderilen merkle köküyle veya katılan validator'ların bit maskesiyle eşleşirse, bu eğik çizgi çizilebilir bir davranıştır. Zinciri senkronize ederken bir katılımcı validator'lerden gelen tüm BLS imzalarını doğrulamayı seçebilir (bu, validator'nin ortak anahtarlarının toplanmasını gerektirdiğinden son derece pahalıdır) veya yalnızcaBlok üreticilerinin ECDMA imzalarına güveniyoruz ve blok üreticisine meydan okunmadı ve kesildi. Zorluklar için zincir içi işlemleri ve merkle kanıtlarını kullanma. o eğer hayırsa validators'den gelen mesajları açığa çıkarmanın hiçbir değeri olmadığı belirtilebilir. geçersiz durum geçişi algılandı. Yalnızca gerçek bilgiyi içeren mesajlar Geçersiz durum geçişinin kanıtlarının açıklanması gerekir ve yalnızca bu tür mesajlar için önceki taahhütle eşleştiklerinin gösterilmesi gerekir. Mesajın ihtiyacı var iki amaçla ortaya çıkar: 1. Zincirin geri dönüşünü fiilen başlatmak için geçersiz durum geçişi (bkz. bölüm 3.7.5). 2. validator belgesinin geçerliliğini kanıtlamaya çalışmadığını kanıtlamak için geçersiz yığın. Her iki durumda da iki konuyu ele almamız gerekiyor: 1. Gerçek taahhüt zincire dahil edilmedi, yalnızca merkle kökü diğer mesajlarla birleştirilmiş taahhüt. validator öğesinin şunu kullanması gerekiyor: Blok üreticisi tarafından sağlanan merkle yolu ve orijinal taahhütleri bu mücadeleye kararlı olduklarını kanıtla. 2. Tüm validator'lerin geçersiz parçaya atanması mümkündür. durum geçişi bozuk blok üreticilerine atanacak bunları sansürlüyorlar. Bunu aşmak için onların açıklamalarını göndermelerine izin veriyoruz Zincir üzerinde düzenli bir işlem olarak ve toplamayı atlayarak. İkincisine yalnızca geçersiz durum geçişinin kanıtları için izin verilir; son derece nadirdir ve bu nedenle blokların spam gönderilmesiyle sonuçlanmamalıdır. Ele alınması gereken son konu, blok üreticilerinin iletilerin toplanmasına katılmamayı veya belirli validators'leri kasıtlı olarak sansürlememeyi tercih edin. Blok haline getirerek ekonomik açıdan dezavantajlı hale getiriyoruz üretici ödülü, kendilerine atanan validators sayısıyla orantılıdır. Biz ayrıca dönemler arasındaki blok üreticilerinin büyük ölçüde kesiştiğinden (çünkü her zaman en yüksek hisseye sahip olan en üstteki katılımcılardır), validator'ler yapabilir Büyük ölçüde aynı blok üreticileriyle çalışmaya devam edin ve böylece riski azaltın Geçmişte onları sansürleyen bir blok üreticisine atanmak. 3.9 Anlık Görüntü Zinciri Ana zincirdeki bloklar çok sık üretildiğinden indirme tarihin tamamı çok hızlı bir şekilde pahalı hale gelebilir. Üstelik her zamandan beri blok çok sayıda katılımcının BLS imzasını içeriyorsa, yalnızca imzayı kontrol etmek için ortak anahtarların toplanması engelleyici hale gelebilir aynı zamanda pahalı. Son olarak, öngörülebilir bir gelecekte Ethereum 1.0 muhtemelen bir tane olarak kalacak en çok kullanılan blockchain'lerden biridir ve varlıkları aktarmanın anlamlı bir yolunu sunar
Ethereum'ye yakın olması bir gerekliliktir ve bugün BLS imzalarının doğrulanması Ethereum tarafında yakın blokların geçerliliği mümkün değildir. Nightshade ana zincirindeki her blok isteğe bağlı olarak bir Schnorr içerebilir böyle bir Schnorr içeren son bloğun başlığındaki çoklu imza çoklu imza. Bu tür bloklara anlık görüntü blokları diyoruz. İlk blok her çağ bir anlık görüntü bloğu olmalıdır. Böyle bir çoklu imza üzerinde çalışırken, blok üreticileri ayrıca validators'nin BLS imzalarını da biriktirmelidir son anlık görüntü bloğuna yerleştirin ve bunları bölümünde açıklandığı şekilde toplayın. bölüm 3.8. Blok üreticilerinin belirlediği dönem boyunca sabit olduğundan doğrulama hiçbir çağda yalnızca ilk anlık görüntü blokları yeterlidir. blok üreticilerinin ve validator'lerin büyük bir yüzdesinin gizli anlaşma yapıp yarattığını gösteriyor bir çatal. Çağın ilk bloğu hesaplamaya yetecek bilgiyi içermelidir dönemin blok üreticileri ve validator'ler. Ana zincirin yalnızca anlık görüntüsünü içeren alt zincirine diyoruz. anlık görüntü zincirini engeller. Schnorr çoklu imzası oluşturmak etkileşimli bir süreçtir, ancak ne kadar verimsiz olursa olsun bunu nadiren gerçekleştirmeniz gerekir; yeterli olacaktır. Schnorr çoklu imzaları Ethereum üzerinde kolayca doğrulanabilir, böylece çapraz-blockchain gerçekleştirmenin güvenli bir yolu için önemli temel öğeler sağlanır iletişim. Yakın zincirle senkronizasyon için yalnızca tüm anlık görüntülerin indirilmesi gerekir bloklar ve Schnorr imzalarının doğru olduğunu onaylar (isteğe bağlı olarak validators'nin bireysel BLS imzalarını da doğrular) ve ardından yalnızca senkronizasyon son anlık görüntü bloğundan ana zincir blokları.
Conclusion
Dans ce document, nous avons discuté des approches pour créer des blockchain fragmentés et a couvert deux défis majeurs des approches existantes, à savoir la validité d'état et la disponibilité des données. Nous avons ensuite présenté Nightshade, un design de sharding qui pouvoirs NEAR Protocole. La conception est en cours de réalisation, si vous avez des commentaires, des questions ou des retours sur ce document, veuillez vous rendre à https://near.chat.
Çözüm
Bu belgede parçalı blockchains oluşturmaya yönelik yaklaşımları tartıştık ve mevcut yaklaşımlarla iki büyük zorluğu, yani durum geçerliliğini ele aldı ve veri kullanılabilirliği. Daha sonra bir parçalama tasarımı olan Nightshade'i sunduk. NEAR Protokolüne güç verir. Yorumlarınız, sorularınız veya geri bildirimleriniz varsa tasarım üzerinde çalışma devam etmektedir bu belgede lütfen https://near.chat. adresine gidin