Hvis du vil lære å bygge en blockchain, har du kommet til rett sted. La oss dykke dypt for å lære hvordan du kan bygge en blockchain i python.
Det er mange artikler rundt blockchain, men ikke alle snakker om å bygge en blockchain fra bunnen av. Som utvikler er teorier viktige, men du må også lage en blockchain for å forstå konseptet bak den helt.
Kjernen ideen bak blockchains er dens desentraliserte natur. Du vil bli fascinert av det faktum at det hele fungerer innvendig. Blockchain kan høres enkelt ut, men inne er det mange protokoller og algoritmer som får det til å skje. Vi skal bruke Python til å lage en blockchain fra bunnen av.
Du kan også lagre artikkelen og legge den til som “Hvordan lage vår blockchain”. Tro meg; artikkelen vil hjelpe deg i det lange løp.
Har du aldri hørt om blockchain? Så sjekk ut 101Blockchain gratis kurs. Hvis du ønsker å fremme karrieren din, kan du sjekke ut Certified Enterprise Blockchain Course hvor du lærer hvordan enterprise blockchain fungerer. La oss komme i gang.
Er du nybegynner i Blockchain? Meld deg på Blockchain Free Course og start Blockchain-reisen din nå.
Contents
Hvordan bygge en blockchain
Den beste måten å lære noe på er å lære ved å gjøre. For å være sikker på at du er på samme side som meg, la oss sjekke ut kravene først. Vi vil også kort beskrive blockchain slik at vi begge er på samme side.
Krav
Det grunnleggende kravet til å følge guiden er å vite hvordan du koder. Hvis du aldri har kodet i livet ditt, er denne guiden ikke noe for deg. Jeg anbefaler å sjekke ut de forskjellige nybegynnerkursene som er tilgjengelige online. Jeg anbefaler EdX, Udacity og Coursera for den beste læringsopplevelsen.
Er du allerede koderen? Deretter bør du vite om grunnleggende Python. Det vil også hjelpe deg å følge veiledningen “Hvordan bygge en blokkjede”.
Les nå: Quorum Blockchain Ultimate Guide
Vi laget opplæringen slik at alle kan følge. Så hvis du ikke vet og vil lære å bygge en blockchain fra bunnen av, er du velkommen til å gjøre det!
Hvis du ikke kjenner Python, ikke bekymre deg da det er lett å hente. Sjekk ut Python-dokumentasjon å komme i gang.
Vi skal bruke Python 3.6+ for opplæringen. Hvis du bestemmer deg for å bruke andre versjoner av Python, må du kanskje undersøke mer for at koden skal fungere. For opplæringsformål anbefaler jeg å installere den versjonen jeg bruker.
Til slutt bør du også vite om HTTP – protokollen som brukes til å kommunisere mellom to parter på internett.
Installere Python ved hjelp av pip
Du må installere Python ved hjelp av pip. Du må også installere fantastiske Requests and Flask-bibliotek. For å gjøre det, kjør bare kommandoen nedenfor.
$ pip installer kolbe == 0.12.2 forespørsler == 2.18.4
Hvis du bruker Windows-miljøet, kan du gå direkte til python.org for å laste ned den nyeste versjonen av Python.
Når det gjelder meg, lastet jeg ned Python 3.8.1 – den siste versjonen da jeg skrev opplæringen.
For IDE foretrekker jeg å bruke PyCharm. Jeg bruker Python Community-utgaven for opplæringen. Du kan bruke hvilken som helst IDE etter eget valg. Et annet flott alternativ er Visual Studio Code – et gratis, åpen kildekode integrert utviklingsmiljø.
Det siste verktøyet du trenger er Postman – en HTTP-klient. Alternativt kan du også bruke cURL.
Jeg anbefaler også å installere et virtuelt miljø for å skape et helt annet miljø for din utvikling. Du kan følge med denne guiden å sette den opp riktig.
Blockchain Revisited
Før vi går og bygger blockchain, må vi oppdatere ideen vår om blockchain. Dette vil hjelpe oss å holde oss på samme side.
Blockchain er en distribuert hovedboksteknologi der jevnaldrende kan delta, samhandle og utføre transaksjoner uten behov for en sentralisert enhet. Hver kollega har en kopi av hovedboken, noe som gjør det umulig for hackere å utføre svindel i systemet. De viktigste funksjonene i blockchain inkluderer gjennomsiktighet, uforanderlighet og sikkerhet. Den bruker avanserte kryptovaluta-algoritmer for å sikre datasikkerhet. For å oppnå konsensus, vil et blockchain-nettverk bruke konsensusalgoritmer som Proof-of-Work, Proof-of-Stake, og så videre.
Les også: Blockchain For Beginners: Getting Started Guide
Komme i gang med å bygge en Blockchain
Med alle nødvendige forutsetninger er vi nå klare til å komme i gang med veiledningen vår, “Hvordan bygge en blokkjede.”
For å komme i gang, må du opprette en blockchain.py-fil.
1. Blockchain Creation
Det første trinnet er å lage en funksjonell blockchain-løsning. Først må vi lage en Blockchain-klasse. Der vil vi lage en konstruktør som vil initiere kjede- og transaksjonslisten. Kjedelisten vil lagre blockchain, mens transaksjonene lagres i gjeldende_transacations-matrisen.
def __init __ (selv): self.chain = [] self.current_transactions = []
Deretter må vi opprette en new_block-funksjon som vil bli brukt til å opprette nye blokker og deretter legge dem til den eksisterende kjeden. Koden for new_block-funksjonen er som nedenfor:
def new_block (self): # Denne funksjonen oppretter nye blokker og legger deretter til den eksisterende kjedepassasjen
Metoden new_transcaction vil opprette en ny transaksjon og deretter legge til transaksjonen i den allerede eksisterende transaksjonslisten.
def new_transaction (self): #Denne funksjonen legger til en ny transaksjon i allerede eksisterende transaksjonspass. Vi har også en hash-funksjon som brukes til å lage hash for en blokk. @staticmethod def hash (blokk): #Brukt for hashing en blokk
Den siste funksjonen som vi skal lage last_block. Den brukes til å kalle den siste blokken i kjeden.
Vi kan også lage tre funksjoner til her.
- register_node () → For å registrere en ny node og legge den til i nettverket
- valid_proof () → Vil sikre at en innsendt blokk til kjeden løser problemet
- valid_chain () → Dette vil sjekke om de påfølgende blokkene i kjeden er gyldige eller ikke.
Tegningen for blockchain.py ser ut som nedenfor.
klasse Blockchain (objekt): def __init __ (self): self.chain = [] self.current_transactions = [] def new_block (self): # Denne funksjonen skaper nye blokker og legger deretter til den eksisterende kjedepassering def new_transaction (selv): #Denne funksjonen legger til en ny transaksjon i allerede eksisterende transaksjoner pass @staticmethod def hash (blokk): #Brukt for hashing en blokk @ eiendom def siste_blokk (selv): # Ringer og returnerer den siste blokken i kjedepasset
Blockchain-klassen styrer hele kjeden. Definisjonene definert under klassen styrer de forskjellige handlingene innen blockchain.
La oss gå gjennom hver av metodene nedenfor.
Les nå: Hva er blockchain sharding: En introduksjon til en blockchain-skaleringsløsning
Struktur av en blokk
En blokk inneholder viktig informasjon om transaksjoner og kjeder. Enhver blokk i kjeden vil inneholde følgende informasjon
- indeks
- tidsstempel i Unix-tid
- transaksjonsliste
- bevis
- Tidligere blokk hash
Det meste av informasjonen i blokken er selvforklarende. Her er de to viktige variablene forrige_hash, som inneholder hash-verdien til forrige blokk. Dette er viktig da det sørger for at blockchain er uforanderlig, og ingen ondsinnet aktør kan oppdatere, slette eller legge til data i kjeden.
Les nå: Hvorfor Blockchain vil forandre verden?
Legge til transaksjon i en blokk
Med blokkens struktur forstått, la oss nå lære å legge til en transaksjon i blokken. Koden for det er som nedenfor.
def new_transaction (self): # Denne funksjonen legger til en ny transaksjon i allerede eksisterende transaksjoner """Dette vil opprette en ny transaksjon som vil bli sendt til neste blokkering. Den vil inneholde tre variabler inkludert avsender, mottaker og beløp """ self.current_transactions.append ({‘sender’: avsender, ‘mottaker’: mottaker ‘beløp’: beløp,}) returnerer self.last_block [‘indeks’] + 1 Som du ser, legger den ganske enkelt til gjeldende_transaksjonsliste med en objekt som inneholder tre variabler → avsender, mottaker, beløp.
Når tilsetningen er gjort, sender metoden blokkindeksen til kjeden. Det er neste blokk som skal utvinnes.
Opprette nye blokker
Før vi begynner å lage nye blokker, må vi lage genese-blokken. For å gjøre det, må vi bruke en enkel kodelinje som nedenfor.
self.new_block (previous_hash = 1, proof = 100)
Denne linjen skal legges til i Blockchain-klassen.
For metoden new_block () må du sende to variabler som parametere. Det inkluderer bevis og forrige_hash.
La oss nå se på metoden new_block () nedenfor.
def new_block (self, proof, previous_hash = None): # Denne funksjonen skaper nye blokker og legger deretter til den eksisterende kjeden """Denne metoden vil inneholde to parametere bevis, forrige hash""" block = {‘index’: len (self.chain) + 1, ‘timestamp’: time (), ‘proof’: proof, previous_hash: previous_hash or self.hash (self.chain [-1]),}
# Sett gjeldende transaksjonsliste til tom.
self.current_transactions = [] self.chain.append (block) returblokk
La oss forklare koden til new_block. Vi oppretter en blokkeringsliste som inneholder de tre viktige parametrene. Når de er definert, skriver vi også koden for å tilbakestille gjeldende_transaksjonsliste og deretter føyer blokken til kjeden. Den nye_blokk-metoden, når den kalles, returnerer blokken.
Les nå: Beginner’s Guide: What is Ethereum Classic?
La oss også definere last_block-metoden nedenfor.
@eiendom
def last_block (selv):
# Ringer og returnerer den siste blokken i kjeden
returner selvkjede [-1]
Også koden for hash () -metoden er som nedenfor:
def hash (blokk): #Brukt til hashing av en blokk """Følgekoden vil opprette en SHA-256-blokk hash og sikre at ordboken blir bestilt""" block_string = json.dumps (block, sort_keys = True) .encode () return hashlib.sha256 (block_string) .hexdigest () Hvis du kombinerer all koden til nå, har vi følgende blockchain.py. Sjekk det nedenfor.
klasse Blockchain (object): def __init __ (self): self.chain = [] self.current_transactions = [] self.new_block (previous_hash = 1, proof = 100) def new_block (self, proof, previous_hash = None): #This funksjon oppretter nye blokker og legger deretter til den eksisterende kjeden """Denne metoden vil inneholde to parametere bevis, forrige hash""" block = {‘index’: len (self.chain) + 1, ‘timestamp’: time (), ‘proof’: proof, previous_hash: previous_hash or self.hash (self.chain [-1]),} # Set gjeldende transaksjonsliste som skal tømmes. self.current_transactions = [] self.chain.append (block) returblokk def new_transaction (self): #Denne funksjonen legger til en ny transaksjon til allerede eksisterende transaksjoner """Dette vil opprette en ny transaksjon som vil bli sendt til neste blokkering. Den vil inneholde tre variabler inkludert avsender, mottaker og beløp """ self.current_transactions.append ({‘sender’: sender, ‘mottaker’: mottaker, ‘beløp’: beløp,}) returnerer self.last_block [‘index’] + 1 @staticmethod def hash (blokk): #Brukt for hashing en blokk """Følgekoden vil opprette en SHA-256-blokk hash og sikre at ordboken blir bestilt""" block_string = json.dumps (block, sort_keys = True) .encode () return hashlib.sha256 (block_string) .hexdigest () @ property def last_block (self): # Ringer og returnerer den siste blokken i kjeden retur selv. kjede [ -1]
Bevis på gjennomføring av arbeid
Vårt neste trinn i å bygge blockchain.py er Proof-of-Work-implementeringen.
Så, hva er bevis på arbeid? Det er en konsensusmetode som brukes til å legge til nye blokker i kjeden. Det utgjør en utfordring for gruvearbeideren, og når gruvearbeideren løser problemet, blir blokken bekreftet. Minearbeideren får til gjengjeld en belønning basert på problemets kompleksitet.
Bitcoin’s Proof of Work er kjent som Hashcash. Det sørger for at bitcoin-nettverkskonsensus fungerer som forutsatt.
Les også: Konsensusalgoritmer: Roten til Blockchain-teknologien
La oss definere proof_of_work () -metoden. Metoden vil være en del av Blockchain-klassen.
def proof_of_work (selv, siste_tett): """Denne metoden er der du konsensusalgoritmen er implementert. Det tar to parametere inkludert selv og last_proof""" proof = 0 mens self.valid_proof (last_proof, proof) er False: proof + = 1 return proof @staticmethod def valid_proof (last_proof, proof): """Denne metoden validerer blokken""" gjett = f ‘{last_proof} {proof}’. kod (giss) = hashlib.sha256 (gjett) .hexigest () return gjet_hash [: 4] == "0000"
Den første proof_of_work-metoden er enkel; det setter bare bevis til 0 og kjører deretter en stund-loop for å kjøre valid_proof-metoden. Hvis det er usant, legg til en i beviset.
Du kan øke vanskeligheten med hasjen ved å legge til flere nuller.
Dette fører oss til slutten av vår Blockchain.py. Koden vår står som nedenfor.
klasse Blockchain (objekt): def __init __ (self): self.chain = [] self.current_transactions = [] self.new_block (previous_hash = 1, proof = 100) def proof_of_work (self, last_proof): """Denne metoden er der du konsensusalgoritmen er implementert. Det tar to parametere inkludert selv og last_proof""" proof = 0 mens self.valid_proof (last_proof, proof) er False: proof + = 1 return proof @staticmethod def valid_proof (last_proof, proof): """Denne metoden validerer blokken""" gjett = f ‘{last_proof} {proof}’. kod (giss) = hashlib.sha256 (gjett) .hexigest () return gjet_hash [: 4] == "0000" def new_block (self, proof, previous_hash = None): # Denne funksjonen skaper nye blokker og legger deretter til den eksisterende kjeden """Denne metoden vil inneholde to parametere bevis, forrige hash""" block = {‘index’: len (self.chain) + 1, ‘timestamp’: time (), ‘proof’: proof, previous_hash: previous_hash or self.hash (self.chain [-1]),} # Set gjeldende transaksjonsliste som skal tømmes. self.current_transactions = [] self.chain.append (block) returblokk def new_transaction (self): #Denne funksjonen legger til en ny transaksjon til allerede eksisterende transaksjoner """Dette vil opprette en ny transaksjon som vil bli sendt til neste blokkering. Den vil inneholde tre variabler inkludert avsender, mottaker og beløp """ self.current_transactions.append ({‘avsender’: avsender, ‘mottaker’: mottaker, ‘beløp’: beløp,})
returner selv.last_block [‘index’] + 1
@staticmethod
def hash (blokk):
#Brukt for hashing en blokk
“” “Følgende kode vil opprette en SHA-256-blokk hash og også sikre at ordboken er bestilt” “”
block_string = json.dumps (block, sort_keys = True) .encode ()
returner hashlib.sha256 (block_string) .hexdigest ()
@eiendom
def last_block (selv):
# Ringer og returnerer den siste blokken i kjeden
returner selvkjede [-1]
2. API-integrasjon
Flott, vi lager en blockchain som fungerer! Nå, for å bruke det effektivt, må vi lage et API (Application Programming Interface).
For å gjøre det skal vi bruke det populære Python Framework: Flask.
Flask er et mikro-rammeverk, som betyr at den er lett, og du kan legge til bibliotekene du trenger. Det lar deg også lage Python-funksjonsendepunkt enkelt.
For å lage API-er, må vi først sørge for at blockchain kan godta forespørsler via HTTP. For å gjøre det, må vi lage flere metoder.
Nå vil vi endre blockchain.py.
# Opprette app-node-app = Kolbe (__ name__) node_identifier = str (uuid4 ()). Erstatte (‘-‘, ”) # Initialisere blockchain blockchain = Blockchain () @ app.route (‘/ mine’, metoder = [ ‘GET’]) def mine (): return "Gruvedrift en ny blokk" @ app.route (‘/ transaksjoner / ny’, metoder = [‘POST’]) def new_transaction (): return "Legger til en ny transaksjon" @ app.router (‘/ chain’, methods = [‘GET’]) def full_chain (): respons = {‘chain’: blockchain.chain, ‘length’: len (blockchain.chain)} returner jsonify (respons) , 200 hvis __name__ == ‘__main__’: app.run (host ="0.0.0.0", port = 5000)
Koden er selvforklarende for det meste. Vi gjør først en nodeinitiering. Deretter lager vi en tilfeldig node. Når det er gjort, initialiserer vi deretter Blockchain-klassen. Når det er gjort, må vi opprette tre sluttpunkter som nedenfor.
- / mitt endepunkt
- / transaksjoner / nytt sluttpunkt
- / kjedeendepunkt
Til slutt kjører vi serveren på 5000-port.
Appen er nå nesten opprettet. Alt vi trenger å gjøre er å lage transaksjonsklassemetoden.
@ app.route (‘/ transaksjoner / ny’, metoder = [‘POST’]) def new_transaction (): values = request.get_json () # Kontrollerer om nødvendige data er der eller ikke kreves = [‘avsender’, ‘ mottaker ‘,’ beløp ‘] hvis ikke alle (k i verdier for k i påkrevd): returner’ Manglende verdier ‘, 400 # oppretter en ny transaksjonsindeks = blockchain.new_transaction (verdier [‘ avsender ‘], verdier [‘ mottaker ‘ , values [‘amount’]]) response = {‘message’: f’Transaksjon er planlagt lagt til i blokk nr. {index} ‘} retur jsonify (respons), 201
Les også: Her er hva du trenger å vite om Blockchain-bevis på arbeid
Gruvedriftens sluttpunkt
Det siste endepunktet vi skal lage er gruvedriftens endepunkt. For å gjøre det må vi sørge for at det gjør følgende tre ting.
- Arbeidsbevisberegning
- Smi ny blokkjede og legg den til i kjeden
- Beløn gruvearbeideren for sitt arbeid
@ app.route (‘/ mine’, methods = [‘GET’]) def mine (): """Her får vi bevis på arbeidsalgoritme til å fungere""" last_block = blockchain.last_block last_proof = last_block [‘proof’] proof = blockchain.proof_of_work (last_proof) # belønner gruvearbeideren for sitt bidrag. 0 angir at ny mynt er utvunnet blockchain.new_transaction (avsender ="0", mottaker = node_identifier, beløp = 1,) # Opprett nå den nye blokken og legg den til kjeden previous_hash = blockchain.hash (last_block) block = blockchain.new_block (proof, previous_hash) response = {‘message’: ‘Den nye blokken har blitt forfalsket ‘,’ indeks ‘: blokk [‘ indeks ‘],’ transaksjoner ‘: blokk [‘ transaksjoner ‘],’ bevis ‘: blokk [‘ bevis ‘],’ forrige_hash ‘: blokk [‘ forrige_hash ‘]} retur jsonify (svar), 200
Les nå: Nybegynnerveiledning: Hva er AION? Verdens første tredje generasjon Blockchain Network
3. Blockchain-interaksjon
Det siste trinnet er å samhandle med blockchain. Vi skal bruke Postman til å samhandle med blockchain-nettverket ved hjelp av API-en vi nettopp opprettet.
Kjør koden nedenfor på Python Console
python blockchain.py
Konklusjon
Dette fører oss til slutten av hvordan vi bygger en blockchain. Håper trinnene og kodene ovenfor vil hjelpe deg med å bygge en Blockchain i Python. Så hvis du er nybegynner og ønsker å bygge en karriere i Blockchain, foreslår vi at du starter din blockchain-karriere med vårt gratis Blockchain Fundamentals Course. Velg oss som studiepartner, så får vi deg til du ikke får drømmejobben.
Så, hva synes du om blockchain og implementeringen? Kommenter nedenfor og gi oss beskjed.