Hela mÀnsklighetens historia Àr en oavbruten befrielse frÄn kedjor och skapandet av nya, Ànnu starkare. (Anonym författare)
NÀr jag analyserar ett antal blockchain-projekt (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin osv.) inser jag att de alla tekniskt sett bygger pÄ samma principer. Blockkedjor liknar hus, dÀr det finns en grund, vÀggar, tak, fönster och dörrar, som Àr kopplade till varandra pÄ specifika sÀtt, trots alla olika konstruktioner, dekorer och funktioner. Om man förstÄr de grundlÀggande designprinciperna för byggnader och kÀnner till egenskaperna hos de anvÀnda materialen, kan man avgöra det specifika syftet med ett hus. För nÀrvarande finns det en situation med blockchain dÀr alla har hört talas om det, men fÄ förstÄr arkitekturen och principerna för dess funktion. DÀrför uppstÄr det oklarheter kring varför och hur det Àr meningsfullt att anvÀnda blockchain-teknologier.
I den hÀr artikeln kommer vi att diskutera de gemensamma egenskaperna och principerna för alla blockkedjor. Sedan kommer vi att titta pÄ de uppgifter som kan lösas med hjÀlp av blockchain, och för att befÀsta materialet kommer vi att bygga en liten, men verklig blockkedja pÄ vÄr virtuella tomt!
SÄ, lÄt oss komma ihÄg vilka problem blockchain ursprungligen löste.
Jag Àr sÀker pÄ att mÄnga kommer att nÀmna en distribuerad, decentraliserad, offentlig och oförÀndrad databas. Men varför var allt detta nödvÀndigt?
Jag föredrar att börja studera en teknik genom att lÀsa standarder, eftersom alla artiklar och böcker om det aktuella Àmnet grundas pÄ dem. Men det finns för nÀrvarande inga standarder för blockchain, endast för deras utveckling. För nÀrvarande har varje offentligt blockchain-projekt sitt eget dokument White paper, som i sjÀlva verket fungerar som en teknisk specifikation. Det första allmÀnt kÀnda blockchain-projektet Àr nÀtverket Bitcoin. Vi gÄr till den officiella webbplatsen för nÀtverket och hur allt började.
Blockchainens uppgift
SÄ, uppgiften som blockchain löser i det banbrytande Bitcoin-nÀtverket Àr att möjliggöra en pÄlitlig överföring av ÀganderÀtt över digitala tillgÄngar i en icke-pÄlitlig miljö utan mellanhÀnder. Till exempel, i Bitcoin-nÀtverket Àr den digitala tillgÄngen bitcoin-mynt. Alla tekniska lösningar för Bitcoin och andra blockkedjor handlar om att lösa denna uppgift.
Problemen som blockchain löser
Anta en finansiell organisation hÀvdar att den har byggt ett nÀtverk över hela vÀrlden för att kunna överföra pengar till vem som helst. Skulle du lita pÄ den? Om denna organisation Àr Visa eller MasterCard, Àr det troligt att du skulle göra det, men om det Àr nÄgot som AnonymousWorldMoney, kanske inte. Varför? DÀrför att vi vet hur distribuerade system skapas av privata företag, med vilka syften, och vilka konsekvenser det kan fÄ. LÄt oss titta nÀrmare pÄ problemen med sÄdana system och hur de kan lösas med hjÀlp av blockchain-teknologi.
Anta att det i AnonymousWorldMoney finns servrar med databaser, och det Àr bra om det finns flera pÄ olika datacenter. NÀr avsÀndaren överför pengar registreras en transaktion som replikerar pÄ alla servrar, och pengarna kommer fram till mottagaren.

I en perfekt vÀrld fungerar en sÄdan modell utmÀrkt, men i vÄr verklighet uppstÄr följande problem:
- Problemet med att identifiera deltagare Ä ena sidan och behovet av anonymitet i transaktioner Ä andra sidan. Det vill sÀga, man mÄste överföra pengar till en specifik mottagare och se till att ingen, förutom parterna i affÀren, kÀnner till transaktionen. Banker har kontonummer och bankkort kopplade till en specifik fysisk eller juridisk person, och banksekretessen skyddar information om transaktioner. Men vem garanterar att AnonymousWorldMoney inte anvÀnder personliga uppgifter och transaktionsinformation för sina egna syften?
- Hur kan man vara sÀker pÄ att mottagaren faktiskt har fÄtt den summa som överförts? LÄt oss sÀga att avsÀndaren skickade $100, men mottagaren fick bara $10. AvsÀndaren gÄr till kontoret för AnonymousWorldMoney med sin kvitto, men expediten visar sin version dÀr det stÄr att avsÀndaren bara överförde $10.
- Problemet med en brist pÄ förtroende, till exempel bedrÀgeri som kallas double-spending. En illojal deltagare kan spendera sin saldo flera gÄnger innan betalningen har replikerats pÄ alla servrar. , sjÀlvklart, gÀller fortfarande, och konsistens kommer slutligen att uppnÄs, men nÄgon kommer inte att fÄ pengar för de utförda tjÀnsterna eller varorna. DÀrför, om det inte finns nÄgot fullstÀndigt förtroende för betalningsorganisationen eller deltagarna i affÀren, mÄste man bygga ett nÀtverk baserat pÄ kryptografi snarare Àn pÄ förtroende.
- Det villkorliga AnonymousWorldMoney har ett begrÀnsat antal servrar som kan bli otillgÀngliga av misstag eller av illvilliga avsikter.
- AnonymousWorldMoney kommer att ta ut sin pÄtagliga provision.
- Möjlighet till styrning. Under anvÀndningen av Bitcoin har det visat sig att mÀnniskor inte bara vill överföra mynt till varandra, utan Àven kontrollera olika villkor för transaktioner, programmera arbetsflöden och automatiskt utföra ÄtgÀrder beroende pÄ villkor osv.
Hur blockkedjan löser dessa problem
- Identifiering av deltagare sker genom ett par nycklar: en privat och en öppen, och algoritmen för digital signatur identifierar entydigt avsÀndare och mottagare, vilket bevarar deras anonymitet.
- Transaktioner samlas i block, en hash av blocket berÀknas och skrivs ned i nÀsta block. Denna sekvens av att skriva hashar i block gav namn Ät teknologin blockchain och gör det omöjligt att diskret Àndra / ta bort block eller enskilda transaktioner frÄn block. Om en transaktion har hamnat i blockkedjan kan man vara sÀker pÄ att dess data förblir oförÀndrad.
- Double-spending-bedrÀgeri förhindras genom att nÄ konsensus i nÀtverket om vilka data som ska anses som giltiga och vilka som ska avvisas. I Bitcoin-nÀtverket uppnÄs konsensus genom Proof-of-Work (PoW).
- Tillförlitligheten i nÀtverkets funktion uppnÄs genom att blockkedjan Àr offentlig, dÀr varje deltagare kan köra sin nod, fÄ en fullstÀndig kopia av blockkedjan och dessutom sjÀlvstÀndigt börja kontrollera transaktioner pÄ korrekthet. Det bör noteras att moderna blockkedjor tillÄter att bygga bÄde offentliga (öppna) och privata (stÀngda) blockkedjor, samt anvÀnda kombinerade arrangemang.
- Man kan inte fullt ut undgÄ avgifter i blockkedjan eftersom man mÄste betala mÀnniskorna som stödjer nÀtverket, men behovet av avgifter bevisas sÄ övertygande i blockkedjan att det inte finns nÄgra tvivel om dess nödvÀndighet.
- Moderna blockkedjor har möjlighet att implementera affÀrslogik, som i blockkedjan kallas Smart Contracts. Logiken för smarta kontrakt implementeras pÄ olika högre programsprÄk.
LÄt oss titta nÀrmare pÄ dessa lösningar.
Blockkedjans arkitektur
BestÄndsdelar av blockkedjan
Varje deltagare kan köra sin nod med en fullstÀndig kopia av blockchainen (full node). Fulla noder som kan registrera transaktioner i blockchainen kallas konsensus noder (witness) eller miners (miner). Fulla noder som bara kontrollerar transaktionernas korrekthet kallas granskningsnoder (audit). LÀtta klienter (light clients) lagrar inte fullstÀndiga kopior av blockchainen utan interagerar med nÀtverket genom att anvÀnda fulla noder.
De flesta anvÀndare för att genomföra transaktioner anvÀnder just lÀtta klienter eller webplÄnböcker. Alla noder Àr kopplade till varandra. Med en sÄdan uppsÀttning element blir nÀtverksarkitekturen mer robust:

Transaktionens livscykel
LÄt oss titta pÄ livscykeln för en transaktion och bryta ner den i delar:

Blockchain-teknologier
LÄt oss gÄ djupare in pÄ tekniska lösningar och deras relationer till varandra.
Identifiering
Varje blockchain-transaktion mÄste signeras med en digital signatur. DÀrför mÄste varje deltagare ha ett nyckelpar för att genomföra en transaktion: privat / offentlig. Ibland kallas nyckelparet en plÄnbok (wallet), eftersom nycklarna Àr entydigt kopplade till en unik digital adress och deltagarens saldo. I praktiken Àr nycklar och adresser bara strÀngar av siffror i olika talsystem. Exempel pÄ nycklar och plÄnboksadress:
Privat nyckel: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Offentlig nyckel: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Adress: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27VFör att skapa en digital signatur i blockchain anvÀnds en algoritm baserad pÄ elliptiska kurvor: Elliptic Curve Digital Signature Algorithm (ECDSA). För dess funktion anvÀnds vanligtvis den privata nyckeln (ett 256-bitars tal) som tas slumpmÀssigt. Antalet möjliga nycklar Àr 2 upphöjt till 256, sÄ man kan tala om praktiskt taget omöjlighet till kollisioner av vÀrden pÄ privata nycklar.
DÀrefter erhÄlls den offentliga nyckeln frÄn den privata genom att multiplicera dess vÀrde med koordinaterna för en punkt som ligger pÄ den elliptiska kurvan, vilket resulterar i koordinaterna för en ny punkt pÄ samma kurva. Denna ÄtgÀrd garanterar att man fÄr ett nyckelpar som Àr lÀmpligt för digital signering av transaktioner. Och slutligen berÀknas plÄnboksadressen entydigt frÄn den offentliga nyckeln.
Det finns mÄnga artiklar med detaljer om kryptografi som anvÀnds i blockchain, till exempel:
Den privata nyckeln mÄste hÄllas strikt hemlig och förvaras sÀkert. Den offentliga nyckeln Àr kÀnd för alla. Vid förlust av den privata nyckeln gÄr det inte att ÄterfÄ tillgÄngen (valutan) och pengarna kommer att gÄ förlorade för alltid. DÀrför Àr uppgiften att pÄ ett pÄlitligt sÀtt lagra de privata nycklarna mycket aktuell, eftersom det inte Àr en bank dÀr man alltid kan gÄ med sitt ID och ÄterfÄ sitt konto. Det finns en hel industri som tillverkar sÄ kallade kalla kryptovaluta-plÄnböcker som liknar USB-minnen:

eller sÄ kan man anvÀnda mer pÄlitliga metoder, som exempelvis att ingraverad vÀrdet av den privata nyckeln pÄ token:

Transaktioner
Mer om transaktionsstrukturen kan man lÀsa i artikeln . Det Àr viktigt att förstÄ att varje transaktion har Ätminstone följande data:
FrÄn: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - avsÀndarens digitala adress
Till: 0x367adb7894334678b90aFe7882a5b06f7fbc783a - mottagarens digitala adress
VĂ€rde: 0.0001 - transaktionsbelopp
Transaktionshash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - transaktionshashDÀrefter signeras transaktionen med den privata nyckeln och skickas till (se detaljer om protokollets funktion ) alla noder i blockchainen som kontrollerar transaktioner pÄ deras giltighet. Algoritmen för att verifiera transaktionen Àr inte trivial och inkluderar .
Transaktionsblock
Efter att ha verifierat transaktionernas giltighet skapar noderna block av dem. Förutom transaktioner registreras Àven hash av det föregÄende blocket, ett nummer (nonce-rÀknare) och hash av det aktuella blocket berÀknas enligt SHA-256-algoritmen. Hashen mÄste uppfylla vissa svÄrighetsvillkor. Till exempel justeras hashens svÄrighet automatiskt varannan vecka i Bitcoin-nÀtverket beroende pÄ nÀtverkets kraft sÄ att ett block genereras ungefÀr var tionde minut. SvÄrighetsgraden definieras av följande villkor: den funna hash mÄste vara mindre Àn ett förutbestÀmt nummer. Om detta villkor inte Àr uppfyllt lÀggs 1 till nonce, och arbetet med att berÀkna hash upprepas. För att hitta hash anvÀnds nonce-fÀltet, eftersom det Àr de enda data i blocket som kan Àndras, medan övriga mÄste förbli oförÀndrade. Den korrekta hashen mÄste ha ett visst antal nollor i början, till exempel en av de verkliga hasharna:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91Ett framgÄngsrikt hashande Àr beviset pÄ det arbete som utförts (Proof-of-Work, PoW) för Bitcoin- eller Ethereum-nÀtverk. Processen för att hitta hashes kallas mining, i likhet med guldutvinning. Namnet beskriver ganska exakt essensen av processen, eftersom det handlar om en enkel bris av alternativ, och om nÄgon finner en lÀmplig hash Àr det verkligen en tur. Det Àr som att hitta en verklig guldklimp i ton av grus. Belöningen för en block Àr nu 12,5 BTC och om man multiplicerar det med det aktuella bitcoinpriset pÄ $3900, sÄ blir det mer Àn ett kilogram rent guld. Det finns nÄgot att kÀmpa för!
Efter att en hash har hittats sparas blocket och den funna hashen i blockkedjan med nÀsta block. För mer information om strukturen av blocken kan du kolla in artikeln , och nedan kommer jag att visa ett förenklat schema:

Blockkedjan börjar med ett block som Ànnu inte har en hash av föregÄende block. Ett sÄdant block is ensamt i blockkedjan och har ett eget namn, Genesis block. De övriga blocken har samma struktur och skiljer sig endast Ät i antal transaktioner. Riktiga transaktioner och block som för nÀrvarande skapas i Bitcoin eller Ethereum kan ses i .
Blockstorleken i Bitcoin Àr begrÀnsad till 1 Mb och med en minimal mÀngd information i en transaktion pÄ cirka 200 bytes kan det maximalt finnas cirka 6000 transaktioner i ett block. Detta förklarar för övrigt varför mÄnga skrattar Ät Bitcoins prestanda: ett block genereras ungefÀr var 10:e minut * 60 sek = 600 sekunder, vilket ger en formell kapacitet pÄ cirka 10 TPS. Men egentligen Àr detta inte prestanda, utan en medvetet implementerad arbetsalgoritm. För att konkurrera har Ethereum helt enkelt gjort blockgenereringstiden 15 sekunder., vilket formellt ökar prestandan. DÀrför Àr det överhuvudtaget meningslöst att jÀmföra prestanda i blockkedjor som anvÀnder PoW som konsensus, eftersom det direkt beror pÄ svÄrighetsgraden av hashberÀkning, som kan sÀttas till valfritt vÀrde.
Forks
Vad hÀnder om, till exempel, flera noder hittar hashvÀrden som uppfyller svÄrighetsvillkoren, men har olika vÀrden (med andra ord, de kommer fram till olika konsensus och registrerar block i blockkedjan)? LÄt oss se hur blockkedjan skyddar sig mot denna situation. I detta fall uppstÄr sÄ kallad fork ('gaffel'), och blockkedjan har tvÄ versioner av kedjan:

Vad hÀnder sedan? DÀrefter börjar en del av nÀtverket arbeta med block N+2 frÄn en kedja, och en del frÄn en annan:

NÄgot av dessa block kommer att hittas tidigare och skickas till blockkedjan, och dÄ mÄste blockkedjan enligt reglerna vÀxla till den lÀngre kedjan och avbryta alla transaktioner frÄn det alternativa blocket:

Det kan ske en situation dĂ€r en deltagares transaktion fanns endast i ett av blocken i forks, som sedan blev avbrutet. DĂ€rför, för att vara sĂ€ker pĂ„ att den nödvĂ€ndiga transaktionen har registrerats i blockkedjan, finns det en allmĂ€n rekommendation â innan man litar pĂ„ en transaktion bör man vĂ€nta tills nĂ„gra följande block har lagts till i blockkedjan. Rekommendationerna för hur mĂ„nga block man bör vĂ€nta varierar för olika blockkedjor. Till exempel, för Bitcoin-nĂ€tverket Ă€r minimum 2 block, maximum 6.
Samma bild med blockforkar kommer att observeras vid den sĂ„ kallade 51%-attaken â det Ă€r nĂ€r en grupp minerare försöker vĂ€xa en alternativ kedja av block, och strĂ€va efter att avbryta kedjan med sina bedrĂ€gliga transaktioner. Ăven om det för nĂ€rvarande, istĂ€llet för bedrĂ€geri, Ă€r lönsammare att anvĂ€nda sina resurser för Ă€rlig mining.
Konsensus
För att registrera ett block i blockkedjan mÄste nÀtverket komma till konsensus. LÄt oss Äterkalla uppgiften att uppnÄ konsensus i datorsystem och nÀtverk. Problemet formuleras som en byzantinsk generals BFT-uppgift (). Utan att gÄ in pÄ den fÀrgstarka beskrivningen av problemen med den byzantinska armén kan uppgiften formuleras sÄ hÀr: hur kan noder i nÀtverket komma fram till ett gemensamt resultat om en del av noderna medvetet kan förvrÀnga dem? De befintliga algoritmerna för att lösa BFT-uppgiften visar att nÀtverket kan fungera korrekt om bedragarna Àr mindre Àn 1/3. Varför tillÀmpades inte BFT-konsensus i Bitcoin-nÀtverket? Varför var det nödvÀndigt att anvÀnda PoW? Det finns flera skÀl:
- BFT fungerar bra med en liten fast uppsÀttning noder, men i en offentlig blockchain Àr antalet noder oförutsÀgbart och dessutom kan noder slÄs pÄ och av godtyckligt.
- Det Àr nödvÀndigt att motivera mÀnniskor att köra blockchain-noder. För detta mÄste mÀnniskor fÄ belöningar. I BFT finns det formellt inget som man fÄr belöning för, men i PoW Àr det uppenbart pÄ ett intuitivt plan vad belöningen Àr för: den elektricitet som processorn förbrukar i jakten pÄ blockets hash.
Förutom PoW finns det flera andra konsensusmekanismer som anvÀnds i moderna blockchains, till exempel:
- PoS (Proof-of-Stake) â i blockchain
- DPoS (Delegated Proof-of-Stake) â i blockchain
- Modifieringar av BFT: SBFT (Simplified BFT) och PBFT (Practical BFT), till exempel i blockchain
LÄt oss stanna upp vid PoS-konsensus, eftersom just PoS och dess varianter har fÄtt störst spridning i privata blockchains. Varför just i privata? à ena sidan Àr egenskaperna hos PoS bÀttre jÀmfört med PoW, eftersom mindre datorkraft krÀvs för att uppnÄ konsensus, vilket ökar hastigheten pÄ dataskrivning i blockchain. Men Ä andra sidan finns det fler möjligheter till bedrÀgeri i PoS, sÄ för att neutralisera detta mÄste alla deltagare i blockchain vara kÀnda.
PoS-konsensus Àr baserat pÄ valet av en nod som kan skriva ett block med transaktioner i blockchain beroende pÄ mÀngden medel pÄ kontot, snarare, inte pÄ kontot, utan i sÀkerhet. Det vill sÀga ju fler medel du har i sÀkerhet, desto mer sannolikt Àr det att nÀtverket vÀljer din nod för att skriva blocket. SÀkerheten Äterbetalas inte om blocket visar sig vara ogiltigt. PÄ sÄ sÀtt implementeras skydd mot bedrÀgeri. Det finns följande variationer av PoS:
- Delegated PoS (DPoS) konsensus delar upp deltagarna i "röstande" och "validerande". Innehavare av mynt (röstande deltagare) delegerar sin rÀtt att kontrollera och skriva transaktioner i blockchain till andra deltagare. SÄledes utför validerarna allt berÀkningsarbete och fÄr betalt för det, medan nÀrvaron av röstande deltagare garanterar validerarnas Àrlighet, eftersom de kan bytas ut nÀr som helst.
- LPoS (Leased Proof-of-Stake) konsensus gör att du kan hyra ut dina medel till andra noder, vilket ökar deras chans att verifiera block. PÄ sÄ sÀtt kan du tjÀna provision för transaktioner utan att delta i sjÀlva verifieringen av transaktioner och blockmining.
Det finns flera andra konsensusmetoder som Ànnu inte har fÄtt nÄgot brett genomslag, jag nÀmner dem hÀr för information, och en översikt över sjÀlva konsensusalgoritmer kan ses, till exempel i artikeln: .
- PoET (Proof-of-Elapsed Time)
- PoC (Proof-of-Capacity)
- PoB (Proof-of-Burn)
- PoWeight (Proof-of-Weight)
- PoA (Proof-of-Activity) â PoW + PoS
- PoI (Proof-of-Importance)
Tillförlitlighet och modeller för blockchain-distribution
Offentlig blockchain
BestÀndighet Public eller ett annat namn Permissionless blockchain nÄtt genom att vem som helst kan ansluta och se information eller till och med koppla sin egen nod, medan tillit byggs pÄ PoW-konsensus.
Privat blockchain
Private eller Private Permissioned blockchain. I dessa blockkedjor har endast en sÀrskild grupp deltagare (organisationer eller individer) tillgÄng till informationen. SÄdana blockkedjor byggs av organisationer för att öka den totala nyttan eller effektiviteten. Deras tillförlitlighet sÀkerstÀlls av gemensamma mÄl för deltagarna och konsensusalgoritmerna PoS och BFT.
Blockchain-konsortium
Det finns Consortium eller Public Permissioned blockchain. Det Àr sÄdana blockkedjor som vem som helst kan ansluta sig till för att se, men att lÀgga till information eller koppla sin nod kan deltagare endast göra med tillstÄnd frÄn andra deltagare. SÄdana blockkedjor byggs av organisationer för att öka tilliten frÄn kunder eller konsumenter av produkter eller samhÀllet i stort. HÀr sÀkerstÀlls tillförlitligheten ocksÄ genom förekomsten av förtroende mellan deltagarna och samma konsensusalgoritmer som PoS och BFT.
Smart Contracts
I blockkedjor som implementerades efter Bitcoin har möjligheten att utföra smarta kontrakt lagts till i olika grad. I sin kÀrna Àr ett smart kontrakt en transaktion dÀr programkod för utförande Àr inkluderad. Smarta kontrakt i Ethereum-nÀtverket körs i EVM (Ethereum Virtual Machine). För att ett smart kontrakt ska börja utföras mÄste det i tydligt startas av en annan transaktion, eller sÄ mÄste vissa förutsÀttningar uppfyllas för att det ska kunna genomföras. Resultaten av ett smart kontrakts utförande registreras ocksÄ i blockkedjan. Att hÀmta data utanför blockkedjan Àr möjligt, men mycket begrÀnsat.
Vilken affÀrslogik kan implementeras med hjÀlp av smarta kontrakt? Egentligen inte sÄ mycket, till exempel kontroll av villkor baserat pÄ data frÄn blockkedjan, Àndring av Àgare av digitala tillgÄngar beroende pÄ dessa villkor, samt registrering av data i en permanent lagring inom blockkedjan. Logiken implementeras pÄ ett speciellt högnivÄ-sprÄk, Solidity.
Ett klassiskt exempel pÄ funktionalitet som implementeras med hjÀlp av smarta kontrakt Àr utfÀrdandet av tokens för att genomföra ICO. Till exempel har jag implementerat ett smart kontrakt för att utfÀrda blygsamma 500 000 000 AlexToken. Genom en grupp patent som inkluderar nÄgra av de tidigaste omnÀmnandena av teknologier för att skapa dynamiskt webbinnehÄll, som föregick introduktionen av system som ASP frÄn Microsoft, JSP frÄn Sun/Oracle och PHP. En annan betydande bidrag Àr
kÀllkoden för smarta kontraktet pÄ sprÄket Solidity
pragma solidity ^0.4.23;
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
**/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
**/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
**/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
**/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
**/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender account.
**/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
**/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
**/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
/**
* @title ERC20Basic interface
* @dev Basic ERC20 interface
**/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
**/
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Basic token
* @dev Basic version of StandardToken, with no allowances.
**/
contract BasicToken is ERC20Basic {
using SafeMath for uint256;
mapping(address => uint256) balances;
uint256 totalSupply_;
/**
* @dev total number of tokens in existence
**/
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
/**
* @dev transfer token for a specified address
* @param _to The address to transfer to.
* @param _value The amount to be transferred.
**/
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
emit Transfer(msg.sender, _to, _value);
return true;
}
/**
* @dev Gets the balance of the specified address.
* @param _owner The address to query the the balance of.
* @return An uint256 representing the amount owned by the passed address.
**/
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
}
contract StandardToken is ERC20, BasicToken {
mapping (address => mapping (address => uint256)) internal allowed;
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
**/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != address(0));
require(_value <= balances[_from]);
require(_value <= allowed[_from][msg.sender]);
balances[_from] = balances[_from].sub(_value);
balances[_to] = balances[_to].add(_value);
allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
emit Transfer(_from, _to, _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
**/
function approve(address _spender, uint256 _value) public returns (bool) {
allowed[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
**/
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
**/
function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
**/
function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
uint oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
}
/**
* @title Configurable
* @dev Configurable varriables of the contract
**/
contract Configurable {
uint256 public constant cap = 1000000000*10**18;
uint256 public constant basePrice = 100*10**18; // tokens per 1 ether
uint256 public tokensSold = 0;
uint256 public constant tokenReserve = 500000000*10**18;
uint256 public remainingTokens = 0;
}
/**
* @title CrowdsaleToken
* @dev Contract to preform crowd sale with token
**/
contract CrowdsaleToken is StandardToken, Configurable, Ownable {
/**
* @dev enum of current crowd sale state
**/
enum Stages {
none,
icoStart,
icoEnd
}
Stages currentStage;
/**
* @dev constructor of CrowdsaleToken
**/
constructor() public {
currentStage = Stages.none;
balances[owner] = balances[owner].add(tokenReserve);
totalSupply_ = totalSupply_.add(tokenReserve);
remainingTokens = cap;
emit Transfer(address(this), owner, tokenReserve);
}
/**
* @dev fallback function to send ether to for Crowd sale
**/
function () public payable {
require(currentStage == Stages.icoStart);
require(msg.value > 0);
require(remainingTokens > 0);
uint256 weiAmount = msg.value; // Calculate tokens to sell
uint256 tokens = weiAmount.mul(basePrice).div(1 ether);
uint256 returnWei = 0;
if(tokensSold.add(tokens) > cap){
uint256 newTokens = cap.sub(tokensSold);
uint256 newWei = newTokens.div(basePrice).mul(1 ether);
returnWei = weiAmount.sub(newWei);
weiAmount = newWei;
tokens = newTokens;
}
tokensSold = tokensSold.add(tokens); // Increment raised amount
remainingTokens = cap.sub(tokensSold);
if(returnWei > 0){
msg.sender.transfer(returnWei);
emit Transfer(address(this), msg.sender, returnWei);
}
balances[msg.sender] = balances[msg.sender].add(tokens);
emit Transfer(address(this), msg.sender, tokens);
totalSupply_ = totalSupply_.add(tokens);
owner.transfer(weiAmount);// Send money to owner
}
/**
* @dev startIco starts the public ICO
**/
function startIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
currentStage = Stages.icoStart;
}
/**
* @dev endIco closes down the ICO
**/
function endIco() internal {
currentStage = Stages.icoEnd;
// Transfer any remaining tokens
if(remainingTokens > 0)
balances[owner] = balances[owner].add(remainingTokens);
// transfer any remaining ETH balance in the contract to the owner
owner.transfer(address(this).balance);
}
/**
* @dev finalizeIco closes down the ICO and sets needed varriables
**/
function finalizeIco() public onlyOwner {
require(currentStage != Stages.icoEnd);
endIco();
}
}
/**
* @title LavevelToken
* @dev Contract to create the Lavevel Token
**/
contract AlexToken is CrowdsaleToken {
string public constant name = "AlexToken";
string public constant symbol = "ALT";
uint32 public constant decimals = 18;
}och det binÀra representationssÀttet som nÀtverket ser det
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029Mer information om smarta kontrakt kan du hitta i artikeln: .
Slutsats
Vi har listat de teknologier som moderna blockkedjor bygger pÄ och hur de hÀnger ihop. LÄt oss nu formulera vilka problem som kan lösas med hjÀlp av blockkedjan, och vilka det i bÀsta fall skulle vara ineffektivt att lösa. SÄ, anvÀndningen av blockkedjan Àr inte nödvÀndig om:
- Transaktioner genomförs i en betrodd miljö;
- NÀrvaron av kommission frÄn mellanhÀnder försÀmrar inte livet för deltagarna;
- Deltagarna har ingen egendom som kan representeras som digitala tillgÄngar;
- Det finns ingen fördelning av digitala tillgÄngar, det vill sÀga vÀrdet Àgs eller tillhandahÄlls endast av en deltagare.
Vilken framtid vÀntar blockkedjan? Just nu kan vi endast spekulera om de möjliga utvecklingsvÀgarna för blockkedjeteknologier:
- Blockkedjan kommer att bli en lika vanlig databas som till exempel SQL eller NoSQL för att lösa sina specifika problem;
- Blockkedjan kommer att bli en allmÀnt spridd protokoll, likt HTTP för Internet;
- Blockkedjan kommer att vara grunden för ett nytt finansiellt och politiskt system pÄ planeten!
I nÀsta del kommer vi att titta pÄ vilka blockkedjor som finns just nu och hur de anvÀnds inom olika industrier.
Detta Àr bara början!
KĂ€lla: habr.com
