Buku Putih NEAR
Validez del estado y disponibilidad de datos
La idea central en blockchains fragmentados es que la mayoría de los participantes que operan o el uso de la red no puede validar bloques en todos los fragmentos. Como tal, siempre que cualquier participante necesita interactuar con un fragmento en particular que generalmente no puede descargue y valide el historial completo del fragmento. El aspecto de partición de la fragmentación, sin embargo, plantea un potencial significativo problema: sin descargar y validar el historial completo de un determinado fragmento, el participante no puede necesariamente estar seguro de que el estado con el que 5Esta sección, excepto la subsección 2.5.3, se publicó anteriormente en https://near.ai/ fragmento2. Si lo leíste antes, salta a la siguiente sección.
interactúan es el resultado de alguna secuencia válida de bloques y que dicha secuencia de bloques es de hecho la cadena canónica en el fragmento. Un problema que no existe en un blockchain no fragmentado. Primero presentaremos una solución simple a este problema que ha sido propuesta. por muchos protocolos y luego analizar cómo esta solución puede romperse y qué se han hecho intentos para abordarlo. 2.1 Rotación de validadores La solución ingenua a la validez del estado se muestra en la figura 5: digamos que asumimos que todo el sistema tiene del orden de miles de validators, de los cuales no más del 20% son maliciosos o fallarán de otra manera (por ejemplo, al no ser en línea para producir un bloque). Entonces, si tomamos una muestra de 200 validators, la probabilidad de más de 1 3 reprobados a efectos prácticos se puede suponer que es cero. Figura 5: Muestreo validators 1 3 es un umbral importante. Existe una familia de protocolos de consenso, llamados BFT protocolos de consenso, que garantizan que mientras menos de 1 3 de los participantes fallan, ya sea al estrellarse o al actuar de alguna manera que viole las protocolo, se alcanzará el consenso. Con esta suposición de porcentaje honesto validator, si el conjunto actual de validators en un fragmento nos proporciona algún bloque, la solución ingenua supone que el bloque es válido y que está construido sobre lo que los validators creían que era la cadena canónica para ese fragmento cuando comenzaron a validar. Los validators aprendió la cadena canónica del conjunto anterior de validators, quienes por el mismo suposición construida sobre el bloque que era la cabeza de la cadena canónica antes de eso. Por inducción toda la cadena es válida y dado que no hay un conjunto de validators en cualquier momento se producen bifurcaciones, la solución ingenua también es segura de que la corriente chain es la única cadena en el fragmento. Consulte la figura 6 para obtener una visualización.
Figura 6: Un blockchain con cada bloque finalizado mediante el consenso BFT Esta solución simple no funciona si asumimos que los validators pueden ser corrompidos adaptativamente, lo cual no es una suposición descabellada6. Adaptablemente corromper un solo fragmento en un sistema con 1000 fragmentos es significativamente más barato que corromper todo el sistema. Por tanto, la seguridad del protocolo disminuye linealmente con el número de fragmentos. Para tener certeza en la validez de un bloque, debemos saber que en cualquier momento de la historia ningún fragmento del sistema ha una mayoría de validators en connivencia; con adversarios adaptativos, ya no tenemos tal certeza. Como comentamos en la sección 1.5, los validator en colusión pueden ejercer dos comportamientos maliciosos básicos: crear bifurcaciones y producir bloques no válidos. Las bifurcaciones maliciosas pueden abordarse mediante bloques que se entrecruzan con la cadena Beacon, que generalmente está diseñada para tener una seguridad significativamente mayor que la cadena Beacon. las cadenas de fragmentos. Sin embargo, producir bloques no válidos es una tarea mucho más problema desafiante de abordar. 2.2 Validez del estado Considere la figura 7 en la que el fragmento #1 está dañado y un actor malicioso produce bloque B no válido. Supongamos que en este bloque B se acuñaron 1000 tokens de la nada aire en la cuenta de Alice. El actor malintencionado produce entonces un bloque C válido (en un sentido de que las transacciones en C se aplican correctamente) encima de B, ofuscando el bloque B no válido e inicia una transacción entre fragmentos al fragmento #2 que transfiere esos 1000 tokens a la cuenta de Bob. A partir de este momento el mal Los token creados residen en un blockchain completamente válido en el fragmento #2. Algunos enfoques simples para abordar este problema son: 6Leer esto artículo para detalles en como adaptativo corrupción puede ser llevado fuera: https://medium.com/nearprotocol/d859adb464c8. Para más detalles en adaptativo corrupción, leer https://github.com/ethereum/wiki/wiki/Sharding-FAQ# ¿Cuáles-son-los-modelos-de-seguridad-bajo-los-que-estamos-operando?Figura 7: Una transacción entre fragmentos de una cadena que tiene un bloque no válido 1. Para validators del fragmento #2 para validar el bloque desde el cual se realizó la transacción se inicia. Esto no funcionará ni siquiera en el ejemplo anterior, ya que el bloque C parece ser completamente válido. 2. Para validators en el fragmento #2 para validar una gran cantidad de bloques que preceden al bloque desde el cual se inicia la transacción. Naturalmente, para cualquier número de bloques N validados por el fragmento receptor el malicioso validators pueden crear N+1 bloques válidos además del bloque no válido que producido. Una idea prometedora para resolver este problema sería organizar los fragmentos en un gráfico no dirigido en el que cada fragmento está conectado a varios otros fragmentos, y solo permitir transacciones entre fragmentos entre fragmentos vecinos (por ejemplo, así es como La fragmentación de Vlad Zamfir esencialmente funciona7, y una idea similar se utiliza en la de Kadena. Chainweb [1]). Si se necesita una transacción entre fragmentos entre fragmentos que están no vecinos, dicha transacción se enruta a través de múltiples fragmentos. en este diseño Se espera que un validator en cada fragmento valide todos los bloques en su fragmento así como todos los bloques en todos los fragmentos vecinos. Considere una figura a continuación con 10 fragmentos, cada uno con cuatro vecinos y no hay dos fragmentos que requieran más de dos saltos para una comunicación entre fragmentos como se muestra en la figura 8. El fragmento #2 no solo valida su propio blockchain, sino también los blockchains de todos los vecinos, incluido el fragmento n.° 1. Entonces, si un actor malicioso en el fragmento #1 está intentando crear un bloque B no válido, luego construye el bloque C encima de él e inicia una transacción entre fragmentos, dicha transacción entre fragmentos no se realizará desde el Fragmento #2 habrá validado toda la historia del Fragmento #1 que hará que identifique el bloque B no válido. 7Lea más sobre el diseño aquí: https://medium.com/nearprotocol/37e538177ed9
Figura 8: Una transacción entre fragmentos no válida en un sistema tipo cadena web que ser detectado Si bien corromper un único fragmento ya no es un ataque viable, corromper un pocos fragmentos siguen siendo un problema. En la figura 9, un adversario corrompiendo ambos Shard
1 y el fragmento #2 ejecutan con éxito una transacción entre fragmentos al fragmento #3
con fondos de un bloque B no válido: Figura 9: Una transacción entre fragmentos no válida en un sistema tipo cadena web que no ser detectado El fragmento n.º 3 valida todos los bloques del fragmento n.º 2, pero no del fragmento n.º 1, y no tiene forma de detectar el bloque malicioso. Hay dos direcciones principales para resolver adecuadamente la validez estatal: los pescadores
y pruebas criptográficas de cómputo. 2.3 pescador La idea detrás del primer enfoque es la siguiente: siempre que un encabezado de bloque se comunica entre cadenas para cualquier propósito (como el enlace cruzado con el cadena de baliza, o una transacción entre fragmentos), hay un período de tiempo durante cual cualquier validator honesto puede proporcionar una prueba de que el bloqueo no es válido. allí Hay varias construcciones que permiten pruebas muy sucintas de que los bloques son no válido, por lo que la sobrecarga de comunicación para los nodos receptores es mucho menor que el de recibir un bloqueo completo. Con este enfoque, siempre que haya al menos un validator honesto en el fragmento, el sistema es seguro. Figura 10: pescador Este es el enfoque dominante (además de fingir que el problema no existe) entre los protocolos propuestos hoy. Este enfoque, sin embargo, tiene dos principales desventajas: 1. El período de desafío debe ser lo suficientemente largo para el validator honesto. para reconocer que se produjo un bloque, descargarlo, verificarlo completamente y preparar el desafío si el bloque no es válido. La introducción de ese período ralentizar significativamente las transacciones entre fragmentos. 2. La existencia del protocolo de desafío crea un nuevo vector de ataques cuando los nodos maliciosos envían spam con desafíos no válidos. Una solución obvia a este problema es hacer que los retadores depositen una cierta cantidad de tokens que se devuelven si el desafío es válido. Esta es sólo una solución parcial, ya que Todavía podría ser benéfico para el adversario enviar spam al sistema (y quemar los depósitos) con impugnaciones no válidas, por ejemplo para impedir la validezdesafío de un honesto validator de pasar. Estos ataques son llamados ataques de duelo. Consulte la sección 3.7.2 para conocer una forma de evitar este último punto. 2.4 Argumentos de conocimiento sucintos y no interactivos La segunda solución a la corrupción de múltiples fragmentos es utilizar algún tipo de construcción criptográfica que permita demostrar que un determinado cálculo (como como calcular un bloque a partir de un conjunto de transacciones) se realizó correctamente. Este tipo de construcciones existen, p. zk-SNARK, zk-STARK y algunos otros, y algunos se utilizan activamente en los protocolos blockchain actuales para pagos privados, más notablemente ZCash. El principal problema con tales primitivos es que son notoriamente lentos de calcular. P.ej. Protocolo Coda, que utiliza zk-SNARK específicamente para demostrar que todos los bloques en el blockchain son válidos, dijo en un de las entrevistas que puede tomar 30 segundos por transacción para crear una prueba (Este número probablemente sea menor ahora). Curiosamente, no es necesario que una parte de confianza calcule una prueba, ya que la prueba no sólo da fe de la validez del cálculo para el que está construida, sino también de la la validez de la prueba misma. Por tanto, el cálculo de tales pruebas se puede dividir entre un conjunto de participantes con significativamente menos redundancia de lo que sería necesario realizar algún cálculo sin confianza. También permite a los participantes que calculan zk-SNARK para ejecutarse en hardware especial sin reducir el descentralización del sistema. Los desafíos de los zk-SNARK, además del rendimiento, son: 1. Dependencia de primitivas criptográficas menos investigadas y menos probadas; 2. "Residuos tóxicos": los zk-SNARK dependen de una configuración confiable en la que un grupo de personas realiza algún cálculo y luego descarta el intermedio valores de ese cálculo. Si todos los participantes del procedimiento se confabulan y se mantienen los valores intermedios, se pueden crear pruebas falsas; 3. Se introduce complejidad adicional en el diseño del sistema; 4. Los zk-SNARK solo funcionan para un subconjunto de cálculos posibles, por lo que un protocolo con un lenguaje Turing completo smart contract no podría usar SNARK para demostrar la validez de la cadena. 2.5 Disponibilidad de datos El segundo problema que abordaremos es la disponibilidad de datos. Generalmente nodos que operan un blockchain particular se separan en dos grupos: nodos completos, aquellos que descargan cada bloque completo y validan cada transacción, y Light Nodos, aquellos que solo descargan encabezados de bloques y usan pruebas de Merkle para las partes del estado y las transacciones que les interesan, como se muestra en la figura 11.
Figura 11: árbol de merkle Ahora bien, si la mayoría de los nodos completos se confabulan, pueden producir un bloque, válido o no es válido y envía su hash a los nodos de luz, pero nunca revela el contenido completo del bloque. Hay varias maneras en que pueden beneficiarse de ello. Por ejemplo, considere la figura 12: Figura 12: Problema de disponibilidad de datos Hay tres bloques: el anterior, A, está producido por validators honestos; el actual, B, tiene validators en connivencia; y el siguiente, C, también se producirá por validators honestos (el blockchain se muestra en la esquina inferior derecha). Eres un comerciante. Los validators del bloque actual (B) recibieron el bloque A de los validators anteriores, calculó un bloque en el que recibe dinero,y le envié un encabezado de ese bloque con una prueba Merkle del estado en el que tiene dinero (o una prueba Merkle de una transacción válida que envía el dinero a ti). Con la seguridad de que la transacción está finalizada, usted brinda el servicio. Sin embargo, los validators nunca distribuyen el contenido completo del bloque B a cualquiera. Como tal, los validator__s honestos del bloque C no pueden recuperar el bloque y se ven obligados a detener el sistema o a construir sobre A, privándolo a usted como comerciante de dinero. Cuando aplicamos el mismo escenario a la fragmentación, las definiciones de completo y El nodo ligero generalmente se aplica por fragmento: validators en cada fragmento descarga cada bloquear en ese fragmento y validar cada transacción en ese fragmento, pero otros nodos del sistema, incluidos aquellos que capturan el estado de las cadenas de fragmentos en el cadena de balizas, descargue solo los encabezados. Por lo tanto, los validators en el fragmento son efectivamente nodos completos para ese fragmento, mientras que otros participantes en el sistema, incluida la cadena de balizas, funcionan como nodos luminosos. Para que funcione el enfoque del pescador que analizamos anteriormente, los validators honestos Debe poder descargar bloques que estén vinculados cruzadamente a la cadena de baliza. Si validators maliciosos vinculaban un encabezado de un bloque no válido (o lo usaban para iniciar una transacción entre fragmentos), pero nunca distribuyó el bloque, el honesto Los validators no tienen forma de crear un desafío. Cubriremos tres enfoques para abordar este problema que complementan unos a otros. 2.5.1 Pruebas de custodia El problema más inmediato a resolver es si un bloque está disponible una vez esta publicado. Una idea propuesta es tener los llamados Notarios que rotan entre fragmentos con más frecuencia que validators cuyo único trabajo es descargar un bloquear y dar fe de que pudieron descargarlo. pueden ser rotan con más frecuencia porque no necesitan descargar el estado completo del fragmento, a diferencia de los validators que no se pueden rotar con frecuencia ya que debe descargar el estado del fragmento cada vez que gira, como se muestra en la figura 13. El problema con este enfoque ingenuo es que es imposible demostrar más tarde si el Notario pudo o no descargar el bloque, por lo que un Notario pueden optar por dar fe siempre de que pudieron descargar el bloque sin incluso intentar recuperarlo. Una solución a esto es que los notarios proporcionen alguna evidencia o apostar alguna cantidad de tokens que acrediten que el bloque fue descargado. Una de esas soluciones se analiza aquí: https://ethresear.ch/t/ Bonos de custodia de 1 bit amigables con la agregación/2236. 2.5.2 Códigos de borrado Cuando un nodo de luz en particular recibe un hash de un bloque, para aumentar el valor del nodo Si está seguro de que el bloque está disponible, puede intentar descargar algunos archivos aleatorios. pedazos del bloque. Esta no es una solución completa, ya que a menos que los nodos de luz descargar colectivamente el bloque completo que los productores de bloques maliciosos pueden elegir
Figura 13: Los validadores necesitan descargar el estado y, por lo tanto, no se pueden rotar. frecuentemente retener las partes del bloque que no fueron descargadas por ningún nodo ligero, por lo que el bloque aún no está disponible. Una solución es utilizar una construcción llamada Códigos de borrado para que sea posible para recuperar el bloque completo incluso si solo una parte del bloque está disponible, como se muestra en la figura 14. Figura 14: Merkle tree construido sobre datos codificados de borrado Tanto Polkadot como Ethereum Serenity tienen diseños en torno a esta idea que Proporcionar una manera para que los nodos ligeros estén razonablemente seguros de que los bloques están disponibles. El enfoque Ethereum Serenity tiene una descripción detallada en [2].2.5.3 El enfoque de Polkadot respecto de la disponibilidad de datos En Polkadot, como en la mayoría de las soluciones fragmentadas, cada fragmento (llamado parachain) envía instantáneas de sus bloques a la cadena de baliza (llamada cadena de retransmisión). Digamos que hay 2f + 1 validators en la cadena de relés. Los productores de bloques de los bloques parachain, llamados Alzadores, una vez que se produce el bloque parachain, calcule una versión codificada de borrado del bloque que consta de 2f +1 partes, de modo que cualquier f partes sea suficiente. para reconstruir el bloque. Luego distribuyen una parte a cada validator en el cadena de relevo. Una cadena de retransmisión particular validator solo firmaría en una cadena de retransmisión bloque si tienen su parte para cada bloque de parachain que se captura en dicho bloque de cadena de relés. Por lo tanto, si un bloque de cadena de retransmisión tiene firmas de 2f + 1 validators, y mientras no más de f de ellos violen el protocolo, cada El bloque parachain se puede reconstruir obteniendo las piezas de validators. que siguen el protocolo. Ver figura 15. Figura 15: Disponibilidad de datos de Polkadot 2.5.4 Disponibilidad de datos a largo plazo Tenga en cuenta que todos los enfoques discutidos anteriormente solo dan fe del hecho de que un bloque se publicó y ya está disponible. Los bloques pueden dejar de estar disponibles más adelante por una variedad de razones: nodos que se desconectan, nodos que borran intencionalmente datos históricos datos, y otros. Un documento técnico que vale la pena mencionar y que aborda este problema es Polyshard [3], que utiliza códigos de borrado para hacer que los bloques estén disponibles en todos los fragmentos, incluso si hay varios Los fragmentos pierden completamente sus datos. Desafortunadamente, su enfoque específico requiere todos los fragmentos para descargar bloques de todos los demás fragmentos, lo cual es prohibitivamente caro. La disponibilidad a largo plazo no es un problema tan urgente: dado que ningún participante Se espera que el sistema sea capaz de validar todas las cadenas en todos los
fragmentos, la seguridad del protocolo fragmentado debe diseñarse de tal manera manera que el sistema sea seguro incluso si algunos bloques antiguos en algunos fragmentos se vuelven completamente no disponible.
Validitas Negara dan Ketersediaan Data
Ide inti dalam blockchains yang dipecah adalah sebagian besar peserta mengoperasikan atau menggunakan jaringan tidak dapat memvalidasi blok di semua pecahan. Dengan demikian, kapan pun setiap peserta perlu berinteraksi dengan pecahan tertentu yang biasanya tidak bisa mereka lakukan unduh dan validasi seluruh riwayat beling. Namun, aspek partisi sharding memunculkan potensi yang signifikan masalah: tanpa mengunduh dan memvalidasi seluruh riwayat tertentu shard peserta belum tentu bisa memastikan negara bagian mana 5Bagian ini, kecuali subbagian 2.5.3, sebelumnya diterbitkan di https://near.ai/ pecahan2. Jika Anda membacanya sebelumnya, lewati ke bagian berikutnya.
mereka berinteraksi adalah hasil dari beberapa rangkaian blok yang valid dan rangkaian tersebut blok memang merupakan rantai kanonik dalam beling. Sebuah masalah yang tidak terjadi ada di blockchain yang tidak di-sharding. Pertama-tama kami akan menyajikan solusi sederhana untuk masalah yang telah diusulkan ini oleh banyak protokol dan kemudian menganalisis bagaimana solusi ini dapat rusak dan apa upaya telah dilakukan untuk mengatasinya. 2.1 Rotasi validator Solusi naif terhadap validitas negara ditunjukkan pada gambar 5: katakanlah kita berasumsi yang dimiliki seluruh sistem berjumlah ribuan validator, di antaranya tidak lebih dari 20% bersifat berbahaya atau akan gagal (misalnya gagal online untuk menghasilkan blok). Lalu jika kita mengambil sampel 200 validators, probabilitasnya lebih dari 1 3 kegagalan untuk tujuan praktis dapat diasumsikan nol. Gambar 5: Pengambilan sampel validatordtk 1 3 adalah ambang batas yang penting. Ada sekumpulan protokol konsensus, yang disebut BFT protokol konsensus, yang menjamin bahwa selama kurang dari 1 3 dari peserta gagal, baik karena menabrak atau bertindak dengan cara yang melanggar protokol, konsensus akan tercapai. Dengan asumsi persentase validator yang jujur, jika ditetapkan saat ini validators dalam pecahan memberi kita beberapa blok, asumsi solusi naif bahwa blok tersebut valid dan dibangun berdasarkan apa yang diyakini oleh validator rantai kanonik untuk pecahan tersebut ketika mereka mulai memvalidasi. validators mempelajari rantai kanonik dari kumpulan validator sebelumnya, yang juga melakukan hal yang sama asumsi yang dibangun di atas blok yang merupakan kepala rantai kanonik sebelum itu. Dengan induksi seluruh rantai valid, dan karena tidak ada himpunan validators pada titik mana pun dihasilkan garpu, solusi naifnya juga pasti arusnya rantai adalah satu-satunya rantai di pecahan. Lihat gambar 6 untuk visualisasinya.
Gambar 6: blockchain dengan setiap blok diselesaikan melalui konsensus BFT Solusi sederhana ini tidak akan berhasil jika kita berasumsi bahwa validator bisa berhasil dirusak secara adaptif, yang bukan merupakan asumsi yang tidak masuk akal6. Secara adaptif merusak satu pecahan dalam sistem dengan 1000 pecahan jauh lebih murah daripada merusak seluruh sistem. Oleh karena itu, keamanan protokol menurun secara linear seiring dengan jumlah shard. Untuk memperoleh kepastian keabsahan sebuah blok, kita harus tahu bahwa pada titik mana pun dalam sejarah tidak ada pecahan dalam sistem yang memilikinya mayoritas validator berkolusi; dengan musuh adaptif, kita tidak lagi memilikinya kepastian seperti itu. Seperti yang telah kita bahas di bagian 1.5, berkolusi validator dapat dilakukan dua perilaku dasar berbahaya: membuat fork, dan menghasilkan blok yang tidak valid. Garpu berbahaya dapat diatasi dengan menghubungkan blok ke rantai Beacon yang umumnya dirancang untuk memiliki keamanan yang jauh lebih tinggi daripada rantai pecahan. Namun, menghasilkan blok yang tidak valid adalah hal yang jauh lebih buruk masalah yang menantang untuk diatasi. 2.2 Validitas Negara Perhatikan gambar 7 di mana Shard #1 rusak dan dihasilkan oleh aktor jahat blok B tidak valid. Misalkan di blok ini 1000 token dicetak tipis mengudara di akun Alice. Aktor jahat kemudian menghasilkan blok C yang valid (dalam a merasakan bahwa transaksi di C diterapkan dengan benar) di atas B, membingungkan blok B yang tidak valid, dan memulai transaksi lintas pecahan ke Shard #2 itu mentransfer 1000 token itu ke rekening Bob. Mulai saat ini yang tidak semestinya token yang dibuat berada di blockchain yang sepenuhnya valid di Shard #2. Beberapa pendekatan sederhana untuk mengatasi masalah ini adalah: 6Baca ini artikel untuk detail pada bagaimana adaptif korupsi bisa menjadi dibawa keluar: https://medium.com/nearprotocol/d859adb464c8. Untuk lebih detail pada adaptif korupsi, membaca https://github.com/ethereum/wiki/wiki/Sharding-FAQ# model-keamanan-apa-yang-kami-operasikan-dibawahnyaGambar 7: Transaksi lintas pecahan dari rantai yang memiliki blok tidak valid 1. Untuk validators Shard #2 untuk memvalidasi blok tempat transaksi dimulai. Ini tidak akan berfungsi bahkan pada contoh di atas, karena blok C tampaknya sepenuhnya valid. 2. Untuk validators di Shard #2 untuk memvalidasi sejumlah besar blok sebelum blok tempat transaksi dimulai. Tentu saja untuk sejumlah blok N yang divalidasi oleh pecahan penerima yang berbahaya validators dapat membuat N+1 blok valid di atas blok tidak valid tersebut diproduksi. Ide yang menjanjikan untuk mengatasi masalah ini adalah dengan menyusun pecahan menjadi sebuah grafik tidak berarah di mana setiap pecahan terhubung ke beberapa pecahan lainnya, dan hanya mengizinkan transaksi lintas pecahan antar pecahan yang bertetangga (misalnya begini caranya Pecahan Vlad Zamfir pada dasarnya berhasil7, dan gagasan serupa digunakan dalam gagasan Kadena Jaringan rantai [1]). Jika diperlukan transaksi lintas shard antar shard yang ada bukan tetangga, transaksi tersebut disalurkan melalui banyak pecahan. Dalam desain ini a validator di setiap shard diharapkan memvalidasi semua blok di shardnya serta semua blok di semua pecahan di sekitarnya. Perhatikan gambar di bawah ini dengan 10 pecahan, masing-masing memiliki empat pecahan tetangga, dan tidak ada dua pecahan yang membutuhkan lebih banyak dari dua lompatan untuk komunikasi lintas pecahan yang ditunjukkan pada gambar 8. Pecahan #2 tidak hanya memvalidasi blockchain miliknya sendiri, tetapi juga blockchain dari semua tetangga, termasuk Shard #1. Jadi jika ada aktor jahat di Shard #1 sedang mencoba membuat blok B yang tidak valid, lalu membangun blok C di atasnya dan memulai transaksi lintas pecahan, transaksi lintas pecahan tersebut tidak akan berjalan melalui sejak Shard #2 akan memvalidasi seluruh sejarah Shard #1 yang mana akan menyebabkannya mengidentifikasi blok B yang tidak valid. 7Baca lebih lanjut tentang desain di sini: https://medium.com/nearprotocol/37e538177ed9
Gambar 8: Transaksi lintas pecahan yang tidak valid dalam sistem seperti chainweb yang akan melakukannya terdeteksi Meskipun merusak satu pecahan bukan lagi serangan yang layak, namun merusak a beberapa pecahan masih menjadi masalah. Pada gambar 9 musuh merusak kedua Shard
1 dan Shard #2 berhasil mengeksekusi transaksi lintas shard ke Shard #3
dengan dana dari blok B yang tidak valid: Gambar 9: Transaksi lintas pecahan yang tidak valid dalam sistem seperti chainweb yang akan melakukannya tidak terdeteksi Shard #3 memvalidasi semua blok di Shard #2, tetapi tidak di Shard #1, dan tidak memiliki cara untuk mendeteksi blok berbahaya. Ada dua arah utama dalam menyelesaikan validitas negara dengan tepat: nelayan
dan bukti komputasi kriptografi. 2.3 Nelayan Ide di balik pendekatan pertama adalah sebagai berikut: setiap kali ada header blok dikomunikasikan antar rantai untuk tujuan apa pun (seperti tautan silang ke rantai suar, atau transaksi lintas pecahan), ada periode waktu selama itu yang mana validator yang jujur dapat memberikan bukti bahwa blok tersebut tidak valid. Di sana Ada berbagai konstruksi yang memungkinkan bukti yang sangat ringkas bahwa balok-balok tersebut memang ada tidak valid, sehingga overhead komunikasi untuk node penerima jauh lebih kecil daripada menerima blok penuh. Dengan pendekatan ini selama setidaknya ada satu validator yang jujur di dalamnya pecahan, sistem aman. Gambar 10: Nelayan Ini adalah pendekatan yang dominan (selain berpura-pura bahwa masalahnya tidak ada) di antara protokol-protokol yang diusulkan saat ini. Namun pendekatan ini memiliki dua hal kelemahan utama: 1. Periode tantangan harus cukup lama untuk validator yang jujur untuk mengenali suatu blok telah diproduksi, mengunduhnya, memverifikasinya sepenuhnya, dan mempersiapkannya tantangan jika blok tidak valid. Memperkenalkan periode seperti itu akan membantu secara signifikan memperlambat transaksi lintas pecahan. 2. Adanya protokol tantangan menciptakan vektor serangan baru ketika node jahat melakukan spam dengan tantangan yang tidak valid. Solusi yang jelas untuk masalah ini adalah membuat penantang menyetor sejumlah tokens itu dikembalikan jika tantangannya valid. Ini hanyalah solusi parsial mungkin masih bermanfaat bagi musuh untuk mengirim spam ke sistem (dan membakar deposito) dengan tantangan yang tidak valid, misalnya untuk mencegah validtantangan dari validator yang jujur dari yang dilalui. Serangan-serangan ini adalah disebut Serangan Berduka. Lihat bagian 3.7.2 untuk mengetahui cara menyiasati poin terakhir. 2.4 Argumen Pengetahuan Non-interaktif Ringkas Solusi kedua terhadap korupsi multiple-shard adalah dengan menggunakan semacam konstruksi kriptografi yang memungkinkan seseorang membuktikan bahwa perhitungan tertentu (seperti sebagai komputasi satu blok dari serangkaian transaksi) dilakukan dengan benar. Konstruksi seperti itu memang ada, mis. zk-SNARKs, zk-STARKs dan beberapa lainnya, dan beberapa saat ini secara aktif digunakan dalam protokol blockchain untuk pembayaran pribadi, terutama ZCash. Masalah utama dengan kaum primitif seperti itu adalah mereka terkenal lambat untuk dihitung. Misalnya. Protokol Coda, yang menggunakan zk-SNARKs khusus untuk membuktikan bahwa semua blok di blockchain valid, dikatakan dalam satu dari wawancara bahwa diperlukan waktu 30 detik per transaksi untuk membuat bukti (jumlah ini mungkin lebih kecil saat ini). Menariknya, sebuah pembuktian tidak perlu dihitung oleh pihak yang terpercaya buktinya tidak hanya membuktikan keabsahan penghitungan yang dibuatnya, tetapi juga membuktikannya keabsahan pembuktian itu sendiri. Dengan demikian, perhitungan pembuktian tersebut dapat dibagi di antara sekelompok peserta dengan redundansi yang jauh lebih sedikit dibandingkan yang seharusnya diperlukan untuk melakukan beberapa perhitungan yang tidak dapat dipercaya. Hal ini juga memungkinkan untuk peserta yang menghitung zk-SNARK untuk dijalankan pada perangkat keras khusus tanpa mengurangi desentralisasi sistem. Tantangan zk-SNARKs, selain kinerja, adalah: 1. Ketergantungan pada kriptografi primitif yang kurang diteliti dan kurang teruji waktu; 2. "Limbah beracun" - zk-SNARK bergantung pada pengaturan tepercaya di mana suatu grup orang melakukan beberapa perhitungan dan kemudian membuang perantara nilai perhitungan itu. Jika semua peserta dalam prosedur berkolusi dan mempertahankan nilai tengahnya, bukti palsu dapat dibuat; 3. Kompleksitas ekstra dimasukkan ke dalam desain sistem; 4. zk-SNARKs hanya berfungsi untuk sebagian dari kemungkinan komputasi, jadi sebuah protokol dengan bahasa smart contract lengkap Turing tidak akan dapat digunakan SNARK untuk membuktikan validitas rantai. 2.5 Ketersediaan Data Masalah kedua yang akan kami bahas adalah ketersediaan data. Umumnya node mengoperasikan blockchain tertentu dipisahkan menjadi dua kelompok: Node Penuh, mereka yang mengunduh setiap blok penuh dan memvalidasi setiap transaksi, dan Ringan Node, yang hanya mengunduh header blok, dan menggunakan bukti Merkle untuk bagian-bagiannya negara dan transaksi yang mereka minati, seperti yang ditunjukkan pada gambar 11.
Gambar 11: Pohon Merkle Sekarang jika mayoritas node penuh berkolusi, mereka dapat menghasilkan blok, valid atau tidak valid, dan kirimkan hash-nya ke node lampu, tetapi jangan pernah mengungkapkan konten lengkapnya dari blok tersebut. Ada berbagai cara yang dapat mereka manfaatkan. Misalnya, perhatikan gambar 12: Gambar 12: Masalah Ketersediaan Data Ada tiga blok: blok sebelumnya, A, diproduksi oleh validators yang jujur; arus, B, berkolusi validator; dan berikutnya, C, juga akan diproduksi dengan jujur validators (blockchain digambarkan di pojok kanan bawah). Anda adalah seorang pedagang. validators dari blok saat ini (B) menerima blok A dari validators sebelumnya, menghitung blok tempat Anda menerima uang,dan mengirimi Anda tajuk blok itu dengan bukti Merkle tentang negara bagiannya Anda memiliki uang (atau bukti Merkle dari transaksi sah yang mengirimkan uang tersebut kepada Anda). Yakin transaksi telah selesai, Anda menyediakan layanan tersebut. Namun, validators tidak pernah mendistribusikan seluruh konten blok B ke dalamnya siapa pun. Dengan demikian, validator yang jujur dari blok C tidak dapat mengambil blok tersebut, dan terpaksa menghentikan sistem atau membangun di atas A, sehingga membuat Anda kehilangan a pedagang uang. Saat kami menerapkan skenario yang sama pada sharding, definisi penuh dan light node umumnya berlaku per shard: validators di setiap unduhan shard memblokir di pecahan itu dan memvalidasi setiap transaksi di pecahan itu, tetapi lainnya node dalam sistem, termasuk node yang mengambil status rantai pecahan ke dalam rantai suar, hanya unduh headernya. Jadi validator yang ada di pecahan adalah node penuh secara efektif untuk pecahan itu, sementara peserta lain dalam sistem, termasuk rantai suar, beroperasi sebagai titik cahaya. Agar pendekatan nelayan yang kita bahas di atas berhasil, jujurlah validators harus dapat mengunduh blok yang terhubung silang ke rantai suar. Jika validators jahat menghubungkan header dari blok yang tidak valid (atau menggunakannya untuk memulai transaksi lintas pecahan), tetapi tidak pernah mendistribusikan blok, jujur validators tidak punya cara untuk membuat tantangan. Kami akan membahas tiga pendekatan untuk mengatasi masalah ini yang saling melengkapi satu sama lain. 2.5.1 Bukti Penitipan Masalah paling mendesak yang harus dipecahkan adalah apakah suatu blok tersedia satu kali itu diterbitkan. Salah satu ide yang diusulkan adalah untuk memiliki apa yang disebut Notaris yang melakukan rotasi antar pecahan lebih sering daripada validator yang tugasnya hanya mengunduh a memblokir dan membuktikan fakta bahwa mereka dapat mengunduhnya. Bisa jadi diputar lebih sering karena tidak perlu mengunduh seluruh negara bagian pecahan, tidak seperti validator yang tidak dapat sering diputar sejak saat itu harus mengunduh status pecahan setiap kali beling diputar, seperti yang ditunjukkan pada gambar 13. Masalah dengan pendekatan naif ini adalah tidak mungkin dibuktikan di kemudian hari apakah Notaris itu mampu atau tidak untuk mengunduh blok tersebut, jadi Notaris dapat memilih untuk selalu membuktikan bahwa mereka dapat mengunduh blok tersebut tanpa bahkan mencoba mengambilnya. Salah satu solusinya adalah Notaris yang menyediakan beberapa bukti atau mempertaruhkan sejumlah token untuk membuktikan bahwa blok tersebut benar diunduh. Salah satu solusi tersebut dibahas di sini: https://ethresear.ch/t/ Obligasi-penahanan-ramah-agregasi-1-bit/2236. 2.5.2 Kode Penghapusan Ketika node cahaya tertentu menerima hash dari sebuah blok, untuk meningkatkan node tersebut yakin bahwa blok tersebut tersedia, ia dapat mencoba mengunduh beberapa secara acak potongan blok. Ini bukan solusi yang lengkap, karena kecuali titik cahaya secara kolektif mengunduh seluruh blok yang dapat dipilih oleh produsen blok jahat
Gambar 13: Validator perlu mengunduh status sehingga tidak dapat dirotasi sering untuk menahan bagian blok yang tidak diunduh oleh node lampu mana pun, sehingga masih membuat blok tidak tersedia. Salah satu solusinya adalah dengan menggunakan konstruksi yang disebut Erasure Codes untuk mewujudkannya untuk memulihkan blok penuh meskipun hanya sebagian dari blok yang tersedia, seperti yang ditunjukkan pada gambar 14. Gambar 14: Merkle tree dibangun di atas data berkode penghapusan Baik Polkadot dan Ethereum Serenity memiliki desain seputar gagasan ini yang menyediakan cara bagi node cahaya untuk cukup yakin bahwa blok tersebut tersedia. Pendekatan Ethereum Serenity memiliki penjelasan rinci di [2].2.5.3 Pendekatan Polkadot terhadap ketersediaan data Di Polkadot, seperti pada sebagian besar solusi shard, setiap shard (disebut parachain) mengambil snapshot bloknya ke rantai suar (disebut rantai relai). Katakanlah ada 2f + 1 validators pada rantai relai. Produsen blok dari blok parachain, disebut collators, setelah blok parachain diproduksi, hitung versi blok yang diberi kode penghapusan yang terdiri dari 2f +1 bagian sedemikian rupa sehingga f bagian mana pun mencukupi untuk merekonstruksi blok tersebut. Mereka kemudian mendistribusikan satu bagian ke setiap validator di rantai relai. Rantai relai tertentu validator hanya akan masuk pada rantai relai blok jika mereka memiliki bagiannya untuk setiap blok parachain yang di-snapshot blok rantai relai tersebut. Jadi, jika blok rantai relai memiliki tanda tangan dari 2f + 1 validators, dan selama tidak lebih dari f yang melanggar protokol, masing-masing blok parachain dapat direkonstruksi dengan mengambil bagian dari validators yang mengikuti protokol. Lihat gambar 15. Gambar 15: ketersediaan data Polkadot 2.5.4 Ketersediaan data jangka panjang Perhatikan bahwa semua pendekatan yang dibahas di atas hanya membuktikan fakta bahwa sebuah blok telah diterbitkan sama sekali, dan tersedia sekarang. Blok nantinya bisa menjadi tidak tersedia karena berbagai alasan: node mati, node sengaja menghapus riwayat data, dan lain-lain. Whitepaper yang layak disebutkan untuk mengatasi masalah ini adalah Polyshard [3], yang menggunakan kode penghapusan untuk membuat blok tersedia di seluruh pecahan meskipun beberapa pecahan benar-benar kehilangan datanya. Sayangnya pendekatan khusus mereka memerlukan hal ini semua pecahan untuk mengunduh blok dari semua pecahan lainnya, yang merupakan penghalang mahal. Ketersediaan jangka panjang bukanlah suatu masalah yang mendesak: karena tidak ada peserta dalam sistem diharapkan mampu memvalidasi semua rantai di semua
pecahan, keamanan protokol shard perlu dirancang sedemikian rupa cara agar sistem tetap aman meskipun beberapa blok lama di beberapa pecahan menjadi sama sekali tidak tersedia.
Nightshade
3.1 De cadenas de fragmentos a fragmentos de fragmentos El modelo de fragmentación con cadenas de fragmentos y una cadena de balizas es muy poderoso pero tiene ciertas complejidades. En particular, es necesario ejecutar la regla de elección de la bifurcación. en cada cadena por separado, la regla de elección de bifurcación en las cadenas de fragmentos y la baliza La cadena debe construirse de manera diferente y probarse por separado. En Nightshade modelamos el sistema como un único blockchain, en el que cada El bloque contiene lógicamente todas las transacciones para todos los fragmentos y cambia el Estado completo de todos los fragmentos. Físicamente, sin embargo, ningún participante descarga el estado completo o el bloque lógico completo. En cambio, cada participante de la red sólo mantiene el estado que corresponde a los fragmentos para los que validan las transacciones, y la lista de todas las transacciones en el bloque se divide en físicas trozos, un trozo por fragmento. En condiciones ideales, cada bloque contiene exactamente un fragmento por fragmento por bloque, que corresponde aproximadamente al modelo con cadenas de fragmentos en el que el Las cadenas de fragmentos producen bloques con la misma velocidad que la cadena de baliza. Sin embargo, Debido a retrasos en la red, es posible que falten algunos fragmentos, por lo que en la práctica cada bloque contiene uno o cero fragmentos por fragmento. Consulte la sección 3.3 para obtener detalles sobre cómo Se producen bloques. Figura 16: Un modelo con cadenas de fragmentos a la izquierda y con una cadena que tiene bloques divididos en trozos a la derecha
3.2 Consenso Los dos enfoques dominantes para el consenso en la década de blockchains hoy son el cadena más larga (o más pesada), en la que la cadena que tiene más trabajo o participación utilizado para construirlo se considera canónico, y BFT, en el que para cada bloque algunos un conjunto de validator alcanzan un consenso BFT. En los protocolos propuestos recientemente, este último es el enfoque más dominante, ya que proporciona una finalidad inmediata, mientras que en la cadena más larga se necesitan más bloques. que se construirá encima del bloque para asegurar la finalidad. A menudo para un significado seguridad: el tiempo que lleva construir un número suficiente de bloques supone el orden de horas. Usar el consenso BFT en cada bloque también tiene desventajas, tales como: 1. El consenso BFT implica una cantidad considerable de comunicación. mientras Los avances recientes permiten alcanzar el consenso en tiempo lineal en número. de los participantes (ver, por ejemplo, [4]), todavía se nota una sobrecarga por bloque; 2. Es inviable que todos los participantes de la red participen en el BFT consenso por bloque, por lo que normalmente sólo un subconjunto de participantes muestreados aleatoriamente alcanza el consenso. Un conjunto muestreado aleatoriamente puede ser, en principio, se corrompe adaptativamente y, en teoría, se puede crear una bifurcación. el sistema cualquiera de los dos necesita ser modelado para estar listo para tal evento y, por lo tanto, aún tener una regla de elección de bifurcación además del consenso BFT, o estar diseñado para cerrar abajo en tal evento. Cabe mencionar que algunos diseños, como Algorand [5], reducen significativamente la probabilidad de corrupción adaptativa. 3. Lo más importante es que el sistema se detiene si 1 3 o más de todos los participantes son fuera de línea. Por lo tanto, cualquier falla temporal de la red o una división de la red puede detener completamente el sistema. Idealmente, el sistema debe poder continuar operar mientras al menos la mitad de los participantes estén en línea (la mayoría Los protocolos basados en cadena continúan funcionando incluso si menos de la mitad de los participantes están en línea, pero la conveniencia de esta propiedad es más discutible. dentro de la comunidad). Un modelo híbrido en el que el consenso utilizado es el más pesado La cadena, pero algunos bloques se finalizan periódicamente utilizando un dispositivo de finalidad BFT mantienen las ventajas de ambos modelos. Estos dispositivos de finalidad BFT son Casper FFG [6] usado en Ethereum 2.0 8, Casper CBC (ver https://vitalik. ca/general/2018/12/05/cbc_casper.html) y ABUELO (ver https:// medium.com/polkadot-network/d08a24a021b5) utilizado en Polkadot. Nightshade utiliza el consenso de cadena más pesado. Específicamente cuando un bloque productor produce un bloque (ver sección 3.3), puede recolectar firmas de otros productores de bloques y validators que acrediten el bloque anterior. Ver sección 3.8 para obtener detalles sobre cómo se agrega una cantidad tan grande de firmas. el peso 8Vea también la sesión de pizarra con Justin Drake para obtener una descripción detallada de Casper. FFG y cómo se integra con el consenso de la cadena más pesada de GHOST aquí: https://www. youtube.com/watch?v=S262StTwkmode un bloque es entonces la participación acumulada de todos los firmantes cuyas firmas son incluido en el bloque. El peso de una cadena es la suma de los pesos de los bloques. Además del consenso de cadena más pesado, utilizamos un dispositivo de finalidad que utiliza las certificaciones para finalizar los bloques. Para reducir la complejidad del sistema, utilizamos un dispositivo de finalidad que no influye de ninguna manera en la regla de elección de la bifurcación, y en su lugar sólo introduce condiciones de corte adicionales, de modo que una vez que un bloque es finalizado por el dispositivo de finalidad, una bifurcación es imposible a menos que un porcentaje muy grande del total de la apuesta se reduce drásticamente. Casper CBC es un dispositivo de finalidad, y Actualmente modela con Casper CBC en mente. También trabajamos en un protocolo BFT separado llamado TxFlow. En el momento de Al escribir este documento no está claro si se utilizará TxFlow en lugar de Casper. CBC. Sin embargo, observamos que la elección del dispositivo final es en gran medida ortogonal al resto del diseño. 3.3 producción de bloques En Nightshade hay dos roles: productores de bloques y validators. en cualquier punto el sistema contiene w productores de bloques, w = 100 en nuestros modelos, y wv validators, en nuestro modelo v = 100, wv = 10, 000. El sistema es Prueba de participación, lo que significa que tanto los productores de bloques como los validators tienen algún número de moneda (denominada "tokens") bloqueada por un período de tiempo que excede con creces el tiempo que dedican a realizar sus tareas de construcción y validación de la cadena. Como ocurre con todos los sistemas de Prueba de participación, no todos los productores de bloques w y no todos los wv validators son entidades diferentes, ya que eso no se puede hacer cumplir. cada uno de los productores de bloques w y los wv validators, sin embargo, tienen una estaca. El sistema contiene n fragmentos, n = 1000 en nuestro modelo. Como se menciona en sección 3.1, en Nightshade no hay cadenas de fragmentos; en cambio, todos los productores de bloques y validator están construyendo un único blockchain, al que nos referimos como cadena principal. El estado de la cadena principal se divide en n fragmentos y cada bloque productor y validator en cualquier momento solo han descargado localmente un subconjunto de el estado que corresponde a algún subconjunto de los fragmentos, y solo el proceso y validar transacciones que afecten a esas partes del estado. Para convertirse en productor de bloques, un participante de la red bloquea algunos grandes cantidad de tokens (una participación). El mantenimiento de la red se realiza en épocas, donde una época es un período de tiempo del orden de días. Los participantes con lo que está en juego más al comienzo de una época particular es el bloque productores de esa época. Cada productor de bloques se asigna a fragmentos sw (digamos sw = 40, lo que haría sww/n = 4 productores de bloques por fragmento). el bloque El productor descarga el estado del fragmento al que están asignados antes de la época. comienza, y a lo largo de la época recopila transacciones que afectan ese fragmento, y los aplica al Estado. Para cada bloque b en la cadena principal, y para cada fragmento s, hay uno de los productores de bloques asignados a s, quien es responsable de producir la parte de b relacionada al fragmento. La parte de b relacionada con el fragmento s se llama fragmento y contiene el lista de las transacciones para que el fragmento se incluya en b, así como el merkleraíz del estado resultante. b en última instancia sólo contendrá un encabezado muy pequeño de el fragmento, es decir, la raíz merkle de todas las transacciones aplicadas (consulte la sección 3.7.1 para detalles exactos), y la raíz merkle del estado final. A lo largo del resto del documento, a menudo nos referimos al productor de bloques. que es responsable de producir un fragmento en un momento particular para un fragmento en particular como productor de trozos. El productor de fragmentos es siempre uno de los productores de bloques. Los productores de bloques y los productores de trozos rotan cada bloque según a un horario fijo. Los productores de bloques tienen un pedido y producen repetidamente. bloques en ese orden. P.ej. Si hay 100 productores de bloques, el primer bloque Los productores son responsables de producir los bloques 1, 101, 201, etc., el segundo es responsable de producir 2, 102, 202, etc.). Dado que la producción de trozos, a diferencia de la producción de bloques, requiere mantener el estado, y para cada fragmento solo los productores de bloques sww/n mantienen el estado por fragmento, en consecuencia, solo los productores de bloques sww/n rotan para crear trozos. P.ej. con las constantes anteriores con cuatro productores de bloques asignados a En cada fragmento, cada productor de bloques creará fragmentos una vez cada cuatro bloques. 3.4 Garantizar la disponibilidad de datos Para garantizar la disponibilidad de datos utilizamos un enfoque similar al de Polkadot descrito en la sección 2.5.3. Una vez que un productor de bloques produce un fragmento, crea una versión codificada de borrado con un código de bloque óptimo (w, ⌊w/6 + 1⌋) del trozo. Luego envían una parte del fragmento codificado de borrado (a esas partes las llamamos partes de fragmentos, o solo partes) a cada productor de bloques. Calculamos un árbol merkle que contiene todas las partes como las hojas, y el El encabezado de cada fragmento contiene la raíz merkle de dicho árbol. Las piezas se envían a los validators mediante mensajes onepart. Cada uno de esos mensajes contiene el encabezado del fragmento, el ordinal de la parte y el contenido de la parte. el El mensaje también contiene la firma del productor del bloque que produjo el chunk y la ruta merkle para demostrar que la parte corresponde al encabezado y es producido por el productor de bloques adecuado. Una vez que un productor de bloques recibe un bloque de la cadena principal, primero verifica si tenga mensajes de una parte para cada fragmento incluido en el bloque. Si no, el bloque no se procesa hasta que se recuperan los mensajes de una parte que faltan. Una vez que se reciben todos los mensajes de una parte, el productor del bloque recupera el partes restantes de los pares y reconstruye los fragmentos que mantienen el estado. El productor de bloques no procesa un bloque de la cadena principal si es por al menos un fragmento incluido en el bloque no tienen el mensaje de una parte correspondiente, o si al menos para un fragmento para el cual mantienen el estado no pueden reconstruir todo el trozo. Para que un fragmento en particular esté disponible es suficiente que ⌊w/6⌋+1 del bloque los productores tienen sus partes y les sirven. Así, mientras el número de Los actores maliciosos no superan ⌊w/3⌋ninguna cadena que tenga más de medio bloque. los productores que lo construyen pueden tener fragmentos no disponibles.Figura 17: Cada bloque contiene uno o cero fragmentos por fragmento, y cada fragmento tiene un código de borrado. Cada parte del fragmento codificado de borrado se envía a un lugar designado productor de bloques a través de un mensaje especial de una parte 3.4.1 Tratar con productores de bloques perezosos Si un productor de bloques tiene un bloque al que le falta un mensaje de una parte, podría optar por firmar aún así, porque si el bloque termina en la cadena, maximizará la recompensa para el productor del bloque. No hay riesgo para el bloque. productor ya que es imposible probar posteriormente que el productor del bloque no tenía el mensaje de una parte. Para solucionarlo, hacemos que cada fragmento sea productor al crear el fragmento para elija un color (rojo o azul) para cada parte del futuro fragmento codificado y guárdelo la máscara de bits del color asignado en el fragmento antes de codificarlo. cada una de las partes El mensaje contiene el color asignado a la pieza y el color se utiliza cuando calcular la raíz merkle de las partes codificadas. Si el productor del trozo se desvía del protocolo, se puede probar fácilmente, ya que la raíz de merkle no corresponden a mensajes de una parte, o los colores en los mensajes de una parte que corresponden a la raíz de merkle no coincidirán con la máscara en el fragmento. Cuando un productor de bloques firma en un bloque, incluye una máscara de bits de todos los piezas rojas que recibieron por los trozos incluidos en el bloque. Publicar un la máscara de bits incorrecta es un comportamiento que se puede recortar. Si un productor de bloques no ha recibido un mensaje de una parte, no tienen forma de saber el color del mensaje, y Por lo tanto, tienen un 50% de posibilidades de ser eliminados si intentan firmar a ciegas el bloque. 3.5 Solicitud de transición de estado Los productores de fragmentos sólo eligen qué transacciones incluir en el fragmento, pero no aplique la transición de estado cuando produzcan un fragmento. En consecuencia,
el encabezado del fragmento contiene la raíz merkle del estado merkelizado como antes se aplican las transacciones en el fragmento. Las transacciones solo se aplican cuando un bloque completo que incluye el fragmento se procesa. Un participante solo procesa un bloque si 1. El bloque anterior fue recibido y procesado; 2. Para cada fragmento, el participante no mantiene el estado que tiene. visto el mensaje de una parte; 3. Para cada fragmento, el participante mantiene el estado porque tiene el trozo completo. Una vez que se procesa el bloque, para cada fragmento para el cual el participante mantiene el estado, aplican las transacciones y calculan el nuevo estado a partir de que se aplican las transacciones, después de lo cual están listas para producir los fragmentos para el siguiente bloque, si están asignados a algún fragmento, ya que tienen la raíz merkle del nuevo estado merkelizado. 3.6 Transacciones y recibos entre fragmentos Si una transacción necesita afectar a más de un fragmento, debe realizarse consecutivamente. ejecutado en cada fragmento por separado. La transacción completa se envía al primer fragmento. afectado, y una vez que la transacción se incluye en el fragmento de dicho fragmento, y se aplica después de que el fragmento se incluye en un bloque, genera el llamado recibo transacción, que se enruta al siguiente fragmento en el que la transacción debe ser ejecutado. Si se requieren más pasos, la ejecución de la transacción de recibo genera una nueva transacción de recibo y así sucesivamente. 3.6.1 Duración de la transacción del recibo Es deseable que la transacción de recibo se aplique en el bloque que sigue inmediatamente al bloque en el que se generó. La transacción del recibo es sólo generado después de que el bloque anterior fue recibido y aplicado por los productores de bloques que mantienen el fragmento de origen, y debe ser conocido en el momento en que El fragmento para el siguiente bloque es producido por los productores de bloques del destino. fragmento. Por lo tanto, el recibo debe comunicarse desde el fragmento de origen al fragmento de destino en el corto período de tiempo entre esos dos eventos. Sea A el último bloque producido que contiene una transacción t que genera un recibo r. Sea B el siguiente bloque producido (es decir, un bloque que tiene A como su bloque anterior) que queremos contener r. Sea t estar en el fragmento a y r en el fragmento b. La vida útil del recibo, también representada en la figura 18, es la siguiente: Elaborar y almacenar los recibos. El cpa del productor de fragmentos para fragmentos a recibe el bloque A, aplica la transacción t y genera el recibo r. cpa luego almacena todos los recibos producidos en su almacenamiento interno persistente indexado por la identificación del fragmento de origen.Distribuyendo los recibos. Una vez que cpa esté listo para producir el fragmento para fragmento a para el bloque B, obtienen todos los recibos generados al aplicar las transacciones del bloque A para el fragmento a y los incluyen en el fragmento para shrad a en el bloque B. Una vez que se genera dicho fragmento, cpa produce su borrado codificado versión y todos los mensajes onepart correspondientes. cpa sabe qué productores de bloques mantienen el estado completo para qué fragmentos. Para un productor de bloques en particular pb cpa incluye los ingresos que resultaron de aplicar las transacciones del bloque A para el fragmento a que tiene como destino cualquiera de los fragmentos que le interesan a bp en el mensaje de una parte cuando distribuyeron el fragmento para el fragmento a en el bloque B (consulte la figura 17, que muestra los recibos incluidos en el mensaje de una parte). Recibir los recibos. Recuerde que los participantes (tanto productores de bloques como validators) no procesan bloques hasta que tengan mensajes de una parte. para cada fragmento incluido en el bloque. Por lo tanto, cuando un participante en particular aplica el bloque B, tiene todos los mensajes de una parte que corresponden a fragmentos en B, y por lo tanto tienen todos los recibos entrantes que tienen los fragmentos el participante mantiene el estado como destino. Al aplicar el transición de estado para un fragmento en particular, el participante aplica ambos recibos que han recopilado para el fragmento en los mensajes de una parte, así como todos las transacciones incluidas en el propio fragmento. Figura 18: La vida útil de una transacción de recibo 3.6.2 Manejar demasiados recibos Es posible que el número de recibos dirigidos a un fragmento concreto en un bloque en particular es demasiado grande para ser procesado. Por ejemplo, considere la figura 19, en en el que cada transacción en cada fragmento genera un recibo dirigido al fragmento 1. En el siguiente bloque, la cantidad de recibos que el fragmento 1 debe procesar es comparable a la carga que todos los fragmentos combinados procesaron mientras se manipulaban el bloque anterior.
Figura 19: Si todos los recibos apuntan al mismo fragmento, es posible que el fragmento no tenga la capacidad de procesarlos Para solucionarlo utilizamos una técnica similar a la utilizada en QuarkChain 9. Específicamente, para cada fragmento, el último bloque B y el último fragmento dentro de ese Se registra el bloque desde el cual se aplicaron los recibos. Cuando el nuevo fragmento esté creado, los recibos se aplican en orden primero a partir de los fragmentos restantes en B, y luego en bloques que siguen a B, hasta que el nuevo fragmento esté lleno. En condiciones normales circunstancias con una carga equilibrada, generalmente resultará en todos los recibos que se está aplicando (y por lo tanto, el último fragmento del último bloque se registrará para cada trozo), pero durante los momentos en que la carga no está equilibrada, y un particular Shard recibe una cantidad desproporcionada de recibos, esta técnica les permite procesarse respetando los límites en el número de transacciones incluidas. Tenga en cuenta que si dicha carga desequilibrada permanece durante mucho tiempo, el retraso desde la creación del recibo hasta que la aplicación pueda seguir creciendo indefinidamente. uno forma de abordarlo es descartar cualquier transacción que genere un recibo dirigido a un fragmento que tiene un retraso de procesamiento que excede alguna constante (por ejemplo, una época). Considere la figura 20. En el bloque B, el fragmento 4 no puede procesar todos los recibos, por lo que solo procesa el origen de los recibos desde hasta el fragmento 3 en el bloque A, y lo registra. En el bloque C se incluyen los recibos hasta el fragmento 5 del bloque B, y luego, en el bloque D, el fragmento se pone al día y procesa todos los recibos restantes en bloque B y todos los recibos del bloque C. 3.7 Validación de fragmentos Un fragmento producido para un fragmento en particular (o un bloque de fragmentos producido para una cadena de fragmentos particular en el modelo con cadenas de fragmentos) solo puede ser validado por el 9Vea el episodio de la pizarra con QuarkChain aquí: https://www.youtube.com/watch? v=opEtG6NM4x4, en el que se analiza el enfoque de las transacciones entre fragmentos, entre otros cosasFigura 20: Procesamiento de recibos retrasados participantes que mantienen el estado. Pueden ser productores de bloques, validators, o simplemente testigos externos que descargaron el estado y validaron el fragmento en donde almacenan activos. En este documento asumimos que la mayoría de los participantes no pueden almacenar al Estado una gran parte de los fragmentos. Vale la pena mencionar, sin embargo, que hay blockchains fragmentados que están diseñados con la suposición de que la mayoría de los participantes tienen capacidad para almacenar el estado y validar la mayoría de los fragmentos, como QuarkChain. Dado que solo una fracción de los participantes tiene el estado para validar el fragmento fragmentos, es posible corromper adaptativamente solo a los participantes que tienen la estado y aplicar una transición de estado no válida. Se propusieron múltiples diseños de fragmentación que muestrean validators cada pocos días, y dentro de un día cualquier bloque en la cadena de fragmentos que tenga más de 2/3 de firmas de los validator asignados a dicho fragmento se considera inmediatamente final. Con tal enfoque un adversario adaptativo sólo necesita corromper 2n/3+1 de los validators en una cadena de fragmentos para aplicar una transición de estado no válida, que, Aunque probablemente sea difícil de lograr, no es un nivel de seguridad suficiente para un público. blockchain. Como se analizó en la sección 2.3, el enfoque común es permitir una cierta ventana de tiempo después de que se crea un bloque para cualquier participante que tenga estado (ya sea es un productor de bloques, un validator o un observador externo) para cuestionar su validez. Estos participantes se llaman pescadores. Para que un pescador pueda impugnar un bloque no válido, se debe garantizar que dicho bloque esté disponible para ellos. La disponibilidad de datos en Nightshade se analiza en la sección 3.4. En Nightshade, una vez que se produce un bloque, los fragmentos no fueron validados por cualquiera excepto el productor de fragmentos real. En particular, el productor de bloques que sugirió que el bloque naturalmente no tenía el estado para la mayoría de los fragmentos, yno pudo validar los fragmentos. Cuando se produce el siguiente bloque, contiene certificaciones (consulte la sección 3.2) de múltiples productores de bloques y validators, pero dado que la mayoría de los productores de bloques y validators no mantienen el estado Además, para la mayoría de los fragmentos, un bloque con solo un fragmento no válido recopilará significativamente más de la mitad de las certificaciones y seguirá estando en la lista más pesada. cadena. Para abordar este problema, permitimos que cualquier participante que mantenga el estado de un fragmento para presentar un desafío en la cadena por cualquier fragmento no válido producido en ese fragmento. 3.7.1 Desafío de validez estatal Una vez que un participante detecta que un fragmento en particular no es válido, debe proporcionar una prueba de que el fragmento no es válido. Dado que la mayoría de los participantes de la red no mantienen el estado del fragmento en el que se encuentra el fragmento no válido producida, la prueba debe tener suficiente información para confirmar que el bloque es inválido sin tener el estado. Establecemos un límite Ls de la cantidad de estado (en bytes) que una sola transacción Puede leer o escribir de forma acumulativa. Cualquier transacción que toque más de Ls. El estado se considera inválido. Recuerde de la sección 3.5 que el trozo en un bloque particular B sólo contiene las transacciones a aplicar, pero no la nueva raíz estatal. La raíz del estado incluida en el fragmento del bloque B es el estado root antes de aplicar dichas transacciones, pero después de aplicar las transacciones de el último fragmento en el mismo fragmento antes del bloque B. Un actor malicioso que desea aplicar una transición de estado no válida incluiría una raíz de estado incorrecta en el bloque B que no corresponde al estado raíz que resulta de aplicar las transacciones en el fragmento anterior. Ampliamos la información que un productor de fragmentos incluye en el fragmento. En lugar de simplemente incluir el estado después de aplicar todas las transacciones, en su lugar incluye una raíz de estado después de aplicar cada conjunto contiguo de transacciones que leer y escribir colectivamente Ls bytes de estado. Con esta información para el pescador para crear un desafío que una transición de estado se aplica incorrectamente es suficiente encontrar la primera raíz de estado no válida e incluir solo Ls bytes de estado que se ven afectados por las transacciones entre la última raíz del estado (que fue válido) y la raíz del estado actual con las pruebas de merkle. Entonces cualquier participante puede validar las transacciones en el segmento y confirmar que el fragmento es inválido. De manera similar, si el productor del fragmento intentara incluir transacciones que leyeran y escribir más de Ls bytes de estado, para el desafío basta con incluir los primeros Ls bytes que toca con las pruebas merkle, que serán suficientes para aplicar las transacciones y confirmar que hay un momento en el que se intenta Se realiza lectura o escritura de contenido más allá de Ls bytes.
3.7.2 Pescadores y transacciones rápidas entre fragmentos. Como se analizó en la sección 2.3, una vez que asumimos que los fragmentos (o fragmentos) bloques en el modelo con cadenas de fragmentos) pueden no ser válidos e introducir un desafío período, afecta negativamente la finalidad y, por lo tanto, la comunicación entre fragmentos. en En particular, el fragmento de destino de cualquier transacción entre fragmentos no puede estar seguro el fragmento o bloque de origen es definitivo hasta que finaliza el período de desafío (ver figura 21). Figura 21: Esperar el período de impugnación antes de aplicar un recibo La forma de abordarlo de manera que se realicen transacciones entre fragmentos. instantáneo es que el fragmento de destino no espere el período de desafío después de que se publique la transacción del fragmento de origen y aplique la transacción del recibo inmediatamente, pero luego revertir el fragmento de destino junto con el origen fragmento si más tarde se descubre que el fragmento o bloque original no es válido (consulte la figura 22). Esto se aplica de forma muy natural al diseño Nightshade en el que el fragmento Las cadenas no son independientes, sino que todos los fragmentos se publican. juntos en el mismo bloque de cadena principal. Si se determina que algún fragmento no es válido, el todo el bloque con ese fragmento se considera inválido y todos los bloques construidos en él encima. Ver figura 23. Ambos enfoques anteriores proporcionan atomicidad suponiendo que el desafío el período es lo suficientemente largo. Usamos el último enfoque, ya que proporcionar transacciones rápidas entre fragmentos en circunstancias normales supera los inconvenientes de el fragmento de destino retrocede debido a una transición de estado no válida en uno de los fragmentos de origen, lo cual es un evento extremadamente raro. 3.7.3 Ocultar validators La existencia de los desafíos ya reduce significativamente la probabilidad de corrupción adaptativa, ya que para finalizar una parte con un estado de transición inválidoFigura 22: Aplicar recibos inmediatamente y revertir el destino cadena si la cadena fuente tenía un bloque no válido Figura 23: Desafío del pescador en Nightshade El período de desafío el adversario adaptativo necesita corromper a todos los participantes. que mantienen el estado del fragmento, incluidos todos los validator. Estimar la probabilidad de que ocurra tal evento es extremadamente complejo, ya que no sharded blockchain ha estado activo el tiempo suficiente para intentar cualquier ataque de este tipo. Sostenemos que la probabilidad, aunque extremadamente baja, sigue siendo suficientemente grande para un sistema que se espera que ejecute transacciones multimillonarias y ejecutar operaciones financieras a nivel mundial. Hay dos razones principales para esta creencia: 1. La mayoría de los validators de las cadenas de Prueba de Participación y mineros del
Las cadenas de prueba de trabajo están incentivadas principalmente por las ventajas financieras. si un adversario adaptativo les ofrece más dinero que el retorno esperado de operar honestamente, es razonable esperar que muchos validators aceptará la oferta. 2. Muchas entidades validan las cadenas de prueba de participación de manera profesional, y Se espera que un gran porcentaje de la participación en cualquier cadena sea de dichas entidades. El número de tales entidades es lo suficientemente pequeño para una adversario adaptativo para conocer a la mayoría de ellos personalmente y tener una buena comprensión de su inclinación a corromperse. Damos un paso más para reducir la probabilidad de corrupción adaptativa al ocultar qué validator están asignados a cada fragmento. La idea es remotamente similar a la forma en que Algorand [5] oculta validators. Es fundamental tener en cuenta que incluso si los validator están ocultos, como en Algorand o como se describe a continuación, la corrupción adaptativa todavía es posible en teoría. mientras El adversario adaptativo no conoce a los participantes que crearán o validarán. un bloque o un trozo, los propios participantes saben que realizarán tal tarea y tener una prueba criptográfica de ello. Así, el adversario puede difundir su intención de corromper y pagar a cualquier participante que proporcione tal prueba criptográfica. Sin embargo, observamos que dado que el adversario no conocen los validator que están asignados al fragmento que quieren corromper, no tienen otra opción que transmitir su intención de corromper un fragmento en particular a toda la comunidad. En ese punto es económicamente benéfico para cualquier persona honesta. participante para activar un nodo completo que valide ese fragmento, ya que hay un alto posibilidad de que aparezca un bloque no válido en ese fragmento, lo cual es una oportunidad para crea un desafío y recolecta la recompensa asociada. Para no revelar los validators que están asignados a un fragmento en particular, hacemos lo siguiente (ver figura 24): Usando VRF para obtener la tarea. Al comienzo de cada época cada validator usa un VRF para obtener una máscara de bits de los fragmentos a los que está asignado validator. La máscara de bits de cada validator tendrá bits Sw (consulte la sección 3.3 para conocer la definición de SW). Luego, el validator recupera el estado de los fragmentos correspondientes y durante la época para cada bloque recibido valida los fragmentos que corresponden a los fragmentos a los que está asignado el validator. Regístrate en bloques en lugar de trozos. Dado que la asignación de fragmentos está oculta, validator no puede firmar fragmentos. En cambio, siempre firma en todo el bloque, por lo que no revela qué fragmentos valida. Específicamente, cuando validator recibe un bloque y valida todos los fragmentos, crea un mensaje que atestigua que todos los fragmentos en todos los fragmentos a los que está asignado el validator son válido (sin indicar de ninguna manera cuáles son esos fragmentos), o un mensaje que contiene una prueba de una transición de estado no válida si algún fragmento no es válido. Ver el sección 3.8 para obtener detalles sobre cómo se agregan dichos mensajes, sección 3.7.4 para los detalles sobre cómo evitar que validators se aprovechen de los mensajes de otros validators, y la sección 3.7.5 para obtener detalles sobre cómo recompensar y castigar validators en caso de que realmente se produzca una impugnación exitosa de una transición de estado no válida.Figura 24: Ocultando los validators en Nightshade 3.7.4 Comprometerse-Revelar Uno de los problemas comunes con validators es que un validator puede omitir la descarga del estado y validar los fragmentos y bloques, y en su lugar observar la red, ver lo que envían los otros validators y repetir sus mensajes. Un validator que sigue dicha estrategia no proporciona ningún beneficio adicional. seguridad para la red, pero recoge recompensas. Una solución común para este problema es que cada validator proporcione una prueba que realmente validaron el bloque, por ejemplo proporcionando un seguimiento único de aplicar la transición estatal, pero tales pruebas aumentan significativamente el costo de validación. Figura 25: comprometerse-revelar
En su lugar, hacemos que los validators se comprometan por primera vez con el resultado de la validación (ya sea el mensaje que da fe de la validez de los fragmentos, o la prueba de una invalidez transición de estado), espere un cierto período y solo entonces revele el resultado de validación real, como se muestra en la figura 25. El período de confirmación no se cruza con el período de revelación y, por lo tanto, un validator perezoso no puede imitar a los validators honestos. Además, si un validator deshonesto se comprometió con un mensaje que da fe de la validez de los fragmentos asignados, y al menos un fragmento no era válido, una vez que se demostrado que el fragmento no es válido, validator no puede evitar la reducción, ya que, Como mostramos en la sección 3.7.5, la única manera de no ser cortado en tal situación es presentar un mensaje que contiene una prueba de la transición de estado no válida que coincide con el compromiso. 3.7.5 Manejando desafíos Como se analizó anteriormente, una vez que un validator recibe un bloque con un fragmento no válido, Primero preparan una prueba de la transición de estado no válida (ver sección 3.7.1), luego comprometerse con dicha prueba (ver 3.7.4) y después de un período revelar el desafío. Una vez incluido el desafío revelado en un bloque, sucede lo siguiente: 1. Todas las transiciones de estado que ocurrieron desde el bloque que contiene el fragmento no válido hasta que se obtenga el bloque en el que se incluye el desafío revelado. anulado. El estado ante el bloque que incluye el desafío revelado se considera el mismo que el estado anterior al bloque que contenía el trozo inválido. 2. Dentro de un cierto período de tiempo cada validator debe revelar su máscara de bits de los fragmentos que validan. Dado que la máscara de bits se crea a través de un VRF, si fueron asignados al fragmento que tenía la transición de estado no válida, No puedo evitar revelarlo. Cualquier validator que no revele la máscara de bits se supone que está asignado al fragmento. 3. Cada validator que después de dicho período se encuentre asignado al fragmento, que se comprometió con algún resultado de validación para el bloque que contiene el fragmento inválido y que no reveló la prueba de transición de estado inválido que corresponde a su compromiso se reduce. 4. Cada validator recibe una nueva asignación de fragmentos y se programa una nueva época. para comenzar después de un tiempo suficiente para que todos los validators descarguen el estado, como se muestra en la figura 26. Tenga en cuenta que desde el momento en que los validator revelan los fragmentos que se les asignan hasta que comienza la nueva época, la seguridad del sistema se reduce desde el Se revela la asignación de fragmentos. Los participantes de la red deben mantenerlo. en mente al utilizar la red durante dicho período. 3.8 Agregación de firmas Para que un sistema con cientos de fragmentos funcione de forma segura, queremos tener en el orden de 10, 000 o más validators. Como se discutió en la sección 3.7, queremos que cadaFigura 26: Manejando el desafío validator para publicar un compromiso con un determinado mensaje y una firma en promedio una vez por bloque. Incluso si los mensajes de confirmación fueran los mismos, agregar tal La firma BLS y su validación habrían sido prohibitivamente costosas. pero naturalmente, los mensajes de confirmación y revelación no son los mismos en validators, y por lo tanto necesitamos alguna forma de agregar dichos mensajes y las firmas en un forma que permita una validación rápida posterior. El enfoque específico que utilizamos es el siguiente: Validadores que se unen a productores de bloques. Los productores de bloques son conocidos. algún tiempo antes de que comience la época, ya que necesitan algo de tiempo para descargar el estado antes de que comience la época y, a diferencia de los validators, los productores de bloques son no oculto. Cada productor de bloques tiene v validator ranuras. Los validadores envían propuestas fuera de la cadena a los productores de bloques para ser incluidos como uno de sus v validators. Si un productor de bloques desea incluir un validator, envía un transacción que contiene la solicitud inicial fuera de la cadena del validator, y el firma del productor del bloque que hace que validator se una al productor del bloque. Tenga en cuenta que los validators asignados a los productores de bloques no necesariamente valide los mismos fragmentos para los que el productor de bloques produce fragmentos. si un validator se aplicó para unir múltiples productores de bloques, solo la transacción de el primer productor de bloques tendrá éxito. Los productores de bloques recopilan compromisos. El productor de bloques recopila constantemente los mensajes de confirmación y revelación de los validator. Una vez que se acumula una cierta cantidad de dichos mensajes, el productor del bloque calcula un merkle árbol de estos mensajes, y envía a cada validator la raíz de merkle y el camino merkle a su mensaje. El validator valida el camino y se registra la raíz de merkle. Luego, el productor del bloque acumula una firma BLS en el raíz de merkle de validators, y publica solo la raíz de merkle y el firma acumulada. El productor del bloque también firma sobre la validez del firma múltiple utilizando una firma ECDSA barata. Si la firma múltiple no coincide con la raíz de merkle enviada o la máscara de bits de los validators participantes, es un comportamiento que se puede recortar. Al sincronizar la cadena, un participante puede optar por validar todas las firmas BLS de validators (lo cual es extremadamente costoso ya que implica agregar las claves públicas de validators), o sololas firmas ECDMA de los productores de bloques y se basan en el hecho de que el El productor de bloques no fue cuestionado ni recortado. Uso de transacciones en cadena y pruebas merkle para desafíos. eso Se puede observar que no tiene ningún valor revelar mensajes de validators si no Se detectó una transición de estado no válida. Sólo los mensajes que contienen la información real Es necesario revelar pruebas de una transición de estado inválida, y sólo para tales mensajes. es necesario demostrar que coinciden con el compromiso anterior. El mensaje necesita ser revelado con dos propósitos: 1. Para iniciar realmente la reversión de la cadena al momento anterior al transición de estado no válida (ver sección 3.7.5). 2. Para demostrar que el validator no intentó dar fe de la validez del trozo no válido. En cualquier caso debemos abordar dos cuestiones: 1. El compromiso real no se incluyó en la cadena, solo la raíz merkle del confirmar agregado con otros mensajes. El validator necesita utilizar el ruta merkle proporcionada por el productor del bloque y su compromiso original con demostrar que se comprometieron con el desafío. 2. Es posible que todos los validator asignados al fragmento con el valor no válido La transición de estado se asigna a productores de bloques corruptos que los están censurando. Para evitarlo, les permitimos enviar sus revelaciones. como una transacción regular en cadena y evitar la agregación. Esto último sólo se permite para las pruebas de transición de estado inválida, que son extremadamente raro y, por lo tanto, no debería generar spam en los bloques. La última cuestión que debe abordarse es que los productores de bloques pueden optar por no participar en la agregación de mensajes o censurar intencionalmente validators concretos. Lo hacemos económicamente desventajoso al hacer que el bloque Recompensa al productor proporcional al número de validators que se les asignen. nosotros También tenga en cuenta que dado que los productores de bloques entre épocas se cruzan en gran medida (ya que siempre son los primeros w participantes con la apuesta más alta), los validators pueden atenerse en gran medida a trabajar con los mismos productores de bloques, y así reducir el riesgo de ser asignados a un productor de bloques que los censuró en el pasado. 3.9 Cadena de instantáneas Dado que los bloques de la cadena principal se producen con mucha frecuencia, descargar el historial completo podría resultar caro muy rápidamente. Es más, dado que cada El bloque contiene una firma BLS de una gran cantidad de participantes, solo la agregación de las claves públicas para verificar la firma podría resultar prohibitiva. caro también. Finalmente, dado que en un futuro previsible Ethereum 1.0 probablemente seguirá siendo uno de los blockchains más utilizados, que tiene una forma significativa de transferir activos desde
Cerca de Ethereum es un requisito y hoy se verifican las firmas BLS para garantizar La validez de bloques cercanos en el lado de Ethereum no es posible. Cada bloque de la cadena principal de Nightshade puede contener opcionalmente un Schnorr firma múltiple en el encabezado del último bloque que incluía dicho Schnorr multifirma. A estos bloques los llamamos bloques instantáneos. El primer bloque de cada época debe ser un bloque de instantáneas. Mientras trabajaba en una firma múltiple de este tipo, los productores de bloques también deben acumular las firmas BLS de los validators en el último bloque de instantáneas y agréguelas de la misma manera que se describe en sección 3.8. Dado que el conjunto de productores de bloques es constante a lo largo de la época, validar sólo los primeros bloques de instantáneas en cada época son suficientes suponiendo que en ningún momento punto, un gran porcentaje de productores de bloques y validators se confabularon y crearon un tenedor. El primer bloque de la época debe contener información suficiente para calcular los productores de bloques y validators para la época. Llamamos a la subcadena de la cadena principal que solo contiene la instantánea. bloquea una cadena de instantáneas. Crear una firma múltiple de Schnorr es un proceso interactivo, pero como Sólo es necesario realizarlo con poca frecuencia, cualquier proceso, por ineficiente que sea, será suficiente. Las firmas múltiples de Schnorr se pueden validar fácilmente en Ethereum, proporcionando así primitivas cruciales para una forma segura de realizar cross-blockchain comunicación. Para sincronizar con la cadena Near solo es necesario descargar toda la instantánea. bloquea y confirma que las firmas Schnorr son correctas (opcionalmente, también verifica las firmas BLS individuales de los validators), y luego solo sincroniza bloques de la cadena principal desde el último bloque de instantánea.
Nightshade
3.1 Dari rantai pecahan hingga pecahan pecahan Model sharding dengan rantai shard dan rantai suar sangat kuat namun mempunyai kompleksitas tertentu. Secara khusus, aturan pilihan garpu perlu dijalankan di setiap rantai secara terpisah, aturan pilihan garpu di rantai pecahan dan suar rantai harus dibuat secara berbeda dan diuji secara terpisah. Di Nightshade kami memodelkan sistem sebagai blockchain tunggal, yang masing-masingnya blok secara logis berisi semua transaksi untuk semua pecahan, dan mengubah seluruh keadaan dari semua pecahan. Namun secara fisik, tidak ada peserta yang mengunduhnya keadaan penuh atau blok logis penuh. Sebaliknya, masing-masing peserta jaringan saja mempertahankan status yang sesuai dengan pecahan yang transaksinya divalidasi, dan daftar semua transaksi di blok dibagi menjadi fisik potongan, satu potongan per pecahan. Dalam kondisi ideal, setiap blok berisi tepat satu bongkahan per pecahan per blok, yang kira-kira sesuai dengan model dengan rantai pecahan di mana rantai pecahan menghasilkan balok dengan kecepatan yang sama dengan rantai suar. Namun, karena penundaan jaringan, beberapa bagian mungkin hilang, jadi dalam praktiknya setiap blok berisi satu atau nol potongan per pecahan. Lihat bagian 3.3 untuk rincian tentang caranya blok diproduksi. Gambar 16: Model dengan rantai pecahan di sebelah kiri dan memiliki satu rantai blok terbelah menjadi beberapa bagian di sebelah kanan
3.2 Konsensus Dua pendekatan dominan terhadap konsensus di blockchains saat ini adalah rantai terpanjang (atau terberat), yaitu rantai yang mempunyai pekerjaan atau pasak paling banyak digunakan untuk membangunnya dianggap kanonik, dan BFT, di mana untuk setiap blok beberapa kumpulan validator mencapai konsensus BFT. Dalam protokol yang diusulkan baru-baru ini, pendekatan terakhir adalah pendekatan yang lebih dominan, karena hal ini memberikan penyelesaian langsung, sedangkan pada rantai terpanjang dibutuhkan lebih banyak blok untuk dibangun di atas blok untuk memastikan finalitas. Seringkali untuk sesuatu yang bermakna keamanan waktu yang dibutuhkan untuk membangun jumlah blok yang cukup urutan jam. Penggunaan konsensus BFT pada setiap blok juga memiliki kelemahan, seperti: 1. BFT konsensus melibatkan banyak komunikasi. Sementara kemajuan terkini memungkinkan konsensus dicapai dalam jumlah waktu yang linier peserta (lihat misalnya [4]), masih terlihat biaya overhead per blok; 2. Tidak mungkin semua peserta jaringan berpartisipasi dalam BFT konsensus per blok, sehingga biasanya hanya sebagian peserta yang diambil sampelnya secara acak yang mencapai konsensus. Himpunan sampel yang diambil secara acak, pada prinsipnya, dapat berupa dirusak secara adaptif, dan sebuah percabangan dalam teori dapat tercipta. Sistem keduanya perlu dicontohkan agar siap menghadapi peristiwa semacam itu, dan dengan demikian tetap saja memiliki aturan pilihan bercabang selain konsensus BFT, atau dirancang untuk ditutup turun dalam acara seperti itu. Perlu disebutkan bahwa beberapa desain, seperti Algorand [5], secara signifikan mengurangi kemungkinan korupsi adaptif. 3. Yang terpenting, sistem terhenti jika 1 3 atau lebih dari semua peserta adalah offline. Oleh karena itu, kesalahan jaringan sementara atau perpecahan jaringan dapat menghentikan sistem sepenuhnya. Idealnya sistem harus dapat terus berjalan beroperasi selama setidaknya setengah dari peserta sedang online (yang terberat protokol berbasis rantai terus beroperasi meskipun kurang dari separuh peserta sedang online, namun keinginan akan properti ini masih bisa diperdebatkan dalam komunitas). Model hibrida yang menggunakan konsensus adalah model yang paling berat rantai, tetapi beberapa blok diselesaikan secara berkala menggunakan gadget finalitas BFT mempertahankan keunggulan kedua model. Gadget finalitas BFT seperti itu Casper FFG [6] digunakan di Ethereum 2.0 8, Casper CBC (lihat https://vitalik. ca/general/2018/12/05/cbc_casper.html) dan GRANDPA (lihat https:// medium.com/polkadot-network/d08a24a021b5) digunakan di Polkadot. Nightshade menggunakan konsensus rantai terberat. Khususnya ketika sebuah blok produsen memproduksi sebuah blok (lihat bagian 3.3), mereka dapat mengumpulkan tanda tangan darinya produsen blok lain dan validators membuktikan blok sebelumnya. Lihat bagian 3.8 untuk rincian bagaimana sejumlah besar tanda tangan dikumpulkan. Beratnya 8Lihat juga sesi papan tulis bersama Justin Drake untuk gambaran mendalam tentang Casper FFG, dan bagaimana integrasinya dengan konsensus rantai terberat GHOST di sini: https://www. youtube.com/watch?v=S262StTwkmosuatu blok kemudian merupakan saham kumulatif dari semua penandatangan yang memiliki tanda tangan tersebut termasuk dalam blok tersebut. Berat suatu rantai adalah jumlah dari berat balok. Di atas konsensus rantai terberat, kami menggunakan gadget finalitas yang digunakan pengesahan untuk menyelesaikan blok. Untuk mengurangi kompleksitas sistem, kami menggunakan gadget finalitas yang tidak mempengaruhi aturan pilihan garpu dengan cara apa pun, dan sebagai gantinya hanya memperkenalkan kondisi pemotongan tambahan, sehingga satu blok menjadi satu diselesaikan oleh gadget finalitas, percabangan tidak mungkin dilakukan kecuali persentasenya sangat besar dari total taruhannya dipotong. Casper CBC adalah gadget finalitas, dan kami saat ini menjadi model dengan mempertimbangkan Casper CBC. Kami juga mengerjakan protokol BFT terpisah yang disebut TxFlow. Pada saat saat menulis dokumen ini, tidak jelas apakah TxFlow akan digunakan sebagai pengganti Casper KBK. Namun kami mencatat bahwa pilihan gadget finalitas sebagian besar ortogonal terhadap desain lainnya. 3.3 Blokir produksi Di Nightshade ada dua peran: produser blok dan validators. Kapan saja titik sistem berisi produsen blok w, w = 100 dalam model kita, dan wv validators, dalam model kami v = 100, wv = 10, 000. Sistemnya adalah Proof-of-Stake, artinya produsen blok dan validator memiliki sejumlah internal mata uang (disebut ”tokens”) dikunci untuk durasi waktu yang jauh melebihi waktu yang mereka habiskan untuk melaksanakan tugas mereka membangun dan memvalidasi rantai. Seperti semua sistem Proof of Stake, tidak semua produsen blok w dan tidak semua wv validator adalah entitas yang berbeda, karena hal tersebut tidak dapat diterapkan. Masing-masing dari produsen blok w dan wv validators, bagaimanapun, memiliki yang terpisah taruhan. Sistem berisi n pecahan, n = 1000 dalam model kami. Seperti disebutkan dalam bagian 3.1, di Nightshade tidak ada rantai pecahan, sebagai gantinya semua produsen blok dan validator sedang membangun satu blockchain, yang kami sebut sebagai rantai utama. Keadaan rantai utama dibagi menjadi n pecahan, dan setiap blok produser dan validator setiap saat hanya mengunduh sebagian dari secara lokal keadaan yang sesuai dengan beberapa subset pecahan, dan hanya memproses dan memvalidasi transaksi yang mempengaruhi bagian negara bagian tersebut. Untuk menjadi produsen blok, peserta jaringan mengunci beberapa blok besar jumlah tokens (satu taruhan). Pemeliharaan jaringan dilakukan dalam jangka waktu tertentu, di mana suatu zaman adalah periode waktu dalam urutan hari. Para peserta dengan taruhan terbesar pada awal periode tertentu adalah blok produsen untuk zaman itu. Setiap produser blok ditugaskan ke sw shards, (misalnya sw = 40, yang berarti sww/n = 4 produsen blok per pecahan). Blok produser mengunduh status shard yang ditugaskan kepada mereka sebelum epoch dimulai, dan sepanjang epoch mengumpulkan transaksi yang memengaruhi pecahan itu, dan menerapkannya pada negara. Untuk setiap blok b pada rantai utama, dan untuk setiap pecahan s, terdapat salah satu darinya menugaskan produser blok ke s yang bertanggung jawab memproduksi bagian b terkait ke pecahan. Bagian b yang berhubungan dengan shard s disebut chunk, dan berisi daftar transaksi pecahan yang akan dimasukkan ke dalam b, serta merkleakar dari keadaan yang dihasilkan. b pada akhirnya hanya akan berisi header yang sangat kecil chunk yaitu akar merkle dari semua transaksi yang diterapkan (lihat bagian 3.7.1 untuk rincian yang tepat), dan akar merkle dari keadaan akhir. Sepanjang sisa dokumen ini kita sering merujuk pada produsen blok yang bertanggung jawab untuk menghasilkan potongan pada waktu tertentu untuk pecahan tertentu sebagai produsen bongkahan. Produser bongkahan selalu menjadi salah satu produsen blok. Produsen blok dan produsen bongkahan merotasi setiap blok sesuai ke jadwal yang tetap. Produsen blok mendapat pesanan dan memproduksi berulang kali blok dalam urutan itu. Misalnya. jika ada 100 produsen blok, blok pertama produsen bertanggung jawab untuk memproduksi blok 1, 101, 201 dst, yang kedua adalah bertanggung jawab untuk memproduksi 2, 102, 202 dll). Karena produksi potongan, tidak seperti produksi blok, memerlukan pemeliharaan negara bagian, dan untuk setiap shard hanya produsen blok sww/n yang mempertahankan negara bagian tersebut per pecahan, hanya produsen blok sww/n yang dirotasi untuk membuat potongan. Misalnya. dengan konstanta di atas dengan empat produsen blok yang ditugaskan setiap pecahan, setiap produsen blok akan membuat potongan setiap empat blok. 3.4 Memastikan ketersediaan data Untuk memastikan ketersediaan data kami menggunakan pendekatan yang serupa dengan Polkadot dijelaskan di bagian 2.5.3. Setelah produsen blok memproduksi suatu bongkahan, mereka menciptakannya versi kode penghapusan dengan kode blok optimal (w, ⌊w/6 + 1⌋) dari potongan. Mereka kemudian mengirimkan satu bagian dari potongan kode penghapusan (kami menyebutnya potongan tersebut bagian potongan, atau hanya bagian) ke setiap produsen blok. Kami menghitung pohon merkle yang berisi semua bagian seperti daun, dan header setiap potongan berisi akar merkle dari pohon tersebut. Bagian-bagian tersebut dikirim ke validators melalui pesan satu bagian. Setiap pesan tersebut berisi header potongan, urutan bagian, dan isi bagian. Itu pesan juga berisi tanda tangan produser blok yang memproduksinya chunk dan jalur merkle untuk membuktikan bahwa bagian tersebut sesuai dengan header dan diproduksi oleh produsen blok yang tepat. Setelah produsen blok menerima blok rantai utama, pertama-tama mereka memeriksa apakah sudah diterima memiliki pesan satu bagian untuk setiap potongan yang disertakan dalam blok. Jika tidak, blokir tidak diproses sampai pesan satu bagian yang hilang diambil. Setelah semua pesan satu bagian diterima, produser blok mengambil pesan tersebut bagian yang tersisa dari rekan-rekannya dan merekonstruksi bagian-bagian yang mereka pegang negara bagian. Produsen blok tidak memproses blok rantai utama jika setidaknya untuk satu blok potongan yang termasuk dalam blok tersebut tidak memiliki pesan satu bagian yang sesuai, atau jika setidaknya untuk satu pecahan yang statusnya dipertahankan, mereka tidak dapat merekonstruksi seluruh potongan. Agar potongan tertentu tersedia, cukup ⌊w/6⌋+1 blok tersebut produsen memiliki bagiannya dan melayaninya. Jadi, selama jumlahnya aktor jahat tidak melebihi ⌊w/3⌋tidak ada rantai yang memiliki lebih dari setengah blok produsen yang membangunnya mungkin memiliki bagian yang tidak tersedia.Gambar 17: Setiap blok berisi satu atau nol bongkahan per pecahan, dan setiap bongkahan adalah kode penghapusan. Setiap bagian dari potongan kode penghapusan dikirim ke tempat yang ditunjuk blok produser melalui pesan satu bagian khusus 3.4.1 Berurusan dengan produsen blok yang malas Jika produsen blok mempunyai blok yang pesan satu bagiannya hilang, mereka mungkin memilih untuk tetap menandatanganinya, karena jika blok itu akhirnya dirantai akan memaksimalkan imbalan bagi produsen blok. Tidak ada risiko untuk pemblokiran tersebut produsen blok karena tidak mungkin untuk membuktikan kemudian bahwa produsen blok tidak memilikinya pesan satu bagian. Untuk mengatasinya kita membuat setiap potongan menjadi produser saat membuat potongan tersebut pilih warna (merah atau biru) untuk setiap bagian dari potongan yang dikodekan di masa depan, dan simpan bitmask warna yang ditetapkan dalam potongan sebelum dikodekan. Masing-masing bagian pesan kemudian berisi warna yang ditetapkan ke bagian tersebut, dan warna tersebut digunakan saat menghitung akar merkle dari bagian yang dikodekan. Jika produsen bongkahan menyimpang dari protokolnya bisa dibuktikan dengan mudah, karena root merkle juga tidak sesuai dengan pesan satu bagian, atau warna dalam pesan satu bagian itu sesuai dengan akar merkle tidak akan cocok dengan topeng di potongan. Ketika produsen blok menandatangani sebuah blok, mereka menyertakan bitmask dari semuanya bagian merah yang mereka terima untuk bongkahan yang termasuk dalam blok. Penerbitan sebuah bitmask yang salah adalah perilaku yang dapat disayat. Jika produsen blok belum menerima a pesan satu bagian, mereka tidak tahu warna pesannya, dan sehingga memiliki peluang 50% untuk ditebas jika mereka mencoba menandatangani secara membabi buta blok. 3.5 Aplikasi transisi negara Produsen bongkahan hanya memilih transaksi mana yang akan dimasukkan ke dalam bongkahan tersebut jangan menerapkan transisi keadaan ketika mereka menghasilkan potongan. Sejalan dengan itu,
header chunk berisi root merkle dari status merkel seperti sebelumnya transaksi dalam potongan diterapkan. Transaksi hanya diterapkan bila blok penuh yang mencakup potongan sedang diproses. Seorang peserta hanya memproses satu blok jika 1. Blok sebelumnya telah diterima dan diproses; 2. Untuk setiap bagian, peserta tidak mempertahankan status yang mereka miliki melihat pesan satu bagian; 3. Untuk setiap bagian, peserta mempertahankan status yang mereka miliki potongan penuh. Setelah blok diproses, untuk setiap pecahan yang menjadi peserta mempertahankan statusnya, mereka menerapkan transaksi dan menghitung status baru terhitung setelah transaksi diterapkan, setelah itu siap berproduksi potongan untuk blok berikutnya, jika ditugaskan ke pecahan apa pun, karena sudah ada akar merkle dari negara merkel baru. 3.6 Transaksi dan penerimaan lintas pecahan Jika suatu transaksi perlu memengaruhi lebih dari satu shard, transaksi tersebut harus dilakukan secara berurutan dieksekusi di setiap pecahan secara terpisah. Transaksi lengkap dikirim ke pecahan pertama terpengaruh, dan setelah transaksi dimasukkan dalam potongan untuk pecahan tersebut, dan diterapkan setelah potongan dimasukkan ke dalam blok, itu menghasilkan apa yang disebut tanda terima transaksi, yang dialihkan ke pecahan berikutnya yang memerlukan transaksi dieksekusi. Jika diperlukan lebih banyak langkah, eksekusi transaksi penerimaan menghasilkan transaksi penerimaan baru dan seterusnya. 3.6.1 Penerimaan transaksi seumur hidup Sebaiknya transaksi penerimaan diterapkan di blok yang segera mengikuti blok tempat transaksi tersebut dihasilkan. Transaksi resinya saja dihasilkan setelah blok sebelumnya diterima dan diterapkan oleh produsen blok yang mempertahankan pecahan asal, dan perlu diketahui pada saat itu potongan untuk blok berikutnya diproduksi oleh produsen blok tujuan pecahan. Oleh karena itu, tanda terima harus dikomunikasikan dari pecahan sumber ke pecahan tujuan dalam jangka waktu singkat antara kedua peristiwa tersebut. Misalkan A adalah blok terakhir yang diproduksi yang berisi transaksi t yang menghasilkan tanda terima r. Misalkan B adalah blok yang diproduksi berikutnya (yaitu blok yang mempunyai A sebagai blok sebelumnya) yang ingin kita tampung r. Misalkan t berada di pecahan a dan r dalam pecahan b. Masa berlaku kuitansi, juga digambarkan pada gambar 18, adalah sebagai berikut: Memproduksi dan menyimpan kuitansi. Cpa produsen bongkahan untuk shard a menerima blok A, menerapkan transaksi t dan menghasilkan tanda terima r. cpa kemudian menyimpan semua penerimaan yang dihasilkan dalam penyimpanan persisten internal yang diindeks dengan id pecahan sumber.Mendistribusikan kuitansi. Setelah cpa siap untuk menghasilkan potongannya shard a untuk blok B, mereka mengambil semua tanda terima yang dihasilkan dengan menerapkan transaksi dari blok A untuk shard a, dan memasukkannya ke dalam potongan untuk shrad a di blok B. Setelah potongan tersebut dibuat, cpa menghasilkan kode penghapusannya versi dan semua pesan satu bagian yang terkait. cpa mengetahui produsen blok mana yang mempertahankan status penuh untuk pecahan mana. Untuk produsen blok tertentu bp cpa mencakup penerimaan yang dihasilkan dari penerapan transaksi di blok A untuk shard a yang memiliki salah satu shard yang dipedulikan bp sebagai tujuannya dalam pesan satu bagian ketika mereka mendistribusikan potongan untuk pecahan a di blok B (lihat gambar 17, yang menunjukkan tanda terima yang disertakan dalam pesan satu bagian). Menerima kuitansi. Ingatlah bahwa peserta (produsen blok dan validators) tidak memproses blok sampai mereka memiliki pesan satu bagian untuk setiap potongan yang termasuk dalam blok. Jadi, pada saat peserta tertentu menerapkan blok B, mereka memiliki semua pesan satu bagian yang sesuai potongan di B, dan dengan demikian mereka memiliki semua tanda terima masuk yang memiliki pecahannya peserta mempertahankan negara bagian sebagai tujuannya. Saat menerapkan transisi status untuk pecahan tertentu, peserta menerapkan kedua tanda terima tersebut yang telah mereka kumpulkan untuk pecahan di pesan satu bagian, dan juga semuanya transaksi yang termasuk dalam potongan itu sendiri. Gambar 18: Seumur hidup transaksi penerimaan 3.6.2 Menangani terlalu banyak tanda terima Ada kemungkinan bahwa jumlah penerimaan yang menargetkan pecahan tertentu di a blok tertentu terlalu besar untuk diproses. Misalnya, perhatikan gambar 19, di yang mana setiap transaksi di setiap shard menghasilkan tanda terima yang menargetkan shard 1. Pada blok berikutnya, jumlah resi yang perlu diproses oleh shard 1 adalah sebanding dengan beban yang diproses gabungan semua pecahan saat ditangani blok sebelumnya.
Gambar 19: Jika semua tanda terima menargetkan shard yang sama, shard tersebut mungkin tidak memilikinya kemampuan untuk memprosesnya Untuk mengatasinya kami menggunakan teknik serupa dengan yang digunakan di QuarkChain 9. Khususnya, untuk setiap shard, blok B terakhir dan shard terakhir di dalamnya blok dari mana tanda terima diterapkan dicatat. Saat pecahan baru ada dibuat, tanda terima diterapkan secara berurutan terlebih dahulu dari sisa pecahan di B, dan kemudian di blok berikutnya B, sampai bongkahan baru penuh. Di bawah normal keadaan dengan beban seimbang maka umumnya akan menghasilkan semua penerimaan sedang diterapkan (dan dengan demikian pecahan terakhir dari blok terakhir akan dicatat setiap potongan), tetapi pada saat beban tidak seimbang, dan tertentu shard menerima banyak tanda terima yang tidak proporsional, teknik ini memungkinkannya diproses dengan tetap menghormati batasan jumlah transaksi yang disertakan. Perhatikan bahwa jika beban tidak seimbang tersebut bertahan dalam waktu yang lama, penundaan akan terjadi pembuatan tanda terima hingga aplikasi dapat terus berkembang tanpa batas. Satu cara untuk mengatasinya adalah dengan membatalkan transaksi apa pun yang menghasilkan tanda terima yang menargetkan a pecahan yang memiliki penundaan pemrosesan yang melebihi beberapa konstanta (misalnya satu zaman). Perhatikan gambar 20. Berdasarkan blok B pecahan 4 tidak dapat memproses semua kuitansi, jadi hanya memproses penerimaan asal hingga shard 3 di blok A, dan mencatatnya. Di blok C disertakan resi hingga pecahan 5 di blok B, dan kemudian di blok D pecahannya menyusul, memproses semua sisa kuitansi yang masuk blok B dan semua kuitansi dari blok C. 3.7 Validasi potongan Potongan yang dihasilkan untuk shard tertentu (atau blok shard yang diproduksi untuk rantai shard tertentu dalam model dengan rantai shard) hanya dapat divalidasi oleh 9Lihat episode papan tulis dengan QuarkChain di sini: https://www.youtube.com/watch? v=opEtG6NM4x4, yang didalamnya dibahas antara lain pendekatan transaksi cross-shard halGambar 20: Pemrosesan tanda terima tertunda peserta yang memelihara negara. Mereka dapat menjadi produsen blok, validators, atau hanya saksi eksternal yang mengunduh status dan memvalidasi pecahannya tempat mereka menyimpan aset. Dalam dokumen ini kami berasumsi bahwa mayoritas peserta tidak dapat menyimpan keadaan untuk sebagian besar pecahan. Namun perlu disebutkan, bahwa ada blockchain pecahan yang dirancang dengan asumsi bahwa sebagian besar peserta memiliki kapasitas untuk menyimpan status dan memvalidasi sebagian besarnya pecahannya, seperti QuarkChain. Karena hanya sebagian kecil peserta yang memiliki negara bagian untuk memvalidasi pecahan tersebut potongannya, dimungkinkan untuk adaptif korup hanya pada peserta yang memilikinya negara bagian, dan menerapkan transisi keadaan yang tidak valid. Beberapa desain sharding diusulkan dengan sampel validators setiap beberapa hari, dan dalam satu hari setiap blok dalam rantai pecahan yang memiliki lebih dari 2/3 tanda tangan validator yang ditugaskan pada pecahan tersebut segera dipertimbangkan terakhir. Dengan pendekatan seperti itu, musuh adaptif hanya perlu merusak 2n/3+1 dari validators dalam rantai pecahan untuk menerapkan transisi keadaan yang tidak valid, yang, Meskipun hal ini mungkin sulit dilakukan, namun tingkat keamanannya tidak memadai bagi masyarakat blockchain. Seperti yang dibahas di bagian 2.3, pendekatan umum adalah memberikan jangka waktu tertentu setelah blok dibuat untuk setiap peserta yang memiliki status (baik itu adalah produsen blok, validator, atau pengamat eksternal) yang menantang validitasnya. Peserta seperti ini disebut Nelayan. Agar seorang nelayan bisa menantang blok yang tidak valid, harus dipastikan bahwa blok tersebut tersedia mereka. Ketersediaan data di Nightshade dibahas di bagian 3.4. Di Nightshade, setelah blok diproduksi, potongan tersebut tidak divalidasi oleh siapa pun kecuali produser bongkahan sebenarnya. Khususnya, produsen blok itu menyarankan blok tersebut secara alami tidak memiliki status untuk sebagian besar pecahannya, dantidak dapat memvalidasi potongan tersebut. Ketika blok berikutnya diproduksi, blok tersebut berisi pengesahan (lihat bagian 3.2) dari beberapa produsen blok dan validators, tapi karena mayoritas produsen blok dan validator tidak mengelola negara untuk sebagian besar shard, sebuah blok yang hanya memiliki satu bongkahan yang tidak valid akan mengumpulkan lebih dari separuh pengesahan secara signifikan dan akan terus berada pada pengesahan terberat. rantai. Untuk mengatasi masalah ini, kami mengizinkan peserta mana pun yang mempertahankan status pecahan untuk mengirimkan tantangan secara on-chain untuk setiap potongan tidak valid yang dihasilkan di dalamnya pecahan. 3.7.1 Tantangan validitas negara Setelah peserta mendeteksi bahwa potongan tertentu tidak valid, mereka harus memberikan bukti bahwa potongan tersebut tidak valid. Karena sebagian besar peserta jaringan tidak mempertahankan status pecahan yang berisi potongan tidak valid dihasilkan, bukti tersebut perlu memiliki informasi yang cukup untuk memastikan blok tersebut tidak sah tanpa memiliki negara. Kami menetapkan batas Ls dari jumlah negara (dalam byte) yang satu transaksi dapat membaca atau menulis secara kumulatif. Setiap transaksi yang menyentuh lebih dari Ls negara dianggap tidak sah. Ingat dari bagian 3.5 bahwa potongan tersebut di blok B tertentu hanya berisi transaksi yang akan diterapkan, tapi tidak akar negara baru. Akar negara bagian yang termasuk dalam potongan di blok B adalah negara bagian root sebelum menerapkan transaksi tersebut, tetapi setelah menerapkan transaksi dari potongan terakhir di pecahan yang sama sebelum blok B. Aktor jahat itu ingin menerapkan transisi keadaan yang tidak valid akan mencakup akar keadaan yang salah di blok B yang tidak sesuai dengan state root yang dihasilkan dari penerapan transaksi pada potongan sebelumnya. Kami memperluas informasi yang disertakan oleh produsen bongkahan ke dalam bongkahan tersebut. Alih-alih hanya menyertakan negara setelah menerapkan semua transaksi, malahan menyertakan akar keadaan setelah menerapkan setiap rangkaian transaksi yang berdekatan itu secara kolektif membaca dan menulis Ls byte negara. Dengan informasi ini untuk nelayan untuk menciptakan tantangan bahwa transisi negara diterapkan secara tidak benar cukup untuk menemukan akar status pertama yang tidak valid, dan hanya menyertakan Ls byte keadaan yang dipengaruhi oleh transaksi antara akar keadaan terakhir (yang tadinya valid) dan akar status saat ini dengan bukti merkle. Lalu peserta mana saja dapat memvalidasi transaksi di segmen tersebut dan memastikan bahwa potongan tersebut benar tidak valid. Demikian pula, jika produsen potongan mencoba memasukkan transaksi yang terbaca dan menulis lebih dari Ls byte status, untuk tantangannya cukup dengan menyertakannya byte Ls pertama yang disentuhnya dengan bukti merkle, yang sudah cukup menerapkan transaksi dan memastikan bahwa ada saatnya upaya untuk melakukannya membaca atau menulis konten melebihi Ls byte dibuat.
3.7.2 Nelayan dan transaksi lintas pecahan yang cepat Seperti yang dibahas di bagian 2.3, setelah kita berasumsi bahwa potongan shard (atau shard blok dalam model dengan rantai pecahan) bisa jadi tidak valid dan menimbulkan tantangan periode, hal ini berdampak negatif pada finalitas, dan dengan demikian komunikasi lintas pecahan. Di khususnya, shard tujuan dari transaksi lintas shard tidak dapat dipastikan bongkahan atau blok pecahan asal bersifat final hingga periode tantangan selesai (lihat gambar 21). Gambar 21: Menunggu periode tantangan sebelum menerapkan tanda terima Cara mengatasinya dengan cara melakukan transaksi cross-shard instantenious adalah agar shard tujuan tidak menunggu periode tantangan setelah transaksi pecahan sumber dipublikasikan, dan terapkan transaksi tanda terima segera, tetapi kemudian kembalikan pecahan tujuan bersama dengan sumbernya shard jika kemudian potongan atau blok asal ditemukan tidak valid (lihat gambar 22). Ini berlaku secara alami pada desain Nightshade yang menggunakan beling rantai tidak independen, melainkan semua potongan pecahannya dipublikasikan bersama-sama dalam blok rantai utama yang sama. Jika ada potongan yang ditemukan tidak valid, maka seluruh blok dengan potongan itu dianggap tidak valid, dan semua blok dibangun di atasnya di atasnya. Lihat gambar 23. Kedua pendekatan di atas memberikan atomisitas dengan asumsi tantangan tersebut periodenya cukup lama. Kami menggunakan pendekatan terakhir karena menyediakan transaksi crossshard cepat dalam keadaan normal melebihi ketidaknyamanannya pecahan tujuan dibatalkan karena transisi status yang tidak valid di salah satu pecahan sumber, yang merupakan peristiwa yang sangat langka. 3.7.3 Menyembunyikan validators Adanya tantangan-tantangan tersebut sudah secara signifikan mengurangi kemungkinan terjadinya hal tersebut korupsi adaptif, karena menyelesaikan bagian dengan pos transisi keadaan yang tidak validGambar 22: Menerapkan tanda terima segera dan mengembalikan tujuan rantai jika rantai sumber memiliki blok yang tidak valid Gambar 23: Tantangan nelayan di Nightshade periode tantangan yang dibutuhkan musuh adaptif untuk merusak semua peserta yang mempertahankan status pecahan, termasuk semua validators. Memperkirakan kemungkinan kejadian seperti itu sangatlah rumit, karena tidak ada sharded blockchain telah berumur cukup lama untuk mencoba melakukan serangan seperti itu. Kami berpendapat bahwa kemungkinannya, walaupun sangat rendah, masih cukup besar besar untuk sistem yang diharapkan dapat mengeksekusi jutaan transaksi dan menjalankan operasi keuangan di seluruh dunia. Ada dua alasan utama keyakinan ini: 1. Sebagian besar validator rantai Proof-of-Stake dan penambang di
Rantai Proof-of-Work terutama diberi insentif oleh keuntungan finansial. Jika musuh yang adaptif menawarkan mereka lebih banyak uang daripada keuntungan yang diharapkan dari beroperasi dengan jujur, masuk akal untuk mengharapkan banyak validator akan menerima tawaran itu. 2. Banyak entitas melakukan validasi rantai Proof-of-Stake secara profesional, dan diperkirakan akan ada sebagian besar saham di rantai mana pun dari entitas tersebut. Jumlah entitas tersebut cukup kecil untuk sebuah musuh adaptif untuk mengenal sebagian besar dari mereka secara pribadi dan memiliki a pemahaman yang baik tentang kecenderungan mereka untuk dirusak. Kami mengambil satu langkah lebih jauh dalam mengurangi kemungkinan korupsi adaptif dengan menyembunyikan validator yang ditugaskan ke shard mana. Idenya adalah mirip dengan cara Algorand [5] menyembunyikan validators. Penting untuk dicatat bahwa meskipun validator disembunyikan, seperti pada Algorand atau seperti dijelaskan di bawah ini, korupsi adaptif secara teori masih mungkin terjadi. Sementara musuh adaptif tidak mengetahui peserta yang akan membuat atau memvalidasi satu blok atau satu bagian, para peserta sendiri mengetahui bahwa mereka akan tampil tugas seperti itu dan memiliki bukti kriptografiknya. Jadi, musuh bisa menyiarkan niatnya untuk melakukan korupsi, dan membayar kepada siapa saja peserta yang mau memberikan bukti kriptografi seperti itu. Namun kami mencatat, karena musuh tidak melakukannya mengetahui validator yang ditugaskan ke pecahan yang ingin mereka rusak, mereka tidak punya pilihan lain selain menyiarkan niat mereka untuk merusak pecahan tertentu seluruh komunitas. Pada titik ini, hal ini menguntungkan secara ekonomi bagi siapa pun yang jujur peserta untuk memutar node penuh yang memvalidasi pecahan tersebut, karena ada nilai high kemungkinan munculnya blok yang tidak valid di pecahan itu, yang merupakan peluang untuk itu buat tantangan dan kumpulkan hadiah terkait. Untuk tidak mengungkapkan validator yang ditetapkan ke pecahan tertentu, kami melakukannya berikut ini (lihat gambar 24): Menggunakan VRF untuk mendapatkan tugas. Di awal setiap zaman masing-masing validator menggunakan VRF untuk mendapatkan bitmask dari pecahan yang validator ditugaskan. Bitmask setiap validator akan memiliki bit Sw (lihat bagian 3.3 untuk definisinya dari Sw). validator kemudian mengambil status pecahan yang sesuai, dan selama masa untuk setiap blok yang diterima memvalidasi potongan yang sesuai ke pecahan tempat validator ditugaskan. Masuk dalam blok, bukan bongkahan. Karena penetapan pecahan disembunyikan, validator tidak dapat menandatangani pecahan. Sebaliknya, ia selalu memberi tanda secara keseluruhan blok, sehingga tidak mengungkapkan pecahan apa yang divalidasinya. Khususnya, ketika validator menerima sebuah blok dan memvalidasi semua potongan, ia akan membuat pesan yang membuktikan bahwa semua potongan di semua pecahan yang validator ditugaskan adalah valid (tanpa menunjukkan dengan cara apa pun pecahan itu), atau pesan itu berisi bukti transisi keadaan yang tidak valid jika ada bagian yang tidak valid. Lihat bagian 3.8 untuk rincian tentang bagaimana pesan-pesan tersebut dikumpulkan, bagian 3.7.4 untuk detail tentang cara mencegah validators membonceng pesan dari validator lainnya, dan bagian 3.7.5 untuk detail cara memberi penghargaan dan hukuman validators seandainya tantangan transisi keadaan tidak valid yang berhasil benar-benar terjadi.Gambar 24: Menyembunyikan validator di Nightshade 3.7.4 Pengungkapan Komitmen Salah satu masalah umum dengan validators adalah validator dapat melewatkan pengunduhan status dan benar-benar memvalidasi potongan dan blok, dan sebagai gantinya amati jaringannya, lihat apa yang dikirimkan validator lainnya dan ulangi pesan. validator yang mengikuti strategi seperti itu tidak memberikan tambahan apa pun keamanan untuk jaringan, tetapi mengumpulkan hadiah. Solusi umum untuk masalah ini adalah setiap validator memberikan bukti bahwa mereka benar-benar memvalidasi blok tersebut, misalnya dengan memberikan jejak unik penerapan transisi negara, namun bukti-bukti tersebut meningkatkan biaya secara signifikan validasi. Gambar 25: Pengungkapan komitmen
Sebaliknya kita membuat validator pertama yang berkomitmen pada hasil validasi (baik pesan yang membuktikan keabsahan potongan, atau bukti ketidakabsahan transisi keadaan), tunggu selama jangka waktu tertentu, baru kemudian tampilkan hasil validasi sebenarnya, seperti ditunjukkan pada gambar 25. Periode penerapan tidak bersinggungan dengan periode pengungkapan, dan dengan demikian validator yang malas tidak dapat meniru validator yang jujur. Terlebih lagi, jika validator yang tidak jujur berkomitmen pada pesan yang membuktikan hal tersebut validitas potongan yang ditetapkan, dan setidaknya satu potongan tidak valid, jika memang demikian ditunjukkan bahwa potongan tersebut tidak valid, validator tidak dapat menghindari pemotongan, karena, seperti yang kami tunjukkan di bagian 3.7.5, satu-satunya cara agar tidak terpotong dalam situasi seperti ini adalah menyajikan pesan yang berisi bukti transisi keadaan yang tidak valid itu cocok dengan komit. 3.7.5 Menangani tantangan Seperti dibahas di atas, setelah validator menerima blok dengan potongan yang tidak valid, mereka terlebih dahulu menyiapkan bukti transisi keadaan yang tidak sah (lihat bagian 3.7.1), kemudian berkomitmen pada bukti tersebut (lihat 3.7.4), dan setelah beberapa waktu ungkapkan tantangannya. Setelah tantangan yang terungkap dimasukkan ke dalam blok, hal berikut akan terjadi: 1. Semua transisi keadaan yang terjadi dari blok yang berisi potongan tidak valid sampai blok di mana tantangan yang terungkap disertakan, dapatkan dibatalkan. Keadaan sebelum blok yang mencakup tantangan yang terungkap dianggap sama dengan keadaan sebelum blok yang memuatnya potongan yang tidak valid. 2. Dalam jangka waktu tertentu setiap validator harus menampilkan bitmasknya pecahan yang mereka validasi. Karena bitmask dibuat melalui VRF, jika mereka ditugaskan ke pecahan yang memiliki transisi status tidak valid, mereka tidak bisa menghindari pengungkapannya. Setiap validator yang gagal menampilkan bitmask diasumsikan ditugaskan ke beling. 3. Setiap validator yang setelah periode tersebut ditemukan ditugaskan ke pecahan, yang melakukan komit pada beberapa hasil validasi untuk blok yang berisi potongan yang tidak valid dan itu tidak mengungkapkan bukti transisi keadaan yang tidak valid yang sesuai dengan komit mereka dipotong. 4. Setiap validator mendapat tugas pecahan baru, dan periode baru dijadwalkan untuk memulai setelah beberapa waktu yang cukup bagi semua validator untuk mengunduh keadaan, seperti yang ditunjukkan pada gambar 26. Perhatikan bahwa sejak validator mengungkapkan pecahan yang ditugaskan padanya hingga zaman baru dimulai, keamanan sistem berkurang sejak tugas pecahan terungkap. Para peserta jaringan perlu menjaganya diingat saat menggunakan jaringan selama periode tersebut. 3.8 Agregasi Tanda Tangan Agar sistem dengan ratusan pecahan dapat beroperasi dengan aman, kami ingin memilikinya pesanan 10.000 atau lebih validators. Seperti yang dibahas di bagian 3.7, kita menginginkan masing-masingGambar 26: Menangani tantangan validator untuk mempublikasikan rata-rata komit pada pesan dan tanda tangan tertentu sekali per blok. Meskipun pesan komitnya sama, menggabungkan a Menandatangani BLS dan memvalidasinya akan sangat mahal. Tapi tentu saja pesan komit dan pengungkapan tidak sama di validators, dan oleh karena itu kita memerlukan cara untuk menggabungkan pesan-pesan dan tanda tangan tersebut di a cara yang memungkinkan validasi cepat nanti. Pendekatan spesifik yang kami gunakan adalah sebagai berikut: Validator bergabung dengan produsen blok. Produsen blok sudah dikenal beberapa saat sebelum zaman dimulai, karena mereka memerlukan waktu untuk mengunduhnya menyatakan sebelum epoch dimulai, dan tidak seperti validators, produsen bloknya tidak disembunyikan. Setiap produser blok memiliki v validator slot. Validator mengirimkan proposal off-chain kepada produsen blok untuk dimasukkan sebagai salah satu dari v validatordtk. Jika produsen blok ingin memasukkan validator, mereka mengirimkan a transaksi yang berisi permintaan off-chain awal dari validator, dan tanda tangan produser blok yang membuat validator bergabung dengan produser blok. Perhatikan bahwa validator yang ditugaskan ke produsen blok belum tentu memvalidasi pecahan yang sama dengan yang dihasilkan oleh produsen blok. Jika sebuah validator diterapkan untuk bergabung dengan beberapa produsen blok, hanya transaksi dari produsen blok pertama akan berhasil. Produsen blok mengumpulkan komitmen. Produser blok terus-menerus mengumpulkan komit dan mengungkapkan pesan dari validators. Setelah sejumlah pesan tersebut terakumulasi, produsen blok menghitung merekle pohon pesan-pesan ini, dan mengirimkan ke setiap validator root merkle dan jalur merkle ke pesan mereka. validator memvalidasi jalur dan tanda masuk akar merkle. Produser blok kemudian mengumpulkan tanda tangan BLS di root merkle dari validators, dan hanya menerbitkan root merkle dan akumulasi tanda tangan. Produsen blok juga menandatangani keabsahan multisignature menggunakan tanda tangan ECDSA yang murah. Jika multisignature tidak cocok dengan root merkle yang dikirimkan atau bitmask dari validator yang berpartisipasi, ini merupakan perilaku yang dapat disayat. Saat menyinkronkan rantai, seorang peserta dapat memilih untuk memvalidasi semua tanda tangan BLS dari validator (yang sangat mahal karena melibatkan pengumpulan kunci publik validator), atau hanyatanda tangan ECDMA dari produsen blok dan mengandalkan fakta bahwa produsen blok tidak ditantang dan dipangkas. Menggunakan transaksi on-chain dan bukti merkle untuk tantangan. Itu dapat dicatat bahwa tidak ada gunanya mengungkapkan pesan dari validators jika tidak transisi keadaan yang tidak valid terdeteksi. Hanya pesan-pesan yang berisi hal yang sebenarnya bukti transisi negara yang tidak valid perlu diungkapkan, dan hanya untuk pesan-pesan seperti itu perlu ditunjukkan bahwa mereka cocok dengan komitmen sebelumnya. Pesannya perlu diungkapkan untuk dua tujuan: 1. Untuk benar-benar memulai rollback rantai ke momen sebelum transisi keadaan tidak valid (lihat bagian 3.7.5). 2. Untuk membuktikan bahwa validator tidak berusaha membuktikan keabsahan potongan tidak valid. Apa pun kasusnya, kita perlu mengatasi dua masalah: 1. Komit sebenarnya tidak disertakan pada rantai, hanya akar merkle saja komit dikumpulkan dengan pesan lain. validator perlu menggunakan jalur merkle yang disediakan oleh produsen blok dan komitmen awal mereka membuktikan bahwa mereka berkomitmen terhadap tantangan tersebut. 2. Ada kemungkinan bahwa semua validator yang ditugaskan ke beling dengan yang tidak valid transisi negara kebetulan ditugaskan ke produsen blok yang korup itu sedang menyensor mereka. Untuk menyiasatinya, kami mengizinkan mereka mengirimkan pengungkapannya sebagai transaksi reguler on-chain dan melewati agregasi. Yang terakhir ini hanya diperbolehkan untuk bukti transisi negara yang tidak sah, yaitu sangat jarang terjadi, sehingga tidak akan mengakibatkan pemblokiran spam. Masalah terakhir yang perlu diatasi adalah bahwa produsen blok dapat melakukan hal tersebut memilih untuk tidak berpartisipasi dalam pengumpulan pesan atau dengan sengaja menyensor validators tertentu. Kita buat yang tidak menguntungkan secara ekonomi, dengan membuat blok imbalan produser sebanding dengan jumlah validator yang ditugaskan kepada mereka. Kami juga mencatat bahwa karena produsen blok antar zaman sebagian besar berpotongan (sejak selalu menjadi peserta teratas dengan taruhan tertinggi), validator bisa sebagian besar tetap bekerja sama dengan produsen blok yang sama, dan dengan demikian mengurangi risiko ditugaskan ke produser blok yang pernah menyensornya di masa lalu. 3.9 Rantai Snapshot Karena blok pada rantai utama sangat sering diproduksi, pengunduhan sejarah lengkap mungkin menjadi mahal dengan sangat cepat. Apalagi sejak setiap blok berisi tanda tangan BLS dari sejumlah besar peserta, hanya agregasi kunci publik untuk memeriksa tanda tangan mungkin menjadi penghalang mahal juga. Terakhir, karena di masa mendatang Ethereum 1.0 kemungkinan besar akan tetap menjadi satu dari blockchain yang paling banyak digunakan, memiliki cara yang berarti untuk mentransfer aset
Mendekati Ethereum adalah persyaratan, dan hari ini memverifikasi tanda tangan BLS untuk memastikannya Validitas blok dekat pada sisi Ethereum tidak dimungkinkan. Setiap blok di rantai utama Nightshade secara opsional dapat berisi Schnorr multisignature pada header blok terakhir yang menyertakan Schnorr tersebut multitanda tangan. Kami menyebut blok tersebut sebagai blok snapshot. Blok pertama dari setiap zaman harus berupa blok snapshot. Saat mengerjakan multisignature seperti itu, produsen blok juga harus mengumpulkan tanda tangan BLS dari validators pada blok snapshot terakhir, dan menggabungkannya dengan cara yang sama seperti yang dijelaskan dalam bagian 3.8. Karena kumpulan produsen blok konstan sepanjang zaman, maka validasi hanya blok snapshot pertama di setiap epoch yang cukup dengan asumsi bahwa pada no menunjukkan sebagian besar produsen blok dan validator berkolusi dan berkreasi sebuah garpu. Blok pertama dari zaman tersebut harus berisi informasi yang cukup untuk dihitung produsen blok dan validators untuk zaman tersebut. Kami menyebut subrantai dari rantai utama yang hanya berisi snapshot memblokir rantai snapshot. Membuat multisignature Schnorr adalah proses interaktif, tapi sejak kami hanya perlu melakukannya secara jarang, proses apa pun, tidak peduli seberapa tidak efisiennya akan cukup. Multisignature Schnorr dapat dengan mudah divalidasi di Ethereum, sehingga memberikan primitif penting untuk cara yang aman dalam melakukan cross-blockchain komunikasi. Untuk menyinkronkan dengan rantai Dekat, seseorang hanya perlu mengunduh semua snapshot memblokir dan mengonfirmasi bahwa tanda tangan Schnorr sudah benar (opsional juga memverifikasi masing-masing tanda tangan BLS dari validators), dan kemudian hanya menyinkronkan blok rantai utama dari blok snapshot terakhir.
Conclusión
En este documento analizamos enfoques para crear blockchains fragmentados y cubrió dos desafíos principales con los enfoques existentes, a saber, la validez del estado y disponibilidad de datos. Luego presentamos Nightshade, un diseño de fragmentación que poderes NEAR Protocolo. El diseño es un trabajo en progreso, si tiene comentarios, preguntas o comentarios en este documento, vaya a https://near.chat.
Kesimpulan
Dalam dokumen ini kita membahas pendekatan untuk membangun blockchains dan mencakup dua tantangan besar dengan pendekatan yang ada, yaitu validitas negara dan ketersediaan data. Kami kemudian menghadirkan Nightshade, desain sharding itu kekuasaan NEAR Protokol. Desain sedang dalam proses, jika Anda memiliki komentar, pertanyaan, atau masukan pada dokumen ini, silakan buka https://near.chat.