Što bismo trebali izgraditi blockchain?

Cijela povijest čovječanstva kontinuirani je proces oslobađanja od lanaca i stvaranja novih, još jačih. (Anonimni autor)

Analizirajući brojne blockchain projekte (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin itd.), shvaćam da su s tehničke točke gledišta svi izgrađeni na istim principima. Blockchaini podsjećaju na kuće koje, unatoč svoj raznolikosti dizajna, uređenja i namjena, imaju temelj, zidove, krov, prozore, vrata koji su međusobno povezani na određene načine. A ako razumijete osnovna načela projektiranja zgrada i znate svojstva korištenih materijala, tada možete odrediti namjenu određene kuće. Trenutno je nastala situacija s blockchainom da su svi čuli za njega, ali malo ljudi razumije arhitekturu i principe rada. Stoga postoji nesporazum zašto i kako ima smisla koristiti blockchain tehnologije.

U ovom ćemo članku analizirati svojstva i principe zajedničke svim lancima blokova. Zatim, pogledajmo probleme koji se mogu riješiti korištenjem blockchaina i da pojačamo gradivo, napravimo mali, ali pravi blockchain na našem virtualnom mjestu!

Dakle, prisjetimo se koje je probleme blockchain u početku riješio.

Siguran sam da će mnogi reći o distribuiranoj, decentraliziranoj, javnoj i nepromjenjivoj bazi podataka. Ali zašto je sve to bilo potrebno?

Radije počinjem proučavati bilo koju tehnologiju čitajući standarde, jer se svi članci i knjige o temi koja se proučava temelje na njima. Ali trenutno ne postoje standardi za blockchain; ISO je samo kreirao odbora za njihov razvoj. Trenutačno, svaki javni blockchain projekt ima svoj White paper dokument, koji je u biti tehnička specifikacija. Prvi javno poznati blockchain projekt je Bitcoin mreža. Idite na službenu web stranicu mreže i izgled gdje je sve počelo.

Blockchain izazov

Dakle, zadatak koji je blockchain riješio u Bitcoin pionir mreži je izvršiti pouzdani prijenos vlasništva nad digitalnom imovinom (imovinom) u nepouzdanom okruženju bez posrednika. Na primjer, u Bitcoin mreži, digitalna imovina su bitcoin digitalni novčići. I sva tehnička rješenja Bitcoina i ostalih blockchaina svode se na rješavanje ovog problema.

Problemi koje blockchain rješava

Pretpostavimo da određena financijska organizacija kaže da je izgradila mrežu diljem svijeta uz pomoć koje je moguće prenijeti novac bilo kojoj osobi. Hoćete li joj vjerovati? Ako je ta organizacija Visa ili MasterCard, najvjerojatnije ćete povjerovati, ali ako je, relativno govoreći, AnonymousWorldMoney, vjerojatno nećete. Zašto? Ali zato što dobro znamo kako distribuirane sustave rade privatne tvrtke, za koje svrhe i čemu to može dovesti. Pogledajmo pobliže probleme takvih sustava i kako ih se može riješiti korištenjem blockchain tehnologija.

Recimo da u uvjetnom AnonymousWorldMoneyu postoje poslužitelji s bazama podataka, a dobro je ako ih ima nekoliko u različitim podatkovnim centrima. Kada pošiljatelj prenese novac, registrira se transakcija, koja se replicira na sve poslužitelje, a novac dolazi do primatelja.

Što bismo trebali izgraditi blockchain?

U idealnom svijetu ova shema radi odlično, ali u našem se javljaju sljedeći problemi:

  1. Problem identifikacije sudionika s jedne strane i potreba za anonimnošću transakcija s druge strane. Oni. novac trebate prenijeti određenom primatelju i to tako da nitko ne zna za tu transakciju osim sudionika u transakciji. Banke imaju brojeve računa i bankovne kartice vezane uz određenu fizičku ili pravnu osobu, a bankovna tajna štiti podatke o transakcijama. I tko jamči da uvjetni AnonymousWorldMoney ne koristi osobne podatke i podatke o transakcijama za vlastite potrebe?
  2. Kako osigurati da je primatelj dobio točno onaj iznos koji mu je prenesen? Relativno govoreći, pošiljatelj je prebacio 100 dolara, a primatelj je dobio 10 dolara. Pošiljatelj dolazi u ured AnonymousWorldMoney sa svojom priznanicom, a službenik pokazuje svoju verziju, gdje piše da je pošiljatelj prebacio samo 10 dolara.
  3. Problem nepovjerljivog okruženja, na primjer, prijevara zvana dvostruka potrošnja. Beskrupulozni sudionik može potrošiti svoj saldo nekoliko puta dok se plaćanje ne replicira na sve poslužitelje. CAP teorem, naravno, nitko nije otkazao, a dogovor će na kraju biti postignut, ali netko neće dobiti novac za usluge ili robu. Stoga, ako ne postoji potpuno povjerenje u organizaciju platnog prometa ili sudionike u transakcijama, tada je potrebno izgraditi mrežu koja se ne temelji na povjerenju, već na kriptografiji.
  4. Uvjetni AnonymousWorldMoney ima konačan broj poslužitelja koji mogu postati nedostupni nenamjerno ili zbog zlonamjerne namjere.
  5. AnonymousWorldMoney će uzeti vlastitu opipljivu proviziju.
  6. Mogućnost kontrole. Tijekom rada Bitcoina pokazalo se da ljudi žele ne samo prenositi novčiće jedni drugima, već i provjeravati različite uvjete transakcije, programirati scenarije rada, automatski izvršavati radnje ovisno o uvjetima itd.

Kako blockchain rješava te probleme

  1. Identifikacija sudionika provodi se pomoću para ključeva: privatnog i javnog, a algoritam digitalnog potpisa jedinstveno identificira pošiljatelja i primatelja, ostavljajući njihov identitet anonimnim.
  2. Transakcije se prikupljaju u blokove, hash bloka se izračunava i upisuje u sljedeći blok. Ovaj slijed snimanja hashova u blokovima daje naziv blockchain tehnologiji, a također onemogućuje neprimjetno mijenjanje/brisanje blokova ili pojedinačnih transakcija iz blokova. Dakle, ako je transakcija uključena u blockchain, možete biti sigurni da će njezini podaci ostati nepromijenjeni.
  3. Prijevara dvostrukog trošenja spriječena je postizanjem mrežnog konsenzusa o tome koje podatke smatrati valjanima, a koje odbaciti. U Bitcoin mreži konsenzus se postiže dokazom rada (PoW).
  4. Pouzdanost mreže postiže se činjenicom da je blockchain javan, gdje svaki sudionik može pokrenuti vlastiti čvor, dobiti potpunu kopiju blockchaina i, štoviše, samostalno početi provjeravati ispravnost transakcija. Treba napomenuti da moderni blockchaini omogućuju izgradnju ne samo javnih (otvorenih), već i privatnih (zatvorenih) blockchaina, kao i korištenje kombiniranih shema.
  5. Blockchain se neće u potpunosti riješiti provizija, jer... morate platiti ljude koji podržavaju mrežu, ali u blockchainu je potreba za provizijom toliko uvjerljivo dokazana da nema sumnje u njezinu nužnost.
  6. Moderni blockchaini imaju mogućnost implementacije poslovne logike, koja se u blockchainu naziva Smart Contracts. Logika pametnih ugovora implementirana je na različitim jezicima visoke razine.

Zatim ćemo detaljnije razmotriti ova rješenja.

Blockchain arhitektura

Komponente lanca blokova

Svaki sudionik može pokrenuti vlastiti čvor s punom kopijom blockchaina (puni čvor). Pozivaju se puni čvorovi koji mogu bilježiti transakcije na blockchainu čvorovi konsenzusa (svjedok) ili rudari (rudar). Pozivaju se puni čvorovi koji samo provjeravaju ispravnost transakcija revizijski čvorovi (revizija). Lagani klijenti (light clients) ne pohranjuju pune kopije blockchaina, već komuniciraju s mrežom koristeći pune čvorove.
Većina korisnika koristi lagane klijente ili web novčanike za obavljanje transakcija. Svi čvorovi su međusobno povezani. S ovim skupom elemenata mrežna arhitektura postaje stabilnija:

Što bismo trebali izgraditi blockchain?

Životni ciklus transakcije

Pogledajmo životni ciklus transakcije i raščlanimo ga dio po dio:

Što bismo trebali izgraditi blockchain?

Blockchain tehnologije

Zadržimo se detaljnije na tehničkim rješenjima i njihovim međusobnim vezama.

identifikacija

Svaka blockchain transakcija mora biti digitalno potpisana. Stoga, za dovršetak transakcije, svaki sudionik mora imati par ključeva: privatni / javni. Ponekad se par ključeva naziva novčanik, jer ključevi su jedinstveno povezani s jedinstvenom digitalnom adresom i stanjem sudionika. U stvarnosti su ključevi i adrese samo nizovi brojeva u različitim sustavima brojeva. Primjeri ključeva i adresa novčanika:

Private key: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Public key: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Address: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27V

Za izradu digitalnog potpisa u lancima blokova koristi se algoritam temeljen na eliptičnim krivuljama: Algoritam digitalnog potpisa Elliptic Curve (ECDSA). Da bi funkcionirao, privatni ključ (256-bitni broj) obično se uzima nasumično. Broj opcija ključa je 2 na potenciju 256, tako da možemo govoriti o praktičnoj nemogućnosti podudaranja vrijednosti privatnih ključeva.

Zatim se javni ključ dobiva iz privatnog množenjem njegove vrijednosti s koordinatama točke koja se nalazi na eliptičnoj krivulji, što rezultira koordinatama nove točke na istoj krivulji. Ova radnja osigurava dobivanje para ključeva prikladnog za digitalno potpisivanje transakcija. Konačno, adresa novčanika je jedinstveno izvedena iz javnog ključa.

Postoji mnogo članaka s detaljima o kriptografiji koja se koristi u blockchainu, na primjer: Bitcoin ukratko – kriptografija

Privatni ključ mora biti strogo povjerljiv i sigurno se mora čuvati. Javni ključ je svima poznat. Ako se privatni ključ izgubi, pristup imovini (kovanicama) ne može se vratiti i novac će biti zauvijek izgubljen. Stoga je zadatak sigurnog pohranjivanja privatnih ključeva iznimno relevantan, jer Ovo nije banka u koju uvijek možete doći s putovnicom i obnoviti svoj račun. Postoji cijela industrija za proizvodnju takozvanih hladnih kripto novčanika, sličnih flash pogonima:

Što bismo trebali izgraditi blockchain?

ili možete koristiti pouzdanije metode, na primjer, utiskivanje vrijednosti privatnog ključa na tokene:

Što bismo trebali izgraditi blockchain?

Transakcije

Više detalja o strukturi transakcije možete pronaći u članku Bitcoin ukratko – Transakcija. Važno nam je razumjeti da svaka transakcija ima najmanje sljedeće podatke:

From: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - цифровой адрес отправителя
To: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - цифровой адрес получателя
Value: 0.0001 - сумма транзакции
Transaction Hash: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - хэш транзакции

Zatim se transakcija potpisuje privatnim ključem i šalje (pogledajte detalje o radu protokola Bitcoin ukratko-Protokol) svim čvorovima u lancu blokova koji provjeravaju valjanost transakcija. Algoritam provjere transakcije nije trivijalan i uključuje dva tuceta koraka.

Transakcijski blokovi

Nakon provjere valjanosti transakcija, čvorovi iz njih formiraju blokove. Osim transakcija, u blok se upisuje hash prethodnog bloka i broj (Nonce counter), a hash trenutnog bloka izračunava se pomoću algoritma SHA-256. Hash mora imati utvrđene uvjete složenosti. Na primjer, u Bitcoin mreži, težina hasha automatski se mijenja svaka 2 tjedna ovisno o snazi ​​mreže tako da se blok generira otprilike jednom svakih 10 minuta. Složenost je određena sljedećim uvjetom: pronađeni hash mora biti manji od unaprijed određenog broja. Ako ovaj uvjet nije ispunjen, tada se 1 dodaje Nonce-u i rad na izračunavanju hasha se ponavlja. Za odabir hasha koristi se polje Nonce jer Ovo je jedini podatak u bloku koji se može mijenjati, ostali moraju ostati nepromijenjeni. Valjani hash mora imati određeni broj vodećih nula, kao što je jedan od pravih hashova:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Uspješno pronalaženje hasha je dokaz obavljenog posla (Proof-of-Work, PoW) za Bitcoin ili Ethereum mreže. Proces pronalaska hasheva naziva se rudarenje, slično rudarenju zlata. Naziv prilično točno definira bit procesa, jer postoji jednostavno pretraživanje opcija, a ako netko nađe odgovarajući hash, onda je to prava sreća. To je kao pronaći pravi grumen zlata u tonama otpadnog kamenja. Nagrada za blok sada iznosi 12.5 BTC i ako to pomnožite s trenutnom stopom Bitcoina od 3900 dolara, dobit ćete više od kilograma čistog zlata. Ima se za što boriti!

Nakon uspješnog pronalaska hasha, blok i sam pronađeni hash zapisuju se u blockchain kao sljedeći blok. Više detalja o strukturi blokova možete pronaći u članku Bitcoin ukratko-Blockchain, a ispod je pojednostavljeni dijagram:

Što bismo trebali izgraditi blockchain?

Blockchain počinje s blokom koji još nema hash prethodnog bloka. Postoji samo jedan takav blok u blockchainu i ima svoje ime Genesis block. Ostali blokovi imaju istu strukturu i razlikuju se samo u broju transakcija. Stvarne transakcije i blokovi koji se trenutno stvaraju u Bitcoinu ili Ethereumu mogu se vidjeti u Block Explorer.

Veličina blokova u Bitcoinu ograničena je na 1 MB, a uz minimalnu količinu informacija u transakciji od oko 200 bajtova, maksimalan broj transakcija u bloku može biti oko 6000. Odavde, inače, slijedi izvedba Bitcoina kojoj se svi smiju: blok se generira otprilike jednom svakih 10 minuta * 60 sekundi = 600 sekundi, što daje formalnu izvedbu od oko 10 TPS. Iako zapravo, ovo nije produktivnost, već namjerno implementiran algoritam rada. U Ethereumu su, zbog konkurencije, jednostavno napravili vrijeme generiranja bloka od 15 sekundi. a produktivnost je formalno porasla. Stoga, u blockchainovima koji koriste PoW kao konsenzus, nema smisla uopće uspoređivati ​​performanse, jer izravno ovisi o složenosti izračuna predmemorije, koja se može dodijeliti bilo kojoj vrijednosti.

Vilice

Što se događa ako je, na primjer, nekoliko čvorova pronašlo hasheve koji zadovoljavaju uvjete složenosti, ali su različite vrijednosti (drugim riječima, došli su do različitih konsenzusa) i upisali blokove u blockchain? Pogledajmo kako blockchain štiti od ove situacije. U tom slučaju dolazi do tzv. forka, a blockchain ima dvije verzije lanca:

Što bismo trebali izgraditi blockchain?

Što je slijedeće? Dalje, dio mreže počinje raditi na bloku N+2 iz jednog lanca, a dio iz drugog:

Što bismo trebali izgraditi blockchain?

Jedan od tih blokova bit će pronađen ranije i poslan u blockchain, a zatim će se, prema pravilima, blockchain morati prebaciti na dulji lanac i otkazati sve transakcije iz alternativnog bloka:

Što bismo trebali izgraditi blockchain?

Istodobno, može doći do situacije kada je transakcija sudionika bila samo u jednom od fork blokova, koji je otkazan. Stoga, kako biste bili sigurni da je željena transakcija zabilježena u blockchainu, postoji opća preporuka - prije nego što vjerujete transakciji, trebali biste pričekati da se sljedećih nekoliko blokova doda u blockchain. Preporuke o tome koliko blokova treba čekati za različite lance blokova razlikuju se. Na primjer, za Bitcoin mrežu minimum je 2 bloka, maksimum 6.

Ista slika s blok forkovima bit će promatrana tijekom takozvanog 51% napada - to je kada grupa rudara pokušava razviti alternativni blok lanac, nastojeći prekinuti lanac svojim lažnim transakcijama. Iako je trenutno, umjesto prijevare, isplativije potrošiti svoju moć na pošteno rudarenje.

Konsenzus

Za snimanje bloka na blockchainu, mreža mora postići konsenzus. Prisjetimo se zadaće postizanja konsenzusa u računalnim komunikacijskim mrežama. Problem je formuliran kao zadatak bizantskih generala BFT (Bizantska tolerancija na greške). Izostavljajući slikovit opis problema bizantske vojske, problem se može formulirati na sljedeći način: kako mrežni čvorovi mogu doći do zajedničkog rezultata ako ih neki mrežni čvorovi mogu namjerno iskriviti. Postojeći algoritmi za rješavanje BFT problema pokazuju da mreža može ispravno funkcionirati ako ima manje od 1/3 prevaranata. Zašto BFT konsenzus nije primijenjen na Bitcoin mrežu? Zašto je bilo potrebno koristiti PoW? Postoji nekoliko razloga:

  • BFT dobro funkcionira s malim fiksnim skupom čvorova, ali u javnom lancu blokova broj čvorova je nepredvidiv i, štoviše, čvorovi se mogu uključivati ​​i isključivati ​​nasumično.
  • Potrebno je motivirati ljude da pokrenu blockchain čvorove. Da bi to učinili, ljudi moraju biti nagrađeni. U BFT-u formalno nema za što dobiti nagradu, ali za što je nagrada u PoW-u svima je jasno na intuitivnoj razini: za električnu energiju koju procesor potroši u procesu pronalaženja hasha bloka.

Osim PoW-a, postoji nekoliko drugih konsenzusa koji se koriste u modernim lancima blokova, na primjer:

  • PoS (Proof-of-Stake) - na blockchainu Hyperledger
  • DPoS (Delegirani dokaz o udjelu) - na blockchainu BitShares
  • Modifikacije BFT-a: SBFT (pojednostavljeni BFT) i PBFT (praktični BFT), na primjer u blockchainu Exonum

Zadržimo se malo na PoS konsenzusu, jer... Upravo su PoS i njegove varijante najrašireniji u privatnim lancima blokova. Zašto privatno? S jedne strane, karakteristike PoS-a su bolje u usporedbi s PoW-om, jer Za postizanje konsenzusa potrebno je manje računalnih resursa, što znači da se povećava brzina upisivanja podataka u blockchain. No, s druge strane, PoS ima više mogućnosti za prijevare, pa da bi se to neutraliziralo, svi sudionici u blockchainu moraju biti poznati.

PoS konsenzus temelji se na odabiru čvora koji može upisati blok s transakcijama u blockchain ovisno o iznosu sredstava na računu, odnosno ne na računu, već u kolateralu, tj. Što više sredstava imate kao kolateral, veća je vjerojatnost da će mreža odabrati vaš čvor za pisanje bloka. Polog se neće vratiti ako je blokada nevažeća. Ovo pruža zaštitu od prijevare. Postoje sljedeće varijacije PoS-a:

  • Delegirani PoS (DPoS) konsenzus dijeli sudionike na "glasače" i "validatore". Imatelji kovanica (sudionici s pravom glasa) delegiraju svoju ovlast za provjeru i bilježenje transakcija na blockchainu na druge sudionike. Dakle, validatori obavljaju sav računski posao i za to dobivaju nagradu, a prisutnost sudionika glasanja jamči poštenje validatora, jer mogu se promijeniti u bilo kojem trenutku.
  • LPoS (Leased Proof-of-Stake) konsenzus vam omogućuje da iznajmite svoja sredstva drugim čvorovima kako bi oni imali bolje šanse za provjeru valjanosti blokova. Da. Možete primiti proviziju za transakcije bez sudjelovanja u stvarnoj provjeri transakcije i blokiranju rudarenja.

Postoji niz drugih konsenzusa koji još nisu naširoko korišteni, ovdje ću ih samo navesti radi informacije, a pregled samih algoritama konsenzusa možete pronaći, primjerice, u članku: Algoritmi konsenzusa u Blockchainu.

  • PoET (dokaz proteklog vremena)
  • PoC (dokaz kapaciteta)
  • PoB (Proof-of-Burn)
  • PoWeight (dokaz težine)
  • PoA (Proof-of-Activity) – PoW + PoS
  • PoI (Proof-of-Importans)

Pouzdanost i modeli implementacije blockchaina

Javni blockchain

Postojanost javnost ili drugo ime Blockchain bez dopuštenja To se postiže dopuštanjem bilo kome da se poveže i pregleda informacije ili čak poveže svoj vlastiti čvor, a povjerenje se gradi na PoW konsenzusu.

Privatni blockchain

Privatni ili Privatni dopušteni blockchain. U tim blockchainovima samo određena skupina sudionika (organizacije ili ljudi) ima pristup informacijama. Takve blockchaine grade organizacije s ciljem povećanja ukupne koristi ili učinkovitosti. Njihovu pouzdanost osiguravaju zajednički ciljevi sudionika te konsenzusni algoritmi PoS i BFT.

Blockchain konzorcij

tamo konzorcijum ili Public Permissioned blockchain. To su lanci blokova na koje se svatko može spojiti kako bi ih pregledao, ali sudionik može dodati informacije ili povezati svoj čvor samo uz dopuštenje drugih sudionika. Takve blockchaine grade organizacije kako bi povećale povjerenje kupaca ili potrošača proizvoda ili društva u cjelini. Ovdje se pouzdanost također postiže prisutnošću povjerenja između sudionika i istim algoritmima konsenzusa PoS i BFT.

Pametni ugovori

Blockchaini implementirani nakon Bitcoina su, u ovoj ili onoj mjeri, dodali mogućnost izvršavanja pametnih ugovora. U biti, pametni ugovor je transakcija u koju se stavlja programski kod za izvršenje. Pametni ugovori na Ethereum mreži izvršavaju se u EVM-u (Ethereum Virtual Machine). Za početak izvršavanja pametnog ugovora, on mora biti eksplicitno pokrenut drugom transakcijom ili moraju biti ispunjeni preduvjeti za izvršenje. Rezultati izvršenja pametnog ugovora također će biti zabilježeni u blockchainu. Primanje podataka izvan blockchaina je moguće, ali vrlo ograničeno.

Koja se poslovna logika može implementirati pomoću pametnog ugovora? Zapravo, nema puno, na primjer, provjera uvjeta korištenjem podataka iz blockchaina, mijenjanje vlasnika digitalne imovine ovisno o tim uvjetima, snimanje podataka u trajnu pohranu unutar blockchaina. Logika je implementirana u posebnom jeziku visoke razine Solidity.

Klasičan primjer funkcionalnosti koja se implementira pomoću pametnih ugovora je izdavanje tokena za ICO. Na primjer, implementirao sam pametni ugovor za izdavanje skromnih 500 AlexTokena. Po link u Etherscan je

izvorni kod pametnog ugovora na jeziku 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;
}

i binarni prikaz kako ga mreža vidi

60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029

Više detalja o pametnim ugovorima možete pronaći u članku: Što su pametni ugovori u Ethereumu.

Zaključak

Naveli smo tehnologije na kojima su izgrađeni moderni blockchaini i kako su međusobno povezani. Sada formulirajmo koji se problemi mogu riješiti pomoću blockchaina, a koja će rješenja biti, u najboljem slučaju, neučinkovita. Dakle, korištenje blockchaina nije potrebno ako:

  • Transakcije se provode u pouzdanom okruženju;
  • Prisutnost komisije posrednika ne pogoršava život sudionika;
  • Sudionici nemaju imovinu koja se može prikazati kao digitalna imovina;
  • Ne postoji distribucija u digitalnoj imovini, tj. vrijednost posjeduje ili isporučuje samo jedan sudionik.

Što budućnost nosi za blockchain? Sada možemo samo nagađati o mogućim načinima razvoja blockchain tehnologija:

  • Blockchain će postati ista uobičajena tehnologija baze podataka kao, na primjer, SQL ili NoSQL za rješavanje svojih specifičnih problema;
  • Blockchain će postati široko rasprostranjen protokol, kao što je HTTP za Internet;
  • Blockchain će postati osnova za novi financijski i politički sustav na planetu!

U sljedećem dijelu ćemo pogledati koji blockchaini trenutno postoje i zašto se koriste u različitim industrijama.

Ovo je tek početak!

Izvor: www.habr.com

Dodajte komentar