Šta da izgradimo blockchain?

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

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

U ovom članku ćemo analizirati svojstva i principe koji su zajednički za sve blockchaine. Zatim, pogledajmo probleme koji se mogu riješiti korištenjem blockchaina i da bismo ojačali materijal, napravimo mali, ali pravi blockchain na našoj virtualnoj stranici!

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

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

Više volim da počnem proučavati bilo koju tehnologiju čitajući standarde, jer su svi članci i knjige na temu koju proučavamo zasnovani na njima. Ali trenutno ne postoje standardi koje je ISO samo stvorio komiteti za njihov razvoj. Trenutno, svaki javni blockchain projekat ima svoj dokument Bijele knjige, koji je u suštini tehnička specifikacija. Prvi javno poznati blockchain projekat je Bitcoin mreža. Idite na službenu web stranicu mreže i pogledajte kako je sve počelo.

Blockchain Challenge

Dakle, zadatak koji je blockchain riješio u pionirskoj mreži Bitcoin je da izvrši 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 drugih blockchaina svode se na rješavanje ovog problema.

Problemi koje blockchain rješava

Pretpostavimo da određena finansijska organizacija kaže da je izgradila mrežu širom svijeta uz pomoć koje je moguće prenijeti novac bilo kojoj osobi. Hoćeš li joj vjerovati? Ako je ova organizacija Visa ili MasterCard, najvjerovatnije ćete vjerovati, ali ako, relativno govoreći, AnonymousWorldMoney, vjerovatno nećete. Zašto? Ali zato što dobro znamo kako distribuirane sisteme prave privatne kompanije, za koje svrhe i čemu to može dovesti. Pogledajmo pobliže probleme takvih sistema i kako se oni mogu riješiti korištenjem blockchain tehnologija.

Recimo da u uslovnom AnonymousWorldMoney-u postoje serveri sa bazama podataka, i dobro je ako ih ima nekoliko u različitim data centrima. Kada pošiljalac prenese novac, registruje se transakcija, koja se replicira na sve servere, a novac stiže do primaoca.

Šta da izgradimo blockchain?

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

  1. Problem identifikacije učesnika s jedne strane i potreba za anonimnošću transakcija s druge. One. potrebno je da prenesete novac određenom primaocu i to na način da niko ne zna za ovu transakciju osim učesnika u transakciji. Banke imaju brojeve računa i bankovne kartice povezane sa određenim fizičkim ili pravnim licem, a bankarska tajna štiti informacije o transakcijama. I ko garantuje da uslovni AnonymousWorldMoney ne koristi lične podatke i informacije o transakcijama u sopstvene svrhe?
  2. Kako se uvjeriti da je primalac primio upravo onaj iznos koji mu je prebačen? Relativno govoreći, pošiljalac je prebacio 100 dolara, a primalac 10 dolara. Pošiljalac dolazi u kancelariju AnonymousWorldMoney sa svojom priznanicom, a službenik pokazuje svoju verziju, gdje piše da je pošiljalac prebacio samo 10$.
  3. Problem nepouzdanog okruženja, na primjer, prevara koja se zove dvostruka potrošnja. Nesavjesni učesnik može potrošiti svoj saldo nekoliko puta dok se uplata ne replicira na sve servere. CAP teoremaNaravno, niko nije otkazao, a dogovor će na kraju biti postignut, ali neko neće dobiti novac za pruženu uslugu ili robu. Stoga, ako nema potpunog povjerenja u platnu organizaciju ili sudionike u transakcijama, onda je potrebno izgraditi mrežu zasnovanu ne na povjerenju, već na kriptografiji.
  4. Conditional AnonymousWorldMoney ima ograničen broj servera koji mogu postati nedostupni nenamjerno ili zbog zlonamjerne namjere.
  5. AnonymousWorldMoney će uzeti svoju opipljivu proviziju.
  6. Mogućnost kontrole. Tokom rada Bitcoina pokazalo se da ljudi žele ne samo da prenose novčiće jedni drugima, već i da provjere različite uvjete za transakciju, programiraju scenarije rada, automatski izvršavaju radnje ovisno o uvjetima itd.

Kako blockchain rješava ove probleme

  1. Identifikacija učesnika se vrši pomoću para ključeva: privatnog i javnog, a algoritam digitalnog potpisa jedinstveno identifikuje pošiljaoca i primaoca, ostavljajući njihov identitet anonimnim.
  2. Transakcije se skupljaju u blokove, heš bloka se izračunava i upisuje u sljedeći blok. Ova sekvenca bilježenja hashova u blokove daje blockchain tehnologiji ime, a također onemogućava neprimjetno mijenjanje/brisanje blokova ili pojedinačnih transakcija iz blokova. Stoga, ako je transakcija uključena u blockchain, možete biti sigurni da će njeni podaci ostati nepromijenjeni.
  3. Prevara s dvostrukom potrošnjom spriječena je postizanjem mrežnog konsenzusa o tome koje podatke smatrati valjanim, 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 blockchains omogućavaju 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 dokazana toliko uvjerljivo da nema sumnje u njenu neophodnost.
  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 visokog nivoa.

Zatim ćemo detaljnije razmotriti ova rješenja.

Blockchain arhitektura

Blockchain komponente

Svaki učesnik može pokrenuti vlastiti čvor s punom kopijom blockchaina (puni čvor). Pozivaju se puni čvorovi koji mogu snimati transakcije na blockchainu konsenzus čvorova (svjedok) ili rudari (rudar). Pozivaju se puni čvorovi koji samo provjeravaju ispravnost transakcija revizijski čvorovi (revizija). Laki klijenti (laki klijenti) 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. Sa ovim skupom elemenata, mrežna arhitektura postaje stabilnija:

Šta da izgradimo blockchain?

Životni ciklus transakcije

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

Šta da izgradimo blockchain?

Blockchain tehnologije

Zaustavimo se detaljnije na tehničkim rješenjima i njihovoj međusobnoj povezanosti.

Identifikacija

Svaka blockchain transakcija mora biti digitalno potpisana. Stoga, da bi izvršio transakciju, svaki učesnik mora imati par ključeva: privatni / javni. Ponekad se par ključeva naziva novčanikom, jer ključevi su jedinstveno povezani sa jedinstvenom digitalnom adresom i stanjem učesnika. U stvarnosti, ključevi i adrese su samo nizovi brojeva u različitim sistemima brojeva. Primjeri ključeva i adresa novčanika:

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

Za kreiranje digitalnog potpisa u blockchain-u koristi se algoritam baziran na eliptičnim krivuljama: Elliptic Curve Digital Signature Algoritam (ECDSA). Da bi funkcionisao, privatni ključ (256-bitni broj) se obično uzima nasumično. Broj opcija ključa je 2 na stepen od 256, tako da možemo govoriti o praktičnoj nemogućnosti uparivanja vrijednosti privatnih ključeva.

Zatim, javni ključ se dobija iz privatnog množenjem njegove vrednosti sa koordinatama tačke koja se nalazi na eliptičnoj krivulji, što rezultira koordinatama nove tačke na istoj krivulji. Ova akcija osigurava da dobijete par ključeva pogodan 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: Bitkoin ukratko – kriptografija

Privatni ključ mora biti strogo povjerljiv i zaštićen. Javni ključ je svima poznat. Ako se izgubi privatni ključ, pristup imovini (kovanicama) se ne može vratiti i novac će biti izgubljen zauvijek. Stoga je zadatak sigurnog pohranjivanja privatnih ključeva izuzetno relevantan, jer Ovo nije banka u koju uvijek možete doći sa pasošem i vratiti svoj račun. Postoji čitava industrija za proizvodnju takozvanih hladnih kripto novčanika, sličnih fleš diskovima:

Šta da izgradimo blockchain?

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

Šta da izgradimo blockchain?

Transakcije

Više detalja o strukturi transakcije možete pronaći u članku Bitkoin ukratko – Transakcija. Za nas je važno da shvatimo 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 Bitkoin ukratko-protokol) svim čvorovima u blockchainu koji provjeravaju valjanost transakcija. Algoritam verifikacije transakcije nije trivijalan i uključuje dva tuceta koraka.

Transakcijski blokovi

Nakon provjere valjanosti transakcija, čvorovi formiraju blokove od njih. Pored transakcija, u blok se upisuju i hash prethodnog bloka i broj (Nonce brojač), a heš trenutnog bloka se izračunava pomoću SHA-256 algoritma. Haš mora imati utvrđene uslove složenosti. Na primjer, u Bitcoin mreži, težina heša se automatski mijenja svake 2 sedmice u zavisnosti od snage mreže, tako da se blok generiše 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 uslov nije ispunjen, tada se 1 dodaje u nonce, a posao izračunavanja heša se ponavlja. Za odabir heša koristi se polje Nonce, jer Ovo je jedini podatak u bloku koji se može promijeniti; Važeći hash mora imati određeni broj vodećih nula, kao što je jedan od pravih hashova:

000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91

Uspješno pronalaženje hash-a je dokaz obavljenog posla (Proof-of-Work, PoW) za Bitcoin ili Ethereum mreže. Proces pronalaženja heševa naziva se rudarenje, slično kopanju zlata. Naziv prilično precizno definira suštinu procesa, jer postoji jednostavna pretraga opcija, a ako neko pronađe odgovarajući hash, onda je ovo prava sreća. To je kao da nađete pravi zlatni grumen u tonama otpadnog kamena. Nagrada za blok sada iznosi 12.5 BTC i ako je pomnožite sa trenutnom stopom Bitcoina od 3900 dolara, dobićete više od kilograma čistog zlata. Ima se za šta boriti!

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

Šta da izgradimo 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. Preostali blokovi imaju istu strukturu i razlikuju se samo po broju transakcija. Prave transakcije i blokovi koji se trenutno kreiraju u Bitcoinu ili Ethereumu mogu se vidjeti u Block Explorer.

Veličina blokova u Bitcoin-u je ograničena na 1MB i uz minimalnu količinu informacija u transakciji od oko 200 bajtova, maksimalni broj transakcija u bloku može biti oko 6000. Odavde, inače, slijedi performanse Bitcoina, kojima se svi smiju: blok se generiše otprilike jednom svakih 10 minuta * 60 sekundi = 600 sekundi, što daje formalni učinak od oko 10 TPS. Iako u stvari, ovo nije produktivnost, već namjerno implementirani algoritam rada. U Ethereumu, za konkurenciju, jednostavno su napravili vrijeme generiranja bloka 15 sekundi. a produktivnost je formalno porasla. Stoga, u blockchainima koji koriste PoW kao konsenzus, nema smisla uspoređivati ​​performanse uopće, jer direktno zavisi od složenosti keš proračuna, koji se može dodijeliti bilo kojoj vrijednosti.

Forks

Šta se dešava ako, na primer, nekoliko čvorova pronađe hešove koji ispunjavaju uslove složenosti, ali su različite vrednosti (drugim rečima, došli su do različitih konsenzusa) i zapisuju blokove u blockchain? Pogledajmo kako blockchain štiti od ove situacije. U ovom slučaju dolazi do takozvane vilice, a blockchain ima dvije verzije lanca:

Šta da izgradimo blockchain?

Šta se dalje događa? Zatim, dio mreže počinje raditi na bloku N+2 iz jednog lanca, a dio iz drugog:

Šta da izgradimo blockchain?

Jedan od ovih blokova će biti pronađen ranije i poslan u blockchain, a zatim će, prema pravilima, blockchain morati da se prebaci na duži lanac i poništi sve transakcije iz alternativnog bloka:

Šta da izgradimo blockchain?

Istovremeno, može nastati situacija kada je transakcija učesnika bila samo u jednom od blokova viljuške, koji je otkazan. Stoga, da biste bili sigurni da je željena transakcija snimljena u blockchain, postoji opća preporuka - prije nego što vjerujete transakciji, trebate pričekati dok se sljedećih nekoliko blokova ne doda u blockchain. Preporuke o tome koliko blokova treba čekati za različite blockchaine se razlikuju. Na primjer, za Bitcoin mrežu minimalno je 2 bloka, maksimalno 6.

Ista slika sa blok viljuškama će se uočiti tokom takozvanog 51% napada - to je kada grupa rudara pokušava da razvije alternativni lanac blokova, nastojeći da otkaže lanac svojim lažnim transakcijama. Iako je trenutno, umjesto na prevaru, isplativije trošiti svoju moć na pošteno rudarenje.

Konsenzus

Da bi se snimio blok na blockchain-u, mreža mora postići konsenzus. Prisjetimo se zadatka postizanja konsenzusa u kompjuterskim komunikacijskim mrežama. Problem je formuliran kao zadatak vizantijskih generala BFT (Vizantijska tolerancija na greške). Izostavljajući slikovit opis problema vizantijske 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 čvorovi mreže mogu namjerno iskriviti. Postojeći algoritmi za rješavanje BFT problema pokazuju da mreža može ispravno funkcionirati ako je manje od 1/3 prevaranta. Zašto BFT konsenzus nije primijenjen na Bitcoin mrežu? Zašto je bilo potrebno koristiti PoW? Postoji nekoliko razloga:

  • BFT dobro radi s malim fiksnim skupom čvorova, ali u javnom blockchainu broj čvorova je nepredvidiv i, osim toga, čvorovi se mogu nasumično uključivati ​​i isključivati.
  • Potrebno je motivirati ljude da pokrenu blockchain čvorove. Da bi to učinili, ljudi moraju biti nagrađeni. U BFT-u formalno nema za šta dobiti nagradu, ali za šta je nagrada u PoW-u svima je jasno na intuitivnom nivou: za struju koju procesor potroši u procesu pronalaženja heša bloka.

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

  • PoS (Proof-of-Stake) - na blockchainu Hyperledger
  • DPoS (Delegated Proof-of-Stake) - na blockchainu BitShares
  • Modifikacije BFT-a: SBFT (Simplified BFT) i PBFT (Practical BFT), na primjer u blockchainu Exonum

Zadržimo se malo na PoS konsenzusu, jer... Upravo su PoS i njegove varijante najrašireniji u privatnim blockchainima. Zašto privatno? S jedne strane, karakteristike PoS-a su bolje u odnosu na PoW, jer Da bi se postigao konsenzus, potrebno je manje računarskih resursa, što znači da se povećava brzina pisanja podataka u blockchain. Ali s druge strane, PoS ima više mogućnosti za prevaru, pa da bi se to neutraliziralo, svi učesnici u blockchainu moraju biti poznati.

PoS konsenzus se zasniva na odabiru čvora koji može upisati blok sa transakcijama u blockchain u zavisnosti od iznosa sredstava na računu, odnosno ne na računu, već u kolateralu, tj. Što više sredstava imate kao kolateral, veća je vjerovatnoća da će mreža izabrati vaš čvor za pisanje bloka. Depozit se neće vratiti ako je blok nevažeći. Ovo pruža zaštitu od prevare. Postoje sljedeće varijacije PoS-a:

  • Delegirani PoS (DPoS) konsenzus dijeli učesnike na “glasače” i “validatore”. Vlasnici kovanica (učesnici s pravom glasa) delegiraju svoje ovlaštenje za provjeru i snimanje transakcija na blockchainu drugim učesnicima. Dakle, validatori obavljaju sav računski posao i za to dobijaju nagradu, a prisustvo učesnika u glasanju garantuje poštenje validatora, jer mogu se promeniti u bilo kom trenutku.
  • LPoS (Leased Proof-of-Stake) konsenzus vam omogućava da zakupite svoja sredstva drugim čvorovima kako bi oni imali bolje šanse za validaciju blokova. To. Možete dobiti proviziju za transakcije bez sudjelovanja u stvarnoj verifikaciji transakcije i rudarenju blokova.

Postoji niz drugih konsenzusa koji još nisu u širokoj upotrebi, samo ću ih ovdje navesti za informaciju, a pregled samih algoritama konsenzusa možete pronaći, na primjer, u članku: Algoritmi konsenzusa u blokčejnu.

  • PoET (Proof-of-Elapsed Time)
  • PoC (dokaz kapaciteta)
  • PoB (Proof-of-Burn)
  • PoWeight (Proof-of-Weight)
  • PoA (Proof-of-Activity) – PoW + PoS
  • PoI (Proof-of-Importans)

Pouzdanost i modeli implementacije blockchaina

Javni blockchain

Održivost Javni ili drugo ime Bez dozvole blockchain Ovo se postiže omogućavanjem bilo kome da se poveže i pregleda informacije ili čak poveže sopstveni čvor, a poverenje se gradi na PoW konsenzusu.

Privatni blockchain

privatan ili Privatni Dozvoljeni blockchain. U ovim blockchainima samo određena grupa učesnika (organizacije ili ljudi) ima pristup informacijama. Takve blockchaine izgrađuju organizacije s ciljem povećanja ukupne koristi ili efikasnosti. Njihovu pouzdanost osiguravaju zajednički ciljevi učesnika i PoS i BFT konsenzusni algoritmi.

Blockchain konzorcij

Postoje Konzorcijum ili Javno dopušteni blockchain. To su blockchains na koje se svako može povezati da bi ih pregledao, ali učesnik može dodati informacije ili povezati svoj čvor samo uz dozvolu drugih učesnika. Takve blockchaine izgrađuju organizacije kako bi povećale povjerenje kupaca ili potrošača proizvoda ili društva u cjelini. Ovde se pouzdanost postiže i prisustvom poverenja između učesnika i istih PoS i BFT algoritama konsenzusa.

Pametni ugovori

Blockchains implementirani nakon Bitcoina su, u ovoj ili drugoj mjeri, dodali mogućnost izvršavanja pametnih ugovora. U suštini, pametni ugovor je transakcija u kojoj se programski kod stavlja za izvršenje. Pametni ugovori na Ethereum mreži se izvršavaju u EVM-u (Ethereum Virtual Machine). Da biste započeli izvršavanje pametnog ugovora, on mora biti eksplicitno pokrenut drugom transakcijom ili moraju biti ispunjeni preduslovi za izvršenje. Rezultati izvršenja pametnog ugovora također će biti zabilježeni u blockchainu. Primanje podataka izvan blockchaina je moguće, ali izuzetno ograničeno.

Koja poslovna logika se može implementirati pomoću pametnog ugovora? Zapravo, nema puno, na primjer, provjeravanje uvjeta korištenjem podataka iz blockchaina, promjena vlasnika digitalne imovine ovisno o tim uvjetima, snimanje podataka u trajno skladište unutar blockchaina. Logika je implementirana u posebnom jeziku visokog nivoa 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. By link u Etherscan nalazi se

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: Šta 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 korištenjem blockchaina, a koja rješenja će biti, u najboljem slučaju, neučinkovita. Dakle, korištenje blockchaina nije neophodno ako:

  • Transakcije se obavljaju u pouzdanom okruženju;
  • Prisustvo komisije posrednika ne pogoršava život učesnika;
  • Učesnici nemaju imovinu koja se može predstaviti kao digitalna imovina;
  • Ne postoji distribucija u digitalnoj imovini, tj. vrijednost je u vlasništvu ili isporučena od strane samo jednog učesnika.

Šta čeka budućnost 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 svog specifičnog niza problema;
  • Blockchain će postati široko rasprostranjen protokol, kao što je HTTP za Internet;
  • Blockchain će postati osnova za novi finansijski i politički sistem na planeti!

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

Ovo je samo početak!

izvor: www.habr.com

Dodajte komentar