Přejít na hlavní obsah
Change page

Bloky

Bloky jsou dávky transakcí s hashem předchozího bloku v řetězci. To spojuje bloky dohromady (do řetězce), protože hashe jsou kryptograficky odvozeny z dat bloku. Tím se předchází podvodům, protože jedna změna v jakémkoli bloku v historii by zneplatnila všechny následující bloky, jelikož by se změnily všechny následné hashe a každý, kdo provozuje blockchain, by si toho všiml.

Předpoklady

Bloky jsou téma velmi přívětivé pro začátečníky. Ale abychom vám pomohli lépe porozumět této stránce, doporučujeme si nejprve přečíst o účtech, transakcích a náš úvod do Etherea.

Proč bloky?

Abychom zajistili, že všichni účastníci v síti Ethereum udržují synchronizovaný stav a shodnou se na přesné historii transakcí, seskupujeme transakce do bloků. To znamená, že desítky (nebo stovky) transakcí jsou potvrzeny, odsouhlaseny a synchronizovány najednou.

A diagram showing transaction in a block causing state changes Diagram upraven z Ethereum EVM illustrated (opens in a new tab)

Rozložením potvrzení v čase dáváme všem účastníkům sítě dostatek času k dosažení konsensu: i když k požadavkům na transakce dochází desítkykrát za sekundu, bloky jsou na Ethereu vytvářeny a potvrzovány pouze jednou za dvanáct sekund.

Jak bloky fungují

Pro zachování historie transakcí jsou bloky striktně seřazeny (každý nově vytvořený blok obsahuje odkaz na svůj rodičovský blok) a transakce uvnitř bloků jsou také striktně seřazeny. Až na vzácné případy se v daném okamžiku všichni účastníci sítě shodují na přesném počtu a historii bloků a pracují na seskupení aktuálních živých požadavků na transakce do dalšího bloku.

Jakmile je blok sestaven náhodně vybraným validátorem v síti, je šířen do zbytku sítě; všechny uzly přidají tento blok na konec svého blockchainu a je vybrán nový validátor k vytvoření dalšího bloku. Přesný proces sestavování bloku a proces potvrzování/konsensu je v současnosti specifikován protokolem Etherea „důkaz podílem (PoS)“.

Protokol důkaz podílem (PoS)

Důkaz podílem (PoS) znamená následující:

  • Validující uzly musí vložit jako stake 32 ETH do depozitního kontraktu jako zajištění proti špatnému chování. To pomáhá chránit síť, protože prokazatelně nečestná aktivita vede ke zničení části nebo celého tohoto staku.
  • V každém slotu (s odstupem dvanácti sekund) je náhodně vybrán validátor, který se stane navrhovatelem bloku. Ten seskupí transakce dohromady, provede je a určí nový „stav“. Tyto informace zabalí do bloku a předá je ostatním validátorům.
  • Ostatní validátoři, kteří se o novém bloku dozvědí, znovu provedou transakce, aby se ujistili, že souhlasí s navrhovanou změnou globálního stavu. Za předpokladu, že je blok platný, přidají jej do své vlastní databáze.
  • Pokud se validátor dozví o dvou konfliktních blocích pro stejný slot, použije svůj algoritmus pro výběr forku (fork-choice algorithm), aby vybral ten, který je podporován největším množstvím stakovaných ETH.

Více o důkazu podílem (PoS)

Co je v bloku?

Blok obsahuje spoustu informací. Na nejvyšší úrovni obsahuje blok následující pole:

PolePopis
slotslot, do kterého blok patří
proposer_indexID validátora, který je navrhovatelem bloku
parent_roothash předchozího bloku
state_rootkořenový hash stavového objektu
bodyobjekt obsahující několik polí, jak je definováno níže

Samotné body bloku obsahuje několik vlastních polí:

PolePopis
randao_revealhodnota použitá k výběru dalšího navrhovatele bloku
eth1_datainformace o depozitním kontraktu
graffitilibovolná data použitá k označení bloků
proposer_slashingsseznam validátorů k penalizaci
attester_slashingsseznam atestujících k penalizaci
attestationsseznam atestací provedených vůči předchozím slotům
depositsseznam nových vkladů do depozitního kontraktu
voluntary_exitsseznam validátorů opouštějících síť
sync_aggregatepodmnožina validátorů používaná k obsluze lehkých klientů
execution_payloadtransakce předané z exekučního klienta

Pole attestations obsahuje seznam všech atestací v bloku. Atestace mají svůj vlastní datový typ, který obsahuje několik částí dat. Každá atestace obsahuje:

PolePopis
aggregation_bitsseznam validátorů, kteří se zúčastnili této atestace
datakontejner s více dílčími poli
signatureagregovaný podpis sady validátorů vůči části data

Pole data v attestation obsahuje následující:

PolePopis
slotslot, ke kterému se atestace vztahuje
indexindexy pro atestující validátory
beacon_block_rootkořenový hash beacon bloku vnímaného jako hlava řetězce
sourceposlední ospravedlněný kontrolní bod
targetnejnovější hraniční blok epochy

Provedení transakcí v execution_payload aktualizuje globální stav. Všichni klienti znovu provedou transakce v execution_payload, aby se ujistili, že nový stav odpovídá stavu v poli state_root nového bloku. Takto klienti poznají, že je nový blok platný a bezpečný pro přidání do jejich blockchainu. Samotný execution payload je objekt s několika poli. Existuje také execution_payload_header, který obsahuje důležité souhrnné informace o exekučních datech. Tyto datové struktury jsou uspořádány následovně:

execution_payload_header obsahuje následující pole:

PolePopis
parent_hashhash rodičovského bloku
fee_recipientadresa účtu pro placení transakčních poplatků
state_rootkořenový hash pro globální stav po aplikaci změn v tomto bloku
receipts_roothash trie účtenek transakcí
logs_bloomdatová struktura obsahující protokoly událostí
prev_randaohodnota použitá při náhodném výběru validátora
block_numberčíslo aktuálního bloku
gas_limitmaximální povolený gas v tomto bloku
gas_usedskutečné množství gasu použitého v tomto bloku
timestampčas bloku
extra_datalibovolná dodatečná data jako surové bajty
base_fee_per_gashodnota základního poplatku
block_hashhash exekučního bloku
transactions_rootkořenový hash transakcí v payloadu
withdrawal_rootkořenový hash výběrů v payloadu

Samotný execution_payload obsahuje následující (všimněte si, že je to identické s hlavičkou, kromě toho, že místo kořenového hashe transakcí obsahuje skutečný seznam transakcí a informace o výběrech):

PolePopis
parent_hashhash rodičovského bloku
fee_recipientadresa účtu pro placení transakčních poplatků
state_rootkořenový hash pro globální stav po aplikaci změn v tomto bloku
receipts_roothash trie účtenek transakcí
logs_bloomdatová struktura obsahující protokoly událostí
prev_randaohodnota použitá při náhodném výběru validátora
block_numberčíslo aktuálního bloku
gas_limitmaximální povolený gas v tomto bloku
gas_usedskutečné množství gasu použitého v tomto bloku
timestampčas bloku
extra_datalibovolná dodatečná data jako surové bajty
base_fee_per_gashodnota základního poplatku
block_hashhash exekučního bloku
transactionsseznam transakcí k provedení
withdrawalsseznam objektů výběrů

Seznam withdrawals obsahuje objekty withdrawal strukturované následujícím způsobem:

PolePopis
addressadresa účtu, který provedl výběr
amountčástka výběru
indexhodnota indexu výběru
validatorIndexhodnota indexu validátora

Čas bloku

Čas bloku označuje dobu oddělující bloky. V Ethereu je čas rozdělen do dvanáctisekundových jednotek zvaných „sloty“. V každém slotu je vybrán jeden validátor, který navrhne blok. Za předpokladu, že jsou všichni validátoři online a plně funkční, bude v každém slotu blok, což znamená, že čas bloku je 12 s. Občas však mohou být validátoři offline, když jsou vyzváni k navržení bloku, což znamená, že sloty mohou někdy zůstat prázdné.

Tato implementace se liší od systémů založených na důkazu prací (PoW), kde jsou časy bloků pravděpodobnostní a laděné cílovou obtížností těžby protokolu. Průměrný čas bloku (opens in a new tab) Etherea je toho dokonalým příkladem, přičemž přechod z důkazu prací (PoW) na důkaz podílem (PoS) lze jasně odvodit na základě konzistence nového času bloku 12 s.

Velikost bloku

Poslední důležitou poznámkou je, že samotné bloky jsou omezeny svou velikostí. Každý blok má cílovou velikost 30 milionů gasu, ale velikost bloků se bude zvyšovat nebo snižovat v souladu s požadavky sítě, a to až do limitu bloku 60 milionů gasu (dvojnásobek cílovové velikosti bloku). Limit plynu bloku lze upravit nahoru nebo dolů o faktor 1/1024 oproti limitu plynu předchozího bloku. V důsledku toho mohou validátoři změnit limit plynu bloku prostřednictvím konsensu. Celkové množství gasu spotřebovaného všemi transakcemi v bloku musí být menší než limit plynu bloku. To je důležité, protože to zajišťuje, že bloky nemohou být libovolně velké. Kdyby mohly být bloky libovolně velké, pak by méně výkonné plné uzly postupně přestaly být schopny držet krok se sítí kvůli požadavkům na prostor a rychlost. Čím větší je blok, tím větší výpočetní výkon je potřeba k jeho včasnému zpracování pro další slot. To je centralizační síla, které se čelí omezením velikosti bloků.

Další čtení

Víte o komunitním zdroji, který vám pomohl? Upravte tuto stránku a přidejte ho!