Sharding

Image: Pixabay

Julkisissa lohkoketjuissa on tällä hetkellä skaalautuvuus ongelma. Lohkoketjut ovat yhtä nopeita kuin yksittäiset solmut, eivätkä yhtä nopeita kuin solmujen yhteenlaskettu nopeus. Tämän seurauksena lohkoketjut eivät kykene käsittelemään suuria määriä siirtoja sekunnissa. Lohkoketjujen suhteen vallitsee idea, jonka mukaan lohkoketjulla voi olla kaksi sen kolmesta ominaisuudesta. Nämä ominaisuudet ovat turvallisuus, skaalautuvuus ja hajautettavuus. Nykytilanteessa julkiset lohkoketjut ovat turvallisia ja hajautettuja, mutta eivät skaalautuvia. Toisaalla yksityiset lohkoketjut ovat turvallisia ja skaalautuvia, mutta eivät useimmiten yhtä hajautettuja. Shardingin tarkoitus olisi tarjota julkisille lohkoketjuille myös skaalautuvuutta. Sen tarkoitus on jakaa lohkoketjuja pienempiin osiin, joissa louhijat louhivat vain tiettyjä siirtoja. Nämä siirrot myöhemmin yhdistetään kokonaisuudeksi, jossa on luettavissa koko lohkoketju. Ethereumin perustaja Vitalik Buterin on tiivistänyt Shardingin näin:

”Kuvittele, että Ethereum on jaettu tuhansiksi pieniksi saariksi. Jokainen saari voi tehdä omia asioitaan. Jokaisella saarella on omat uniikit ominaisuutensa ja kaikki saarelle kuuluvat voivat olla yhteydessä toisiinsa ja he voivat vapaasti hyödyntää sen kaikki ominaisuuksia. Jos he haluavat olla yhteydessä muihin saariin, heidän täytyy käyttää jonkinlaista protokollaa.”

Nykytilannetta Ethereumissa kutsutaan ”Global State”. Tässä tilassa kaikki voivat nähdä kaiken ja kaikki louhijat louhivat kaiken. Haastavaa Shardingin luomisessa on jakaa Ethereum-verkkoa pienempiin osioihin. Näiden osioiden täytyy prosessoida ja validoida niissä tapahtuvia siirtoja ja samanaikaisesti päivittää Ethereum-verkon tilaa. Lisäksi joidenkin louhijoiden pitää validoida koko verkkoa. Kaikessa yksinkertaisuudessaan Shardingissa jokainen osio toimisi, kuten Ethereum toimii tällä hetkellä. Tämän jälkeen osioiden lohkot yhdistetään Ethereum-päälohkoketjussa yhdeksi kokonaisuudeksi Merkle-puurakenteeseen.

Siirtoja pitää pystyä tekemään myös osiosta toiseen tai muuten Sharding ei ole ratkaissut mitään. Ethereumin Sharding-suunnitelmassa siirrot osioiden välillä ovat mahdollisia vaikkakin hieman monimutkaisempia. Kuvitellaan tilanne, jossa Ethereum on jaettu kymmeneen osioon ja Bob (osiossa 4) haluaa lähettää Alicelle (osiossa 10) 100 ETH. Ensiksi Bob lähettää 100 ETH osiossa 4 ja häneltä vähennetään 100 ETH. Järjestelmä odottaa, että siirto on validoitu. Tämän jälkeen luodaan kuitti (receipt). Kuittia ei kirjata tilaan, mutta Merkle-puussa kuitti on helppo todentaa. Siirto lähetetään osioon 10 ja sen datassa lukee kuitin tiedot. Osio 10 tarkistaa, ettei kuittia ole vielä käytetty. Jos kuittia ei ole käytetty käsittelee osio 10 siirron ja lisää Alicelle 100 ETH. Samalla osion 4 kuittiin kirjataan, että se on käytetty.

Vaikka siirto osioiden välillä on huomattavasti hankalampi toteuttaa kuin nykytilassa tapahtuvat siirrot, eivät siirrot käyttäjän näkökulmasta muutu monimutkaisemmaksi. Käyttäjän näkökulmasta hän edelleen vain kirjoittaa vastaanottajan osoitteen ja varat siirtyvät vastaanottajalle. Siirto osioiden välillä on kuitenkin hitaampaa kuin osion sisällä.


Kuten monissa kehitteillä olevissa ratkaisuissa, myös Shardingissa on joitakin uhkia. Single-shard takeover attack on yksi tämänkaltainen. Tässä hyökkäyksessä hyökkääjä saa yhden osion yksinomaan omaan haltuunsa ja pystyy kirjaamaan osioon haluamaansa dataa. Tämä pyritään yleisesti estämään valitsemalla osioiden louhijat satunnaisesti. Satunnainen valitseminen kuitenkin synnyttää haasteita tilan laskemiselle, koska louhijat eivät voi pitää ajantasaista informaatiota jokaisen osion tilasta. Seurauksena louhijat joutuvat laskemaan tilan aina siirryttyään toiseen osioon ja tämä hidastaa verkon toimintaa.

Ethereumiin Sharding on tulossa Casper-päivityksen jälkeen. Casper-päivityksessä Ethereumin on tarkoitus siirtyä käyttämään Proof-of-Stake -konsensusalgoritmia ja sen on tarkoitus tulla vuonna 2019. Sharding on näillä näkymin tulossa vuonna 2020 tai 2021. Tällä hetkellä Sharding on kuitenkin käytössä Zilliqassa. Zilliqassa Sharding toimii kuitenkin eri tavalla kuin edellä kuvattu Ethereumin tapa. Ethereumissa kaikki siirrot löytyvät päälohkoketjusta ja nämä siirrot muodostavat tilan. Koska varojen siirtäminen tapahtuu suurella todennäköisyydellä osioiden välillä, vähentää se Shardingin hyötyä. Zilliqassa kaikki solmut tietävät viimeisen tilan, mutta siirtojen historia on jaettu. Siirtojen historia on jaettu osioihin, joita kaikilla ei ole, mutta kaikki pääsevät halutessaan lukemaan. Koska kaikki tietävät jatkuvasti viimeisimmän tilan, ei siirtoa tehdessä tarvita osioiden välistä keskustelua. Siirtoja pitää pystyä tarkastelemaan, jotta voidaan varmistua lompakon varallisuuden oikeellisuudesta, mutta niitä ei tarvitse tarkistaa päivittäin. Seurauksena keskustelua osioiden välillä on huomattavasti vähemmän kuin Ethereumin ratkaisussa ja tämän ansiosta se toimii tehokkaammin.


Sharding voidaan toteuttaa useilla eritavoilla. Perimmäisenä tarkoituksena siinä on kuitenkin jakaa verkkoa pienempiin osioihin, jotka toimivat itsenäisesti. Mitä enemmän itsenäisempiä osioita on, sitä nopeammin järjestelmä toimii. On kuitenkin pidettävä mielessä, että mitä pienempiä osiot ovat, sitä helpompi niitä vastaan on toteuttaa hyökkäyksiä.