Cijela povijest čovječanstva je neprekidno oslobađanje od okova i stvaranje novih, još čvršćih. (Anonimni autor)
Analizirajući mnoge blockchain projekte (Bitshares, Hyperledger, Exonum, Ethereum, Bitcoin i dr.), shvaćam da su svi oni s tehničkog stajališta izgrađeni prema istim načelima. Blockchaini su poput kuća, koje, unatoč raznolikosti konstrukcija, dekoracija i namjena, imaju temelj, zidove, krov, prozore i vrata koji su međusobno povezani određenim načinima. Ako razumijemo osnovna načela projektiranja zgrada i znamo svojstva korištenih materijala, možemo odrediti namjenu određene kuće. Trenutno postoji situacija s blockchainom da je svi čuli, ali malo njih razumije arhitekturu i principe rada. Stoga nastaje nesporazum zašto i kako ima smisla koristiti blockchain tehnologije.
U ovom članku razmotrit ćemo opća svojstva i načela svih blockchaina. Zatim ćemo pogledati zadatke koje možemo rješavati pomoću blockchaina i za jačanje gradiva izgradit ćemo mali, ali pravi blockchain na svom virtualnom zemljištu!
Dakle, prisjetimo se koje je probleme originalno riješio blockchain.
Siguran sam da će mnogi reći o distribuiranoj, decentraliziranoj, javnoj i nepromjenjivoj bazi podataka. No, zašto je sve to bilo potrebno?
Preferiram započinjati učenje bilo koje tehnologije čitanjem standarda, jer se oni na kojima se temelje svi članci i knjige oko istraživane teme. No, standardi blockchaina u ovom trenutku ne postoje, u ISO su osnovani samo za njihovu izradu. Trenutno svaka javna blockchain projekt ima svoj dokument White paper, koji u suštini predstavlja tehničku specifikaciju. Prvi poznati blockchain projekt je mreža Bitcoin. Idemo na službenu stranicu mreže i kako je sve počelo.
Zadatak blockchaina
Dakle, zadatak koji je blockchain riješio u pionirskoj mreži Bitcoin jest povjereno prijenos vlasništva nad digitalnim aktivima (assets) u nepovjerenom okruženju bez posrednika. Na primjer, u mreži Bitcoin digitalni aktiv je digitalna valuta bitcoin. I sva tehnička rješenja Bitcoina i drugih blockchaina svode se na rješavanje ovog zadatka.
Problemi koje blockchain rješava
Zamislite da neka financijska organizacija tvrdi da je izgradila mrežu širom svijeta koja omogućuje slanje novca bilo kojoj osobi. Da li biste joj povjerovali? Ako je ta organizacija Visa ili MasterCard, vjerojatno biste povjerovali, ali ako je to, recimo, AnonymousWorldMoney, vjerojatno ne biste. Zašto? Zato što dobro znamo kako privatne kompanije razvijaju distribuirane sustave, s kakvim ciljevima i čemu to može dovesti. Pogledajmo pobliže probleme takvih sustava i kako se mogu riješiti korištenjem tehnologija blokčena.
Recimo da u uvjetnoj AnonymousWorldMoney postoje poslužitelji s bazama podataka, i dobro je ako ih ima nekoliko u različitim podatkovnim centrima. Kada pošiljatelj šalje novac, registrira se transakcija koja se replicira na sve poslužitelje i novac dolazi do primatelja.

U idealnom svijetu takva shema savršeno funkcionira, ali u našem nastaju sljedeći problemi:
- Problem identifikacije sudionika s jedne strane i potreba za anonimnošću transakcija s druge strane. Odnosno, potrebno je prenijeti novac određenom primatelju i to tako da o toj transakciji nitko ne zna, osim sudionika dogovora. Banke imaju brojeve računa i bankovnih kartica vezanih uz određenu fizičku ili pravnu osobu, a bankovna tajna štiti informacije o transakcijama. A tko jamči da uvjetna AnonymousWorldMoney ne koristi osobne podatke i informacije o transakcijama u svoje svrhe?
- Kako osigurati da je primatelj primio upravo onaj iznos koji mu je poslan? Na primjer, pošiljatelj je poslao 100 dolara, a primatelj je primio 10 dolara. Pošiljatelj dolazi u ured AnonymousWorldMoney sa svojim računom, a službenik prikazuje svoju verziju na kojoj piše da je pošiljatelj poslao samo 10 dolara.
- Problem nepovjerljive sredine, primjerice, prijevara poznata kao double-spending. Nepouzdani sudionik može potrošiti svoj balans više puta, sve dok se uplata ne replicira na sve poslužitelje. , naravno, nitko nije ukinuo, i usklađenost će u konačnici biti postignuta, ali netko neće dobiti novac za pružene usluge ili proizvode. Stoga, ako ne postoji potpuno povjerenje u platnu organizaciju ili sudionike transakcija, potrebno je izgraditi mrežu koja se ne oslanja na povjerenje, već na kriptografiju.
- Uslovna AnonymousWorldMoney ima konačan broj servera koji mogu postati nedostupni nenamerno ili iz zle namere.
- AnonymousWorldMoney će uzeti svoju značajnu proviziju.
- Mogućnost upravljanja. Tokom korišćenja Bitcoina, otkriveno je da ljudi žele ne samo da šalju novčiće jedni drugima, već i da proveravaju razne uslove za obavljanje transakcija, programiraju scenarije rada, automatski izvršavaju radnje u zavisnosti od uslova itd.
Kako blockchain rešava ove probleme
- Identifikacija učesnika vrši se pomoću para ključeva: privatnog i javnog, a algoritam digitalnog potpisa jednoznačno identifikuje pošiljaoca i primaoca, ostavljajući njihove identitete anonimnim.
- Transakcije se okupljaju u blokove, izračunava se hash bloka koji se zapisuje u sledeći blok. Ova sekvenca beleženja hash-ova u blokovima dala je naziv tehnologiji blockchain, a takođe onemogućava neprimetnu izmenu / brisanje blokova ili pojedinačnih transakcija iz blokova. Dakle, ako je transakcija ušla u blockchain, možete biti sigurni da će njeni podaci ostati nepromenjeni.
- Prevara double-spending se sprečava postizanjem konsensa u mreži o tome koje podatke smatrati tačnim, a koje odbaciti. U Bitcoin mreži, konsensusi se postižu dokazivanjem obavljenog rada PoW (Proof-of-Work).
- Pouzdanost funkcionisanja mreže se postiže time da je blockchain javan, gde svaki učesnik može pokrenuti svoju nodu, dobiti punu kopiju blockchain-a i, što je još važnije, samostalno početi da proverava transakcije na tačnost. Treba napomenuti da savremeni blockchaini omogućavaju izgradnju ne samo javnih (otvorenih), već i privatnih (zatvorenih) blockchain-a, kao i korišćenje kombinovanih shema.
- U potpunosti se ne može izbeći provizija u blockchain-u, jer je potrebno platiti ljudima koji podržavaju mrežu, ali je u blockchain-u potreba za provizijom toliko uverljiva da ne ostavlja sumnje u njenu nezamenljivost.
- Savremeni blockchaini imaju mogućnost implementacije poslovne logike, koja se u blockchain-u naziva pametni ugovori. Logika pametnih ugovora se implementira na različitim jezicima višeg nivoa.
Pogledajmo ta rešenja detaljnije.
Arhitektura blockchain-a
Sastavni delovi blockchain-a
Svaki sudionik može pokrenuti svoju čvor s potpunom kopijom blockchaina (full node). Potpuni čvorovi koji mogu zapisivati transakcije u blockchain nazivaju se čvorovima konsenzusa (witness) ili rudarima (miner). Potpuni čvorovi koji samo provjeravaju ispravnost transakcija nazivaju se čvorovima revizije (audit). Lagani klijenti (light clients) ne pohranjuju potpune kopije blockchaina, već komuniciraju s mrežom koristeći potpune čvorove.
Većina korisnika za obavljanje transakcija koristi upravo lagane klijente ili web novčanike. Svi čvorovi su međusobno povezani. Uz takav set elemenata, arhitektura mreže postaje otpornija:

Životni ciklus transakcije
Pogledajmo životni ciklus transakcije i razložimo ga na dijelove:

Tehnologije blockchaina
Pogledajmo pobliže tehnička rješenja i njihove međusobne odnose.
Identifikacija
Svaka blockchain transakcija mora biti potpisana digitalnim potpisom. Stoga, za izvršenje transakcije svaki sudionik mora imati par ključeva: privatni / javni. Ponekad se par ključeva naziva novčanik (wallet), jer su ključevi nedvojbeno povezani s jedinstvenom digitalnom adresom i stanjem sudionika. U stvarnosti, ključevi i adrese su samo nizovi brojeva u različitim sustavima brojanja. Primjeri ključeva i adrese novčanika:
Privatni ključ: 0a78194a8a893b8baac7c09b6a4a4b4b161b2f80a126cbb79bde231a4567420f
Javni ključ: 0579b478952214d7cddac32ac9dc522c821a4489bc10aac3a81b9d1cd7a92e57ba
Adresa: 0x3814JnJpGnt5tB2GD1qfKP709W3KbRdfb27VZa stvaranje digitalnog potpisa u blockchainima koristi se algoritam temeljen na eliptičnim krivuljama: Elliptic Curve Digital Signature Algorithm (ECDSA). Za njegov rad privatni ključ (256-bitni broj) obično se bira nasumično. Broj mogućih ključeva iznosi 2 na 256, stoga se može govoriti o praktičnoj nemogućnosti podudaranja vrijednosti privatnih ključeva.
Nakon toga, javni ključ se dobiva iz privatnog množenjem njegove vrijednosti s koordinatama točke na eliptičnoj krivulji, pri čemu se dobivaju koordinate nove točke te iste krivulje. Ova radnja jamči dobivanje para ključeva pogodnih za digitalne potpise transakcija. I na kraju, adresa novčanika se nedvojbeno izračunava iz javnog ključa.
Postoji mnoštvo članaka s detaljima o kriptografiji koja se koristi u blockchainu, na primjer:
Privatni ključ mora biti strogo povjerljiv i pohranjen na siguran način. Javni ključ je poznat svima. U slučaju gubitka privatnog ključa, pristup imovini (novčićima) nije moguće obnoviti i novac će biti izgubljen zauvijek. Stoga je pouzdano pohranjivanje privatnih ključeva od iznimne važnosti, jer to nije banka, gdje se uvijek može doći s osobnom iskaznicom i obnoviti račun. Postoji cijela industrija za proizvodnju, takozvanih, hladnih kriptokasića, sličnih USB uređajima:

ili se mogu koristiti pouzdaniji načini, primjerice, urezivanjem vrijednosti privatnog ključa na tokenima:

Transakcije
Detalje o strukturi transakcije možete pronaći u članku . Važno je razumjeti da svaka transakcija ima barem sljedeće podatke:
Od: 0x48C89c341C5960Ca2Bf3732D6D8a0F4f89Cc4368 - digitalna adresa pošiljatelja
Za: 0x367adb7894334678b90аfe7882a5b06f7fbc783a - digitalna adresa primatelja
Vrijednost: 0.0001 - iznos transakcije
Hash transakcije: 0x617ede331e8a99f46a363b32b239542bb4006e4fa9a2727a6636ffe3eb095cef - hash transakcijeNakon toga, transakcija se potpisuje privatnim ključem i šalje se (vidi detalje o funkciji protokola ) svim čvorovima u blockchainu koji provjeravaju valjanost transakcija. Algoritam provjere transakcije nije trivijalan i uključuje .
Blokovi transakcija
Provjerivši valjanost transakcija, čvorovi ih formiraju u blokove. Osim transakcija, u blok se zapisuje hash prethodnog bloka, broj (brojač Nonce), i vrši se izračun hash-a trenutnog bloka prema algoritmu SHA-256. Hash mora ispunjavati postavljene uvjete složenosti. Na primjer, u mreži Bitcoin, složenost hasha automatski se mijenja svaka 2 tjedna, ovisno o snazi mreže, kako bi se blok generirao otprilike svake 10 minuta. Složenost se određuje prema sljedećem uvjetu: pronađeni hash mora biti manji od unaprijed postavljenog broja. Ako uvjet nije ispunjen, na Nonce se dodaje 1, a rad na izračunu hash-a se ponavlja. Za pronalaženje hasha koristi se polje Nonce, budući da su to jedini podaci u bloku koji se mogu promijeniti, dok ostali moraju ostati nepromijenjeni. Pravi hash treba imati određeni broj nula na početku, na primjer, jedan od stvarnih hash-eva:
000000000000000000000bf03212e7dd1176f52f816fa395fc9b93c44bc11f91Uspešno pronalaženje heša predstavlja dokaz obavljenog posla (Proof-of-Work, PoW) za Bitcoin ili Ethereum mreže. Proces pronalaženja heševa naziva se miniranje (mining), slično kao i vađenje zlata. Ime dovoljno precizno opisuje suštinu procesa, budući da se radi o jednostavnom probijanju varijacija, a ako netko pronađe odgovarajući heš, to je zaista sreća. To je kao pronaći pravi zlatni nugget u tonama bezvrednog materijala. Nagrada za blok sada iznosi 12.5 BTC, i ako pomnožimo sa trenutnom cijenom bitcoina od 3900 $, dobijemo više od kilograma čistog zlata. Ima tu za šta boriti se!
Nakon uspješnog pronalaženja heša, blok i sam pronađeni heš se upisuju u blockchain kao sljedeći blok. Više o strukturi blokova možete pogledati u članku , a u nastavku ću prikazati pojednostavljenu shemu:

Blockchain počinje s blokom koji još nema heš prethodnog bloka. Takav blok u blockchainu je jedinstven i ima naziv Genesis block. Ostali blokovi imaju istu strukturu i razlikuju se samo po broju transakcija. Stvarne transakcije i blokovi koji se trenutno kreiraju u Bitcoin ili Ethereum mogu se pratiti u .
Veličina blokova u Bitcoin-u je ograničena na 1 MB, i s minimalnim obimom informacija u transakciji od oko 200 bajtova, u bloku može biti oko 6000 transakcija. Odatle, inače, i dolazi performans Bitcoin-a, na koju se svi smiju: blok se generira otprilike jednom u 10 minuta * 60 sekundi = 600 sekundi, što daje formalnu performansu od oko 10 TPS. Iako, zapravo, to nije performansa, već svjesno implementiran algoritam rada. U Ethereum-u su za konkurenciju jednostavno postavili vreme generacije bloka na 15 sekundi, i formalna performansa je porasla. Stoga je u blockchain-ima koji koriste PoW kao konsenzus potpuno besmisleno uspoređivati performansu, jer ona direktno zavisi o složenosti izračunavanja heša, koju je moguće postaviti svakakvu.
Forkovi
Što se događa ako, na primjer, nekoliko čvorova pronađe heševe koji zadovoljavaju uvjete složenosti, ali se razlikuju po vrijednosti (drugim riječima, dođu do različitih konsenzusa) i zapišu blokove u blokčain? Pogledajmo kako se blokčain štiti od ove situacije. U ovom slučaju dolazi do takozvanog fork-a (‘vilica’), i blokčain ima dvije verzije lanca:

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

Neki od tih blokova će biti pronađeni ranije i poslani u blokčain i tada bi prema pravilima blokčain trebao prebaciti na duži lanac i poništiti sve transakcije iz alternativnog bloka:

Pri tom, može se dogoditi situacija u kojoj je transakcija sudionika bila samo u jednom od blokova fork-a, koji je i bio poništen. Stoga, da biste bili sigurni da je potrebna transakcija zabilježena u blokčainu, postoji opća preporuka — prije nego što povjerujete transakciji, trebate pričekati da sljedećih nekoliko blokova bude dodano u blokčain. Preporuke o tome koliko blokova čekati razlikuju se za različite blokčaine. Na primjer, za Bitcoin mrežu minimum je 2 bloka, maksimum 6.
Ista slika s fork-om blokova bit će zabilježena i tijekom takozvane 51% napada — to je kada grupa rudara pokušava izgraditi alternativni lanac blokova, težeći poništavanju lanca s vlastitim prevarantskim transakcijama. Iako u sadašnje vrijeme, umjesto prijevare, isplativije je trošiti svoje resurse na pošteno rudarenje.
Konsenzus
Da bi se blok zabilježio u blokčain, mreža mora doći do konsenzusa. Sjetimo se zadatka postizanja konsenzusa u računalnim komunikacijskim mrežama. Problem se formulira kao zadatak bizantinskih generala BFT (). Ometajući slikovito opisivanje problema bizantinske vojske, zadatak se može formulirati ovako: kako čvorovi mreže mogu doći do zajedničkog rezultata, ako dio čvorova mreže može svjesno iskrivljavati informacije. Postojeći algoritmi za rješenje BFT problema pokazuju da mreža može ispravno funkcionirati ako je broj prevaranata manji od 1/3. Zašto u Bitcoin mreži nije primijenjen BFT konsenzus? Zašto se koristio PoW? Postoji nekoliko razloga:
- BFT dobro funkcionira s malim fiksiranim brojem nodova, dok je u javnom blockchainu broj nodova nepredvidiv, a što je još gore, nodovi se mogu proizvoljno uključivati i isključivati.
- Potrebno je motivirati ljude da pokreću blockchain nodove. Za to bi ljudi trebali dobivati nagradu. U BFT-u formalno nema za što primiti nagradu, dok je kod PoW-u svima jasno na intuitivnoj razini za što se dobiva nagrada: za električnu energiju koju procesor troši prilikom pronalaženja heša bloka.
Osim PoW-a, postoji još nekoliko konsenzusa koji se koriste u modernim blockchainima, na primjer:
- PoS (Proof-of-Stake) — u blockchainu
- DPoS (Delegated Proof-of-Stake) — u blockchainu
- Modifikacije BFT: SBFT (Simplified BFT) i PBFT (Practical BFT), na primjer, u blockchainu
Malo ćemo se zaustaviti na konsenzusu PoS, jer su upravo PoS i njegove varijante postigle najveću popularnost u privatnim blockchainima. Zašto baš u privatnim? S jedne strane, karakteristike PoS-a su bolje u usporedbi s PoW-om, jer za postizanje konsenzusa trebaju manji računalni resursi, što ubrzava proces upisivanja podataka u blockchain. No, s druge strane, postoji veća mogućnost prijevare u PoS-u, stoga, kako bi se to neutraliziralo, svi sudionici blockchaina trebaju biti poznati.
Konsenzus PoS temelji se na odabiru nodova koji mogu zapisivati blokove s transakcijama u blockchain ovisno o količini sredstava na računu, točnije, ne na računu, nego u zalogu. Što više sredstava imate u zalogu, veća je vjerojatnost da će mreža odabrati vaš čvor za upis bloka. Zaloga se ne vraća ako se blok pokaže nevaljanim. Na taj način implementirana je zaštita od prijevara. Postoje sljedeće varijante PoS-a:
- Konsenzus Delegated PoS (DPoS) dijeli sudionike na 'glasnike' i 'validatore'. Držači novčića (glasnici) delegiraju svoje pravo provjere i upisivanja transakcija u blockchain drugim sudionicima. Tako validatori izvode sav proračunski posao i dobivaju za to nagradu, a prisutnost glasnika osigurava poštenje validatora, jer ih je moguće zamijeniti u bilo kojem trenutku.
- LPoS (Leased Proof-of-Stake) konsenzus omogućuje korištenje vaših sredstava od strane drugih čvorova kako bi imali bolje šanse za potvrđivanje blokova. Time možete ostvariti prihod od transakcijskih naknada, a da pritom ne sudjelujete u samoj provjeri transakcija i rudarstvu blokova.
Postoji i nekoliko drugih konsenzusa koji još nisu široko rašireni, ovdje ću ih samo nabrojati za informaciju, a pregled samih algoritama konsenzusa možete pogledati, na primjer, u članku: .
- PoET (Proof-of-Elapsed Time)
- PoC (Proof-of-Capacity)
- PoB (Proof-of-Burn)
- PoWeight (Proof-of-Weight)
- PoA (Proof-of-Activity) — PoW + PoS
- PoI (Proof-of-Importance)
Pouzdanost i modeli implementacije blockchaina
Javni blockchain
Otpornost Public ili drugo ime Permissionless blockchain ostvaruje se time što se svatko može povezati i pregledati informacije ili čak povezati svoj čvor, a povjerenje se gradi na PoW konsenzusu.
Privatni blockchain
Privatno ili Private Permissioned blockchain. U tim blockchainima samo određena grupa sudionika (organizacija ili pojedinaca) ima pristup informacijama. Takve blockchain-e grade organizacije s ciljem povećanja opće koristi ili učinkovitosti. Njihova pouzdanost osigurana je zajedničkim ciljevima sudionika i algoritmima konsenzusa PoS i BFT.
Blockchain-konzorcij
Postoje Consortium ili Javni Permissioned blockchain. Ovo su blockchaini kojima se svatko može povezati radi pregleda, ali dodavati informacije ili povezati svoj čvor može samo uz odobrenje drugih sudionika. Takve blockchain-e grade organizacije s ciljem povećanja povjerenja od strane klijenata ili potrošača proizvoda ili društva u cjelini. Ovdje pouzdanost također dolazi od prisutnosti povjerenja među sudionicima i istim algoritmima konsenzusa PoS i BFT.
Pametni ugovori
U blockchainima implementiranim nakon Bitcoina, u određenoj mjeri dodana je mogućnost izvršenja pametnih ugovora. U suštini, pametni ugovor je transakcija koja sadrži programski kod za izvršavanje. Pametni ugovori u Ethereum mreži izvršavaju se u EVM-u (Ethereum Virtual Machine). Da bi se pokrenuo pametni ugovor, treba ga eksplicitno pokrenuti drugom transakcijom ili moraju biti ispunjeni uvjeti za izvršenje. Rezultati izvršenja pametnog ugovora također će se zabilježiti u blockchainu. Dobivanje podataka izvana iz blockchaina moguće je, ali vrlo ograničeno.
Koju poslovnu logiku možemo implementirati pomoću pametnog ugovora? U stvarnosti, nije toliko toga, na primjer, provjera uvjeta temeljenih na podacima iz blockchaina, promjena vlasnika digitalnih sredstava ovisno o tim uvjetima, zapis podataka u trajno spremište unutar blockchaina. Logika se implementira na posebnom jeziku visoke razine, Solidity.
Klasičan primjer funkcionalnosti koju implementiraju pomoću pametnih ugovora je izdavanje tokena za provođenje ICO-a. Na primjer, izradio sam pametni ugovor za izdavanje skromnih 500 000 000 AlexToken. 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 binarno predstavljanje, kako ga vidi mreža
60806040526000600355600060045533600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560146101000a81548160ff021916908360028111156200006f57fe5b0217905550620001036b019d971e4fe8401e74000000600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200024a6401000000000262000b1d179091906401000000009004565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620001986b019d971e4fe8401e740000006001546200024a6401000000000262000b1d179091906401000000009004565b6001819055506b033b2e3c9fd0803ce8000000600481905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6b019d971e4fe8401e740000006040518082815260200191505060405180910390a362000267565b600081830190508281101515156200025e57fe5b80905092915050565b611cb880620002776000396000f300608060405260043610610112576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146104c7578063095ea7b31461055757806318160ddd146105bc57806323b872dd146105e7578063313ce5671461066c578063355274ea146106a3578063518ab2a8146106ce57806366188463146106f957806370a082311461075e57806389311e6f146107b55780638da5cb5b146107cc578063903a3ef61461082357806395d89b411461083a578063a9059cbb146108ca578063bf5839031461092f578063c7876ea41461095a578063cbcb317114610985578063d73dd623146109b0578063dd62ed3e14610a15578063f2fde38b14610a8c575b60008060008060006001600281111561012757fe5b600560149054906101000a900460ff16600281111561014257fe5b14151561014e57600080fd5b60003411151561015d57600080fd5b600060045411151561016e57600080fd5b3494506101a7670de0b6b3a764000061019968056bc75e2d6310000088610acf90919063ffffffff16565b610b0790919063ffffffff16565b9350600092506b033b2e3c9fd0803ce80000006101cf85600354610b1d90919063ffffffff16565b111561024c576101f66003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b915061022e670de0b6b3a764000061022068056bc75e2d6310000085610b0790919063ffffffff16565b610acf90919063ffffffff16565b90506102438186610b3990919063ffffffff16565b92508094508193505b61026184600354610b1d90919063ffffffff16565b6003819055506102886003546b033b2e3c9fd0803ce8000000610b3990919063ffffffff16565b6004819055506000831115610344573373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156102dd573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a35b610395846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a361045184600154610b1d90919063ffffffff16565b600181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050501580156104bf573d6000803e3d6000fd5b505050505050005b3480156104d357600080fd5b506104dc610b52565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561056357600080fd5b506105a2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610b8b565b604051808215151515815260200191505060405180910390f35b3480156105c857600080fd5b506105d1610c7d565b6040518082815260200191505060405180910390f35b3480156105f357600080fd5b50610652600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c87565b604051808215151515815260200191505060405180910390f35b34801561067857600080fd5b50610681611041565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b3480156106af57600080fd5b506106b8611046565b6040518082815260200191505060405180910390f35b3480156106da57600080fd5b506106e3611056565b6040518082815260200191505060405180910390f35b34801561070557600080fd5b50610744600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061105c565b604051808215151515815260200191505060405180910390f35b34801561076a57600080fd5b5061079f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112ed565b6040518082815260200191505060405180910390f35b3480156107c157600080fd5b506107ca611335565b005b3480156107d857600080fd5b506107e16113eb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561082f57600080fd5b50610838611411565b005b34801561084657600080fd5b5061084f6114ab565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561088f578082015181840152602081019050610874565b50505050905090810190601f1680156108bc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108d657600080fd5b50610915600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506114e4565b604051808215151515815260200191505060405180910390f35b34801561093b57600080fd5b50610944611703565b6040518082815260200191505060405180910390f35b34801561096657600080fd5b5061096f611709565b6040518082815260200191505060405180910390f35b34801561099157600080fd5b5061099a611716565b6040518082815260200191505060405180910390f35b3480156109bc57600080fd5b506109fb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611726565b604051808215151515815260200191505060405180910390f35b348015610a2157600080fd5b50610a76600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611922565b6040518082815260200191505060405180910390f35b348015610a9857600080fd5b50610acd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506119a9565b005b600080831415610ae25760009050610b01565b8183029050818382811515610af357fe5b04141515610afd57fe5b8090505b92915050565b60008183811515610b1457fe5b04905092915050565b60008183019050828110151515610b3057fe5b80905092915050565b6000828211151515610b4757fe5b818303905092915050565b6040805190810160405280600981526020017f416c6578546f6b656e000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000600154905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610cc457600080fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d1157600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610d9c57600080fd5b610ded826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e80826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5182600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b601281565b6b033b2e3c9fd0803ce800000081565b60035481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083111561116d576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611201565b6111808382610b3990919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561139157600080fd5b60028081111561139d57fe5b600560149054906101000a900460ff1660028111156113b857fe5b141515156113c557600080fd5b6001600560146101000a81548160ff021916908360028111156113e457fe5b0217905550565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561146d57600080fd5b60028081111561147957fe5b600560149054906101000a900460ff16600281111561149457fe5b141515156114a157600080fd5b6114a9611b01565b565b6040805190810160405280600381526020017f414c54000000000000000000000000000000000000000000000000000000000081525081565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561152157600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561156e57600080fd5b6115bf826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b3990919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611652826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60045481565b68056bc75e2d6310000081565b6b019d971e4fe8401e7400000081565b60006117b782600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a0557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611a4157600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6002600560146101000a81548160ff02191690836002811115611b2057fe5b021790555060006004541115611c0a57611ba5600454600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b1d90919063ffffffff16565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015611c89573d6000803e3d6000fd5b505600a165627a7a723058205bbef016cc7699572f944871cb6f05e69915ada3a92a1d9f03a3fb434aac0c2b0029Više informacija o pametnim ugovorima možete saznati u članku: .
Zaključak
Naveli smo tehnologije na kojima su izgrađene moderni blockchainovi i kako su međusobno povezani. Sada hajde da formuliramo koje se zadatke može riješiti pomoću blockchaina, a čija rješenja će, u najboljem slučaju, biti neefikasna. Dakle, korištenje blockchaina nije nužno ako:
- Transakcije se obavljaju u pouzdanom okruženju;
- Naknade posrednika ne pogoršavaju život sudionika;
- Sudionici nemaju imovinu koju bi mogli predstaviti kao digitalne aktive;
- Nema raspodijeljenosti u digitalnim aktivama, tj. vrijednost posjeduje ili isporučuje samo jedan sudionik.
Kakva budućnost čeka blockchain? Trenutno se može samo pretpostaviti mogući razvoj putanja blockchain tehnologija:
- Blockchain će postati jednako uobičajena tehnologija baza podataka, poput SQL-a ili NoSQL-a za rješavanje određenog kruga zadataka;
- Blockchain će postati široko rasprostranjen protokol, poput HTTP-a za Internet;
- Blockchain će postati osnova za novi financijski i politički sustav planeta!
U sljedećem dijelu ćemo pogledati koje trenutno postoje blockchainove i za što se koriste u različitim industrijama.
Ovo je samo početak!
Izvor: habr.com
