I denne serien med artikler bygger vi en forenklet kryptovaluta som er basert på enkel blokkjedeimplementering i Golang på mindre enn 5 minutter. du må installere golang først for å lage dette prosjektet. for tekstredigering kan du bruke hva som helst, her bruker jeg visuell studiokode.
Installerte du det? Ok, la oss gjøre det!
hvis du har opprettet prosjektet, oppretter du en fil main.go . oke lar kode, først starter vi fra main.go La oss starte med struct Block-delen av "blockchain". I blokkjeden blokkerer den som lagrer verdifull informasjon. For eksempel blokkerer bitcoin butikktransaksjoner, essensen av enhver kryptovaluta. I tillegg til dette inneholder en blokk noe teknisk informasjon, som versjonen, gjeldende tidsstempel og hashen til forrige blokk. I denne artikkelen skal vi ikke implementere blokken slik den er beskrevet i blockchain- eller Bitcoin-spesifikasjoner, i stedet vil vi bruke en forenklet versjon av den, som bare inneholder vesentlig informasjon. Slik ser det ut. her har vi en strukturblokk:
type Block struct {tidsstempel tid.Tidtransaksjoner []strengprevhash []byteHash []byte}
Timestamp
er gjeldende tidsstempel (når blokken er opprettet), transactions
er den faktiske verdifulle informasjonen i blokken, prevhas
lagrer hashen til forrige blokk, og Hash
er hashen til blokken. I Bitcoin-spesifikasjonen Timestamp
, prevhash
og Hash
er blokkhoder, som danner en separat datastruktur, og transaksjoner (transaction
i vårt tilfelle) er en egen datastruktur. Så vi blander dem her for enkelhets skyld.
Så hvordan beregner vi hashen? Måten hashes beregnes på er en veldig viktig funksjon i blockchain, og det er denne funksjonen som gjør blockchain sikker. Saken er at å beregne en hash er en beregningsmessig vanskelig operasjon, det tar litt tid selv på raske datamaskiner (det er derfor folk kjøper kraftige GPUer for å utvinne Bitcoin). Dette er en tilsiktet arkitektonisk design, som gjør det vanskelig å legge til nye blokker, og dermed forhindre at de endres etter at de er lagt til. Vi vil diskutere og implementere denne mekanismen i en fremtidig artikkel.
Foreløpig tar vi bare blokkfelt, setter dem sammen og beregner en SHA-256-hash på den sammenkoblede kombinasjonen. La oss gjøre dette inn Newhash
metode:
func NewHash(tid tid.Tid, transaksjoner []streng, prevhash []byte) []byte {input := append(prevhash, time.String()...)for transaksjon := områdetransaksjoner {input = append(input, string(rune(transaksjon))...)}hash := sha256.Sum256(inndata)returner hash[:]}
Deretter, etter en Golang-konvensjon, implementerer vi en funksjon som vil forenkle opprettelsen av en blokk og finish:
func Blocks(transaksjoner []streng, prevhash []byte) *Blokker {aktuellTid := tid.Nå()returner &Blokkér{timestamp: time.Time{},transaksjoner: transaksjoner,prevhash: prevhash,Hash: NewHash(currentTime, transaksjoner, prevhash),}}
vi fortsetter å lage en utskriftsfunksjon. utskriftsfunksjonen er nyttig for å skrive ut innholdet i hver blokk som utfører en transaksjon. her er koden:
func Print(blokk *Blokker) {fmt.Printf("ttime: %sn", block.timestamp.String())fmt.Printf("tprevhash: %xn", block.prevhash)fmt.Printf("thash: %xn", block.Hash)}
Og funksjonstransaksjon for utskriftstransaksjon:
func Transaction(block *Block) {fmt.Println("tTransaksjoner:")for i, transaksjon := range block.transactions {fmt.Printf("tt%v: %qn", i, transaksjon)}}
etter at alle nødvendige funksjoner er fullført, vil vi bruke den i hovedfunksjonen:
func main () {ryan := []streng{"ryandi sendte 50 BTC til Reza"}block_1 := Blocks(ryan, []byte{})fmt.Println("Dette er vår første blokk")Skriv ut (blokk_1)Transaksjon(blokk_1)jack := []streng{"jack send 20 BTC til Reynold"}block_2 := Blocks(jack, block_1.Hash)fmt.Println("Dette er vår andre blokk")Skriv ut (blokk_2)Transaksjon(blokk_2)}
ok all koden vi har skrevet ferdig. la oss kjøre det ved å skrive go run main.go i terminal. Utgang:
konklusjonen
Vi bygde en veldig enkel blokkjedeprototype: det er bare en rekke blokker, der hver blokk har en forbindelse til den forrige. Selve blokkjeden er imidlertid mye mer kompleks. I blokkjeden vår er det enkelt og raskt å legge til nye blokker, men i ekte blokkjeder krever det litt arbeid å legge til nye blokker: man må utføre noen tunge beregninger før man får tillatelse til å legge til blokker (denne mekanismen kalles Proof-of-Work). Blockchain er også en distribuert database som ikke har noen enkelt beslutningstaker. Dermed må en ny blokkering bekreftes og godkjennes av andre deltakere i nettverket (denne mekanismen kalles konsensus). Og det er ingen transaksjoner i blokkjeden vår ennå!
- "
- Alle
- Artikkel
- artikler
- Bitcoin
- blockchain
- BTC
- bygge
- kjøpe
- kode
- datamaskiner
- tilkobling
- Konsensus
- innhold
- fortsette
- cryptocurrency
- Gjeldende
- dato
- Database
- utforming
- redaktør
- FAST
- Trekk
- Felt
- Først
- følge
- skjema
- funksjon
- framtid
- GV
- hash
- her.
- Hvordan
- hr
- HTTPS
- ia
- informasjon
- IP
- IT
- medium
- nettverk
- Annen
- Ansatte
- hindre
- prosjekt
- Proof-of-arbeid
- område
- Kjør
- Serien
- Enkelt
- So
- Begynn
- oppbevare
- butikker
- Teknisk
- tid
- Transaksjonen
- Transaksjoner
- W
- Arbeid
- skriving