Tässä artikkelisarjassa rakennamme yksinkertaistetun kryptovaluutan, joka perustuu yksinkertaiseen lohkoketjutoteutukseen Golangissa alle 5 minuutissa. sinun on asennettava golang ensin tehdäksesi tämän projektin. tekstieditorissa voit käyttää mitä tahansa, tässä käytän Visual Studio -koodia.
Asensitko sen? Selvä, tehdään se!
jos olet luonut projektin, luo tiedosto main.go . oke antaa koodin, aloitamme ensin osoitteesta main.go. Aloitetaan "blockchainin" struct Block -osasta. Lohkoketjussa se estää arvokkaan tiedon tallentamisen. Esimerkiksi bitcoin-lohkot tallentavat tapahtumia, jotka ovat minkä tahansa kryptovaluutan ydin. Tämän lisäksi lohko sisältää joitain teknisiä tietoja, kuten sen version, nykyisen aikaleiman ja edellisen lohkon hajautusarvon. Tässä artikkelissa emme aio toteuttaa lohkoa, kuten se on kuvattu blockchain- tai Bitcoin-spesifikaatioissa, vaan käytämme sen yksinkertaistettua versiota, joka sisältää vain tärkeitä tietoja. Tältä se näyttää. tässä meillä on rakennelohko:
tyyppi Block struct {aikaleima aika. Aikatapahtumat []merkkijonoprevhash []tavuHash []tavu}
Timestamp
on nykyinen aikaleima (kun lohko luodaan), transactions
on lohkon sisältämä todellinen arvokas tieto, prevhas
tallentaa edellisen lohkon hashin ja Hash
on lohkon hash. Bitcoinin eritelmissä Timestamp
, prevhash
ja Hash
ovat lohkootsikot, jotka muodostavat erillisen tietorakenteen, ja tapahtumat (transaction
meidän tapauksessamme) on erillinen tietorakenne. Joten sekoitamme ne tässä yksinkertaisuuden vuoksi.
Joten miten laskemme tiivisteet? Hajautusten laskentatapa on erittäin tärkeä lohkoketjun ominaisuus, ja juuri tämä ominaisuus tekee lohkoketjusta turvallisen. Asia on siinä, että hashin laskeminen on laskennallisesti vaikea operaatio, se vie jonkin aikaa jopa nopeilla tietokoneilla (siksi ihmiset ostavat tehokkaita GPU:ita Bitcoinin louhimiseen). Tämä on tahallinen arkkitehtoninen suunnittelu, joka vaikeuttaa uusien lohkojen lisäämistä ja estää siten niiden muuttamisen lisäyksen jälkeen. Keskustelemme tästä mekanismista ja toteutamme sitä seuraavassa artikkelissa.
Toistaiseksi otamme vain lohkokentät, ketjutamme ne ja laskemme SHA-256-hajautusarvon ketjutetulle yhdistelmälle. Tehdään tämä sisään Newhash
menetelmä:
func NewHash(aika aika.aika, tapahtumat []merkkijono, prevhash []tavu) []tavu {input := append(prevhash, time.String()...)tapahtumalle := välitapahtumat {syöte = liitä(syöte, merkkijono(riimu(tapahtuma))...)}hash := sha256.Sum256(syöttö)palauta hash[:]}
Seuraavaksi Golangin käytäntöä noudattaen otamme käyttöön toiminnon, joka yksinkertaistaa lohkon luomista ja viimeistelyä:
func Blocks(tapahtumat []merkkijono, prevhash []tavu) *Block {nykyinen aika := aika. Nyt()palauta &Estä{aikaleima: aika.Aika{},tapahtumat: tapahtumat,prevhash: prevhash,Hash: NewHash(nykyinen aika, tapahtumat, prevhash),}}
jatkamme tulostustoiminnon luomista. tulostustoiminto on hyödyllinen tulostettaessa jokaisen tapahtuman suorittavan lohkon sisältö. tässä on koodi:
func Tulosta(block *Block) {fmt.Printf("ttime: %sn", block.timestamp.String())fmt.Printf("tprevhash: %xn", block.prevhash)fmt.Printf("thash: %xn", block.Hash)}
Ja tulostustapahtuman toimintotapahtuma:
func Transaction(block *Block) {fmt.Println("tTransactions:")i:lle tapahtuma := alue block.transactions {fmt.Printf("tt%v: %qn", i, tapahtuma)}}
Kun kaikki vaaditut toiminnot on suoritettu, käytämme sitä päätoiminnossa:
func main() {ryan := []string{"ryandi lähetti 50 BTC Rezalle"}block_1 := Lohkot (ryan, []tavu{})fmt.Println("Tämä on ensimmäinen lohkomme")Tulosta (lohko_1)Tapahtuma (lohko_1)jack := []string{"jakki lähettää 20 BTC Reynoldille"}block_2 := Lohkot (jack, block_1.Hash)fmt.Println("Tämä on toinen lohkomme")Tulosta (lohko_2)Tapahtuma (lohko_2)}
okei kaikki koodi, jonka olemme kirjoittaneet. Suoritetaan se kirjoittamalla terminaaliin go run main.go. Lähtö:
Yhteenveto
Rakensimme hyvin yksinkertaisen lohkoketjuprototyypin: se on vain joukko lohkoja, joista jokaisella on yhteys edelliseen. Todellinen lohkoketju on kuitenkin paljon monimutkaisempi. Lohkoketjussamme uusien lohkojen lisääminen on helppoa ja nopeaa, mutta todellisessa lohkoketjussa uusien lohkojen lisääminen vaatii jonkin verran työtä: täytyy suorittaa raskaita laskutoimituksia ennen kuin saa luvan lisätä lohkoja (tätä mekanismia kutsutaan nimellä Proof-of-Work). Myös lohkoketju on hajautettu tietokanta, jolla ei ole yhtä päätöksentekijää. Näin ollen uusi lohko on vahvistettava ja hyväksyttävä verkon muiden osallistujien toimesta (tätä mekanismia kutsutaan konsensukseksi). Ja lohkoketjussamme ei ole vielä tapahtumia!
- "
- Kaikki
- artikkeli
- artikkelit
- Bitcoin
- blockchain
- BTC
- rakentaa
- Ostetaan
- koodi
- tietokoneet
- liitäntä
- Yhteisymmärrys
- sisältö
- jatkaa
- kryptovaluutta
- Nykyinen
- tiedot
- tietokanta
- Malli
- toimittaja
- FAST
- Ominaisuus
- Fields
- Etunimi
- seurata
- muoto
- toiminto
- tulevaisuutta
- GV
- hasis
- tätä
- Miten
- hr
- HTTPS
- ia
- tiedot
- IP
- IT
- keskikokoinen
- verkko
- Muut
- Ihmiset
- estää
- projekti
- Proof-of-Work
- alue
- ajaa
- Sarjat
- Yksinkertainen
- So
- Alkaa
- verkkokaupasta
- varastot
- Tekninen
- aika
- kauppa
- Liiketoimet
- W
- Referenssit
- kirjoittaminen